[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n# Make sure that these files always have CRLF line endings in checkout\n*.config          text eol=crlf\n*.cs              text eol=crlf\n*.csproj          text eol=crlf\n*.html            text eol=crlf\n*.js              text eol=crlf\n*.manifest        text eol=crlf\n*.resx            text eol=crlf\n*.sln             text eol=crlf\n*.targets         text eol=crlf\n*.txt             text eol=crlf\n*.vcxproj         text eol=crlf\n*.vcxproj.filters text eol=crlf\n*.xml             text eol=crlf\n*.xsd             text eol=crlf\n\n# Never perform LF normalization on these files\n*.chw    binary\n*.dll    binary\n*.docx   binary\n*.exe    binary\n*.ico    binary\n*.png    binary\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# 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": ".github/ISSUE_TEMPLATE/其它问题.md",
    "content": "---\nname: 其它问题\nabout: 对于其它事项，例如使用方法求助等，建议在 Discussion 中发起讨论\ntitle: ''\nlabels: 讨论\nassignees: ''\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/新功能需求.md",
    "content": "---\nname: 新功能需求\nabout: 告诉我们你希望增加的功能\ntitle: ''\nlabels: 改进\nassignees: ''\n\n---\n\n**使用场景**\n例如：在什么场合下会用到这个功能\n\n**类似软件**\n是否有类似软件或程序能提供相同的功能\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/缺陷问题报告.md",
    "content": "---\nname: 缺陷问题报告\nabout: 告诉我们你遇到的问题\ntitle: ''\nlabels: 缺陷\nassignees: ''\n\n---\n\n**PDF补丁丁的版本**\n请写明使用的版本\n\n**请简要描述你遇到的问题**\n本来应该是怎样的，但实际上却出现了怎样的情形\n\n**重现问题的步骤**\n步骤如下：\n1. 使用如下附件 '...'\n2. 打开某功能 '....'\n3. 选中哪些选项，点击哪些按钮 '....'\n4. 出现的问题\n"
  },
  {
    "path": ".gitignore",
    "content": "*.snk\n*.pld\nCopyReleasedFiles.js\nILRepack.targets\n7za.exe\nmisc/\n\n## 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/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\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\nproject.fragment.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*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\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\nnCrunchTemp_*\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 web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n#*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\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# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\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~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\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# GhostDoc plugin setting file\n*.GhostDoc.xml\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# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc"
  },
  {
    "path": ".textlintrc",
    "content": "{\n    \"filters\": {},\n    \"rules\": {\n        \"ja-space-between-half-and-full-width\": {\n            \"space\": \"always\"\n        }\n    }\n}\n"
  },
  {
    "path": "App/.editorconfig",
    "content": "# Remove the line below if you want to inherit .editorconfig settings from higher directories\nroot = true\n\n# C# files\n[*.cs]\n\n#### Core EditorConfig Options ####\n\n# Indentation and spacing\nindent_size = 4\nindent_style = tab\ntab_width = 4\n\n# New line preferences\nend_of_line = crlf\ninsert_final_newline = false\n\n#### .NET Coding Conventions ####\n\n# Organize usings\ndotnet_separate_import_directive_groups = false\ndotnet_sort_system_directives_first = true\nfile_header_template = unset\n\n# this. and Me. preferences\ndotnet_style_qualification_for_event = false\ndotnet_style_qualification_for_field = false\ndotnet_style_qualification_for_method = false\ndotnet_style_qualification_for_property = false\n\n# Language keywords vs BCL types preferences\ndotnet_style_predefined_type_for_locals_parameters_members = true\ndotnet_style_predefined_type_for_member_access = true\n\n# Parentheses preferences\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity\n\n# Modifier preferences\ndotnet_style_require_accessibility_modifiers = for_non_interface_members\n\n# Expression-level preferences\ndotnet_style_coalesce_expression = true\ndotnet_style_collection_initializer = true\ndotnet_style_explicit_tuple_names = true\ndotnet_style_namespace_match_folder = true\ndotnet_style_null_propagation = true\ndotnet_style_object_initializer = true\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ndotnet_style_prefer_auto_properties = true\ndotnet_style_prefer_compound_assignment = true\ndotnet_style_prefer_conditional_expression_over_assignment = true\ndotnet_style_prefer_conditional_expression_over_return = true\ndotnet_style_prefer_inferred_anonymous_type_member_names = true\ndotnet_style_prefer_inferred_tuple_names = true\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true\ndotnet_style_prefer_simplified_boolean_expressions = true\ndotnet_style_prefer_simplified_interpolation = true\n\n# Field preferences\ndotnet_style_readonly_field = true\n\n# Parameter preferences\ndotnet_code_quality_unused_parameters = all\n\n# Suppression preferences\ndotnet_remove_unnecessary_suppression_exclusions = none\n\n# New line preferences\ndotnet_style_allow_multiple_blank_lines_experimental = true\ndotnet_style_allow_statement_immediately_after_block_experimental = true\n\n#### C# Coding Conventions ####\n\n# var preferences\ncsharp_style_var_elsewhere = false:silent\ncsharp_style_var_for_built_in_types = true:silent\ncsharp_style_var_when_type_is_apparent = true:silent\n\n# Expression-bodied members\ncsharp_style_expression_bodied_accessors = true:silent\ncsharp_style_expression_bodied_constructors = false:silent\ncsharp_style_expression_bodied_indexers = true:silent\ncsharp_style_expression_bodied_lambdas = true:silent\ncsharp_style_expression_bodied_local_functions = false:silent\ncsharp_style_expression_bodied_methods = false:silent\ncsharp_style_expression_bodied_operators = false:silent\ncsharp_style_expression_bodied_properties = true:silent\n\n# Pattern matching preferences\ncsharp_style_pattern_matching_over_as_with_null_check = true:suggestion\ncsharp_style_pattern_matching_over_is_with_cast_check = true:suggestion\ncsharp_style_prefer_not_pattern = true:suggestion\ncsharp_style_prefer_pattern_matching = true:silent\ncsharp_style_prefer_switch_expression = true:suggestion\n\n# Null-checking preferences\ncsharp_style_conditional_delegate_call = true:suggestion\n\n# Modifier preferences\ncsharp_prefer_static_local_function = true:silent\ncsharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async\n\n# Code-block preferences\ncsharp_prefer_braces = true:silent\ncsharp_prefer_simple_using_statement = true:suggestion\n\n# Expression-level preferences\ncsharp_prefer_simple_default_expression = true:suggestion\ncsharp_style_deconstructed_variable_declaration = true:suggestion\ncsharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion\ncsharp_style_inlined_variable_declaration = true:suggestion\ncsharp_style_pattern_local_over_anonymous_function = true\ncsharp_style_prefer_index_operator = true:suggestion\ncsharp_style_prefer_range_operator = true:suggestion\ncsharp_style_throw_expression = true:suggestion\ncsharp_style_unused_value_assignment_preference = discard_variable:suggestion\ncsharp_style_unused_value_expression_statement_preference = discard_variable:silent\n\n# 'using' directive preferences\ncsharp_using_directive_placement = outside_namespace:silent\n\n# New line preferences\ncsharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent\ncsharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent\ncsharp_style_allow_embedded_statements_on_same_line_experimental = true:silent\n\n#### C# Formatting Rules ####\n\n# New line preferences\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_else = true\ncsharp_new_line_before_finally = true\ncsharp_new_line_before_members_in_anonymous_types = true\ncsharp_new_line_before_members_in_object_initializers = true\ncsharp_new_line_before_open_brace = types\ncsharp_new_line_between_query_expression_clauses = true\n\n# Indentation preferences\ncsharp_indent_block_contents = true\ncsharp_indent_braces = false\ncsharp_indent_case_contents = true\ncsharp_indent_case_contents_when_block = true\ncsharp_indent_labels = one_less_than_current\ncsharp_indent_switch_labels = true\n\n# Space preferences\ncsharp_space_after_cast = false\ncsharp_space_after_colon_in_inheritance_clause = true\ncsharp_space_after_comma = true\ncsharp_space_after_dot = false\ncsharp_space_after_keywords_in_control_flow_statements = true\ncsharp_space_after_semicolon_in_for_statement = true\ncsharp_space_around_binary_operators = before_and_after\ncsharp_space_around_declaration_statements = false\ncsharp_space_before_colon_in_inheritance_clause = true\ncsharp_space_before_comma = false\ncsharp_space_before_dot = false\ncsharp_space_before_open_square_brackets = false\ncsharp_space_before_semicolon_in_for_statement = false\ncsharp_space_between_empty_square_brackets = false\ncsharp_space_between_method_call_empty_parameter_list_parentheses = false\ncsharp_space_between_method_call_name_and_opening_parenthesis = false\ncsharp_space_between_method_call_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_empty_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_name_and_open_parenthesis = false\ncsharp_space_between_method_declaration_parameter_list_parentheses = false\ncsharp_space_between_parentheses = false\ncsharp_space_between_square_brackets = false\n\n# Wrapping preferences\ncsharp_preserve_single_line_blocks = true\ncsharp_preserve_single_line_statements = true\n\n#### Naming styles ####\n\n# Naming rules\n\ndotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion\ndotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface\ndotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i\n\ndotnet_naming_rule.types_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.types_should_be_pascal_case.symbols = types\ndotnet_naming_rule.types_should_be_pascal_case.style = pascal_case\n\ndotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members\ndotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case\n\n# Symbol specifications\n\ndotnet_naming_symbols.interface.applicable_kinds = interface\ndotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.interface.required_modifiers = \n\ndotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum\ndotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.types.required_modifiers = \n\ndotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method\ndotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.non_field_members.required_modifiers = \n\n# Naming styles\n\ndotnet_naming_style.pascal_case.required_prefix = \ndotnet_naming_style.pascal_case.required_suffix = \ndotnet_naming_style.pascal_case.word_separator = \ndotnet_naming_style.pascal_case.capitalization = pascal_case\n\ndotnet_naming_style.begins_with_i.required_prefix = I\ndotnet_naming_style.begins_with_i.required_suffix = \ndotnet_naming_style.begins_with_i.word_separator = \ndotnet_naming_style.begins_with_i.capitalization = pascal_case\ncsharp_style_namespace_declarations = file_scoped:silent\ncsharp_style_prefer_method_group_conversion = true:silent\ncsharp_style_prefer_top_level_statements = true:silent\ncsharp_style_prefer_primary_constructors = true:suggestion\ncsharp_prefer_system_threading_lock = true:suggestion\ncsharp_style_prefer_null_check_over_type_check = true:suggestion\ncsharp_style_prefer_local_over_anonymous_function = true:suggestion\ncsharp_style_prefer_tuple_swap = true:suggestion\ncsharp_style_prefer_utf8_string_literals = true:suggestion\ncsharp_prefer_static_anonymous_function = true:suggestion\ncsharp_style_prefer_readonly_struct = true:suggestion\ncsharp_style_prefer_readonly_struct_member = true:suggestion\ncsharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent\ncsharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent\ncsharp_style_prefer_extended_property_pattern = true:suggestion\n\n[*.{cs,vb}]\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion\ndotnet_style_prefer_auto_properties = true:silent\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_prefer_simplified_boolean_expressions = true:suggestion\ndotnet_style_prefer_conditional_expression_over_assignment = true:silent\ndotnet_style_prefer_conditional_expression_over_return = true:silent\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_tuple_names = true:suggestion\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ntab_width = 4\nindent_size = 4\nend_of_line = crlf\ndotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion\ndotnet_style_prefer_compound_assignment = true:suggestion\ndotnet_style_prefer_simplified_interpolation = true:suggestion\ndotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion\ndotnet_style_namespace_match_folder = true:suggestion\ndotnet_style_readonly_field = true:suggestion\ndotnet_style_predefined_type_for_locals_parameters_members = true:silent\ndotnet_style_predefined_type_for_member_access = false:silent\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:silent\ndotnet_style_allow_multiple_blank_lines_experimental = true:silent\ndotnet_style_allow_statement_immediately_after_block_experimental = true:silent\ndotnet_code_quality_unused_parameters = all:suggestion\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent\ndotnet_style_qualification_for_field = false:silent\ndotnet_style_qualification_for_property = false:silent\ndotnet_style_qualification_for_method = false:silent\ndotnet_style_qualification_for_event = false:silent"
  },
  {
    "path": "App/AppContext.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing MuPDF;\r\nusing PDFPatcher.Common;\r\nusing PowerJson;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tinternal static class AppContext\r\n\t{\r\n\t\tstatic readonly string AppConfigFilePath = FileHelper.CombinePath(\r\n\t\t\t\tPath.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath),\r\n\t\t\t\t\"AppConfig.json\");\r\n\r\n\t\tstatic readonly SerializationManager JsonSm = new SerializationManager(new JsonReflectionController(true)) {\r\n\t\t\tUseExtensions = false,\r\n\t\t\tSerializeEmptyCollections = false,\r\n\t\t\tSerializeNullValues = false,\r\n\t\t\tSerializeReadOnlyFields = false,\r\n\t\t\tSerializeReadOnlyProperties = false,\r\n\t\t\tCanSerializePrivateMembers = true\r\n\t\t};\r\n\r\n\t\tinternal const int MaxHistoryItemCount = 16;\r\n\r\n\t\tinternal static MainForm MainForm { get; set; }\r\n\r\n\t\tstatic AppContext() {\r\n\t\t\tSaveAppSettings = true;\r\n\t\t\tBookmarkFile = String.Empty;\r\n\t\t\tTargetFile = String.Empty;\r\n\t\t\tCheckUpdateDate = DateTime.Now;\r\n\t\t\tCheckUpdateInterval = 14;\r\n\t\t\tExporter = new ExporterOptions();\r\n\t\t\tImporter = new ImporterOptions();\r\n\t\t\tMerger = new MergerOptions();\r\n\t\t\tPatcher = new PatcherOptions();\r\n\t\t\tEditor = new PatcherOptions();\r\n\t\t\tReader = new ReaderOptions();\r\n\t\t\tAutoBookmarker = new AutoBookmarkOptions();\r\n\t\t\tEncodings = new EncodingOptions();\r\n\t\t\tImageExtracter = new ImageExtracterOptions();\r\n\t\t\tImageRenderer = new ImageRendererOptions();\r\n\t\t\tExtractPage = new ExtractPageOptions();\r\n\t\t\tOcr = new OcrOptions();\r\n\t\t\tToolbar = new ToolbarOptions();\r\n\t\t\tWindowStatus = new WindowStatus();\r\n\t\t\tRecent = new RecentItems();\r\n\t\t}\r\n\t\tpublic static bool SaveAppSettings { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否在加载 PDF 文档时仅加载部分文档。</summary>\r\n\t\tpublic static bool LoadPartialPdfFile { get; set; }\r\n\r\n\t\tprivate static string[] _SourceFiles = new string[0];\r\n\t\t///<summary>获取或指定要处理的源文件路径列表。</summary>\r\n\t\tpublic static string[] SourceFiles {\r\n\t\t\tget => _SourceFiles;\r\n\t\t\tset => _SourceFiles = value ?? new string[0];\r\n\t\t}\r\n\r\n\t\t///<summary>获取或指定检查更新的日期。</summary>\r\n\t\tpublic static DateTime CheckUpdateDate { get; set; }\r\n\t\t///<summary>获取或指定检查更新的日期间隔。</summary>\r\n\t\tpublic static int CheckUpdateInterval { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否应取消批处理操作。</summary>\r\n\t\tpublic static bool Abort { get; set; }\r\n\r\n\t\t///<summary>获取或指定书签文件的路径。</summary>\r\n\t\tpublic static string BookmarkFile { get; set; }\r\n\r\n\t\t///<summary>获取或指定目标文件的路径。</summary>\r\n\t\tpublic static string TargetFile { get; set; }\r\n\r\n\t\t///<summary>获取导出设置。</summary>\r\n\t\tpublic static ExporterOptions Exporter { get; internal set; }\r\n\t\t///<summary>获取导入设置。</summary>\r\n\t\tpublic static ImporterOptions Importer { get; internal set; }\r\n\t\t///<summary>获取生成文档的设置。</summary>\r\n\t\tpublic static MergerOptions Merger { get; internal set; }\r\n\t\t///<summary>获取生成文档的设置。</summary>\r\n\t\tpublic static PatcherOptions Patcher { get; internal set; }\r\n\t\t///<summary>获取文档编辑器的设置。</summary>\r\n\t\tpublic static PatcherOptions Editor { get; internal set; }\r\n\t\t///<summary>获取阅读器的设置。</summary>\r\n\t\tpublic static ReaderOptions Reader { get; internal set; }\r\n\t\t///<summary>获取自动生成书签的设置。</summary>\r\n\t\tpublic static AutoBookmarkOptions AutoBookmarker { get; internal set; }\r\n\t\t///<summary>获取应用程序设置。</summary>\r\n\t\tpublic static EncodingOptions Encodings { get; internal set; }\r\n\t\t///<summary>获取导出图像的设置。</summary>\r\n\t\tpublic static ImageExtracterOptions ImageExtracter { get; internal set; }\r\n\t\t///<summary>获取转换为图片的设置。</summary>\r\n\t\tpublic static ImageRendererOptions ImageRenderer { get; internal set; }\r\n\t\t///<summary>获取提取页面的设置。</summary>\r\n\t\tpublic static ExtractPageOptions ExtractPage { get; internal set; }\r\n\t\t///<summary>获取光学字符识别功能的设置。</summary>\r\n\t\tpublic static OcrOptions Ocr { get; internal set; }\r\n\t\t///<summary>获取或指定自定义工具栏的项目。</summary>\r\n\t\tpublic static ToolbarOptions Toolbar { get; internal set; }\r\n\t\t///<summary>获取或指定窗口状态。</summary>\r\n\t\tpublic static WindowStatus WindowStatus { get; internal set; }\r\n\r\n\t\tpublic static RecentItems Recent { get; internal set; }\r\n\r\n\t\t[JsonSerializable]\r\n\t\tpublic sealed class RecentItems\r\n\t\t{\r\n\t\t\t///<summary>获取最近使用的 PDF 文件列表。</summary>\r\n\t\t\t[JsonField(\"源文件\")]\r\n\t\t\tpublic List<string> SourcePdfFiles { get; } = new List<string>();\r\n\t\t\t///<summary>获取最近使用的 PDF 输出文件列表。</summary>\r\n\t\t\t[JsonField(\"输出文件\")]\r\n\t\t\tpublic List<string> TargetPdfFiles { get; } = new List<string>();\r\n\t\t\t///<summary>获取最近使用的信息文件列表。</summary>\r\n\t\t\t[JsonField(\"信息文件\")]\r\n\t\t\tpublic List<string> InfoDocuments { get; } = new List<string>();\r\n\t\t\t///<summary>获取最近使用的文件名模板列表。</summary>\r\n\t\t\t[JsonField(\"文件名模板\")]\r\n\t\t\tpublic List<string> FileNameTemplates { get; } = new List<string>();\r\n\t\t\t///<summary>获取最近使用的文件夹列表。</summary>\r\n\t\t\t[JsonField(\"文件夹\")]\r\n\t\t\tpublic List<string> Folders { get; } = new List<string>();\r\n\t\t\t///<summary>获取最近使用的查找字符串列表。</summary>\r\n\t\t\t[JsonField(\"查找项\")]\r\n\t\t\tpublic List<string> SearchPatterns { get; } = new List<string>();\r\n\t\t\t///<summary>获取最近使用的替换字符串列表。</summary>\r\n\t\t\t[JsonField(\"替换项\")]\r\n\t\t\tpublic List<string> ReplacePatterns { get; } = new List<string>();\r\n\r\n\t\t\tinternal static void AddHistoryItem(IList<string> list, string item) {\r\n\t\t\t\tif (String.IsNullOrEmpty(item)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar i = -1;\r\n\t\t\t\tvar m = false;\r\n\t\t\t\tforeach (var li in list) {\r\n\t\t\t\t\ti++;\r\n\t\t\t\t\tif (String.Equals(li, item, StringComparison.OrdinalIgnoreCase)) {\r\n\t\t\t\t\t\tm = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (m) {\r\n\t\t\t\t\tif (i == 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (i != -1) {\r\n\t\t\t\t\t\tlist.RemoveAt(i);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tlist.Insert(0, item);\r\n\t\t\t\twhile (list.Count > MaxHistoryItemCount) {\r\n\t\t\t\t\tlist.RemoveAt(list.Count - 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tinternal static void CleanUpInexistentFiles(List<string> list) {\r\n\t\t\tlist.RemoveAll(item => FileHelper.HasFileNameMacro(item) == false && File.Exists(item) == false);\r\n\t\t}\r\n\r\n\t\tinternal static void CleanUpInexistentFolders(List<string> list) {\r\n\t\t\tlist.RemoveAll(item => FileHelper.HasFileNameMacro(item) == false && Directory.Exists(item) == false);\r\n\t\t}\r\n\r\n\t\tinternal static bool Load(string path) {\r\n\t\t\treturn LoadJson(path);\r\n\t\t}\r\n\r\n\t\tinternal static bool LoadJson(string path) {\r\n\t\t\tif (String.IsNullOrEmpty(path)) {\r\n\t\t\t\tpath = AppConfigFilePath;\r\n\t\t\t}\r\n\t\t\tif (File.Exists(path) == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tConfigurationSerialization conf;\r\n\t\t\ttry {\r\n\t\t\t\tconf = Json.ToObject<ConfigurationSerialization>(File.ReadAllText(path, Encoding.UTF8), JsonSm);\r\n\t\t\t\tif (conf == null || conf.SaveAppSettings == false) {\r\n\t\t\t\t\tSaveAppSettings = false;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tCheckUpdateDate = conf.CheckUpdateDate;\r\n\t\t\tCheckUpdateInterval = conf.CheckUpdateInterval;\r\n\t\t\tLoadPartialPdfFile = conf.PdfLoadMode == Configuration.OptimalMemoryUsage;\r\n\t\t\tif (conf.Recent != null) {\r\n\t\t\t\tRecent = conf.Recent;\r\n\t\t\t}\r\n\t\t\tif (conf.ExporterOptions != null) {\r\n\t\t\t\tExporter = conf.ExporterOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.ImporterOptions != null) {\r\n\t\t\t\tImporter = conf.ImporterOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.MergerOptions != null) {\r\n\t\t\t\tMerger = conf.MergerOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.PatcherOptions != null) {\r\n\t\t\t\tPatcher = conf.PatcherOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.EditorOptions != null) {\r\n\t\t\t\tEditor = conf.EditorOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.ReaderOptions != null) {\r\n\t\t\t\tReader = conf.ReaderOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.AutoBookmarkOptions != null) {\r\n\t\t\t\tAutoBookmarker = conf.AutoBookmarkOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.Encodings != null) {\r\n\t\t\t\tEncodings = conf.Encodings;\r\n\t\t\t}\r\n\t\t\tif (conf.ImageExporterOptions != null) {\r\n\t\t\t\tImageExtracter = conf.ImageExporterOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.ImageRendererOptions != null) {\r\n\t\t\t\tImageRenderer = conf.ImageRendererOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.OcrOptions != null) {\r\n\t\t\t\tOcr = conf.OcrOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.ExtractPageOptions != null) {\r\n\t\t\t\tExtractPage = conf.ExtractPageOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.ToolbarOptions != null) {\r\n\t\t\t\tToolbar = conf.ToolbarOptions;\r\n\t\t\t}\r\n\t\t\tif (conf.WindowStatus != null) {\r\n\t\t\t\tWindowStatus = conf.WindowStatus;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 保存应用程序配置。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"path\">保存路径。路径为空时，保存到默认位置。</param>\r\n\t\t/// <param name=\"saveHistoryFileList\">是否保存历史文件列表。</param>\r\n\t\t/// <param name=\"skipReadonly\">是否跳过只读文件。</param>\r\n\t\tinternal static void Save(string path, bool saveHistoryFileList, bool skipReadonly) {\r\n\t\t\ttry {\r\n\t\t\t\tSaveJson(path ?? AppConfigFilePath, saveHistoryFileList, skipReadonly);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"保存程序设置时出错\", ex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SaveJson(FilePath path, bool saveHistoryFileList, bool skipReadonly) {\r\n\t\t\tif (skipReadonly && path.ExistsFile && (path.ToFileInfo().Attributes & FileAttributes.ReadOnly) > 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar s = SaveAppSettings\r\n\t\t\t\t? new ConfigurationSerialization {\r\n\t\t\t\t\tSaveAppSettings = true,\r\n\t\t\t\t\tCheckUpdateDate = CheckUpdateDate,\r\n\t\t\t\t\tCheckUpdateInterval = CheckUpdateInterval,\r\n\t\t\t\t\tPdfLoadMode = LoadPartialPdfFile ? Configuration.OptimalMemoryUsage : Configuration.OptimalSpeed,\r\n\t\t\t\t\tMergerOptions = Merger,\r\n\t\t\t\t\tExporterOptions = Exporter,\r\n\t\t\t\t\tImporterOptions = Importer,\r\n\t\t\t\t\tPatcherOptions = Patcher,\r\n\t\t\t\t\tEditorOptions = Editor,\r\n\t\t\t\t\tReaderOptions = Reader,\r\n\t\t\t\t\tAutoBookmarkOptions = AutoBookmarker,\r\n\t\t\t\t\tEncodings = Encodings,\r\n\t\t\t\t\tImageExporterOptions = ImageExtracter,\r\n\t\t\t\t\tImageRendererOptions = ImageRenderer,\r\n\t\t\t\t\tExtractPageOptions = ExtractPage,\r\n\t\t\t\t\tOcrOptions = Ocr,\r\n\t\t\t\t\tToolbarOptions = Toolbar,\r\n\t\t\t\t\tWindowStatus = new WindowStatus(MainForm),\r\n\t\t\t\t\tRecent = saveHistoryFileList ? Recent : null\r\n\t\t\t\t}\r\n\t\t\t\t: new ConfigurationSerialization { SaveAppSettings = false };\r\n\t\t\tpath.WriteAllText(false, Encoding.UTF8, Json.ToJson(s, JsonSm));\r\n\t\t}\r\n\r\n\t\tprivate static void WriteRecentFiles(XmlWriter writer, IList<string> list, string name) {\r\n\t\t\tforeach (var item in list) {\r\n\t\t\t\twriter.WriteStartElement(name);\r\n\t\t\t\twriter.WriteAttributeString(Configuration.Path, item);\r\n\t\t\t\twriter.WriteEndElement();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Commands.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tstatic class Commands\r\n\t{\r\n\t\tinternal const string File = \"_File\";\r\n\t\t#region File menu\r\n\t\tinternal const string Open = \"_Open\";\r\n\t\tinternal const string OpenFile = \"OpenFile\";\r\n\t\tinternal const string LoadList = \"_LoadList\";\r\n\t\tinternal const string RecentFiles = \"_RecentFiles\";\r\n\t\tinternal const string ImportBookmark = \"_ImportBookmark\";\r\n\t\tinternal const string Close = \"_Close\";\r\n\t\tinternal const string Action = \"_Action\";\r\n\t\tinternal const string SaveBookmark = \"_SaveBookmark\";\r\n\t\tinternal const string SaveAsInfoFile = \"_SaveAsInfoFile\";\r\n\t\tinternal const string DocumentProperties = \"_Properties\";\r\n\t\tinternal const string Options = \"_Options\";\r\n\t\tinternal const string ResetOptions = \"_ResetOptions\";\r\n\t\tinternal const string AppOptions = \"_AppOptions\";\r\n\t\tinternal const string RestoreOptions = \"_RestoreOptions\";\r\n\t\tinternal const string SaveOptions = \"_SaveOptions\";\r\n\t\tinternal const string SaveList = \"_SaveList\";\r\n\t\tinternal const string CleanUpInexistentFiles = \"_CleanUpInexistentFiles\";\r\n\t\tinternal const string Exit = \"_Exit\";\r\n\t\t#endregion\r\n\r\n\t\tinternal const string Tools = \"_ToolBox\";\r\n\t\t#region Tools menu\r\n\t\tinternal const string LogWindow = \"_LogWindow\";\r\n\t\tinternal const string ShowGeneralToolbar = \"_ShowGeneralToolbar\";\r\n\t\tinternal const string FullScreenDisplay = \"_FullScreenDisplay\";\r\n\t\tinternal const string CustomizeToolbar = \"_CustomizeToolbar\";\r\n\t\t#endregion\r\n\r\n\t\tinternal const string Selection = \"_Select\";\r\n\t\t#region Selection menu\r\n\t\tinternal const string Copy = \"_Copy\";\r\n\t\tinternal const string Delete = \"_Delete\";\r\n\t\tinternal const string Paste = \"_Paste\";\r\n\t\tinternal const string SelectAllPdf = \"_SelectAllPdfFiles\";\r\n\t\tinternal const string SelectAllImages = \"_SelectAllImages\";\r\n\t\tinternal const string SelectAllFolders = \"_SelectAllFolders\";\r\n\t\tinternal const string SelectAllItems = \"_SelectAll\";\r\n\t\tinternal const string InvertSelection = \"_InvertSelection\";\r\n\t\tinternal const string SelectNone = \"_SelectNone\";\r\n\t\tinternal const string SelectChildren = \"_SelectChildren\";\r\n\t\tinternal const string ItemTypeSeparator = \"_ItemTypeSeparator\";\r\n\t\tinternal const string ExpandAll = \"_ExpandAll\";\r\n\t\tinternal const string ExpandSelection = \"_ExpandSelection\";\r\n\t\tinternal const string CollapseAll = \"_CollapseAll\";\r\n\t\tinternal const string CollapseChildren = \"_CollapseChildren\";\r\n\t\tinternal const string CollapseSelection = \"_CollapseSelection\";\r\n\t\t#endregion\r\n\r\n\t\t#region Options menu\r\n\t\tinternal const string PatcherOptions = \"_PatcherOptions\";\r\n\t\tinternal const string MergerOptions = \"_MergerOptions\";\r\n\t\tinternal const string InfoFileOptions = \"_InfoFileOptions\";\r\n\t\t#endregion\r\n\r\n\t\tinternal const string Help = \"_Help\";\r\n\t\t#region Help menu\r\n\t\tinternal const string CreateShortcut = \"_CreateShortcut\";\r\n\t\tinternal const string VisitHomePage = \"_VisitHomePage\";\r\n\t\tinternal const string CheckUpdate = \"_CheckUpdate\";\r\n\t\t#endregion\r\n\r\n\t\t#region Editor\r\n\t\tinternal const string EditorInsertBookmark = \"_BookmarkHere\";\r\n\t\tinternal const string EditorSavePdf = \"_SavePDF\";\r\n\t\tinternal const string EditorBookmarkLevelUp = \"_LevelUp\";\r\n\t\tinternal const string EditorBookmarkLevelDown = \"_LevelDown\";\r\n\t\tinternal const string EditorBookmarkDelete = \"_DeleteBookmark\";\r\n\t\tinternal const string EditorBookmarkBold = \"_BookmarkBoldButton\";\r\n\t\tinternal const string EditorBookmarkItalic = \"_BookmarkItalicButton\";\r\n\t\tinternal const string EditorBookmarkPageNumberIncrement = \"_IncrementPageNumber\";\r\n\t\tinternal const string EditorBookmarkPageNumberDecrement = \"_DecrementPageNumber\";\r\n\t\tinternal const string EditorBookmarkPageNumberShift = \"_ShiftMultiPageNumber\";\r\n\t\tinternal const string EditorBookmarkPageNumberShiftTakeFollowing = \"_ShiftMultiPageNumberTakeFollowing\";\r\n\t\tinternal const string EditorBookmarkSetCurrentCoordinates = \"_SetCurrentCoordinates\";\r\n\t\tinternal const string EditorOcrPage = \"_OcrPage\";\r\n\t\tinternal const string EditorPageProperties = \"_PageProperties\";\r\n\t\tinternal const string EditorSavePageImage = \"_SavePageImage\";\r\n\t\tinternal const string EditorViewerScrollToBookmark = \"_ViewerScrollToBookmark\";\r\n\t\tinternal const string EditorInsertPageLabel = \"_InsertPageLabel\";\r\n\t\t#endregion\r\n\t\tinternal static readonly string[] TopMenuItems = { File, Tools, Selection };\r\n\t\tinternal static readonly string[] CommonSelectionCommands = { SelectAllItems, SelectNone, InvertSelection };\r\n\t\tinternal static readonly HashSet<string> DefaultDisabledItems = new HashSet<string>(\r\n\t\t\tnew string[] {\r\n\t\t\t\tSelectAllItems, InvertSelection, SelectNone,\r\n\t\t\t\tCopy, Delete,\r\n\t\t\t\tOptions\r\n\t\t\t});\r\n\t\tinternal static readonly HashSet<string> DefaultHiddenItems = new HashSet<string>(\r\n\t\t\tnew string[] {\r\n\t\t\t\tImportBookmark, SaveBookmark, SaveAsInfoFile, DocumentProperties,\r\n\t\t\t\tSelectAllPdf, SelectAllImages, SelectAllFolders, ItemTypeSeparator\r\n\t\t\t});\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/CommandRegistry.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\t/// <summary>\r\n\t/// 表示在指定上下文下执行的处理命令。\r\n\t/// </summary>\r\n\t/// <typeparam name=\"P\">处理命令时的上下文类型。</typeparam>\r\n\tinterface ICommand<P>\r\n\t{\r\n\t\tvoid Process(P context, params string[] parameters);\r\n\t}\r\n\r\n\t/// <summary>\r\n\t/// 不区分字符串大小写匹配的容器集合。用于编辑器命令模式。\r\n\t/// </summary>\r\n\t/// <typeparam name=\"P\">命令模式的处理参数类型。</typeparam>\r\n\tsealed class CommandRegistry<P>\r\n\t{\r\n\t\treadonly Dictionary<string, ICommand<P>> _container = new Dictionary<string, ICommand<P>>(StringComparer.OrdinalIgnoreCase);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 注册执行处理的命令处理器。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"command\">执行命令的处理器。</param>\r\n\t\t/// <param name=\"commandIDs\">触发该命令的命令标识符。</param>\r\n\t\tpublic void Register(ICommand<P> command, params string[] commandIDs) {\r\n\t\t\tforeach (var cmd in commandIDs) {\r\n\t\t\t\t_container.Add(cmd, command);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 执行指定的命令。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"commandID\">命令标识符。</param>\r\n\t\t/// <param name=\"context\">处理命令时的上下文变量。</param>\r\n\t\t/// <param name=\"parameters\">参数。</param>\r\n\t\t/// <returns>如找到对应的命令处理，则返回 true，否则返回 false。</returns>\r\n\t\tpublic bool Process(string commandID, P context, params string[] parameters) {\r\n\t\t\tif (_container.TryGetValue(commandID, out ICommand<P> cmd)) {\r\n\t\t\t\tcmd.Process(context, parameters);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/DualKeyDictionary.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tpublic class DualKeyDictionary<K, V> : IDictionary<K, V>\r\n\t{\r\n\t\tprivate readonly Dictionary<K, V> _keyDictionary = new Dictionary<K, V>();\r\n\t\tprivate readonly Dictionary<V, K> _reverseDictionary = new Dictionary<V, K>();\r\n\r\n\t\tpublic DualKeyDictionary() {\r\n\r\n\t\t}\r\n\r\n\t\tpublic K GetKeyByValue(V value) {\r\n\t\t\treturn _reverseDictionary[value];\r\n\t\t}\r\n\r\n\t\t#region IDictionary<K,V> 成员\r\n\r\n\t\tpublic void Add(K key, V value) {\r\n\t\t\t_keyDictionary.Add(key, value);\r\n\t\t\t_reverseDictionary.Add(value, key);\r\n\t\t}\r\n\r\n\t\tpublic bool ContainsKey(K key) {\r\n\t\t\treturn _keyDictionary.ContainsKey(key);\r\n\t\t}\r\n\t\tpublic bool ContainsValue(V value) {\r\n\t\t\treturn _reverseDictionary.ContainsKey(value);\r\n\t\t}\r\n\r\n\t\tpublic ICollection<K> Keys => _keyDictionary.Keys;\r\n\r\n\t\tpublic bool Remove(K key) {\r\n\t\t\tif (_keyDictionary.ContainsKey(key) == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar value = _keyDictionary[key];\r\n\t\t\t_keyDictionary.Remove(key);\r\n\t\t\t_reverseDictionary.Remove(value);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic bool TryGetValue(K key, out V value) {\r\n\t\t\treturn TryGetValue(key, out value);\r\n\t\t}\r\n\r\n\t\tpublic ICollection<V> Values => _reverseDictionary.Keys;\r\n\r\n\t\tpublic V this[K key] {\r\n\t\t\tget => _keyDictionary[key];\r\n\t\t\tset {\r\n\t\t\t\tRemove(key);\r\n\t\t\t\tAdd(key, value);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region ICollection<KeyValuePair<K,V>> 成员\r\n\r\n\t\tpublic void Add(KeyValuePair<K, V> item) {\r\n\t\t\tAdd(item.Key, item.Value);\r\n\t\t}\r\n\r\n\t\tpublic void Clear() {\r\n\t\t\t_keyDictionary.Clear();\r\n\t\t\t_reverseDictionary.Clear();\r\n\t\t}\r\n\r\n\t\tpublic bool Contains(KeyValuePair<K, V> item) {\r\n\t\t\treturn _keyDictionary.ContainsKey(item.Key) && _reverseDictionary.ContainsKey(item.Value);\r\n\t\t}\r\n\r\n\t\tpublic void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex) {\r\n\t\t\t((ICollection<KeyValuePair<K, V>>)_keyDictionary).CopyTo(array, arrayIndex);\r\n\t\t}\r\n\r\n\t\tpublic int Count => _keyDictionary.Count;\r\n\r\n\t\tpublic bool IsReadOnly => false;\r\n\r\n\t\tpublic bool Remove(KeyValuePair<K, V> item) {\r\n\t\t\treturn Remove(item.Key);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IEnumerable<KeyValuePair<K,V>> 成员\r\n\r\n\t\tpublic IEnumerator<KeyValuePair<K, V>> GetEnumerator() {\r\n\t\t\treturn ((IEnumerable<KeyValuePair<K, V>>)_keyDictionary).GetEnumerator();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IEnumerable 成员\r\n\r\n\t\tSystem.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {\r\n\t\t\treturn ((System.Collections.IEnumerable)_keyDictionary).GetEnumerator();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/FileHelper.cs",
    "content": "﻿using System;\r\nusing System.IO;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class FileHelper\r\n\t{\r\n\t\tenum OverwriteType\r\n\t\t{\r\n\t\t\tPrompt, Overwrite, Skip\r\n\t\t}\r\n\t\tstatic OverwriteType __OverwriteMode;\r\n\r\n\t\tpublic static bool HasExtension(FilePath fileName, string extension) {\r\n\t\t\treturn fileName.HasExtension(extension);\r\n\t\t}\r\n\t\tpublic static bool HasFileNameMacro(string fileName) {\r\n\t\t\tvar c = '<';\r\n\t\t\tforeach (var item in fileName) {\r\n\t\t\t\tif (item == c) {\r\n\t\t\t\t\tif (c == '>') {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc = '>';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tpublic static int NumericAwareComparePath(string path1, string path2) {\r\n\t\t\tconst char PathDot = '.';\r\n\t\t\tvar l1 = path1?.Length ?? 0;\r\n\t\t\tvar l2 = path2?.Length ?? 0;\r\n\t\t\tif (l1 == 0 || l2 == 0) {\r\n\t\t\t\treturn l1 - l2;\r\n\t\t\t}\r\n\t\t\tint n1 = 0, n2 = 0;\r\n\t\t\tfor (int i1 = 0, i2 = 0; i1 < l1 && i2 < l2; i1++, i2++) {\r\n\t\t\t\tvar x = path1[i1];\r\n\t\t\t\tvar y = path2[i2];\r\n\t\t\t\tif (x < '0' || x > '9') {\r\n\t\t\t\t\t// 不区分大小写的文字比较\r\n\t\t\t\t\tif (x != y) {\r\n\t\t\t\t\t\tx = ToLowerAscii(x);\r\n\t\t\t\t\t\ty = ToLowerAscii(y);\r\n\t\t\t\t\t\tif (x == y) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn x == PathDot ? -1\r\n\t\t\t\t\t\t\t: y == PathDot ? 1\r\n\t\t\t\t\t\t\t: y < '0' || y > '9' ? LocaleInfo.StringComparer(x.ToString(), y.ToString(), System.Globalization.CompareOptions.StringSort)\r\n\t\t\t\t\t\t\t// path2 为数字，path1 不为数字，path2 排在前面\r\n\t\t\t\t\t\t\t: 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (IsPathSeparator(x)) {\r\n\t\t\t\t\tif (IsPathSeparator(y)) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn -1;\r\n\t\t\t\t}\r\n\t\t\t\telse if (IsPathSeparator(y)) {\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// 数字比较\r\n\t\t\t\t\tif (y >= '0' && y <= '9') {\r\n\t\t\t\t\t\t// 两组均为数字\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (x > '0' || n1 > 0) {\r\n\t\t\t\t\t\t\t\t++n1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} while (++i1 < l1 && (x = path1[i1]) >= '0' && x <= '9');\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (y > '0' || n2 > 0) {\r\n\t\t\t\t\t\t\t\t++n2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} while (++i2 < l2 && (y = path2[i2]) >= '0' && y <= '9');\r\n\t\t\t\t\t\t// 数字位数少的在前面\r\n\t\t\t\t\t\tif (n1 != n2) {\r\n\t\t\t\t\t\t\treturn n1 - n2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// 全是 0，继续后面的比较\r\n\t\t\t\t\t\tif (n1 == 0 || n2 == 0) {\r\n\t\t\t\t\t\t\t--i1;\r\n\t\t\t\t\t\t\t--i2;\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ti1 -= n1;\r\n\t\t\t\t\t\ti2 -= n2;\r\n\t\t\t\t\t\tfor (int i = 0; i < n1; i++, i1++, i2++) {\r\n\t\t\t\t\t\t\tx = path1[i1];\r\n\t\t\t\t\t\t\ty = path2[i2];\r\n\t\t\t\t\t\t\tif (x != y) {\r\n\t\t\t\t\t\t\t\treturn x - y;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// 数值相等，比较下一组\r\n\t\t\t\t\t\tn1 = n2 = 0;\r\n\t\t\t\t\t\t--i1;\r\n\t\t\t\t\t\t--i2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t// 仅 x 为数字，y 不为数字\r\n\t\t\t\t\t\treturn y == PathDot ? 1 : x - y;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn path1.Length - path2.Length;\r\n\t\t}\r\n\t\tstatic char ToLowerAscii(char c) {\r\n\t\t\treturn c >= 'A' && c <= 'Z' ? (char)(c + ('a' - 'A')) : c;\r\n\t\t}\r\n\r\n\t\tinternal static bool CheckOverwrite(string targetFile) {\r\n\t\t\tif (!File.Exists(targetFile)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tswitch (__OverwriteMode) {\r\n\t\t\t\tcase OverwriteType.Prompt:\r\n\t\t\t\t\tvar r = Common.FormHelper.YesNoCancelBox(String.Join(\"\\n\", [\r\n\t\t\t\t\t\t\"是否覆盖目标文件？\", targetFile, \"\\n按住 Shift 键重复此对话框的选择，本次操作不再弹出覆盖文件提示。\"\r\n\t\t\t\t\t]));\r\n\t\t\t\t\tif (r == System.Windows.Forms.DialogResult.No) {\r\n\t\t\t\t\t\tif (FormHelper.IsShiftKeyDown) {\r\n\t\t\t\t\t\t\t__OverwriteMode = OverwriteType.Skip;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tgoto case OverwriteType.Skip;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (r == System.Windows.Forms.DialogResult.Cancel) {\r\n\t\t\t\t\t\tthrow new OperationCanceledException();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (FormHelper.IsShiftKeyDown) {\r\n\t\t\t\t\t\t__OverwriteMode = OverwriteType.Overwrite;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase OverwriteType.Overwrite:\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase OverwriteType.Skip:\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, \"取消覆盖文件：\" + targetFile);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgoto case OverwriteType.Prompt;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic static string CombinePath(string path1, string path2) {\r\n\t\t\tif (string.IsNullOrEmpty(path2)) {\r\n\t\t\t\treturn path1 ?? string.Empty;\r\n\t\t\t}\r\n\t\t\tif (string.IsNullOrEmpty(path1)) {\r\n\t\t\t\treturn path2;\r\n\t\t\t}\r\n\t\t\tvar l2 = path2.Length;\r\n\t\t\tif (l2 > 0) {\r\n\t\t\t\tif (IsPathSeparator(path2[0]) || (l2 > 1 && path2[1] == Path.VolumeSeparatorChar)) {\r\n\t\t\t\t\treturn path2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar ch = path1[path1.Length - 1];\r\n\t\t\tif (IsPathSeparator(ch) == false) {\r\n\t\t\t\treturn path1 + Path.DirectorySeparatorChar + path2;\r\n\t\t\t}\r\n\t\t\treturn path1 + path2;\r\n\t\t}\r\n\t\tpublic static bool ComparePath(FilePath path1, FilePath path2) {\r\n\t\t\treturn path1.Equals(path2);\r\n\t\t}\r\n\r\n\t\tpublic static bool IsPathValid(string filePath) {\r\n\t\t\treturn String.IsNullOrEmpty(filePath) == false && filePath.Trim().Length > 0\r\n\t\t\t\t&& filePath.IndexOfAny(FilePath.InvalidPathChars) == -1;\r\n\t\t}\r\n\t\tstatic bool IsPathSeparator(char c) {\r\n\t\t\treturn c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar;\r\n\t\t}\r\n\r\n\t\tinternal static void ResetOverwriteMode() {\r\n\t\t\t__OverwriteMode = OverwriteType.Prompt;\r\n\t\t}\r\n\r\n\t\tinternal static string MakePathRootedAndWithExtension(string path, string basePath, string extName, bool forceExt) {\r\n\t\t\tvar p = Path.Combine(Path.GetDirectoryName(basePath), path);\r\n\t\t\treturn Path.GetExtension(p).Length == 0 || forceExt ? (string)new FilePath(p).EnsureExtension(extName) : p;\r\n\t\t}\r\n\r\n\t\tstatic FilePath AttachExtensionName(FilePath fileName, string extension) {\r\n\t\t\treturn fileName.EnsureExtension(extension);\r\n\t\t}\r\n\r\n\t\tstatic string GetNewFileName(string fileName, string extName) {\r\n\t\t\tvar tmpName = AttachExtensionName(fileName, extName);\r\n\t\t\tvar n = 1;\r\n\t\t\twhile (tmpName.ExistsFile) {\r\n\t\t\t\ttmpName = AttachExtensionName(fileName + \"[\" + (++n) + \"]\", extName);\r\n\t\t\t}\r\n\t\t\treturn tmpName.ToString();\r\n\t\t}\r\n\t\tpublic static string GetValidFileName(FilePath fileName) {\r\n\t\t\treturn fileName.SubstituteInvalidChars('_').ToString();\r\n\t\t}\r\n\t\tinternal static string GetNewFileNameFromSourceFile(string fileName, string extName) {\r\n\t\t\tvar d = Path.GetDirectoryName(fileName);\r\n\t\t\treturn GetNewFileName(\r\n\t\t\t\td + @\"\\\" + Path.GetFileNameWithoutExtension(fileName),\r\n\t\t\t\textName)\r\n\t\t\t\t.Replace(@\"\\\\\", @\"\\\");\r\n\t\t}\r\n\t\tinternal static string GetTempNameFromFileDirectory(string fileName, string extName) {\r\n\t\t\tvar f = Path.GetDirectoryName(fileName);\r\n\t\t\tvar t = Path.GetTempFileName();\r\n\t\t\treturn Path.Combine(f, t + extName);\r\n\t\t}\r\n\t\tpublic static string GetEllipticPath(string path, int length) {\r\n\t\t\tif (length < 11) {\r\n\t\t\t\tlength = 11;\r\n\t\t\t}\r\n\t\t\treturn path == null ? string.Empty\r\n\t\t\t\t: path.Length > length ? $\"{path.Substring(0, 7)}...{path.Substring(path.Length - (length - 10))}\"\r\n\t\t\t\t: path;\r\n\t\t}\r\n\r\n\t\tpublic static byte[] DumpBytes(this byte[] source, FilePath path) {\r\n\t\t\treturn source.DumpBytes(path, 0, source?.Length ?? 0);\r\n\t\t}\r\n\t\tpublic static byte[] DumpBytes(this byte[] source, FilePath path, int offset, int count) {\r\n\t\t\tusing (var f = new FileStream(path.ToFullPath(), FileMode.OpenOrCreate, FileAccess.Write)) {\r\n\t\t\t\tif (source == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tf.Write(source, offset, count);\r\n\t\t\t}\r\n\t\t\treturn source;\r\n\t\t}\r\n\t\tpublic static byte[] DumpHexBinBytes(this byte[] source, FilePath path) {\r\n\t\t\tusing (var f = new StreamWriter(path.ToFullPath())) {\r\n\t\t\t\tif (source == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tbyte t;\r\n\t\t\t\tfor (int i = 0; i < source.Length; i++) {\r\n\t\t\t\t\tif (i > 0) {\r\n\t\t\t\t\t\tif ((i & 0xF) == 0) {\r\n\t\t\t\t\t\t\tf.WriteLine();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ((i & 0x1) == 0) {\r\n\t\t\t\t\t\t\tf.Write(' ');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar b = source[i];\r\n\t\t\t\t\tt = (byte)(b >> 4);\r\n\t\t\t\t\tf.Write((char)(t + (t > 9 ? ('A' - 10) : 0x30)));\r\n\t\t\t\t\tt = (byte)(b & 0x0F);\r\n\t\t\t\t\tf.Write((char)(t + (t > 9 ? ('A' - 10) : 0x30)));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn source;\r\n\t\t}\r\n\r\n\t\tstatic class LocaleInfo\r\n\t\t{\r\n\t\t\tpublic static readonly Func<string, string, System.Globalization.CompareOptions, int> StringComparer = System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/FilePath.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing NameList = System.Collections.Generic.List<string>;\r\nusing SysDirectory = System.IO.Directory;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\t/// <summary>表示文件路径的结构。此结构可隐式转换为字符串、<see cref=\"FileInfo\"/>、<see cref=\"DirectoryInfo\"/> 和 <see cref=\"Uri\"/>。</summary>\r\n\tpublic readonly struct FilePath : IEquatable<FilePath>\r\n\t{\r\n\t\tinternal static readonly char[] InvalidFileNameChars = Path.GetInvalidFileNameChars();\r\n\t\tinternal static readonly char[] InvalidPathChars = Path.GetInvalidPathChars();\r\n\t\tinternal static readonly Func<string, string, bool> __PathComparer = StringComparer.OrdinalIgnoreCase.Equals;\r\n\r\n\t\t/// <summary>表示匹配任何文件的通配符。</summary>\r\n\t\tpublic const string Wildcard = \"*\";\r\n\t\t/// <summary>表示匹配当前目录、递归子目录和任何文件的通配符。</summary>\r\n\t\tpublic const string RecursiveWildcard = \"**\";\r\n\r\n\t\t/// <summary>表示没有任何内容的路径。</summary>\r\n\t\tpublic static readonly FilePath Empty = new FilePath(string.Empty, false);\r\n\r\n\t\t/// <summary>获取应用程序所在的目录路径。</summary>\r\n\t\tpublic static readonly FilePath AppRoot = ((FilePath)AppDomain.CurrentDomain.BaseDirectory).AppendPathSeparator();\r\n\r\n\t\t/// <summary>获取应用程序的文件路径（对于 Web 应用程序，返回 <see cref=\"Empty\"/>）。</summary>\r\n\t\tpublic static readonly FilePath AppPath = Assembly.GetEntryAssembly() != null ? (FilePath)Assembly.GetEntryAssembly().Location : Empty;\r\n\r\n\t\tstatic readonly char[] __PathSeparators = { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };\r\n\t\tstatic readonly string __CurrentPath = \".\" + Path.DirectorySeparatorChar;\r\n\t\treadonly string _value;\r\n\r\n\t\t/// <summary>传入文件路径的字符串形式，创建新的 <see cref=\"FilePath\"/> 实例。在创建实例时，删除传入字符串内所有的前导和尾随空白。</summary>\r\n\t\t/// <param name=\"path\">文件路径的字符串形式。</param>\r\n\t\tpublic FilePath(string path) : this(path, true) { }\r\n\r\n\t\tinternal FilePath(string path, bool trim) {\r\n\t\t\t_value = string.IsNullOrEmpty(path)\r\n\t\t\t\t? string.Empty\r\n\t\t\t\t: trim ? path.Trim() : path;\r\n\t\t}\r\n\r\n\t\t/// <summary>返回当前路径的目录部分。如目录为相对路径，则先转换为以当前程序所在目录路径为基准的绝对路径。</summary>\r\n\t\t/// <returns>当前路径的目录部分。</returns>\r\n\t\tpublic FilePath Directory {\r\n\t\t\tget {\r\n\t\t\t\tconst int None = 0, EndWithSep = 1, EndWithLetter = 2;\r\n\t\t\t\tvar p = AppRoot.Combine(_value)._value;\r\n\t\t\t\tint s = None;\r\n\t\t\t\tfor (int i = p.Length - 1; i >= 0; i--) {\r\n\t\t\t\t\tvar c = p[i];\r\n\t\t\t\t\tbool d = IsDirectorySeparator(c);\r\n\t\t\t\t\tswitch (s) {\r\n\t\t\t\t\t\tcase None:\r\n\t\t\t\t\t\t\tif (d) {\r\n\t\t\t\t\t\t\t\ts = EndWithSep;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (Char.IsWhiteSpace(c) == false) {\r\n\t\t\t\t\t\t\t\ts = EndWithLetter;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\tcase EndWithSep:\r\n\t\t\t\t\t\t\tif (d) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (c == Path.VolumeSeparatorChar) {\r\n\t\t\t\t\t\t\t\treturn Empty;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\treturn p.Substring(0, i + 1);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcase EndWithLetter:\r\n\t\t\t\t\t\t\tif (d) {\r\n\t\t\t\t\t\t\t\treturn p.Substring(0, (i == 2 && p[1] == Path.VolumeSeparatorChar || i == 0) ? i + 1 : i);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (c == Path.VolumeSeparatorChar) {\r\n\t\t\t\t\t\t\t\treturn p.Substring(0, i + 1) + Path.DirectorySeparatorChar;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn Empty;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>返回当前路径是否以目录分隔符结束。</summary>\r\n\t\tpublic bool EndsWithPathSeparator {\r\n\t\t\tget {\r\n\t\t\t\tif (String.IsNullOrEmpty(_value)) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tfor (int i = _value.Length - 1; i >= 0; i--) {\r\n\t\t\t\t\tvar c = _value[i];\r\n\t\t\t\t\tif (Char.IsWhiteSpace(c)) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn IsDirectorySeparator(c);\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>检查当前路径对应的文件是否存在。</summary>\r\n\t\tpublic bool ExistsFile => File.Exists(ToFullPath()._value);\r\n\r\n\t\t/// <summary>检查当前路径对应的目录是否存在。</summary>\r\n\t\tpublic bool ExistsDirectory => SysDirectory.Exists(ToFullPath()._value);\r\n\r\n\t\t/// <summary>获取文件路径的文件名部分。</summary>\r\n\t\tpublic string FileName {\r\n\t\t\tget {\r\n\t\t\t\tif (IsEmpty) {\r\n\t\t\t\t\treturn string.Empty;\r\n\t\t\t\t}\r\n\t\t\t\tchar c;\r\n\t\t\t\tfor (int i = _value.Length - 1; i >= 0; i--) {\r\n\t\t\t\t\tc = _value[i];\r\n\t\t\t\t\tif (IsDirectorySeparator(c) || c == Path.VolumeSeparatorChar) {\r\n\t\t\t\t\t\treturn _value.Substring(++i);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn _value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>获取文件路径的文件名（不包含扩展名）部分。</summary>\r\n\t\tpublic string FileNameWithoutExtension {\r\n\t\t\tget {\r\n\t\t\t\tif (IsEmpty) {\r\n\t\t\t\t\treturn string.Empty;\r\n\t\t\t\t}\r\n\t\t\t\tchar c;\r\n\t\t\t\tvar l = _value.Length;\r\n\t\t\t\tvar d = l;\r\n\t\t\t\tfor (int i = d - 1; i >= 0; i--) {\r\n\t\t\t\t\tc = _value[i];\r\n\t\t\t\t\tif (c == '.') {\r\n\t\t\t\t\t\tif (d == l) {\r\n\t\t\t\t\t\t\td = i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (IsDirectorySeparator(c) || c == Path.VolumeSeparatorChar) {\r\n\t\t\t\t\t\treturn d != l ? _value.Substring(++i, d - i) : _value.Substring(++i);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn d != l ? _value.Substring(0, d) : _value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>获取文件路径的文件扩展名部分。</summary>\r\n\t\tpublic string FileExtension {\r\n\t\t\tget {\r\n\t\t\t\tif (IsEmpty) {\r\n\t\t\t\t\treturn string.Empty;\r\n\t\t\t\t}\r\n\t\t\t\tchar c;\r\n\t\t\t\tint i;\r\n\t\t\t\tfor (i = _value.Length - 1; i >= 0; i--) {\r\n\t\t\t\t\tc = _value[i];\r\n\t\t\t\t\tif (IsDirectorySeparator(c)) {\r\n\t\t\t\t\t\ti = -1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (c == '.') {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn i > -1 && i < _value.Length - 1 ? _value.Substring(i) : string.Empty;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>返回当前路径是否为空。</summary>\r\n\t\tpublic bool IsEmpty => String.IsNullOrEmpty(_value);\r\n\r\n\t\t/// <summary>返回当前文件路径是否有效。</summary>\r\n\t\tpublic bool IsValidPath => _value?.Trim().Length > 0 && _value.IndexOfAny(InvalidPathChars) == -1;\r\n\r\n\t\t/// <summary>在路径后附加 <see cref=\"Path.DirectorySeparatorChar\"/> 字符。</summary>\r\n\t\t/// <returns>附加了“\\”字符的路径。</returns>\r\n\t\tpublic FilePath AppendPathSeparator() {\r\n\t\t\treturn IsEmpty == false && _value[_value.Length - 1] == Path.DirectorySeparatorChar\r\n\t\t\t\t? this\r\n\t\t\t\t: (FilePath)(_value + Path.DirectorySeparatorChar);\r\n\t\t}\r\n\t\t/// <summary>删除路径尾部的 <see cref=\"Path.DirectorySeparatorChar\"/> 或 <see cref=\"Path.AltDirectorySeparatorChar\"/> 字符。</summary>\r\n\t\t/// <returns>删除了尾部“\\”字符的路径。</returns>\r\n\t\tpublic FilePath TrimPathSeparator() {\r\n\t\t\tif (_value == null) {\r\n\t\t\t\treturn Empty;\r\n\t\t\t}\r\n\r\n\t\t\tstring p = _value;\r\n\t\t\tint i;\r\n\t\t\tfor (i = p.Length - 1; i >= 0; i--) {\r\n\t\t\t\tchar c = p[i];\r\n\t\t\t\tif (!Char.IsWhiteSpace(c) && IsDirectorySeparator(c) == false) {\r\n\t\t\t\t\treturn _value.Substring(0, i + 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Empty;\r\n\t\t}\r\n\r\n\t\t/// <summary>替换文件路径的扩展名为新的扩展名。</summary>\r\n\t\t/// <param name=\"extension\">新的扩展名。</param>\r\n\t\t/// <returns>替换扩展名后的路径。</returns>\r\n\t\tpublic FilePath ChangeExtension(string extension) {\r\n\t\t\tif (IsEmpty) {\r\n\t\t\t\treturn Empty;\r\n\t\t\t}\r\n\t\t\tif (extension == null || (extension = extension.TrimEnd()).Length == 0) {\r\n\t\t\t\textension = String.Empty;\r\n\t\t\t}\r\n\t\t\telse if (extension[0] != '.') {\r\n\t\t\t\textension = \".\" + extension;\r\n\t\t\t}\r\n\t\t\tint i;\r\n\t\t\tchar c;\r\n\t\t\tfor (i = _value.Length - 1; i >= 0; i--) {\r\n\t\t\t\tc = _value[i];\r\n\t\t\t\tif (IsDirectorySeparator(c)) {\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (c == '.') {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn new FilePath(i >= 0 ? _value.Substring(0, i) + extension : _value + extension, false);\r\n\t\t}\r\n\r\n\t\t/// <inheritdoc cref=\"Combine(FilePath, bool)\"/>\r\n\t\tpublic FilePath Combine(FilePath path) {\r\n\t\t\treturn Combine(path, false);\r\n\t\t}\r\n\r\n\t\t/// <summary>合并两个文件路径。如 <paramref name=\"path\"/> 为绝对路径，则返回该路径。</summary>\r\n\t\t/// <param name=\"path\">子路径。</param>\r\n\t\t/// <param name=\"rootAsRelative\">对于 <paramref name=\"path\"/> 以 <see cref=\"Path.DirectorySeparatorChar\"/> 开头的情况，取值为 <see langword=\"true\"/> 时，视为以当前目录为基础目录；否则将 <paramref name=\"path\"/> 视为从根目录开始，返回 <paramref name=\"path\"/>。</param>\r\n\t\t/// <returns>合并后的路径。</returns>\r\n\t\tpublic FilePath Combine(FilePath path, bool rootAsRelative) {\r\n\t\t\tif (path.IsEmpty) {\r\n\t\t\t\treturn _value != null ? this : Empty;\r\n\t\t\t}\r\n\t\t\tif (IsEmpty) {\r\n\t\t\t\treturn path._value != null ? path : Empty;\r\n\t\t\t}\r\n\t\t\tvar p2 = path._value;\r\n\t\t\tvar ps = p2[0];\r\n\t\t\tbool p2r;\r\n\t\t\tif ((p2r = IsDirectorySeparator(ps)) && rootAsRelative == false // note 不能调转 && 参数的顺序，p2r 在后面有用\r\n\t\t\t\t|| p2.Length > 1 && (p2[1] == Path.VolumeSeparatorChar || ps == Path.DirectorySeparatorChar && p2[1] == ps)) {\r\n\t\t\t\treturn path;\r\n\t\t\t}\r\n\r\n\t\t\tvar p1 = _value/*.TrimEnd()*/; // _value 已在创建时 Trim 过，不需再 Trim\r\n\t\t\tif (ps == '.') {\r\n\t\t\t\tif (p2.Length == 1) {\r\n\t\t\t\t\treturn p1;\r\n\t\t\t\t}\r\n\t\t\t\tif (p2.IndexOfAny(__PathSeparators, 1) < 0) {\r\n\t\t\t\t\treturn p1 + p2; // 合并扩展名\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn IsDirectorySeparator(p1[p1.Length - 1]) == false && p2r == false\r\n\t\t\t\t? new FilePath(p1 + Path.DirectorySeparatorChar + p2)\r\n\t\t\t\t: new FilePath(p1 + p2, false);\r\n\t\t}\r\n\r\n\t\t/// <summary>为当前文件路径创建目录。如文件路径为空，则不创建路径。</summary>\r\n\t\t/// <returns>所创建目录的路径。</returns>\r\n\t\tpublic FilePath CreateDirectory() {\r\n\t\t\tif (IsEmpty) {\r\n\t\t\t\treturn Empty;\r\n\t\t\t}\r\n\t\t\tvar p = ToFullPath();\r\n\t\t\tif (SysDirectory.Exists(p) == false) {\r\n\t\t\t\tSysDirectory.CreateDirectory(p);\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\t}\r\n\r\n\t\t/// <summary>为当前文件路径创建其所属的目录。如文件路径为空，则不创建路径。</summary>\r\n\t\t/// <returns>所创建目录的路径。</returns>\r\n\t\tpublic FilePath CreateContainingDirectory() {\r\n\t\t\tif (IsEmpty) {\r\n\t\t\t\treturn Empty;\r\n\t\t\t}\r\n\t\t\tvar f = Directory;\r\n\t\t\tif (SysDirectory.Exists(f._value) == false) {\r\n\t\t\t\tSysDirectory.CreateDirectory(f._value);\r\n\t\t\t}\r\n\t\t\treturn f;\r\n\t\t}\r\n\r\n\t\t/// <summary>删除当前文件路径对应的文件。</summary>\r\n\t\tpublic void DeleteFile() {\r\n\t\t\tvar p = ToFullPath()._value;\r\n\t\t\tFile.Delete(p);\r\n\t\t}\r\n\t\t/// <summary>删除当前文件路径对应的目录。如路径指向的目录不存在，不执行任何操作。</summary>\r\n\t\t/// <param name=\"recursive\">是否递归删除子目录的文件</param>\r\n\t\tpublic void DeleteDirectory(bool recursive) {\r\n\t\t\tvar p = ToFullPath()._value;\r\n\t\t\tSysDirectory.Delete(p, recursive);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回附加指定扩展名的实例。如当前路径已包含指定的扩展名，则返回当前路径，否则返回附加扩展名的实例。</summary>\r\n\t\t/// <param name=\"extension\">需要附加的文件扩展名。</param>\r\n\t\t/// <returns>附加指定扩展名的实例。</returns>\r\n\t\tpublic FilePath EnsureExtension(string extension) {\r\n\t\t\treturn HasExtension(extension) ? this : new FilePath(_value + extension);\r\n\t\t}\r\n\r\n\t\t/// <summary>创建以应用程序所在目录为基准的路径。</summary>\r\n\t\t/// <param name=\"path\">相对路径。</param>\r\n\t\t/// <returns>返回以应用程序所在目录为基准的路径。</returns>\r\n\t\tpublic static FilePath FromRoot(string path) {\r\n\t\t\treturn AppRoot.Combine(path);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回与文件关联的版本说明信息。</summary>\r\n\t\t/// <returns>文件 <see cref=\"FileVersionInfo\"/> 对应的 <see cref=\"FileVersionInfo.FileDescription\"/></returns>\r\n\t\tpublic string GetDescription() {\r\n\t\t\treturn FileVersionInfo.GetVersionInfo(ToFullPath()).FileDescription;\r\n\t\t}\r\n\r\n\t\t/// <summary>获取当前 <see cref=\"FilePath\"/> 下符合匹配模式的文件。在执行匹配前，先将当前实例转换为完整路径。当前用户无权访问的目录将被忽略。</summary>\r\n\t\t/// <param name=\"pattern\">匹配文件用的模式。模式中的“\\”用于分隔目录，“**”表示当前目录及其包含的所有目录，“*”匹配 0 到多个字符，“?”匹配 1 个字符。模式为空时，返回所有文件。</param>\r\n\t\t/// <returns>返回匹配模式的所有文件。</returns>\r\n\t\tpublic FilePath[] GetFiles(string pattern) {\r\n\t\t\treturn GetFiles(pattern, null);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取当前 <see cref=\"FilePath\"/> 下符合匹配模式的目录。在执行匹配前，先将当前实例转换为完整路径。当前用户无权访问的目录将被忽略。</summary>\r\n\t\t/// <param name=\"pattern\">匹配目录用的模式。模式中的“\\”用于分隔目录，“**”表示当前目录及其包含的所有目录，“*”匹配 0 到多个字符，“?”匹配 1 个字符。模式为空时，返回所有一级子目录。</param>\r\n\t\t/// <returns>返回匹配模式的所有目录。</returns>\r\n\t\tpublic FilePath[] GetDirectories(string pattern) {\r\n\t\t\treturn GetDirectories(pattern, null);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取当前 <see cref=\"FilePath\"/> 下符合匹配模式和筛选条件的文件。在执行匹配前，先将当前实例转换为完整路径。当前用户无权访问的目录将被忽略。</summary>\r\n\t\t/// <param name=\"pattern\">匹配文件用的模式。模式中的“\\”用于分隔目录，“**”表示当前目录及其包含的所有目录，“*”匹配 0 到多个字符，“?”匹配 1 个字符。</param>\r\n\t\t/// <param name=\"filter\">用于筛选文件名的委托。</param>\r\n\t\t/// <returns>返回匹配模式的所有文件。</returns>\r\n\t\tpublic FilePath[] GetFiles(string pattern, Predicate<string> filter) {\r\n\t\t\tvar f = ToFullPath();\r\n\t\t\tif (String.IsNullOrEmpty(pattern)) {\r\n\t\t\t\treturn SysDirectory.Exists(f._value)\r\n\t\t\t\t\t? GetFiles(f._value, Wildcard, filter)\r\n\t\t\t\t\t: new FilePath[0];\r\n\t\t\t}\r\n\r\n\t\t\tstring fp;\r\n\t\t\tbool rp = pattern == RecursiveWildcard;\r\n\t\t\tvar p = new FilePath(pattern).GetParts(false);\r\n\t\t\tvar pl = p.Length;\r\n\t\t\tvar t = GetDirectories(f._value, p, rp ? 1 : pl - 1);\r\n\t\t\tif (rp) {\r\n\t\t\t\tfp = Wildcard;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (t.Count == 0) {\r\n\t\t\t\t\treturn new FilePath[0];\r\n\t\t\t\t}\r\n\t\t\t\tfp = p[pl - 1];\r\n\t\t\t}\r\n\t\t\tvar r = new List<FilePath>();\r\n\t\t\tforeach (var item in t) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tr.AddRange(GetFiles(item, fp, filter));\r\n\t\t\t\t}\r\n\t\t\t\tcatch (UnauthorizedAccessException) {\r\n\t\t\t\t\t// continue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r.ToArray();\r\n\t\t}\r\n\r\n\t\tstatic FilePath[] GetFiles(string directory, string filePattern, Predicate<string> filter) {\r\n\t\t\treturn SysDirectory.Exists(directory) ? Array.ConvertAll(\r\n\t\t\t\tfilter != null ? Array.FindAll(SysDirectory.GetFiles(directory, filePattern), filter) : SysDirectory.GetFiles(directory, filePattern)\r\n\t\t\t\t, i => (FilePath)i)\r\n\t\t\t\t\t: new FilePath[0];\r\n\t\t}\r\n\r\n\t\t/// <summary>获取当前 <see cref=\"FilePath\"/> 下符合匹配模式和筛选条件的目录。在执行匹配前，先将当前实例转换为完整路径。当前用户无权访问的目录将被忽略。</summary>\r\n\t\t/// <param name=\"pattern\">匹配目录用的模式。模式中的“\\”用于分隔目录，“**”表示当前目录及其包含的所有目录，“*”匹配 0 到多个字符，“?”匹配 1 个字符。</param>\r\n\t\t/// <param name=\"filter\">用于筛选目录名的委托。</param>\r\n\t\t/// <returns>返回匹配模式的所有目录。</returns>\r\n\t\tpublic FilePath[] GetDirectories(string pattern, Predicate<string> filter) {\r\n\t\t\tvar f = ToFullPath();\r\n\t\t\tif (String.IsNullOrEmpty(pattern)) {\r\n\t\t\t\treturn SysDirectory.Exists(f._value)\r\n\t\t\t\t\t? GetDirectories(f._value, Wildcard, filter)\r\n\t\t\t\t\t: new FilePath[0];\r\n\t\t\t}\r\n\r\n\t\t\tstring fp;\r\n\t\t\tbool rp = pattern == RecursiveWildcard;\r\n\t\t\tvar p = new FilePath(pattern).GetParts(false);\r\n\t\t\tvar pl = p.Length;\r\n\t\t\tvar t = GetDirectories(f._value, p, rp ? 1 : pl - 1);\r\n\t\t\tif (rp) {\r\n\t\t\t\tfp = Wildcard;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (t.Count == 0) {\r\n\t\t\t\t\treturn new FilePath[0];\r\n\t\t\t\t}\r\n\t\t\t\tfp = p[p.Length - 1];\r\n\t\t\t}\r\n\t\t\tvar r = new List<FilePath>();\r\n\t\t\tforeach (var item in t) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tr.AddRange(GetDirectories(item, fp, filter));\r\n\t\t\t\t}\r\n\t\t\t\tcatch (UnauthorizedAccessException) {\r\n\t\t\t\t\t// continue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r.ToArray();\r\n\t\t}\r\n\r\n\t\tstatic FilePath[] GetDirectories(string directory, string filePattern, Predicate<string> filter) {\r\n\t\t\treturn SysDirectory.Exists(directory)\r\n\t\t\t\t\t? Array.ConvertAll(filter != null ? Array.FindAll(SysDirectory.GetDirectories(directory, filePattern), filter) : SysDirectory.GetDirectories(directory, filePattern), i => (FilePath)i)\r\n\t\t\t\t\t: new FilePath[0];\r\n\t\t}\r\n\r\n\t\tstatic NameList GetDirectories(string path, string[] parts, int partCount) {\r\n\t\t\tNameList r;\r\n\t\t\tvar t = new NameList(1) { path };\r\n\t\t\tfor (int i = 0; i < partCount; i++) {\r\n\t\t\t\tr = new NameList(10);\r\n\t\t\t\tvar pi = parts[i];\r\n\t\t\t\tif (pi.Length == 0) {\r\n\t\t\t\t\tt = new NameList(1) { Path.GetPathRoot(path) };\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telse if (pi == \"..\") {\r\n\t\t\t\t\tforeach (var item in t) {\r\n\t\t\t\t\t\tvar n = IsDirectorySeparator(item[item.Length - 1])\r\n\t\t\t\t\t\t\t? Path.GetDirectoryName(item.Substring(0, item.Length - 1))\r\n\t\t\t\t\t\t\t: Path.GetDirectoryName(item);\r\n\t\t\t\t\t\tif (n != null && r.Contains(n) == false) {\r\n\t\t\t\t\t\t\tr.Add(n);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (pi == RecursiveWildcard) {\r\n\t\t\t\t\tforeach (var item in t) {\r\n\t\t\t\t\t\tr.Add(item);\r\n\t\t\t\t\t\tGetDirectoriesRecursively(item, ref r);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tforeach (var item in t) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tr.AddRange(SysDirectory.GetDirectories(item, pi));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (UnauthorizedAccessException) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tt = r;\r\n\t\t\t}\r\n\t\t\treturn t;\r\n\t\t}\r\n\r\n\t\tstatic void GetDirectoriesRecursively(string directoryPath, ref NameList results) {\r\n\t\t\ttry {\r\n\t\t\t\tvar r = SysDirectory.GetDirectories(directoryPath, \"*\");\r\n\t\t\t\tresults.AddRange(r);\r\n\t\t\t\tforeach (var item in r) {\r\n\t\t\t\t\tGetDirectoriesRecursively(item, ref results);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (UnauthorizedAccessException) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>将路径按目录拆分为多个部分，并删除其中的无效部分。</summary>\r\n\t\t/// <returns>目录的各个部分。</returns>\r\n\t\tpublic string[] GetParts() {\r\n\t\t\treturn GetParts(true);\r\n\t\t}\r\n\r\n\t\t/// <summary>将路径按目录拆分为多个部分。</summary>\r\n\t\t/// <param name=\"removeInvalidParts\">是否删除无效的部分。</param>\r\n\t\t/// <returns>目录的各个部分。</returns>\r\n\t\tpublic string[] GetParts(bool removeInvalidParts) {\r\n\t\t\tif (IsEmpty) {\r\n\t\t\t\treturn new string[0];\r\n\t\t\t}\r\n\t\t\tvar p = _value.Split(__PathSeparators);\r\n\t\t\tstring s;\r\n\t\t\tvar r = false;\r\n\t\t\tvar v = 0;\r\n\t\t\tfor (int i = 0; i < p.Length; i++) {\r\n\t\t\t\ts = p[i].Trim();\r\n\t\t\t\tif (s.Length == 0) {\r\n\t\t\t\t\t// 保留第一个根目录引用\r\n\t\t\t\t\tif (i == 0) {\r\n\t\t\t\t\t\tr = true;\r\n\t\t\t\t\t\t++v;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (i == 1 && r) {\r\n\t\t\t\t\t\t++v;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (s.Length == 1 && s[0] == '.') {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (s == \"..\" || (s.StartsWith(\"..\", StringComparison.Ordinal) && s.TrimEnd('.').Length == 0)) {\r\n\t\t\t\t\t// 前一级为根目录\r\n\t\t\t\t\tif (r && v == 1) {\r\n\t\t\t\t\t\t// 删除根目录级的目录部分\r\n\t\t\t\t\t\tif (p[0].Length > 2) {\r\n\t\t\t\t\t\t\tp[0] = p[0].Substring(0, 2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 保留0级或上一级为“..”的目录符\r\n\t\t\t\t\tif (v == 0 || p[v - 1] == \"..\") {\r\n\t\t\t\t\t\ts = \"..\";\r\n\t\t\t\t\t\tp[v] = s;\r\n\t\t\t\t\t\t++v;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 删除前一级\r\n\t\t\t\t\t--v;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\ts = s.TrimEnd('.');\r\n\t\t\t\tif (removeInvalidParts) {\r\n\t\t\t\t\tif (i == 0) {\r\n\t\t\t\t\t\tif (s.Length > 1) {\r\n\t\t\t\t\t\t\t// 根目录\r\n\t\t\t\t\t\t\tif (s[1] == Path.VolumeSeparatorChar) {\r\n\t\t\t\t\t\t\t\tif (Array.IndexOf(InvalidFileNameChars, s[0]) != -1\r\n\t\t\t\t\t\t\t\t\t|| s.IndexOfAny(InvalidFileNameChars, 2) != -1) {\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tr = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (s.IndexOfAny(InvalidFileNameChars) != -1) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (s.IndexOfAny(InvalidFileNameChars) != -1) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tp[v] = s;\r\n\t\t\t\t++v;\r\n\t\t\t}\r\n\t\t\tif (v < 1) {\r\n\t\t\t\treturn new string[0];\r\n\t\t\t}\r\n\t\t\tif (v < p.Length) {\r\n\t\t\t\tArray.Resize(ref p, v);\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// <para>\r\n\t\t/// 以当前路径的绝对路径为基准，返回 <paramref name=\"path\"/> 相对于当前路径的相对路径。 如果 <paramref name=\"path\"/>\r\n\t\t/// 与当前路径盘符不一致，返回 <paramref name=\"path\"/>。 在计算相对路径前，将把当前路径和 <paramref name=\"path\"/> 使用 <see\r\n\t\t/// cref=\"ToFullPath\"/> 方法转换为绝对路径。\r\n\t\t/// </para>\r\n\t\t/// <note type=\"note\">如当前路径为目录，但不以 <see cref=\"Path.DirectorySeparatorChar\"/> 结束，应先调用 <see\r\n\t\t/// cref=\"AppendPathSeparator\"/> 方法将目录结束符附加到路径末尾。</note>\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"path\">要计算相对路径的路径。</param>\r\n\t\t/// <returns><paramref name=\"path\"/> 对于当前路径的相对路径。</returns>\r\n\t\tpublic FilePath GetRelativePath(FilePath path) {\r\n\t\t\tvar p1 = ToFullPath()._value;\r\n\t\t\tvar p2 = path.ToFullPath()._value;\r\n\t\t\tvar p = -1;\r\n\t\t\tvar i = 0;\r\n\t\t\tvar l1 = p1.Length;\r\n\t\t\tvar l2 = p2.Length;\r\n\t\t\twhile (i < l1 && i < l2) {\r\n\t\t\t\tvar c1 = p1[i];\r\n\t\t\t\tvar c2 = p2[i];\r\n\t\t\t\tif (c1 != c2 && Char.ToLowerInvariant(c1) != char.ToLowerInvariant(c2)) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (c1 == Path.DirectorySeparatorChar) {\r\n\t\t\t\t\tp = i;\r\n\t\t\t\t}\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\tif (i == 0) {\r\n\t\t\t\treturn p2;\r\n\t\t\t}\r\n\t\t\tif (i == l1 && i == l2) {\r\n\t\t\t\treturn string.Empty;\r\n\t\t\t}\r\n\t\t\tvar sb = new StringBuilder(32);\r\n\t\t\twhile (i < l1) {\r\n\t\t\t\tif (p1[i] == Path.DirectorySeparatorChar) {\r\n\t\t\t\t\tsb.Append(\"..\").Append(Path.DirectorySeparatorChar);\r\n\t\t\t\t}\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\tif (sb.Length == 0 && l2 - 1 == p) {\r\n\t\t\t\treturn __CurrentPath;\r\n\t\t\t}\r\n\t\t\tsb.Append(p2, p + 1, l2 - p - 1);\r\n\t\t\treturn sb.ToString();\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>检查当前路径是否以指定的扩展名结束（不区分大小写）。</summary>\r\n\t\t/// <param name=\"extension\">文件扩展名。</param>\r\n\t\tpublic bool HasExtension(string extension) {\r\n\t\t\treturn String.IsNullOrEmpty(extension)\r\n\t\t\t\t|| (IsEmpty == false && _value.EndsWith(extension, StringComparison.OrdinalIgnoreCase)\r\n\t\t\t\t\t&& (extension[0] == '.' || _value.Length > extension.Length && _value[_value.Length - extension.Length - 1] == '.')\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回文件名是否以指定的任意一个扩展名结尾（不区分大小写）。</summary>\r\n\t\t/// <param name=\"extensions\">扩展名列表。</param>\r\n\t\tpublic bool HasExtension(params string[] extensions) {\r\n\t\t\tvar ext = FileExtension;\r\n\t\t\tif (extensions == null || extensions.Length == 0) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (ext.Length == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tforeach (var item in extensions) {\r\n\t\t\t\tif (string.IsNullOrEmpty(item)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (ext.EndsWith(item, StringComparison.OrdinalIgnoreCase)\r\n\t\t\t\t\t&& (item[0] == '.' || ext.Length > item.Length && ext[ext.Length - item.Length - 1] == '.')) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/// <summary>检查当前路径是否属于指定的路径（子目录或其下文件）。</summary>\r\n\t\t/// <param name=\"containingPath\">上级目录。</param>\r\n\t\t/// <param name=\"rootAsRelative\">是否将当前目录以 <see cref=\"Path.DirectorySeparatorChar\"/> 开头的情况视为相对路径。</param>\r\n\t\tpublic bool IsInDirectory(FilePath containingPath, bool rootAsRelative) {\r\n\t\t\tvar p = containingPath.ToFullPath()._value;\r\n\t\t\tvar v = ToFullPath()._value;\r\n\t\t\treturn v.StartsWith(p, StringComparison.OrdinalIgnoreCase)\r\n\t\t\t\t&& (IsDirectorySeparator(p[p.Length - 1]) || v.Length > p.Length && IsDirectorySeparator(v[p.Length]) && new FilePath(v.Substring(p.Length)).IsSubPath(rootAsRelative));\r\n\t\t}\r\n\r\n\t\t/// <summary>返回指定的字符是否 <see cref=\"Path.DirectorySeparatorChar\"/> 或 <see cref=\"Path.AltDirectorySeparatorChar\"/>。</summary>\r\n\t\t/// <param name=\"ch\">要检查的字符。</param>\r\n\t\tstatic bool IsDirectorySeparator(char ch) {\r\n\t\t\treturn ch == Path.DirectorySeparatorChar || ch == Path.AltDirectorySeparatorChar;\r\n\t\t}\r\n\r\n\t\t/// <summary>返回当前路径是否为子路径（不会指向当前目录的上级目录）。</summary>\r\n\t\t/// <param name=\"rootAsRelative\">是否将目录以 <see cref=\"Path.DirectorySeparatorChar\"/> 开头的情况视为子路径。</param>\r\n\t\tpublic bool IsSubPath(bool rootAsRelative) {\r\n\t\t\tif (String.IsNullOrEmpty(_value)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tint i, n;\r\n\t\t\tif (IsDirectorySeparator(_value[i = 0])) {\r\n\t\t\t\t// rooted\r\n\t\t\t\tif (rootAsRelative) {\r\n\t\t\t\t\tif (_value.Length == 1) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti = 1;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (_value.Length >= 2 && (_value[1] == Path.VolumeSeparatorChar || _value == \"..\" || _value.Contains(\"...\"))) {\r\n\t\t\t\t// rooted, or starts with \"..\", or contains \"...\"\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint d = 0;\r\n\t\t\twhile ((n = _value.IndexOfAny(__PathSeparators, i)) >= 0) {\r\n\t\t\t\tvar p = _value.Substring(i, n - i).Trim();\r\n\t\t\t\tif (p.Length == 0 // treat double separators as rooted\r\n\t\t\t\t\t|| p == \"..\" && --d < 0) { // \"..\" points to parent folder\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse if (p.Length != 1 || p[0] != '.') { // ignore \".\"\r\n\t\t\t\t\t++d;\r\n\t\t\t\t}\r\n\t\t\t\ti = n + 1;\r\n\t\t\t}\r\n\t\t\treturn n != -1\r\n\t\t\t\t|| _value.Substring(i).TrimStart() != \"..\"\r\n\t\t\t\t|| --d >= 0; // not end with \"..\"\r\n\t\t}\r\n\r\n\t\tstatic readonly string __DirectorySeparator = Path.DirectorySeparatorChar.ToString();\r\n\r\n\t\t/// <summary>将文件路径转换为绝对定位路径，并删除目录名称中的空白。同时将 <see cref=\"Path.AltDirectorySeparatorChar\"/> 转换为 <see cref=\"Path.DirectorySeparatorChar\"/>。</summary>\r\n\t\t/// <returns>标准的绝对定位路径。</returns>\r\n\t\tpublic FilePath Normalize() {\r\n\t\t\tif (_value.IsNullOrWhiteSpace()) {\r\n\t\t\t\treturn AppRoot;\r\n\t\t\t}\r\n\t\t\tif (_value.Length == 3 && _value[1] == Path.VolumeSeparatorChar && IsDirectorySeparator(_value[2])) {\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t\tvar p = GetParts();\r\n\t\t\t// fixes \"?:\\\" (where ? is active directory drive letter) becomes active directory\r\n\t\t\tif (EndsWithPathSeparator && p.Length > 0) {\r\n\t\t\t\tp[p.Length - 1] += Path.DirectorySeparatorChar;\r\n\t\t\t}\r\n\t\t\treturn p.Length == 1 && p[0].Length == 3 && p[0][1] == Path.VolumeSeparatorChar\r\n\t\t\t\t? new FilePath(p[0] + Path.DirectorySeparatorChar)\r\n\t\t\t\t: new FilePath(Path.GetFullPath(AppRoot.Combine(string.Join(__DirectorySeparator, p))._value));\r\n\t\t}\r\n\r\n\t\t/// <summary>只读打开文件路径对应的文件，允许读写共享。</summary>\r\n\t\tpublic Stream OpenFileReader() {\r\n\t\t\treturn new FileStream(ToFullPath()._value, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);\r\n\t\t}\r\n\t\t/// <summary>打开文件路径对应的文件以准备读写，允许读取共享。</summary>\r\n\t\t/// <param name=\"overwrite\">指定如文件存在时是否创建新的文件（源文件将被 0 长度的文件覆盖）。</param>\r\n\t\tpublic Stream OpenFileWriter(bool overwrite) {\r\n\t\t\treturn new FileStream(ToFullPath()._value, overwrite ? FileMode.Create : FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回读写文件的 <see cref=\"Stream\"/>。</summary>\r\n\t\t/// <inheritdoc cref=\"OpenFile(FileMode, FileAccess, FileShare, int)\"/>\r\n\t\tpublic Stream OpenFile(FileMode mode, FileAccess access, FileShare share) {\r\n\t\t\treturn new FileStream(ToFullPath()._value, mode, access, share);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回读写文件的 <see cref=\"Stream\"/>。</summary>\r\n\t\t/// <param name=\"mode\">指定文件访问方式。</param>\r\n\t\t/// <param name=\"access\">指定文件读写方式。</param>\r\n\t\t/// <param name=\"share\">指定文件访问共享方式。</param>\r\n\t\t/// <param name=\"bufferSize\">读写缓冲区的尺寸。</param>\r\n\t\tpublic Stream OpenFile(FileMode mode, FileAccess access, FileShare share, int bufferSize) {\r\n\t\t\treturn new FileStream(ToFullPath()._value, mode, access, share, bufferSize);\r\n\t\t}\r\n\r\n\t\t/// <summary>创建以指定编码读取文件的 <see cref=\"StreamReader\"/> 实例。</summary>\r\n\t\t/// <param name=\"encoding\">用于读取文件的编码。编码为 null 时采用 UTF-8 编码。</param>\r\n\t\t/// <returns>读取文件的 <see cref=\"StreamReader\"/> 实例。</returns>\r\n\t\tpublic StreamReader OpenTextReader(Encoding encoding) {\r\n\t\t\treturn new StreamReader(ToFullPath()._value, encoding ?? Encoding.UTF8, true);\r\n\t\t}\r\n\r\n\t\t/// <summary>创建以指定编码写入文件的 <see cref=\"StreamWriter\"/> 实例。</summary>\r\n\t\t/// <param name=\"append\">是否追加到文件结尾。</param>\r\n\t\t/// <param name=\"encoding\">用于写入文件的编码。编码为 null 时采用 UTF-8 编码。</param>\r\n\t\t/// <returns>写入文件的 <see cref=\"StreamWriter\"/> 实例。</returns>\r\n\t\tpublic StreamWriter OpenTextWriter(bool append, Encoding encoding) {\r\n\t\t\tvar fp = ToFullPath();\r\n\t\t\tfp.CreateContainingDirectory();\r\n\t\t\treturn new StreamWriter(fp._value, append, encoding ?? Encoding.UTF8);\r\n\t\t}\r\n\r\n\t\t/// <summary>打开当前路径对应的文件并读取所有内容为字节数组。如文件不存在，返回 0 长度的字节数组。此方法使用 FileStream 读取文件，打开或读取文件过程中可能返回异常。</summary>\r\n\t\t/// <returns>文件的字节数组。</returns>\r\n\t\tpublic byte[] ReadAllBytes() { return ReadAllBytes(-1); }\r\n\t\t/// <summary>打开当前路径对应的文件并读取所有内容为字节数组。如文件不存在，返回 0 长度的字节数组。此方法使用 FileStream 读取文件，打开或读取文件过程中可能返回异常。</summary>\r\n\t\t/// <param name=\"maxBytes\">允许读取的最大字节数。如此值非正整数，则按读取文件的大小读取最多 <see cref=\"int.MaxValue\"/> 个字节。</param>\r\n\t\t/// <returns>文件的字节数组。</returns>\r\n\t\tpublic byte[] ReadAllBytes(int maxBytes) {\r\n\t\t\tif (ExistsFile == false) {\r\n\t\t\t\treturn new byte[0];\r\n\t\t\t}\r\n\t\t\tusing (var s = new FileStream(ToFullPath()._value, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {\r\n\t\t\t\tif (s.CanRead == false) {\r\n\t\t\t\t\treturn new byte[0];\r\n\t\t\t\t}\r\n\t\t\t\tvar l = s.Length;\r\n\t\t\t\tvar r = new byte[maxBytes < 1 || maxBytes > l ? l : maxBytes];\r\n\t\t\t\ts.Read(r, 0, r.Length);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>打开当前路径对应的文件，并以指定编码逐行读取所有行。如文件不存在，返回 <see cref=\"String.Empty\"/>。</summary>\r\n\t\t/// <param name=\"encoding\">用于读取文件的编码。编码为 <see langword=\"null\"/> 时采用 UTF-8 编码。</param>\r\n\t\t/// <returns>包含整个文本文件的字符串。</returns>\r\n\t\t/// <exception cref=\"PathTooLongException\">指定的路径、文件名或者两者都超出了系统定义的最大长度。例如，在基于 Windows 的平台上，路径必须小于 248 个字符，文件名必须小于 260 个字符。</exception>\r\n\t\t/// <exception cref=\"UnauthorizedAccessException\">调用方没有所要求的权限。</exception>\r\n\t\t/// <exception cref=\"System.Security.SecurityException\">调用方没有所要求的权限。</exception>\r\n\t\tpublic string ReadTextFile(Encoding encoding) {\r\n\t\t\treturn ExistsFile ? File.ReadAllText(ToFullPath()._value, encoding ?? Encoding.UTF8) : String.Empty;\r\n\t\t}\r\n\r\n\t\t/// <summary>打开当前路径对应的文件，并以指定编码逐行读取所有内容为字符串集合。如文件不存在，返回 0 长度的字符串数组。</summary>\r\n\t\t/// <param name=\"encoding\">用于读取文件的编码。编码为 <see langword=\"null\"/> 时采用 UTF-8 编码。</param>\r\n\t\t/// <returns>文件中每行对应一个字符串所构成的集合。</returns>\r\n\t\tpublic IEnumerable<string> ReadLines(Encoding encoding) {\r\n\t\t\treturn ExistsFile == false\r\n\t\t\t\t? new string[0]\r\n\t\t\t\t: File.ReadLines(ToFullPath()._value, encoding ?? Encoding.UTF8);\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <paramref name=\"bytes\"/>写入文件。</summary>\r\n\t\t/// <param name=\"append\">是否追加到文件结尾。</param>\r\n\t\t/// <param name=\"bytes\">需要写入的字节数组。此参数为空时，不写入文件内容。</param>\r\n\t\tpublic void WriteAllBytes(bool append, byte[] bytes) {\r\n\t\t\tif (bytes == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar fp = ToFullPath();\r\n\t\t\tfp.CreateContainingDirectory();\r\n\t\t\tusing (var s = new FileStream(fp._value, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read)) {\r\n\t\t\t\ts.Write(bytes, 0, bytes.Length);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <paramref name=\"text\"/> 以指定编码写入文件。</summary>\r\n\t\t/// <param name=\"append\">是否追加到文件结尾。</param>\r\n\t\t/// <param name=\"encoding\">用于写入文件的编码。编码为 <see langword=\"null\"/> 时采用 UTF-8 编码。</param>\r\n\t\t/// <param name=\"text\">需要写入的文本。此参数为空时，不写入文件内容。</param>\r\n\t\tpublic void WriteAllText(bool append, Encoding encoding, string text) {\r\n\t\t\tif (text == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tusing (var w = OpenTextWriter(append, encoding)) {\r\n\t\t\t\tw.Write(text);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <paramref name=\"lines\"/> 的每项内容后附加换行，以指定编码写入文件。</summary>\r\n\t\t/// <param name=\"append\">是否追加到文件结尾。</param>\r\n\t\t/// <param name=\"encoding\">用于写入文件的编码。编码为 <see langword=\"null\"/> 时采用 UTF-8 编码。</param>\r\n\t\t/// <param name=\"lines\">需要写入的文本。此参数为 <see langword=\"null\"/> 时，不写入文件内容。此参数的项为 <see langword=\"null\"/> 时，写入对应的空行。</param>\r\n\t\tpublic void WriteAllLines(bool append, Encoding encoding, IEnumerable<string> lines) {\r\n\t\t\tif (lines == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tusing (var w = OpenTextWriter(append, encoding)) {\r\n\t\t\t\tforeach (var item in lines) {\r\n\t\t\t\t\tw.WriteLine(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <inheritdoc cref=\"WriteAllLines(bool, Encoding, IEnumerable{string})\"/>\r\n\t\tpublic void WriteAllLines(bool append, Encoding encoding, params string[] lines) {\r\n\t\t\tWriteAllLines(append, encoding, (IEnumerable<string>)lines);\r\n\t\t}\r\n\r\n\t\t/// <summary>使用关联的程序打开当前路径对应的文件或目录，返回对应的进程。</summary>\r\n\t\t/// <param name=\"arguments\">要传递的额外参数。</param>\r\n\t\t/// <returns><see cref=\"Process\"/> 实例。</returns>\r\n\t\tpublic Process StartProcess(string arguments) {\r\n\t\t\treturn Process.Start(_value, arguments);\r\n\t\t}\r\n\r\n\t\t/// <summary>使用关联的程序打开当前路径对应的文件或目录，返回对应的进程。</summary>\r\n\t\t/// <returns><see cref=\"Process\"/> 实例。</returns>\r\n\t\tpublic Process StartProcess() {\r\n\t\t\treturn Process.Start(_value);\r\n\t\t}\r\n\r\n\t\t/// <summary>将路径中的无效字符替换为 <paramref name=\"substitution\"/>。</summary>\r\n\t\t/// <param name=\"substitution\">用于替换无效字符的字符。</param>\r\n\t\t/// <returns>替换了无效字符的路径。</returns>\r\n\t\tpublic FilePath SubstituteInvalidChars(char substitution) {\r\n\t\t\tif (IsEmpty) {\r\n\t\t\t\treturn Empty;\r\n\t\t\t}\r\n\t\t\tvar a = _value.ToCharArray();\r\n\t\t\tvar r = false;\r\n\t\t\tfor (int i = 0; i < a.Length; i++) {\r\n\t\t\t\tref var c = ref a[i];\r\n\t\t\t\tif (Array.IndexOf(InvalidFileNameChars, c) != -1) {\r\n\t\t\t\t\tc = substitution;\r\n\t\t\t\t\tr = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (r) {\r\n\t\t\t\treturn new FilePath(new string(a));\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/// <summary>将路径转换为绝对定位的路径。路径的基准位置为 <see cref=\"AppRoot\"/>。执行此方法前，必须确保路径中不包含无效字符，否则将抛出异常。</summary>\r\n\t\t/// <returns>采用绝对定位路径的实例。</returns>\r\n\t\t/// <exception cref=\"ArgumentException\">路径无效。</exception>\r\n\t\tpublic FilePath ToFullPath() {\r\n\t\t\treturn Path.GetFullPath(Path.Combine(AppRoot._value, _value));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// <para>将 <see cref=\"FilePath\"/> 实例转换为完全路径，再隐式转换为 <see cref=\"FileInfo\"/> 实例。路径的基准位置为 <see cref=\"AppRoot\"/>。</para>\r\n\t\t/// <note type=\"note\">事实上，<see cref=\"FilePath\"/> 实例可隐式转换为 <see cref=\"FileInfo\"/> 实例。</note>\r\n\t\t/// </summary>\r\n\t\t/// <returns>将当前路径转换为完全路径后对应的 <see cref=\"FileInfo\"/> 实例。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic FileInfo ToFileInfo() {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <see cref=\"FilePath\"/> 实例转换为完全路径，再获取其对应的 <see cref=\"FileVersionInfo\"/>。</summary>\r\n\t\t/// <returns>与完全路径对应的文件版本信息。</returns>\r\n\t\t/// <exception cref=\"ArgumentException\">路径无效。</exception>\r\n\t\t/// <exception cref=\"FileNotFoundException\">找不到对应的文件。</exception>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic FileVersionInfo ToFileVersionInfo() {\r\n\t\t\treturn FileVersionInfo.GetVersionInfo(ToFullPath());\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 <see cref=\"FilePath\"/> 实例转换为完全路径，再隐式转换为 <see cref=\"DirectoryInfo\"/> 实例。路径的基准位置为 <see cref=\"AppRoot\"/>。\r\n\t\t/// <note type=\"note\">事实上，<see cref=\"FilePath\"/> 实例可隐式转换为 <see cref=\"DirectoryInfo\"/> 实例。</note>\r\n\t\t/// </summary>\r\n\t\t/// <returns>将当前路径转换为完全路径后对应的 <see cref=\"DirectoryInfo\"/> 实例。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic DirectoryInfo ToDirectoryInfo() {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 <see cref=\"FilePath\"/> 实例转换为 <see cref=\"Uri\"/> 实例。\r\n\t\t/// <note type=\"note\">事实上，<see cref=\"FilePath\"/> 实例可隐式转换为 <see cref=\"Uri\"/> 实例。</note>\r\n\t\t/// </summary>\r\n\t\t/// <returns>与当前路径对应的 <see cref=\"Uri\"/> 实例。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic Uri ToUri() { return this; }\r\n\r\n\t\t#region 类型映射\r\n\r\n\t\t/// <summary>将字符串隐式转换为 <see cref=\"FilePath\"/> 实例，删除传入字符串内所有的前导和尾随空白。</summary>\r\n\t\t/// <param name=\"path\">需要转换的路径字符串。</param>\r\n\t\t/// <returns><see cref=\"FilePath\"/> 实例。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static implicit operator FilePath(string path) {\r\n\t\t\treturn new FilePath(path);\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <see cref=\"FilePath\"/> 实例隐式转换为字符串。</summary>\r\n\t\t/// <param name=\"path\">需要转换的路径。</param>\r\n\t\t/// <returns>以字符串形式表示的实例。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static implicit operator string(FilePath path) {\r\n\t\t\treturn path._value;\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <see cref=\"FileInfo\"/> 显式转换为 <see cref=\"FilePath\"/> 实例。</summary>\r\n\t\t/// <param name=\"file\">需要转换的路径。</param>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static explicit operator FilePath(FileInfo file) {\r\n\t\t\treturn file == null ? Empty : new FilePath(file.FullName, false);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 <see cref=\"FilePath\"/> 实例转换为完全路径，再隐式转换为 <see cref=\"FileInfo\"/> 实例。路径的基准位置为 <see cref=\"AppRoot\"/>。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"path\">需要转换的路径。</param>\r\n\t\t/// <returns>将当前路径转换为完全路径后对应的 <see cref=\"FileInfo\"/> 实例。</returns>\r\n\t\t/// <seealso cref=\"ToFullPath\"/>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static implicit operator FileInfo(FilePath path) {\r\n\t\t\treturn new FileInfo(path.ToFullPath()._value);\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <see cref=\"DirectoryInfo\"/> 显式转换为 <see cref=\"FilePath\"/> 实例。</summary>\r\n\t\t/// <param name=\"directory\">需要转换的路径。</param>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static explicit operator FilePath(DirectoryInfo directory) {\r\n\t\t\treturn directory == null ? Empty : new FilePath(directory.FullName, false);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 <see cref=\"FilePath\"/> 实例转换为完全路径，再隐式转换为 <see cref=\"DirectoryInfo\"/> 实例。路径的基准位置为 <see cref=\"AppRoot\"/>。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"path\">需要转换的路径。</param>\r\n\t\t/// <returns>将当前路径转换为完全路径后对应的 <see cref=\"DirectoryInfo\"/> 实例。</returns>\r\n\t\t/// <seealso cref=\"ToFullPath\"/>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static implicit operator DirectoryInfo(FilePath path) {\r\n\t\t\treturn new DirectoryInfo(path.ToFullPath()._value);\r\n\t\t}\r\n\r\n\t\t/// <summary>将 <see cref=\"FilePath\"/> 实例隐式转换为 <see cref=\"Uri\"/> 实例。</summary>\r\n\t\t/// <param name=\"path\">需要转换的路径。</param>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static implicit operator Uri(FilePath path) {\r\n\t\t\treturn new Uri(path._value);\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region IEquatable<FilePath> 实现\r\n\r\n\t\t/// <summary>比较两个文件路径是否相同。</summary>\r\n\t\t/// <param name=\"path1\">需要比较的第一个路径。</param>\r\n\t\t/// <param name=\"path2\">需要比较的第二个路径。</param>\r\n\t\t/// <returns>相同时，返回 true。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool operator ==(FilePath path1, FilePath path2) {\r\n\t\t\treturn path1.Equals(path2);\r\n\t\t}\r\n\r\n\t\t/// <summary>比较两个文件路径是否不相同。</summary>\r\n\t\t/// <param name=\"path1\">需要比较的第一个路径。</param>\r\n\t\t/// <param name=\"path2\">需要比较的第二个路径。</param>\r\n\t\t/// <returns>不相同时，返回 true。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool operator !=(FilePath path1, FilePath path2) {\r\n\t\t\treturn !path1.Equals(path2);\r\n\t\t}\r\n\r\n\t\t/// <summary>指示当前文件路径是否等于同一类型的另一个文件路径。</summary>\r\n\t\t/// <param name=\"other\">与此对象进行比较的对象。</param>\r\n\t\t/// <returns>如果当前对象等于 <paramref name=\"other\"/> 参数，则为 <see langword=\"true\"/>；否则为 <see langword=\"false\"/>。</returns>\r\n\t\tpublic bool Equals(FilePath other) {\r\n\t\t\treturn __PathComparer(_value, other._value)\r\n\t\t\t\t|| __PathComparer(\r\n\t\t\t\t\tPath.Combine(AppRoot._value, _value ?? string.Empty),\r\n\t\t\t\t\tPath.Combine(AppRoot._value, other._value ?? string.Empty));\r\n\t\t}\r\n\r\n\t\t/// <summary>确定当前文件路径是否与另一个实例相等。</summary>\r\n\t\t/// <param name=\"obj\">需要与当前实例比较的对象。</param>\r\n\t\t/// <returns>在两个文件路径相等时，返回 true。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic override bool Equals(object obj) {\r\n\t\t\treturn obj is FilePath && Equals((FilePath)obj);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回路径字符串的散列值。</summary>\r\n\t\t/// <returns>路径字符串的散列值。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn _value == null ? 0 : _value.GetHashCode();\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>返回表示当前文件路径的 <see cref=\"string\"/> 实例。</summary>\r\n\t\t/// <returns>表示当前文件路径的 <see cref=\"string\"/> 实例。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn _value ?? string.Empty;\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "App/Common/FontHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing Microsoft.Win32;\r\nusing CharSet = System.Runtime.InteropServices.CharSet;\r\nusing DllImport = System.Runtime.InteropServices.DllImportAttribute;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class FontHelper\r\n\t{\r\n\t\tpublic static string FontDirectory { get; } = System.IO.Path.GetFullPath(Environment.GetFolderPath(Environment.SpecialFolder.System) + \"\\\\..\\\\fonts\\\\\");\r\n\r\n\t\t/// <summary>\r\n\t\t/// 列出已安装的字体及其路径。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"includeFamilyName\">是否包含字体组名称</param>\r\n\t\tpublic static Dictionary<string, string> GetInstalledFonts(bool includeFamilyName) {\r\n\t\t\tvar d = new Dictionary<string, string>(50);\r\n\t\t\tusing (var k = Registry.LocalMachine.OpenSubKey(@\"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\")) {\r\n\t\t\t\tGetFontsFromRegistryKey(includeFamilyName, d, k);\r\n\t\t\t}\r\n\t\t\tusing (var k = Registry.CurrentUser.OpenSubKey(@\"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\")) {\r\n\t\t\t\tGetFontsFromRegistryKey(includeFamilyName, d, k);\r\n\t\t\t}\r\n\t\t\treturn d;\r\n\t\t}\r\n\r\n\t\tstatic void GetFontsFromRegistryKey(bool includeFamilyName, Dictionary<string, string> d, RegistryKey k) {\r\n\t\t\tif (k is null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var name in k.GetValueNames()) {\r\n\t\t\t\tif (name is null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar p = k.GetValue(name) as string;\r\n\t\t\t\tif (String.IsNullOrEmpty(p)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (p.IndexOf('\\\\') == -1) {\r\n\t\t\t\t\tp = FontDirectory + p;\r\n\t\t\t\t}\r\n\t\t\t\tvar fp = new FilePath(p);\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (fp.HasExtension(Constants.FileExtensions.Ttf)\r\n\t\t\t\t\t\t|| fp.HasExtension(Constants.FileExtensions.Otf)) {\r\n\t\t\t\t\t\tAddFontNames(d, p, includeFamilyName);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (fp.HasExtension(Constants.FileExtensions.Ttc)) {\r\n\t\t\t\t\t\tvar nl = BaseFont.EnumerateTTCNames(p).Length;\r\n\t\t\t\t\t\tfor (int i = 0; i < nl; i++) {\r\n\t\t\t\t\t\t\tAddFontNames(d, p + \",\" + i.ToText(), includeFamilyName);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (System.IO.IOException) {\r\n\t\t\t\t\t// ignore\r\n\t\t\t\t}\r\n\t\t\t\tcatch (NullReferenceException) {\r\n\t\t\t\t}\r\n\t\t\t\tcatch (iTextSharp.text.DocumentException) {\r\n\t\t\t\t\t// ignore\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void AddFontNames(Dictionary<string, string> fontNames, string fontPath, bool includeFamilyName) {\r\n\t\t\tvar nl = BaseFont.GetAllFontNames(fontPath, \"Cp936\", null);\r\n\t\t\tif (includeFamilyName) {\r\n\t\t\t\tAddFontName(fontNames, nl[0] as string, fontPath);\r\n\t\t\t}\r\n\t\t\tvar ffn = nl[2] as string[][];\r\n\t\t\tstring n = null;\r\n\t\t\tstring nn = null, cn = null;\r\n\t\t\tforeach (var fn in ffn) {\r\n\t\t\t\tvar enc = fn[2];\r\n\t\t\t\tn = fn[3];\r\n\t\t\t\tif (\"2052\" == enc) {\r\n\t\t\t\t\tcn = n;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (\"1033\" == enc) {\r\n\t\t\t\t\tnn = n;\r\n\t\t\t\t}\r\n\t\t\t\telse if (\"0\" == enc && nn == null) {\r\n\t\t\t\t\tnn = n;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (n != null) {\r\n\t\t\t\tAddFontName(fontNames, cn ?? nn ?? n, fontPath);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void AddFontName(Dictionary<string, string> fontNames, string name, string path) {\r\n\t\t\tif (!String.IsNullOrEmpty(name)) {\r\n\t\t\t\tfontNames[name] = path;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic class NativeMethods\r\n\t\t{\r\n\t\t\t[DllImport(\"Gdi32.dll\", CharSet = CharSet.Unicode)]\r\n\t\t\tprivate static extern int AddFontResourceEx(string fontPath, int flag, IntPtr preserved);\r\n\t\t\t[DllImport(\"Gdi32.dll\", CharSet = CharSet.Unicode)]\r\n\t\t\tprivate static extern int RemoveFontResourceEx(string fontPath, int flag, IntPtr preserved);\r\n\r\n\t\t\tinternal static int LoadFont(string path) {\r\n\t\t\t\treturn AddFontResourceEx(path, 0x10, IntPtr.Zero);\r\n\t\t\t}\r\n\t\t\tinternal static int RemoveFont(string path) {\r\n\t\t\t\treturn RemoveFontResourceEx(path, 0x10, IntPtr.Zero);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "App/Common/FontUtility.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text.RegularExpressions;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class FontUtility\r\n\t{\r\n\t\tstatic readonly Regex _italic = new Regex(\" (?:Italic|Oblique)$\", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);\r\n\t\tstatic readonly Regex _bold = new Regex(\" Bold$\", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);\r\n\t\tstatic readonly Regex _boldItalic = new Regex(\" Bold (?:Italic|Oblique)$\", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);\r\n\t\tstatic FriendlyFontName[] _Fonts;\r\n\r\n\t\tpublic static FriendlyFontName[] InstalledFonts {\r\n\t\t\tget {\r\n\t\t\t\tif (_Fonts == null) {\r\n\t\t\t\t\tListInstalledFonts();\r\n\t\t\t\t}\r\n\t\t\t\treturn _Fonts;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void ListInstalledFonts() {\r\n\t\t\tvar uf = new List<FriendlyFontName>(); // 可能包含中文的字体\r\n\t\t\tvar of = new List<FriendlyFontName>(); // 其他字体\r\n\t\t\tvar fs = FontHelper.GetInstalledFonts(false);\r\n\t\t\tstring dn /*显示名称*/, fn /*字体名称*/;\r\n\t\t\tforeach (var item in fs.Keys) {\r\n\t\t\t\tfn = item;\r\n\t\t\t\tdn = _boldItalic.Replace(fn, \"(粗斜体)\");\r\n\t\t\t\tdn = _italic.Replace(dn, \"(斜体)\");\r\n\t\t\t\tdn = _bold.Replace(dn, \"(粗体)\");\r\n\t\t\t\tif (dn[0] > 0xFF) {\r\n\t\t\t\t\tuf.Add(new FriendlyFontName(fn, dn));\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tof.Add(new FriendlyFontName(fn, dn));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tuf.Sort();\r\n\t\t\tof.Sort();\r\n\t\t\t_Fonts = new FriendlyFontName[uf.Count + of.Count];\r\n\t\t\tuf.CopyTo(_Fonts);\r\n\t\t\tof.CopyTo(_Fonts, uf.Count);\r\n\t\t}\r\n\r\n\t\tinternal struct FriendlyFontName : IComparable<FriendlyFontName>\r\n\t\t{\r\n\t\t\tpublic string OriginalName;\r\n\t\t\tpublic string DisplayName;\r\n\t\t\tpublic FriendlyFontName(string originalName, string displayName) {\r\n\t\t\t\tOriginalName = originalName;\r\n\t\t\t\tDisplayName = displayName != originalName ? displayName : null;\r\n\t\t\t}\r\n\t\t\tpublic override string ToString() {\r\n\t\t\t\treturn DisplayName ?? OriginalName;\r\n\t\t\t}\r\n\r\n\t\t\t#region IComparable<FriendlyFontName> 成员\r\n\r\n\t\t\tint IComparable<FriendlyFontName>.CompareTo(FriendlyFontName other) {\r\n\t\t\t\treturn OriginalName.CompareTo(other.OriginalName);\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/FormHelper.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class FormHelper\r\n\t{\r\n\t\tpublic const int ProcMsg = NativeMethods.WM_COPYDATA;\r\n\r\n\t\tpublic static bool IsCtrlKeyDown => (Control.ModifierKeys & Keys.Control) != 0;\r\n\r\n\t\tpublic static bool IsShiftKeyDown => (Control.ModifierKeys & Keys.Shift) != 0;\r\n\r\n\t\tpublic static bool IsAltKeyDown => (Control.ModifierKeys & Keys.Alt) != 0;\r\n\r\n\t\tpublic static bool IsEmptyOrTransparent(this Color color) {\r\n\t\t\treturn color.IsEmpty || color.A == 0;\r\n\t\t}\r\n\t\tpublic static Point Round(this PointF point) {\r\n\t\t\treturn new Point(point.X.ToInt32(), point.Y.ToInt32());\r\n\t\t}\r\n\t\tpublic static RectangleF Union(this RectangleF rectangle, RectangleF other) {\r\n\t\t\treturn RectangleF.FromLTRB(\r\n\t\t\t\trectangle.Left < other.Left ? rectangle.Left : other.Left,\r\n\t\t\t\trectangle.Top < other.Top ? rectangle.Top : other.Top,\r\n\t\t\t\trectangle.Right > other.Right ? rectangle.Right : other.Right,\r\n\t\t\t\trectangle.Bottom > other.Bottom ? rectangle.Bottom : other.Bottom\r\n\t\t\t\t);\r\n\t\t}\r\n\t\tpublic static Point Transpose(this Point point, int x, int y) {\r\n\t\t\treturn new Point(point.X + x, point.Y + y);\r\n\t\t}\r\n\t\tpublic static Point Transpose(this Point point, Point transpose) {\r\n\t\t\treturn new Point(point.X + transpose.X, point.Y + transpose.Y);\r\n\t\t}\r\n\t\tpublic static Size Scale(this Size size, float scale) {\r\n\t\t\treturn new Size((int)(size.Width * scale), (int)(size.Height * scale));\r\n\t\t}\r\n\t\tpublic static void OnFirstLoad(this Form form, Action handler) {\r\n\t\t\tnew FormEventHandler(form, handler);\r\n\t\t}\r\n\t\tpublic static void SetIcon(this Form form, Bitmap bitmap) {\r\n\t\t\tform.Icon = Icon.FromHandle(bitmap.GetHicon());\r\n\t\t}\r\n\t\tpublic static void OnFirstLoad(this UserControl control, Action handler) {\r\n\t\t\tnew UserControlLoadHandler(control, handler);\r\n\t\t}\r\n\t\tpublic static ProgressBar SetValue(this ProgressBar control, int value) {\r\n\t\t\tcontrol.Value = value < control.Minimum ? control.Minimum\r\n\t\t\t\t: value > control.Maximum ? control.Maximum\r\n\t\t\t\t: value;\r\n\t\t\treturn control;\r\n\t\t}\r\n\t\tpublic static NumericUpDown SetValue(this NumericUpDown box, int value) {\r\n\t\t\treturn box.SetValue((decimal)value);\r\n\t\t}\r\n\t\tpublic static NumericUpDown SetValue(this NumericUpDown box, float value) {\r\n\t\t\treturn box.SetValue((decimal)value);\r\n\t\t}\r\n\t\tpublic static NumericUpDown SetValue(this NumericUpDown box, double value) {\r\n\t\t\treturn box.SetValue((decimal)value);\r\n\t\t}\r\n\t\tpublic static NumericUpDown SetValue(this NumericUpDown box, decimal value) {\r\n\t\t\tbox.Value =\r\n\t\t\t\tvalue >= box.Minimum && value <= box.Maximum ? value\r\n\t\t\t\t: value > box.Maximum ? box.Maximum\r\n\t\t\t\t: box.Minimum;\r\n\t\t\treturn box;\r\n\t\t}\r\n\t\tpublic static ListBox Select(this ListBox control, string item) {\r\n\t\t\tif (control.Items.Count == 0) {\r\n\t\t\t\treturn control;\r\n\t\t\t}\r\n\t\t\tvar i = control.FindString(item);\r\n\t\t\tif (i != -1) {\r\n\t\t\t\tcontrol.SelectedIndex = i;\r\n\t\t\t}\r\n\t\t\treturn control;\r\n\t\t}\r\n\t\tpublic static ComboBox Select(this ComboBox control, string item) {\r\n\t\t\tif (control.Items.Count == 0) {\r\n\t\t\t\treturn control;\r\n\t\t\t}\r\n\t\t\tvar i = control.FindString(item);\r\n\t\t\tif (i != -1) {\r\n\t\t\t\tcontrol.SelectedIndex = i;\r\n\t\t\t}\r\n\t\t\treturn control;\r\n\t\t}\r\n\t\tpublic static ListBox Select(this ListBox control, int index) {\r\n\t\t\tvar items = control.Items;\r\n\t\t\tif (items.Count == 0) {\r\n\t\t\t\treturn control;\r\n\t\t\t}\r\n\t\t\tcontrol.SelectedIndex = index < 0 ? 0\r\n\t\t\t\t: index > items.Count - 1 ? items.Count - 1\r\n\t\t\t\t: index;\r\n\t\t\treturn control;\r\n\t\t}\r\n\t\tpublic static ComboBox Select(this ComboBox control, int index) {\r\n\t\t\tvar items = control.Items;\r\n\t\t\tif (items.Count == 0) {\r\n\t\t\t\treturn control;\r\n\t\t\t}\r\n\t\t\tcontrol.SelectedIndex = index < 0 ? 0\r\n\t\t\t\t: index > items.Count - 1 ? items.Count - 1\r\n\t\t\t\t: index;\r\n\t\t\treturn control;\r\n\t\t}\r\n\t\tpublic static ComboBox AddRange(this ComboBox view, params object[] values) {\r\n\t\t\tview.Items.AddRange(values);\r\n\t\t\treturn view;\r\n\t\t}\r\n\t\tpublic static TTextBox AppendLine<TTextBox>(this TTextBox box) where TTextBox : TextBoxBase {\r\n\t\t\tbox.AppendText(Environment.NewLine);\r\n\t\t\treturn box;\r\n\t\t}\r\n\t\tpublic static TTextBox AppendLine<TTextBox>(this TTextBox box, string text) where TTextBox : TextBoxBase {\r\n\t\t\tbox.AppendText(text + Environment.NewLine);\r\n\t\t\treturn box;\r\n\t\t}\r\n\t\tpublic static void SetLocation(this FileDialog dialog, string path) {\r\n\t\t\tif (FileHelper.IsPathValid(path) == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdialog.InitialDirectory = System.IO.Path.GetDirectoryName(path);\r\n\t\t\tdialog.FileName = System.IO.Path.GetFileName(path);\r\n\t\t}\r\n\t\tpublic static ToolStrip ToggleEnabled(this ToolStrip toolStrip, bool enabled, params string[] names) {\r\n\t\t\tforeach (ToolStripItem item in toolStrip.Items) {\r\n\t\t\t\tif (Array.IndexOf(names, item.Name) != -1) {\r\n\t\t\t\t\titem.Enabled = enabled;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn toolStrip;\r\n\t\t}\r\n\r\n\t\tpublic static float GetDpiScale(this Control control) {\r\n\t\t\tusing (var g = control.CreateGraphics()) {\r\n\t\t\t\treturn g.DpiX / 96;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void ScaleColumnWidths(this ListView listView, float scale) {\r\n\t\t\tforeach (ColumnHeader column in listView.Columns) {\r\n\t\t\t\tcolumn.Width = (int)(column.Width * scale);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static void ScaleColumnWidths(this ListView listView) {\r\n\t\t\tfloat scale = GetDpiScale(listView);\r\n\t\t\tforeach (ColumnHeader column in listView.Columns) {\r\n\t\t\t\tcolumn.Width = (int)(column.Width * scale);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static ToolStrip ScaleIcons(this ToolStrip toolStrip, int size) {\r\n\t\t\tsize = (int)(toolStrip.GetDpiScale() * size);\r\n\t\t\treturn toolStrip.ScaleIcons(new Size(size, size));\r\n\t\t}\r\n\t\tpublic static ToolStrip ScaleIcons(this ToolStrip toolStrip, Size size) {\r\n\t\t\ttoolStrip.SuspendLayout();\r\n\t\t\ttoolStrip.AutoSize = false;\r\n\t\t\ttoolStrip.ImageScalingSize = size;\r\n\t\t\ttoolStrip.ResumeLayout();\r\n\t\t\ttoolStrip.AutoSize = true;\r\n\t\t\treturn toolStrip;\r\n\t\t}\r\n\r\n\t\tinternal static void InsertLinkedText(this RichTextBoxLinks.RichTextBoxEx textBox, string text) {\r\n\t\t\tconst int TokenLength = 2;\r\n\t\t\tint p1 = text.IndexOf(\"<<\");\r\n\t\t\tint p2 = text.IndexOf(\">>\");\r\n\t\t\tif (p1 != -1 && p2 != -1 && p2 > p1) {\r\n\t\t\t\ttextBox.AppendText(text.Substring(0, p1));\r\n\t\t\t\tvar c = textBox.SelectionColor;\r\n\t\t\t\tvar f = textBox.SelectionFont;\r\n\t\t\t\ttextBox.InsertLink(text.Substring(p1 + TokenLength, p2 - p1 - TokenLength));\r\n\t\t\t\tif (p2 < text.Length - TokenLength) {\r\n\t\t\t\t\ttextBox.SelectionColor = c;\r\n\t\t\t\t\ttextBox.SelectionFont = f;\r\n\t\t\t\t\ttextBox.AppendText(text.Substring(p2 + TokenLength));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttextBox.AppendText(text);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void FeedbackDragFileOver(this DragEventArgs args, params string[] allowedFileExtension) {\r\n\t\t\tif (args.Data.GetDataPresent(DataFormats.FileDrop)) {\r\n\t\t\t\tvar files = args.Data.GetData(DataFormats.FileDrop) as string[];\r\n\t\t\t\tif (Array.Exists(files,\r\n\t\t\t\t\tf => {\r\n\t\t\t\t\t\treturn Array.Exists(allowedFileExtension,\r\n\t\t\t\t\t\t\text => f.EndsWith(ext, StringComparison.InvariantCultureIgnoreCase));\r\n\t\t\t\t\t})) {\r\n\t\t\t\t\targs.Effect = DragDropEffects.Copy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static string[] DropFileOver(this DragEventArgs args, params string[] allowedFileExtension) {\r\n\t\t\tif (args.Data.GetDataPresent(DataFormats.FileDrop)) {\r\n\t\t\t\tvar files = (string[])args.Data.GetData(DataFormats.FileDrop);\r\n\t\t\t\treturn Array.FindAll(files, f => {\r\n\t\t\t\t\treturn Array.Exists(allowedFileExtension,\r\n\t\t\t\t\t\t\text => f.EndsWith(ext, StringComparison.InvariantCultureIgnoreCase));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tpublic static bool DropFileOver(this Control control, DragEventArgs args, params string[] allowedFileExtension) {\r\n\t\t\tvar files = DropFileOver(args, allowedFileExtension);\r\n\t\t\tif (files.Length > 0) {\r\n\t\t\t\tcontrol.Text = files[0];\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic static void HidePopupMenu(this ToolStripItem item) {\r\n\t\t\tif (item is ToolStripDropDownItem mi && mi.HasDropDownItems) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar oo = item.Owner as ToolStripDropDownMenu;\r\n\t\t\too?.Hide();\r\n\t\t\tvar oi = item.OwnerItem as ToolStripDropDownItem;\r\n\t\t\twhile (oi != null) {\r\n\t\t\t\toi.DropDown.Close();\r\n\t\t\t\too = oi.Owner as ToolStripDropDownMenu;\r\n\t\t\t\too?.Hide();\r\n\t\t\t\toi = oi.OwnerItem as ToolStripDropDownItem;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static void ClearDropDownItems(this ToolStripItemCollection items, int keepItems = 0) {\r\n\t\t\tif (items.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tkeepItems--;\r\n\t\t\tfor (var i = items.Count - 1; i > keepItems; i--) {\r\n\t\t\t\titems[i].Dispose();\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static void ToggleVisibility(bool visible, params Control[] controls) {\r\n\t\t\tforeach (var item in controls) {\r\n\t\t\t\titem.Visible = visible;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static DialogResult ShowDialog<TForm>() where TForm : Form, new() {\r\n\t\t\tusing (var f = new TForm()) {\r\n\t\t\t\treturn f.ShowDialog();\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static DialogResult ShowDialog<TForm>(this IWin32Window form) where TForm : Form, new() {\r\n\t\t\tusing (var f = new TForm()) {\r\n\t\t\t\tf.StartPosition = FormStartPosition.CenterParent;\r\n\t\t\t\treturn f.ShowDialog(form);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static DialogResult ShowDialog<TForm>(this IWin32Window form, object formParameter)\r\n\t\t\twhere TForm : Form, new() {\r\n\t\t\tusing (var f = new TForm()) {\r\n\t\t\t\tf.Tag = formParameter;\r\n\t\t\t\treturn f.ShowDialog(form);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static DialogResult ShowDialog<TForm>(this IWin32Window form, Action<TForm> formConfigurator, Action<TForm> formConfirmationHandler) where TForm : Form, new() {\r\n\t\t\tusing (var f = new TForm()) {\r\n\t\t\t\tformConfigurator?.Invoke(f);\r\n\t\t\t\tvar r = f.ShowDialog(form);\r\n\t\t\t\tif (formConfirmationHandler != null && (r == DialogResult.OK || r == DialogResult.Yes)) {\r\n\t\t\t\t\tformConfirmationHandler(f);\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static DialogResult ShowCommonDialog<TDialog>(this IWin32Window form, Action<TDialog> formConfigurator, Action<TDialog> formConfirmationHandler) where TDialog : CommonDialog, new() {\r\n\t\t\tusing (var f = new TDialog()) {\r\n\t\t\t\tformConfigurator?.Invoke(f);\r\n\t\t\t\tvar r = f.ShowDialog(form);\r\n\t\t\t\tif (formConfirmationHandler != null && (r == DialogResult.OK || r == DialogResult.Yes)) {\r\n\t\t\t\t\tformConfirmationHandler(f);\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ErrorBox(string text) {\r\n\t\t\tMessageBox.Show(text, Constants.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error);\r\n\t\t}\r\n\t\tpublic static void ErrorBox(this Control control, string text) {\r\n\t\t\tMessageBox.Show(text, control.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);\r\n\t\t}\r\n\t\tpublic static void ErrorBox(this Control control, string title, Exception exception) {\r\n\t\t\tvar s = new System.Text.StringBuilder(title);\r\n\t\t\ts.AppendLine().AppendLine();\r\n\t\t\ts.AppendLine(exception.Message);\r\n#if DEBUG\r\n\t\t\ts.AppendLine(exception.StackTrace);\r\n#endif\r\n\t\t\twhile ((exception = exception.InnerException) != null) {\r\n\t\t\t\ts.AppendLine();\r\n\t\t\t\ts.Append(exception.Message);\r\n\t\t\t}\r\n\t\t\tMessageBox.Show(s.ToString(), control.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);\r\n\t\t}\r\n\t\tinternal static void InfoBox(string text) {\r\n\t\t\tMessageBox.Show(text, Constants.AppName, MessageBoxButtons.OK, MessageBoxIcon.Information);\r\n\t\t}\r\n\t\tinternal static DialogResult YesNoBox(string text) {\r\n\t\t\treturn MessageBox.Show(text, Constants.AppName, MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r\n\t\t}\r\n\t\tinternal static DialogResult YesNoCancelBox(string text) {\r\n\t\t\treturn MessageBox.Show(text, Constants.AppName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);\r\n\t\t}\r\n\t\tpublic static bool ConfirmOKBox(string text) {\r\n\t\t\treturn MessageBox.Show(text, Constants.AppName, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK;\r\n\t\t}\r\n\t\tpublic static bool ConfirmOKBox(this Control control, string text) {\r\n\t\t\treturn MessageBox.Show(text, control.Text, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK;\r\n\t\t}\r\n\t\tpublic static bool ConfirmYesBox(this Control control, string text) {\r\n\t\t\treturn MessageBox.Show(text, control.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes;\r\n\t\t}\r\n\t\tpublic static int SendCopyDataMessage(this System.Diagnostics.Process process, string text) {\r\n\t\t\tvar s = new CopyDataStruct(text);\r\n\t\t\tvar r = NativeMethods.SendMessage(process.MainWindowHandle, ProcMsg, 0, ref s);\r\n\t\t\ts.Dispose();\r\n\t\t\treturn r;\r\n\t\t}\r\n\t\tpublic static string GetCopyDataContent(ref Message message) {\r\n\t\t\tif (message.Msg == ProcMsg) {\r\n\t\t\t\treturn Marshal.PtrToStringUni(((CopyDataStruct)Marshal.PtrToStructure(message.LParam, typeof(CopyDataStruct))).lpData);\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tsealed class FormEventHandler\r\n\t\t{\r\n\t\t\treadonly Form _Form;\r\n\t\t\treadonly Action _Handler;\r\n\r\n\t\t\tpublic FormEventHandler(Form form, Action handler) {\r\n\t\t\t\t_Form = form;\r\n\t\t\t\t_Handler = handler;\r\n\t\t\t\tform.Load += OnLoadHandler;\r\n\t\t\t}\r\n\t\t\tpublic void OnLoadHandler(object s, EventArgs args) {\r\n\t\t\t\t_Form.Load -= OnLoadHandler;\r\n\t\t\t\t_Handler();\r\n\t\t\t}\r\n\t\t}\r\n\t\tsealed class UserControlLoadHandler\r\n\t\t{\r\n\t\t\treadonly UserControl _Control;\r\n\t\t\treadonly Action _Handler;\r\n\r\n\t\t\tpublic UserControlLoadHandler(UserControl control, Action handler) {\r\n\t\t\t\t_Control = control;\r\n\t\t\t\t_Handler = handler;\r\n\t\t\t\tcontrol.Load += OnLoadHandler;\r\n\t\t\t}\r\n\t\t\tpublic void OnLoadHandler(object s, EventArgs args) {\r\n\t\t\t\t_Control.Load -= OnLoadHandler;\r\n\t\t\t\t_Handler();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic class NativeMethods\r\n\t\t{\r\n\t\t\tconst string User32DLL = \"User32.dll\";\r\n\t\t\tinternal const int WM_COPYDATA = 0x004A;\r\n\r\n\t\t\t[DllImport(User32DLL, SetLastError = false, CharSet = CharSet.Unicode)]\r\n\t\t\tpublic static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, ref CopyDataStruct lParam);\r\n\t\t\t[DllImport(\"kernel32.dll\", SetLastError = true)]\r\n\t\t\tpublic static extern IntPtr LocalFree(IntPtr p);\r\n\t\t}\r\n\r\n\t\tstruct CopyDataStruct(string text) : IDisposable\r\n\t\t{\r\n\t\t\treadonly IntPtr dwData = (IntPtr)1;\r\n\t\t\treadonly int cbData = (text.Length + 1) * 2;\r\n\t\t\tinternal IntPtr lpData = Marshal.StringToBSTR(text);\r\n\r\n\t\t\tpublic void Dispose() {\r\n\t\t\t\tNativeMethods.LocalFree(lpData);\r\n\t\t\t\tlpData = IntPtr.Zero;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ImageBox/DragHandle.cs",
    "content": "﻿using System.Drawing;\r\n\r\nnamespace Cyotek.Windows.Forms.Demo\r\n{\r\n\t// Cyotek ImageBox\r\n\t// Copyright (c) 2010-2015 Cyotek Ltd.\r\n\t// http://cyotek.com\r\n\t// http://cyotek.com/blog/tag/imagebox\r\n\r\n\t// Licensed under the MIT License. See license.txt for the full text.\r\n\r\n\t// If you use this control in your applications, attribution, donations or contributions are welcome.\r\n\r\n\tinternal sealed class DragHandle\r\n\t{\r\n\t\t#region Public Constructors\r\n\r\n\t\tpublic DragHandle(DragHandleAnchor anchor)\r\n\t\t  : this() {\r\n\t\t\tAnchor = anchor;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Protected Constructors\r\n\r\n\t\tprivate DragHandle() {\r\n\t\t\tEnabled = true;\r\n\t\t\tVisible = true;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Public Properties\r\n\r\n\t\tpublic DragHandleAnchor Anchor { get; set; }\r\n\r\n\t\tpublic Rectangle Bounds { get; set; }\r\n\r\n\t\tpublic bool Enabled { get; set; }\r\n\r\n\t\tpublic bool Visible { get; set; }\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ImageBox/DragHandleAnchor.cs",
    "content": "﻿namespace Cyotek.Windows.Forms.Demo\r\n{\r\n\t// Cyotek ImageBox\r\n\t// Copyright (c) 2010-2015 Cyotek Ltd.\r\n\t// http://cyotek.com\r\n\t// http://cyotek.com/blog/tag/imagebox\r\n\r\n\t// Licensed under the MIT License. See license.txt for the full text.\r\n\r\n\t// If you use this control in your applications, attribution, donations or contributions are welcome.\r\n\r\n\tinternal enum DragHandleAnchor\r\n\t{\r\n\t\tNone,\r\n\r\n\t\tTopLeft,\r\n\r\n\t\tTopCenter,\r\n\r\n\t\tTopRight,\r\n\r\n\t\tMiddleLeft,\r\n\r\n\t\tMiddleRight,\r\n\r\n\t\tBottomLeft,\r\n\r\n\t\tBottomCenter,\r\n\r\n\t\tBottomRight\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ImageBox/DragHandleCollection.cs",
    "content": "﻿using System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\n\r\nnamespace Cyotek.Windows.Forms.Demo\r\n{\r\n\t// Cyotek ImageBox\r\n\t// Copyright (c) 2010-2015 Cyotek Ltd.\r\n\t// http://cyotek.com\r\n\t// http://cyotek.com/blog/tag/imagebox\r\n\r\n\t// Licensed under the MIT License. See license.txt for the full text.\r\n\r\n\t// If you use this control in your applications, attribution, donations or contributions are welcome.\r\n\r\n\tinternal sealed class DragHandleCollection : IEnumerable<DragHandle>\r\n\t{\r\n\t\t#region Instance Fields\r\n\r\n\t\tprivate readonly IDictionary<DragHandleAnchor, DragHandle> _items;\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Public Constructors\r\n\r\n\t\tpublic DragHandleCollection() {\r\n\t\t\t_items = new Dictionary<DragHandleAnchor, DragHandle> {\r\n\t\t\t\t{ DragHandleAnchor.TopLeft, new DragHandle(DragHandleAnchor.TopLeft) },\r\n\t\t\t\t{ DragHandleAnchor.TopCenter, new DragHandle(DragHandleAnchor.TopCenter) },\r\n\t\t\t\t{ DragHandleAnchor.TopRight, new DragHandle(DragHandleAnchor.TopRight) },\r\n\t\t\t\t{ DragHandleAnchor.MiddleLeft, new DragHandle(DragHandleAnchor.MiddleLeft) },\r\n\t\t\t\t{ DragHandleAnchor.MiddleRight, new DragHandle(DragHandleAnchor.MiddleRight) },\r\n\t\t\t\t{ DragHandleAnchor.BottomLeft, new DragHandle(DragHandleAnchor.BottomLeft) },\r\n\t\t\t\t{ DragHandleAnchor.BottomCenter, new DragHandle(DragHandleAnchor.BottomCenter) },\r\n\t\t\t\t{ DragHandleAnchor.BottomRight, new DragHandle(DragHandleAnchor.BottomRight) }\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Public Properties\r\n\r\n\t\tpublic int Count => _items.Count;\r\n\r\n\t\tpublic DragHandle this[DragHandleAnchor index] => _items[index];\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Public Members\r\n\r\n\t\t/// <summary>\r\n\t\t/// Returns an enumerator that iterates through the collection.\r\n\t\t/// </summary>\r\n\t\t/// <returns>\r\n\t\t/// A <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> that can be used to iterate through the collection.\r\n\t\t/// </returns>\r\n\t\tpublic IEnumerator<DragHandle> GetEnumerator() {\r\n\t\t\treturn _items.Values.GetEnumerator();\r\n\t\t}\r\n\r\n\t\tpublic DragHandleAnchor HitTest(Point point) {\r\n\t\t\tDragHandleAnchor result;\r\n\r\n\t\t\tresult = DragHandleAnchor.None;\r\n\r\n\t\t\tforeach (DragHandle handle in this) {\r\n\t\t\t\tif (handle.Visible && handle.Bounds.Contains(point)) {\r\n\t\t\t\t\tresult = handle.Anchor;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IEnumerable<DragHandle> Members\r\n\r\n\t\t/// <summary>\r\n\t\t/// Returns an enumerator that iterates through a collection.\r\n\t\t/// </summary>\r\n\t\t/// <returns>\r\n\t\t/// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\r\n\t\t/// </returns>\r\n\t\tIEnumerator IEnumerable.GetEnumerator() {\r\n\t\t\treturn GetEnumerator();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ImageBox/ImageBoxEx.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\n\r\nnamespace Cyotek.Windows.Forms.Demo\r\n{\r\n\t// Cyotek ImageBox\r\n\t// Copyright (c) 2010-2015 Cyotek Ltd.\r\n\t// http://cyotek.com\r\n\t// http://cyotek.com/blog/tag/imagebox\r\n\r\n\t// Licensed under the MIT License. See license.txt for the full text.\r\n\r\n\t// If you use this control in your applications, attribution, donations or contributions are welcome.\r\n\r\n\tinternal class ImageBoxEx : ImageBox\r\n\t{\r\n\t\t#region Constants\r\n\r\n\t\tprivate readonly DragHandleCollection _dragHandles;\r\n\r\n\t\tprivate static readonly object _eventDragHandleSizeChanged = new object();\r\n\r\n\t\tprivate static readonly object _eventMaximumSelectionSizeChanged = new object();\r\n\r\n\t\tprivate static readonly object _eventMinimumSelectionSizeChanged = new object();\r\n\r\n\t\tprivate static readonly object _eventSelectionMoved = new object();\r\n\r\n\t\tprivate static readonly object _eventSelectionMoving = new object();\r\n\r\n\t\tprivate static readonly object _eventSelectionResized = new object();\r\n\r\n\t\tprivate static readonly object _eventSelectionResizing = new object();\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Fields\r\n\r\n\t\tprivate int _dragHandleSize;\r\n\r\n\t\tprivate Point _dragOrigin;\r\n\r\n\t\tprivate Point _dragOriginOffset;\r\n\r\n\t\tprivate bool _isMoving;\r\n\r\n\t\tprivate bool _isResizing;\r\n\r\n\t\tprivate Size _maximumSelectionSize;\r\n\r\n\t\tprivate Size _minimumSelectionSize;\r\n\r\n\t\tprivate RectangleF _previousSelectionRegion;\r\n\r\n\t\tprivate DragHandleAnchor _resizeAnchor;\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Constructors\r\n\r\n\t\tpublic ImageBoxEx() {\r\n\t\t\t_dragHandles = new DragHandleCollection();\r\n\t\t\t_dragHandleSize = 8;\r\n\t\t\t_maximumSelectionSize = Size.Empty;\r\n\t\t\tPositionDragHandles();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Events\r\n\r\n\t\t/// <summary>\r\n\t\t/// Occurs when the DragHandleSize property value changes\r\n\t\t/// </summary>\r\n\t\t[Category(\"Property Changed\")]\r\n\t\tpublic event EventHandler DragHandleSizeChanged {\r\n\t\t\tadd { Events.AddHandler(_eventDragHandleSizeChanged, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventDragHandleSizeChanged, value); }\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Occurs when the MaximumSelectionSize property value changes\r\n\t\t/// </summary>\r\n\t\t[Category(\"Property Changed\")]\r\n\t\tpublic event EventHandler MaximumSelectionSizeChanged {\r\n\t\t\tadd { Events.AddHandler(_eventMaximumSelectionSizeChanged, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventMaximumSelectionSizeChanged, value); }\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Occurs when the MinimumSelectionSize property value changes\r\n\t\t/// </summary>\r\n\t\t[Category(\"Property Changed\")]\r\n\t\tpublic event EventHandler MinimumSelectionSizeChanged {\r\n\t\t\tadd { Events.AddHandler(_eventMinimumSelectionSizeChanged, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventMinimumSelectionSizeChanged, value); }\r\n\t\t}\r\n\r\n\t\t[Category(\"Action\")]\r\n\t\tpublic event EventHandler SelectionMoved {\r\n\t\t\tadd { Events.AddHandler(_eventSelectionMoved, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventSelectionMoved, value); }\r\n\t\t}\r\n\r\n\t\t[Category(\"Action\")]\r\n\t\tpublic event CancelEventHandler SelectionMoving {\r\n\t\t\tadd { Events.AddHandler(_eventSelectionMoving, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventSelectionMoving, value); }\r\n\t\t}\r\n\r\n\t\t[Category(\"Action\")]\r\n\t\tpublic event EventHandler SelectionResized {\r\n\t\t\tadd { Events.AddHandler(_eventSelectionResized, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventSelectionResized, value); }\r\n\t\t}\r\n\r\n\t\t[Category(\"Action\")]\r\n\t\tpublic event CancelEventHandler SelectionResizing {\r\n\t\t\tadd { Events.AddHandler(_eventSelectionResizing, value); }\r\n\t\t\tremove { Events.RemoveHandler(_eventSelectionResizing, value); }\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Properties\r\n\r\n\t\t[Browsable(false)]\r\n\t\tpublic DragHandleCollection DragHandles => _dragHandles;\r\n\r\n\t\t[Category(\"Appearance\")]\r\n\t\t[DefaultValue(8)]\r\n\t\tpublic virtual int DragHandleSize {\r\n\t\t\tget => _dragHandleSize;\r\n\t\t\tset {\r\n\t\t\t\tif (_dragHandleSize != value) {\r\n\t\t\t\t\t_dragHandleSize = value;\r\n\r\n\t\t\t\t\tOnDragHandleSizeChanged(EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[Browsable(false)]\r\n\t\t[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\r\n\t\tpublic bool IsMoving {\r\n\t\t\tget => _isMoving;\r\n\t\t\tprotected set => _isMoving = value;\r\n\t\t}\r\n\r\n\t\t[Browsable(false)]\r\n\t\t[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\r\n\t\tpublic bool IsResizing {\r\n\t\t\tget => _isResizing;\r\n\t\t\tprotected set => _isResizing = value;\r\n\t\t}\r\n\r\n\t\t[Category(\"Behavior\")]\r\n\t\t[DefaultValue(typeof(Size), \"0, 0\")]\r\n\t\tpublic virtual Size MaximumSelectionSize {\r\n\t\t\tget => _maximumSelectionSize;\r\n\t\t\tset {\r\n\t\t\t\tif (MaximumSelectionSize != value) {\r\n\t\t\t\t\t_maximumSelectionSize = value;\r\n\r\n\t\t\t\t\tOnMaximumSelectionSizeChanged(EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[Category(\"Behavior\")]\r\n\t\t[DefaultValue(typeof(Size), \"0, 0\")]\r\n\t\tpublic virtual Size MinimumSelectionSize {\r\n\t\t\tget => _minimumSelectionSize;\r\n\t\t\tset {\r\n\t\t\t\tif (MinimumSelectionSize != value) {\r\n\t\t\t\t\t_minimumSelectionSize = value;\r\n\r\n\t\t\t\t\tOnMinimumSelectionSizeChanged(EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[Browsable(false)]\r\n\t\tpublic RectangleF PreviousSelectionRegion {\r\n\t\t\tget => _previousSelectionRegion;\r\n\t\t\tprotected set => _previousSelectionRegion = value;\r\n\t\t}\r\n\r\n\t\tprotected Point DragOrigin {\r\n\t\t\tget => _dragOrigin;\r\n\t\t\tset => _dragOrigin = value;\r\n\t\t}\r\n\r\n\t\tprotected Point DragOriginOffset {\r\n\t\t\tget => _dragOriginOffset;\r\n\t\t\tset => _dragOriginOffset = value;\r\n\t\t}\r\n\r\n\t\tprotected DragHandleAnchor ResizeAnchor {\r\n\t\t\tget => _resizeAnchor;\r\n\t\t\tset => _resizeAnchor = value;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Methods\r\n\r\n\t\tpublic void CancelResize() {\r\n\t\t\tSelectionRegion = _previousSelectionRegion;\r\n\t\t\tCompleteResize();\r\n\t\t}\r\n\r\n\t\tpublic void StartMove() {\r\n\t\t\tCancelEventArgs e;\r\n\r\n\t\t\tif (_isMoving || _isResizing) {\r\n\t\t\t\tthrow new InvalidOperationException(\"A move or resize action is currently being performed.\");\r\n\t\t\t}\r\n\r\n\t\t\te = new CancelEventArgs();\r\n\r\n\t\t\tOnSelectionMoving(e);\r\n\r\n\t\t\tif (!e.Cancel) {\r\n\t\t\t\t_previousSelectionRegion = SelectionRegion;\r\n\t\t\t\t_isMoving = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected virtual void DrawDragHandle(Graphics graphics, DragHandle handle) {\r\n\t\t\tint left;\r\n\t\t\tint top;\r\n\t\t\tint width;\r\n\t\t\tint height;\r\n\t\t\tPen outerPen;\r\n\t\t\tBrush innerBrush;\r\n\r\n\t\t\tleft = handle.Bounds.Left;\r\n\t\t\ttop = handle.Bounds.Top;\r\n\t\t\twidth = handle.Bounds.Width;\r\n\t\t\theight = handle.Bounds.Height;\r\n\r\n\t\t\tif (handle.Enabled) {\r\n\t\t\t\touterPen = SystemPens.WindowFrame;\r\n\t\t\t\tinnerBrush = SystemBrushes.Window;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\touterPen = SystemPens.ControlDark;\r\n\t\t\t\tinnerBrush = SystemBrushes.Control;\r\n\t\t\t}\r\n\r\n\t\t\tgraphics.FillRectangle(innerBrush, left + 1, top + 1, width - 2, height - 2);\r\n\t\t\tgraphics.DrawLine(outerPen, left + 1, top, left + width - 2, top);\r\n\t\t\tgraphics.DrawLine(outerPen, left, top + 1, left, top + height - 2);\r\n\t\t\tgraphics.DrawLine(outerPen, left + 1, top + height - 1, left + width - 2, top + height - 1);\r\n\t\t\tgraphics.DrawLine(outerPen, left + width - 1, top + 1, left + width - 1, top + height - 2);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"DragHandleSizeChanged\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnDragHandleSizeChanged(EventArgs e) {\r\n\t\t\tEventHandler handler;\r\n\r\n\t\t\tPositionDragHandles();\r\n\t\t\tInvalidate();\r\n\r\n\t\t\thandler = (EventHandler)Events[_eventDragHandleSizeChanged];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"MaximumSelectionSizeChanged\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnMaximumSelectionSizeChanged(EventArgs e) {\r\n\t\t\tEventHandler handler;\r\n\r\n\t\t\thandler = (EventHandler)Events[_eventMaximumSelectionSizeChanged];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"MinimumSelectionSizeChanged\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnMinimumSelectionSizeChanged(EventArgs e) {\r\n\t\t\tEventHandler handler;\r\n\r\n\t\t\thandler = (EventHandler)Events[_eventMinimumSelectionSizeChanged];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"System.Windows.Forms.Control.MouseDown\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnMouseDown(MouseEventArgs e) {\r\n\t\t\tPoint imagePoint;\r\n\t\t\tRectangleF selectionRegion;\r\n\r\n\t\t\timagePoint = PointToImage(e.Location);\r\n\t\t\tselectionRegion = SelectionRegion;\r\n\r\n\t\t\tif (e.Button == MouseButtons.Left && (selectionRegion.Contains(imagePoint) || HitTest(e.Location) != DragHandleAnchor.None)) {\r\n\t\t\t\t_dragOrigin = e.Location;\r\n\t\t\t\t_dragOriginOffset = new Point(imagePoint.X - (int)selectionRegion.X, imagePoint.Y - (int)selectionRegion.Y);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_dragOriginOffset = Point.Empty;\r\n\t\t\t\t_dragOrigin = Point.Empty;\r\n\t\t\t}\r\n\r\n\t\t\tbase.OnMouseDown(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"System.Windows.Forms.Control.MouseMove\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnMouseMove(MouseEventArgs e) {\r\n\t\t\t// start either a move or a resize operation\r\n\t\t\tif (!IsSelecting && !_isMoving && !_isResizing && e.Button == MouseButtons.Left && !_dragOrigin.IsEmpty && IsOutsideDragZone(e.Location)) {\r\n\t\t\t\tDragHandleAnchor anchor;\r\n\r\n\t\t\t\tanchor = HitTest(_dragOrigin);\r\n\r\n\t\t\t\tif (anchor == DragHandleAnchor.None) {\r\n\t\t\t\t\t// move\r\n\t\t\t\t\tStartMove();\r\n\t\t\t\t}\r\n\t\t\t\telse if (_dragHandles[anchor].\r\n\t\t\t\t\t\t   Enabled && _dragHandles[anchor].\r\n\t\t\t\t\t\t   Visible) {\r\n\t\t\t\t\t// resize\r\n\t\t\t\t\tStartResize(anchor);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// set the cursor\r\n\t\t\tSetCursor(e.Location);\r\n\r\n\t\t\t// perform operations\r\n\t\t\tProcessSelectionMove(e.Location);\r\n\t\t\tProcessSelectionResize(e.Location);\r\n\r\n\t\t\tbase.OnMouseMove(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"System.Windows.Forms.Control.MouseUp\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnMouseUp(MouseEventArgs e) {\r\n\t\t\tif (_isMoving) {\r\n\t\t\t\tCompleteMove();\r\n\t\t\t}\r\n\t\t\telse if (_isResizing) {\r\n\t\t\t\tCompleteResize();\r\n\t\t\t}\r\n\r\n\t\t\tbase.OnMouseUp(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"System.Windows.Forms.Control.Paint\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   A <see cref=\"T:System.Windows.Forms.PaintEventArgs\" /> that contains the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnPaint(PaintEventArgs e) {\r\n\t\t\tbase.OnPaint(e);\r\n\r\n\t\t\tif (AllowPainting && !SelectionRegion.IsEmpty) {\r\n\t\t\t\tforeach (DragHandle handle in _dragHandles) {\r\n\t\t\t\t\tif (handle.Visible) {\r\n\t\t\t\t\t\tDrawDragHandle(e.Graphics, handle);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"ImageBox.PanStart\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   The <see cref=\"System.ComponentModel.CancelEventArgs\" /> instance containing the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnPanStart(CancelEventArgs e) {\r\n\t\t\tif (_isMoving || _isResizing || !_dragOrigin.IsEmpty) {\r\n\t\t\t\te.Cancel = true;\r\n\t\t\t}\r\n\r\n\t\t\tbase.OnPanStart(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"System.Windows.Forms.Control.Resize\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   An <see cref=\"T:System.EventArgs\" /> that contains the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnResize(EventArgs e) {\r\n\t\t\tbase.OnResize(e);\r\n\r\n\t\t\tPositionDragHandles();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"System.Windows.Forms.ScrollableControl.Scroll\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"se\">\r\n\t\t///   A <see cref=\"T:System.Windows.Forms.ScrollEventArgs\" /> that contains the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnScroll(ScrollEventArgs se) {\r\n\t\t\tbase.OnScroll(se);\r\n\r\n\t\t\tPositionDragHandles();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"ImageBox.Selecting\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   The <see cref=\"System.EventArgs\" /> instance containing the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnSelecting(ImageBoxCancelEventArgs e) {\r\n\t\t\te.Cancel = _isMoving || _isResizing || SelectionRegion.Contains(PointToImage(e.Location)) || HitTest(e.Location) != DragHandleAnchor.None;\r\n\r\n\t\t\tbase.OnSelecting(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"SelectionMoved\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnSelectionMoved(EventArgs e) {\r\n\t\t\tEventHandler handler;\r\n\r\n\t\t\thandler = (EventHandler)Events[_eventSelectionMoved];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"SelectionMoving\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"CancelEventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnSelectionMoving(CancelEventArgs e) {\r\n\t\t\tCancelEventHandler handler;\r\n\r\n\t\t\thandler = (CancelEventHandler)Events[_eventSelectionMoving];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"ImageBox.SelectionRegionChanged\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   The <see cref=\"System.EventArgs\" /> instance containing the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnSelectionRegionChanged(EventArgs e) {\r\n\t\t\tbase.OnSelectionRegionChanged(e);\r\n\r\n\t\t\tPositionDragHandles();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"SelectionResized\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnSelectionResized(EventArgs e) {\r\n\t\t\tEventHandler handler;\r\n\r\n\t\t\thandler = (EventHandler)Events[_eventSelectionResized];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"SelectionResizing\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"CancelEventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected virtual void OnSelectionResizing(CancelEventArgs e) {\r\n\t\t\tCancelEventHandler handler;\r\n\r\n\t\t\thandler = (CancelEventHandler)Events[_eventSelectionResizing];\r\n\r\n\t\t\thandler?.Invoke(this, e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t///   Raises the <see cref=\"ImageBox.ZoomChanged\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">\r\n\t\t///   The <see cref=\"System.EventArgs\" /> instance containing the event data.\r\n\t\t/// </param>\r\n\t\tprotected override void OnZoomChanged(EventArgs e) {\r\n\t\t\tbase.OnZoomChanged(e);\r\n\r\n\t\t\tPositionDragHandles();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Processes a dialog key.\r\n\t\t/// </summary>\r\n\t\t/// <returns>\r\n\t\t/// true if the key was processed by the control; otherwise, false.\r\n\t\t/// </returns>\r\n\t\t/// <param name=\"keyData\">One of the <see cref=\"T:System.Windows.Forms.Keys\"/> values that represents the key to process. </param>\r\n\t\tprotected override bool ProcessDialogKey(Keys keyData) {\r\n\t\t\tbool result;\r\n\r\n\t\t\tif (keyData == Keys.Escape && (_isResizing || _isMoving)) {\r\n\t\t\t\tif (_isResizing) {\r\n\t\t\t\t\tCancelResize();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tCancelMove();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresult = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tresult = base.ProcessDialogKey(keyData);\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tprotected virtual void SetCursor(Point point) {\r\n\t\t\t// http://forums.cyotek.com/imagebox/cursor-issue-in-imageboxex/msg92/#msg92\r\n\r\n\t\t\tif (!IsPanning) {\r\n\t\t\t\tCursor cursor;\r\n\r\n\t\t\t\tif (IsSelecting) {\r\n\t\t\t\t\tcursor = Cursors.Default;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tDragHandleAnchor handleAnchor;\r\n\r\n\t\t\t\t\thandleAnchor = _isResizing ? _resizeAnchor : HitTest(point);\r\n\t\t\t\t\tif (handleAnchor != DragHandleAnchor.None && _dragHandles[handleAnchor].\r\n\t\t\t\t\t\t  Enabled) {\r\n\t\t\t\t\t\tswitch (handleAnchor) {\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.TopLeft:\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.BottomRight:\r\n\t\t\t\t\t\t\t\tcursor = Cursors.SizeNWSE;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.TopCenter:\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.BottomCenter:\r\n\t\t\t\t\t\t\t\tcursor = Cursors.SizeNS;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.TopRight:\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.BottomLeft:\r\n\t\t\t\t\t\t\t\tcursor = Cursors.SizeNESW;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.MiddleLeft:\r\n\t\t\t\t\t\t\tcase DragHandleAnchor.MiddleRight:\r\n\t\t\t\t\t\t\t\tcursor = Cursors.SizeWE;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tthrow new ArgumentOutOfRangeException();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (_isMoving || SelectionRegion.Contains(PointToImage(point))) {\r\n\t\t\t\t\t\tcursor = Cursors.SizeAll;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tcursor = Cursors.Default;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tCursor = cursor;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void CancelMove() {\r\n\t\t\tSelectionRegion = _previousSelectionRegion;\r\n\t\t\tCompleteMove();\r\n\t\t}\r\n\r\n\t\tprivate void CompleteMove() {\r\n\t\t\tResetDrag();\r\n\t\t\tOnSelectionMoved(EventArgs.Empty);\r\n\t\t}\r\n\r\n\t\tprivate void CompleteResize() {\r\n\t\t\tResetDrag();\r\n\t\t\tOnSelectionResized(EventArgs.Empty);\r\n\t\t}\r\n\r\n\t\tprivate DragHandleAnchor HitTest(Point cursorPosition) {\r\n\t\t\treturn _dragHandles.HitTest(cursorPosition);\r\n\t\t}\r\n\r\n\t\tprivate bool IsOutsideDragZone(Point location) {\r\n\t\t\tRectangle dragZone;\r\n\t\t\tint dragWidth;\r\n\t\t\tint dragHeight;\r\n\r\n\t\t\tdragWidth = SystemInformation.DragSize.Width;\r\n\t\t\tdragHeight = SystemInformation.DragSize.Height;\r\n\t\t\tdragZone = new Rectangle(_dragOrigin.X - (dragWidth / 2), _dragOrigin.Y - (dragHeight / 2), dragWidth, dragHeight);\r\n\r\n\t\t\treturn !dragZone.Contains(location);\r\n\t\t}\r\n\r\n\t\tprivate void PositionDragHandles() {\r\n\t\t\tif (_dragHandles != null && _dragHandleSize > 0) {\r\n\t\t\t\tRectangleF selectionRegion;\r\n\r\n\t\t\t\tselectionRegion = SelectionRegion;\r\n\r\n\t\t\t\tif (selectionRegion.IsEmpty) {\r\n\t\t\t\t\tforeach (DragHandle handle in _dragHandles) {\r\n\t\t\t\t\t\thandle.Bounds = Rectangle.Empty;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tint left;\r\n\t\t\t\t\tint top;\r\n\t\t\t\t\tint right;\r\n\t\t\t\t\tint bottom;\r\n\t\t\t\t\tint halfWidth;\r\n\t\t\t\t\tint halfHeight;\r\n\t\t\t\t\tint halfDragHandleSize;\r\n\t\t\t\t\tRectangle viewport;\r\n\t\t\t\t\tint offsetX;\r\n\t\t\t\t\tint offsetY;\r\n\r\n\t\t\t\t\tviewport = GetImageViewPort();\r\n\t\t\t\t\toffsetX = viewport.Left + Padding.Left + AutoScrollPosition.X;\r\n\t\t\t\t\toffsetY = viewport.Top + Padding.Top + AutoScrollPosition.Y;\r\n\t\t\t\t\thalfDragHandleSize = _dragHandleSize / 2;\r\n\t\t\t\t\tleft = Convert.ToInt32((selectionRegion.Left * ZoomFactor) + offsetX);\r\n\t\t\t\t\ttop = Convert.ToInt32((selectionRegion.Top * ZoomFactor) + offsetY);\r\n\t\t\t\t\tright = left + Convert.ToInt32(selectionRegion.Width * ZoomFactor);\r\n\t\t\t\t\tbottom = top + Convert.ToInt32(selectionRegion.Height * ZoomFactor);\r\n\t\t\t\t\thalfWidth = Convert.ToInt32(selectionRegion.Width * ZoomFactor) / 2;\r\n\t\t\t\t\thalfHeight = Convert.ToInt32(selectionRegion.Height * ZoomFactor) / 2;\r\n\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.TopLeft].\r\n\t\t\t\t\t  Bounds = new Rectangle(left - _dragHandleSize, top - _dragHandleSize, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.TopCenter].\r\n\t\t\t\t\t  Bounds = new Rectangle(left + halfWidth - halfDragHandleSize, top - _dragHandleSize, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.TopRight].\r\n\t\t\t\t\t  Bounds = new Rectangle(right, top - _dragHandleSize, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.MiddleLeft].\r\n\t\t\t\t\t  Bounds = new Rectangle(left - _dragHandleSize, top + halfHeight - halfDragHandleSize, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.MiddleRight].\r\n\t\t\t\t\t  Bounds = new Rectangle(right, top + halfHeight - halfDragHandleSize, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.BottomLeft].\r\n\t\t\t\t\t  Bounds = new Rectangle(left - _dragHandleSize, bottom, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.BottomCenter].\r\n\t\t\t\t\t  Bounds = new Rectangle(left + halfWidth - halfDragHandleSize, bottom, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t\t_dragHandles[DragHandleAnchor.BottomRight].\r\n\t\t\t\t\t  Bounds = new Rectangle(right, bottom, _dragHandleSize, _dragHandleSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void ProcessSelectionMove(Point cursorPosition) {\r\n\t\t\tif (_isMoving) {\r\n\t\t\t\tint x;\r\n\t\t\t\tint y;\r\n\t\t\t\tPoint imagePoint;\r\n\t\t\t\tSize viewSize;\r\n\t\t\t\tRectangleF selectionRegion;\r\n\r\n\t\t\t\timagePoint = PointToImage(cursorPosition, false);\r\n\t\t\t\tviewSize = ViewSize;\r\n\t\t\t\tselectionRegion = SelectionRegion;\r\n\r\n\t\t\t\tx = Math.Max(0, imagePoint.X - _dragOriginOffset.X);\r\n\t\t\t\tif (x + selectionRegion.Width >= viewSize.Width) {\r\n\t\t\t\t\tx = viewSize.Width - (int)selectionRegion.Width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ty = Math.Max(0, imagePoint.Y - _dragOriginOffset.Y);\r\n\t\t\t\tif (y + selectionRegion.Height >= viewSize.Height) {\r\n\t\t\t\t\ty = viewSize.Height - (int)selectionRegion.Height;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tSelectionRegion = new RectangleF(x, y, selectionRegion.Width, selectionRegion.Height);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void ProcessSelectionResize(Point cursorPosition) {\r\n\t\t\tif (_isResizing) {\r\n\t\t\t\tPoint imagePosition;\r\n\t\t\t\tfloat left;\r\n\t\t\t\tfloat top;\r\n\t\t\t\tfloat right;\r\n\t\t\t\tfloat bottom;\r\n\t\t\t\tbool resizingTopEdge;\r\n\t\t\t\tbool resizingBottomEdge;\r\n\t\t\t\tbool resizingLeftEdge;\r\n\t\t\t\tbool resizingRightEdge;\r\n\t\t\t\tRectangleF selectionRegion;\r\n\t\t\t\tSize viewSize;\r\n\r\n\t\t\t\timagePosition = PointToImage(cursorPosition);\r\n\t\t\t\tviewSize = ViewSize;\r\n\r\n\t\t\t\t// get the current selection\r\n\t\t\t\tselectionRegion = SelectionRegion;\r\n\t\t\t\tleft = selectionRegion.Left;\r\n\t\t\t\ttop = selectionRegion.Top;\r\n\t\t\t\tright = selectionRegion.Right;\r\n\t\t\t\tbottom = selectionRegion.Bottom;\r\n\r\n\t\t\t\t// decide which edges we're resizing\r\n\t\t\t\tresizingTopEdge = _resizeAnchor >= DragHandleAnchor.TopLeft && _resizeAnchor <= DragHandleAnchor.TopRight;\r\n\t\t\t\tresizingBottomEdge = _resizeAnchor >= DragHandleAnchor.BottomLeft && _resizeAnchor <= DragHandleAnchor.BottomRight;\r\n\t\t\t\tresizingLeftEdge = _resizeAnchor == DragHandleAnchor.TopLeft || _resizeAnchor == DragHandleAnchor.MiddleLeft || _resizeAnchor == DragHandleAnchor.BottomLeft;\r\n\t\t\t\tresizingRightEdge = _resizeAnchor == DragHandleAnchor.TopRight || _resizeAnchor == DragHandleAnchor.MiddleRight || _resizeAnchor == DragHandleAnchor.BottomRight;\r\n\r\n\t\t\t\t// and resize!\r\n\t\t\t\tif (resizingTopEdge) {\r\n\t\t\t\t\ttop = imagePosition.Y > 0 ? imagePosition.Y : 0;\r\n\r\n\t\t\t\t\tif (bottom - top < MinimumSelectionSize.Height) {\r\n\t\t\t\t\t\ttop = bottom - MinimumSelectionSize.Height;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (MaximumSelectionSize.Height > 0 && bottom - top > MaximumSelectionSize.Height) {\r\n\t\t\t\t\t\ttop = bottom - MaximumSelectionSize.Height;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (resizingBottomEdge) {\r\n\t\t\t\t\tbottom = imagePosition.Y < viewSize.Height ? imagePosition.Y : viewSize.Height;\r\n\r\n\t\t\t\t\tif (bottom - top < MinimumSelectionSize.Height) {\r\n\t\t\t\t\t\tbottom = top + MinimumSelectionSize.Height;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (MaximumSelectionSize.Height > 0 && bottom - top > MaximumSelectionSize.Height) {\r\n\t\t\t\t\t\tbottom = top + MaximumSelectionSize.Height;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (resizingLeftEdge) {\r\n\t\t\t\t\tleft = imagePosition.X > 0 ? imagePosition.X : 0;\r\n\r\n\t\t\t\t\tif (right - left < MinimumSelectionSize.Width) {\r\n\t\t\t\t\t\tleft = right - MinimumSelectionSize.Width;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (MaximumSelectionSize.Width > 0 && right - left > MaximumSelectionSize.Width) {\r\n\t\t\t\t\t\tleft = right - MaximumSelectionSize.Width;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (resizingRightEdge) {\r\n\t\t\t\t\tright = imagePosition.X < viewSize.Width ? imagePosition.X : viewSize.Width;\r\n\r\n\t\t\t\t\tif (right - left < MinimumSelectionSize.Width) {\r\n\t\t\t\t\t\tright = left + MinimumSelectionSize.Width;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (MaximumSelectionSize.Width > 0 && right - left > MaximumSelectionSize.Width) {\r\n\t\t\t\t\t\tright = left + MaximumSelectionSize.Width;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tSelectionRegion = new RectangleF(left, top, right - left, bottom - top);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void ResetDrag() {\r\n\t\t\t_isResizing = false;\r\n\t\t\t_isMoving = false;\r\n\t\t\t_dragOrigin = Point.Empty;\r\n\t\t\t_dragOriginOffset = Point.Empty;\r\n\t\t}\r\n\r\n\t\tprivate void StartResize(DragHandleAnchor anchor) {\r\n\t\t\tCancelEventArgs e;\r\n\r\n\t\t\tif (_isMoving || _isResizing) {\r\n\t\t\t\tthrow new InvalidOperationException(\"A move or resize action is currently being performed.\");\r\n\t\t\t}\r\n\r\n\t\t\te = new CancelEventArgs();\r\n\r\n\t\t\tOnSelectionResizing(e);\r\n\r\n\t\t\tif (!e.Cancel) {\r\n\t\t\t\t_resizeAnchor = anchor;\r\n\t\t\t\t_previousSelectionRegion = SelectionRegion;\r\n\t\t\t\t_isResizing = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ObjectListViewHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Drawing.Drawing2D;\r\n\r\nnamespace BrightIdeasSoftware\r\n{\r\n\tstatic class ObjectListViewHelper\r\n\t{\r\n\t\t/// <summary>修复编辑控件太窄小的问题。</summary>\r\n\t\tpublic static void FixEditControlWidth(this ObjectListView view) {\r\n\t\t\tview.CellEditStarting += View_CellEditStarting;\r\n\t\t\tview.Disposed += View_Disposed;\r\n\t\t}\r\n\r\n\t\tpublic static bool HasSelection(this ObjectListView view) {\r\n\t\t\treturn view.SelectedIndices.Count > 0;\r\n\t\t}\r\n\r\n\t\tstatic void View_Disposed(object sender, EventArgs e) {\r\n\t\t\tvar view = (ObjectListView)sender;\r\n\t\t\tview.CellEditStarting -= View_CellEditStarting;\r\n\t\t\tview.Disposed -= View_Disposed;\r\n\t\t}\r\n\r\n\t\tstatic void View_CellEditStarting(object sender, CellEditEventArgs e) {\r\n\t\t\tvar b = e.CellBounds;\r\n\t\t\tif (b.Width < 60) {\r\n\t\t\t\tb.Width = 60;\r\n\t\t\t}\r\n\t\t\tif (e.Control is System.Windows.Forms.Control c) {\r\n\t\t\t\tc.Bounds = b;\r\n\t\t\t\tc.Location = b.Location;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void RedrawItem(this ObjectListView view, int index) {\r\n\t\t\tvar c = view.GetItemCount();\r\n\t\t\tif (c > 0) {\r\n\t\t\t\tview.RedrawItems(Math.Max(0, index - 1), Math.Min(index + 1, c - 1), true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void SetTreeViewLine(this TreeListView view) {\r\n\t\t\tvar tcr = view.TreeColumnRenderer as TreeListView.TreeRenderer;\r\n\t\t\ttcr.LinePen = new Pen(SystemColors.ControlDark) {\r\n\t\t\t\tDashCap = DashCap.Round,\r\n\t\t\t\tDashStyle = DashStyle.Dash\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic static void ExpandSelected(this TreeListView view, bool moveToFirstChild = false) {\r\n\t\t\tif (view.HasSelection() == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar so = view.SelectedObjects;\r\n\t\t\tvar expanded = false;\r\n\t\t\tforeach (var item in so) {\r\n\t\t\t\tif (view.IsExpanded(item) == false) {\r\n\t\t\t\t\tview.Expand(item);\r\n\t\t\t\t\texpanded = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (moveToFirstChild && expanded == false) {\r\n\t\t\t\tforeach (var ch in view.GetChildren(so[0])) {\r\n\t\t\t\t\tview.SelectedObject = view.FocusedObject = ch;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static void Expand(this TreeListView view, System.Collections.IEnumerable items, bool recursive) {\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\tview.Expand(item);\r\n\t\t\t\tif (recursive) {\r\n\t\t\t\t\tview.Expand(view.GetChildren(item), true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static void Collapse(this TreeListView view, System.Collections.IEnumerable items, bool recursive) {\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\tif (recursive && view.IsExpanded(item)) {\r\n\t\t\t\t\tview.Collapse(view.GetChildren(item), true);\r\n\t\t\t\t}\r\n\t\t\t\tview.Collapse(item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static TypedObjectListView<T> AsTyped<T>(this ObjectListView view) where T : class {\r\n\t\t\treturn view.AsTyped<T>(null);\r\n\t\t}\r\n\r\n\t\tpublic static TypedObjectListView<T> AsTyped<T>(this ObjectListView view, Action<TypedObjectListView<T>> configurator) where T : class {\r\n\t\t\tvar v = new TypedObjectListView<T>(view);\r\n\t\t\tconfigurator?.Invoke(v);\r\n\t\t\treturn v;\r\n\t\t}\r\n\t\tpublic static TypedObjectListView<T> ConfigColumn<T>(this TypedObjectListView<T> view, OLVColumn column, Action<TypedColumn<T>> configurator) where T : class {\r\n\t\t\tvar t = new TypedColumn<T>(column);\r\n\t\t\tconfigurator(t);\r\n\t\t\treturn view;\r\n\t\t}\r\n\t\tpublic static TypedColumn<T> AsTyped<T>(this OLVColumn column, Action<TypedColumn<T>> configurator) where T : class {\r\n\t\t\tvar t = new TypedColumn<T>(column);\r\n\t\t\tconfigurator(t);\r\n\t\t\treturn t;\r\n\t\t}\r\n\t\tpublic static T GetParentModel<T>(this TreeListView view, T model) where T : class {\r\n\t\t\treturn view.GetParent(model) as T;\r\n\t\t}\r\n\r\n\t\tpublic static List<T> GetAncestorsOrSelf<T>(this TreeListView view, T model) where T : class {\r\n\t\t\tvar r = new List<T>();\r\n\t\t\tdo {\r\n\t\t\t\tr.Add(model);\r\n\t\t\t} while ((model = view.GetParent(model) as T) != null);\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tpublic static void CollapseSelected(this TreeListView view, bool moveToParent = false) {\r\n\t\t\tif (view.HasSelection() == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar so = view.SelectedObjects;\r\n\t\t\tvar collapsed = false;\r\n\t\t\tforeach (var item in so) {\r\n\t\t\t\tif (view.IsExpanded(item)) {\r\n\t\t\t\t\tview.Collapse(item);\r\n\t\t\t\t\tcollapsed = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (moveToParent && collapsed == false) {\r\n\t\t\t\tvar parent = view.GetParent(so[0]);\r\n\t\t\t\tif (parent != null) {\r\n\t\t\t\t\tview.SelectedObject = view.FocusedObject = parent;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void MoveUpSelection(this ObjectListView view) {\r\n\t\t\tvar si = view.GetFirstSelectedIndex();\r\n\t\t\tif (si < 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar so = view.SelectedObjects;\r\n\t\t\tview.MoveObjects(--si, so);\r\n\t\t\tview.SelectedObjects = so;\r\n\t\t}\r\n\r\n\t\tpublic static void MoveDownSelection(this ObjectListView view) {\r\n\t\t\tvar ls = view.GetLastItemInDisplayOrder();\r\n\t\t\tif (ls == null || ls.Selected == true) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar si = view.GetFirstSelectedIndex();\r\n\t\t\tif (si < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar so = view.SelectedObjects;\r\n\t\t\tview.MoveObjects(si + 2, so);\r\n\t\t\tview.SelectedObjects = so;\r\n\t\t}\r\n\r\n\t\tpublic static T GetFirstSelectedModel<T>(this ObjectListView view) where T : class {\r\n\t\t\treturn view.GetModelObject(view.GetFirstSelectedIndex()) as T;\r\n\t\t}\r\n\r\n\t\tpublic static OLVListItem GetFocusedOrFirstSelectedItem(this ObjectListView view) {\r\n\t\t\treturn view.GetItemCount() == 0 ? null\r\n\t\t\t\t: (view.FocusedItem\r\n\t\t\t\t?? view.SelectedItem\r\n\t\t\t\t?? (view.HasSelection() ? view.GetItem(view.SelectedIndices[0]) : null)) as OLVListItem;\r\n\t\t}\r\n\r\n\t\t// 树视图存在子节点且多选节点时，在 SelectedIndexChanged 事件中，SelectedIndices属性可能返回无内容的集合。\r\n\t\tpublic static int GetFirstSelectedIndex(this ObjectListView view) {\r\n\t\t\tvar c = view.GetItemCount();\r\n\t\t\tint i = c;\r\n\t\t\tforeach (int item in view.SelectedIndices) {\r\n\t\t\t\tif (item < i) {\r\n\t\t\t\t\ti = item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn i == c ? -1 : i;\r\n\t\t}\r\n\r\n\t\tpublic static int GetLastSelectedIndex(this ObjectListView view) {\r\n\t\t\tint i = -1;\r\n\t\t\tforeach (int item in view.SelectedIndices) {\r\n\t\t\t\tif (item > i) {\r\n\t\t\t\t\ti = item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\tpublic static List<T> GetSelectedModels<T>(this ObjectListView view) where T : class {\r\n\t\t\tvar s = view.SelectedObjects;\r\n\t\t\tvar r = new List<T>(s.Count);\r\n\t\t\tforeach (T item in s) {\r\n\t\t\t\tif (item != null) {\r\n\t\t\t\t\tr.Add(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\t/// <summary>测试坐标点属于哪个单元格。</summary>\r\n\t\tpublic static GridTestResult GetGridAt(this ObjectListView view, int x, int y) {\r\n\t\t\tvar cr = view.ContentRectangle;\r\n\t\t\tvar ic = view.GetItemCount();\r\n\t\t\tvar ob = false;\r\n\t\t\tif (x < cr.Left) {\r\n\t\t\t\tx = cr.Left;\r\n\t\t\t\tob = true;\r\n\t\t\t}\r\n\t\t\telse if (x >= cr.Right) {\r\n\t\t\t\tx = cr.Right - 1;\r\n\t\t\t\tob = true;\r\n\t\t\t}\r\n\t\t\tvar cb = cr.Top + ic * view.RowHeightEffective;\r\n\t\t\tif (y < cr.Top) {\r\n\t\t\t\ty = cr.Top;\r\n\t\t\t\tob = true;\r\n\t\t\t}\r\n\t\t\telse if (y >= cb) {\r\n\t\t\t\ty = cb;\r\n\t\t\t\tob = true;\r\n\t\t\t}\r\n\t\t\tvar r = view.GetItemAt(x, y, out OLVColumn c);\r\n\t\t\tif (r != null) {\r\n\t\t\t\treturn new GridTestResult(c.DisplayIndex, r.Index, ob);\r\n\t\t\t}\r\n\t\t\t// 当列表框滚动时，上述方法失效，使用此替补方法\r\n\t\t\tr = view.GetNthItemInDisplayOrder((y - 1 - cr.Top) / view.RowHeightEffective);\r\n\t\t\tvar w = cr.Left;\r\n\t\t\tvar cl = view.ColumnsInDisplayOrder;\r\n\t\t\tfor (int i = 0; i < cl.Count; i++) {\r\n\t\t\t\tif (x >= w && x <= (w += cl[i].Width)) {\r\n\t\t\t\t\tc = cl[i];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (c == null) {\r\n\t\t\t\tc = cl[cl.Count - 1];\r\n\t\t\t\tob = true;\r\n\t\t\t}\r\n\t\t\ty = r.Index + view.TopItemIndex;\r\n\t\t\tif (y >= view.GetItemCount()) {\r\n\t\t\t\ty = view.GetItemCount() - 1;\r\n\t\t\t}\r\n\t\t\treturn new GridTestResult(c.DisplayIndex, y, ob);\r\n\t\t}\r\n\r\n\t\tpublic static void InvertSelect(this ObjectListView view) {\r\n\t\t\tview.Freeze();\r\n\t\t\tvar l = view.GetItemCount();\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tvar oi = view.GetItem(i);\r\n\t\t\t\toi.Selected = !oi.Selected;\r\n\t\t\t}\r\n\t\t\tview.Unfreeze();\r\n\t\t}\r\n\t}\r\n\r\n\treadonly struct GridTestResult(int columnIndex, int rowIndex, bool isOutOfRange)\r\n\t{\r\n\t\tpublic int ColumnIndex { get; } = columnIndex;\r\n\t\tpublic int RowIndex { get; } = rowIndex;\r\n\t\tpublic bool IsOutOfRange { get; } = isOutOfRange;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/PInvokeHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Runtime.InteropServices;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class PInvokeHelper\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 将 <paramref name=\"ptr\"/> 指针对应的数据转换为 <typeparamref name=\"T\"/> 类型实例。\r\n\t\t/// </summary>\r\n\t\t/// <typeparam name=\"T\">传出类型实例。</typeparam>\r\n\t\t/// <param name=\"ptr\">指向数据的指针。</param>\r\n\t\t/// <returns>指针封装后的托管实例。</returns>\r\n\t\tinternal static T Unwrap<T>(this IntPtr ptr) where T : class, new() {\r\n\t\t\tvar t = new T();\r\n\t\t\tMarshal.PtrToStructure(ptr, t);\r\n\t\t\treturn t;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ShortcutFile.cs",
    "content": "﻿using System;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\t/// <summary>用于创建或管理快捷方式文件的类。</summary>\r\n\tpublic sealed class ShortcutFile\r\n\t{\r\n\t\treadonly IShellLink _link;\r\n\r\n\t\t/// <summary>获取或设置快捷方式的目标路径。</summary>\r\n\t\tpublic string Destination { get; private set; }\r\n\t\t/// <summary>获取或设置快捷方式的工作目录。</summary>\r\n\t\tpublic string WorkingDirectory { get; set; }\r\n\t\t/// <summary>获取或设置快捷方式的描述文本。</summary>\r\n\t\tpublic string Description { get; set; }\r\n\t\t/// <summary>获取或设置快捷方式的启动参数。</summary>\r\n\t\tpublic string Arguments { get; set; }\r\n\t\t/// <summary>获取或设置快捷方式的图标文件位置。</summary>\r\n\t\tpublic string IconLocation { get; set; }\r\n\t\t/// <summary>获取或设置快捷方式的图标文件索引。</summary>\r\n\t\tpublic int IconIndex { get; set; }\r\n\r\n\t\tprivate ShortcutFile() {\r\n\t\t\t_link = (IShellLink)new ShellLink();\r\n\t\t}\r\n\r\n\t\t/// <summary>创建快捷方式。</summary>\r\n\t\t/// <param name=\"destination\">快捷方式指向的目标文件路径。</param>\r\n\t\tpublic ShortcutFile(string destination) {\r\n\t\t\t_link = (IShellLink)new ShellLink();\r\n\t\t\tDestination = destination;\r\n\t\t\t_link.SetPath(destination);\r\n\t\t}\r\n\r\n\t\t/// <summary>加载快捷方式。</summary>\r\n\t\t/// <param name=\"shortcutFilePath\">快捷方式文件的位置。</param>\r\n\t\t/// <returns><see cref=\"ShortcutFile\"/> 实例。</returns>\r\n\t\tpublic static ShortcutFile Load(string shortcutFilePath) {\r\n\t\t\tvar s = new ShortcutFile();\r\n\t\t\tvar l = s._link;\r\n\t\t\tvar file = (System.Runtime.InteropServices.ComTypes.IPersistFile)s._link;\r\n\t\t\tfile.Load(shortcutFilePath, 0);\r\n\t\t\ts.Destination = shortcutFilePath;\r\n\t\t\tvar sb = new StringBuilder();\r\n\t\t\tl.GetDescription(sb, 512);\r\n\t\t\ts.Description = sb.ToString();\r\n\t\t\tsb.Length = 0;\r\n\t\t\tl.GetWorkingDirectory(sb, 256);\r\n\t\t\ts.WorkingDirectory = sb.ToString();\r\n\t\t\tint ii;\r\n\t\t\tsb.Length = 0;\r\n\t\t\tl.GetIconLocation(sb, 256, out ii);\r\n\t\t\ts.IconLocation = sb.ToString();\r\n\t\t\tsb.Length = 0;\r\n\t\t\tl.GetArguments(sb, 256);\r\n\t\t\ts.Arguments = sb.ToString();\r\n\t\t\treturn s;\r\n\t\t}\r\n\r\n\t\t/// <summary>将快捷方式保存到目标位置。</summary>\r\n\t\t/// <param name=\"position\">快捷方式文件的位置。</param>\r\n\t\tpublic void Save(string position) {\r\n\t\t\tif (String.IsNullOrEmpty(WorkingDirectory) == false) {\r\n\t\t\t\t_link.SetWorkingDirectory(WorkingDirectory);\r\n\t\t\t}\r\n\t\t\tif (String.IsNullOrEmpty(Description) == false) {\r\n\t\t\t\t_link.SetDescription(Description);\r\n\t\t\t}\r\n\t\t\tif (String.IsNullOrEmpty(Arguments) == false) {\r\n\t\t\t\t_link.SetArguments(Arguments);\r\n\t\t\t}\r\n\t\t\tif (String.IsNullOrEmpty(IconLocation) == false) {\r\n\t\t\t\t_link.SetIconLocation(IconLocation, IconIndex >= 0 ? IconIndex : 0);\r\n\t\t\t}\r\n\t\t\tvar file = (System.Runtime.InteropServices.ComTypes.IPersistFile)_link;\r\n\t\t\tfile.Save(position, false);\r\n\t\t}\r\n\r\n\t\t#region COM Interops\r\n\t\t[ComImport]\r\n\t\t[Guid(\"00021401-0000-0000-C000-000000000046\")]\r\n\t\tclass ShellLink\r\n\t\t{\r\n\t\t}\r\n\r\n\t\t[ComImport]\r\n\t\t[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\r\n\t\t[Guid(\"000214F9-0000-0000-C000-000000000046\")]\r\n\t\tinterface IShellLink\r\n\t\t{\r\n\t\t\tvoid GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);\r\n\t\t\tvoid GetIDList(out IntPtr ppidl);\r\n\t\t\tvoid SetIDList(IntPtr pidl);\r\n\t\t\tvoid GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);\r\n\t\t\tvoid SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);\r\n\t\t\tvoid GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);\r\n\t\t\tvoid SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);\r\n\t\t\tvoid GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);\r\n\t\t\tvoid SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);\r\n\t\t\tvoid GetHotkey(out short pwHotkey);\r\n\t\t\tvoid SetHotkey(short wHotkey);\r\n\t\t\tvoid GetShowCmd(out int piShowCmd);\r\n\t\t\tvoid SetShowCmd(int iShowCmd);\r\n\t\t\tvoid GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);\r\n\t\t\tvoid SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);\r\n\t\t\tvoid SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);\r\n\t\t\tvoid Resolve(IntPtr hwnd, int fFlags);\r\n\t\t\tvoid SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);\r\n\t\t}\r\n\t\t#endregion\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Common/StringBuilderCache.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tinternal static class StringBuilderCache\r\n\t{\r\n\t\tinternal const int MaxBuilderSize = 360;\r\n\t\tconst int DefaultCapacity = 16; // == StringBuilder.DefaultCapacity\r\n\r\n\t\t[ThreadStatic]\r\n\t\tstatic StringBuilder __CachedInstance;\r\n\r\n\t\tpublic static StringBuilder Acquire(int capacity = DefaultCapacity) {\r\n\t\t\tif (capacity <= MaxBuilderSize) {\r\n\t\t\t\tStringBuilder sb = __CachedInstance;\r\n\t\t\t\tif (sb != null) {\r\n\t\t\t\t\t// Avoid stringbuilder block fragmentation by getting a new StringBuilder\r\n\t\t\t\t\t// when the requested size is larger than the current capacity\r\n\t\t\t\t\tif (capacity <= sb.Capacity) {\r\n\t\t\t\t\t\t__CachedInstance = null;\r\n\t\t\t\t\t\tsb.Length = 0;\r\n\t\t\t\t\t\treturn sb;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn new StringBuilder(capacity);\r\n\t\t}\r\n\r\n\t\tpublic static void Release(StringBuilder sb) {\r\n\t\t\tif (sb.Capacity <= MaxBuilderSize) {\r\n\t\t\t\t__CachedInstance = sb;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static string GetStringAndRelease(StringBuilder sb) {\r\n\t\t\tstring result = sb.ToString();\r\n\t\t\tRelease(sb);\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/StringHelper.cs",
    "content": "﻿using System;\r\nusing System.Diagnostics;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class StringHelper\r\n\t{\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool IsNullOrWhiteSpace(this string text) {\r\n\t\t\treturn String.IsNullOrWhiteSpace(text);\r\n\t\t}\r\n\r\n\t\tpublic static string ReplaceControlAndBomCharacters(string source) {\r\n\t\t\tif (String.IsNullOrEmpty(source)) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tvar p = source.ToCharArray();\r\n\t\t\tvar m = false;\r\n\t\t\tfor (int i = 0; i < source.Length; i++) {\r\n\t\t\t\tref var c = ref p[i];\r\n\t\t\t\tif ((Char.IsControl(c) && c != '\\t' && c != '\\r' && c != '\\n')\r\n\t\t\t\t\t|| (c > 0xFFFD && (c == 0xFFFF || c == 0xFFFE || c == 0xFFEF))\r\n\t\t\t\t\t) {\r\n\t\t\t\t\tc = ' ';\r\n\t\t\t\t\tm = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn m ? new String(p) : source;\r\n\t\t}\r\n\r\n\t\tpublic static string Take(this string text, int startIndex, int count) {\r\n\t\t\tif (String.IsNullOrEmpty(text) || startIndex >= text.Length) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tif (startIndex < 0) {\r\n\t\t\t\tstartIndex = text.Length + startIndex;\r\n\t\t\t\tif (startIndex < 0) {\r\n\t\t\t\t\tstartIndex = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn count <= 0\r\n\t\t\t\t? String.Empty\r\n\t\t\t\t: text.Substring(startIndex, startIndex + count > text.Length ? text.Length - startIndex : count);\r\n\t\t}\r\n\r\n\t\tpublic static string ToDescription<TEnum>(this TEnum value) where TEnum : Enum {\r\n\t\t\treturn value.ToString();\r\n\t\t}\r\n\r\n\t\tpublic static bool HasCaseInsensitivePrefix(this string text, string prefix) {\r\n\t\t\treturn text?.StartsWith(prefix, StringComparison.OrdinalIgnoreCase) == true;\r\n\t\t}\r\n\t\tpublic static bool HasPrefix(this string text, string prefix) {\r\n\t\t\treturn text?.StartsWith(prefix, StringComparison.Ordinal) == true;\r\n\t\t}\r\n\r\n\t\t/// <summary>返回字符串中包含指定字符串之后的子字符串。</summary>\r\n\t\t/// <remarks>如果找不到指定字符串，则返回空字符串。</remarks>\r\n\t\tpublic static string SubstringAfter(this string source, char value) {\r\n\t\t\tint index = source.LastIndexOf(value);\r\n\t\t\treturn index != -1\r\n\t\t\t\t? source.Substring(index + 1)\r\n\t\t\t\t: String.Empty;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/ValueHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Globalization;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class ValueHelper\r\n\t{\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static TValue CastOrDefault<TValue>(this object value, TValue defaultValue) where TValue : struct {\r\n\t\t\treturn value is TValue v ? v : defaultValue;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static TValue CastOrDefault<TValue>(this object value) where TValue : struct {\r\n\t\t\treturn value is TValue v ? v : default;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool HasContent<T>(this ICollection<T> collection) {\r\n\t\t\treturn collection?.Count > 0;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static T SubstituteDefault<T>(this T value, T otherValue) {\r\n\t\t\treturn EqualityComparer<T>.Default.Equals(value, default(T)) ? otherValue : value;\r\n\t\t}\r\n\t\tpublic static TDisposable TryDispose<TDisposable>(this TDisposable disposable)\r\n\t\t\twhere TDisposable : IDisposable {\r\n\t\t\tif (disposable != null) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tdisposable.Dispose();\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t// ignore\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn disposable;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool IsInCollection<T>(T input, params T[] values) {\r\n\t\t\treturn values != null && input != null && values.Length != 0 && Array.IndexOf(values, input) != -1;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static IComparer<TItem> GetReverseComparer<TItem>()\r\n\t\twhere TItem : IComparable<TItem> {\r\n\t\t\treturn new ReverseComparer<TItem>();\r\n\t\t}\r\n\t\tpublic static T LimitInRange<T>(this T value, T minValue, T maxValue)\r\n\t\t\twhere T : IComparable<T> {\r\n\t\t\treturn\r\n\t\t\t\tvalue.CompareTo(minValue) < 0 ? minValue\r\n\t\t\t\t: value.CompareTo(maxValue) > 0 ? maxValue\r\n\t\t\t\t: value;\r\n\t\t}\r\n\t\tpublic static TValue GetOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) {\r\n\t\t\tTValue r;\r\n\t\t\treturn dictionary == null ? default : dictionary.TryGetValue(key, out r) ? r : r;\r\n\t\t}\r\n\t\tpublic static TValue GetOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue) {\r\n\t\t\tTValue r;\r\n\t\t\treturn dictionary != null && dictionary.TryGetValue(key, out r) ? r : defaultValue;\r\n\t\t}\r\n\r\n\t\tpublic static TMapped MapValue<TValue, TMapped>(TValue input, TValue[] fromValues, TMapped[] toValues) {\r\n\t\t\treturn MapValue(input, fromValues, toValues, default(TMapped));\r\n\t\t}\r\n\t\tpublic static TMapped MapValue<TValue, TMapped>(TValue input, TValue[] fromValues, TMapped[] toValues, TMapped defaultValue) {\r\n\t\t\tif (fromValues == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tif (toValues == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar i = Array.IndexOf(fromValues, input);\r\n\t\t\tif (i == -1 || i >= toValues.Length) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\treturn toValues[i];\r\n\t\t}\r\n\r\n\t\tpublic static TMapped MapValue<TValue, TMapped>(TValue input, IEnumerable<TValue> fromValues, IEnumerable<TMapped> toValues, TMapped defaultValue) {\r\n\t\t\tif (fromValues == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tif (toValues == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar i = 0;\r\n\t\t\tvar j = 0;\r\n\t\t\tvar c = EqualityComparer<TValue>.Default;\r\n\t\t\tforeach (var x in fromValues) {\r\n\t\t\t\tif (c.Equals(input, x)) {\r\n\t\t\t\t\tforeach (var y in toValues) {\r\n\t\t\t\t\t\tif (i == j) {\r\n\t\t\t\t\t\t\treturn y;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tj++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn defaultValue;\r\n\t\t\t\t}\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\treturn defaultValue;\r\n\t\t}\r\n\t\tpublic static IEnumerable ForEach<TItem>(this IEnumerable collection, Action<TItem> itemHandler) {\r\n\t\t\tif (collection == null || itemHandler == null) {\r\n\t\t\t\treturn collection;\r\n\t\t\t}\r\n\t\t\tforeach (var item in collection) {\r\n\t\t\t\tif (item is TItem v) {\r\n\t\t\t\t\titemHandler(v);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn collection;\r\n\t\t}\r\n\t\tpublic static TCollection AddRange<TCollection, T>(this TCollection target, IEnumerable<T> source)\r\n\t\t\twhere TCollection : ICollection<T> {\r\n\t\t\tif (source == null || target == null) {\r\n\t\t\t\treturn target;\r\n\t\t\t}\r\n\t\t\tif (target is List<T> list) {\r\n\t\t\t\tlist.AddRange(source);\r\n\t\t\t\treturn target;\r\n\t\t\t}\r\n\r\n\t\t\tforeach (T item in source) {\r\n\t\t\t\ttarget.Add(item);\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this DateTimeOffset value) {\r\n\t\t\treturn value.ToString(NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this int value) {\r\n\t\t\treturn value.ToString(NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this float value) {\r\n\t\t\treturn Math.Abs(value) < 0.00001 ? \"0\" : value.ToString(NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this double value) {\r\n\t\t\treturn Math.Abs(value) < 0.000000000001 ? \"0\" : value.ToString(NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this long value) {\r\n\t\t\treturn value.ToString(CultureInfo.InvariantCulture);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this decimal value) {\r\n\t\t\treturn value.ToString(NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText<TFormattable>(this TFormattable value)\r\n\t\t\twhere TFormattable : IFormattable {\r\n\t\t\treturn value.ToString(null, NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText<TFormattable>(this TFormattable value, string format)\r\n\t\t\twhere TFormattable : IFormattable {\r\n\t\t\treturn value.ToString(format, NumberFormatInfo.InvariantInfo);\r\n\t\t}\r\n\r\n\t\tpublic static bool ToBoolean(this string value, bool defaultValue) {\r\n\t\t\tif (string.IsNullOrEmpty(value)) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tswitch (ParseBoolean(value)) {\r\n\t\t\t\tcase 1: return true;\r\n\t\t\t\tcase 0: return false;\r\n\t\t\t\tdefault: return defaultValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic int ParseBoolean(string value) {\r\n\t\t\tconst int True = 1, False = 0, Invalid = -1;\r\n\t\t\tvar i = 0;\r\n\t\t\tvar l = value.Length;\r\n\t\t\tdo {\r\n\t\t\t\tvar c = value[i];\r\n\t\t\t\tswitch (c) {\r\n\t\t\t\t\tcase 'T':\r\n\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\tif (i + 3 < l && ((c = value[++i]) == 'r' || c == 'R') && ((c = value[++i]) == 'u' || c == 'U') && ((c = value[++i]) == 'e' || c == 'E')) {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceTrue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\tcase 'F':\r\n\t\t\t\t\tcase 'f':\r\n\t\t\t\t\t\tif (i + 4 < l && ((c = value[++i]) == 'a' || c == 'A') && ((c = value[++i]) == 'l' || c == 'L') && ((c = value[++i]) == 's' || c == 'S') && ((c = value[++i]) == 'e' || c == 'E')) {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\tcase 'Y':\r\n\t\t\t\t\tcase 'y':\r\n\t\t\t\t\t\tif (i + 2 < l && ((c = value[++i]) == 'e' || c == 'E') && ((c = value[++i]) == 's' || c == 'S')) {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceTrue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\tcase 'N':\r\n\t\t\t\t\tcase 'n':\r\n\t\t\t\t\t\tif (i + 1 < l && ((c = value[++i]) == 'o' || c == 'O')) {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\tcase 'O':\r\n\t\t\t\t\tcase 'o':\r\n\t\t\t\t\t\tif (i + 2 < l && ((c = value[++i]) == 'f' || c == 'F') && ((c = value[++i]) == 'f' || c == 'F')) {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (i + 1 < l && ((c = value[++i]) == 'n' || c == 'N' || c == 'k' || c == 'K')) {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceTrue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\tcase '是':\r\n\t\t\t\t\tcase '对':\r\n\t\t\t\t\tcase '开':\r\n\t\t\t\t\t\tgoto EndsWithWhitespaceTrue;\r\n\t\t\t\t\tcase '否':\r\n\t\t\t\t\tcase '关':\r\n\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\tcase '正':\r\n\t\t\t\t\t\tif (i + 1 < l && value[++i] == '确') {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceTrue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\tcase '错':\r\n\t\t\t\t\t\tif (i + 1 < l && value[++i] == '误') {\r\n\t\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tgoto EndsWithWhitespaceFalse;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif (Char.IsWhiteSpace(c)) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (c >= '0' && c <= '9' || c == '-' || c == '+' || c == '.') {\r\n\t\t\t\t\t\t\tbool notZero = c > '0' && c <= '9';\r\n\t\t\t\t\t\t\tvar hasDot = false;\r\n\t\t\t\t\t\t\twhile (++i < l) {\r\n\t\t\t\t\t\t\t\tc = value[i];\r\n\t\t\t\t\t\t\t\tif (Char.IsNumber(c) == false && Char.IsWhiteSpace(c) == false) {\r\n\t\t\t\t\t\t\t\t\tif (c == '.') {\r\n\t\t\t\t\t\t\t\t\t\tif (hasDot == false) {\r\n\t\t\t\t\t\t\t\t\t\t\thasDot = true;\r\n\t\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\treturn Invalid;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (notZero == false) {\r\n\t\t\t\t\t\t\t\t\tnotZero = c > '0' && c <= '9';\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn notZero ? True : False;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn -1;\r\n\t\t\t\t}\r\n\t\t\t} while (++i < l);\r\n\t\tEndsWithWhitespaceTrue:\r\n\t\t\twhile (++i < l && Char.IsWhiteSpace(value[i])) { }\r\n\t\t\treturn i == l ? True : Invalid;\r\n\t\tEndsWithWhitespaceFalse:\r\n\t\t\twhile (++i < l && Char.IsWhiteSpace(value[i])) { }\r\n\t\t\treturn i == l ? False : Invalid;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static int ToInt32(this float value) {\r\n\t\t\treturn (int)(value > 0 ? value + 0.5f : value - 0.5f);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static int ToInt32(this double value) {\r\n\t\t\treturn (int)(value > 0 ? value + 0.5d : value - 0.5d);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static long ToInt64(this float value) {\r\n\t\t\treturn (long)(value > 0 ? value + 0.5f : value - 0.5f);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static long ToInt64(this double value) {\r\n\t\t\treturn (long)(value > 0 ? value + 0.5d : value - 0.5d);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static int ToInt32(this string value) {\r\n\t\t\tint i;\r\n\t\t\tvalue.TryParse(out i);\r\n\t\t\treturn i;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static int ToInt32(this string value, int defaultValue) {\r\n\t\t\tint i;\r\n\t\t\treturn value.TryParse(out i) ? i : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static long ToInt64(this string value) {\r\n\t\t\tlong i;\r\n\t\t\tvalue.TryParse(out i);\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static long ToInt64(this string value, long defaultValue) {\r\n\t\t\tlong i;\r\n\t\t\treturn value.TryParse(out i) ? i : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static float ToSingle(this string value) {\r\n\t\t\tfloat i;\r\n\t\t\tvalue.TryParse(out i);\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static float ToSingle(this string value, float defaultValue) {\r\n\t\t\tfloat i;\r\n\t\t\treturn value.TryParse(out i) ? i : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static double ToDouble(this string value) {\r\n\t\t\tdouble i;\r\n\t\t\tvalue.TryParse(out i);\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static double ToDouble(this string value, double defaultValue) {\r\n\t\t\tdouble i;\r\n\t\t\treturn value.TryParse(out i) ? i : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string ToText(this byte value) {\r\n\t\t\treturn value.ToString(CultureInfo.InvariantCulture);\r\n\t\t}\r\n\t\tpublic static bool TryParse(this string value, out int result) {\r\n\t\t\treturn Int32.TryParse(value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out result)\r\n\t\t\t\t|| ParseFloatStringToInt32(value, ref result);\r\n\t\t}\r\n\r\n\t\tstatic bool ParseFloatStringToInt32(string value, ref int result) {\r\n\t\t\tif (double.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out var d)) {\r\n\t\t\t\tresult = d.ToInt32();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic static bool TryParse(this string value, out long result) {\r\n\t\t\treturn Int64.TryParse(value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out result)\r\n\t\t\t\t|| ParseFloatStringToInt64(value, ref result);\r\n\t\t}\r\n\r\n\t\tstatic bool ParseFloatStringToInt64(string value, ref long result) {\r\n\t\t\tif (double.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out var d)) {\r\n\t\t\t\tresult = d.ToInt64();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool TryParse(this string value, out float result) {\r\n\t\t\treturn float.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out result);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool TryParse(this string value, out double result) {\r\n\t\t\treturn double.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out result);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool TryParse(this string value, out decimal result) {\r\n\t\t\treturn decimal.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out result);\r\n\t\t}\r\n\r\n\t\tpublic static string ToRoman(this int value) {\r\n\t\t\tif (value > 49999 || value < 1) {\r\n\t\t\t\treturn string.Empty;\r\n\t\t\t}\r\n\t\t\tvar sb = new StringBuilder();\r\n\t\t\tdo {\r\n\t\t\t\tfor (int i = value < 40 ? 5 : value < 400 ? 9 : Roman.Values.Length - 1; i >= 0; i--) {\r\n\t\t\t\t\tvar n = Roman.Values[i];\r\n\t\t\t\t\tif (value >= n) {\r\n\t\t\t\t\t\tvalue -= n;\r\n\t\t\t\t\t\tsb.Append(Roman.Chars[i]);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} while (value > 0);\r\n\t\t\treturn sb.ToString();\r\n\t\t}\r\n\t\tpublic static string ToAlphabet(this int value, bool upper) {\r\n\t\t\tif (value <= 0) {\r\n\t\t\t\treturn string.Empty;\r\n\t\t\t}\r\n\t\t\tvar stack = new char[7];\r\n\t\t\tvar c = (upper ? 'A' : 'a') - 1;\r\n\t\t\tvar p = -1;\r\n\t\t\twhile (value > 0) {\r\n\t\t\t\tvar i = value % 26;\r\n\t\t\t\tstack[++p] = (char)(c + (i == 0 ? 26 : i));\r\n\t\t\t\tvalue = --value / 26;\r\n\t\t\t}\r\n\t\t\treturn new string(stack, 0, ++p);\r\n\t\t}\r\n\t\tpublic static string ToHexBinString(this byte value, bool upperCaseHex) {\r\n\t\t\treturn HexBinByteToString.ToString(value, upperCaseHex);\r\n\t\t}\r\n\t\tpublic static string ToHexBinString(this byte[] source) {\r\n\t\t\treturn InternalToHexBinString(source, true, '\\0', 0, Int32.MaxValue);\r\n\t\t}\r\n\t\tpublic static string ToHexBinString(this byte[] source, bool upperCaseHex, char separator, int offset, int count) {\r\n\t\t\treturn InternalToHexBinString(source, upperCaseHex, separator, offset, count);\r\n\t\t}\r\n\t\tunsafe static string InternalToHexBinString(byte[] source, bool upperCaseHex, char separator, int offset, int count) {\r\n\t\t\tif (source == null || offset < 0 || count < 1) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tvar length = source.Length;\r\n\t\t\tif (length == 0 || offset >= length) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tif (count > length - offset) {\r\n\t\t\t\tcount = length - offset;\r\n\t\t\t}\r\n\t\t\tif (count == 1) {\r\n\t\t\t\treturn source[offset].ToHexBinString(upperCaseHex);\r\n\t\t\t}\r\n\t\t\tvar result = new string('0', (count << 1) + (separator > 0 ? count - 1 : 0));\r\n\t\t\tfixed (char* p = result)\r\n\t\t\tfixed (byte* bp = &source[offset]) {\r\n\t\t\t\tbyte* b = bp;\r\n\t\t\t\tbyte* end = bp + count;\r\n\t\t\t\tvar mapper = HexBinByteValues.GetHexBinMapper(upperCaseHex);\r\n\t\t\t\tif (separator == 0) {\r\n\t\t\t\t\tint* h = (int*)p;\r\n\t\t\t\t\twhile (b < end) {\r\n\t\t\t\t\t\t*(h++) = mapper[*(b++)];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tchar* c = p;\r\n\t\t\t\t\t*(int*)(c) = mapper[*bp];\r\n\t\t\t\t\twhile (++b < end) {\r\n\t\t\t\t\t\tc += 2;\r\n\t\t\t\t\t\t*c = separator;\r\n\t\t\t\t\t\t*(int*)(++c) = mapper[*b];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic class HexBinByteToString\r\n\t\t{\r\n\t\t\tstatic readonly string[] __HexBins = InitHexBinStrings(true);\r\n\t\t\tstatic readonly string[] __HexBinLower = InitHexBinStrings(false);\r\n\r\n\t\t\tpublic static string ToString(byte value, bool upperCase) {\r\n\t\t\t\treturn (upperCase ? __HexBins : __HexBinLower)[value];\r\n\t\t\t}\r\n\t\t\tstatic string[] InitHexBinStrings(bool upperCase) {\r\n\t\t\t\tvar s = new string[Byte.MaxValue + 1];\r\n\t\t\t\tfor (int i = 0; i < s.Length; i++) {\r\n\t\t\t\t\ts[i] = ToHexBinString((byte)i, upperCase);\r\n\t\t\t\t}\r\n\t\t\t\treturn s;\r\n\r\n\t\t\t\tstring ToHexBinString(byte value, bool upperCaseHex) {\r\n\t\t\t\t\tvar h = (upperCaseHex ? 0x41 : 0x61) - 10;\r\n\t\t\t\t\tvar a = new char[2];\r\n\t\t\t\t\tvar t = (byte)(value >> 4);\r\n\t\t\t\t\ta[0] = (char)(t > 9 ? t + h : t + 0x30);\r\n\t\t\t\t\tt = (byte)(value & 0x0F);\r\n\t\t\t\t\ta[1] = (char)(t > 9 ? t + h : t + 0x30);\r\n\t\t\t\t\treturn new string(a);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tstatic class HexBinByteValues\r\n\t\t{\r\n\t\t\tstatic readonly int[] __HexBins = InitHexBin(true);\r\n\t\t\tstatic readonly int[] __HexBinLowerCase = InitHexBin(false);\r\n\r\n\t\t\tunsafe static int[] InitHexBin(bool upperCase) {\r\n\t\t\t\tvar v = new int[Byte.MaxValue + 1];\r\n\t\t\t\tvar a = new char[2];\r\n\t\t\t\tvar h = (upperCase ? 0x41 : 0x61) - 10;\r\n\t\t\t\tfor (int i = 0; i <= Byte.MaxValue; i++) {\r\n\t\t\t\t\tvar t = (byte)(i >> 4);\r\n\t\t\t\t\ta[0] = (char)(t > 9 ? t + h : t + 0x30);\r\n\t\t\t\t\tt = (byte)(i & 0x0F);\r\n\t\t\t\t\ta[1] = (char)(t > 9 ? t + h : t + 0x30);\r\n\t\t\t\t\tfixed (char* p = new string(a)) {\r\n\t\t\t\t\t\tv[i] = *(int*)p;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn v;\r\n\t\t\t}\r\n\t\t\tpublic static int[] GetHexBinMapper(bool upperCase) {\r\n\t\t\t\treturn upperCase ? __HexBins : __HexBinLowerCase;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic class Roman\r\n\t\t{\r\n\t\t\tinternal static readonly int[] Values = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 4000, 5000, 9000, 10000, 40000 };\r\n\t\t\tinternal static readonly string[] Chars = { \"I\", \"IV\", \"V\", \"IX\", \"X\", \"XL\", \"L\", \"XC\", \"C\", \"CD\", \"D\", \"CM\", \"M\", \"Mv\", \"v\", \"Mx\", \"x\", \"xl\" };\r\n\t\t}\r\n\r\n\t\tsealed class ReverseComparer<T> : IComparer<T>\r\n\t\t\twhere T : IComparable<T>\r\n\t\t{\r\n\t\t\tint IComparer<T>.Compare(T x, T y) {\r\n\t\t\t\treturn y.CompareTo(x);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/XmlHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Xml;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tstatic class XmlHelper\r\n\t{\r\n\t\tconst string BooleanYes = \"yes\";\r\n\t\tconst string BooleanNo = \"no\";\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool GetValue(this XmlElement element, string name, bool defaultValue) {\r\n\t\t\tif (element == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = element.GetAttributeNode(name);\r\n\t\t\treturn a != null ? a.Value.ToBoolean(defaultValue) : defaultValue;\r\n\t\t}\r\n\r\n\t\t/// <summary>获取 <paramref name=\"element\"/> 元素名称为 <paramref name=\"name\"/> 的属性值，如不存在该属性，或属性不能解析为整数值，则返回 <paramref name=\"defaultValue\"/>。</summary>\r\n\t\t/// <param name=\"element\">需要获取属性值的元素。</param>\r\n\t\t/// <param name=\"name\">属性的名称。</param>\r\n\t\t/// <param name=\"defaultValue\">属性的默认值。</param>\r\n\t\t/// <returns>属性的值；如不存在该属性，返回默认值。</returns>\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static int GetValue(this XmlElement element, string name, int defaultValue) {\r\n\t\t\tif (element == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = element.GetAttributeNode(name);\r\n\t\t\treturn a != null ? a.Value.ToInt32(defaultValue) : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static long GetValue(this XmlElement element, string name, long defaultValue) {\r\n\t\t\tif (element == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = element.GetAttributeNode(name);\r\n\t\t\treturn a != null ? a.Value.ToInt64(defaultValue) : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static float GetValue(this XmlElement element, string name, float defaultValue) {\r\n\t\t\tif (element == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = element.GetAttributeNode(name);\r\n\t\t\treturn a != null ? a.Value.ToSingle(defaultValue) : defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static double GetValue(this XmlElement element, string name, double defaultValue) {\r\n\t\t\tif (element == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = element.GetAttributeNode(name);\r\n\t\t\tif (a == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\treturn a.Value.ToDouble(defaultValue);\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static bool GetValue(this XmlReader reader, string name, bool defaultValue) {\r\n\t\t\tif (reader == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = reader.GetAttribute(name);\r\n\t\t\treturn a?.ToBoolean(defaultValue) ?? defaultValue;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static int GetValue(this XmlReader reader, string name, int defaultValue) {\r\n\t\t\tif (reader == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = reader.GetAttribute(name);\r\n\t\t\treturn a?.ToInt32(defaultValue) ?? defaultValue;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static float GetValue(this XmlReader reader, string name, float defaultValue) {\r\n\t\t\tif (reader == null) {\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t\tvar a = reader.GetAttribute(name);\r\n\t\t\treturn a?.ToSingle(defaultValue) ?? defaultValue;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string GetValue(this XmlElement element, string name) {\r\n\t\t\treturn element?.GetAttributeNode(name)?.Value;\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static string GetValue(this XmlElement element, string name, string defaultValue) {\r\n\t\t\treturn element?.GetAttributeNode(name)?.Value ?? defaultValue;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void SetValue(this XmlElement element, string name, bool value, bool defaultValue) {\r\n\t\t\tif (element == null) { return; }\r\n\t\t\tif (value == defaultValue) {\r\n\t\t\t\telement.RemoveAttribute(name);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\telement.SetAttribute(name, value ? BooleanYes : BooleanNo);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void SetValue(this XmlElement element, string name, int value, int defaultValue) {\r\n\t\t\tif (element == null) { return; }\r\n\t\t\tif (value == defaultValue) {\r\n\t\t\t\telement.RemoveAttribute(name);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\telement.SetAttribute(name, value.ToText());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void SetValue(this XmlElement element, string name, float value, float defaultValue) {\r\n\t\t\tif (element == null) { return; }\r\n\t\t\tif (value == defaultValue) {\r\n\t\t\t\telement.RemoveAttribute(name);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\telement.SetAttribute(name, value.ToText());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void SetValue(this XmlElement element, string name, string value) {\r\n\t\t\tif (element == null) { return; }\r\n\t\t\tif (string.IsNullOrEmpty(value)) {\r\n\t\t\t\telement.RemoveAttribute(name);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\telement.SetAttribute(name, value);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void SetValue(this XmlElement element, string name, string value, string defaultValue) {\r\n\t\t\tif (element == null) { return; }\r\n\t\t\tif (value == null || value == defaultValue) {\r\n\t\t\t\telement.RemoveAttribute(name);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\telement.SetAttribute(name, value);\r\n\t\t\t}\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void WriteValue(this XmlWriter writer, string name, bool value) {\r\n\t\t\twriter?.WriteAttributeString(name, value ? BooleanYes : BooleanNo);\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void WriteValue(this XmlWriter writer, string name, bool value, bool defaultValue) {\r\n\t\t\tif (writer != null && value != defaultValue) {\r\n\t\t\t\twriter.WriteAttributeString(name, value ? BooleanYes : BooleanNo);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void WriteValue(this XmlWriter writer, string name, int value) {\r\n\t\t\twriter?.WriteAttributeString(name, value.ToText());\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void WriteValue(this XmlWriter writer, string name, int value, int defaultValue) {\r\n\t\t\tif (writer != null && value != defaultValue) {\r\n\t\t\t\twriter.WriteAttributeString(name, value.ToText());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void WriteValue(this XmlWriter writer, string name, float value) {\r\n\t\t\twriter?.WriteAttributeString(name, value.ToText());\r\n\t\t}\r\n\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static void WriteValue(this XmlWriter writer, string name, string value, string defaultValue) {\r\n\t\t\tif (writer != null && string.Equals(value, defaultValue, StringComparison.OrdinalIgnoreCase) == false) {\r\n\t\t\t\twriter.WriteAttributeString(name, value);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static XmlElement GetOrCreateElement(this XmlNode parent, string name) {\r\n\t\t\treturn parent == null\r\n\t\t\t\t? null\r\n\t\t\t\t: GetElement(parent, name) ?? parent.AppendElement(name);\r\n\t\t}\r\n\t\tpublic static XmlElement GetElement(this XmlNode parent, string name) {\r\n\t\t\tif (parent == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar n = parent.FirstChild;\r\n\t\t\twhile (n != null) {\r\n\t\t\t\tif (n.NodeType == XmlNodeType.Element && n.Name == name) {\r\n\t\t\t\t\treturn n as XmlElement;\r\n\t\t\t\t}\r\n\t\t\t\tn = n.NextSibling;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t[DebuggerStepThrough]\r\n\t\tpublic static XmlElement AppendElement(this XmlNode element, string name) {\r\n\t\t\tif (element == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar d = element.NodeType != XmlNodeType.Document ? element.OwnerDocument : element as XmlDocument;\r\n\t\t\tvar e = d.CreateElement(name);\r\n\t\t\telement.AppendChild(e);\r\n\t\t\treturn e;\r\n\t\t}\r\n\r\n\t\tpublic static XmlNode[] ToXmlNodeArray(this XmlNodeList nodes) {\r\n\t\t\tif (nodes == null) {\r\n\t\t\t\treturn Empty<XmlNode>.Item;\r\n\t\t\t}\r\n\t\t\tvar a = new XmlNode[nodes.Count];\r\n\t\t\tvar i = -1;\r\n\t\t\tforeach (XmlNode item in nodes) {\r\n\t\t\t\ta[++i] = item;\r\n\t\t\t}\r\n\t\t\treturn a;\r\n\t\t}\r\n\t\tpublic static IList<TNode> ToNodeList<TNode>(this XmlNodeList nodes) where TNode : XmlNode {\r\n\t\t\tif (nodes == null) {\r\n\t\t\t\treturn Empty<TNode>.Item;\r\n\t\t\t}\r\n\t\t\tvar a = new List<TNode>(7);\r\n\t\t\tforeach (var item in nodes) {\r\n\t\t\t\tif (item is TNode n) {\r\n\t\t\t\t\ta.Add(n);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tpublic static IEnumerable<XmlElement> ChildrenOrFollowingSiblings(this XmlElement element) {\r\n\t\t\treturn new ChildrenOrFollowingElementEnumerator(element);\r\n\t\t}\r\n\r\n\t\tstatic class Empty<TNode>\r\n\t\t{\r\n\t\t\tpublic static readonly TNode[] Item = new TNode[0];\r\n\t\t}\r\n\r\n\t\tsealed class ChildrenOrFollowingElementEnumerator(XmlElement baseElement) : IEnumerable<XmlElement>, IEnumerator<XmlElement>\r\n\t\t{\r\n\t\t\treadonly XmlElement _base = baseElement;\r\n\t\t\tXmlNode _active = baseElement;\r\n\r\n\t\t\tpublic XmlElement Current => _active as XmlElement;\r\n\t\t\tobject IEnumerator.Current => _active;\r\n\r\n\t\t\tpublic void Dispose() {}\r\n\r\n\t\t\tpublic IEnumerator<XmlElement> GetEnumerator() {\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\r\n\t\t\tpublic bool MoveNext() {\r\n\t\t\t\treturn _active != null\r\n\t\t\t\t\t&& (_active.HasChildNodes && TryGetFirstChildElement(ref _active)\r\n\t\t\t\t\t\t|| TryGetFirstFollowingElement(ref _active));\r\n\t\t\t}\r\n\r\n\t\t\tstatic bool TryGetFirstChildElement(ref XmlNode active) {\r\n\t\t\t\tvar c = active.FirstChild;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (c.NodeType == XmlNodeType.Element) {\r\n\t\t\t\t\t\tactive = c;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\twhile ((c = c.NextSibling) != null);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tstatic bool TryGetFirstFollowingElement(ref XmlNode active) {\r\n\t\t\t\tXmlNode s;\r\n\t\t\t\twhile ((s = active.NextSibling) != null) {\r\n\t\t\t\t\tif (s.NodeType == XmlNodeType.Element) {\r\n\t\t\t\t\t\tactive = s;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Reset() {\r\n\t\t\t\t_active = _base;\r\n\t\t\t}\r\n\r\n\t\t\tIEnumerator IEnumerable.GetEnumerator() {\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Common/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\" >\r\n\t<assemblyIdentity version=\"1.0.0.0\" name=\"PDFPatcher.app\"/>\r\n\t<trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\r\n\t\t<security>\r\n\t\t\t<requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n\t\t\t\t<requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\r\n\t\t\t</requestedPrivileges>\r\n\t\t</security>\r\n\t</trustInfo>\r\n\t<!-- This manifest fixes High DPI blurry issue -->\r\n\t<asmv3:application>\r\n\t\t<asmv3:windowsSettings xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">\r\n\t\t\t<dpiAware>true</dpiAware>\r\n\t\t</asmv3:windowsSettings>\r\n\t</asmv3:application>\r\n</assembly>"
  },
  {
    "path": "App/Configuration.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace PDFPatcher {\r\n    using System;\r\n    \r\n    \r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Configuration {\r\n        \r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n        \r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n        \r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Configuration() {\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager {\r\n            get {\r\n                if (object.ReferenceEquals(resourceMan, null)) {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"PDFPatcher.Configuration\", typeof(Configuration).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture {\r\n            get {\r\n                return resourceCulture;\r\n            }\r\n            set {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 书签文本.\r\n        /// </summary>\r\n        internal static string BookmarkText {\r\n            get {\r\n                return ResourceManager.GetString(\"BookmarkText\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 自定义工具栏按钮.\r\n        /// </summary>\r\n        internal static string CustomToolbarButtons {\r\n            get {\r\n                return ResourceManager.GetString(\"CustomToolbarButtons\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 文档属性.\r\n        /// </summary>\r\n        internal static string DocInfo {\r\n            get {\r\n                return ResourceManager.GetString(\"DocInfo\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 正文文本.\r\n        /// </summary>\r\n        internal static string DocText {\r\n            get {\r\n                return ResourceManager.GetString(\"DocText\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 编码方式.\r\n        /// </summary>\r\n        internal static string Encodings {\r\n            get {\r\n                return ResourceManager.GetString(\"Encodings\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 导出图片目录.\r\n        /// </summary>\r\n        internal static string Folders {\r\n            get {\r\n                return ResourceManager.GetString(\"Folders\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 信息文件.\r\n        /// </summary>\r\n        internal static string InfoFiles {\r\n            get {\r\n                return ResourceManager.GetString(\"InfoFiles\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 减少占用内存.\r\n        /// </summary>\r\n        internal static string OptimalMemoryUsage {\r\n            get {\r\n                return ResourceManager.GetString(\"OptimalMemoryUsage\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 优化处理效率.\r\n        /// </summary>\r\n        internal static string OptimalSpeed {\r\n            get {\r\n                return ResourceManager.GetString(\"OptimalSpeed\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 处理选项.\r\n        /// </summary>\r\n        internal static string Options {\r\n            get {\r\n                return ResourceManager.GetString(\"Options\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 路径.\r\n        /// </summary>\r\n        internal static string Path {\r\n            get {\r\n                return ResourceManager.GetString(\"Path\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to PDF读取方式.\r\n        /// </summary>\r\n        internal static string PdfLoadMode {\r\n            get {\r\n                return ResourceManager.GetString(\"PdfLoadMode\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to PDF阅读器路径.\r\n        /// </summary>\r\n        internal static string PdfReaderPath {\r\n            get {\r\n                return ResourceManager.GetString(\"PdfReaderPath\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 历史文件.\r\n        /// </summary>\r\n        internal static string RecentFiles {\r\n            get {\r\n                return ResourceManager.GetString(\"RecentFiles\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 替换文本.\r\n        /// </summary>\r\n        internal static string ReplaceItems {\r\n            get {\r\n                return ResourceManager.GetString(\"ReplaceItems\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 配置文件.\r\n        /// </summary>\r\n        internal static string Root {\r\n            get {\r\n                return ResourceManager.GetString(\"Root\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 保存程序配置.\r\n        /// </summary>\r\n        internal static string SaveAppSettings {\r\n            get {\r\n                return ResourceManager.GetString(\"SaveAppSettings\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 查找文本.\r\n        /// </summary>\r\n        internal static string SearchItems {\r\n            get {\r\n                return ResourceManager.GetString(\"SearchItems\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 输入文件.\r\n        /// </summary>\r\n        internal static string SourceFiles {\r\n            get {\r\n                return ResourceManager.GetString(\"SourceFiles\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 目标文件.\r\n        /// </summary>\r\n        internal static string TargetFiles {\r\n            get {\r\n                return ResourceManager.GetString(\"TargetFiles\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to 版本.\r\n        /// </summary>\r\n        internal static string Version {\r\n            get {\r\n                return ResourceManager.GetString(\"Version\", resourceCulture);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "App/Configuration.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <data name=\"BookmarkText\" xml:space=\"preserve\">\r\n    <value>书签文本</value>\r\n  </data>\r\n  <data name=\"CustomToolbarButtons\" xml:space=\"preserve\">\r\n    <value>自定义工具栏按钮</value>\r\n  </data>\r\n  <data name=\"DocInfo\" xml:space=\"preserve\">\r\n    <value>文档属性</value>\r\n  </data>\r\n  <data name=\"DocText\" xml:space=\"preserve\">\r\n    <value>正文文本</value>\r\n  </data>\r\n  <data name=\"Encodings\" xml:space=\"preserve\">\r\n    <value>编码方式</value>\r\n  </data>\r\n  <data name=\"Folders\" xml:space=\"preserve\">\r\n    <value>导出图片目录</value>\r\n  </data>\r\n  <data name=\"InfoFiles\" xml:space=\"preserve\">\r\n    <value>信息文件</value>\r\n  </data>\r\n  <data name=\"OptimalMemoryUsage\" xml:space=\"preserve\">\r\n    <value>减少占用内存</value>\r\n  </data>\r\n  <data name=\"OptimalSpeed\" xml:space=\"preserve\">\r\n    <value>优化处理效率</value>\r\n  </data>\r\n  <data name=\"Options\" xml:space=\"preserve\">\r\n    <value>处理选项</value>\r\n  </data>\r\n  <data name=\"Path\" xml:space=\"preserve\">\r\n    <value>路径</value>\r\n  </data>\r\n  <data name=\"PdfLoadMode\" xml:space=\"preserve\">\r\n    <value>PDF读取方式</value>\r\n  </data>\r\n  <data name=\"PdfReaderPath\" xml:space=\"preserve\">\r\n    <value>PDF阅读器路径</value>\r\n  </data>\r\n  <data name=\"RecentFiles\" xml:space=\"preserve\">\r\n    <value>历史文件</value>\r\n  </data>\r\n  <data name=\"ReplaceItems\" xml:space=\"preserve\">\r\n    <value>替换文本</value>\r\n  </data>\r\n  <data name=\"Root\" xml:space=\"preserve\">\r\n    <value>配置文件</value>\r\n  </data>\r\n  <data name=\"SaveAppSettings\" xml:space=\"preserve\">\r\n    <value>保存程序配置</value>\r\n  </data>\r\n  <data name=\"SearchItems\" xml:space=\"preserve\">\r\n    <value>查找文本</value>\r\n  </data>\r\n  <data name=\"SourceFiles\" xml:space=\"preserve\">\r\n    <value>输入文件</value>\r\n  </data>\r\n  <data name=\"TargetFiles\" xml:space=\"preserve\">\r\n    <value>目标文件</value>\r\n  </data>\r\n  <data name=\"Version\" xml:space=\"preserve\">\r\n    <value>版本</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "App/ConfigurationSerialization.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\nusing PowerJson;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\t[XmlRoot(\"处理选项\")]\r\n\tpublic class ConfigurationSerialization\r\n\t{\r\n\t\t[XmlAttribute(\"检查更新时间\")]\r\n\t\tpublic DateTime CheckUpdateDate { get; set; }\r\n\t\t[XmlAttribute(\"检查更新间隔\")]\r\n\t\tpublic int CheckUpdateInterval { get; set; } = 14;\r\n\r\n\t\t[XmlAttribute(\"保存程序设置\")]\r\n\t\tpublic bool SaveAppSettings { get; set; }\r\n\r\n\t\t[XmlAttribute(\"文档加载模式\")]\r\n\t\tpublic string PdfLoadMode { get; set; }\r\n\r\n\t\t[XmlElement(\"编码设置\")]\r\n\t\tpublic EncodingOptions Encodings { get; set; }\r\n\t\t///<summary>获取导出设置。</summary>\r\n\t\t[XmlElement(\"信息文件导出设置\")]\r\n\t\tpublic ExporterOptions ExporterOptions { get; set; }\r\n\t\t///<summary>获取导入设置。</summary>\r\n\t\t[XmlElement(\"信息文件导入设置\")]\r\n\t\tpublic ImporterOptions ImporterOptions { get; set; }\r\n\t\t///<summary>获取生成文档的设置。</summary>\r\n\t\t[XmlElement(\"PDF文件处理设置\")]\r\n\t\tpublic MergerOptions MergerOptions { get; set; }\r\n\t\t[XmlElement(\"PDF文档设置\")]\r\n\t\tpublic PatcherOptions PatcherOptions { get; set; }\r\n\t\t[XmlElement(\"PDF编辑器设置\")]\r\n\t\tpublic PatcherOptions EditorOptions { get; set; }\r\n\t\t[XmlElement(\"PDF阅读器设置\")]\r\n\t\tpublic ReaderOptions ReaderOptions { get; set; }\r\n\t\t[XmlElement(\"自动生成书签设置\")]\r\n\t\tpublic AutoBookmarkOptions AutoBookmarkOptions { get; set; }\r\n\t\t[XmlElement(\"导出图像设置\")]\r\n\t\tpublic ImageExtracterOptions ImageExporterOptions { get; set; }\r\n\t\t[XmlElement(\"转为图片设置\")]\r\n\t\tpublic MuPDF.ImageRendererOptions ImageRendererOptions { get; set; }\r\n\t\t[XmlElement(\"提取页面设置\")]\r\n\t\tpublic ExtractPageOptions ExtractPageOptions { get; set; }\r\n\t\t[XmlElement(\"文本识别设置\")]\r\n\t\tpublic OcrOptions OcrOptions { get; set; }\r\n\t\t[XmlElement(\"工具栏设置\")]\r\n\t\tpublic ToolbarOptions ToolbarOptions { get; set; }\r\n\t\t[XmlElement(\"窗口设置\")]\r\n\t\tpublic WindowStatus WindowStatus { get; set; }\r\n\r\n\t\t[JsonField(\"最近使用的文档\")]\r\n\t\t[JsonInclude]\r\n\t\t[JsonSerializable]\r\n\t\tinternal AppContext.RecentItems Recent { get; set; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Constants.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing E = System.Text.Encoding;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tinternal enum Function\r\n\t{\r\n\t\tFrontPage, InfoFileOptions, InfoExchanger, ExtractPages, ExtractImages, RenderPages, EditorOptions, Patcher, PatcherOptions, Merger, MergerOptions, About, Editor, Options, BookmarkGenerator, Ocr, Inspector, Rename, Log, Default, CustomizeToolbar\r\n\t}\r\n\r\n\tinternal static class Constants\r\n\t{\r\n\t\tinternal const string AppName = \"PDF 补丁丁\";\r\n\t\tinternal const string AppEngName = \"PDFPatcher\";\r\n\t\tinternal const string AppHomePage = \"http://pdfpatcher.cnblogs.com\";\r\n\t\tinternal const string AppRepository = \"https://github.com/wmjordan/pdfpatcher\";\r\n\t\tinternal const string AppRepository2 = \"https://gitee.com/wmjordan/pdfpatcher\";\r\n\t\tinternal const string AppUpdateFile = \"http://files.cnblogs.com/pdfpatcher/pdfpatcher.update.xml\";\r\n\r\n\t\t/// <summary>\r\n\t\t/// 信息文件根元素。\r\n\t\t/// </summary>\r\n\t\tinternal const string PdfInfo = \"PDF信息\";\r\n\t\tinternal const string InfoDocVersion = \"0.3.3\";\r\n\t\tinternal const string ContentPrefix = \"pdf\";\r\n\t\tinternal const string ContentNamespace = \"pdf:ContentXml\";\r\n\r\n\t\tinternal static class FileExtensions\r\n\t\t{\r\n\t\t\tinternal const string Json = \".json\";\r\n\t\t\tinternal const string JsonFilter = \"程序配置文件 (*.json)|*.json\";\r\n\t\t\tinternal const string Pdf = \".pdf\";\r\n\t\t\tinternal const string PdfFilter = \"PDF 文件 (*.pdf)|*.pdf\";\r\n\t\t\tinternal const string Txt = \".txt\";\r\n\t\t\tinternal const string TxtFilter = \"简易文本书签文件 (*.txt)|*.txt\";\r\n\t\t\tinternal const string Xml = \".xml\";\r\n\t\t\tinternal const string XmlFilter = \"PDF 信息文件 (*.xml)|*.xml\";\r\n\t\t\tinternal const string PdfOrXmlFilter = \"PDF 文件或信息文件 (*.pdf, *.xml)|*.pdf;*.xml\";\r\n\t\t\tinternal const string XmlOrTxtFilter = \"书签文件 (*.xml, *.txt)|*.xml;*.txt\";\r\n\t\t\tinternal const string AllEditableFilter = \"所有包含 PDF 信息的文件(*.pdf,*.xml,*.txt)|*.pdf;*.xml;*.txt|\" + PdfFilter + \"|\" + XmlFilter + \"|\" + TxtFilter;\r\n\t\t\tinternal const string AllFilter = \"所有文件|*.*\";\r\n\t\t\tinternal const string ImageFilter = \"图片文件 (*.jpg, *.jpeg, *.tiff, *.tif, *.png, *.gif)|*.jpg;*.jpeg;*.tiff;*.tif;*.png;*.gif\";\r\n\t\t\tinternal const string Tif = \".tif\";\r\n\t\t\tinternal const string Tiff = \".tiff\";\r\n\t\t\tinternal const string Jpg = \".jpg\";\r\n\t\t\tinternal const string Jpeg = \".jpeg\";\r\n\t\t\tinternal const string Png = \".png\";\r\n\t\t\tinternal const string Gif = \".gif\";\r\n\t\t\tinternal const string Jp2 = \".jp2\";\r\n\t\t\tinternal const string Bmp = \".bmp\";\r\n\t\t\tinternal const string Dat = \".dat\";\r\n\t\t\tinternal const string Tmp = \".tmp\";\r\n\t\t\tinternal const string Ttf = \".ttf\";\r\n\t\t\tinternal const string Ttc = \".ttc\";\r\n\t\t\tinternal const string Otf = \".otf\";\r\n\t\t\tinternal readonly static string[] AllBookmarkExtension = { \".xml\", \".txt\" };\r\n\t\t\tinternal readonly static string[] PdfAndAllBookmarkExtension = { \".pdf\", \".xml\", \".txt\" };\r\n\t\t\tinternal readonly static string[] AllSupportedImageExtension = { Tif, Jpg, Png, Gif, Tiff, Jpeg, Bmp, Jp2 };\r\n\t\t}\r\n\r\n\t\t#region 功能名称\r\n\t\tstatic class Functions\r\n\t\t{\r\n\t\t\tinternal const string FrontPage = \"FrontPage\";\r\n\t\t\tinternal const string Patcher = \"Patcher\";\r\n\t\t\tinternal const string Merger = \"Merger\";\r\n\t\t\tinternal const string ImageExtractor = \"ImageExtractor\";\r\n\t\t\tinternal const string PageExtractor = \"PageExtractor\";\r\n\t\t\tinternal const string PageRenderer = \"PageRenderer\";\r\n\t\t\tinternal const string BookmarkEditor = \"BookmarkEditor\";\r\n\t\t\tinternal const string BookmarkGenerator = \"BookmarkGenerator\";\r\n\t\t\tinternal const string Ocr = \"Ocr\";\r\n\t\t\tinternal const string Inspector = \"Inspector\";\r\n\t\t\tinternal const string Log = \"Log\";\r\n\t\t\tinternal const string About = \"About\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region PDF 对象类型\r\n\t\tinternal static class ObjectTypes\r\n\t\t{\r\n\t\t\tinternal static readonly string[] Names = { \"字典\", \"名称\", \"数值\", \"文本\", \"数组\", \"布尔\", \"引用\" };\r\n\t\t\tinternal static readonly int[] IDs = { PdfObject.DICTIONARY, PdfObject.NAME, PdfObject.NUMBER, PdfObject.STRING, PdfObject.ARRAY, PdfObject.BOOLEAN, PdfObject.INDIRECT };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 文件名替代符\r\n\t\tinternal static class FileNameMacros\r\n\t\t{\r\n\t\t\tinternal const string FileName = \"<源文件名>\";\r\n\t\t\tinternal const string FolderName = \"<源目录名>\";\r\n\t\t\tinternal const string PathName = \"<源目录路径>\";\r\n\t\t\tinternal const string TitleProperty = \"<\" + Info.Title + \">\";\r\n\t\t\tinternal const string AuthorProperty = \"<\" + Info.Author + \">\";\r\n\t\t\tinternal const string SubjectProperty = \"<\" + Info.Subject + \">\";\r\n\t\t\tinternal const string KeywordsProperty = \"<\" + Info.Keywords + \">\";\r\n\t\t\tinternal const string PageCount = \"<页数>\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 度量单位\r\n\t\tinternal static class Units\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"度量单位\";\r\n\t\t\tinternal const string Unit = \"单位\";\r\n\t\t\tinternal const string Point = \"点\";\r\n\t\t\tinternal const string CM = \"厘米\";\r\n\t\t\tinternal const string MM = \"毫米\";\r\n\t\t\tinternal const string Inch = \"英寸\";\r\n\t\t\tinternal const float CmToPoint = 72f / 2.54f;\r\n\t\t\tinternal const float MmToPoint = 7.2f / 2.54f;\r\n\t\t\tinternal const float DefaultDpi = 72f;\r\n\t\t\tinternal static readonly string[] Names = { CM, MM, Inch, Point };\r\n\t\t\tinternal static readonly float[] Factors = { CmToPoint, MmToPoint, DefaultDpi, 1 };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 对齐方式\r\n\t\tinternal static class Alignments\r\n\t\t{\r\n\t\t\tinternal static readonly string[] HorizontalAlignments = { \"左对齐\", \"水平居中\", \"右对齐\" };\r\n\t\t\tinternal static readonly string[] VerticalAlignments = { \"置顶\", \"垂直居中\", \"置底\" };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 方位\r\n\t\tinternal static class Coordinates\r\n\t\t{\r\n\t\t\tinternal const string Left = \"左\";\r\n\t\t\tinternal const string Right = \"右\";\r\n\t\t\tinternal const string Top = \"上\";\r\n\t\t\tinternal const string Bottom = \"下\";\r\n\t\t\tinternal const string Width = \"宽\";\r\n\t\t\tinternal const string Height = \"高\";\r\n\t\t\tinternal const string Direction = \"方向\";\r\n\t\t\tinternal const string Horizontal = \"横向\";\r\n\t\t\tinternal const string Vertical = \"纵向\";\r\n\t\t\tinternal const string ScaleFactor = \"比例\";\r\n\t\t\tinternal const string Unchanged = \"保持不变\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 编码\r\n\t\tinternal static class Encoding\r\n\t\t{\r\n\t\t\tinternal const string SystemDefault = \"系统默认\";\r\n\t\t\tinternal const string Automatic = \"自动选择\";\r\n\t\t\tinternal static readonly string[] EncodingNames = { Automatic,\r\n\t\t\t\tSystemDefault,\r\n\t\t\t\t\"UTF-16 Big Endian\",\r\n\t\t\t\t\"UTF-16 Little Endian\",\r\n\t\t\t\t\"UTF-8\",\r\n\t\t\t\t\"GB18030\",\r\n\t\t\t\t\"BIG5\" };\r\n\t\t\tinternal static readonly E[] Encodings = { null,\r\n\t\t\t\tE.Default,\r\n\t\t\t\tE.BigEndianUnicode,\r\n\t\t\t\tE.Unicode,\r\n\t\t\t\tE.UTF8,\r\n\t\t\t\tE.GetEncoding (\"gb18030\"),\r\n\t\t\t\tE.GetEncoding (\"big5\") };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 文档信息\r\n\t\tinternal static class Info\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"文档信息\";\r\n\r\n\t\t\tinternal const string ProductName = \"程序名称\";\r\n\t\t\tinternal const string ProductVersion = \"程序版本\";\r\n\t\t\tinternal const string ExportDate = \"导出时间\";\r\n\t\t\tinternal const string DocumentName = \"PDF文件名\";\r\n\t\t\tinternal const string DocumentPath = \"PDF文件位置\";\r\n\t\t\tinternal const string PageNumber = \"页数\";\r\n\t\t\tinternal const string Title = \"标题\";\r\n\t\t\tinternal const string Author = \"作者\";\r\n\t\t\tinternal const string Subject = \"主题\";\r\n\t\t\tinternal const string Keywords = \"关键字\";\r\n\t\t\tinternal const string Creator = \"创建程序\";\r\n\t\t\tinternal const string Producer = \"处理程序\";\r\n\t\t\tinternal const string CreationDate = \"创建日期\";\r\n\t\t\tinternal const string ModDate = \"最近修改日期\";\r\n\t\t\tinternal const string MetaData = \"XML元数据\";\r\n\t\t}\r\n\t\tinternal const string Version = \"PDF版本\";\r\n\t\tinternal const string Catalog = \"文档编录\";\r\n\t\tinternal const string Body = \"正文内容\";\r\n\t\tinternal const string DocumentBookmark = \"文档书签\";\r\n\t\t#endregion\r\n\r\n\t\t#region 阅读器设定\r\n\t\tinternal const string PageLayout = \"页面布局\";\r\n\t\tinternal static class PageLayoutType\r\n\t\t{\r\n\t\t\tinternal static readonly string[] Names = { \"保持不变\",\r\n\t\t\t\t\t\t\t\t\t\t\t \"单页连续\", \"双页连续\", \"双页连续首页独置\",\r\n\t\t\t\t\t\t\t\t\t\t\t \"单页\", \"双页\", \"双页首页独置\" };\r\n\t\t\tinternal static readonly PdfName[] PdfNames = { PdfName.NONE,\r\n\t\t\t\t\t\t\t\t\t\t\t PdfName.ONECOLUMN, PdfName.TWOCOLUMNLEFT, PdfName.TWOCOLUMNRIGHT,\r\n\t\t\t\t\t\t\t\t\t\t\t PdfName.SINGLEPAGE, PdfName.TWOPAGELEFT, PdfName.TWOPAGERIGHT };\r\n\t\t}\r\n\t\tinternal const string PageMode = \"初始模式\";\r\n\t\tinternal static class PageModes\r\n\t\t{\r\n\t\t\tinternal static readonly string[] Names = { \"保持不变\",\r\n\t\t\t\t\t\t\t\t\t\t\t \"不显示边栏\", \"显示文档书签\", \"显示页面缩略图\",\r\n\t\t\t\t\t\t\t\t\t\t\t \"全屏显示\", \"显示可选内容组\", \"显示附件栏\" };\r\n\t\t\tinternal static readonly PdfName[] PdfNames = { PdfName.NONE,\r\n\t\t\t\t\t\t\t\t\t\t\t PdfName.USENONE, PdfName.USEOUTLINES, PdfName.USETHUMBS,\r\n\t\t\t\t\t\t\t\t\t\t\t PdfName.FULLSCREEN, PdfName.USEOC, PdfName.USEATTACHMENTS };\r\n\t\t}\r\n\t\tinternal const string ViewerPreferences = \"阅读器设定\";\r\n\t\tinternal static class ViewerPreferencesType\r\n\t\t{\r\n\t\t\tinternal static readonly string[] Names = { \"隐藏菜单\", \"隐藏工具栏\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t \"只显示文档内容\", \"窗口适合文档首页\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t \"窗口居中\", \"显示文档标题\" };\r\n\t\t\tinternal static readonly PdfName[] PdfNames = { PdfName.HIDEMENUBAR, PdfName.HIDETOOLBAR,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t PdfName.HIDEWINDOWUI, PdfName.FITWINDOW,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t PdfName.CENTERWINDOW, PdfName.DISPLAYDOCTITLE };\r\n\t\t\tinternal const string Direction = \"阅读方向\";\r\n\t\t\tinternal static class DirectionType\r\n\t\t\t{\r\n\t\t\t\tinternal static readonly string[] Names = { \"保持不变\", \"从左到右\", \"从右到左\" };\r\n\t\t\t\tinternal static readonly PdfName[] PdfNames = { PdfName.NONE, PdfName.L2R, PdfName.R2L };\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 页码样式\r\n\t\tinternal const string PageLabels = \"页码样式\";\r\n\t\tinternal static class PageLabelStyles\r\n\t\t{\r\n\t\t\tinternal static readonly string[] Names = { \"数字\", \"大写罗马数字\", \"小写罗马数字\", \"大写英文字母\", \"小写英文字母\", \"无\" };\r\n\t\t\tinternal static readonly char[] PdfValues = { 'D', 'R', 'r', 'A', 'a', '-' };\r\n\t\t\tinternal static readonly char[] SimpleInfoIdentifiers = { '0', 'I', 'i', 'A', 'a', '-' };\r\n\t\t\tinternal static readonly int[] Values = {\r\n\t\t\t\tPdfPageLabels.DECIMAL_ARABIC_NUMERALS,\r\n\t\t\t\tPdfPageLabels.UPPERCASE_ROMAN_NUMERALS,\r\n\t\t\t\tPdfPageLabels.LOWERCASE_ROMAN_NUMERALS,\r\n\t\t\t\tPdfPageLabels.UPPERCASE_LETTERS,\r\n\t\t\t\tPdfPageLabels.LOWERCASE_LETTERS,\r\n\t\t\t\tPdfPageLabels.EMPTY,\r\n\t\t\t};\r\n\t\t}\r\n\t\tinternal static class PageLabelsAttributes\r\n\t\t{\r\n\t\t\tinternal const string PageNumber = \"实际页码\";\r\n\t\t\tinternal const string StartPage = \"起始页码\";\r\n\t\t\tinternal const string Prefix = \"页码前缀\";\r\n\t\t\tinternal const string Style = \"样式\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 页面内容\r\n\t\tinternal static class Content\r\n\t\t{\r\n\t\t\tinternal const string Page = \"页面\";\r\n\t\t\tinternal const string PageNumber = \"页码\";\r\n\t\t\tinternal const string ResourceID = \"资源编号\";\r\n\t\t\tinternal const string RefType = \"引用对象类型\";\r\n\t\t\tinternal const string Texts = \"文本内容\";\r\n\t\t\tinternal const string Operators = \"命令\";\r\n\t\t\tinternal const string Operands = \"参数\";\r\n\t\t\tinternal const string Name = \"名称\";\r\n\t\t\tinternal const string Item = \"项目\";\r\n\t\t\tinternal const string Path = \"路径\";\r\n\t\t\tinternal const string Type = \"类型\";\r\n\t\t\tinternal const string Length = \"长度\";\r\n\t\t\tinternal const string Raw = \"原始内容\";\r\n\t\t\tinternal const string Value = \"值\";\r\n\t\t\tinternal static class PageSettings\r\n\t\t\t{\r\n\t\t\t\tinternal const string ThisName = \"页面设置\";\r\n\t\t\t\tinternal const string MediaBox = \"页面边框\";\r\n\t\t\t\tinternal const string CropBox = \"截取边框\";\r\n\t\t\t\tinternal const string TrimBox = \"裁剪边框\";\r\n\t\t\t\tinternal const string ArtBox = \"内容边框\";\r\n\t\t\t\tinternal const string BleedBox = \"出血边框\";\r\n\t\t\t\tinternal const string Rotation = \"旋转角度\";\r\n\t\t\t}\r\n\t\t\tinternal static class OperandNames\r\n\t\t\t{\r\n\t\t\t\tinternal const string Matrix = \"矩阵\";\r\n\t\t\t\tinternal const string ResourceName = \"资源名称\";\r\n\t\t\t\tinternal const string Size = \"尺寸\";\r\n\t\t\t\tinternal const string Text = \"文本\";\r\n\t\t\t}\r\n\t\t\tinternal static class RotationDirections\r\n\t\t\t{\r\n\t\t\t\tinternal const string ThisName = PageSettings.Rotation;\r\n\t\t\t\tinternal const string Zero = \"保持不变\";\r\n\t\t\t\tinternal const string Right = \"顺时针90度\";\r\n\t\t\t\tinternal const string HalfClock = \"180度\";\r\n\t\t\t\tinternal const string Left = \"逆时针90度\";\r\n\t\t\t\tinternal static readonly string[] Names = { Zero, Right, HalfClock, Left };\r\n\t\t\t\tinternal static readonly int[] Values = { 0, 90, 180, 270 };\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 页码范围\r\n\t\tinternal const string PageRange = \"页码范围\";\r\n\t\tinternal static class PageFilterTypes\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"页码筛选\";\r\n\t\t\tinternal const string AllPages = \"所有页\";\r\n\t\t\tinternal static readonly string[] Names = { AllPages, \"单数页\", \"双数页\" };\r\n\t\t\tinternal static readonly int[] Values = { -1, 1, 0 };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 目标\r\n\t\tinternal const string NamedDestination = \"命名位置\";\r\n\t\tinternal static class DestinationAttributes\r\n\t\t{\r\n\t\t\tinternal const string Page = \"页码\";\r\n\t\t\tinternal const string FirstPageNumber = \"首页页码\";\r\n\t\t\tinternal const string Action = \"动作\";\r\n\t\t\tinternal const string NewWindow = \"新窗口\";\r\n\t\t\tinternal const string Path = \"路径\";\r\n\t\t\tinternal const string Name = \"名称\";\r\n\t\t\tinternal const string Named = \"命名位置\";\r\n\t\t\tinternal const string NamedN = \"PDF名称\";\r\n\t\t\tinternal const string View = \"显示方式\";\r\n\t\t\tinternal const string ScriptContent = \"脚本内容\";\r\n\t\t\tinternal static class ViewType\r\n\t\t\t{\r\n\t\t\t\tinternal const string XYZ = \"坐标缩放\";\r\n\t\t\t\tinternal const string Fit = \"适合页面\";\r\n\t\t\t\tinternal const string FitH = \"适合页宽\";\r\n\t\t\t\tinternal const string FitV = \"适合页高\";\r\n\t\t\t\tinternal const string FitB = \"适合窗口\";\r\n\t\t\t\tinternal const string FitBH = \"适合窗口宽度\";\r\n\t\t\t\tinternal const string FitBV = \"适合窗口高度\";\r\n\t\t\t\tinternal const string FitR = \"适合区域\";\r\n\t\t\t\tinternal static readonly string[] Names = { XYZ, Fit, FitH, FitV, FitB, FitBH, FitBV, FitR };\r\n\t\t\t\tinternal static readonly PdfName[] PdfNames = { PdfName.XYZ, PdfName.FIT, PdfName.FITH, PdfName.FITV, PdfName.FITB, PdfName.FITBH, PdfName.FITBV, PdfName.FITR };\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal static class ActionType\r\n\t\t{\r\n\t\t\tinternal const string Goto = \"转到页面\";\r\n\t\t\tinternal const string GotoR = \"打开外部PDF文档\";\r\n\t\t\tinternal const string Launch = \"启动程序\";\r\n\t\t\tinternal const string Uri = \"打开网址\";\r\n\t\t\tinternal const string Javascript = \"执行脚本\";\r\n\t\t\tinternal static readonly string[] Names = { Goto, GotoR, Launch, Uri, Javascript };\r\n\t\t\tinternal static readonly PdfName[] PdfNames = { PdfName.GOTO, PdfName.GOTOR, PdfName.LAUNCH, PdfName.URI, PdfName.JAVASCRIPT };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 书签\r\n\t\tinternal const string Bookmark = \"书签\";\r\n\t\tinternal static class BookmarkAttributes\r\n\t\t{\r\n\t\t\tinternal const string Title = \"文本\";\r\n\t\t\tinternal const string Open = \"默认打开\";\r\n\t\t\tinternal const string Style = \"样式\";\r\n\t\t\tinternal static class StyleType\r\n\t\t\t{\r\n\t\t\t\tinternal const string Normal = \"常规\";\r\n\t\t\t\tinternal const string Bold = \"粗体\";\r\n\t\t\t\tinternal const string BoldItalic = \"粗斜体\";\r\n\t\t\t\tinternal const string Italic = \"斜体\";\r\n\t\t\t\tinternal static readonly string[] Names = { Normal, Italic, Bold, BoldItalic };\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal const string Color = \"颜色\";\r\n\t\tinternal static class Colors\r\n\t\t{\r\n\t\t\tinternal const string Red = \"红\";\r\n\t\t\tinternal const string Green = \"绿\";\r\n\t\t\tinternal const string Blue = \"蓝\";\r\n\t\t\tinternal const string Gray = \"灰度\";\r\n\t\t\tinternal const string Transparent = \"透明\";\r\n\t\t\tinternal const string Cyan = \"青\";\r\n\t\t\tinternal const string Magenta = \"紫\";\r\n\t\t\tinternal const string Yellow = \"黄\";\r\n\t\t\tinternal const string Black = \"黑\";\r\n\t\t}\r\n\t\tinternal static class Boolean\r\n\t\t{\r\n\t\t\tinternal const string True = \"是\";\r\n\t\t\tinternal const string False = \"否\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 页面链接\r\n\t\tinternal const string PageLink = \"页面链接\";\r\n\t\tinternal static class PageLinkAttributes\r\n\t\t{\r\n\t\t\tinternal const string Link = \"链接\";\r\n\t\t\tinternal const string LinkAction = \"链接动作\";\r\n\t\t\tinternal const string PageNumber = \"页码\";\r\n\t\t\tinternal const string Border = \"边框\";\r\n\t\t\tinternal const string Style = \"点击效果\";\r\n\t\t\tinternal const string QuadPoints = \"四边形坐标\";\r\n\t\t\tinternal const string Contents = \"文本\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 光学字符识别\r\n\t\tinternal static class Ocr\r\n\t\t{\r\n\t\t\tinternal const int NoLanguage = 0;\r\n\t\t\tinternal const int SimplifiedChineseLangID = 2052;\r\n\t\t\tinternal const int TraditionalChineseLangID = 1028;\r\n\t\t\tinternal const int JapaneseLangID = 1041;\r\n\t\t\tinternal const int KoreanLangID = 1042;\r\n\t\t\tinternal const int EnglishLangID = 1033;\r\n\r\n\t\t\tinternal const int DanishLangID = 1030;\r\n\t\t\tinternal const int DutchLangID = 1043;\r\n\t\t\tinternal const int FinnishLangID = 1035;\r\n\t\t\tinternal const int FrenchLangID = 1036;\r\n\t\t\tinternal const int GermanLangID = 1031;\r\n\t\t\tinternal const int ItalianLangID = 1040;\r\n\t\t\tinternal const int NorskLangID = 1044;\r\n\t\t\tinternal const int PortugueseLangID = 1046;\r\n\t\t\tinternal const int SpanishLangID = 3082;\r\n\t\t\tinternal const int SwedishLangID = 1053;\r\n\t\t\tinternal const int CzechLangID = 1029;\r\n\t\t\tinternal const int PolishLangID = 1045;\r\n\t\t\tinternal const int HungarianLangID = 1038;\r\n\t\t\tinternal const int GreekLangID = 1032;\r\n\t\t\tinternal const int RussianLangID = 1049;\r\n\t\t\tinternal const int TurkishLangID = 1055;\r\n\r\n\t\t\tinternal static int[] LangIDs = { SimplifiedChineseLangID, TraditionalChineseLangID, EnglishLangID, JapaneseLangID, KoreanLangID, DanishLangID, DutchLangID, FinnishLangID, FrenchLangID, GermanLangID, ItalianLangID, NorskLangID, PortugueseLangID, SpanishLangID, SwedishLangID, CzechLangID, PolishLangID, HungarianLangID, GreekLangID, RussianLangID, TurkishLangID };\r\n\t\t\tinternal static int[] OcrLangIDs = { SimplifiedChineseLangID, TraditionalChineseLangID, 9, 17, 18, 6, 19, 11, 12, 7, 16, 20, 22, 10, 29, 5, 21, 14, 8, 25, 31 };\r\n\t\t\tinternal static string[] LangNames = { \"简体中文\", \"繁体中文\", \"英文\", \"日文\", \"韩文\", \"丹麦文\", \"荷兰文\", \"芬兰文\", \"法文\", \"德文\", \"意大利文\", \"挪威文\", \"葡萄牙文\", \"西班牙文\", \"瑞典文\", \"捷克文\", \"波兰文\", \"匈牙利文\", \"希腊文\", \"俄文\", \"土耳其文\" };\r\n\t\t\tinternal const string Result = \"识别结果\";\r\n\t\t\tinternal const string Text = \"文本\";\r\n\t\t\tinternal const string Content = \"内容\";\r\n\t\t\tinternal const string Image = \"图片\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 字体属性\r\n\t\tinternal static class Font\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"字体\";\r\n\t\t\tinternal const string DocumentFont = \"文档字体\";\r\n\t\t\tinternal const string ID = \"编号\";\r\n\t\t\tinternal const string Name = \"名称\";\r\n\t\t\tinternal const string Size = \"文本尺寸\";\r\n\t\t}\r\n\t\tinternal static class FontOccurrence\r\n\t\t{\r\n\t\t\tinternal const string Count = \"出现次数\";\r\n\t\t\tinternal const string FirstText = \"首次出现文本\";\r\n\t\t\tinternal const string FirstPage = \"首次出现页码\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 导出为图片\r\n\t\tinternal static class ColorSpaces\r\n\t\t{\r\n\t\t\tinternal const string Rgb = \"DeviceRGB\";\r\n\t\t\tinternal const string Bgr = \"DeviceBGR\";\r\n\t\t\tinternal const string Cmyk = \"DeviceCMYK\";\r\n\t\t\tinternal const string Gray = \"DeviceGray\";\r\n\t\t\tinternal static string[] Names = { Rgb, Gray };\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 超星命名规则\r\n\t\tinternal static class CajNaming\r\n\t\t{\r\n\t\t\tinternal const string Cover = \"cov\";\r\n\t\t\tinternal const string TitlePage = \"bok\";\r\n\t\t\tinternal const string CopyrightPage = \"leg\";\r\n\t\t\tinternal const string Foreword = \"fow\";\r\n\t\t\tinternal const string Contents = \"!\";\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tinternal static class AutoBookmark\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"自动书签\";\r\n\t\t\tinternal const string Group = \"条件集合\";\r\n\t\t\tinternal const string Name = \"名称\";\r\n\t\t\tinternal const string Description = \"说明\";\r\n\t\t\tinternal const string IsInclusive = \"正向过滤\";\r\n\r\n\t\t}\r\n\r\n\t\tinternal static class Chinese {\r\n\t\t\tpublic const string Simplified = \"皑蔼碍爱翱袄奥坝罢摆败颁办绊帮绑镑谤剥饱宝报鲍辈贝钡狈备惫绷笔毕毙闭边编贬变辩辫鳖瘪濒滨宾摈饼拨钵铂驳卜补参蚕残惭惨灿苍舱仓沧厕侧册测层诧搀掺蝉馋谗缠铲产阐颤场尝长偿肠厂畅钞车彻尘陈衬撑称惩诚骋痴迟驰耻齿炽冲虫宠畴踌筹绸丑橱厨锄雏础储触处传疮闯创锤纯绰辞词赐聪葱囱从丛凑窜错达带贷担单郸掸胆惮诞弹当挡党荡档捣岛祷导盗灯邓敌涤递缔点垫电淀钓调迭谍叠钉顶锭订东动栋冻斗犊独读赌镀锻断缎兑队对吨顿钝夺鹅额讹恶饿儿尔饵贰发罚阀珐矾钒烦范贩饭访纺飞废费纷坟奋愤粪丰枫锋风疯冯缝讽凤肤辐抚辅赋复负讣妇缚该钙盖干赶秆赣冈刚钢纲岗皋镐搁鸽阁铬个给龚宫巩贡钩沟构购够蛊顾剐关观馆惯贯广规硅归龟闺轨诡柜贵刽辊滚锅国过骇韩汉阂鹤贺横轰鸿红后壶护沪户哗华画划话怀坏欢环还缓换唤痪焕涣黄谎挥辉毁贿秽会烩汇讳诲绘荤浑伙获货祸击机积饥讥鸡绩缉极辑级挤几蓟剂济计记际继纪夹荚颊贾钾价驾歼监坚笺间艰缄茧检碱硷拣捡简俭减荐槛鉴践贱见键舰剑饯渐溅涧浆蒋桨奖讲酱胶浇骄娇搅铰矫侥脚饺缴绞轿较秸阶节茎惊经颈静镜径痉竞净纠厩旧驹举据锯惧剧鹃绢杰洁结诫届紧锦仅谨进晋烬尽劲荆觉决诀绝钧军骏开凯颗壳课垦恳抠库裤夸块侩宽矿旷况亏岿窥馈溃扩阔蜡腊莱来赖蓝栏拦篮阑兰澜谰揽览懒缆烂滥捞劳涝乐镭垒类泪篱离里鲤礼丽厉励砾历沥隶俩联莲连镰怜涟帘敛脸链恋炼练粮凉两辆谅疗辽镣猎临邻鳞凛赁龄铃凌灵岭领馏刘龙聋咙笼垄拢陇楼娄搂篓芦卢颅庐炉掳卤虏鲁赂禄录陆驴吕铝侣屡缕虑滤绿峦挛孪滦乱抡轮伦仑沦纶论萝罗逻锣箩骡骆络妈玛码蚂马骂吗买麦卖迈脉瞒馒蛮满谩猫锚铆贸么霉没镁门闷们锰梦谜弥觅绵缅庙灭悯闽鸣铭谬谋亩钠纳难挠脑恼闹馁腻撵捻酿鸟聂啮镊镍柠狞宁拧泞钮纽脓浓农疟诺欧鸥殴呕沤盘庞国爱赔喷鹏骗飘频贫苹凭评泼颇扑铺朴谱脐齐骑岂启气弃讫牵扦钎铅迁签谦钱钳潜浅谴堑枪呛墙蔷强抢锹桥乔侨翘窍窃钦亲轻氢倾顷请庆琼穷趋区躯驱龋颧权劝却鹊让饶扰绕热韧认纫荣绒软锐闰润洒萨鳃赛伞丧骚扫涩杀纱筛晒闪陕赡缮伤赏烧绍赊摄慑设绅审婶肾渗声绳胜圣师狮湿诗尸时蚀实识驶势释饰视试寿兽枢输书赎属术树竖数帅双谁税顺说硕烁丝饲耸怂颂讼诵擞苏诉肃虽绥岁孙损笋缩琐锁獭挞抬摊贪瘫滩坛谭谈叹汤烫涛绦腾誊锑题体屉条贴铁厅听烃铜统头图涂团颓蜕脱鸵驮驼椭洼袜弯湾顽万网韦违围为潍维苇伟伪纬谓卫温闻纹稳问瓮挝蜗涡窝呜钨乌诬无芜吴坞雾务误锡牺袭习铣戏细虾辖峡侠狭厦锨鲜纤咸贤衔闲显险现献县馅羡宪线厢镶乡详响项萧销晓啸蝎协挟携胁谐写泻谢锌衅兴汹锈绣虚嘘须许绪续轩悬选癣绚学勋询寻驯训讯逊压鸦鸭哑亚讶阉烟盐严颜阎艳厌砚彦谚验鸯杨扬疡阳痒养样瑶摇尧遥窑谣药爷页业叶医铱颐遗仪彝蚁艺亿忆义诣议谊译异绎荫阴银饮樱婴鹰应缨莹萤营荧蝇颖哟拥佣痈踊咏涌优忧邮铀犹游诱舆鱼渔娱与屿语吁御狱誉预驭鸳渊辕园员圆缘远愿约跃钥岳粤悦阅云郧匀陨运蕴酝晕韵杂灾载攒暂赞赃脏凿枣灶责择则泽贼赠扎札轧铡闸诈斋债毡盏斩辗崭栈战绽张涨帐账胀赵蛰辙锗这贞针侦诊镇阵挣睁狰帧郑证织职执纸挚掷帜质钟终种肿众诌轴皱昼骤猪诸诛烛瞩嘱贮铸筑驻专砖转赚桩庄装妆壮状锥赘坠缀谆浊兹资渍踪综总纵邹诅组钻致钟么为只凶准启板里雳余链泄\";\r\n\t\t\tpublic const string Traditional = \"皚藹礙愛翺襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊繃筆畢斃閉邊編貶變辯辮鼈癟瀕濱賓擯餅撥缽鉑駁蔔補參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟産闡顫場嘗長償腸廠暢鈔車徹塵陳襯撐稱懲誠騁癡遲馳恥齒熾沖蟲寵疇躊籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨蕩檔搗島禱導盜燈鄧敵滌遞締點墊電澱釣調叠諜疊釘頂錠訂東動棟凍鬥犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩範販飯訪紡飛廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦複負訃婦縛該鈣蓋幹趕稈贛岡剛鋼綱崗臯鎬擱鴿閣鉻個給龔宮鞏貢鈎溝構購夠蠱顧剮關觀館慣貫廣規矽歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴彙諱誨繪葷渾夥獲貨禍擊機積饑譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較稭階節莖驚經頸靜鏡徑痙競淨糾廄舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離裏鯉禮麗厲勵礫曆瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴淩靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿麽黴沒鎂門悶們錳夢謎彌覓綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒膩攆撚釀鳥聶齧鑷鎳檸獰甯擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐國愛賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪樸譜臍齊騎豈啓氣棄訖牽扡釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽傘喪騷掃澀殺紗篩曬閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖綏歲孫損筍縮瑣鎖獺撻擡攤貪癱灘壇譚談歎湯燙濤縧騰謄銻題體屜條貼鐵廳聽烴銅統頭圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍爲濰維葦偉僞緯謂衛溫聞紋穩問甕撾蝸渦窩嗚鎢烏誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈鍁鮮纖鹹賢銜閑顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶鏽繡虛噓須許緒續軒懸選癬絢學勳詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顔閻豔厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠藥爺頁業葉醫銥頤遺儀彜蟻藝億憶義詣議誼譯異繹蔭陰銀飲櫻嬰鷹應纓瑩螢營熒蠅穎喲擁傭癰踴詠湧優憂郵鈾猶遊誘輿魚漁娛與嶼語籲禦獄譽預馭鴛淵轅園員圓緣遠願約躍鑰嶽粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓髒鑿棗竈責擇則澤賊贈紮劄軋鍘閘詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙幀鄭證織職執紙摯擲幟質鍾終種腫衆謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝妝壯狀錐贅墜綴諄濁茲資漬蹤綜總縱鄒詛組鑽緻鐘麼為隻兇準啟闆裡靂餘鍊洩\";\r\n\t\t}\r\n\t}\r\n\r\n\tinternal static class Messages\r\n\t{\r\n\t\tinternal const string Welcome = \"PDF 补丁丁——解除 PDF 文档的烦恼\";\r\n\t\tinternal const string SourceFileNotFound = \"源 PDF 文件不存在，请先指定有效的源 PDF 文件。\";\r\n\t\tinternal const string InfoDocNotFound = \"信息文件不存在，请先指定有效的信息文件。\";\r\n\t\tinternal const string TargetFileNotSpecified = \"请指定输出 PDF 文件的路径。\";\r\n\t\tinternal const string InfoDocNotSpecified = \"请指定输出信息文件的路径。\";\r\n\t\tinternal const string SourceFileNameInvalid = \"源 PDF 文件名无效。\";\r\n\t\tinternal const string TargetFileNameInvalid = \"输出 PDF 文件名无效。\";\r\n\t\tinternal const string InfoFileNameInvalid = \"信息文件的文件名无效。\";\r\n\t\tinternal const string SourceFileEqualsTargetFile = \"输入 PDF 文件和输出 PDF 文件的文件名不能相同。\";\r\n\t\tinternal const string PasswordInvalid = \"输入的密码错误，无法打开 PDF 文档。\";\r\n\t\tinternal const string UserRightRequired = \"此 PDF 文件的作者设置了修改文件的权限控制。\\n如果您继续操作，您必须得到创建者对该文档进行修改的授权。\\n如果您不能保证自己有权修改此文档，请按“取消”键退出，否则您需要承担修改此文档带来的一切责任。\\n\\n按住 Ctrl 键点击“确定”按钮，在本次使用过程中将不再提示权限问题。\";\r\n\t\tinternal const string PageRanges = \"在此输入需要处理的页码范围。\\n如：“1-100”表示处理第1～100页。\\n如有多个页码范围，可用空格、分号或逗号分开。\\n如：“1-10;12;14-20”表示处理1～10、12和14～20页。\";\r\n\t\tinternal const string ReversePageRanges = \"此外还可以输入逆序页码，如“100-1”表示从第100页开始倒序处理至第1页。\";\r\n\t\tinternal const string ModiNotAvailable = \"本机尚未安装微软文本识别组件（MODI），无法使用识别文本功能。\";\r\n\t\tinternal const string ConfirmAbandonDocument = \"文档已被修改。打开新的文档将丢弃未保存的更改，是否确定打开新的文档？\";\r\n\t\tinternal const string ConfirmCloseDirtyDocument = \"文档已被修改。是否确定关闭文档？\";\r\n\t\tinternal const string ConfirmCloseNDirtyDocument = \"有 <N> 个文档的书签已被修改，但尚未保存。\\n\\n是否确定放弃所作的修改，并关闭程序？\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AboutControl.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class AboutControl\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._FrontPageBox = new TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _FrontPageBox\r\n\t\t\t// \r\n\t\t\tthis._FrontPageBox.AutoScroll = true;\r\n\t\t\tthis._FrontPageBox.BackColor = System.Drawing.SystemColors.Window;\r\n\t\t\tthis._FrontPageBox.BaseStylesheet = \"\";\r\n\t\t\tthis._FrontPageBox.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis._FrontPageBox.IsContextMenuEnabled = false;\r\n\t\t\tthis._FrontPageBox.IsSelectionEnabled = false;\r\n\t\t\tthis._FrontPageBox.Location = new System.Drawing.Point(9, 8);\r\n\t\t\tthis._FrontPageBox.Name = \"_FrontPageBox\";\r\n\t\t\tthis._FrontPageBox.Size = new System.Drawing.Size(433, 328);\r\n\t\t\tthis._FrontPageBox.TabIndex = 1;\r\n\t\t\tthis._FrontPageBox.Text = null;\r\n\t\t\tthis._FrontPageBox.LinkClicked += new System.EventHandler<TheArtOfDev.HtmlRenderer.Core.Entities.HtmlLinkClickedEventArgs>(this._FrontPageBox_LinkClicked);\r\n\t\t\tthis._FrontPageBox.ImageLoad += new System.EventHandler<TheArtOfDev.HtmlRenderer.Core.Entities.HtmlImageLoadEventArgs>(this._FrontPageBox_ImageLoad);\r\n\t\t\t// \r\n\t\t\t// AboutControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._FrontPageBox);\r\n\t\t\tthis.Name = \"AboutControl\";\r\n\t\t\tthis.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8);\r\n\t\t\tthis.Size = new System.Drawing.Size(451, 344);\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel _FrontPageBox;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AboutControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\t[ToolboxItem(false)]\r\n\tsealed partial class AboutControl : Functions.HtmlPageControl\r\n\t{\r\n\t\tpublic override string FunctionName => \"关于 \" + AssemblyTitle;\r\n\r\n\t\tpublic override Bitmap IconImage => Properties.Resources.About;\r\n\r\n\t\tpublic AboutControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tText = $\"关于 {AssemblyTitle}\";\r\n\t\t\t_FrontPageBox.Text = Properties.Resources.AboutPage\r\n\t\t\t\t.Replace(\"$AppName\", Constants.AppName)\r\n\t\t\t\t.Replace(\"$AssemblyCopyright\", AssemblyCopyright)\r\n\t\t\t\t.Replace(\"$AppHomePage\", Constants.AppHomePage)\r\n\t\t\t\t.Replace(\"$AppRepository1\", Constants.AppRepository)\r\n\t\t\t\t.Replace(\"$AppRepository2\", Constants.AppRepository2)\r\n\t\t\t\t.Replace(\"$AssemblyCompany\", AssemblyCompany)\r\n\t\t\t\t.Replace(\"$AssemblyVersion\", AssemblyVersion);\r\n\t\t}\r\n\r\n\t\t#region 程序集属性访问器\r\n\r\n\t\tpublic string AssemblyTitle {\r\n\t\t\tget {\r\n\t\t\t\tvar attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);\r\n\t\t\t\tif (attributes.Length > 0) {\r\n\t\t\t\t\tvar titleAttribute = (AssemblyTitleAttribute)attributes[0];\r\n\t\t\t\t\tif (titleAttribute.Title != \"\") {\r\n\t\t\t\t\t\treturn titleAttribute.Title;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic string AssemblyVersion => Application.ProductVersion;\r\n\r\n\t\tpublic string AssemblyDescription {\r\n\t\t\tget {\r\n\t\t\t\tvar attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);\r\n\t\t\t\treturn attributes.Length == 0 ? String.Empty : ((AssemblyDescriptionAttribute)attributes[0]).Description;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic string AssemblyProduct {\r\n\t\t\tget {\r\n\t\t\t\tvar attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);\r\n\t\t\t\treturn attributes.Length == 0 ? String.Empty : ((AssemblyProductAttribute)attributes[0]).Product;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic string AssemblyCopyright {\r\n\t\t\tget {\r\n\t\t\t\tvar attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);\r\n\t\t\t\treturn attributes.Length == 0 ? String.Empty : ((AssemblyCopyrightAttribute)attributes[0]).Copyright;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic string AssemblyCompany {\r\n\t\t\tget {\r\n\t\t\t\tvar attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);\r\n\t\t\t\treturn attributes.Length == 0 ? String.Empty : ((AssemblyCompanyAttribute)attributes[0]).Company;\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.CheckUpdate:\r\n\t\t\t\t\tAppContext.MainForm.ExecuteCommand(commandName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\tvar n = AppContext.MainForm.ShowPdfFileDialog();\r\n\t\t\t\t\tif (n != null) {\r\n\t\t\t\t\t\tAppContext.MainForm.OpenFileWithEditor(n);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\tcase Commands.OpenFile:\r\n\t\t\t\t\tAppContext.MainForm.OpenFileWithEditor(parameters.FirstOrDefault());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tif (item.Name == Commands.Action) {\r\n\t\t\t\tEnableCommand(item, false, true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tvoid _FrontPageBox_ImageLoad(object sender, TheArtOfDev.HtmlRenderer.Core.Entities.HtmlImageLoadEventArgs e) {\r\n\t\t\tLoadResourceImage(e);\r\n\t\t}\r\n\r\n\t\tvoid _FrontPageBox_LinkClicked(object sender, TheArtOfDev.HtmlRenderer.Core.Entities.HtmlLinkClickedEventArgs e) {\r\n\t\t\tHandleLinkClicked(e.Link);\r\n\t\t\te.Handled = true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AboutControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AboutPage.html",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n<html>\r\n\t<head>\r\n\t\t<title>关于 $AppName</title>\r\n\t\t<style>\r\nbody {\r\n\tmargin: 0;\r\n\tpadding: 5pt;\r\n}\r\nh1 {\r\n\tfont-size: 15pt;\r\n\tcolor: #6666cc;\r\n\tborder-bottom: 1px dashed #9900ff;\r\n\tmargin: 5pt 0;\r\n}\r\np, td {\r\n\tpadding: 3pt 0pt;\r\n\tmargin: 0pt;\r\n\tfont-size: 11pt;\r\n}\r\nh2 {\r\n\tfont-size: 12pt;\r\n\tpadding: 3pt 0;\r\n\tmargin: 0;\r\n\tcolor: #6666cc;\r\n}\r\nspan {\r\n\tdisplay: inline-block;\r\n\twidth: 50%;\r\n}\r\n\t\t</style>\r\n\t</head>\r\n\t<body>\r\n\t\t<h1>关于 $AppName</h1>\r\n\t\t<div style=\"padding: 0 10pt;\">\r\n\t\t\t<p>$AssemblyCopyright</p>\r\n\t\t\t<table style=\"width: 100%; max-width: 800px\">\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td>软件版本：</td>\r\n\t\t\t\t\t<td>$AssemblyVersion <a href=\"exec:_CheckUpdate\">检查新版本</a></td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td>主页网址：</td>\r\n\t\t\t\t\t<td><a href=\"$AppHomePage\">$AppHomePage</a></td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td>源码网址：</td>\r\n\t\t\t\t\t<td>\r\n\t\t\t\t\t\t<div><a href=\"$AppRepository1\">$AppRepository1</a></div>\r\n\t\t\t\t\t\t<div><a href=\"$AppRepository2\">$AppRepository2</a></div>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td>作者电邮：</td>\r\n\t\t\t\t\t<td>$AssemblyCompany</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</table>\r\n\t\t\t<p>PDF 补丁丁是开放源代码的免费软件。在使用该软件之前，您必须同意此软件附带的使用协议。使用此软件表示您同意并遵守该软件使用协议的条款，并清楚使用该软件的责任。</p>\r\n\t\t\t<p>本软件及源代码采用“<strong>良心授权</strong>”协议——<strong>用户每次使用本软件后如有所获益，应行一善事；如使用源代码开发了新的软件并获得收益，应将收益中不低于千分之一的金额捐赠给社会的弱势群体。</strong>对于因安装、复制、使用本软件而引致的任何损失，本软件及其著作权人不负任何责任。</p>\r\n\t\t\t<p>欢迎您向本项目开发者捐赠支持。捐赠行为不增加捐赠者的权利，也不增加受赠人（本软件作者）的义务，请留意。</p>\r\n\t\t\t<p>\r\n\t\t\t\t<img src=\"res:Donation\" />\r\n\t\t\t</p>\r\n\t\t\t<p>本软件使用了如下开放源代码项目的成果，特此致谢：</p>\r\n\t\t\t<ol>\r\n\t\t\t\t<li>PDF 组件：<a href=\"http://itextsharp.sourceforge.net\">http://itextsharp.sourceforge.net</a></li>\r\n\t\t\t\t<li>PDF 引擎：<a href=\"http://mupdf.com\">http://mupdf.com</a></li>\r\n\t\t\t\t<li>图像处理：<a href=\"http://freeimage.sourceforge.net\">http://freeimage.sourceforge.net</a></li>\r\n\t\t\t\t<li>JBIG2 解码：<a href=\"http://artifex.com/\">http://artifex.com/</a></li>\r\n\t\t\t\t<li>JBIG2 编码：Adam Langley，<a href=\"https://github.com/agl/jbig2enc\">https://github.com/agl/jbig2enc</a></li>\r\n\t\t\t\t<li>数据编辑：Phillip Piper，<a href=\"http://objectlistview.sourceforge.net\">http://objectlistview.sourceforge.net</a></li>\r\n\t\t\t\t<li>网页界面：ArthurHub，<a href=\"https://github.com/ArthurHub/HTML-Renderer\">https://github.com/ArthurHub/HTML-Renderer</a></li>\r\n\t\t\t\t<li>标签页界面：The Man from U.N.C.L.E.，<a href=\"https://www.codeproject.com/Articles/91387/Painting-Your-Own-Tabs-Second-Edition-2\">https://www.codeproject.com/Articles/91387/Painting-Your-Own-Tabs-Second-Edition-2</a></li>\r\n\t\t\t\t<li>界面图标：Yusuke Kamiyamane，<a href=\"http://p.yusukekamiyamane.com\">http://p.yusukekamiyamane.com</a></li>\r\n\t\t\t\t<li>图像浏览：Cyotek ImageBox，<a href=\"http://www.cyotek.com/\">http://www.cyotek.com/</a></li>\r\n\t\t\t\t<li>图像量化算法：武筱林，<a href=\"http://www.ece.mcmaster.ca/~xwu/cq.c\">http://www.ece.mcmaster.ca/~xwu/cq.c</a></li>\r\n\t\t\t</ol>\r\n\t\t\t<p>感谢 MY1L 网友为本程序设计的新图标。</p>\r\n　　\t\t</div>\r\n\t</body>\r\n</html>"
  },
  {
    "path": "App/Functions/AppOptionForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class AppOptionForm\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._DocInfoEncodingBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label();\r\n\t\t\tthis._BookmarkEncodingBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._LoadPartialFileBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._LoadEntireFileBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label();\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._FontNameEncodingBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._TextEncodingBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._SaveAppSettingsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._CreateShortcutButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.groupBox3 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._DefaultOverwritePdfFileBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._AddContextMenuBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.groupBox1.SuspendLayout();\r\n\t\t\tthis.groupBox2.SuspendLayout();\r\n\t\t\tthis.groupBox3.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _DocInfoEncodingBox\r\n\t\t\t// \r\n\t\t\tthis._DocInfoEncodingBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._DocInfoEncodingBox.FormattingEnabled = true;\r\n\t\t\tthis._DocInfoEncodingBox.Location = new System.Drawing.Point(77, 37);\r\n\t\t\tthis._DocInfoEncodingBox.Name = \"_DocInfoEncodingBox\";\r\n\t\t\tthis._DocInfoEncodingBox.Size = new System.Drawing.Size(134, 20);\r\n\t\t\tthis._DocInfoEncodingBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point(6, 40);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label11.TabIndex = 2;\r\n\t\t\tthis.label11.Text = \"文档属性：\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkEncodingBox\r\n\t\t\t// \r\n\t\t\tthis._BookmarkEncodingBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._BookmarkEncodingBox.FormattingEnabled = true;\r\n\t\t\tthis._BookmarkEncodingBox.Location = new System.Drawing.Point(292, 37);\r\n\t\t\tthis._BookmarkEncodingBox.Name = \"_BookmarkEncodingBox\";\r\n\t\t\tthis._BookmarkEncodingBox.Size = new System.Drawing.Size(134, 20);\r\n\t\t\tthis._BookmarkEncodingBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(221, 40);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label10.TabIndex = 4;\r\n\t\t\tthis.label10.Text = \"书签文本：\";\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Controls.Add(this._LoadPartialFileBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._LoadEntireFileBox);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point(12, 61);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size(449, 46);\r\n\t\t\tthis.groupBox1.TabIndex = 1;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"访问 PDF 文档\";\r\n\t\t\t// \r\n\t\t\t// _LoadPartialFileBox\r\n\t\t\t// \r\n\t\t\tthis._LoadPartialFileBox.AutoSize = true;\r\n\t\t\tthis._LoadPartialFileBox.Location = new System.Drawing.Point(223, 20);\r\n\t\t\tthis._LoadPartialFileBox.Name = \"_LoadPartialFileBox\";\r\n\t\t\tthis._LoadPartialFileBox.Size = new System.Drawing.Size(215, 16);\r\n\t\t\tthis._LoadPartialFileBox.TabIndex = 1;\r\n\t\t\tthis._LoadPartialFileBox.TabStop = true;\r\n\t\t\tthis._LoadPartialFileBox.Text = \"减少占用内存（仅加载需处理部分）\";\r\n\t\t\tthis._LoadPartialFileBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _LoadEntireFileBox\r\n\t\t\t// \r\n\t\t\tthis._LoadEntireFileBox.AutoSize = true;\r\n\t\t\tthis._LoadEntireFileBox.Location = new System.Drawing.Point(8, 20);\r\n\t\t\tthis._LoadEntireFileBox.Name = \"_LoadEntireFileBox\";\r\n\t\t\tthis._LoadEntireFileBox.Size = new System.Drawing.Size(191, 16);\r\n\t\t\tthis._LoadEntireFileBox.TabIndex = 0;\r\n\t\t\tthis._LoadEntireFileBox.TabStop = true;\r\n\t\t\tthis._LoadEntireFileBox.Text = \"优化处理效率（加载整个文件）\";\r\n\t\t\tthis._LoadEntireFileBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.label12.Location = new System.Drawing.Point(6, 17);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size(437, 17);\r\n\t\t\tthis.label12.TabIndex = 6;\r\n\t\t\tthis.label12.Text = \"说明：当遇到 PDF 文档的文本为乱码时，可尝试使用此选项强制设定编码。\";\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Controls.Add(this.label1);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label2);\r\n\t\t\tthis.groupBox2.Controls.Add(this._FontNameEncodingBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._TextEncodingBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._DocInfoEncodingBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label10);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label12);\r\n\t\t\tthis.groupBox2.Controls.Add(this._BookmarkEncodingBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label11);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point(12, 113);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size(449, 91);\r\n\t\t\tthis.groupBox2.TabIndex = 9;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"读取文档所用的编码\";\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(220, 66);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 7;\r\n\t\t\tthis.label1.Text = \"字体名称：\";\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(6, 66);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label2.TabIndex = 7;\r\n\t\t\tthis.label2.Text = \"正文文本：\";\r\n\t\t\t// \r\n\t\t\t// _FontNameEncodingBox\r\n\t\t\t// \r\n\t\t\tthis._FontNameEncodingBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._FontNameEncodingBox.FormattingEnabled = true;\r\n\t\t\tthis._FontNameEncodingBox.Location = new System.Drawing.Point(292, 63);\r\n\t\t\tthis._FontNameEncodingBox.Name = \"_FontNameEncodingBox\";\r\n\t\t\tthis._FontNameEncodingBox.Size = new System.Drawing.Size(134, 20);\r\n\t\t\tthis._FontNameEncodingBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _TextEncodingBox\r\n\t\t\t// \r\n\t\t\tthis._TextEncodingBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._TextEncodingBox.FormattingEnabled = true;\r\n\t\t\tthis._TextEncodingBox.Location = new System.Drawing.Point(77, 63);\r\n\t\t\tthis._TextEncodingBox.Name = \"_TextEncodingBox\";\r\n\t\t\tthis._TextEncodingBox.Size = new System.Drawing.Size(134, 20);\r\n\t\t\tthis._TextEncodingBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _SaveAppSettingsBox\r\n\t\t\t// \r\n\t\t\tthis._SaveAppSettingsBox.AutoSize = true;\r\n\t\t\tthis._SaveAppSettingsBox.Location = new System.Drawing.Point(12, 12);\r\n\t\t\tthis._SaveAppSettingsBox.Name = \"_SaveAppSettingsBox\";\r\n\t\t\tthis._SaveAppSettingsBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._SaveAppSettingsBox.TabIndex = 11;\r\n\t\t\tthis._SaveAppSettingsBox.Text = \"自动保存应用程序设置\";\r\n\t\t\tthis._SaveAppSettingsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CreateShortcutButton\r\n\t\t\t// \r\n\t\t\tthis._CreateShortcutButton.Location = new System.Drawing.Point(299, 8);\r\n\t\t\tthis._CreateShortcutButton.Name = \"_CreateShortcutButton\";\r\n\t\t\tthis._CreateShortcutButton.Size = new System.Drawing.Size(162, 23);\r\n\t\t\tthis._CreateShortcutButton.TabIndex = 12;\r\n\t\t\tthis._CreateShortcutButton.Text = \"在桌面创建程序快捷方式\";\r\n\t\t\tthis._CreateShortcutButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CreateShortcutButton.Click += new System.EventHandler(this._CreateShortcutButton_Click);\r\n\t\t\t// \r\n\t\t\t// groupBox3\r\n\t\t\t// \r\n\t\t\tthis.groupBox3.Controls.Add(this._DefaultOverwritePdfFileBox);\r\n\t\t\tthis.groupBox3.Location = new System.Drawing.Point(12, 210);\r\n\t\t\tthis.groupBox3.Name = \"groupBox3\";\r\n\t\t\tthis.groupBox3.Size = new System.Drawing.Size(449, 47);\r\n\t\t\tthis.groupBox3.TabIndex = 13;\r\n\t\t\tthis.groupBox3.TabStop = false;\r\n\t\t\tthis.groupBox3.Text = \"编辑器\";\r\n\t\t\t// \r\n\t\t\t// _DefaultOverwritePdfFileBox\r\n\t\t\t// \r\n\t\t\tthis._DefaultOverwritePdfFileBox.AutoSize = true;\r\n\t\t\tthis._DefaultOverwritePdfFileBox.Location = new System.Drawing.Point(8, 20);\r\n\t\t\tthis._DefaultOverwritePdfFileBox.Name = \"_DefaultOverwritePdfFileBox\";\r\n\t\t\tthis._DefaultOverwritePdfFileBox.Size = new System.Drawing.Size(186, 16);\r\n\t\t\tthis._DefaultOverwritePdfFileBox.TabIndex = 0;\r\n\t\t\tthis._DefaultOverwritePdfFileBox.Text = \"默认覆盖正在编辑的 PDF 文件\";\r\n\t\t\tthis._DefaultOverwritePdfFileBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AddContextMenuBox\r\n\t\t\t// \r\n\t\t\tthis._AddContextMenuBox.AutoSize = true;\r\n\t\t\tthis._AddContextMenuBox.Location = new System.Drawing.Point(20, 36);\r\n\t\t\tthis._AddContextMenuBox.Name = \"_AddContextMenuBox\";\r\n\t\t\tthis._AddContextMenuBox.Size = new System.Drawing.Size(264, 16);\r\n\t\t\tthis._AddContextMenuBox.TabIndex = 14;\r\n\t\t\tthis._AddContextMenuBox.Text = \"PDF 文件右键菜单的“打开方式”添加“PDF补丁丁”\";\r\n\t\t\tthis._AddContextMenuBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// AppOptionForm\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(473, 267);\r\n\t\t\tthis.Controls.Add(this._AddContextMenuBox);\r\n\t\t\tthis.Controls.Add(this.groupBox3);\r\n\t\t\tthis.Controls.Add(this._CreateShortcutButton);\r\n\t\t\tthis.Controls.Add(this._SaveAppSettingsBox);\r\n\t\t\tthis.Controls.Add(this.groupBox2);\r\n\t\t\tthis.Controls.Add(this.groupBox1);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"AppOptionForm\";\r\n\t\t\tthis.Text = \"程序工作选项\";\r\n\t\t\tthis.groupBox1.ResumeLayout(false);\r\n\t\t\tthis.groupBox1.PerformLayout();\r\n\t\t\tthis.groupBox2.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.PerformLayout();\r\n\t\t\tthis.groupBox3.ResumeLayout(false);\r\n\t\t\tthis.groupBox3.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.ComboBox _DocInfoEncodingBox;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.ComboBox _BookmarkEncodingBox;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t\tprivate System.Windows.Forms.RadioButton _LoadEntireFileBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _LoadPartialFileBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.ComboBox _TextEncodingBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _SaveAppSettingsBox;\r\n\t\tprivate System.Windows.Forms.Button _CreateShortcutButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.ComboBox _FontNameEncodingBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox3;\r\n\t\tprivate System.Windows.Forms.CheckBox _DefaultOverwritePdfFileBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AddContextMenuBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AppOptionForm.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class AppOptionForm : Form, IResettableControl\r\n\t{\r\n\t\tbool locked;\r\n\r\n\t\tpublic AppOptionForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tReload();\r\n\t\t\tthis.SetIcon(Properties.Resources.AppOptions);\r\n\t\t\t_BookmarkEncodingBox.SelectedIndexChanged += ControlChanged;\r\n\t\t\t_DocInfoEncodingBox.SelectedIndexChanged += ControlChanged;\r\n\t\t\t_TextEncodingBox.SelectedIndexChanged += ControlChanged;\r\n\t\t\t_FontNameEncodingBox.SelectedIndexChanged += ControlChanged;\r\n\t\t\t_SaveAppSettingsBox.CheckedChanged += ControlChanged;\r\n\t\t\t_LoadEntireFileBox.CheckedChanged += ControlChanged;\r\n\t\t\t_DefaultOverwritePdfFileBox.CheckedChanged += ControlChanged;\r\n\t\t\t_AddContextMenuBox.CheckedChanged += ControlChanged;\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tAppContext.SaveAppSettings = true;\r\n\t\t\tAppContext.LoadPartialPdfFile = false;\r\n\t\t\tAppContext.Encodings = new EncodingOptions();\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\tlocked = true;\r\n\t\t\t_SaveAppSettingsBox.Checked = AppContext.SaveAppSettings;\r\n\t\t\t_LoadPartialFileBox.Checked = AppContext.LoadPartialPdfFile;\r\n\t\t\t_LoadEntireFileBox.Checked = !AppContext.LoadPartialPdfFile;\r\n\t\t\t_DefaultOverwritePdfFileBox.Checked = AppContext.Editor.DefaultOverwriteDocument;\r\n\t\t\t_AddContextMenuBox.Checked = ShellHelper.CheckPdfOpenWithAssociation();\r\n\r\n\t\t\tInitEncodingList(_BookmarkEncodingBox, AppContext.Encodings.BookmarkEncodingName);\r\n\t\t\tInitEncodingList(_DocInfoEncodingBox, AppContext.Encodings.DocInfoEncodingName);\r\n\t\t\tInitEncodingList(_TextEncodingBox, AppContext.Encodings.TextEncodingName);\r\n\t\t\tInitEncodingList(_FontNameEncodingBox, AppContext.Encodings.FontNameEncodingName);\r\n\r\n\t\t\tlocked = false;\r\n\t\t}\r\n\r\n\t\tstatic void InitEncodingList(ComboBox list, string encodingName) {\r\n\t\t\tlist.Items.Clear();\r\n\t\t\tforeach (var item in Constants.Encoding.EncodingNames) {\r\n\t\t\t\tlist.Items.Add(item);\r\n\t\t\t\tif (encodingName == item) {\r\n\t\t\t\t\tlist.SelectedIndex = list.Items.Count - 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (list.SelectedIndex == -1) {\r\n\t\t\t\tlist.SelectedIndex = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ControlChanged(object sender, EventArgs e) {\r\n\t\t\tif (locked) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (sender == _DocInfoEncodingBox) {\r\n\t\t\t\tAppContext.Encodings.DocInfoEncodingName = _DocInfoEncodingBox.SelectedItem.ToString();\r\n\t\t\t}\r\n\t\t\telse if (sender == _BookmarkEncodingBox) {\r\n\t\t\t\tAppContext.Encodings.BookmarkEncodingName = _BookmarkEncodingBox.SelectedItem.ToString();\r\n\t\t\t}\r\n\t\t\telse if (sender == _TextEncodingBox) {\r\n\t\t\t\tAppContext.Encodings.TextEncodingName = _TextEncodingBox.SelectedItem.ToString();\r\n\t\t\t}\r\n\t\t\telse if (sender == _FontNameEncodingBox) {\r\n\t\t\t\tAppContext.Encodings.FontNameEncodingName = _FontNameEncodingBox.SelectedItem.ToString();\r\n\t\t\t}\r\n\t\t\telse if (sender == _SaveAppSettingsBox) {\r\n\t\t\t\tAppContext.SaveAppSettings = _SaveAppSettingsBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _LoadEntireFileBox) {\r\n\t\t\t\tAppContext.LoadPartialPdfFile = _LoadPartialFileBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _DefaultOverwritePdfFileBox) {\r\n\t\t\t\tAppContext.Editor.DefaultOverwriteDocument = _DefaultOverwritePdfFileBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _AddContextMenuBox) {\r\n\t\t\t\tif (_AddContextMenuBox.Checked) {\r\n\t\t\t\t\tShellHelper.AddPdfOpenWithAssociation();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tShellHelper.RemovePdfOpenWithAssociation();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _CreateShortcutButton_Click(object sender, EventArgs e) {\r\n\t\t\tShellHelper.CreateShortcut();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AppOptionForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/EditAdjustmentForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class EditAdjustmentForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._AddFilterMenuItem = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._FilterBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._TypeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ConditionColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._IsInclusiveColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._RemoveButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._EditFilterBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._EditFilterPanel = new System.Windows.Forms.Panel();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FilterBox)).BeginInit();\r\n\t\t\tthis._MainToolbar.SuspendLayout();\r\n\t\t\tthis._EditFilterBox.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _AddFilterMenuItem\r\n\t\t\t// \r\n\t\t\tthis._AddFilterMenuItem.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddFilterMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilterMenuItem.Name = \"_AddFilterMenuItem\";\r\n\t\t\tthis._AddFilterMenuItem.Size = new System.Drawing.Size(109, 22);\r\n\t\t\tthis._AddFilterMenuItem.Text = \"添加匹配条件\";\r\n\t\t\tthis._AddFilterMenuItem.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._AddFilterMenuItem_DropDownItemClicked);\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(267, 285);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 0;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(348, 285);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 1;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _FilterBox\r\n\t\t\t// \r\n\t\t\tthis._FilterBox.AllColumns.Add(this._TypeColumn);\r\n\t\t\tthis._FilterBox.AllColumns.Add(this._ConditionColumn);\r\n\t\t\tthis._FilterBox.AllColumns.Add(this._IsInclusiveColumn);\r\n\t\t\tthis._FilterBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FilterBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._FilterBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._TypeColumn,\r\n            this._ConditionColumn,\r\n            this._IsInclusiveColumn});\r\n\t\t\tthis._FilterBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._FilterBox.FullRowSelect = true;\r\n\t\t\tthis._FilterBox.GridLines = true;\r\n\t\t\tthis._FilterBox.HideSelection = false;\r\n\t\t\tthis._FilterBox.IsSimpleDragSource = true;\r\n\t\t\tthis._FilterBox.IsSimpleDropSink = true;\r\n\t\t\tthis._FilterBox.Location = new System.Drawing.Point(12, 28);\r\n\t\t\tthis._FilterBox.MultiSelect = false;\r\n\t\t\tthis._FilterBox.Name = \"_FilterBox\";\r\n\t\t\tthis._FilterBox.ShowGroups = false;\r\n\t\t\tthis._FilterBox.Size = new System.Drawing.Size(411, 141);\r\n\t\t\tthis._FilterBox.TabIndex = 3;\r\n\t\t\tthis._FilterBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._FilterBox.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._FilterBox.SelectedIndexChanged += new System.EventHandler(this._FilterBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// _TypeColumn\r\n\t\t\t// \r\n\t\t\tthis._TypeColumn.IsEditable = false;\r\n\t\t\tthis._TypeColumn.Text = \"筛选条件\";\r\n\t\t\tthis._TypeColumn.Width = 69;\r\n\t\t\t// \r\n\t\t\t// _ConditionColumn\r\n\t\t\t// \r\n\t\t\tthis._ConditionColumn.FillsFreeSpace = true;\r\n\t\t\tthis._ConditionColumn.Text = \"匹配条件\";\r\n\t\t\tthis._ConditionColumn.Width = 241;\r\n\t\t\t// \r\n\t\t\t// _IsInclusiveColumn\r\n\t\t\t// \r\n\t\t\tthis._IsInclusiveColumn.IsEditable = false;\r\n\t\t\tthis._IsInclusiveColumn.Text = \"包含筛选\";\r\n\t\t\tthis._IsInclusiveColumn.Width = 78;\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AddFilterMenuItem,\r\n            this._RemoveButton});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size(435, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 4;\r\n\t\t\tthis._MainToolbar.Text = \"toolStrip1\";\r\n\t\t\t// \r\n\t\t\t// _RemoveButton\r\n\t\t\t// \r\n\t\t\tthis._RemoveButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._RemoveButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._RemoveButton.Name = \"_RemoveButton\";\r\n\t\t\tthis._RemoveButton.Size = new System.Drawing.Size(52, 22);\r\n\t\t\tthis._RemoveButton.Text = \"删除\";\r\n\t\t\tthis._RemoveButton.Click += new System.EventHandler(this._RemoveButton_Click);\r\n\t\t\t// \r\n\t\t\t// _EditFilterBox\r\n\t\t\t// \r\n\t\t\tthis._EditFilterBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._EditFilterBox.Controls.Add(this._EditFilterPanel);\r\n\t\t\tthis._EditFilterBox.Location = new System.Drawing.Point(12, 175);\r\n\t\t\tthis._EditFilterBox.Name = \"_EditFilterBox\";\r\n\t\t\tthis._EditFilterBox.Size = new System.Drawing.Size(411, 104);\r\n\t\t\tthis._EditFilterBox.TabIndex = 5;\r\n\t\t\tthis._EditFilterBox.TabStop = false;\r\n\t\t\tthis._EditFilterBox.Text = \"更改匹配条件\";\r\n\t\t\t// \r\n\t\t\t// _EditFilterPanel\r\n\t\t\t// \r\n\t\t\tthis._EditFilterPanel.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._EditFilterPanel.Name = \"_EditFilterPanel\";\r\n\t\t\tthis._EditFilterPanel.Size = new System.Drawing.Size(399, 78);\r\n\t\t\tthis._EditFilterPanel.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// EditAdjustmentForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(435, 320);\r\n\t\t\tthis.ControlBox = false;\r\n\t\t\tthis.Controls.Add(this._EditFilterBox);\r\n\t\t\tthis.Controls.Add(this._MainToolbar);\r\n\t\t\tthis.Controls.Add(this._FilterBox);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.MinimumSize = new System.Drawing.Size(443, 318);\r\n\t\t\tthis.Name = \"EditAdjustmentForm\";\r\n\t\t\tthis.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"编辑标题文本筛选条件\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FilterBox)).EndInit();\r\n\t\t\tthis._MainToolbar.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.PerformLayout();\r\n\t\t\tthis._EditFilterBox.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _FilterBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ConditionColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _TypeColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _IsInclusiveColumn;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _RemoveButton;\r\n\t\tprivate System.Windows.Forms.GroupBox _EditFilterBox;\r\n\t\tprivate System.Windows.Forms.Panel _EditFilterPanel;\r\n\t\tprivate System.Windows.Forms.ToolStripDropDownButton _AddFilterMenuItem;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/EditAdjustmentForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class EditAdjustmentForm : Form\r\n\t{\r\n\t\tinternal static string[] FilterNames = new string[] { \"字体名称\", \"文本尺寸\", \"文本位置\", \"页码范围\", \"文本内容\" };\r\n\t\tinternal static string[] FilterIDs = new string[] { \"_FontNameFilter\", \"_FontSizeFilter\", \"_FontPositionFilter\", \"_PageRangeFilter\", \"_TextFilter\" };\r\n\r\n\t\treadonly Dictionary<Type, IFilterConditionEditor> _filterEditors = new Dictionary<Type, IFilterConditionEditor>();\r\n\t\tinternal AutoBookmarkOptions.LevelAdjustmentOption Filter { get; private set; }\r\n\t\tAutoBookmarkCondition.MultiCondition conditions;\r\n\r\n\t\tpublic EditAdjustmentForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\t\tpublic EditAdjustmentForm(AutoBookmarkOptions.LevelAdjustmentOption filter) : this() {\r\n\t\t\tint i = 0;\r\n\t\t\tforeach (var item in FilterNames) {\r\n\t\t\t\t_AddFilterMenuItem.DropDownItems.Add(item).Name = FilterIDs[i++];\r\n\t\t\t}\r\n\t\t\t_FilterBox.BeforeSorting += (object sender, BrightIdeasSoftware.BeforeSortingEventArgs e) => e.Canceled = true;\r\n\t\t\t_ConditionColumn.AspectGetter = (object x) => x is AutoBookmarkCondition f ? f.Description : (object)null;\r\n\t\t\t_IsInclusiveColumn.AspectGetter = (object x) => {\r\n\t\t\t\tif (x is AutoBookmarkCondition f) {\r\n\t\t\t\t\treturn f.IsInclusive ? \"包含匹配项\" : \"过滤匹配项\";\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t};\r\n\t\t\t_TypeColumn.AspectGetter = (object x) => x is AutoBookmarkCondition f ? f.Name : null;\r\n\t\t\tFilter = new AutoBookmarkOptions.LevelAdjustmentOption();\r\n\t\t\tif (filter != null) {\r\n\t\t\t\tFilter.AdjustmentLevel = filter.AdjustmentLevel;\r\n\t\t\t\tFilter.RelativeAdjustment = filter.RelativeAdjustment;\r\n\t\t\t\tconditions = new AutoBookmarkCondition.MultiCondition(filter.Condition);\r\n\t\t\t\t_FilterBox.Objects = conditions.Conditions;\r\n\t\t\t}\r\n\t\t\tif (_FilterBox.Items.Count > 0) {\r\n\t\t\t\t_FilterBox.SelectedIndex = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_MainToolbar.ScaleIcons(16);\r\n\t\t\t_FilterBox.ScaleColumnWidths();\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tconditions = new AutoBookmarkCondition.MultiCondition();\r\n\t\t\tforeach (ListViewItem item in _FilterBox.Items) {\r\n\t\t\t\tconditions.Conditions.Add((AutoBookmarkCondition)_FilterBox.GetModelObject(item.Index));\r\n\t\t\t}\r\n\r\n\t\t\tFilter.Condition = conditions.Conditions.Count switch {\r\n\t\t\t\t1 => conditions.Conditions[0],\r\n\t\t\t\t0 => null,\r\n\t\t\t\t_ => conditions\r\n\t\t\t};\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tprivate void _AddFilterMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tvar c = CreateCondition(e.ClickedItem.Name);\r\n\t\t\tif (c != null) {\r\n\t\t\t\t_FilterBox.AddObject(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _FilterBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\t_EditFilterPanel.Controls.Clear();\r\n\t\t\tvar o = _FilterBox.SelectedObject;\r\n\t\t\tif (o == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar ed = GetFilterEditor(o as AutoBookmarkCondition);\r\n\t\t\tif (ed == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_EditFilterPanel.Controls.Add(ed.EditorControl);\r\n\t\t\ted.EditorControl.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;\r\n\t\t\ted.EditorControl.Left = ed.EditorControl.Top = 0;\r\n\t\t\ted.EditorControl.Size = _EditFilterPanel.ClientSize;\r\n\t\t}\r\n\r\n\t\tinternal static AutoBookmarkCondition CreateCondition(string name) {\r\n\t\t\tswitch (name) {\r\n\t\t\t\tcase \"_FontNameFilter\": return new AutoBookmarkCondition.FontNameCondition(\"SimSun\", false);\r\n\t\t\t\tcase \"_FontSizeFilter\": return new AutoBookmarkCondition.TextSizeCondition(0, 10);\r\n\t\t\t\tcase \"_FontPositionFilter\": return new AutoBookmarkCondition.TextPositionCondition(1, -9999, 9999);\r\n\t\t\t\tcase \"_PageRangeFilter\": return new AutoBookmarkCondition.PageRangeCondition();\r\n\t\t\t\tcase \"_TextFilter\": return new AutoBookmarkCondition.TextCondition() { Pattern = new MatchPattern(\"筛选条件\", false, false, false) };\r\n\t\t\t\tdefault: return null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void UpdateFilter(IFilterConditionEditor filter) {\r\n\t\t\tif (filter.EditorControl?.FindForm() is EditAdjustmentForm f) {\r\n\t\t\t\tf._FilterBox.RefreshSelectedObjects();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate IFilterConditionEditor GetFilterEditor(AutoBookmarkCondition filter) {\r\n\t\t\tvar t = filter.GetType();\r\n\t\t\tif (_filterEditors.TryGetValue(t, out IFilterConditionEditor c)) {\r\n\t\t\t\tgoto SetEditor;\r\n\t\t\t\t// return c;\r\n\t\t\t}\r\n\t\t\telse if (t == typeof(AutoBookmarkCondition.FontNameCondition)) {\r\n\t\t\t\tc = new FontNameConditionEditor();\r\n\t\t\t}\r\n\t\t\telse if (t == typeof(AutoBookmarkCondition.TextSizeCondition)) {\r\n\t\t\t\tc = new TextSizeConditionEditor();\r\n\t\t\t}\r\n\t\t\telse if (t == typeof(AutoBookmarkCondition.TextPositionCondition)) {\r\n\t\t\t\tc = new TextPositionConditionEditor();\r\n\t\t\t}\r\n\t\t\telse if (t == typeof(AutoBookmarkCondition.PageRangeCondition)) {\r\n\t\t\t\tc = new PageRangeConditionEditor();\r\n\t\t\t}\r\n\t\t\telse if (t == typeof(AutoBookmarkCondition.TextCondition)) {\r\n\t\t\t\tc = new TextConditionEditor();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tCommon.FormHelper.ErrorBox(\"无法编辑选中的筛选条件。\");\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\tSetEditor:\r\n\t\t\t_filterEditors[t] = c;\r\n\t\t\tc.Filter = filter;\r\n\t\t\treturn c;\r\n\t\t}\r\n\r\n\t\tprivate void _RemoveButton_Click(object sender, EventArgs e) {\r\n\t\t\t_FilterBox.RemoveObjects(_FilterBox.SelectedObjects);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/EditAdjustmentForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/FontFilterForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class FontFilterForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container ();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._MessageLabel = new System.Windows.Forms.Label ();\r\n\t\t\tthis._FontNameSizeColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._FirstPageColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._CountColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._FontInfoBox = new BrightIdeasSoftware.TreeListView ();\r\n\t\t\tthis._AddFilterMenu = new System.Windows.Forms.ContextMenuStrip (this.components);\r\n\t\t\tthis._FilterBox = new BrightIdeasSoftware.ObjectListView ();\r\n\t\t\tthis._ConditionColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._AddConditionButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._RemoveConditionButton = new System.Windows.Forms.Button ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FontInfoBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FilterBox)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point (368, 376);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 5;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler (this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point (449, 376);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 6;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler (this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MessageLabel\r\n\t\t\t// \r\n\t\t\tthis._MessageLabel.AutoSize = true;\r\n\t\t\tthis._MessageLabel.Location = new System.Drawing.Point (12, 9);\r\n\t\t\tthis._MessageLabel.Name = \"_MessageLabel\";\r\n\t\t\tthis._MessageLabel.Size = new System.Drawing.Size (407, 12);\r\n\t\t\tthis._MessageLabel.TabIndex = 0;\r\n\t\t\tthis._MessageLabel.Text = \"下表列出了 PDF 文档中所使用的字体。右键点击项目可添加字体筛选条件。\";\r\n\t\t\t// \r\n\t\t\t// _FontNameSizeColumn\r\n\t\t\t// \r\n\t\t\tthis._FontNameSizeColumn.Text = \"字体名称/文本尺寸（首次出现文本）\";\r\n\t\t\tthis._FontNameSizeColumn.Width = 329;\r\n\t\t\t// \r\n\t\t\t// _FirstPageColumn\r\n\t\t\t// \r\n\t\t\tthis._FirstPageColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._FirstPageColumn.Text = \"首次出现页码\";\r\n\t\t\tthis._FirstPageColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._FirstPageColumn.Width = 51;\r\n\t\t\t// \r\n\t\t\t// _CountColumn\r\n\t\t\t// \r\n\t\t\tthis._CountColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._CountColumn.Text = \"出现次数\";\r\n\t\t\tthis._CountColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._CountColumn.Width = 52;\r\n\t\t\t// \r\n\t\t\t// _FontInfoBox\r\n\t\t\t// \r\n\t\t\tthis._FontInfoBox.AllColumns.Add (this._FontNameSizeColumn);\r\n\t\t\tthis._FontInfoBox.AllColumns.Add (this._FirstPageColumn);\r\n\t\t\tthis._FontInfoBox.AllColumns.Add (this._CountColumn);\r\n\t\t\tthis._FontInfoBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FontInfoBox.CheckBoxes = false;\r\n\t\t\tthis._FontInfoBox.Columns.AddRange (new System.Windows.Forms.ColumnHeader[] {\r\n            this._FontNameSizeColumn,\r\n            this._FirstPageColumn,\r\n            this._CountColumn});\r\n\t\t\tthis._FontInfoBox.ContextMenuStrip = this._AddFilterMenu;\r\n\t\t\tthis._FontInfoBox.FullRowSelect = true;\r\n\t\t\tthis._FontInfoBox.GridLines = true;\r\n\t\t\tthis._FontInfoBox.HeaderWordWrap = true;\r\n\t\t\tthis._FontInfoBox.Location = new System.Drawing.Point (14, 36);\r\n\t\t\tthis._FontInfoBox.MultiSelect = false;\r\n\t\t\tthis._FontInfoBox.Name = \"_FontInfoBox\";\r\n\t\t\tthis._FontInfoBox.OwnerDraw = true;\r\n\t\t\tthis._FontInfoBox.ShowGroups = false;\r\n\t\t\tthis._FontInfoBox.Size = new System.Drawing.Size (510, 206);\r\n\t\t\tthis._FontInfoBox.TabIndex = 1;\r\n\t\t\tthis._FontInfoBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._FontInfoBox.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._FontInfoBox.VirtualMode = true;\r\n\t\t\t// \r\n\t\t\t// _AddFilterMenu\r\n\t\t\t// \r\n\t\t\tthis._AddFilterMenu.Name = \"_AddFilterMenu\";\r\n\t\t\tthis._AddFilterMenu.ShowImageMargin = false;\r\n\t\t\tthis._AddFilterMenu.Size = new System.Drawing.Size (36, 4);\r\n\t\t\tthis._AddFilterMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler (this._AddFilterMenu_ItemClicked);\r\n\t\t\tthis._AddFilterMenu.Opening += new System.ComponentModel.CancelEventHandler (this._AddFilterMenu_Opening);\r\n\t\t\t// \r\n\t\t\t// _FilterBox\r\n\t\t\t// \r\n\t\t\tthis._FilterBox.AllColumns.Add (this._ConditionColumn);\r\n\t\t\tthis._FilterBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FilterBox.Columns.AddRange (new System.Windows.Forms.ColumnHeader[] {\r\n            this._ConditionColumn});\r\n\t\t\tthis._FilterBox.FullRowSelect = true;\r\n\t\t\tthis._FilterBox.GridLines = true;\r\n\t\t\tthis._FilterBox.Location = new System.Drawing.Point (14, 248);\r\n\t\t\tthis._FilterBox.Name = \"_FilterBox\";\r\n\t\t\tthis._FilterBox.ShowGroups = false;\r\n\t\t\tthis._FilterBox.Size = new System.Drawing.Size (415, 122);\r\n\t\t\tthis._FilterBox.TabIndex = 2;\r\n\t\t\tthis._FilterBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._FilterBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _ConditionColumn\r\n\t\t\t// \r\n\t\t\tthis._ConditionColumn.Text = \"筛选条件\";\r\n\t\t\tthis._ConditionColumn.Width = 330;\r\n\t\t\t// \r\n\t\t\t// _AddConditionButton\r\n\t\t\t// \r\n\t\t\tthis._AddConditionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AddConditionButton.Location = new System.Drawing.Point (435, 248);\r\n\t\t\tthis._AddConditionButton.Name = \"_AddConditionButton\";\r\n\t\t\tthis._AddConditionButton.Size = new System.Drawing.Size (89, 23);\r\n\t\t\tthis._AddConditionButton.TabIndex = 3;\r\n\t\t\tthis._AddConditionButton.Text = \"添加筛选条件\";\r\n\t\t\tthis._AddConditionButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._AddConditionButton.Click += new System.EventHandler (this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _RemoveConditionButton\r\n\t\t\t// \r\n\t\t\tthis._RemoveConditionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._RemoveConditionButton.Location = new System.Drawing.Point (435, 277);\r\n\t\t\tthis._RemoveConditionButton.Name = \"_RemoveConditionButton\";\r\n\t\t\tthis._RemoveConditionButton.Size = new System.Drawing.Size (89, 23);\r\n\t\t\tthis._RemoveConditionButton.TabIndex = 4;\r\n\t\t\tthis._RemoveConditionButton.Text = \"删除筛选条件\";\r\n\t\t\tthis._RemoveConditionButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RemoveConditionButton.Click += new System.EventHandler (this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// FontFilterForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (536, 411);\r\n\t\t\tthis.Controls.Add (this._RemoveConditionButton);\r\n\t\t\tthis.Controls.Add (this._AddConditionButton);\r\n\t\t\tthis.Controls.Add (this._FontInfoBox);\r\n\t\t\tthis.Controls.Add (this._MessageLabel);\r\n\t\t\tthis.Controls.Add (this._FilterBox);\r\n\t\t\tthis.Controls.Add (this._CancelButton);\r\n\t\t\tthis.Controls.Add (this._OkButton);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"FontFilterForm\";\r\n\t\t\tthis.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"添加字体筛选条件\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FontInfoBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FilterBox)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label _MessageLabel;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FontNameSizeColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FirstPageColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _CountColumn;\r\n\t\tprivate BrightIdeasSoftware.TreeListView _FontInfoBox;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _AddFilterMenu;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _FilterBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ConditionColumn;\r\n\t\tprivate System.Windows.Forms.Button _AddConditionButton;\r\n\t\tprivate System.Windows.Forms.Button _RemoveConditionButton;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/FontFilterForm.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class FontFilterForm : Form\r\n\t{\r\n\t\tsealed class FilterSetting\r\n\t\t{\r\n\t\t\tinternal string FontName { get; }\r\n\t\t\tinternal bool FullMatch { get; }\r\n\t\t\tinternal float Size { get; }\r\n\t\t\tpublic FilterSetting(string fontName, bool fullMatch, float size) {\r\n\t\t\t\tFontName = fontName;\r\n\t\t\t\tFullMatch = fullMatch;\r\n\t\t\t\tSize = size;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treadonly XmlElement _fontInfo;\r\n\t\tinternal AutoBookmarkCondition[] FilterConditions {\r\n\t\t\tget;\r\n\t\t\tprivate set;\r\n\t\t}\r\n\t\tpublic FontFilterForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\t\tpublic FontFilterForm(XmlNode fontInfo) : this() {\r\n\t\t\t_fontInfo = fontInfo as XmlElement;\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tvar tcr = _FontInfoBox.TreeColumnRenderer;\r\n\t\t\ttcr.LinePen = new Pen(SystemColors.ControlDark) {\r\n\t\t\t\tDashCap = System.Drawing.Drawing2D.DashCap.Round,\r\n\t\t\t\tDashStyle = System.Drawing.Drawing2D.DashStyle.Dash\r\n\t\t\t};\r\n\r\n\t\t\t_FontInfoBox.CanExpandGetter = (object o) => o is XmlElement f && f.Name == Constants.Font.ThisName && f.HasChildNodes;\r\n\t\t\t_FontInfoBox.ChildrenGetter = (object o) => o is XmlElement f ? (System.Collections.IEnumerable)f.SelectNodes(Constants.Font.Size) : null;\r\n\t\t\t_FontInfoBox.RowFormatter = (BrightIdeasSoftware.OLVListItem o) => {\r\n\t\t\t\tif (_FontInfoBox.GetParent(o.RowObject) == null) {\r\n\t\t\t\t\to.SubItems[0].Font = new Font(o.SubItems[0].Font, FontStyle.Bold);\r\n\t\t\t\t\to.SubItems[1].Text = String.Empty;\r\n\t\t\t\t\to.BackColor = Color.LightBlue;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_FontNameSizeColumn.AspectGetter = (object o) => {\r\n\t\t\t\tif (o is not XmlElement f) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tif (f.Name == Constants.Font.ThisName) {\r\n\t\t\t\t\treturn f.GetAttribute(Constants.Font.Name);\r\n\t\t\t\t}\r\n\t\t\t\telse if (f.ParentNode?.Name == Constants.Font.ThisName) {\r\n\t\t\t\t\tf.GetAttribute(Constants.Font.Size).TryParse(out float p);\r\n\t\t\t\t\tvar t = f.GetAttribute(Constants.FontOccurrence.FirstText);\r\n\t\t\t\t\treturn String.Concat(p.ToText(), \"(\", t, \")\");\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t};\r\n\t\t\t_CountColumn.AspectGetter = (object o) => {\r\n\t\t\t\tif (o is XmlElement f) {\r\n\t\t\t\t\tf.GetAttribute(Constants.FontOccurrence.Count).TryParse(out int p);\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t};\r\n\t\t\t_FirstPageColumn.AspectGetter = (object o) => {\r\n\t\t\t\tif (o is XmlElement f) {\r\n\t\t\t\t\tf.GetAttribute(Constants.FontOccurrence.FirstPage).TryParse(out int p);\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t};\r\n\t\t\t_ConditionColumn.AspectGetter = (object o) => o is AutoBookmarkCondition c ? c.Description : (object)null;\r\n\r\n\t\t\tif (_fontInfo == null) {\r\n\t\t\t\tFormHelper.ErrorBox(\"缺少字体信息。\");\r\n\t\t\t\t_OkButton.Enabled = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar fonts = _fontInfo.SelectNodes(Constants.Font.ThisName + \"[@\" + Constants.Font.Name + \" and \" + Constants.Font.Size + \"]\");\r\n\t\t\tvar fi = new XmlElement[fonts.Count];\r\n\t\t\tvar i = 0;\r\n\t\t\tforeach (XmlElement f in fonts) {\r\n\t\t\t\tfi[i++] = f;\r\n\t\t\t}\r\n\t\t\t_FontInfoBox.AddObjects(fi);\r\n\t\t\tforeach (XmlElement item in _FontInfoBox.Roots) {\r\n\t\t\t\t_FontInfoBox.Expand(item);\r\n\t\t\t}\r\n\t\t\tif (_FontInfoBox.GetItemCount() > 0) {\r\n\t\t\t\t_FontInfoBox.EnsureVisible(0);\r\n\t\t\t\t_FontInfoBox.Sort(_CountColumn, SortOrder.Descending);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tif (_FilterBox.Items.Count > 0) {\r\n\t\t\t\tFilterConditions = new AutoBookmarkCondition[_FilterBox.Items.Count];\r\n\t\t\t\tfor (int i = 0; i < FilterConditions.Length; i++) {\r\n\t\t\t\t\tFilterConditions[i] = _FilterBox.GetModelObject(i) as AutoBookmarkCondition;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _AddFilterMenu_Opening(object sender, CancelEventArgs e) {\r\n\t\t\tif (_FontInfoBox.FocusedItem == null) {\r\n\t\t\t\tif (_FontInfoBox.SelectedItem != null) {\r\n\t\t\t\t\t_FontInfoBox.FocusedItem = _FontInfoBox.SelectedItem;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\te.Cancel = true;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_FontInfoBox.GetModelObject(_FontInfoBox.FocusedItem.Index) is not XmlElement f) {\r\n\t\t\t\te.Cancel = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar n = (f.ParentNode.Name == Constants.Font.ThisName ? (f.ParentNode as XmlElement) : f).GetAttribute(Constants.Font.Name);\r\n\t\t\tif (String.IsNullOrEmpty(n)) {\r\n\t\t\t\te.Cancel = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tf.GetAttribute(Constants.Font.Size).TryParse(out float s);\r\n\r\n\t\t\t_AddFilterMenu.Items.Clear();\r\n\t\t\tvar p = n.IndexOf('+');\r\n\t\t\tvar m = n.IndexOfAny(new char[] { '-', ',' }, p != -1 ? p : 0);\r\n\t\t\tstring fn;\r\n\t\t\tif (p != -1) {\r\n\t\t\t\tif (m > p + 1) {\r\n\t\t\t\t\tfn = n.Substring(p + 1, m - p - 1);\r\n\t\t\t\t\tif (s > 0) {\r\n\t\t\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称包含“\" + fn + \"”且尺寸为\" + s.ToText() + \"的字体\").Tag = new FilterSetting(fn, false, s);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称包含“\" + fn + \"”的字体\").Tag = new FilterSetting(fn, false, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfn = n.Substring(p + 1);\r\n\t\t\t\tif (s > 0) {\r\n\t\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称包含“\" + fn + \"”且尺寸为\" + s.ToText() + \"的字体\").Tag = new FilterSetting(fn, false, s);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称包含“\" + fn + \"”的字体\").Tag = new FilterSetting(fn, false, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (p == -1 && m != -1) {\r\n\t\t\t\tfn = n.Substring(0, m);\r\n\t\t\t\tif (s > 0) {\r\n\t\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称包含“\" + fn + \"”且尺寸为\" + s.ToText() + \"的字体\").Tag = new FilterSetting(fn, false, s);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称包含“\" + fn + \"”的字体\").Tag = new FilterSetting(fn, false, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_AddFilterMenu.Items.Count > 0) {\r\n\t\t\t\t_AddFilterMenu.Items.Add(new ToolStripSeparator());\r\n\t\t\t}\r\n\t\t\tif (s > 0) {\r\n\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称为“\" + n + \"”且尺寸为\" + s.ToText() + \"的字体\").Tag = new FilterSetting(n, true, s);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_AddFilterMenu.Items.Add(\"筛选名称为“\" + n + \"”的字体\").Tag = new FilterSetting(n, true, 0);\r\n\t\t\t}\r\n\t\t\te.Cancel = false;\r\n\t\t}\r\n\r\n\t\tvoid _AddFilterMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tif (e.ClickedItem.Tag is not FilterSetting f) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tAutoBookmarkCondition fc = new AutoBookmarkCondition.FontNameCondition(f.FontName, f.FullMatch);\r\n\t\t\tif (f.Size > 0) {\r\n\t\t\t\tvar m = new AutoBookmarkCondition.MultiCondition(fc);\r\n\t\t\t\tm.Conditions.Add(new AutoBookmarkCondition.TextSizeCondition(f.Size));\r\n\t\t\t\tfc = m;\r\n\t\t\t}\r\n\t\t\t_FilterBox.AddObject(fc);\r\n\t\t}\r\n\r\n\t\tvoid ControlEvent(object sender, EventArgs e) {\r\n\t\t\tif (sender == _RemoveConditionButton) {\r\n\t\t\t\t_FilterBox.RemoveObjects(_FilterBox.SelectedObjects);\r\n\t\t\t}\r\n\t\t\telse if (sender == _AddConditionButton) {\r\n\t\t\t\t_AddFilterMenu.Show(_AddConditionButton, 0, _AddConditionButton.Height);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/FontFilterForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_AddFilterMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>123, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/FontNameConditionEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class FontNameConditionEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._FontNameBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis._FullMatchBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (3, 9);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (89, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"匹配字体名称：\";\r\n\t\t\t// \r\n\t\t\t// _FontNameBox\r\n\t\t\t// \r\n\t\t\tthis._FontNameBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FontNameBox.Location = new System.Drawing.Point (98, 6);\r\n\t\t\tthis._FontNameBox.Name = \"_FontNameBox\";\r\n\t\t\tthis._FontNameBox.Size = new System.Drawing.Size (238, 21);\r\n\t\t\tthis._FontNameBox.TabIndex = 1;\r\n\t\t\tthis._FontNameBox.TextChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _FullMatchBox\r\n\t\t\t// \r\n\t\t\tthis._FullMatchBox.AutoSize = true;\r\n\t\t\tthis._FullMatchBox.Location = new System.Drawing.Point (5, 33);\r\n\t\t\tthis._FullMatchBox.Name = \"_FullMatchBox\";\r\n\t\t\tthis._FullMatchBox.Size = new System.Drawing.Size (120, 16);\r\n\t\t\tthis._FullMatchBox.TabIndex = 2;\r\n\t\t\tthis._FullMatchBox.Text = \"完全匹配字体名称\";\r\n\t\t\tthis._FullMatchBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._FullMatchBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// FontNameFilterEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this._FullMatchBox);\r\n\t\t\tthis.Controls.Add (this._FontNameBox);\r\n\t\t\tthis.Controls.Add (this.label1);\r\n\t\t\tthis.Name = \"FontNameFilterEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (339, 80);\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _FontNameBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FullMatchBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/FontNameConditionEditor.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tsealed partial class FontNameConditionEditor : UserControl, IFilterConditionEditor\r\n\t{\r\n\t\tAutoBookmarkCondition.FontNameCondition _filter;\r\n\t\tbool _lock;\r\n\r\n\t\tpublic FontNameConditionEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\t#region ITextInfoFilterEditor 成员\r\n\t\tpublic UserControl EditorControl => this;\r\n\r\n\t\tpublic AutoBookmarkCondition Filter {\r\n\t\t\tget => _filter;\r\n\t\t\tset {\r\n\t\t\t\t_filter = (AutoBookmarkCondition.FontNameCondition)value;\r\n\t\t\t\t_lock = true;\r\n\t\t\t\t_FontNameBox.Text = _filter.FontName;\r\n\t\t\t\t_FullMatchBox.Checked = _filter.MatchFullName;\r\n\t\t\t\t_lock = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid ControlChanged(object sender, EventArgs e) {\r\n\t\t\tif (_lock) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (sender == _FontNameBox) {\r\n\t\t\t\t_filter.FontName = _FontNameBox.Text;\r\n\t\t\t}\r\n\t\t\telse if (sender == _FullMatchBox) {\r\n\t\t\t\t_filter.MatchFullName = _FullMatchBox.Checked;\r\n\t\t\t}\r\n\t\t\tEditAdjustmentForm.UpdateFilter(this);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/FontNameConditionEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/PageRangeConditionEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class PageRangeConditionEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._PageRangeBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (3, 9);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (89, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"匹配页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _PageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._PageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageRangeBox.Location = new System.Drawing.Point (98, 6);\r\n\t\t\tthis._PageRangeBox.Name = \"_PageRangeBox\";\r\n\t\t\tthis._PageRangeBox.Size = new System.Drawing.Size (237, 21);\r\n\t\t\tthis._PageRangeBox.TabIndex = 1;\r\n\t\t\tthis._PageRangeBox.TextChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// PageNumberConditionEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this._PageRangeBox);\r\n\t\t\tthis.Controls.Add (this.label1);\r\n\t\t\tthis.Name = \"PageNumberConditionEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (338, 71);\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _PageRangeBox;\r\n\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/PageRangeConditionEditor.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class PageRangeConditionEditor : UserControl, IFilterConditionEditor\r\n\t{\r\n\t\tAutoBookmarkCondition.PageRangeCondition _condition;\r\n\t\tbool _lock;\r\n\r\n\t\tpublic PageRangeConditionEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\t#region ITextInfoFilterEditor 成员\r\n\r\n\t\tpublic AutoBookmarkCondition Filter {\r\n\t\t\tget => _condition;\r\n\t\t\tset {\r\n\t\t\t\t_condition = (AutoBookmarkCondition.PageRangeCondition)value;\r\n\t\t\t\t_lock = true;\r\n\t\t\t\t_PageRangeBox.Text = _condition.PageRange;\r\n\t\t\t\t_lock = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic UserControl EditorControl => this;\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid ControlChanged(object sender, EventArgs e) {\r\n\t\t\tif (_lock) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_condition.PageRange = _PageRangeBox.Text;\r\n\t\t\tEditAdjustmentForm.UpdateFilter(this);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/PageRangeConditionEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/TextConditionEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class TextConditionEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._PatternBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis._FullMatchBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._MatchCaseBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._UseRegexBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (3, 9);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (89, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"匹配文本内容：\";\r\n\t\t\t// \r\n\t\t\t// _PatternBox\r\n\t\t\t// \r\n\t\t\tthis._PatternBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PatternBox.Location = new System.Drawing.Point (98, 6);\r\n\t\t\tthis._PatternBox.Name = \"_PatternBox\";\r\n\t\t\tthis._PatternBox.Size = new System.Drawing.Size (238, 21);\r\n\t\t\tthis._PatternBox.TabIndex = 1;\r\n\t\t\tthis._PatternBox.TextChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _FullMatchBox\r\n\t\t\t// \r\n\t\t\tthis._FullMatchBox.AutoSize = true;\r\n\t\t\tthis._FullMatchBox.Location = new System.Drawing.Point (5, 33);\r\n\t\t\tthis._FullMatchBox.Name = \"_FullMatchBox\";\r\n\t\t\tthis._FullMatchBox.Size = new System.Drawing.Size (72, 16);\r\n\t\t\tthis._FullMatchBox.TabIndex = 2;\r\n\t\t\tthis._FullMatchBox.Text = \"完全匹配\";\r\n\t\t\tthis._FullMatchBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._FullMatchBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _MatchCaseBox\r\n\t\t\t// \r\n\t\t\tthis._MatchCaseBox.AutoSize = true;\r\n\t\t\tthis._MatchCaseBox.Location = new System.Drawing.Point (98, 33);\r\n\t\t\tthis._MatchCaseBox.Name = \"_MatchCaseBox\";\r\n\t\t\tthis._MatchCaseBox.Size = new System.Drawing.Size (108, 16);\r\n\t\t\tthis._MatchCaseBox.TabIndex = 3;\r\n\t\t\tthis._MatchCaseBox.Text = \"匹配英文大小写\";\r\n\t\t\tthis._MatchCaseBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._MatchCaseBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _UseRegexBox\r\n\t\t\t// \r\n\t\t\tthis._UseRegexBox.AutoSize = true;\r\n\t\t\tthis._UseRegexBox.Location = new System.Drawing.Point (212, 33);\r\n\t\t\tthis._UseRegexBox.Name = \"_UseRegexBox\";\r\n\t\t\tthis._UseRegexBox.Size = new System.Drawing.Size (108, 16);\r\n\t\t\tthis._UseRegexBox.TabIndex = 4;\r\n\t\t\tthis._UseRegexBox.Text = \"使用正则表达式\";\r\n\t\t\tthis._UseRegexBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._UseRegexBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// TextConditionEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this._UseRegexBox);\r\n\t\t\tthis.Controls.Add (this._MatchCaseBox);\r\n\t\t\tthis.Controls.Add (this._FullMatchBox);\r\n\t\t\tthis.Controls.Add (this._PatternBox);\r\n\t\t\tthis.Controls.Add (this.label1);\r\n\t\t\tthis.Name = \"TextConditionEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (339, 80);\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _PatternBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FullMatchBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MatchCaseBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _UseRegexBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/TextConditionEditor.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tsealed partial class TextConditionEditor : UserControl, IFilterConditionEditor\r\n\t{\r\n\t\tAutoBookmarkCondition.TextCondition _filter;\r\n\t\tbool _lock;\r\n\r\n\t\tpublic TextConditionEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\t#region ITextInfoFilterEditor 成员\r\n\t\tpublic UserControl EditorControl => this;\r\n\r\n\t\tpublic AutoBookmarkCondition Filter {\r\n\t\t\tget => _filter;\r\n\t\t\tset {\r\n\t\t\t\t_filter = (AutoBookmarkCondition.TextCondition)value;\r\n\t\t\t\t_lock = true;\r\n\t\t\t\t_PatternBox.Text = _filter.Pattern.Text;\r\n\t\t\t\t_FullMatchBox.Checked = _filter.Pattern.FullMatch;\r\n\t\t\t\t_MatchCaseBox.Checked = _filter.Pattern.MatchCase;\r\n\t\t\t\t_UseRegexBox.Checked = _filter.Pattern.UseRegularExpression;\r\n\t\t\t\t_lock = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid ControlChanged(object sender, EventArgs e) {\r\n\t\t\tif (_lock) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (sender == _PatternBox) {\r\n\t\t\t\t_filter.Pattern.Text = _PatternBox.Text;\r\n\t\t\t}\r\n\t\t\telse if (sender == _FullMatchBox) {\r\n\t\t\t\t_filter.Pattern.FullMatch = _FullMatchBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _MatchCaseBox) {\r\n\t\t\t\t_filter.Pattern.MatchCase = _MatchCaseBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _UseRegexBox) {\r\n\t\t\t\t_filter.Pattern.UseRegularExpression = _UseRegexBox.Checked;\r\n\t\t\t}\r\n\t\t\tEditAdjustmentForm.UpdateFilter(this);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/TextConditionEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/TextPositionConditionEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class TextPositionConditionEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.panel2 = new System.Windows.Forms.Panel ();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._PositionBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis._RangeBox = new System.Windows.Forms.RadioButton ();\r\n\t\t\tthis._SpecificValueBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._SpecificBox = new System.Windows.Forms.RadioButton ();\r\n\t\t\tthis._MinBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._MaxBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.panel2.SuspendLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._SpecificValueBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MaxBox)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// panel2\r\n\t\t\t// \r\n\t\t\tthis.panel2.Controls.Add (this.label2);\r\n\t\t\tthis.panel2.Controls.Add (this._PositionBox);\r\n\t\t\tthis.panel2.Controls.Add (this._RangeBox);\r\n\t\t\tthis.panel2.Controls.Add (this._SpecificValueBox);\r\n\t\t\tthis.panel2.Controls.Add (this._SpecificBox);\r\n\t\t\tthis.panel2.Controls.Add (this._MinBox);\r\n\t\t\tthis.panel2.Controls.Add (this.label1);\r\n\t\t\tthis.panel2.Controls.Add (this._MaxBox);\r\n\t\t\tthis.panel2.Location = new System.Drawing.Point (3, 0);\r\n\t\t\tthis.panel2.Name = \"panel2\";\r\n\t\t\tthis.panel2.Size = new System.Drawing.Size (377, 88);\r\n\t\t\tthis.panel2.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point (21, 6);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size (101, 12);\r\n\t\t\tthis.label2.TabIndex = 5;\r\n\t\t\tthis.label2.Text = \"匹配文本块的坐标\";\r\n\t\t\t// \r\n\t\t\t// _PositionBox\r\n\t\t\t// \r\n\t\t\tthis._PositionBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._PositionBox.FormattingEnabled = true;\r\n\t\t\tthis._PositionBox.Items.AddRange (new object[] {\r\n            \"上坐标\",\r\n            \"下坐标\",\r\n            \"左坐标\",\r\n            \"右坐标\"});\r\n\t\t\tthis._PositionBox.Location = new System.Drawing.Point (135, 3);\r\n\t\t\tthis._PositionBox.Name = \"_PositionBox\";\r\n\t\t\tthis._PositionBox.Size = new System.Drawing.Size (121, 20);\r\n\t\t\tthis._PositionBox.TabIndex = 4;\r\n\t\t\tthis._PositionBox.SelectedIndexChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _RangeBox\r\n\t\t\t// \r\n\t\t\tthis._RangeBox.AutoSize = true;\r\n\t\t\tthis._RangeBox.Location = new System.Drawing.Point (23, 56);\r\n\t\t\tthis._RangeBox.Name = \"_RangeBox\";\r\n\t\t\tthis._RangeBox.Size = new System.Drawing.Size (95, 16);\r\n\t\t\tthis._RangeBox.TabIndex = 3;\r\n\t\t\tthis._RangeBox.TabStop = true;\r\n\t\t\tthis._RangeBox.Text = \"匹配坐标范围\";\r\n\t\t\tthis._RangeBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RangeBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _SpecificValueBox\r\n\t\t\t// \r\n\t\t\tthis._SpecificValueBox.DecimalPlaces = 2;\r\n\t\t\tthis._SpecificValueBox.Location = new System.Drawing.Point (135, 29);\r\n\t\t\tthis._SpecificValueBox.Maximum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._SpecificValueBox.Minimum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._SpecificValueBox.Name = \"_SpecificValueBox\";\r\n\t\t\tthis._SpecificValueBox.Size = new System.Drawing.Size (67, 21);\r\n\t\t\tthis._SpecificValueBox.TabIndex = 1;\r\n\t\t\tthis._SpecificValueBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._SpecificValueBox.ValueChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _SpecificBox\r\n\t\t\t// \r\n\t\t\tthis._SpecificBox.AutoSize = true;\r\n\t\t\tthis._SpecificBox.Location = new System.Drawing.Point (23, 29);\r\n\t\t\tthis._SpecificBox.Name = \"_SpecificBox\";\r\n\t\t\tthis._SpecificBox.Size = new System.Drawing.Size (107, 16);\r\n\t\t\tthis._SpecificBox.TabIndex = 3;\r\n\t\t\tthis._SpecificBox.TabStop = true;\r\n\t\t\tthis._SpecificBox.Text = \"匹配特定坐标值\";\r\n\t\t\tthis._SpecificBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._SpecificBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _MinBox\r\n\t\t\t// \r\n\t\t\tthis._MinBox.DecimalPlaces = 2;\r\n\t\t\tthis._MinBox.Location = new System.Drawing.Point (135, 56);\r\n\t\t\tthis._MinBox.Maximum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinBox.Minimum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._MinBox.Name = \"_MinBox\";\r\n\t\t\tthis._MinBox.Size = new System.Drawing.Size (67, 21);\r\n\t\t\tthis._MinBox.TabIndex = 1;\r\n\t\t\tthis._MinBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._MinBox.ValueChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (208, 58);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (17, 12);\r\n\t\t\tthis.label1.TabIndex = 2;\r\n\t\t\tthis.label1.Text = \"到\";\r\n\t\t\t// \r\n\t\t\t// _MaxBox\r\n\t\t\t// \r\n\t\t\tthis._MaxBox.DecimalPlaces = 2;\r\n\t\t\tthis._MaxBox.Location = new System.Drawing.Point (231, 56);\r\n\t\t\tthis._MaxBox.Maximum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MaxBox.Minimum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._MaxBox.Name = \"_MaxBox\";\r\n\t\t\tthis._MaxBox.Size = new System.Drawing.Size (67, 21);\r\n\t\t\tthis._MaxBox.TabIndex = 1;\r\n\t\t\tthis._MaxBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._MaxBox.ValueChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// TextPositionConditionEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this.panel2);\r\n\t\t\tthis.Name = \"TextPositionConditionEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (383, 88);\r\n\t\t\tthis.panel2.ResumeLayout (false);\r\n\t\t\tthis.panel2.PerformLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._SpecificValueBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MaxBox)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Panel panel2;\r\n\t\tprivate System.Windows.Forms.RadioButton _RangeBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _SpecificValueBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _SpecificBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MaxBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.ComboBox _PositionBox;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/TextPositionConditionEditor.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class TextPositionConditionEditor : UserControl, IFilterConditionEditor\r\n\t{\r\n\t\tAutoBookmarkCondition.TextPositionCondition _condition;\r\n\t\tbool _lock;\r\n\r\n\t\tpublic TextPositionConditionEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_lock = true;\r\n\t\t\t_PositionBox.SelectedIndex = 0;\r\n\t\t\t_lock = false;\r\n\t\t}\r\n\r\n\t\t#region ITextInfoFilterEditor 成员\r\n\r\n\t\tpublic AutoBookmarkCondition Filter {\r\n\t\t\tget => _condition;\r\n\t\t\tset {\r\n\t\t\t\t_condition = (AutoBookmarkCondition.TextPositionCondition)value;\r\n\t\t\t\t_lock = true;\r\n\t\t\t\t_PositionBox.SelectedIndex = _condition.Position - 1;\r\n\t\t\t\tif (_condition.MinValue == _condition.MaxValue) {\r\n\t\t\t\t\t_SpecificBox.Checked = true;\r\n\t\t\t\t\t_SpecificValueBox.Value = (decimal)_condition.MaxValue;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_RangeBox.Checked = true;\r\n\t\t\t\t\t_MaxBox.Value = (decimal)_condition.MaxValue;\r\n\t\t\t\t\t_MinBox.Value = (decimal)_condition.MinValue;\r\n\t\t\t\t}\r\n\t\t\t\tToggleControlState();\r\n\t\t\t\t_lock = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic UserControl EditorControl => this;\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid ControlChanged(object sender, EventArgs e) {\r\n\t\t\tToggleControlState();\r\n\t\t\tif (_lock) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tfloat min, max;\r\n\t\t\tif (_SpecificBox.Checked) {\r\n\t\t\t\tmin = max = (float)_SpecificValueBox.Value;\r\n\t\t\t}\r\n\t\t\telse /*if (_YRangeBox.Checked)*/ {\r\n\t\t\t\tmin = (float)_MinBox.Value;\r\n\t\t\t\tmax = (float)_MaxBox.Value;\r\n\t\t\t}\r\n\t\t\t_condition.SetRange((byte)(_PositionBox.SelectedIndex + 1), min, max);\r\n\t\t\tEditAdjustmentForm.UpdateFilter(this);\r\n\t\t}\r\n\r\n\t\tvoid ToggleControlState() {\r\n\t\t\t_MinBox.Enabled = _MaxBox.Enabled = _RangeBox.Checked;\r\n\t\t\t_SpecificValueBox.Enabled = _SpecificBox.Checked;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/TextPositionConditionEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmark/TextSizeConditionEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class TextSizeConditionEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._MinSizeBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._MaxSizeBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._SizeBox = new System.Windows.Forms.RadioButton ();\r\n\t\t\tthis._SpecificSizeBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._SizeRangeBox = new System.Windows.Forms.RadioButton ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinSizeBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MaxSizeBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._SpecificSizeBox)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _MinSizeBox\r\n\t\t\t// \r\n\t\t\tthis._MinSizeBox.DecimalPlaces = 2;\r\n\t\t\tthis._MinSizeBox.Location = new System.Drawing.Point (128, 30);\r\n\t\t\tthis._MinSizeBox.Maximum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinSizeBox.Name = \"_MinSizeBox\";\r\n\t\t\tthis._MinSizeBox.Size = new System.Drawing.Size (67, 21);\r\n\t\t\tthis._MinSizeBox.TabIndex = 1;\r\n\t\t\tthis._MinSizeBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._MinSizeBox.ValueChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _MaxSizeBox\r\n\t\t\t// \r\n\t\t\tthis._MaxSizeBox.DecimalPlaces = 2;\r\n\t\t\tthis._MaxSizeBox.Location = new System.Drawing.Point (224, 30);\r\n\t\t\tthis._MaxSizeBox.Maximum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MaxSizeBox.Name = \"_MaxSizeBox\";\r\n\t\t\tthis._MaxSizeBox.Size = new System.Drawing.Size (67, 21);\r\n\t\t\tthis._MaxSizeBox.TabIndex = 1;\r\n\t\t\tthis._MaxSizeBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._MaxSizeBox.ValueChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point (201, 32);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size (17, 12);\r\n\t\t\tthis.label2.TabIndex = 2;\r\n\t\t\tthis.label2.Text = \"到\";\r\n\t\t\t// \r\n\t\t\t// _SizeBox\r\n\t\t\t// \r\n\t\t\tthis._SizeBox.AutoSize = true;\r\n\t\t\tthis._SizeBox.Location = new System.Drawing.Point (3, 3);\r\n\t\t\tthis._SizeBox.Name = \"_SizeBox\";\r\n\t\t\tthis._SizeBox.Size = new System.Drawing.Size (119, 16);\r\n\t\t\tthis._SizeBox.TabIndex = 3;\r\n\t\t\tthis._SizeBox.TabStop = true;\r\n\t\t\tthis._SizeBox.Text = \"匹配特定文本尺寸\";\r\n\t\t\tthis._SizeBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._SizeBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _SpecificSizeBox\r\n\t\t\t// \r\n\t\t\tthis._SpecificSizeBox.DecimalPlaces = 2;\r\n\t\t\tthis._SpecificSizeBox.Location = new System.Drawing.Point (128, 3);\r\n\t\t\tthis._SpecificSizeBox.Maximum = new decimal (new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._SpecificSizeBox.Name = \"_SpecificSizeBox\";\r\n\t\t\tthis._SpecificSizeBox.Size = new System.Drawing.Size (67, 21);\r\n\t\t\tthis._SpecificSizeBox.TabIndex = 1;\r\n\t\t\tthis._SpecificSizeBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._SpecificSizeBox.ValueChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// _SizeRangeBox\r\n\t\t\t// \r\n\t\t\tthis._SizeRangeBox.AutoSize = true;\r\n\t\t\tthis._SizeRangeBox.Location = new System.Drawing.Point (3, 30);\r\n\t\t\tthis._SizeRangeBox.Name = \"_SizeRangeBox\";\r\n\t\t\tthis._SizeRangeBox.Size = new System.Drawing.Size (119, 16);\r\n\t\t\tthis._SizeRangeBox.TabIndex = 3;\r\n\t\t\tthis._SizeRangeBox.TabStop = true;\r\n\t\t\tthis._SizeRangeBox.Text = \"匹配文本尺寸范围\";\r\n\t\t\tthis._SizeRangeBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._SizeRangeBox.CheckedChanged += new System.EventHandler (this.ControlChanged);\r\n\t\t\t// \r\n\t\t\t// FontSizeFilterEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this._SizeRangeBox);\r\n\t\t\tthis.Controls.Add (this._SizeBox);\r\n\t\t\tthis.Controls.Add (this.label2);\r\n\t\t\tthis.Controls.Add (this._MaxSizeBox);\r\n\t\t\tthis.Controls.Add (this._SpecificSizeBox);\r\n\t\t\tthis.Controls.Add (this._MinSizeBox);\r\n\t\t\tthis.Name = \"FontSizeFilterEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (338, 71);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinSizeBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MaxSizeBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._SpecificSizeBox)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinSizeBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MaxSizeBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.RadioButton _SizeBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _SpecificSizeBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _SizeRangeBox;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/TextSizeConditionEditor.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class TextSizeConditionEditor : UserControl, IFilterConditionEditor\r\n\t{\r\n\t\tAutoBookmarkCondition.TextSizeCondition _condition;\r\n\t\tbool _lock;\r\n\r\n\t\tpublic TextSizeConditionEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\t#region ITextInfoFilterEditor 成员\r\n\r\n\t\tpublic AutoBookmarkCondition Filter {\r\n\t\t\tget => _condition;\r\n\t\t\tset {\r\n\t\t\t\t_condition = (AutoBookmarkCondition.TextSizeCondition)value;\r\n\t\t\t\t_lock = true;\r\n\t\t\t\tif (_condition.MinSize == _condition.MaxSize) {\r\n\t\t\t\t\t_SizeBox.Checked = true;\r\n\t\t\t\t\t_SpecificSizeBox.Value = (decimal)_condition.MaxSize;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_SizeRangeBox.Checked = true;\r\n\t\t\t\t\t_MaxSizeBox.Value = (decimal)_condition.MaxSize;\r\n\t\t\t\t\t_MinSizeBox.Value = (decimal)_condition.MinSize;\r\n\t\t\t\t}\r\n\t\t\t\tToggleControlState();\r\n\t\t\t\t_lock = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic UserControl EditorControl => this;\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid ControlChanged(object sender, EventArgs e) {\r\n\t\t\tToggleControlState();\r\n\t\t\tif (_lock) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_SizeBox.Checked) {\r\n\t\t\t\t_condition.SetRange((float)_SpecificSizeBox.Value, (float)_SpecificSizeBox.Value);\r\n\t\t\t}\r\n\t\t\telse if (_SizeRangeBox.Checked) {\r\n\t\t\t\t_condition.SetRange((float)_MinSizeBox.Value, (float)_MaxSizeBox.Value);\r\n\t\t\t}\r\n\t\t\tEditAdjustmentForm.UpdateFilter(this);\r\n\t\t}\r\n\r\n\t\tvoid ToggleControlState() {\r\n\t\t\t_MinSizeBox.Enabled = _MaxSizeBox.Enabled = _SizeRangeBox.Checked;\r\n\t\t\t_SpecificSizeBox.Enabled = _SizeBox.Checked;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmark/TextSizeConditionEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/AutoBookmarkControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class AutoBookmarkControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton _AddAdjustmentButton;\r\n\t\t\tSystem.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\r\n\t\t\tSystem.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();\r\n\t\t\tthis._AddFilterMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._TitleSizeThresholdBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._MergeAdjacentTitlesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._MergeDifferentSizeTitlesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._FirstLineAsTitleBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._IgnoreOverlappedTextBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._CreateBookmarkForFirstPageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._WritingDirectionBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._AutoHierarchicalArrangementBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label();\r\n\t\t\tthis._MaxDistanceBetweenLinesBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._GoToPageTopLevelBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._YOffsetBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._MergeDifferentFontTitlesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._IgnoreNumericTitleBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ClearTextFiltersButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._IgnorePatternsBox = new System.Windows.Forms.DataGridView();\r\n\t\t\tthis._PatternColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();\r\n\t\t\tthis._MatchCaseColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();\r\n\t\t\tthis._FullMatchColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();\r\n\t\t\tthis._PatternTypeColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();\r\n\t\t\tthis._RemovePatternColumn = new System.Windows.Forms.DataGridViewLinkColumn();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis.tabPage3 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._FilterToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();\r\n\t\t\tthis._AddFilterFromInfoFileButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._DeleteAdjustmentButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tthis._CopyFilterButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._PasteButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._LevelAdjustmentBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._AdvancedFilterColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._AdjustmentLevelColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._RelativeAdjustmentColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FilterBeforeMergeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label();\r\n\t\t\tthis.tabPage5 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._ExportTextCoordinateBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ShowAllFontsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._DisplayFontStatisticsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._BookmarkControl = new PDFPatcher.BookmarkControl();\r\n\t\t\tthis._SourceFileControl = new PDFPatcher.SourceFileControl();\r\n\t\t\tthis._ExportBookmarkButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\t_AddAdjustmentButton = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TitleSizeThresholdBox)).BeginInit();\r\n\t\t\tthis.tabControl1.SuspendLayout();\r\n\t\t\tthis.tabPage1.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MaxDistanceBetweenLinesBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._GoToPageTopLevelBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._YOffsetBox)).BeginInit();\r\n\t\t\tthis.tabPage2.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._IgnorePatternsBox)).BeginInit();\r\n\t\t\tthis.tabPage3.SuspendLayout();\r\n\t\t\tthis._FilterToolbar.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LevelAdjustmentBox)).BeginInit();\r\n\t\t\tthis.tabPage5.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _AddAdjustmentButton\r\n\t\t\t// \r\n\t\t\t_AddAdjustmentButton.DropDown = this._AddFilterMenu;\r\n\t\t\t_AddAdjustmentButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\t_AddAdjustmentButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_AddAdjustmentButton.Name = \"_AddAdjustmentButton\";\r\n\t\t\t_AddAdjustmentButton.Size = new System.Drawing.Size(61, 22);\r\n\t\t\t_AddAdjustmentButton.Text = \"添加\";\r\n\t\t\t// \r\n\t\t\t// _AddFilterMenu\r\n\t\t\t// \r\n\t\t\tthis._AddFilterMenu.Name = \"_AddFilterMenu\";\r\n\t\t\tthis._AddFilterMenu.Size = new System.Drawing.Size(61, 4);\r\n\t\t\tthis._AddFilterMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._AddFilterMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _TitleSizeThresholdBox\r\n\t\t\t// \r\n\t\t\tthis._TitleSizeThresholdBox.DecimalPlaces = 2;\r\n\t\t\tthis._TitleSizeThresholdBox.Location = new System.Drawing.Point(98, 36);\r\n\t\t\tthis._TitleSizeThresholdBox.Maximum = new decimal(new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TitleSizeThresholdBox.Name = \"_TitleSizeThresholdBox\";\r\n\t\t\tthis._TitleSizeThresholdBox.Size = new System.Drawing.Size(68, 21);\r\n\t\t\tthis._TitleSizeThresholdBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(3, 38);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label2.TabIndex = 2;\r\n\t\t\tthis.label2.Text = \"标题文本尺寸：\";\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(3, 12);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"识别页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _PageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._PageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageRangeBox.Location = new System.Drawing.Point(98, 9);\r\n\t\t\tthis._PageRangeBox.Name = \"_PageRangeBox\";\r\n\t\t\tthis._PageRangeBox.Size = new System.Drawing.Size(321, 21);\r\n\t\t\tthis._PageRangeBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _MergeAdjacentTitlesBox\r\n\t\t\t// \r\n\t\t\tthis._MergeAdjacentTitlesBox.AutoSize = true;\r\n\t\t\tthis._MergeAdjacentTitlesBox.Location = new System.Drawing.Point(6, 84);\r\n\t\t\tthis._MergeAdjacentTitlesBox.Name = \"_MergeAdjacentTitlesBox\";\r\n\t\t\tthis._MergeAdjacentTitlesBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._MergeAdjacentTitlesBox.TabIndex = 10;\r\n\t\t\tthis._MergeAdjacentTitlesBox.Text = \"合并连续出现的标题\";\r\n\t\t\tthis._MergeAdjacentTitlesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _MergeDifferentSizeTitlesBox\r\n\t\t\t// \r\n\t\t\tthis._MergeDifferentSizeTitlesBox.AutoSize = true;\r\n\t\t\tthis._MergeDifferentSizeTitlesBox.Location = new System.Drawing.Point(6, 105);\r\n\t\t\tthis._MergeDifferentSizeTitlesBox.Name = \"_MergeDifferentSizeTitlesBox\";\r\n\t\t\tthis._MergeDifferentSizeTitlesBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._MergeDifferentSizeTitlesBox.TabIndex = 14;\r\n\t\t\tthis._MergeDifferentSizeTitlesBox.Text = \"合并不同文本尺寸的标题\";\r\n\t\t\tthis._MergeDifferentSizeTitlesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// tabControl1\r\n\t\t\t// \r\n\t\t\tthis.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage1);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage2);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage3);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage5);\r\n\t\t\tthis.tabControl1.Location = new System.Drawing.Point(12, 93);\r\n\t\t\tthis.tabControl1.Name = \"tabControl1\";\r\n\t\t\tthis.tabControl1.SelectedIndex = 0;\r\n\t\t\tthis.tabControl1.Size = new System.Drawing.Size(463, 229);\r\n\t\t\tthis.tabControl1.TabIndex = 4;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add(this._FirstLineAsTitleBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._IgnoreOverlappedTextBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._CreateBookmarkForFirstPageBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label6);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label5);\r\n\t\t\tthis.tabPage1.Controls.Add(this._WritingDirectionBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._AutoHierarchicalArrangementBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label11);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MaxDistanceBetweenLinesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._GoToPageTopLevelBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label7);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label9);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label4);\r\n\t\t\tthis.tabPage1.Controls.Add(this._YOffsetBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MergeDifferentFontTitlesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MergeDifferentSizeTitlesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label3);\r\n\t\t\tthis.tabPage1.Controls.Add(this._TitleSizeThresholdBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label2);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MergeAdjacentTitlesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._PageRangeBox);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"标题识别\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FirstLineAsTitleBox\r\n\t\t\t// \r\n\t\t\tthis._FirstLineAsTitleBox.AutoSize = true;\r\n\t\t\tthis._FirstLineAsTitleBox.Location = new System.Drawing.Point(6, 170);\r\n\t\t\tthis._FirstLineAsTitleBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._FirstLineAsTitleBox.Name = \"_FirstLineAsTitleBox\";\r\n\t\t\tthis._FirstLineAsTitleBox.Size = new System.Drawing.Size(168, 16);\r\n\t\t\tthis._FirstLineAsTitleBox.TabIndex = 20;\r\n\t\t\tthis._FirstLineAsTitleBox.Text = \"将每页第一行文本作为标题\";\r\n\t\t\tthis._FirstLineAsTitleBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _IgnoreOverlappedTextBox\r\n\t\t\t// \r\n\t\t\tthis._IgnoreOverlappedTextBox.AutoSize = true;\r\n\t\t\tthis._IgnoreOverlappedTextBox.Location = new System.Drawing.Point(6, 149);\r\n\t\t\tthis._IgnoreOverlappedTextBox.Name = \"_IgnoreOverlappedTextBox\";\r\n\t\t\tthis._IgnoreOverlappedTextBox.Size = new System.Drawing.Size(108, 16);\r\n\t\t\tthis._IgnoreOverlappedTextBox.TabIndex = 18;\r\n\t\t\tthis._IgnoreOverlappedTextBox.Text = \"忽略重叠的文本\";\r\n\t\t\tthis._IgnoreOverlappedTextBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CreateBookmarkForFirstPageBox\r\n\t\t\t// \r\n\t\t\tthis._CreateBookmarkForFirstPageBox.AutoSize = true;\r\n\t\t\tthis._CreateBookmarkForFirstPageBox.Location = new System.Drawing.Point(200, 143);\r\n\t\t\tthis._CreateBookmarkForFirstPageBox.Name = \"_CreateBookmarkForFirstPageBox\";\r\n\t\t\tthis._CreateBookmarkForFirstPageBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._CreateBookmarkForFirstPageBox.TabIndex = 19;\r\n\t\t\tthis._CreateBookmarkForFirstPageBox.Text = \"文件名作为首页书签\";\r\n\t\t\tthis._CreateBookmarkForFirstPageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(198, 91);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(113, 12);\r\n\t\t\tthis.label6.TabIndex = 11;\r\n\t\t\tthis.label6.Text = \"合并连续标题不大于\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(198, 66);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label5.TabIndex = 8;\r\n\t\t\tthis.label5.Text = \"文字排版方向：\";\r\n\t\t\t// \r\n\t\t\t// _WritingDirectionBox\r\n\t\t\t// \r\n\t\t\tthis._WritingDirectionBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._WritingDirectionBox.FormattingEnabled = true;\r\n\t\t\tthis._WritingDirectionBox.Items.AddRange(new object[] {\r\n            \"自动检测\",\r\n            \"横向\",\r\n            \"纵向\"});\r\n\t\t\tthis._WritingDirectionBox.Location = new System.Drawing.Point(293, 63);\r\n\t\t\tthis._WritingDirectionBox.Name = \"_WritingDirectionBox\";\r\n\t\t\tthis._WritingDirectionBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._WritingDirectionBox.TabIndex = 9;\r\n\t\t\t// \r\n\t\t\t// _AutoHierarchicalArrangementBox\r\n\t\t\t// \r\n\t\t\tthis._AutoHierarchicalArrangementBox.AutoSize = true;\r\n\t\t\tthis._AutoHierarchicalArrangementBox.Location = new System.Drawing.Point(6, 63);\r\n\t\t\tthis._AutoHierarchicalArrangementBox.Name = \"_AutoHierarchicalArrangementBox\";\r\n\t\t\tthis._AutoHierarchicalArrangementBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._AutoHierarchicalArrangementBox.TabIndex = 7;\r\n\t\t\tthis._AutoHierarchicalArrangementBox.Text = \"自动组织标题层次\";\r\n\t\t\tthis._AutoHierarchicalArrangementBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point(250, 118);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size(101, 12);\r\n\t\t\tthis.label11.TabIndex = 17;\r\n\t\t\tthis.label11.Text = \"层标题定位到页首\";\r\n\t\t\t// \r\n\t\t\t// _MaxDistanceBetweenLinesBox\r\n\t\t\t// \r\n\t\t\tthis._MaxDistanceBetweenLinesBox.DecimalPlaces = 2;\r\n\t\t\tthis._MaxDistanceBetweenLinesBox.Location = new System.Drawing.Point(317, 89);\r\n\t\t\tthis._MaxDistanceBetweenLinesBox.Maximum = new decimal(new int[] {\r\n            9,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MaxDistanceBetweenLinesBox.Name = \"_MaxDistanceBetweenLinesBox\";\r\n\t\t\tthis._MaxDistanceBetweenLinesBox.Size = new System.Drawing.Size(55, 21);\r\n\t\t\tthis._MaxDistanceBetweenLinesBox.TabIndex = 12;\r\n\t\t\t// \r\n\t\t\t// _GoToPageTopLevelBox\r\n\t\t\t// \r\n\t\t\tthis._GoToPageTopLevelBox.Location = new System.Drawing.Point(200, 116);\r\n\t\t\tthis._GoToPageTopLevelBox.Maximum = new decimal(new int[] {\r\n            9,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._GoToPageTopLevelBox.Name = \"_GoToPageTopLevelBox\";\r\n\t\t\tthis._GoToPageTopLevelBox.Size = new System.Drawing.Size(41, 21);\r\n\t\t\tthis._GoToPageTopLevelBox.TabIndex = 16;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(378, 91);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label7.TabIndex = 13;\r\n\t\t\tthis.label7.Text = \"倍行距\";\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(359, 38);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label9.TabIndex = 6;\r\n\t\t\tthis.label9.Text = \"倍行距\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(174, 38);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(113, 12);\r\n\t\t\tthis.label4.TabIndex = 4;\r\n\t\t\tthis.label4.Text = \"定位位置向上偏移：\";\r\n\t\t\t// \r\n\t\t\t// _YOffsetBox\r\n\t\t\t// \r\n\t\t\tthis._YOffsetBox.DecimalPlaces = 2;\r\n\t\t\tthis._YOffsetBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._YOffsetBox.Location = new System.Drawing.Point(293, 36);\r\n\t\t\tthis._YOffsetBox.Maximum = new decimal(new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._YOffsetBox.Minimum = new decimal(new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._YOffsetBox.Name = \"_YOffsetBox\";\r\n\t\t\tthis._YOffsetBox.Size = new System.Drawing.Size(60, 21);\r\n\t\t\tthis._YOffsetBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// _MergeDifferentFontTitlesBox\r\n\t\t\t// \r\n\t\t\tthis._MergeDifferentFontTitlesBox.AutoSize = true;\r\n\t\t\tthis._MergeDifferentFontTitlesBox.Location = new System.Drawing.Point(6, 127);\r\n\t\t\tthis._MergeDifferentFontTitlesBox.Name = \"_MergeDifferentFontTitlesBox\";\r\n\t\t\tthis._MergeDifferentFontTitlesBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._MergeDifferentFontTitlesBox.TabIndex = 15;\r\n\t\t\tthis._MergeDifferentFontTitlesBox.Text = \"合并不同字体的标题\";\r\n\t\t\tthis._MergeDifferentFontTitlesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// tabPage2\r\n\t\t\t// \r\n\t\t\tthis.tabPage2.Controls.Add(this._IgnoreNumericTitleBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this._IgnoreSingleCharacterTitleBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this._ClearTextFiltersButton);\r\n\t\t\tthis.tabPage2.Controls.Add(this._IgnorePatternsBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label10);\r\n\t\t\tthis.tabPage2.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage2.Name = \"tabPage2\";\r\n\t\t\tthis.tabPage2.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage2.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage2.TabIndex = 1;\r\n\t\t\tthis.tabPage2.Text = \"文本过滤\";\r\n\t\t\tthis.tabPage2.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _IgnoreNumericTitleBox\r\n\t\t\t// \r\n\t\t\tthis._IgnoreNumericTitleBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._IgnoreNumericTitleBox.AutoSize = true;\r\n\t\t\tthis._IgnoreNumericTitleBox.Location = new System.Drawing.Point(170, 171);\r\n\t\t\tthis._IgnoreNumericTitleBox.Name = \"_IgnoreNumericTitleBox\";\r\n\t\t\tthis._IgnoreNumericTitleBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._IgnoreNumericTitleBox.TabIndex = 22;\r\n\t\t\tthis._IgnoreNumericTitleBox.Text = \"忽略只有数字的标题\";\r\n\t\t\tthis._IgnoreNumericTitleBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _IgnoreSingleCharacterTitleBox\r\n\t\t\t// \r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.AutoSize = true;\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.Location = new System.Drawing.Point(8, 171);\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.Name = \"_IgnoreSingleCharacterTitleBox\";\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.TabIndex = 21;\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.Text = \"忽略只有一个字符的标题\";\r\n\t\t\tthis._IgnoreSingleCharacterTitleBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ClearTextFiltersButton\r\n\t\t\t// \r\n\t\t\tthis._ClearTextFiltersButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ClearTextFiltersButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._ClearTextFiltersButton.Location = new System.Drawing.Point(369, 6);\r\n\t\t\tthis._ClearTextFiltersButton.Name = \"_ClearTextFiltersButton\";\r\n\t\t\tthis._ClearTextFiltersButton.Size = new System.Drawing.Size(80, 23);\r\n\t\t\tthis._ClearTextFiltersButton.TabIndex = 2;\r\n\t\t\tthis._ClearTextFiltersButton.Text = \"清空列表\";\r\n\t\t\tthis._ClearTextFiltersButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ClearTextFiltersButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ClearTextFiltersButton.Click += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _IgnorePatternsBox\r\n\t\t\t// \r\n\t\t\tthis._IgnorePatternsBox.AllowUserToResizeRows = false;\r\n\t\t\tthis._IgnorePatternsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._IgnorePatternsBox.BackgroundColor = System.Drawing.SystemColors.Window;\r\n\t\t\tdataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;\r\n\t\t\tdataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;\r\n\t\t\tdataGridViewCellStyle1.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tdataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;\r\n\t\t\tdataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tdataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;\r\n\t\t\tdataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;\r\n\t\t\tthis._IgnorePatternsBox.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;\r\n\t\t\tthis._IgnorePatternsBox.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\r\n\t\t\tthis._IgnorePatternsBox.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\r\n            this._PatternColumn,\r\n            this._MatchCaseColumn,\r\n            this._FullMatchColumn,\r\n            this._PatternTypeColumn,\r\n            this._RemovePatternColumn});\r\n\t\t\tdataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;\r\n\t\t\tdataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;\r\n\t\t\tdataGridViewCellStyle2.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tdataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tdataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tdataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;\r\n\t\t\tdataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;\r\n\t\t\tthis._IgnorePatternsBox.DefaultCellStyle = dataGridViewCellStyle2;\r\n\t\t\tthis._IgnorePatternsBox.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;\r\n\t\t\tthis._IgnorePatternsBox.Location = new System.Drawing.Point(8, 35);\r\n\t\t\tthis._IgnorePatternsBox.Name = \"_IgnorePatternsBox\";\r\n\t\t\tthis._IgnorePatternsBox.RowHeadersVisible = false;\r\n\t\t\tthis._IgnorePatternsBox.Size = new System.Drawing.Size(441, 130);\r\n\t\t\tthis._IgnorePatternsBox.TabIndex = 1;\r\n\t\t\tthis._IgnorePatternsBox.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this._IgnorePatternsBox_CellContentClick);\r\n\t\t\t// \r\n\t\t\t// _PatternColumn\r\n\t\t\t// \r\n\t\t\tthis._PatternColumn.Frozen = true;\r\n\t\t\tthis._PatternColumn.HeaderText = \"忽略内容\";\r\n\t\t\tthis._PatternColumn.MinimumWidth = 50;\r\n\t\t\tthis._PatternColumn.Name = \"_PatternColumn\";\r\n\t\t\tthis._PatternColumn.ToolTipText = \"忽略匹配此内容的标题\";\r\n\t\t\tthis._PatternColumn.Width = 150;\r\n\t\t\t// \r\n\t\t\t// _MatchCaseColumn\r\n\t\t\t// \r\n\t\t\tthis._MatchCaseColumn.HeaderText = \"区分大小写\";\r\n\t\t\tthis._MatchCaseColumn.MinimumWidth = 70;\r\n\t\t\tthis._MatchCaseColumn.Name = \"_MatchCaseColumn\";\r\n\t\t\tthis._MatchCaseColumn.ToolTipText = \"是否区分大小写\";\r\n\t\t\tthis._MatchCaseColumn.Width = 70;\r\n\t\t\t// \r\n\t\t\t// _FullMatchColumn\r\n\t\t\t// \r\n\t\t\tthis._FullMatchColumn.HeaderText = \"匹配全标题\";\r\n\t\t\tthis._FullMatchColumn.MinimumWidth = 70;\r\n\t\t\tthis._FullMatchColumn.Name = \"_FullMatchColumn\";\r\n\t\t\tthis._FullMatchColumn.ToolTipText = \"是否匹配整个标题\";\r\n\t\t\tthis._FullMatchColumn.Width = 70;\r\n\t\t\t// \r\n\t\t\t// _PatternTypeColumn\r\n\t\t\t// \r\n\t\t\tthis._PatternTypeColumn.HeaderText = \"正则表达式\";\r\n\t\t\tthis._PatternTypeColumn.MinimumWidth = 70;\r\n\t\t\tthis._PatternTypeColumn.Name = \"_PatternTypeColumn\";\r\n\t\t\tthis._PatternTypeColumn.ToolTipText = \"是否使用正则表达式\";\r\n\t\t\tthis._PatternTypeColumn.Width = 70;\r\n\t\t\t// \r\n\t\t\t// _RemovePatternColumn\r\n\t\t\t// \r\n\t\t\tthis._RemovePatternColumn.HeaderText = \"删除\";\r\n\t\t\tthis._RemovePatternColumn.MinimumWidth = 35;\r\n\t\t\tthis._RemovePatternColumn.Name = \"_RemovePatternColumn\";\r\n\t\t\tthis._RemovePatternColumn.Text = \"删除\";\r\n\t\t\tthis._RemovePatternColumn.ToolTipText = \"删除此忽略模板\";\r\n\t\t\tthis._RemovePatternColumn.UseColumnTextForLinkValue = true;\r\n\t\t\tthis._RemovePatternColumn.Width = 35;\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(3, 11);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(149, 12);\r\n\t\t\tthis.label10.TabIndex = 0;\r\n\t\t\tthis.label10.Text = \"忽略匹配以下内容的文本：\";\r\n\t\t\t// \r\n\t\t\t// tabPage3\r\n\t\t\t// \r\n\t\t\tthis.tabPage3.Controls.Add(this._FilterToolbar);\r\n\t\t\tthis.tabPage3.Controls.Add(this._LevelAdjustmentBox);\r\n\t\t\tthis.tabPage3.Controls.Add(this.label12);\r\n\t\t\tthis.tabPage3.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage3.Name = \"tabPage3\";\r\n\t\t\tthis.tabPage3.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage3.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage3.TabIndex = 2;\r\n\t\t\tthis.tabPage3.Text = \"高级筛选处理\";\r\n\t\t\tthis.tabPage3.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FilterToolbar\r\n\t\t\t// \r\n\t\t\tthis._FilterToolbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\r\n\t\t\tthis._FilterToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this.toolStripLabel1,\r\n            _AddAdjustmentButton,\r\n            this._AddFilterFromInfoFileButton,\r\n            this._DeleteAdjustmentButton,\r\n            this.toolStripSeparator1,\r\n            this._CopyFilterButton,\r\n            this._PasteButton});\r\n\t\t\tthis._FilterToolbar.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._FilterToolbar.Name = \"_FilterToolbar\";\r\n\t\t\tthis._FilterToolbar.Size = new System.Drawing.Size(449, 25);\r\n\t\t\tthis._FilterToolbar.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// toolStripLabel1\r\n\t\t\t// \r\n\t\t\tthis.toolStripLabel1.Name = \"toolStripLabel1\";\r\n\t\t\tthis.toolStripLabel1.Size = new System.Drawing.Size(68, 22);\r\n\t\t\tthis.toolStripLabel1.Text = \"筛选条件：\";\r\n\t\t\t// \r\n\t\t\t// _AddFilterFromInfoFileButton\r\n\t\t\t// \r\n\t\t\tthis._AddFilterFromInfoFileButton.Image = global::PDFPatcher.Properties.Resources.BookmarkFile;\r\n\t\t\tthis._AddFilterFromInfoFileButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilterFromInfoFileButton.Name = \"_AddFilterFromInfoFileButton\";\r\n\t\t\tthis._AddFilterFromInfoFileButton.Size = new System.Drawing.Size(112, 22);\r\n\t\t\tthis._AddFilterFromInfoFileButton.Text = \"从信息文件添加\";\r\n\t\t\tthis._AddFilterFromInfoFileButton.Click += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _DeleteAdjustmentButton\r\n\t\t\t// \r\n\t\t\tthis._DeleteAdjustmentButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._DeleteAdjustmentButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._DeleteAdjustmentButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._DeleteAdjustmentButton.Name = \"_DeleteAdjustmentButton\";\r\n\t\t\tthis._DeleteAdjustmentButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._DeleteAdjustmentButton.Text = \"删除\";\r\n\t\t\tthis._DeleteAdjustmentButton.Click += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\tthis.toolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\tthis.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _CopyFilterButton\r\n\t\t\t// \r\n\t\t\tthis._CopyFilterButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._CopyFilterButton.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\tthis._CopyFilterButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._CopyFilterButton.Name = \"_CopyFilterButton\";\r\n\t\t\tthis._CopyFilterButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._CopyFilterButton.Text = \"复制\";\r\n\t\t\tthis._CopyFilterButton.Click += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _PasteButton\r\n\t\t\t// \r\n\t\t\tthis._PasteButton.Image = global::PDFPatcher.Properties.Resources.Paste;\r\n\t\t\tthis._PasteButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._PasteButton.Name = \"_PasteButton\";\r\n\t\t\tthis._PasteButton.Size = new System.Drawing.Size(52, 22);\r\n\t\t\tthis._PasteButton.Text = \"粘贴\";\r\n\t\t\tthis._PasteButton.Click += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _LevelAdjustmentBox\r\n\t\t\t// \r\n\t\t\tthis._LevelAdjustmentBox.AllColumns.Add(this._AdvancedFilterColumn);\r\n\t\t\tthis._LevelAdjustmentBox.AllColumns.Add(this._AdjustmentLevelColumn);\r\n\t\t\tthis._LevelAdjustmentBox.AllColumns.Add(this._RelativeAdjustmentColumn);\r\n\t\t\tthis._LevelAdjustmentBox.AllColumns.Add(this._FilterBeforeMergeColumn);\r\n\t\t\tthis._LevelAdjustmentBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._LevelAdjustmentBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._LevelAdjustmentBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._LevelAdjustmentBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._AdvancedFilterColumn,\r\n            this._AdjustmentLevelColumn,\r\n            this._RelativeAdjustmentColumn,\r\n            this._FilterBeforeMergeColumn});\r\n\t\t\tthis._LevelAdjustmentBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._LevelAdjustmentBox.GridLines = true;\r\n\t\t\tthis._LevelAdjustmentBox.HideSelection = false;\r\n\t\t\tthis._LevelAdjustmentBox.IsSimpleDragSource = true;\r\n\t\t\tthis._LevelAdjustmentBox.IsSimpleDropSink = true;\r\n\t\t\tthis._LevelAdjustmentBox.Location = new System.Drawing.Point(6, 50);\r\n\t\t\tthis._LevelAdjustmentBox.Name = \"_LevelAdjustmentBox\";\r\n\t\t\tthis._LevelAdjustmentBox.ShowGroups = false;\r\n\t\t\tthis._LevelAdjustmentBox.Size = new System.Drawing.Size(443, 137);\r\n\t\t\tthis._LevelAdjustmentBox.TabIndex = 2;\r\n\t\t\tthis._LevelAdjustmentBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._LevelAdjustmentBox.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._LevelAdjustmentBox.ItemActivate += new System.EventHandler(this._LevelAdjustmentBox_ItemActivate);\r\n\t\t\t// \r\n\t\t\t// _AdvancedFilterColumn\r\n\t\t\t// \r\n\t\t\tthis._AdvancedFilterColumn.IsEditable = false;\r\n\t\t\tthis._AdvancedFilterColumn.Text = \"筛选条件\";\r\n\t\t\tthis._AdvancedFilterColumn.Width = 273;\r\n\t\t\t// \r\n\t\t\t// _AdjustmentLevelColumn\r\n\t\t\t// \r\n\t\t\tthis._AdjustmentLevelColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._AdjustmentLevelColumn.Text = \"调整级别\";\r\n\t\t\t// \r\n\t\t\t// _RelativeAdjustmentColumn\r\n\t\t\t// \r\n\t\t\tthis._RelativeAdjustmentColumn.CheckBoxes = true;\r\n\t\t\tthis._RelativeAdjustmentColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._RelativeAdjustmentColumn.Text = \"相对调整\";\r\n\t\t\tthis._RelativeAdjustmentColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\t// \r\n\t\t\t// _FilterBeforeMergeColumn\r\n\t\t\t// \r\n\t\t\tthis._FilterBeforeMergeColumn.CheckBoxes = true;\r\n\t\t\tthis._FilterBeforeMergeColumn.Text = \"合并文本前筛选\";\r\n\t\t\tthis._FilterBeforeMergeColumn.Width = 100;\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.AutoSize = true;\r\n\t\t\tthis.label12.Location = new System.Drawing.Point(3, 35);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size(251, 12);\r\n\t\t\tthis.label12.TabIndex = 1;\r\n\t\t\tthis.label12.Text = \"调整匹配字体的尺寸级别（级别为0时忽略）：\";\r\n\t\t\t// \r\n\t\t\t// tabPage5\r\n\t\t\t// \r\n\t\t\tthis.tabPage5.Controls.Add(this._ExportTextCoordinateBox);\r\n\t\t\tthis.tabPage5.Controls.Add(this._ShowAllFontsBox);\r\n\t\t\tthis.tabPage5.Controls.Add(this._DisplayFontStatisticsBox);\r\n\t\t\tthis.tabPage5.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage5.Name = \"tabPage5\";\r\n\t\t\tthis.tabPage5.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage5.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage5.TabIndex = 4;\r\n\t\t\tthis.tabPage5.Text = \"其它选项\";\r\n\t\t\tthis.tabPage5.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportTextCoordinateBox\r\n\t\t\t// \r\n\t\t\tthis._ExportTextCoordinateBox.AutoSize = true;\r\n\t\t\tthis._ExportTextCoordinateBox.Location = new System.Drawing.Point(6, 50);\r\n\t\t\tthis._ExportTextCoordinateBox.Name = \"_ExportTextCoordinateBox\";\r\n\t\t\tthis._ExportTextCoordinateBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._ExportTextCoordinateBox.TabIndex = 2;\r\n\t\t\tthis._ExportTextCoordinateBox.Text = \"导出文本位置信息\";\r\n\t\t\tthis._ExportTextCoordinateBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ShowAllFontsBox\r\n\t\t\t// \r\n\t\t\tthis._ShowAllFontsBox.AutoSize = true;\r\n\t\t\tthis._ShowAllFontsBox.Location = new System.Drawing.Point(6, 28);\r\n\t\t\tthis._ShowAllFontsBox.Name = \"_ShowAllFontsBox\";\r\n\t\t\tthis._ShowAllFontsBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._ShowAllFontsBox.TabIndex = 1;\r\n\t\t\tthis._ShowAllFontsBox.Text = \"列出被忽略的字体\";\r\n\t\t\tthis._ShowAllFontsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DisplayFontStatisticsBox\r\n\t\t\t// \r\n\t\t\tthis._DisplayFontStatisticsBox.AutoSize = true;\r\n\t\t\tthis._DisplayFontStatisticsBox.Checked = true;\r\n\t\t\tthis._DisplayFontStatisticsBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._DisplayFontStatisticsBox.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis._DisplayFontStatisticsBox.Name = \"_DisplayFontStatisticsBox\";\r\n\t\t\tthis._DisplayFontStatisticsBox.Size = new System.Drawing.Size(192, 16);\r\n\t\t\tthis._DisplayFontStatisticsBox.TabIndex = 0;\r\n\t\t\tthis._DisplayFontStatisticsBox.Text = \"完成识别后统计用于标题的字体\";\r\n\t\t\tthis._DisplayFontStatisticsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _BookmarkControl\r\n\t\t\t// \r\n\t\t\tthis._BookmarkControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BookmarkControl.LabelText = \"P&DF 信息文件：\";\r\n\t\t\tthis._BookmarkControl.Location = new System.Drawing.Point(12, 33);\r\n\t\t\tthis._BookmarkControl.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._BookmarkControl.Name = \"_BookmarkControl\";\r\n\t\t\tthis._BookmarkControl.Size = new System.Drawing.Size(463, 25);\r\n\t\t\tthis._BookmarkControl.TabIndex = 2;\r\n\t\t\tthis._BookmarkControl.UseForBookmarkExport = true;\r\n\t\t\t// \r\n\t\t\t// _SourceFileControl\r\n\t\t\t// \r\n\t\t\tthis._SourceFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SourceFileControl.Location = new System.Drawing.Point(12, 3);\r\n\t\t\tthis._SourceFileControl.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._SourceFileControl.Name = \"_SourceFileControl\";\r\n\t\t\tthis._SourceFileControl.Size = new System.Drawing.Size(463, 24);\r\n\t\t\tthis._SourceFileControl.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _ExportBookmarkButton\r\n\t\t\t// \r\n\t\t\tthis._ExportBookmarkButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExportBookmarkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExportBookmarkButton.AnimateGlow = true;\r\n\t\t\tthis._ExportBookmarkButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExportBookmarkButton.CornerRadius = 3;\r\n\t\t\tthis._ExportBookmarkButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ExportBookmarkButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ExportBookmarkButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ExportBookmarkButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ExportBookmarkButton.Location = new System.Drawing.Point(349, 63);\r\n\t\t\tthis._ExportBookmarkButton.Name = \"_ExportBookmarkButton\";\r\n\t\t\tthis._ExportBookmarkButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ExportBookmarkButton.ShowFocusBorder = true;\r\n\t\t\tthis._ExportBookmarkButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ExportBookmarkButton.TabIndex = 15;\r\n\t\t\tthis._ExportBookmarkButton.Text = \" 生成书签(&S)\";\r\n\t\t\tthis._ExportBookmarkButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ExportBookmarkButton.Click += new System.EventHandler(this._ExportBookmarkButton_Click);\r\n\t\t\t// \r\n\t\t\t// AutoBookmarkControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._ExportBookmarkButton);\r\n\t\t\tthis.Controls.Add(this._SourceFileControl);\r\n\t\t\tthis.Controls.Add(this._BookmarkControl);\r\n\t\t\tthis.Controls.Add(this.tabControl1);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"AutoBookmarkControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(487, 333);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TitleSizeThresholdBox)).EndInit();\r\n\t\t\tthis.tabControl1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MaxDistanceBetweenLinesBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._GoToPageTopLevelBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._YOffsetBox)).EndInit();\r\n\t\t\tthis.tabPage2.ResumeLayout(false);\r\n\t\t\tthis.tabPage2.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._IgnorePatternsBox)).EndInit();\r\n\t\t\tthis.tabPage3.ResumeLayout(false);\r\n\t\t\tthis.tabPage3.PerformLayout();\r\n\t\t\tthis._FilterToolbar.ResumeLayout(false);\r\n\t\t\tthis._FilterToolbar.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LevelAdjustmentBox)).EndInit();\r\n\t\t\tthis.tabPage5.ResumeLayout(false);\r\n\t\t\tthis.tabPage5.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate SourceFileControl _SourceFileControl;\r\n\t\tprivate BookmarkControl _BookmarkControl;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _TitleSizeThresholdBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.TextBox _PageRangeBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeAdjacentTitlesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeDifferentSizeTitlesBox;\r\n\t\tprivate System.Windows.Forms.TabControl tabControl1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage2;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _GoToPageTopLevelBox;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _YOffsetBox;\r\n\t\tprivate System.Windows.Forms.DataGridView _IgnorePatternsBox;\r\n\t\tprivate System.Windows.Forms.DataGridViewTextBoxColumn _PatternColumn;\r\n\t\tprivate System.Windows.Forms.DataGridViewCheckBoxColumn _MatchCaseColumn;\r\n\t\tprivate System.Windows.Forms.DataGridViewCheckBoxColumn _FullMatchColumn;\r\n\t\tprivate System.Windows.Forms.DataGridViewCheckBoxColumn _PatternTypeColumn;\r\n\t\tprivate System.Windows.Forms.DataGridViewLinkColumn _RemovePatternColumn;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage3;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t\tprivate System.Windows.Forms.Button _ClearTextFiltersButton;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoHierarchicalArrangementBox;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _LevelAdjustmentBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AdvancedFilterColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AdjustmentLevelColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _RelativeAdjustmentColumn;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.ComboBox _WritingDirectionBox;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage5;\r\n\t\tprivate System.Windows.Forms.CheckBox _ShowAllFontsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _DisplayFontStatisticsBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MaxDistanceBetweenLinesBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportTextCoordinateBox;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _AddFilterMenu;\r\n\t\tprivate System.Windows.Forms.ToolStrip _FilterToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _DeleteAdjustmentButton;\r\n\t\tprivate System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _CopyFilterButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _PasteButton;\r\n\t\tprivate System.Windows.Forms.ToolStripLabel toolStripLabel1;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _AddFilterFromInfoFileButton;\r\n\t\tprivate System.Windows.Forms.CheckBox _CreateBookmarkForFirstPageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeDifferentFontTitlesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _IgnoreOverlappedTextBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _IgnoreNumericTitleBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _IgnoreSingleCharacterTitleBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FilterBeforeMergeColumn;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ExportBookmarkButton;\r\n        private System.Windows.Forms.CheckBox _FirstLineAsTitleBox;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmarkControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class AutoBookmarkControl : FunctionControl, IResettableControl, IDocumentSource\r\n\t{\r\n\t\tAutoBookmarkOptions _options;\r\n\t\tstatic AutoBookmarkOptions.LevelAdjustmentOption[] _copiedLevelAdjustments;\r\n\r\n\t\tpublic AutoBookmarkControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tpublic override string FunctionName => \"自动生成书签\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.AutoBookmark;\r\n\r\n\t\tpublic override Button DefaultButton => _ExportBookmarkButton;\r\n\r\n\t\tpublic string DocumentPath => _SourceFileControl.Text;\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_FilterToolbar.ScaleIcons(16);\r\n\t\t\t_LevelAdjustmentBox.ScaleColumnWidths();\r\n\t\t\tAppContext.MainForm.SetTooltip(_SourceFileControl.FileList, \"需要识别标题为书签的 PDF 源文件路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_BookmarkControl.FileList, \"指定识别书签后生成的信息文件或简易文本书签文件路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExportBookmarkButton, \"点击此按钮识别 PDF 文件的标题为信息文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TitleSizeThresholdBox, \"指定标题文本的最小尺寸，小于此尺寸的文本将被忽略\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_AutoHierarchicalArrangementBox, \"根据标题文本的尺寸级别生成多层次的书签\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_YOffsetBox, \"将标题的定位位置向上偏移的行距\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_MergeAdjacentTitlesBox, \"将连续出现的标题合并为一个标题\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_MergeDifferentSizeTitlesBox, \"合并不同尺寸的相邻标题\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_GoToPageTopLevelBox, \"小于指定层数的标题定位到页首，而非所在精确位置\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_IgnoreOverlappedTextBox, \"忽略用于制作粗体、阴影等效果的重叠文本\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_CreateBookmarkForFirstPageBox, \"生成一个书签指向文档的第一页，书签文本为 PDF 文件的名称\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_PageRangeBox, Messages.PageRanges);\r\n\r\n\t\t\tint i = 0;\r\n\t\t\tforeach (var item in EditAdjustmentForm.FilterNames) {\r\n\t\t\t\t_AddFilterMenu.Items.Add(item).Name = EditAdjustmentForm.FilterIDs[i++];\r\n\t\t\t}\r\n\t\t\t_LevelAdjustmentBox.CellEditUseWholeCell = true;\r\n\t\t\t_LevelAdjustmentBox.BeforeSorting += (object sender, BrightIdeasSoftware.BeforeSortingEventArgs e) => {\r\n\t\t\t\te.Canceled = true;\r\n\t\t\t};\r\n\t\t\t_LevelAdjustmentBox.DropSink = new BrightIdeasSoftware.RearrangingDropSink(false);\r\n\t\t\t_AdvancedFilterColumn.AspectGetter = (object x) => {\r\n\t\t\t\tif (x is not AutoBookmarkOptions.LevelAdjustmentOption f) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\treturn f.Condition.Description;\r\n\t\t\t};\r\n\t\t\t_AdjustmentLevelColumn.AspectGetter = (object x) => {\r\n\t\t\t\tvar f = x as AutoBookmarkOptions.LevelAdjustmentOption;\r\n\t\t\t\treturn f?.AdjustmentLevel ?? 0;\r\n\t\t\t};\r\n\t\t\t_AdjustmentLevelColumn.AspectPutter = (object x, object value) => {\r\n\t\t\t\tif (x is not AutoBookmarkOptions.LevelAdjustmentOption f) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif ((value ?? \"0\").ToString().TryParse(out float a)) {\r\n\t\t\t\t\tf.AdjustmentLevel = a;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_RelativeAdjustmentColumn.AspectGetter = (object x) => (x as AutoBookmarkOptions.LevelAdjustmentOption)?.RelativeAdjustment == true;\r\n\t\t\t_RelativeAdjustmentColumn.AspectPutter = (object x, object value) => {\r\n\t\t\t\tif (x is not AutoBookmarkOptions.LevelAdjustmentOption f) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tf.RelativeAdjustment = value is bool b && b;\r\n\t\t\t};\r\n\t\t\t_FilterBeforeMergeColumn.AspectGetter = (object x) => ((x as AutoBookmarkOptions.LevelAdjustmentOption)?.FilterBeforeMergeTitle) ?? false;\r\n\t\t\t_FilterBeforeMergeColumn.AspectPutter = (object x, object value) => {\r\n\t\t\t\tif (x is AutoBookmarkOptions.LevelAdjustmentOption f) {\r\n\t\t\t\t\tf.FilterBeforeMergeTitle = value is bool b && b;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_IgnorePatternsBox.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);\r\n\t\t\tReload();\r\n\r\n\t\t\tvar d = _BookmarkControl.FileDialog;\r\n\t\t\td.CheckFileExists = false;\r\n\t\t\td.CheckPathExists = false;\r\n\r\n\t\t\tif (d is SaveFileDialog sd) {\r\n\t\t\t\tsd.OverwritePrompt = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tAppContext.AutoBookmarker = new AutoBookmarkOptions();\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\t_options = AppContext.AutoBookmarker;\r\n\t\t\t_CreateBookmarkForFirstPageBox.Checked = _options.CreateBookmarkForFirstPage;\r\n\t\t\t_MergeAdjacentTitlesBox.Checked = _options.MergeAdjacentTitles;\r\n\t\t\t_MergeDifferentSizeTitlesBox.Checked = _options.MergeDifferentSizeTitles;\r\n\t\t\t_AutoHierarchicalArrangementBox.Checked = _options.AutoHierarchicalArrangement;\r\n\t\t\t_IgnoreNumericTitleBox.Checked = _options.IgnoreNumericTitle;\r\n\t\t\t_IgnoreOverlappedTextBox.Checked = _options.IgnoreOverlappedText;\r\n\t\t\t_IgnoreSingleCharacterTitleBox.Checked = _options.IgnoreSingleCharacterTitle;\r\n\t\t\t_ShowAllFontsBox.Checked = _options.DisplayAllFonts;\r\n\t\t\t_DisplayFontStatisticsBox.Checked = _options.DisplayFontStatistics;\r\n\t\t\t_WritingDirectionBox.SelectedIndex = (int)_options.WritingDirection;\r\n\t\t\t_MergeDifferentFontTitlesBox.Checked = _options.MergeDifferentFontTitles;\r\n\t\t\t_TitleSizeThresholdBox.SetValue(_options.TitleThreshold);\r\n\t\t\t_YOffsetBox.SetValue(_options.YOffset);\r\n\t\t\t_MaxDistanceBetweenLinesBox.SetValue(_options.MaxDistanceBetweenLines);\r\n\t\t\t_FirstLineAsTitleBox.Checked = _options.FirstLineAsTitle;\r\n\r\n\t\t\tfor (int i = _options.LevelAdjustment.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (_options.LevelAdjustment[i].Condition == null) {\r\n\t\t\t\t\t_options.LevelAdjustment.RemoveAt(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_LevelAdjustmentBox.SetObjects(_options.LevelAdjustment);\r\n\t\t\t_IgnorePatternsBox.Rows.Clear();\r\n\t\t\tforeach (var item in _options.IgnorePatterns) {\r\n\t\t\t\tif (String.IsNullOrEmpty(item.Text)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_IgnorePatternsBox.Rows.Add(item.Text, item.MatchCase, item.FullMatch, item.UseRegularExpression);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _ExportBookmarkButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (File.Exists(_SourceFileControl.FirstFile) == false) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\telse if (String.IsNullOrEmpty(_BookmarkControl.Text)) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.InfoDocNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.SourceFiles = _SourceFileControl.Files;\r\n\t\t\tAppContext.BookmarkFile = _BookmarkControl.Text;\r\n\t\t\tif (_SourceFileControl.Files.Length == 1) {\r\n\t\t\t\t_SourceFileControl.FileList.AddHistoryItem();\r\n\t\t\t\t_BookmarkControl.FileList.AddHistoryItem();\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tAppContext.MainForm.GetWorker().DoWork += ExportControl_DoWork;\r\n\t\t\tSyncOptions();\r\n\t\t\tAppContext.MainForm.GetWorker().RunWorkerAsync(new object[] {\r\n\t\t\t\tAppContext.SourceFiles,\r\n\t\t\t\tAppContext.BookmarkFile,\r\n\t\t\t\t_options\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tprivate void SyncOptions() {\r\n\t\t\t_options.CreateBookmarkForFirstPage = _CreateBookmarkForFirstPageBox.Checked;\r\n\t\t\t_options.PageRanges = _PageRangeBox.Text;\r\n\t\t\t_options.TitleThreshold = (float)_TitleSizeThresholdBox.Value;\r\n\t\t\t_options.MergeAdjacentTitles = _MergeAdjacentTitlesBox.Checked;\r\n\t\t\t_options.IgnoreNumericTitle = _IgnoreNumericTitleBox.Checked;\r\n\t\t\t_options.IgnoreOverlappedText = _IgnoreOverlappedTextBox.Checked;\r\n\t\t\t_options.IgnoreSingleCharacterTitle = _IgnoreSingleCharacterTitleBox.Checked;\r\n\t\t\t_options.MergeDifferentSizeTitles = _MergeDifferentSizeTitlesBox.Checked;\r\n\t\t\t_options.MergeDifferentFontTitles = _MergeDifferentFontTitlesBox.Checked;\r\n\t\t\t_options.YOffset = (float)_YOffsetBox.Value;\r\n\t\t\t_options.ExportTextCoordinates = _ExportTextCoordinateBox.Checked;\r\n\t\t\t_options.PageTopForLevel = (int)_GoToPageTopLevelBox.Value;\r\n\t\t\t_options.AutoHierarchicalArrangement = _AutoHierarchicalArrangementBox.Checked;\r\n\t\t\t_options.DisplayFontStatistics = _DisplayFontStatisticsBox.Checked;\r\n\t\t\t_options.DisplayAllFonts = _ShowAllFontsBox.Checked;\r\n\t\t\t_options.WritingDirection = (WritingDirection)_WritingDirectionBox.SelectedIndex;\r\n\t\t\t_options.MaxDistanceBetweenLines = (float)_MaxDistanceBetweenLinesBox.Value;\r\n\t\t\t_options.FirstLineAsTitle = _FirstLineAsTitleBox.Checked;\r\n\t\t\t_options.IgnorePatterns.Clear();\r\n\t\t\tforeach (DataGridViewRow item in _IgnorePatternsBox.Rows) {\r\n\t\t\t\tif (item.IsNewRow) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar cells = item.Cells;\r\n\t\t\t\tif (cells[0].Value == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_options.IgnorePatterns.Add(new PDFPatcher.Model.MatchPattern(\r\n\t\t\t\t\tcells[0].Value.ToString(),\r\n\t\t\t\t\t(bool)(cells[_MatchCaseColumn.Index].Value ?? false),\r\n\t\t\t\t\t(bool)(cells[_FullMatchColumn.Index].Value ?? false),\r\n\t\t\t\t\t(bool)(cells[_PatternTypeColumn.Index].Value ?? false)));\r\n\t\t\t}\r\n\t\t\t_options.LevelAdjustment.Clear();\r\n\t\t\tif (_LevelAdjustmentBox.Items.Count > 0) {\r\n\t\t\t\tforeach (ListViewItem item in _LevelAdjustmentBox.Items) {\r\n\t\t\t\t\t_options.LevelAdjustment.Add(_LevelAdjustmentBox.GetModelObject(item.Index) as AutoBookmarkOptions.LevelAdjustmentOption);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportControl_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar a = e.Argument as object[];\r\n\t\t\tvar files = a[0] as string[];\r\n\t\t\tvar b = a[1] as string;\r\n\t\t\tvar options = a[2] as AutoBookmarkOptions;\r\n\t\t\tif (files.Length > 1) {\r\n\t\t\t\tvar p = Path.GetDirectoryName(b);\r\n\t\t\t\tvar ext = Path.GetExtension(b);\r\n\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\tProcessor.Worker.CreateBookmark(file, FileHelper.CombinePath(p, Path.GetFileNameWithoutExtension(file) + ext), options);\r\n\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tProcessor.Worker.CreateBookmark(files[0], b, options);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _IgnorePatternsBox_CellContentClick(object sender, DataGridViewCellEventArgs e) {\r\n\t\t\tif (e.ColumnIndex == _RemovePatternColumn.Index && e.RowIndex >= 0) {\r\n\t\t\t\t_IgnorePatternsBox.Rows.RemoveAt(e.RowIndex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _ImportLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {\r\n\t\t\tAppContext.MainForm.SelectFunctionList(Function.Patcher);\r\n\t\t}\r\n\r\n\t\tprivate void ControlEvent(object sender, EventArgs e) {\r\n\t\t\tif (sender == _DeleteAdjustmentButton && _LevelAdjustmentBox.Items.Count > 0 && FormHelper.YesNoBox(\"是否删除选中的项？\") == DialogResult.Yes) {\r\n\t\t\t\t_LevelAdjustmentBox.RemoveObjects(_LevelAdjustmentBox.SelectedObjects);\r\n\t\t\t}\r\n\t\t\telse if (sender == _ClearTextFiltersButton && _IgnorePatternsBox.Rows.Count > 0 && FormHelper.YesNoBox(\"是否清空文本过滤列表？\") == DialogResult.Yes) {\r\n\t\t\t\t_IgnorePatternsBox.Rows.Clear();\r\n\t\t\t}\r\n\t\t\telse if (sender == _CopyFilterButton) {\r\n\t\t\t\tvar si = _LevelAdjustmentBox.SelectedObjects;\r\n\t\t\t\tif (si.Count == 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_copiedLevelAdjustments = new AutoBookmarkOptions.LevelAdjustmentOption[si.Count];\r\n\t\t\t\tfor (int i = 0; i < _copiedLevelAdjustments.Length; i++) {\r\n\t\t\t\t\tvar item = si[i] as AutoBookmarkOptions.LevelAdjustmentOption;\r\n\t\t\t\t\t_copiedLevelAdjustments[i] = item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (sender == _PasteButton) {\r\n\t\t\t\tif (_copiedLevelAdjustments.HasContent() == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var item in _copiedLevelAdjustments) {\r\n\t\t\t\t\t_LevelAdjustmentBox.AddObject(item.Clone());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (sender == _AddFilterFromInfoFileButton) {\r\n\t\t\t\tif (String.IsNullOrEmpty(_BookmarkControl.Text)) {\r\n\t\t\t\t\tif (_BookmarkControl.FileDialog.ShowDialog() != DialogResult.OK) {\r\n\t\t\t\t\t\tFormHelper.InfoBox(\"请先指定信息文件的路径。\");\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_BookmarkControl.Text = _BookmarkControl.FileDialog.FileName;\r\n\t\t\t\t}\r\n\t\t\t\tvar doc = new System.Xml.XmlDocument();\r\n\t\t\t\tSystem.Xml.XmlNode fontInfo;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tdoc.Load(_BookmarkControl.Text);\r\n\t\t\t\t\tfontInfo = doc.SelectSingleNode(Constants.PdfInfo + \"/\" + Constants.Font.DocumentFont);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tAppContext.MainForm.ErrorBox(\"无法从信息文件加载字体信息\", ex);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (fontInfo == null) {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"无法从信息文件加载字体信息。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tusing (var f = new FontFilterForm(fontInfo)) {\r\n\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK && f.FilterConditions != null) {\r\n\t\t\t\t\t\tforeach (var item in f.FilterConditions) {\r\n\t\t\t\t\t\t\t_LevelAdjustmentBox.AddObject(new AutoBookmarkOptions.LevelAdjustmentOption() {\r\n\t\t\t\t\t\t\t\tCondition = item,\r\n\t\t\t\t\t\t\t\tAdjustmentLevel = 0,\r\n\t\t\t\t\t\t\t\tRelativeAdjustment = false\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _LevelAdjustmentBox_ItemActivate(object sender, EventArgs e) {\r\n\t\t\tif (_LevelAdjustmentBox.FocusedItem == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar fi = _LevelAdjustmentBox.FocusedItem;\r\n\t\t\tvar i = fi.Index;\r\n\t\t\tvar o = _LevelAdjustmentBox.GetModelObject(i) as AutoBookmarkOptions.LevelAdjustmentOption;\r\n\t\t\tusing (var dialog = new EditAdjustmentForm(o)) {\r\n\t\t\t\tif (dialog.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tif (dialog.Filter.Condition != null) {\r\n\t\t\t\t\t\t_LevelAdjustmentBox.InsertObjects(i, new AutoBookmarkOptions.LevelAdjustmentOption[] { dialog.Filter });\r\n\t\t\t\t\t\t_LevelAdjustmentBox.SelectedIndex = i;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_LevelAdjustmentBox.RemoveObject(o);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _AddFilterMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tvar c = EditAdjustmentForm.CreateCondition(e.ClickedItem.Name);\r\n\t\t\tif (c == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tusing (var dialog = new EditAdjustmentForm(new AutoBookmarkOptions.LevelAdjustmentOption { Condition = c })) {\r\n\t\t\t\tif (dialog.ShowDialog() == DialogResult.OK && dialog.Filter.Condition != null) {\r\n\t\t\t\t\t_LevelAdjustmentBox.AddObject(dialog.Filter);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/AutoBookmarkControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_AddAdjustmentButton.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_AddFilterMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_PatternColumn.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>True</value>\r\n  </metadata>\r\n  <metadata name=\"_MatchCaseColumn.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>True</value>\r\n  </metadata>\r\n  <metadata name=\"_FullMatchColumn.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>True</value>\r\n  </metadata>\r\n  <metadata name=\"_PatternTypeColumn.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>True</value>\r\n  </metadata>\r\n  <metadata name=\"_RemovePatternColumn.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>True</value>\r\n  </metadata>\r\n  <metadata name=\"_FilterToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>160, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/BookmarkControl.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class BookmarkControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n            this.label1 = new System.Windows.Forms.Label();\r\n            this._BrowseBookmarkButton = new System.Windows.Forms.Button();\r\n            this._OpenBookmarkBox = new System.Windows.Forms.OpenFileDialog();\r\n            this._SaveBookmarkBox = new System.Windows.Forms.SaveFileDialog();\r\n            this.panel1 = new System.Windows.Forms.Panel();\r\n            this._BookmarkBox = new PDFPatcher.HistoryComboBox();\r\n            this.panel1.SuspendLayout();\r\n            this.SuspendLayout();\r\n            // \r\n            // label1\r\n            // \r\n            this.label1.AutoSize = true;\r\n            this.label1.Location = new System.Drawing.Point(3, 6);\r\n            this.label1.Name = \"label1\";\r\n            this.label1.Size = new System.Drawing.Size(89, 12);\r\n            this.label1.TabIndex = 0;\r\n            this.label1.Text = \"P&DF 信息文件：\";\r\n            // \r\n            // _BrowseBookmarkButton\r\n            // \r\n            this._BrowseBookmarkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._BrowseBookmarkButton.Image = global::PDFPatcher.Properties.Resources.BookmarkFile;\r\n            this._BrowseBookmarkButton.Location = new System.Drawing.Point(391, 1);\r\n            this._BrowseBookmarkButton.Name = \"_BrowseBookmarkButton\";\r\n            this._BrowseBookmarkButton.Size = new System.Drawing.Size(75, 23);\r\n            this._BrowseBookmarkButton.TabIndex = 2;\r\n            this._BrowseBookmarkButton.Text = \"浏览...\";\r\n            this._BrowseBookmarkButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n            this._BrowseBookmarkButton.UseVisualStyleBackColor = true;\r\n            this._BrowseBookmarkButton.Click += new System.EventHandler(this._BrowseSourcePdfButton_Click);\r\n            // \r\n            // _OpenBookmarkBox\r\n            // \r\n            this._OpenBookmarkBox.DefaultExt = \"xml\";\r\n            this._OpenBookmarkBox.Filter = \"支持的信息文件 (*.xml,*.txt)|*.xml;*.txt|XML 信息文件 (*.xml)|*.xml|简易文本书签文件(*.txt)|*.txt\";\r\n            this._OpenBookmarkBox.Title = \"指定需要导入的信息文件的路径\";\r\n            // \r\n            // _SaveBookmarkBox\r\n            // \r\n            this._SaveBookmarkBox.DefaultExt = \"xml\";\r\n            this._SaveBookmarkBox.Filter = \"支持的信息文件 (*.xml,*.txt)|*.xml;*.txt|XML 信息文件 (*.xml)|*.xml|简易文本书签文件(*.txt)|*.txt\";\r\n            this._SaveBookmarkBox.Title = \"指定导出的信息文件路径\";\r\n            // \r\n            // panel1\r\n            // \r\n            this.panel1.Controls.Add(this._BookmarkBox);\r\n            this.panel1.Controls.Add(this.label1);\r\n            this.panel1.Controls.Add(this._BrowseBookmarkButton);\r\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n            this.panel1.Location = new System.Drawing.Point(0, 0);\r\n            this.panel1.Name = \"panel1\";\r\n            this.panel1.Size = new System.Drawing.Size(469, 26);\r\n            this.panel1.TabIndex = 3;\r\n            // \r\n            // _BookmarkBox\r\n            // \r\n            this._BookmarkBox.AllowDrop = true;\r\n            this._BookmarkBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n                        | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._BookmarkBox.Contents = null;\r\n            this._BookmarkBox.FormattingEnabled = true;\r\n            this._BookmarkBox.Location = new System.Drawing.Point(104, 3);\r\n            this._BookmarkBox.MaxItemCount = 16;\r\n            this._BookmarkBox.Name = \"_BookmarkBox\";\r\n            this._BookmarkBox.Size = new System.Drawing.Size(281, 20);\r\n            this._BookmarkBox.TabIndex = 1;\r\n            this._BookmarkBox.DragDrop += new System.Windows.Forms.DragEventHandler(this._BookmarkBox_DragDrop);\r\n            this._BookmarkBox.DragEnter += new System.Windows.Forms.DragEventHandler(this._BookmarkBox_DragEnter);\r\n            this._BookmarkBox.TextChanged += new System.EventHandler(this._BookmarkBox_TextChanged);\r\n            // \r\n            // BookmarkControl\r\n            // \r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r\n            this.Controls.Add(this.panel1);\r\n            this.Name = \"BookmarkControl\";\r\n            this.Size = new System.Drawing.Size(469, 26);\r\n            this.Load += new System.EventHandler(this.BookmarkControl_Show);\r\n            this.VisibleChanged += new System.EventHandler(this.BookmarkControl_Show);\r\n            this.panel1.ResumeLayout(false);\r\n            this.panel1.PerformLayout();\r\n            this.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.Button _BrowseBookmarkButton;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenBookmarkBox;\r\n\t\tprivate System.Windows.Forms.SaveFileDialog _SaveBookmarkBox;\r\n\t\tprivate PDFPatcher.HistoryComboBox _BookmarkBox;\r\n        private System.Windows.Forms.Panel panel1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/BookmarkControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic partial class BookmarkControl : UserControl\r\n\t{\r\n\t\tinternal event EventHandler<EventArgs> BrowseForFile;\r\n\r\n\t\tpublic BookmarkControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\t///<summary>获取或指定书签文件路径的下拉列表框。</summary>\r\n\t\tinternal HistoryComboBox FileList => _BookmarkBox;\r\n\r\n\t\tinternal FileDialog FileDialog => _UseForBookmarkExport ? (FileDialog)_SaveBookmarkBox : _OpenBookmarkBox;\r\n\r\n\t\t[Description(\"标签文本上显示的文本\")]\r\n\t\tpublic string LabelText {\r\n\t\t\tget => label1.Text;\r\n\t\t\tset => label1.Text = value;\r\n\t\t}\r\n\r\n\t\t[DefaultValue(null)]\r\n\t\t///<summary>获取或指定书签文件路径的值。</summary>\r\n\t\tpublic override string Text {\r\n\t\t\tget => _BookmarkBox.Text;\r\n\t\t\tset => _BookmarkBox.Text = value;\r\n\t\t}\r\n\r\n\t\tprivate bool _UseForBookmarkExport;\r\n\t\t///<summary>获取或指定是否用于导出书签。</summary>\r\n\t\t[DefaultValue(false)]\r\n\t\t[Description(\"点击浏览按钮时是否打开保存对话框\")]\r\n\t\tpublic bool UseForBookmarkExport {\r\n\t\t\tget => _UseForBookmarkExport;\r\n\t\t\tset =>\r\n\t\t\t\t_UseForBookmarkExport = value;\r\n\t\t}\r\n\r\n\t\tprivate void _BrowseSourcePdfButton_Click(object sender, EventArgs e) {\r\n\t\t\tBrowseForFile?.Invoke(sender, e);\r\n\t\t\tvar sourceFile = (AppContext.SourceFiles != null && AppContext.SourceFiles.Length > 0) ? AppContext.SourceFiles[0] : String.Empty;\r\n\t\t\tif (FileHelper.IsPathValid(_BookmarkBox.Text) && System.IO.Path.GetFileName(_BookmarkBox.Text).Length > 0) {\r\n\t\t\t\tvar p = new FilePath(_BookmarkBox.Text);\r\n\t\t\t\t_OpenBookmarkBox.SetLocation(p);\r\n\t\t\t\t_SaveBookmarkBox.SetLocation(p);\r\n\t\t\t}\r\n\t\t\telse if (sourceFile.Length > 0) {\r\n\t\t\t\tvar p = new FilePath(sourceFile).ChangeExtension(\"xml\");\r\n\t\t\t\t_SaveBookmarkBox.SetLocation(p);\r\n\t\t\t\t_OpenBookmarkBox.SetLocation(p);\r\n\t\t\t}\r\n\t\t\tif (_UseForBookmarkExport) {\r\n\t\t\t\tif (_SaveBookmarkBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t_BookmarkBox.Text = _SaveBookmarkBox.FileName;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (_OpenBookmarkBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\tif (_OpenBookmarkBox.FileName == _BookmarkBox.Text) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_BookmarkBox.Text = _OpenBookmarkBox.FileName;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _BookmarkBox_DragEnter(object sender, DragEventArgs e) {\r\n\t\t\te.FeedbackDragFileOver(Constants.FileExtensions.AllBookmarkExtension);\r\n\t\t}\r\n\r\n\t\tprivate void _BookmarkBox_DragDrop(object sender, DragEventArgs e) {\r\n\t\t\t((Control)sender).DropFileOver(e, Constants.FileExtensions.AllBookmarkExtension);\r\n\t\t}\r\n\r\n\t\tprivate void _BookmarkBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\tAppContext.BookmarkFile = _BookmarkBox.Text;\r\n\t\t}\r\n\r\n\t\tprivate void BookmarkControl_Show(object sender, EventArgs e) {\r\n\t\t\tvar t = _BookmarkBox.Text;\r\n\t\t\tif (Visible && AppContext.MainForm != null) {\r\n\t\t\t\t_BookmarkBox.Contents = AppContext.Recent.InfoDocuments;\r\n\t\t\t}\r\n\t\t\telse if (Visible == false) {\r\n\t\t\t\t_BookmarkBox.Contents = null;\r\n\t\t\t}\r\n\t\t\t_BookmarkBox.Text = t;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/BookmarkControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_OpenBookmarkBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_SaveBookmarkBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>183, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/CustomButton/GlassButton.cs",
    "content": "﻿/************************************************************************************************\r\n * GlassButton - How to create an animating glass button using only GDI+ (and not using WPF).   *\r\n *                                                                                              *\r\n * Original developed by Łukasz Świątkowski - lukasz.swiatkowski@gmail.com                      *\r\n * Form-/Perfomance-/Behavior-Improvements by Fink Christoph - fink.christoph@gmail.com         *\r\n *                                                                                              *\r\n * Feel free to use this control in your application or to improve it in any way!               *\r\n ***********************************************************************************************/\r\n\r\nusing System;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Drawing.Drawing2D;\r\nusing System.Windows.Forms;\r\nusing PushButtonState = System.Windows.Forms.VisualStyles.PushButtonState;\r\n\r\nnamespace EnhancedGlassButton\r\n{\r\n\t/// <summary>\r\n\t/// Represents a glass button control.\r\n\t/// </summary>\r\n\t[ToolboxBitmap(typeof(System.Windows.Forms.Button)), ToolboxItem(true), ToolboxItemFilter(\"System.Windows.Forms\"), Description(\"Raises an event when the user clicks it.\")]\r\n\tpublic partial class GlassButton : Button\r\n\t{\r\n\t\t#region \" Global Vareables \"\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\t\tprivate Timer timer;\r\n\r\n\t\t#region \" Vareables for Drawing \"\r\n\r\n\t\tGraphicsPath outerBorderPath;\r\n\t\tGraphicsPath ContentPath;\r\n\t\tGraphicsPath GlowClip;\r\n\t\tGraphicsPath GlowBottomRadial;\r\n\t\tGraphicsPath ShinePath;\r\n\t\tGraphicsPath BorderPath;\r\n\r\n\t\tPathGradientBrush GlowRadialPath;\r\n\r\n\t\tLinearGradientBrush ShineBrush;\r\n\r\n\t\tPen outerBorderPen;\r\n\t\tPen BorderPen;\r\n\r\n\t\tColor specialSymbolColor;\r\n\r\n\t\tBrush specialSymbolBrush;\r\n\t\tBrush ContentBrush;\r\n\r\n\t\tRectangle rect;\r\n\t\tRectangle rect2;\r\n\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>\r\n\t\t/// The ToolTip of the Control.\r\n\t\t/// </summary>\r\n\t\treadonly ToolTip toolTip = new ToolTip();\r\n\r\n\t\t/// <summary>\r\n\t\t/// If false, the shine isn't drawn (-> symbolizes an disabled control).\r\n\t\t/// </summary>\r\n\t\tbool drawShine = true;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Set the trynsperency of the special Symbols.\r\n\t\t/// </summary>\r\n\t\treadonly int transparencyFactor = 128;\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region \" Constructors \"\r\n\r\n\t\t/// <summary>\r\n\t\t/// Initializes a new instance of the <see cref=\"Glass.GlassButton\" /> class.\r\n\t\t/// </summary>\r\n\t\tpublic GlassButton() {\r\n\t\t\tDoubleBuffered = true;\r\n\r\n\t\t\tInitializeComponent();\r\n\r\n\t\t\troundCorner = 6;\r\n\t\t\ttimer.Interval = animationLength / framesCount;\r\n\t\t\tbase.BackColor = Color.Transparent;\r\n\t\t\tBackColor = Color.Black;\r\n\t\t\tForeColor = Color.White;\r\n\t\t\tOuterBorderColor = Color.White;\r\n\t\t\tInnerBorderColor = Color.Black;\r\n\t\t\tShineColor = Color.White;\r\n\t\t\tGlowColor = Color.FromArgb(unchecked((int)(0xFF8DBDFF)));\r\n\t\t\talternativeForm = false;\r\n\t\t\tshowFocusBorder = false;\r\n\t\t\tanimateGlow = false;\r\n\t\t\tshowSpecialSymbol = false;\r\n\t\t\tspecialSymbol = SpecialSymbols.Play;\r\n\t\t\tspecialSymbolColor = Color.White;\r\n\t\t\ttoolTipText = \"\";\r\n\t\t\tspecialSymbolBrush = new SolidBrush(Color.FromArgb(transparencyFactor, specialSymbolColor));\r\n\t\t\talternativeFocusBorderColor = Color.Black;\r\n\t\t\talternativeFormDirection = Direction.Left;\r\n\r\n\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\tSetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);\r\n\t\t\tSetStyle(ControlStyles.Opaque, false);\r\n\r\n\t\t\tSizeChanged += GlassButton_SizeChanged;\r\n\t\t\tMouseEnter += GlassButton_MouseEnter;\r\n\t\t\tMouseLeave += GlassButton_MouseLeave;\r\n\t\t\tGotFocus += GlassButton_GotFocus;\r\n\t\t\tLostFocus += GlassButton_LostFocus;\r\n\t\t}\r\n\r\n\t\tprivate void InitializeComponent() {\r\n\t\t\tcomponents = new System.ComponentModel.Container();\r\n\t\t\ttimer = new System.Windows.Forms.Timer(components);\r\n\t\t\tSuspendLayout();\r\n\t\t\t// \r\n\t\t\t// timer\r\n\t\t\t// \r\n\t\t\ttimer.Tick += timer_Tick;\r\n\t\t\tResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose(bool disposing) {\r\n\t\t\tif (disposing) {\r\n\t\t\t\tif (imageButton != null) {\r\n\t\t\t\t\timageButton.Parent.Dispose();\r\n\t\t\t\t\timageButton.Parent = null;\r\n\t\t\t\t\timageButton.Dispose();\r\n\t\t\t\t\timageButton = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tDisposeAll(outerBorderPath, ContentPath, GlowClip, GlowBottomRadial, ShinePath, BorderPath, GlowRadialPath, ShineBrush, outerBorderPen, BorderPen, specialSymbolBrush, ContentBrush, toolTip, components);\r\n\t\t\t}\r\n\t\t\tbase.Dispose(disposing);\r\n\t\t}\r\n\r\n\t\tprivate void DisposeAll(params IDisposable[] objects) {\r\n\t\t\tforeach (var item in objects) {\r\n\t\t\t\titem?.Dispose();\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region \" Fields and Properties \"\r\n\r\n\t\tprivate Color backColor;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the background color of the control.\r\n\t\t/// </summary>\r\n\t\t/// <returns>A <see cref=\"T:System.Drawing.Color\" /> value representing the background color.</returns>\r\n\t\t[DefaultValue(typeof(Color), \"Black\")]\r\n\t\tpublic new Color BackColor {\r\n\t\t\tget => backColor;\r\n\t\t\tset {\r\n\t\t\t\tif (!backColor.Equals(value)) {\r\n\t\t\t\t\tbackColor = value;\r\n\t\t\t\t\tUseVisualStyleBackColor = false;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tOnBackColorChanged(EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the foreground color of the control.\r\n\t\t/// </summary>\r\n\t\t/// <returns>The foreground <see cref=\"T:System.Drawing.Color\" /> of the control.</returns>\r\n\t\t[DefaultValue(typeof(Color), \"White\")]\r\n\t\tpublic new Color ForeColor {\r\n\t\t\tget => base.ForeColor;\r\n\t\t\tset {\r\n\t\t\t\tbase.ForeColor = value;\r\n\r\n\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate Color innerBorderColor;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the inner border color of the control.\r\n\t\t/// </summary>\r\n\t\t/// <returns>A <see cref=\"T:System.Drawing.Color\" /> value representing the color of the inner border.</returns>\r\n\t\t[DefaultValue(typeof(Color), \"Black\"), Category(\"Appearance\"), Description(\"The inner border color of the control.\")]\r\n\t\tpublic Color InnerBorderColor {\r\n\t\t\tget => innerBorderColor;\r\n\t\t\tset {\r\n\t\t\t\tif (innerBorderColor != value) {\r\n\t\t\t\t\tinnerBorderColor = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the color of the special symbol.\r\n\t\t/// </summary>\r\n\t\t/// <value>The color of the special symbol.</value>\r\n\t\t[DefaultValue(typeof(Color), \"White\"), Category(\"Appearance\"), Description(\"The inner border color of the control.\")]\r\n\t\tpublic Color SpecialSymbolColor {\r\n\t\t\tget => specialSymbolColor;\r\n\t\t\tset {\r\n\t\t\t\tif (specialSymbolColor != value) {\r\n\t\t\t\t\tspecialSymbolColor = value;\r\n\t\t\t\t\tspecialSymbolBrush = new SolidBrush(Color.FromArgb(transparencyFactor, specialSymbolColor));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate int roundCorner;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the corner radius.\r\n\t\t/// </summary>\r\n\t\t/// <value>The corner radius.</value>\r\n\t\t[DefaultValue(6), Category(\"Appearance\"), Description(\"The radius of the corners.\")]\r\n\t\tpublic int CornerRadius {\r\n\t\t\tget => roundCorner;\r\n\t\t\tset {\r\n\t\t\t\tif (roundCorner != value) {\r\n\t\t\t\t\troundCorner = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstring toolTipText;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the tool tip text.\r\n\t\t/// </summary>\r\n\t\t/// <value>The tool tip text.</value>\r\n\t\t[DefaultValue(\"\"), Category(\"Appearance\"), Description(\"The ToolTip-Text of the button. Leave blank to not show a ToolTip.\")]\r\n\t\tpublic string ToolTipText {\r\n\t\t\tget => toolTipText;\r\n\t\t\tset {\r\n\t\t\t\tif (toolTipText != value) {\r\n\t\t\t\t\ttoolTipText = value;\r\n\r\n\t\t\t\t\tif (toolTipText.Length > 0)\r\n\t\t\t\t\t\ttoolTip.SetToolTip(this, toolTipText);\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool alternativeForm;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the alternative form.\r\n\t\t/// </summary>\r\n\t\t/// <value>The alternative form.</value>\r\n\t\t[DefaultValue(false), Category(\"Appearance\"), Description(\"Draws the Button in an alternative Form.\")]\r\n\t\tpublic bool AlternativeForm {\r\n\t\t\tget => alternativeForm;\r\n\t\t\tset {\r\n\t\t\t\tif (alternativeForm != value) {\r\n\t\t\t\t\talternativeForm = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool animateGlow;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets a value indicating whether the glow is animated.\r\n\t\t/// </summary>\r\n\t\t/// <value><c>true</c> if glow is animated; otherwise, <c>false</c>.</value>\r\n\t\t[DefaultValue(false), Category(\"Appearance\"), Description(\"If true the glow is animated.\")]\r\n\t\tpublic bool AnimateGlow {\r\n\t\t\tget => animateGlow;\r\n\t\t\tset {\r\n\t\t\t\tif (animateGlow != value) {\r\n\t\t\t\t\tanimateGlow = value;\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool showSpecialSymbol;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets a value indicating whether a special symbol is drawn.\r\n\t\t/// </summary>\r\n\t\t/// <value><c>true</c> if special symbol is drawn; otherwise, <c>false</c>.</value>\r\n\t\t[DefaultValue(false), Category(\"Appearance\"), Description(\"If true, the selectet special symbol will be drawn on the button.\")]\r\n\t\tpublic bool ShowSpecialSymbol {\r\n\t\t\tget => showSpecialSymbol;\r\n\t\t\tset {\r\n\t\t\t\tif (showSpecialSymbol != value) {\r\n\t\t\t\t\tshowSpecialSymbol = value;\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// List of all aviable special symbols.\r\n\t\t/// </summary>\r\n\t\tpublic enum SpecialSymbols\r\n\t\t{\r\n\t\t\tArrowLeft,\r\n\t\t\tArrowRight,\r\n\t\t\tArrowUp,\r\n\t\t\tArrowDown,\r\n\t\t\tPlay,\r\n\t\t\tPause,\r\n\t\t\tStop,\r\n\t\t\tFastForward,\r\n\t\t\tForward,\r\n\t\t\tBackward,\r\n\t\t\tFastBackward,\r\n\t\t\tSpeaker,\r\n\t\t\tNoSpeaker,\r\n\t\t\tRepeat,\r\n\t\t\tRepeatAll,\r\n\t\t\tShuffle\r\n\t\t}\r\n\r\n\t\tprivate SpecialSymbols specialSymbol;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the special symbol.\r\n\t\t/// </summary>\r\n\t\t/// <value>The special symbol.</value>\r\n\t\t[DefaultValue(typeof(SpecialSymbols), \"Play\"), Category(\"Appearance\"), Description(\"Sets the type of the special symbol on the button.\")]\r\n\t\tpublic SpecialSymbols SpecialSymbol {\r\n\t\t\tget => specialSymbol;\r\n\t\t\tset {\r\n\t\t\t\tif (specialSymbol != value) {\r\n\t\t\t\t\tspecialSymbol = value;\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic enum Direction\r\n\t\t{\r\n\t\t\tLeft,\r\n\t\t\tRight\r\n\t\t}\r\n\r\n\t\tprivate Direction alternativeFormDirection;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the alternative form direction.\r\n\t\t/// </summary>\r\n\t\t/// <value>The alternative form direction.</value>\r\n\t\t[DefaultValue(typeof(Direction), \"Left\"), Category(\"Appearance\"), Description(\"Sets the Direction of the alternative Form.\")]\r\n\t\tpublic Direction AlternativeFormDirection {\r\n\t\t\tget => alternativeFormDirection;\r\n\t\t\tset {\r\n\t\t\t\tif (alternativeFormDirection != value) {\r\n\t\t\t\t\talternativeFormDirection = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool showFocusBorder;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets a value indicating whether the focus border is shown.\r\n\t\t/// </summary>\r\n\t\t/// <value><c>true</c> if focus border shown; otherwise, <c>false</c>.</value>\r\n\t\t[DefaultValue(false), Category(\"Appearance\"), Description(\"Draw the normal Focus-Border. Alternativ Focus-Border will be drawed if false.\")]\r\n\t\tpublic bool ShowFocusBorder {\r\n\t\t\tget => showFocusBorder;\r\n\t\t\tset {\r\n\t\t\t\tif (showFocusBorder != value) {\r\n\t\t\t\t\tshowFocusBorder = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate Color alternativeFocusBorderColor;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the color of the alternative focus border.\r\n\t\t/// </summary>\r\n\t\t/// <value>The color of the alternative focus border.</value>\r\n\t\t[DefaultValue(typeof(Color), \"Black\"), Category(\"Appearance\"), Description(\"The color of the alternative Focus-Border.\")]\r\n\t\tpublic Color AlternativeFocusBorderColor {\r\n\t\t\tget => alternativeFocusBorderColor;\r\n\t\t\tset {\r\n\t\t\t\tif (alternativeFocusBorderColor != value) {\r\n\t\t\t\t\talternativeFocusBorderColor = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate Color outerBorderColor;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the outer border color of the control.\r\n\t\t/// </summary>\r\n\t\t/// <returns>A <see cref=\"T:System.Drawing.Color\" /> value representing the color of the outer border.</returns>\r\n\t\t[DefaultValue(typeof(Color), \"White\"), Category(\"Appearance\"), Description(\"The outer border color of the control.\")]\r\n\t\tpublic Color OuterBorderColor {\r\n\t\t\tget => outerBorderColor;\r\n\t\t\tset {\r\n\t\t\t\tif (outerBorderColor != value) {\r\n\t\t\t\t\touterBorderColor = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate Color shineColor;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the shine color of the control.\r\n\t\t/// </summary>\r\n\t\t/// <returns>A <see cref=\"T:System.Drawing.Color\" /> value representing the shine color.</returns>\r\n\t\t[DefaultValue(typeof(Color), \"White\"), Category(\"Appearance\"), Description(\"The shine color of the control.\")]\r\n\t\tpublic Color ShineColor {\r\n\t\t\tget => shineColor;\r\n\t\t\tset {\r\n\t\t\t\tif (shineColor != value) {\r\n\t\t\t\t\tshineColor = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate Color glowColor;\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the glow color of the control.\r\n\t\t/// </summary>\r\n\t\t/// <returns>A <see cref=\"T:System.Drawing.Color\" /> value representing the glow color.</returns>\r\n\t\t[DefaultValue(typeof(Color), \"255,141,189,255\"), Category(\"Appearance\"), Description(\"The glow color of the control.\")]\r\n\t\tpublic Color GlowColor {\r\n\t\t\tget => glowColor;\r\n\t\t\tset {\r\n\t\t\t\tif (glowColor != value) {\r\n\t\t\t\t\tglowColor = value;\r\n\r\n\t\t\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\r\n\t\t\t\t\tif (IsHandleCreated) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool isHovered;\r\n\t\tprivate bool isFocused;\r\n\t\tprivate bool isFocusedByKey;\r\n\t\tprivate bool isKeyDown;\r\n\t\tprivate bool isMouseDown;\r\n\t\tprivate bool isPressed => isKeyDown || (isMouseDown && isHovered);\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets the state of the button control.\r\n\t\t/// </summary>\r\n\t\t/// <value>The state of the button control.</value>\r\n\t\t[Browsable(false)]\r\n\t\tpublic PushButtonState State {\r\n\t\t\tget {\r\n\t\t\t\tif (!Enabled) {\r\n\t\t\t\t\treturn PushButtonState.Disabled;\r\n\t\t\t\t}\r\n\t\t\t\tif (isPressed) {\r\n\t\t\t\t\treturn PushButtonState.Pressed;\r\n\t\t\t\t}\r\n\t\t\t\tif (isHovered) {\r\n\t\t\t\t\treturn PushButtonState.Hot;\r\n\t\t\t\t}\r\n\t\t\t\tif (isFocused || IsDefault) {\r\n\t\t\t\t\treturn PushButtonState.Default;\r\n\t\t\t\t}\r\n\t\t\t\treturn PushButtonState.Normal;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region \" Overrided Methods \"\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.Click\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected override void OnClick(EventArgs e) {\r\n\t\t\tisKeyDown = isMouseDown = false;\r\n\t\t\tbase.OnClick(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.Enter\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnEnter(EventArgs e) {\r\n\t\t\tisFocused = isFocusedByKey = true;\r\n\t\t\tbase.OnEnter(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.Leave\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnLeave(EventArgs e) {\r\n\t\t\tbase.OnLeave(e);\r\n\t\t\tisFocused = isFocusedByKey = isKeyDown = isMouseDown = false;\r\n\t\t\tInvalidate();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"M:System.Windows.Forms.ButtonBase.OnKeyUp(System.Windows.Forms.KeyEventArgs)\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"kevent\">A <see cref=\"T:System.Windows.Forms.KeyEventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnKeyDown(KeyEventArgs kevent) {\r\n\t\t\tif (kevent.KeyCode == Keys.Space) {\r\n\t\t\t\tisKeyDown = true;\r\n\t\t\t\tInvalidate();\r\n\t\t\t}\r\n\t\t\tbase.OnKeyDown(kevent);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"M:System.Windows.Forms.ButtonBase.OnKeyUp(System.Windows.Forms.KeyEventArgs)\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"kevent\">A <see cref=\"T:System.Windows.Forms.KeyEventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnKeyUp(KeyEventArgs kevent) {\r\n\t\t\tif (isKeyDown && kevent.KeyCode == Keys.Space) {\r\n\t\t\t\tisKeyDown = false;\r\n\t\t\t\tInvalidate();\r\n\t\t\t}\r\n\t\t\tbase.OnKeyUp(kevent);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseDown\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnMouseDown(MouseEventArgs e) {\r\n\t\t\tif (!isMouseDown && e.Button == MouseButtons.Left) {\r\n\t\t\t\tisMouseDown = true;\r\n\t\t\t\tisFocusedByKey = false;\r\n\t\t\t\tInvalidate();\r\n\t\t\t}\r\n\t\t\tbase.OnMouseDown(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseUp\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnMouseUp(MouseEventArgs e) {\r\n\t\t\tif (isMouseDown) {\r\n\t\t\t\tisMouseDown = false;\r\n\t\t\t\tInvalidate();\r\n\t\t\t}\r\n\t\t\tbase.OnMouseUp(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"M:System.Windows.Forms.Control.OnMouseMove(System.Windows.Forms.MouseEventArgs)\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"mevent\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnMouseMove(MouseEventArgs mevent) {\r\n\t\t\tbase.OnMouseMove(mevent);\r\n\t\t\tif (mevent.Button == MouseButtons.None) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!ClientRectangle.Contains(mevent.X, mevent.Y)) {\r\n\t\t\t\tif (isHovered) {\r\n\t\t\t\t\tisHovered = false;\r\n\t\t\t\t\tInvalidate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (!isHovered) {\r\n\t\t\t\tisHovered = true;\r\n\t\t\t\tInvalidate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseEnter\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected override void OnMouseEnter(EventArgs e) {\r\n\t\t\tisHovered = true;\r\n\t\t\tFadeIn();\r\n\t\t\tInvalidate();\r\n\t\t\tbase.OnMouseEnter(e);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseLeave\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\" /> instance containing the event data.</param>\r\n\t\tprotected override void OnMouseLeave(EventArgs e) {\r\n\t\t\tisHovered = false;\r\n\t\t\tFadeOut();\r\n\t\t\tInvalidate();\r\n\t\t\tbase.OnMouseLeave(e);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region \" Painting \"\r\n\r\n\t\t/// <summary>\r\n\t\t/// Raises the <see cref=\"M:System.Windows.Forms.ButtonBase.OnPaint(System.Windows.Forms.PaintEventArgs)\" /> event.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pevent\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\" /> that contains the event data.</param>\r\n\t\tprotected override void OnPaint(PaintEventArgs pevent) {\r\n\t\t\tvar sm = pevent.Graphics.SmoothingMode;\r\n\t\t\tpevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\r\n\r\n\t\t\tDrawButtonBackground(pevent.Graphics);\r\n\t\t\tDrawForegroundFromButton(pevent);\r\n\t\t\tDrawButtonForeground(pevent.Graphics);\r\n\r\n\t\t\tpevent.Graphics.SmoothingMode = sm;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Draws the button background.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"g\">The graphics to draw on.</param>\r\n\t\tprivate void DrawButtonBackground(Graphics g) {\r\n\t\t\t//white border\r\n\t\t\tg.DrawPath(outerBorderPen, outerBorderPath);\r\n\r\n\t\t\t//content\r\n\t\t\tg.FillPath(ContentBrush, ContentPath);\r\n\r\n\t\t\t//glow\r\n\t\t\tif ((isHovered || isAnimating) && !isPressed) {\r\n\t\t\t\tg.SetClip(GlowClip, CombineMode.Intersect);\r\n\t\t\t\tg.FillPath(GlowRadialPath, GlowBottomRadial);\r\n\r\n\t\t\t\tg.ResetClip();\r\n\t\t\t}\r\n\r\n\t\t\t//shine\r\n\t\t\tif (drawShine && Enabled) {\r\n\t\t\t\tg.FillPath(ShineBrush, ShinePath);\r\n\t\t\t}\r\n\r\n\t\t\t//black border\r\n\t\t\tg.DrawPath(BorderPen, BorderPath);\r\n\r\n\t\t\t//Draws the special Symbol\r\n\t\t\tif (showSpecialSymbol)\r\n\t\t\t\tDrawSpecialSymbol(g);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Draws the special symbol.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"g\">The graphics to draw on.</param>\r\n\t\tprivate void DrawSpecialSymbol(Graphics g) {\r\n\t\t\tvar offset = 15;\r\n\t\t\tvar LineWidth = Width / 15;\r\n\t\t\tvar pen = new Pen(specialSymbolBrush, Width / 8) {\r\n\t\t\t\tEndCap = LineCap.ArrowAnchor\r\n\t\t\t};\r\n\t\t\tvar aPen = new Pen(specialSymbolBrush, Width / 4) {\r\n\t\t\t\tEndCap = LineCap.ArrowAnchor\r\n\t\t\t};\r\n\t\t\tvar font = new Font(\"Arial\", LineWidth * 4, FontStyle.Bold);\r\n\r\n\t\t\tswitch (specialSymbol) {\r\n\t\t\t\t#region \" Arrow Left \"\r\n\t\t\t\tcase SpecialSymbols.ArrowLeft:\r\n\t\t\t\t\tg.DrawLine(aPen, Width - Width / 5, Height / 2, Width / 8, Height / 2);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Arrow Right \"\r\n\t\t\t\tcase SpecialSymbols.ArrowRight:\r\n\t\t\t\t\tg.DrawLine(aPen, Width / 6, Height / 2, Width - Width / 8, Height / 2);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Arrow Up \"\r\n\t\t\t\tcase SpecialSymbols.ArrowUp:\r\n\t\t\t\t\tg.DrawLine(aPen, Width / 2, Height - Height / 5, Width / 2, Height / 8);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Arrow Down \"\r\n\t\t\t\tcase SpecialSymbols.ArrowDown:\r\n\t\t\t\t\tg.DrawLine(aPen, Width / 2, Height / 5, Width / 2, Height - Height / 8);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Play \"\r\n\t\t\t\tcase SpecialSymbols.Play:\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 4 + Width / 20, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width - Width / 4 + Width / 20, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 4 + Width / 20, Height - Height / 4)});\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Pause \"\r\n\t\t\t\tcase SpecialSymbols.Pause:\r\n\t\t\t\t\tg.FillRectangle(specialSymbolBrush, new Rectangle(Width / 4, Height / 4,\r\n\t\t\t\t\t\t(Width / 2 - Width / 10) / 2, Height / 2));\r\n\t\t\t\t\tg.FillRectangle(specialSymbolBrush, new Rectangle(Width / 2 + Width / 20, Height / 4,\r\n\t\t\t\t\t\t(Width / 2 - Width / 10) / 2, Height / 2));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Stop \"\r\n\t\t\t\tcase SpecialSymbols.Stop:\r\n\t\t\t\t\tg.FillRectangle(specialSymbolBrush, new Rectangle(Width / 4 + Width / 20, Height / 4 + Height / 20,\r\n\t\t\t\t\t\tWidth / 2 - Width / 10, Height / 2 - Width / 10));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" FastForward \"\r\n\t\t\t\tcase SpecialSymbols.FastForward:\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 4, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 4, Height - Height / 4)});\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 2, Height / 4),\r\n\t\t\t\t\t\tnew Point(3 * Width / 4, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 2, Height - Height / 4)});\r\n\t\t\t\t\tg.FillRectangle(specialSymbolBrush, new Rectangle(3 * Width / 4, Height / 4,\r\n\t\t\t\t\t\tWidth / 12, Height / 2));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Forward \"\r\n\t\t\t\tcase SpecialSymbols.Forward:\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 4 + Width / 12, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 12, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 4 + Width / 12, Height - Height / 4)});\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 12, Height / 4),\r\n\t\t\t\t\t\tnew Point(3 * Width / 4 + Width / 12, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 12, Height - Height / 4)});\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Backward \"\r\n\t\t\t\tcase SpecialSymbols.Backward:\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 4 - Width / 12, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 12, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 12, Height - Height / 4)});\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 12, Height / 2),\r\n\t\t\t\t\t\tnew Point(3 * Width / 4 - Width / 12, Height / 4),\r\n\t\t\t\t\t\tnew Point(3 * Width / 4 - Width / 12, Height - Height / 4)});\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" FastBackward \"\r\n\t\t\t\tcase SpecialSymbols.FastBackward:\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 4, Height / 2),\r\n\t\t\t\t\t\tnew Point(Width / 2, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2, Height - Height / 4)});\r\n\t\t\t\t\tg.FillPolygon(specialSymbolBrush, new Point[3]{\r\n\t\t\t\t\t\tnew Point(Width / 2, Height / 2),\r\n\t\t\t\t\t\tnew Point(3 * Width / 4, Height / 4),\r\n\t\t\t\t\t\tnew Point(3 * Width / 4, Height - Height / 4)});\r\n\t\t\t\t\tg.FillRectangle(specialSymbolBrush, new Rectangle(Width / 4 - Width / 12, Height / 4,\r\n\t\t\t\t\t\tWidth / 12, Height / 2));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Speaker \"\r\n\t\t\t\tcase SpecialSymbols.Speaker:\r\n\t\t\t\t\tg.DrawPolygon(new Pen(specialSymbolBrush, Width / 20), new Point[6] {\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 6 - Width / offset, Height / 4 + Height / 10),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / offset, Height / 4 + Height / 10),\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 5 - Width / offset, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 5 - Width / offset, 3 * Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / offset, 3 * Height / 4 - Height / 10),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 6 - Width / offset, 3 * Height / 4 - Height / 10)});\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, Width / 20), Width / 2 - Width / offset,\r\n\t\t\t\t\t\tHeight / 4 + Height / 10 + Width / 40, Width / 2 - Width / offset, Height - (Height / 4 + Height / 10 + Width / 40));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" NoSpeaker \"\r\n\t\t\t\tcase SpecialSymbols.NoSpeaker:\r\n\t\t\t\t\tg.DrawPolygon(new Pen(specialSymbolBrush, Width / 20), new Point[6] {\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 6 - Width / offset, Height / 4 + Height / 10),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / offset, Height / 4 + Height / 10),\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 5 - Width / offset, Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2 + Width / 5 - Width / offset, 3 * Height / 4),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / offset, 3 * Height / 4 - Height / 10),\r\n\t\t\t\t\t\tnew Point(Width / 2 - Width / 6 - Width / offset, 3 * Height / 4 - Height / 10)});\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, Width / 20), Width / 2 - Width / offset,\r\n\t\t\t\t\t\tHeight / 4 + Height / 10 + Width / 40, Width / 2 - Width / offset, Height - (Height / 4 + Height / 10 + Width / 40));\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, Width / 20), (int)(Width / 2 - Width / 3.5 - Width / offset), 3 * Height / 4 - Height / 10,\r\n\t\t\t\t\t\tWidth / 2 + Width / 3 - Width / offset, Height / 4 + Height / 12 + Width / 40);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Repeat \"\r\n\t\t\t\tcase SpecialSymbols.Repeat:\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, LineWidth),\r\n\t\t\t\t\t\tnew Point((int)(Width / 4), (int)(Height / 3)),\r\n\t\t\t\t\t\tnew Point((int)(Width - Width / 2.4), (int)(Height / 3)));\r\n\t\t\t\t\tg.DrawArc(new Pen(specialSymbolBrush, LineWidth), (int)(Width - Width * 0.6), (int)(Height / 3),\r\n\t\t\t\t\t\t(int)(Width / 3), (int)(Height / 3), 270, 180);\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, LineWidth),\r\n\t\t\t\t\t\tnew Point((int)(Width - Width / 2.4), (int)(Height - Height / 3)),\r\n\t\t\t\t\t\tnew Point((int)(Width / 3.2), (int)(Height - Height / 3)));\r\n\t\t\t\t\tg.DrawLine(pen,\r\n\t\t\t\t\t\tnew Point((int)(Width / 3.2), (int)(Height - Height / 3)),\r\n\t\t\t\t\t\tnew Point((int)(Width / 4), (int)(Height - Height / 3)));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" RepeatAll \"\r\n\t\t\t\tcase SpecialSymbols.RepeatAll:\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, LineWidth),\r\n\t\t\t\t\t\tnew Point((int)(Width / 2.4), (int)(Height / 3)),\r\n\t\t\t\t\t\tnew Point((int)(Width - Width / 2.4), (int)(Height / 3)));\r\n\t\t\t\t\tg.DrawArc(new Pen(specialSymbolBrush, LineWidth), (int)(Width - Width * 0.6), (int)(Height / 3),\r\n\t\t\t\t\t\t(int)(Width / 3), (int)(Height / 3), 270, 180);\r\n\t\t\t\t\tg.DrawLine(new Pen(specialSymbolBrush, LineWidth),\r\n\t\t\t\t\t\tnew Point((int)(Width - Width / 2.4), (int)(Height - Height / 3)),\r\n\t\t\t\t\t\tnew Point((int)(Width / 2.4), (int)(Height - Height / 3)));\r\n\t\t\t\t\tg.DrawLine(pen,\r\n\t\t\t\t\t\tnew Point((int)(Width / 2.4), (int)(Height - Height / 3)),\r\n\t\t\t\t\t\tnew Point((int)(Width / 3), (int)(Height - Height / 3)));\r\n\t\t\t\t\tg.DrawArc(new Pen(specialSymbolBrush, LineWidth), (int)(Width / 4), (int)(Height / 3),\r\n\t\t\t\t\t\t(int)(Width / 3), (int)(Height / 3), 90, 180);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region \" Shuffle \"\r\n\t\t\t\tcase SpecialSymbols.Shuffle:\r\n\t\t\t\t\tg.DrawString(\"1\", font, specialSymbolBrush, (Width / 2) / 4, Height / 2 - LineWidth * 2);\r\n\t\t\t\t\tvar sWidth = (int)g.MeasureString(\"2\", font).Width;\r\n\t\t\t\t\tvar sHeigth = (int)g.MeasureString(\"2\", font).Height;\r\n\t\t\t\t\tg.DrawString(\"2\", font, specialSymbolBrush, Width / 2 - sWidth / 2 - Width / (2 * offset), Height - LineWidth - sHeigth);\r\n\t\t\t\t\tsWidth = (int)g.MeasureString(\"3\", font).Width;\r\n\t\t\t\t\tg.DrawString(\"3\", font, specialSymbolBrush, Width - (Width / 2) / 4 - sWidth - Width / (2 * offset), Height / 2 - LineWidth * 2);\r\n\t\t\t\t\tg.DrawArc(pen, (Width / 2) / 2, Height / 6, Width - (Width / 2), (int)(Height / 2.2), 170, 210);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Draws the button foreground.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"g\">The graphics to draw on.</param>\r\n\t\tprivate void DrawButtonForeground(Graphics g) {\r\n\t\t\tif (ShowFocusBorder && Focused && ShowFocusCues && !alternativeForm) {\r\n\t\t\t\tvar rect = ClientRectangle;\r\n\t\t\t\trect.Inflate(-4, -4);\r\n\t\t\t\tControlPaint.DrawFocusRectangle(g, rect);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate Button imageButton;\r\n\t\t/// <summary>\r\n\t\t/// Draws the foreground from button.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pevent\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\r\n\t\tprivate void DrawForegroundFromButton(PaintEventArgs pevent) {\r\n\t\t\tif (imageButton == null) {\r\n\t\t\t\timageButton = new Button {\r\n\t\t\t\t\tParent = new TransparentControl(),\r\n\t\t\t\t\tBackColor = Color.Transparent\r\n\t\t\t\t};\r\n\t\t\t\timageButton.FlatAppearance.BorderSize = 0;\r\n\t\t\t\timageButton.FlatStyle = FlatStyle.Flat;\r\n\t\t\t}\r\n\t\t\tif (direction != 0) {\r\n\t\t\t\timageButton.SuspendLayout();\r\n\t\t\t}\r\n\t\t\timageButton.ForeColor = ForeColor;\r\n\t\t\timageButton.Font = Font;\r\n\t\t\timageButton.RightToLeft = RightToLeft;\r\n\t\t\timageButton.Image = Image;\r\n\t\t\timageButton.ImageAlign = ImageAlign;\r\n\t\t\timageButton.ImageIndex = ImageIndex;\r\n\t\t\timageButton.ImageKey = ImageKey;\r\n\t\t\timageButton.ImageList = ImageList;\r\n\t\t\timageButton.Padding = Padding;\r\n\t\t\timageButton.Size = Size;\r\n\t\t\timageButton.Text = Text;\r\n\t\t\timageButton.TextAlign = TextAlign;\r\n\t\t\timageButton.TextImageRelation = TextImageRelation;\r\n\t\t\timageButton.UseCompatibleTextRendering = UseCompatibleTextRendering;\r\n\t\t\timageButton.UseMnemonic = UseMnemonic;\r\n\t\t\tif (direction != 0) {\r\n\t\t\t\timageButton.ResumeLayout();\r\n\t\t\t}\r\n\t\t\tInvokePaint(imageButton, pevent);\r\n\t\t}\r\n\r\n\t\tsealed class TransparentControl : Control\r\n\t\t{\r\n\t\t\tprotected override void OnPaintBackground(PaintEventArgs pevent) { }\r\n\t\t\tprotected override void OnPaint(PaintEventArgs e) { }\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates the round rectangle.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"rectangle\">The rectangle.</param>\r\n\t\t/// <param name=\"radius\">The radius.</param>\r\n\t\t/// <returns></returns>\r\n\t\tprivate GraphicsPath CreateRoundRectangle(Rectangle rectangle, int radius) {\r\n\t\t\tvar path = new GraphicsPath();\r\n\t\t\tvar l = rectangle.Left;\r\n\t\t\tvar t = rectangle.Top;\r\n\t\t\tvar w = rectangle.Width;\r\n\t\t\tvar h = rectangle.Height;\r\n\t\t\tvar d = radius << 1;\r\n\r\n\t\t\tif (alternativeForm) {\r\n\t\t\t\tif (alternativeFormDirection == Direction.Left) {\r\n\t\t\t\t\tpath.AddArc(l, t, h, h, 90, 180);\r\n\t\t\t\t\tpath.AddLine(l + h, t, l + w, t);\r\n\t\t\t\t\tpath.AddCurve(new Point[5] {\r\n\t\t\t\t\t\tnew Point(l + w, t),\r\n\t\t\t\t\t\tnew Point(l + w - h / 6, t + h / 4),\r\n\t\t\t\t\t\tnew Point((int)(l + w - (double)(h / 4.7)), t + h / 2),\r\n\t\t\t\t\t\tnew Point(l + w - h / 6, t + 3 * h / 4),\r\n\t\t\t\t\t\tnew Point(l + w, t + h) });\r\n\t\t\t\t\tpath.AddLine(l + h, t + h, l + w, t + h);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tpath.AddCurve(new Point[5] {\r\n\t\t\t\t\t\tnew Point(l, t),\r\n\t\t\t\t\t\tnew Point(l + h / 6, t + h / 4),\r\n\t\t\t\t\t\tnew Point((int)(l + (double)(h / 4.85)), t + h / 2),\r\n\t\t\t\t\t\tnew Point(l + h / 6, t + 3 * h / 4),\r\n\t\t\t\t\t\tnew Point(l, t + h) });\r\n\t\t\t\t\tpath.AddLine(l, t + h, l + w - h, t + h);\r\n\t\t\t\t\tpath.AddArc(l + w - h, t, h, h, 90, -180);\r\n\t\t\t\t\tpath.AddLine(l + w - h, t, l, t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpath.AddArc(l, t, d, d, 180, 90); // topleft\r\n\t\t\t\tpath.AddLine(l + radius, t, l + w - radius, t); // top\r\n\t\t\t\tpath.AddArc(l + w - d, t, d, d, 270, 90); // topright\r\n\t\t\t\tpath.AddLine(l + w, t + radius, l + w, t + h - radius); // right\r\n\t\t\t\tpath.AddArc(l + w - d, t + h - d, d, d, 0, 90); // bottomright\r\n\t\t\t\tpath.AddLine(l + w - radius, t + h, l + radius, t + h); // bottom\r\n\t\t\t\tpath.AddArc(l, t + h - d, d, d, 90, 90); // bottomleft\r\n\t\t\t\tpath.AddLine(l, t + h - radius, l, t + radius); // left\r\n\t\t\t}\r\n\r\n\t\t\tpath.CloseFigure();\r\n\r\n\t\t\treturn path;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates the top round rectangle.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"rectangle\">The rectangle.</param>\r\n\t\t/// <param name=\"radius\">The radius.</param>\r\n\t\t/// <returns></returns>\r\n\t\tprivate GraphicsPath CreateTopRoundRectangle(Rectangle rectangle, int radius) {\r\n\t\t\tvar path = new GraphicsPath();\r\n\t\t\tvar l = rectangle.Left;\r\n\t\t\tvar t = rectangle.Top;\r\n\t\t\tvar w = rectangle.Width;\r\n\t\t\tvar h = rectangle.Height;\r\n\t\t\tvar d = radius << 1;\r\n\r\n\t\t\tif (alternativeForm) {\r\n\t\t\t\tif (alternativeFormDirection == Direction.Left) {\r\n\t\t\t\t\tpath.AddArc(l, t, h * 2, h * 2, 180, 90);\r\n\t\t\t\t\tpath.AddLine(l + h, t, l + w, t);\r\n\t\t\t\t\tpath.AddCurve(new Point[3] {\r\n\t\t\t\t\t\tnew Point(l + w, t),\r\n\t\t\t\t\t\tnew Point(l + w - h / 3, t + h / 2),\r\n\t\t\t\t\t\tnew Point((int)(l + w - (double)(h / 2.35)), t + h)});\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tpath.AddCurve(new Point[3] {\r\n\t\t\t\t\t\tnew Point(l, t),\r\n\t\t\t\t\t\tnew Point(l + h / 3, t + h / 2),\r\n\t\t\t\t\t\tnew Point((int)(l + (double)(h / 2.35)), t + h)});\r\n\t\t\t\t\tpath.AddLine((int)(l + (double)(h / 2.35)), t + h, l + w - h, t + h);\r\n\t\t\t\t\tpath.AddArc(l + w - h * 2, t, h * 2, h * 2, 0, -90);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpath.AddArc(l, t, d, d, 180, 90); // topleft\r\n\t\t\t\tpath.AddLine(l + radius, t, l + w - radius, t); // top\r\n\t\t\t\tpath.AddArc(l + w - d, t, d, d, 270, 90); // topright\r\n\t\t\t\tpath.AddLine(l + w, t + radius, l + w, t + h); // right\r\n\t\t\t\tpath.AddLine(l + w, t + h, l, t + h); // bottom\r\n\t\t\t\tpath.AddLine(l, t + h, l, t + radius); // left\r\n\t\t\t}\r\n\r\n\t\t\tpath.CloseFigure();\r\n\r\n\t\t\treturn path;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates the bottom radial path.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"rectangle\">The rectangle.</param>\r\n\t\t/// <returns></returns>\r\n\t\tprivate GraphicsPath CreateBottomRadialPath(Rectangle rectangle) {\r\n\t\t\tvar path = new GraphicsPath();\r\n\t\t\tRectangleF rect = rectangle;\r\n\t\t\trect.X -= rectangle.Width * .35f;\r\n\t\t\trect.Y -= rectangle.Height * .15f;\r\n\t\t\trect.Width *= 1.7f;\r\n\t\t\trect.Height *= 2.3f;\r\n\t\t\tpath.AddEllipse(rect);\r\n\t\t\tpath.CloseFigure();\r\n\t\t\treturn path;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Handles the SizeChanged event of the GlassButton control.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sender\">The source of the event.</param>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\r\n\t\tprivate void GlassButton_SizeChanged(object sender, EventArgs e) {\r\n\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Handles the MouseLeave event of the GlassButton control.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sender\">The source of the event.</param>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\r\n\t\tprivate void GlassButton_MouseLeave(object sender, EventArgs e) {\r\n\t\t\tRecalcGlow((float)currentFrame / (framesCount - 1f));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Handles the MouseEnter event of the GlassButton control.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sender\">The source of the event.</param>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\r\n\t\tprivate void GlassButton_MouseEnter(object sender, EventArgs e) {\r\n\t\t\tRecalcGlow((float)currentFrame / (framesCount - 1f));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Handles the LostFocus event of the GlassButton control.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sender\">The source of the event.</param>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\r\n\t\tprivate void GlassButton_LostFocus(object sender, EventArgs e) {\r\n\t\t\tRecalcOuterBorder();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Handles the GotFocus event of the GlassButton control.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sender\">The source of the event.</param>\r\n\t\t/// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\r\n\t\tprivate void GlassButton_GotFocus(object sender, EventArgs e) {\r\n\t\t\tRecalcOuterBorder();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Recalcs the rectangles for drawing.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"glowOpacity\">The glow opacity.</param>\r\n\t\tprivate void RecalcRect(float glowOpacity) {\r\n\t\t\ttry {\r\n\t\t\t\tvar rCorner = roundCorner;\r\n\r\n\t\t\t\tif (roundCorner > Height / 2)\r\n\t\t\t\t\trCorner = Height / 2;\r\n\r\n\t\t\t\tif (roundCorner > Width / 2)\r\n\t\t\t\t\trCorner = Width / 2;\r\n\r\n\t\t\t\trect = RecalcOuterBorder();\r\n\r\n\t\t\t\trect = RecalcContent(rect, out rect2);\r\n\r\n\t\t\t\tRecalcGlow(glowOpacity);\r\n\r\n\t\t\t\trect2 = RecalcShine(rect2);\r\n\r\n\t\t\t\tBorderPath = CreateRoundRectangle(rect, rCorner);\r\n\r\n\t\t\t\tBorderPen = new Pen(innerBorderColor);\r\n\t\t\t}\r\n\t\t\tcatch { }\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Recalcs the shine.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"rect2\">The rect2.</param>\r\n\t\t/// <returns></returns>\r\n\t\tprivate Rectangle RecalcShine(Rectangle rect2) {\r\n\t\t\tvar rCorner = roundCorner;\r\n\r\n\t\t\tif (roundCorner > Height / 2)\r\n\t\t\t\trCorner = Height / 2;\r\n\r\n\t\t\tif (roundCorner > Width / 2)\r\n\t\t\t\trCorner = Width / 2;\r\n\r\n\t\t\tif (rect2.Width > 0 && rect2.Height > 0) {\r\n\t\t\t\trect2.Height++;\r\n\t\t\t\tShinePath = CreateTopRoundRectangle(rect2, rCorner);\r\n\r\n\t\t\t\trect2.Height++;\r\n\t\t\t\tvar opacity = 0x99;\r\n\t\t\t\tif (isPressed)\r\n\t\t\t\t\topacity = (int)(.4f * opacity + .5f);\r\n\t\t\t\tShineBrush = new LinearGradientBrush(rect2, Color.FromArgb(opacity, shineColor), Color.FromArgb(opacity / 3, shineColor), LinearGradientMode.Vertical);\r\n\r\n\t\t\t\trect2.Height -= 2;\r\n\r\n\t\t\t\tdrawShine = true;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tdrawShine = false;\r\n\t\t\treturn rect2;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Recalcs the glow.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"glowOpacity\">The glow opacity.</param>\r\n\t\tprivate void RecalcGlow(float glowOpacity) {\r\n\t\t\tvar rCorner = roundCorner;\r\n\r\n\t\t\tif (roundCorner > Height / 2)\r\n\t\t\t\trCorner = Height / 2;\r\n\r\n\t\t\tif (roundCorner > Width / 2)\r\n\t\t\t\trCorner = Width / 2;\r\n\r\n\t\t\tGlowClip = CreateRoundRectangle(rect, rCorner);\r\n\t\t\tGlowBottomRadial = CreateBottomRadialPath(rect);\r\n\r\n\t\t\tGlowRadialPath = new PathGradientBrush(GlowBottomRadial);\r\n\r\n\t\t\tvar opacity = (int)(0xB2 * glowOpacity + .5f);\r\n\r\n\t\t\tif (!animateGlow) {\r\n\t\t\t\tif (isHovered)\r\n\t\t\t\t\topacity = 255;\r\n\t\t\t\telse\r\n\t\t\t\t\topacity = 0;\r\n\t\t\t}\r\n\r\n\t\t\tGlowRadialPath.CenterColor = Color.FromArgb(opacity, glowColor);\r\n\t\t\tGlowRadialPath.SurroundColors = new Color[] { Color.FromArgb(0, glowColor) };\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Recalcs the content.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"rect\">The rect.</param>\r\n\t\t/// <param name=\"rect2\">The rect2.</param>\r\n\t\t/// <returns></returns>\r\n\t\tprivate Rectangle RecalcContent(Rectangle rect, out Rectangle rect2) {\r\n\t\t\tvar rCorner = roundCorner;\r\n\r\n\t\t\tif (roundCorner > Height / 2)\r\n\t\t\t\trCorner = Height / 2;\r\n\r\n\t\t\tif (roundCorner > Width / 2)\r\n\t\t\t\trCorner = Width / 2;\r\n\r\n\t\t\trect.X++;\r\n\t\t\trect.Y++;\r\n\t\t\trect.Width -= 2;\r\n\t\t\trect.Height -= 2;\r\n\r\n\t\t\trect2 = rect;\r\n\t\t\trect2.Height >>= 1;\r\n\r\n\t\t\tContentPath = CreateRoundRectangle(rect, rCorner);\r\n\t\t\tvar opacity = isPressed ? 0xcc : 0x7f;\r\n\t\t\tContentBrush = new SolidBrush(Color.FromArgb(opacity, backColor));\r\n\t\t\treturn rect;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Recalcs the outer border.\r\n\t\t/// </summary>\r\n\t\t/// <returns></returns>\r\n\t\tprivate Rectangle RecalcOuterBorder() {\r\n\t\t\tvar rCorner = roundCorner;\r\n\r\n\t\t\tif (roundCorner > Height / 2)\r\n\t\t\t\trCorner = Height / 2;\r\n\r\n\t\t\tif (roundCorner > Width / 2)\r\n\t\t\t\trCorner = Width / 2;\r\n\r\n\t\t\tRectangle rect;\r\n\t\t\trect = ClientRectangle;\r\n\t\t\trect.Width--;\r\n\t\t\trect.Height--;\r\n\t\t\touterBorderPath = CreateRoundRectangle(rect, rCorner);\r\n\t\t\trect.Inflate(1, 1);\r\n\t\t\tvar region = CreateRoundRectangle(rect, rCorner);\r\n\t\t\tRegion = new Region(region);\r\n\t\t\trect.Inflate(-1, -1);\r\n\r\n\t\t\tvar col = outerBorderColor;\r\n\t\t\tif (Focused && !ShowFocusBorder)\r\n\t\t\t\tcol = alternativeFocusBorderColor;\r\n\r\n\t\t\touterBorderPen = new Pen(col);\r\n\t\t\treturn rect;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region \" Unused Properties & Events \"\r\n\r\n\t\t/// <summary>This property is not relevant for this class.</summary>\r\n\t\t/// <returns>This property is not relevant for this class.</returns>\r\n\t\t[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\r\n\t\tpublic new FlatButtonAppearance FlatAppearance => base.FlatAppearance;\r\n\r\n\t\t/// <summary>This property is not relevant for this class.</summary>\r\n\t\t/// <returns>This property is not relevant for this class.</returns>\r\n\t\t[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\r\n\t\tpublic new FlatStyle FlatStyle {\r\n\t\t\tget => base.FlatStyle;\r\n\t\t\tset => base.FlatStyle = value;\r\n\t\t}\r\n\r\n\t\t/// <summary>This property is not relevant for this class.</summary>\r\n\t\t/// <returns>This property is not relevant for this class.</returns>\r\n\t\t[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\r\n\t\tpublic new bool UseVisualStyleBackColor {\r\n\t\t\tget => base.UseVisualStyleBackColor;\r\n\t\t\tset => base.UseVisualStyleBackColor = value;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region \" Animation Support \"\r\n\r\n\t\tprivate const int animationLength = 300;\r\n\t\tprivate const int framesCount = 10;\r\n\t\tprivate int currentFrame;\r\n\t\tprivate int direction;\r\n\r\n\t\tprivate bool isAnimating => direction != 0;\r\n\r\n\t\tprivate void FadeIn() {\r\n\t\t\tdirection = 1;\r\n\t\t\ttimer.Enabled = true;\r\n\t\t}\r\n\r\n\t\tprivate void FadeOut() {\r\n\t\t\tdirection = -1;\r\n\t\t\ttimer.Enabled = true;\r\n\t\t}\r\n\r\n\t\tprivate void timer_Tick(object sender, EventArgs e) {\r\n\t\t\tif (!timer.Enabled || !animateGlow) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tRecalcRect((float)currentFrame / (framesCount - 1f));\r\n\t\t\tRefresh();\r\n\t\t\tcurrentFrame += direction;\r\n\t\t\tif (currentFrame == -1) {\r\n\t\t\t\tcurrentFrame = 0;\r\n\t\t\t\ttimer.Enabled = false;\r\n\t\t\t\tdirection = 0;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (currentFrame == framesCount) {\r\n\t\t\t\tcurrentFrame = framesCount - 1;\r\n\t\t\t\ttimer.Enabled = false;\r\n\t\t\t\tdirection = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/CustomizeToolbarForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class CustomizeToolbarForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows Form Designer generated code\r\n\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tthis._ItemListBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._VisibleColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ShowTextColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._DisplayTextColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ButtonImageList = new System.Windows.Forms.ImageList(this.components);\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ResetButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemListBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _ItemListBox\r\n\t\t\t// \r\n\t\t\tthis._ItemListBox.AllColumns.Add(this._NameColumn);\r\n\t\t\tthis._ItemListBox.AllColumns.Add(this._VisibleColumn);\r\n\t\t\tthis._ItemListBox.AllColumns.Add(this._ShowTextColumn);\r\n\t\t\tthis._ItemListBox.AllColumns.Add(this._DisplayTextColumn);\r\n\t\t\tthis._ItemListBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClickAlways;\r\n\t\t\tthis._ItemListBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._VisibleColumn,\r\n            this._ShowTextColumn,\r\n            this._DisplayTextColumn});\r\n\t\t\tthis._ItemListBox.Location = new System.Drawing.Point(12, 46);\r\n\t\t\tthis._ItemListBox.Name = \"_ItemListBox\";\r\n\t\t\tthis._ItemListBox.OwnerDraw = true;\r\n\t\t\tthis._ItemListBox.ShowGroups = false;\r\n\t\t\tthis._ItemListBox.Size = new System.Drawing.Size(388, 263);\r\n\t\t\tthis._ItemListBox.SmallImageList = this._ButtonImageList;\r\n\t\t\tthis._ItemListBox.TabIndex = 0;\r\n\t\t\tthis._ItemListBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ItemListBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _NameColumn\r\n\t\t\t// \r\n\t\t\tthis._NameColumn.IsEditable = false;\r\n\t\t\tthis._NameColumn.Text = \"工具栏按钮\";\r\n\t\t\tthis._NameColumn.Width = 145;\r\n\t\t\t// \r\n\t\t\t// _VisibleColumn\r\n\t\t\t// \r\n\t\t\tthis._VisibleColumn.CheckBoxes = true;\r\n\t\t\tthis._VisibleColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._VisibleColumn.Text = \"显示\";\r\n\t\t\tthis._VisibleColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._VisibleColumn.Width = 54;\r\n\t\t\t// \r\n\t\t\t// _ShowTextColumn\r\n\t\t\t// \r\n\t\t\tthis._ShowTextColumn.CheckBoxes = true;\r\n\t\t\tthis._ShowTextColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._ShowTextColumn.Text = \"显示文本\";\r\n\t\t\tthis._ShowTextColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._ShowTextColumn.Width = 63;\r\n\t\t\t// \r\n\t\t\t// _DisplayTextColumn\r\n\t\t\t// \r\n\t\t\tthis._DisplayTextColumn.AutoCompleteEditor = false;\r\n\t\t\tthis._DisplayTextColumn.AutoCompleteEditorMode = System.Windows.Forms.AutoCompleteMode.None;\r\n\t\t\tthis._DisplayTextColumn.Text = \"按钮文本内容\";\r\n\t\t\tthis._DisplayTextColumn.Width = 120;\r\n\t\t\t// \r\n\t\t\t// _ButtonImageList\r\n\t\t\t// \r\n\t\t\tthis._ButtonImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;\r\n\t\t\tthis._ButtonImageList.ImageSize = new System.Drawing.Size(16, 16);\r\n\t\t\tthis._ButtonImageList.TransparentColor = System.Drawing.Color.Transparent;\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(325, 315);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 1;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ResetButton\r\n\t\t\t// \r\n\t\t\tthis._ResetButton.Location = new System.Drawing.Point(12, 315);\r\n\t\t\tthis._ResetButton.Name = \"_ResetButton\";\r\n\t\t\tthis._ResetButton.Size = new System.Drawing.Size(127, 23);\r\n\t\t\tthis._ResetButton.TabIndex = 2;\r\n\t\t\tthis._ResetButton.Text = \"重置常用工具栏\";\r\n\t\t\tthis._ResetButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ResetButton.Click += new System.EventHandler(this._ResetButton_Click);\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 9);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(305, 34);\r\n\t\t\tthis.label1.TabIndex = 3;\r\n\t\t\tthis.label1.Text = \"使用鼠标上下拖动项目可调整工具按钮的显示顺序。\\r\\n要隐藏按钮，请取消“是否显示”的选中状态。\";\r\n\t\t\t// \r\n\t\t\t// CustomizeToolbarForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(412, 350);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Controls.Add(this._ResetButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.Controls.Add(this._ItemListBox);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"CustomizeToolbarForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.Text = \"自定义常用工具栏项目\";\r\n\t\t\tthis.Load += new System.EventHandler(this.CustomizeToolbarForm_Load);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemListBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _ItemListBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _VisibleColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ShowTextColumn;\r\n\t\tprivate System.Windows.Forms.Button _ResetButton;\r\n\t\tprivate System.Windows.Forms.ImageList _ButtonImageList;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _DisplayTextColumn;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/CustomizeToolbarForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing BO = PDFPatcher.ToolbarOptions.ButtonOption;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic partial class CustomizeToolbarForm : Form\r\n\t{\r\n\t\tpublic CustomizeToolbarForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\tvoid _ResetButton_Click(object sender, EventArgs e) {\r\n\t\t\tAppContext.Toolbar.Reset();\r\n\t\t\t_ItemListBox.Objects = AppContext.Toolbar.Buttons;\r\n\t\t}\r\n\r\n\t\tvoid CustomizeToolbarForm_Load(object sender, EventArgs e) {\r\n\t\t\tforeach (var item in Toolkit.Toolkits) {\r\n\t\t\t\t_ItemListBox.SmallImageList.Images.Add(item.Icon, Properties.Resources.ResourceManager.GetObject(item.Icon) as Image);\r\n\t\t\t}\r\n\t\t\tnew TypedColumn<BO>(_NameColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.GetToolkit().Name,\r\n\t\t\t\tImageGetter = (o) => o.GetToolkit().Icon\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<BO>(_ShowTextColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.ShowText,\r\n\t\t\t\tAspectPutter = (o, v) => o.ShowText = (bool)v\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<BO>(_VisibleColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Visible,\r\n\t\t\t\tAspectPutter = (o, v) => o.Visible = (bool)v\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<BO>(_DisplayTextColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.DisplayName,\r\n\t\t\t\tAspectPutter = (o, v) => o.DisplayName = v as string ?? o.GetToolkit().Name,\r\n\t\t\t};\r\n\t\t\tAppContext.Toolbar.AddMissedButtons();\r\n\t\t\t_ItemListBox.IsSimpleDragSource = true;\r\n\t\t\t_ItemListBox.IsSimpleDropSink = true;\r\n\t\t\t_ItemListBox.DragSource = new SimpleDragSource(true);\r\n\t\t\t_ItemListBox.DropSink = new RearrangingDropSink(false) {\r\n\t\t\t\tCanDropBetween = true,\r\n\t\t\t\tCanDropOnItem = false\r\n\t\t\t};\r\n\t\t\t_ItemListBox.Objects = AppContext.Toolbar.Buttons;\r\n\t\t\t_ItemListBox.FixEditControlWidth();\r\n\t\t\t_ItemListBox.ScaleColumnWidths();\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar l = new List<BO>();\r\n\t\t\tforeach (BO item in _ItemListBox.Objects) {\r\n\t\t\t\tl.Add(item);\r\n\t\t\t}\r\n\t\t\tAppContext.Toolbar.Buttons.Clear();\r\n\t\t\tAppContext.Toolbar.Buttons.AddRange(l);\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/CustomizeToolbarForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_ButtonImageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentInspector/AddPdfObjectForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class AddPdfObjectForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ObjectNameBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._TextValueBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._NumericValueBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._BooleanValueBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._NameValueBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._CreateAsRefBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(111, 141);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 0;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(192, 141);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 1;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 15);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label1.TabIndex = 4;\r\n\t\t\tthis.label1.Text = \"名称：\";\r\n\t\t\t// \r\n\t\t\t// _ObjectNameBox\r\n\t\t\t// \r\n\t\t\tthis._ObjectNameBox.Location = new System.Drawing.Point(59, 12);\r\n\t\t\tthis._ObjectNameBox.Name = \"_ObjectNameBox\";\r\n\t\t\tthis._ObjectNameBox.Size = new System.Drawing.Size(208, 21);\r\n\t\t\tthis._ObjectNameBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(12, 42);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label2.TabIndex = 6;\r\n\t\t\tthis.label2.Text = \"取值：\";\r\n\t\t\t// \r\n\t\t\t// _TextValueBox\r\n\t\t\t// \r\n\t\t\tthis._TextValueBox.AcceptsReturn = true;\r\n\t\t\tthis._TextValueBox.AcceptsTab = true;\r\n\t\t\tthis._TextValueBox.Location = new System.Drawing.Point(59, 39);\r\n\t\t\tthis._TextValueBox.Multiline = true;\r\n\t\t\tthis._TextValueBox.Name = \"_TextValueBox\";\r\n\t\t\tthis._TextValueBox.Size = new System.Drawing.Size(208, 56);\r\n\t\t\tthis._TextValueBox.TabIndex = 7;\r\n\t\t\tthis._TextValueBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _NumericValueBox\r\n\t\t\t// \r\n\t\t\tthis._NumericValueBox.Location = new System.Drawing.Point(7, 123);\r\n\t\t\tthis._NumericValueBox.Name = \"_NumericValueBox\";\r\n\t\t\tthis._NumericValueBox.Size = new System.Drawing.Size(100, 21);\r\n\t\t\tthis._NumericValueBox.TabIndex = 8;\r\n\t\t\tthis._NumericValueBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _BooleanValueBox\r\n\t\t\t// \r\n\t\t\tthis._BooleanValueBox.AutoSize = true;\r\n\t\t\tthis._BooleanValueBox.Location = new System.Drawing.Point(7, 79);\r\n\t\t\tthis._BooleanValueBox.Name = \"_BooleanValueBox\";\r\n\t\t\tthis._BooleanValueBox.Size = new System.Drawing.Size(48, 16);\r\n\t\t\tthis._BooleanValueBox.TabIndex = 9;\r\n\t\t\tthis._BooleanValueBox.Text = \"True\";\r\n\t\t\tthis._BooleanValueBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._BooleanValueBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _NameValueBox\r\n\t\t\t// \r\n\t\t\tthis._NameValueBox.Location = new System.Drawing.Point(7, 138);\r\n\t\t\tthis._NameValueBox.Name = \"_NameValueBox\";\r\n\t\t\tthis._NameValueBox.Size = new System.Drawing.Size(100, 21);\r\n\t\t\tthis._NameValueBox.TabIndex = 10;\r\n\t\t\tthis._NameValueBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _CreateAsRefBox\r\n\t\t\t// \r\n\t\t\tthis._CreateAsRefBox.AutoSize = true;\r\n\t\t\tthis._CreateAsRefBox.Location = new System.Drawing.Point(59, 101);\r\n\t\t\tthis._CreateAsRefBox.Name = \"_CreateAsRefBox\";\r\n\t\t\tthis._CreateAsRefBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._CreateAsRefBox.TabIndex = 11;\r\n\t\t\tthis._CreateAsRefBox.Text = \"创建为间接引用节点\";\r\n\t\t\tthis._CreateAsRefBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// AddPdfObjectForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(279, 176);\r\n\t\t\tthis.Controls.Add(this._CreateAsRefBox);\r\n\t\t\tthis.Controls.Add(this._NameValueBox);\r\n\t\t\tthis.Controls.Add(this._BooleanValueBox);\r\n\t\t\tthis.Controls.Add(this._NumericValueBox);\r\n\t\t\tthis.Controls.Add(this._TextValueBox);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._ObjectNameBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"AddPdfObjectForm\";\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"添加PDF对象\";\r\n\t\t\tthis.Load += new System.EventHandler(this.AddPdfObjectForm_Load);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _ObjectNameBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _TextValueBox;\r\n\t\tprivate System.Windows.Forms.TextBox _NumericValueBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _BooleanValueBox;\r\n\t\tprivate System.Windows.Forms.TextBox _NameValueBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _CreateAsRefBox;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/DocumentInspector/AddPdfObjectForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class AddPdfObjectForm : Form\r\n\t{\r\n\t\treadonly Control[] _editBoxes;\r\n\t\tpublic string ObjectName => _ObjectNameBox.Text;\r\n\t\tint _PdfObjectType;\r\n\t\t///<summary>获取或指定Description的值。</summary>\r\n\t\tpublic int PdfObjectType {\r\n\t\t\tget => _PdfObjectType;\r\n\t\t\tset {\r\n\t\t\t\t_PdfObjectType = value;\r\n\t\t\t\tFormHelper.ToggleVisibility(false, _editBoxes);\r\n\t\t\t\tswitch (value) {\r\n\t\t\t\t\tcase PdfObject.ARRAY: break;\r\n\t\t\t\t\tcase PdfObject.BOOLEAN: _BooleanValueBox.Visible = true; break;\r\n\t\t\t\t\tcase PdfObject.DICTIONARY: break;\r\n\t\t\t\t\tcase PdfObject.NAME: _NameValueBox.Visible = true; break;\r\n\t\t\t\t\tcase PdfObject.NUMBER: _NumericValueBox.Visible = true; break;\r\n\t\t\t\t\tcase PdfObject.STRING: _TextValueBox.Visible = true; break;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic bool CreateAsIndirect => _CreateAsRefBox.Checked;\r\n\t\tpublic PdfObject PdfValue {\r\n\t\t\tget {\r\n\t\t\t\tPdfObject o;\r\n\t\t\t\tswitch (_PdfObjectType) {\r\n\t\t\t\t\tcase PdfObject.NAME: o = new PdfName(String.IsNullOrEmpty(_NameValueBox.Text) ? \"name\" : _NameValueBox.Text); break;\r\n\t\t\t\t\tcase PdfObject.DICTIONARY: o = new PdfDictionary(); break;\r\n\t\t\t\t\tcase PdfObject.ARRAY: o = new PdfArray(); break;\r\n\t\t\t\t\tcase PdfObject.BOOLEAN: o = new PdfBoolean(_BooleanValueBox.Checked); break;\r\n\t\t\t\t\tcase PdfObject.STRING: o = _TextValueBox.Text.ToPdfString(); break;\r\n\t\t\t\t\tcase PdfObject.NUMBER: o = new PdfNumber(_NumericValueBox.Text.ToDouble()); break;\r\n\t\t\t\t\tdefault: return null;\r\n\t\t\t\t}\r\n\t\t\t\treturn o;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic AddPdfObjectForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_editBoxes = new Control[] { _NameValueBox, _NumericValueBox, _BooleanValueBox, _TextValueBox };\r\n\t\t}\r\n\r\n\t\tvoid AddPdfObjectForm_Load(object sender, EventArgs e) {\r\n\t\t\t_NameValueBox.Location = _NumericValueBox.Location = _BooleanValueBox.Location = _TextValueBox.Location;\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentInspector/AddPdfObjectForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentInspector/ImageViewerForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ImageViewerForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Save;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _ZoomReset;\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip ();\r\n\t\t\tthis._FitWindow = new System.Windows.Forms.ToolStripButton ();\r\n\t\t\tthis.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator ();\r\n\t\t\tthis._ImageBox = new Cyotek.Windows.Forms.ImageBox ();\r\n\t\t\t_Save = new System.Windows.Forms.ToolStripButton ();\r\n\t\t\t_ZoomReset = new System.Windows.Forms.ToolStripButton ();\r\n\t\t\tthis._MainToolbar.SuspendLayout ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.Items.AddRange (new System.Windows.Forms.ToolStripItem[] {\r\n            _Save,\r\n            this.toolStripSeparator1,\r\n            _ZoomReset,\r\n            this._FitWindow});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point (0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size (539, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 1;\r\n\t\t\tthis._MainToolbar.Text = \"toolStrip1\";\r\n\t\t\tthis._MainToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler (this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _Save\r\n\t\t\t// \r\n\t\t\t_Save.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\t_Save.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Save.Name = \"_Save\";\r\n\t\t\t_Save.Size = new System.Drawing.Size (90, 22);\r\n\t\t\t_Save.Text = \"保存图片(&B)\";\r\n\t\t\t_Save.ToolTipText = \"将显示的图片保存为文件\";\r\n\t\t\t// \r\n\t\t\t// _ZoomReset\r\n\t\t\t// \r\n\t\t\t_ZoomReset.Image = global::PDFPatcher.Properties.Resources.Zoom;\r\n\t\t\t_ZoomReset.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_ZoomReset.Name = \"_ZoomReset\";\r\n\t\t\t_ZoomReset.Size = new System.Drawing.Size (75, 22);\r\n\t\t\t_ZoomReset.Text = \"原图比例\";\r\n\t\t\t// \r\n\t\t\t// _FitWindow\r\n\t\t\t// \r\n\t\t\tthis._FitWindow.Image = global::PDFPatcher.Properties.Resources.Image;\r\n\t\t\tthis._FitWindow.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._FitWindow.Name = \"_FitWindow\";\r\n\t\t\tthis._FitWindow.Size = new System.Drawing.Size (75, 22);\r\n\t\t\tthis._FitWindow.Text = \"适合窗口\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\tthis.toolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\tthis.toolStripSeparator1.Size = new System.Drawing.Size (6, 25);\r\n\t\t\t// \r\n\t\t\t// _ImageBox\r\n\t\t\t// \r\n\t\t\tthis._ImageBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ImageBox.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ImageBox.Location = new System.Drawing.Point (12, 28);\r\n\t\t\tthis._ImageBox.MinimumSize = new System.Drawing.Size (454, 145);\r\n\t\t\tthis._ImageBox.Name = \"_ImageBox\";\r\n\t\t\tthis._ImageBox.Size = new System.Drawing.Size (515, 380);\r\n\t\t\tthis._ImageBox.TabIndex = 0;\r\n\t\t\tthis._ImageBox.TabStop = false;\r\n\t\t\t// \r\n\t\t\t// ImageViewerForm\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (539, 420);\r\n\t\t\tthis.Controls.Add (this._MainToolbar);\r\n\t\t\tthis.Controls.Add (this._ImageBox);\r\n\t\t\tthis.Name = \"ImageViewerForm\";\r\n\t\t\tthis.ShowIcon = false;\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.Text = \"查看图片\";\r\n\t\t\tthis._MainToolbar.ResumeLayout (false);\r\n\t\t\tthis._MainToolbar.PerformLayout ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate Cyotek.Windows.Forms.ImageBox _ImageBox;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _FitWindow;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/DocumentInspector/ImageViewerForm.cs",
    "content": "﻿using System.Windows.Forms;\r\nusing FreeImageAPI;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\nusing PDFPatcher.Processor.Imaging;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class ImageViewerForm : Form\r\n\t{\r\n\t\tpublic ImageViewerForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\t\tinternal ImageViewerForm(ImageInfo image, byte[] bytes) : this() {\r\n\t\t\tthis.SetIcon(Properties.Resources.ViewContent);\r\n\t\t\tif (image.ExtName == Constants.FileExtensions.Png || image.ExtName == Constants.FileExtensions.Tif) {\r\n\t\t\t\tusing (FreeImageBitmap bmp = ImageExtractor.CreateFreeImageBitmap(image, ref bytes, false, true)) {\r\n\t\t\t\t\t_ImageBox.Image = bmp.ToBitmap();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tusing (var s = new System.IO.MemoryStream(bytes)) {\r\n\t\t\t\t\t\tusing (FreeImageBitmap bmp = new FreeImageBitmap(s)) {\r\n\t\t\t\t\t\t\t_ImageBox.Image = bmp.ToBitmap();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (System.Exception ex) {\r\n\t\t\t\t\tthis.ErrorBox(\"无法加载图片\", ex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnClosed(System.EventArgs e) {\r\n\t\t\t_ImageBox.Image.TryDispose();\r\n\t\t\tbase.OnClosed(e);\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tvar n = e.ClickedItem.Name;\r\n\t\t\tswitch (n) {\r\n\t\t\t\tcase \"_Save\":\r\n\t\t\t\t\tusing (var f = new SaveFileDialog {\r\n\t\t\t\t\t\tTitle = \"保存图片文件\",\r\n\t\t\t\t\t\tDefaultExt = Constants.FileExtensions.Png,\r\n\t\t\t\t\t\tFileName = \"导出图片.png\",\r\n\t\t\t\t\t\tFilter = Constants.FileExtensions.ImageFilter\r\n\t\t\t\t\t}) {\r\n\t\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tusing (var fi = new FreeImageAPI.FreeImageBitmap(_ImageBox.Image)) {\r\n\t\t\t\t\t\t\t\t\tfi.Save(f.FileName);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcatch (System.Exception ex) {\r\n\t\t\t\t\t\t\t\tFormHelper.ErrorBox(ex.Message);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_ZoomReset\":\r\n\t\t\t\t\t_ImageBox.ActualSize(); break;\r\n\t\t\t\tcase \"_FitWindow\":\r\n\t\t\t\t\t_ImageBox.ZoomToFit(); break;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentInspector/ImageViewerForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_Save.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ZoomReset.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentInspector/TextViewerForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class TextViewerForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._TextBox = new System.Windows.Forms.RichTextBox();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._EncodingBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _TextBox\r\n\t\t\t// \r\n\t\t\tthis._TextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TextBox.Location = new System.Drawing.Point(12, 12);\r\n\t\t\tthis._TextBox.Name = \"_TextBox\";\r\n\t\t\tthis._TextBox.Size = new System.Drawing.Size(472, 219);\r\n\t\t\tthis._TextBox.TabIndex = 0;\r\n\t\t\tthis._TextBox.Text = \"\";\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(328, 240);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 1;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(409, 240);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 2;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(10, 245);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 3;\r\n\t\t\tthis.label1.Text = \"解码方式：\";\r\n\t\t\t// \r\n\t\t\t// _EncodingBox\r\n\t\t\t// \r\n\t\t\tthis._EncodingBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._EncodingBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._EncodingBox.FormattingEnabled = true;\r\n\t\t\tthis._EncodingBox.Items.AddRange(new object[] {\r\n            \"国标GBK（cp936）\",\r\n            \"英文（cp1252）\",\r\n            \"UTF-8\",\r\n            \"十六进制表示形式\"});\r\n\t\t\tthis._EncodingBox.Location = new System.Drawing.Point(81, 240);\r\n\t\t\tthis._EncodingBox.Name = \"_EncodingBox\";\r\n\t\t\tthis._EncodingBox.Size = new System.Drawing.Size(121, 20);\r\n\t\t\tthis._EncodingBox.TabIndex = 4;\r\n\t\t\tthis._EncodingBox.SelectedIndexChanged += new System.EventHandler(this._EncodingBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// TextViewerForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(496, 275);\r\n\t\t\tthis.Controls.Add(this._EncodingBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.Controls.Add(this._TextBox);\r\n\t\t\tthis.Name = \"TextViewerForm\";\r\n\t\t\tthis.Text = \"文本内容\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.RichTextBox _TextBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.ComboBox _EncodingBox;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/DocumentInspector/TextViewerForm.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class TextViewerForm : Form\r\n\t{\r\n\t\tstatic readonly Regex __EscapeChars = new Regex(\"[\\u0000-\\u001F\\u0080-\\u00FF]\", RegexOptions.Compiled);\r\n\t\treadonly byte[] _Data;\r\n\r\n\t\t///<summary>获取或指定文本内容是否只读。</summary>\r\n\t\tpublic bool IsTextReadOnly {\r\n\t\t\tget => _TextBox.ReadOnly;\r\n\t\t\tset {\r\n\t\t\t\t_TextBox.ReadOnly = value;\r\n\t\t\t\t_OkButton.Visible = !value;\r\n\t\t\t\t_CancelButton.Text = value ? \"关闭(&G)\" : \"取消(&X)\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t///<summary>获取或指定文本内容。</summary>\r\n\t\tpublic string TextContent {\r\n\t\t\tget => _TextBox.Text;\r\n\t\t\tset => _TextBox.Text = value;\r\n\t\t}\r\n\r\n\t\tpublic TextViewerForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\tpublic TextViewerForm(byte[] data, bool isTextReadonly) : this() {\r\n\t\t\t_Data = data;\r\n\t\t\t_EncodingBox.SelectedIndex = 0;\r\n\t\t\tIsTextReadOnly = isTextReadonly;\r\n\t\t}\r\n\r\n\t\tstatic string EscapeChar(char c) {\r\n\t\t\tvar t = Convert.ToString(c, 8);\r\n\t\t\tswitch (t.Length) {\r\n\t\t\t\tcase 1: return \"\\\\00\" + t;\r\n\t\t\t\tcase 2: return \"\\\\0\" + t;\r\n\t\t\t\tdefault: return \"\\\\\" + t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _EncodingBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\tif (_Data.HasContent() == false) {\r\n\t\t\t\t_TextBox.Clear();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tEncoding en;\r\n\t\t\tswitch (_EncodingBox.SelectedIndex) {\r\n\t\t\t\tcase 0: en = Encoding.GetEncoding(936); break;\r\n\t\t\t\tcase 1: en = Encoding.GetEncoding(1252); break;\r\n\t\t\t\tcase 2: en = Encoding.UTF8; break;\r\n\t\t\t\tdefault: TextContent = ShowHexBin(); return;\r\n\t\t\t}\r\n\t\t\tTextContent = __EscapeChars.Replace(en.GetString(_Data), m => {\r\n\t\t\t\tvar c = m.Value[0];\r\n\t\t\t\treturn (c != '\\t' && c != '\\r' && c != '\\n') ? EscapeChar(c) : m.Value;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tstring ShowHexBin() {\r\n\t\t\treturn _Data.ToHexBinString(true, ' ', 0, _Data.Length);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentInspector/TextViewerForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentInspectorControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class DocumentInspectorControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportBinary;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportHexText;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportXml;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportUncompressedBinary;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportUncompressedHexText;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportToUnicode;\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DocumentInspectorControl));\r\n\t\t\tthis._Container = new System.Windows.Forms.SplitContainer();\r\n\t\t\tthis._ObjectDetailBox = new BrightIdeasSoftware.TreeListView();\r\n\t\t\tthis._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ValueColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._DescriptionColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ObjectTypeIcons = new System.Windows.Forms.ImageList(this.components);\r\n\t\t\tthis._DescriptionBox = new RichTextBoxLinks.RichTextBoxEx();\r\n\t\t\tthis._RecentFileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._OpenButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._LoadDocumentWorker = new System.ComponentModel.BackgroundWorker();\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._SaveButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tthis._ExportButton = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\tthis._ViewButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._AddObjectMenu = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\tthis._AddArrayNode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._AddDictNode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._AddBooleanNode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._AddStringNode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._AddNumberNode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._AddNameNode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._DeleteButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._ExpandButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._CollapseButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_ExportBinary = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExportHexText = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExportXml = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExportUncompressedBinary = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExportUncompressedHexText = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExportToUnicode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._Container)).BeginInit();\r\n\t\t\tthis._Container.Panel1.SuspendLayout();\r\n\t\t\tthis._Container.Panel2.SuspendLayout();\r\n\t\t\tthis._Container.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ObjectDetailBox)).BeginInit();\r\n\t\t\tthis._MainToolbar.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _ExportBinary\r\n\t\t\t// \r\n\t\t\t_ExportBinary.Name = \"_ExportBinary\";\r\n\t\t\t_ExportBinary.Size = new System.Drawing.Size(244, 22);\r\n\t\t\t_ExportBinary.Text = \"二进制文件(&E)...\";\r\n\t\t\t// \r\n\t\t\t// _ExportHexText\r\n\t\t\t// \r\n\t\t\t_ExportHexText.Name = \"_ExportHexText\";\r\n\t\t\t_ExportHexText.Size = new System.Drawing.Size(244, 22);\r\n\t\t\t_ExportHexText.Text = \"二进制文本文件(&W)...\";\r\n\t\t\t// \r\n\t\t\t// _ExportXml\r\n\t\t\t// \r\n\t\t\t_ExportXml.Name = \"_ExportXml\";\r\n\t\t\t_ExportXml.Size = new System.Drawing.Size(244, 22);\r\n\t\t\t_ExportXml.Text = \"&XML信息文件...\";\r\n\t\t\t// \r\n\t\t\t// _ExportUncompressedBinary\r\n\t\t\t// \r\n\t\t\t_ExportUncompressedBinary.Name = \"_ExportUncompressedBinary\";\r\n\t\t\t_ExportUncompressedBinary.Size = new System.Drawing.Size(244, 22);\r\n\t\t\t_ExportUncompressedBinary.Text = \"原始流对象二进制文件(&Y)...\";\r\n\t\t\t// \r\n\t\t\t// _ExportUncompressedHexText\r\n\t\t\t// \r\n\t\t\t_ExportUncompressedHexText.Name = \"_ExportUncompressedHexText\";\r\n\t\t\t_ExportUncompressedHexText.Size = new System.Drawing.Size(244, 22);\r\n\t\t\t_ExportUncompressedHexText.Text = \"原始流对象二进制文本文件(&Y)...\";\r\n\t\t\t// \r\n\t\t\t// _ExportToUnicode\r\n\t\t\t// \r\n\t\t\t_ExportToUnicode.Name = \"_ExportToUnicode\";\r\n\t\t\t_ExportToUnicode.Size = new System.Drawing.Size(244, 22);\r\n\t\t\t_ExportToUnicode.Text = \"&ToUnicode 映射表\";\r\n\t\t\t// \r\n\t\t\t// _Container\r\n\t\t\t// \r\n\t\t\tthis._Container.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._Container.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\r\n\t\t\tthis._Container.Location = new System.Drawing.Point(3, 28);\r\n\t\t\tthis._Container.Name = \"_Container\";\r\n\t\t\tthis._Container.Orientation = System.Windows.Forms.Orientation.Horizontal;\r\n\t\t\t// \r\n\t\t\t// _Container.Panel1\r\n\t\t\t// \r\n\t\t\tthis._Container.Panel1.Controls.Add(this._ObjectDetailBox);\r\n\t\t\t// \r\n\t\t\t// _Container.Panel2\r\n\t\t\t// \r\n\t\t\tthis._Container.Panel2.Controls.Add(this._DescriptionBox);\r\n\t\t\tthis._Container.Size = new System.Drawing.Size(487, 310);\r\n\t\t\tthis._Container.SplitterDistance = 229;\r\n\t\t\tthis._Container.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _ObjectDetailBox\r\n\t\t\t// \r\n\t\t\tthis._ObjectDetailBox.AllColumns.Add(this._NameColumn);\r\n\t\t\tthis._ObjectDetailBox.AllColumns.Add(this._ValueColumn);\r\n\t\t\tthis._ObjectDetailBox.AllColumns.Add(this._DescriptionColumn);\r\n\t\t\tthis._ObjectDetailBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ObjectDetailBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._ObjectDetailBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._ObjectDetailBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._ValueColumn,\r\n            this._DescriptionColumn});\r\n\t\t\tthis._ObjectDetailBox.GridLines = true;\r\n\t\t\tthis._ObjectDetailBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._ObjectDetailBox.HideSelection = false;\r\n\t\t\tthis._ObjectDetailBox.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._ObjectDetailBox.Name = \"_ObjectDetailBox\";\r\n\t\t\tthis._ObjectDetailBox.RevealAfterExpand = false;\r\n\t\t\tthis._ObjectDetailBox.ShowGroups = false;\r\n\t\t\tthis._ObjectDetailBox.Size = new System.Drawing.Size(481, 223);\r\n\t\t\tthis._ObjectDetailBox.SmallImageList = this._ObjectTypeIcons;\r\n\t\t\tthis._ObjectDetailBox.TabIndex = 0;\r\n\t\t\tthis._ObjectDetailBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ObjectDetailBox.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._ObjectDetailBox.VirtualMode = true;\r\n\t\t\tthis._ObjectDetailBox.ItemActivate += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _NameColumn\r\n\t\t\t// \r\n\t\t\tthis._NameColumn.IsEditable = false;\r\n\t\t\tthis._NameColumn.Text = \"名称\";\r\n\t\t\tthis._NameColumn.Width = 184;\r\n\t\t\t// \r\n\t\t\t// _ValueColumn\r\n\t\t\t// \r\n\t\t\tthis._ValueColumn.Text = \"值\";\r\n\t\t\tthis._ValueColumn.Width = 187;\r\n\t\t\t// \r\n\t\t\t// _DescriptionColumn\r\n\t\t\t// \r\n\t\t\tthis._DescriptionColumn.Text = \"说明\";\r\n\t\t\tthis._DescriptionColumn.Width = 93;\r\n\t\t\t// \r\n\t\t\t// _ObjectTypeIcons\r\n\t\t\t// \r\n\t\t\tthis._ObjectTypeIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"_ObjectTypeIcons.ImageStream\")));\r\n\t\t\tthis._ObjectTypeIcons.TransparentColor = System.Drawing.Color.Transparent;\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(0, \"Current\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(1, \"Page\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(2, \"Dictionary\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(3, \"Array\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(4, \"Name\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(5, \"String\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(6, \"Number\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(7, \"Stream\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(8, \"Bool\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(9, \"Reference\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(10, \"Document\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(11, \"Pages\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(12, \"PageCommands\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(13, \"Outlines\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(14, \"Outline\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(15, \"Trailer\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(16, \"GoToPage\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(17, \"Image\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(18, \"Form\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(19, \"Info\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(20, \"Font\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(21, \"Resources\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(22, \"Null\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(23, \"Hidden\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(24, \"op_q\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(25, \"op_cm\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(26, \"op_tm\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(27, \"op_cs\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(28, \"op_sc\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(29, \"op_g\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(30, \"op_s\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(31, \"op_TJ\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(32, \"op_tj_\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(33, \"op_f\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(34, \"op_Ts\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(35, \"op_BT\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(36, \"op_Td\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(37, \"op_Tr\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(38, \"op_BDC\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(39, \"op_re\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(40, \"op_W*\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(41, \"op_c\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(42, \"op_l\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(43, \"op_tc\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(44, \"op_Tz\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(45, \"op_Tl\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(46, \"op_gs\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(47, \"op_w\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(48, \"op_M_\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(49, \"op_d\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(50, \"op_b\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(51, \"op_m\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(52, \"op_h\");\r\n\t\t\tthis._ObjectTypeIcons.Images.SetKeyName(53, \"Error\");\r\n\t\t\t// \r\n\t\t\t// _DescriptionBox\r\n\t\t\t// \r\n\t\t\tthis._DescriptionBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._DescriptionBox.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._DescriptionBox.Name = \"_DescriptionBox\";\r\n\t\t\tthis._DescriptionBox.ReadOnly = true;\r\n\t\t\tthis._DescriptionBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\r\n\t\t\tthis._DescriptionBox.Size = new System.Drawing.Size(481, 71);\r\n\t\t\tthis._DescriptionBox.TabIndex = 1;\r\n\t\t\tthis._DescriptionBox.Text = \"\";\r\n\t\t\t// \r\n\t\t\t// _RecentFileMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFileMenu.Name = \"_RecentFileMenu\";\r\n\t\t\tthis._RecentFileMenu.OwnerItem = this._OpenButton;\r\n\t\t\tthis._RecentFileMenu.Size = new System.Drawing.Size(61, 4);\r\n\t\t\t// \r\n\t\t\t// _OpenButton\r\n\t\t\t// \r\n\t\t\tthis._OpenButton.DropDown = this._RecentFileMenu;\r\n\t\t\tthis._OpenButton.Image = global::PDFPatcher.Properties.Resources.OpenFile;\r\n\t\t\tthis._OpenButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._OpenButton.Name = \"_OpenButton\";\r\n\t\t\tthis._OpenButton.Size = new System.Drawing.Size(81, 22);\r\n\t\t\tthis._OpenButton.Text = \"打开(&D)\";\r\n\t\t\tthis._OpenButton.ToolTipText = \"打开 PDF 文档\";\r\n\t\t\tthis._OpenButton.ButtonClick += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _LoadDocumentWorker\r\n\t\t\t// \r\n\t\t\tthis._LoadDocumentWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this._LoadDocumentWorker_DoWork);\r\n\t\t\tthis._LoadDocumentWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this._LoadDocumentWorker_RunWorkerCompleted);\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._OpenButton,\r\n            this._SaveButton,\r\n            this.toolStripSeparator1,\r\n            this._ExportButton,\r\n            this._ViewButton,\r\n            this._AddObjectMenu,\r\n            this._DeleteButton,\r\n            this._ExpandButton,\r\n            this._CollapseButton});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size(495, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 0;\r\n\t\t\tthis._MainToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ToolbarItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SaveButton\r\n\t\t\t// \r\n\t\t\tthis._SaveButton.Enabled = false;\r\n\t\t\tthis._SaveButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._SaveButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._SaveButton.Name = \"_SaveButton\";\r\n\t\t\tthis._SaveButton.Size = new System.Drawing.Size(68, 22);\r\n\t\t\tthis._SaveButton.Text = \"保存(&B)\";\r\n\t\t\tthis._SaveButton.ToolTipText = \"保存修改后的 PDF 文档\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\tthis.toolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\tthis.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _ExportButton\r\n\t\t\t// \r\n\t\t\tthis._ExportButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _ExportBinary,\r\n            _ExportHexText,\r\n            _ExportXml,\r\n            _ExportUncompressedBinary,\r\n            _ExportUncompressedHexText,\r\n            _ExportToUnicode});\r\n\t\t\tthis._ExportButton.Enabled = false;\r\n\t\t\tthis._ExportButton.Image = global::PDFPatcher.Properties.Resources.ExportFile;\r\n\t\t\tthis._ExportButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._ExportButton.Name = \"_ExportButton\";\r\n\t\t\tthis._ExportButton.Size = new System.Drawing.Size(61, 22);\r\n\t\t\tthis._ExportButton.Text = \"导出\";\r\n\t\t\tthis._ExportButton.ToolTipText = \"导出流对象的内容\";\r\n\t\t\tthis._ExportButton.DropDownOpening += new System.EventHandler(this._ExportButton_DropDownOpening);\r\n\t\t\tthis._ExportButton.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ToolbarItemClicked);\r\n\t\t\t// \r\n\t\t\t// _ViewButton\r\n\t\t\t// \r\n\t\t\tthis._ViewButton.Enabled = false;\r\n\t\t\tthis._ViewButton.Image = global::PDFPatcher.Properties.Resources.ViewContent;\r\n\t\t\tthis._ViewButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._ViewButton.Name = \"_ViewButton\";\r\n\t\t\tthis._ViewButton.Size = new System.Drawing.Size(52, 22);\r\n\t\t\tthis._ViewButton.Text = \"查看\";\r\n\t\t\tthis._ViewButton.ToolTipText = \"查看流对象\";\r\n\t\t\t// \r\n\t\t\t// _AddObjectMenu\r\n\t\t\t// \r\n\t\t\tthis._AddObjectMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AddArrayNode,\r\n            this._AddDictNode,\r\n            this._AddBooleanNode,\r\n            this._AddStringNode,\r\n            this._AddNumberNode,\r\n            this._AddNameNode});\r\n\t\t\tthis._AddObjectMenu.Enabled = false;\r\n\t\t\tthis._AddObjectMenu.Image = global::PDFPatcher.Properties.Resources.AddChildNode;\r\n\t\t\tthis._AddObjectMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddObjectMenu.Name = \"_AddObjectMenu\";\r\n\t\t\tthis._AddObjectMenu.Size = new System.Drawing.Size(97, 22);\r\n\t\t\tthis._AddObjectMenu.Text = \"插入子节点\";\r\n\t\t\tthis._AddObjectMenu.ToolTipText = \"添加子节点对象\";\r\n\t\t\tthis._AddObjectMenu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._AddObjectMenu_DropDownItemClicked);\r\n\t\t\t// \r\n\t\t\t// _AddArrayNode\r\n\t\t\t// \r\n\t\t\tthis._AddArrayNode.Name = \"_AddArrayNode\";\r\n\t\t\tthis._AddArrayNode.Size = new System.Drawing.Size(136, 22);\r\n\t\t\tthis._AddArrayNode.Text = \"列表节点\";\r\n\t\t\t// \r\n\t\t\t// _AddDictNode\r\n\t\t\t// \r\n\t\t\tthis._AddDictNode.Name = \"_AddDictNode\";\r\n\t\t\tthis._AddDictNode.Size = new System.Drawing.Size(136, 22);\r\n\t\t\tthis._AddDictNode.Text = \"字典节点\";\r\n\t\t\t// \r\n\t\t\t// _AddBooleanNode\r\n\t\t\t// \r\n\t\t\tthis._AddBooleanNode.Name = \"_AddBooleanNode\";\r\n\t\t\tthis._AddBooleanNode.Size = new System.Drawing.Size(136, 22);\r\n\t\t\tthis._AddBooleanNode.Text = \"真假值节点\";\r\n\t\t\t// \r\n\t\t\t// _AddStringNode\r\n\t\t\t// \r\n\t\t\tthis._AddStringNode.Name = \"_AddStringNode\";\r\n\t\t\tthis._AddStringNode.Size = new System.Drawing.Size(136, 22);\r\n\t\t\tthis._AddStringNode.Text = \"字符串节点\";\r\n\t\t\t// \r\n\t\t\t// _AddNumberNode\r\n\t\t\t// \r\n\t\t\tthis._AddNumberNode.Name = \"_AddNumberNode\";\r\n\t\t\tthis._AddNumberNode.Size = new System.Drawing.Size(136, 22);\r\n\t\t\tthis._AddNumberNode.Text = \"数值节点\";\r\n\t\t\t// \r\n\t\t\t// _AddNameNode\r\n\t\t\t// \r\n\t\t\tthis._AddNameNode.Name = \"_AddNameNode\";\r\n\t\t\tthis._AddNameNode.Size = new System.Drawing.Size(136, 22);\r\n\t\t\tthis._AddNameNode.Text = \"名称节点\";\r\n\t\t\t// \r\n\t\t\t// _DeleteButton\r\n\t\t\t// \r\n\t\t\tthis._DeleteButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._DeleteButton.Enabled = false;\r\n\t\t\tthis._DeleteButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._DeleteButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._DeleteButton.Name = \"_DeleteButton\";\r\n\t\t\tthis._DeleteButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._DeleteButton.Text = \"删除\";\r\n\t\t\tthis._DeleteButton.ToolTipText = \"删除选中的对象\";\r\n\t\t\t// \r\n\t\t\t// _ExpandButton\r\n\t\t\t// \r\n\t\t\tthis._ExpandButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._ExpandButton.Enabled = false;\r\n\t\t\tthis._ExpandButton.Image = global::PDFPatcher.Properties.Resources.Expand;\r\n\t\t\tthis._ExpandButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._ExpandButton.Name = \"_ExpandButton\";\r\n\t\t\tthis._ExpandButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._ExpandButton.Text = \"展开\";\r\n\t\t\tthis._ExpandButton.ToolTipText = \"展开选中的项目\";\r\n\t\t\t// \r\n\t\t\t// _CollapseButton\r\n\t\t\t// \r\n\t\t\tthis._CollapseButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._CollapseButton.Enabled = false;\r\n\t\t\tthis._CollapseButton.Image = global::PDFPatcher.Properties.Resources.Collapse;\r\n\t\t\tthis._CollapseButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._CollapseButton.Name = \"_CollapseButton\";\r\n\t\t\tthis._CollapseButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._CollapseButton.Text = \"收拢\";\r\n\t\t\tthis._CollapseButton.ToolTipText = \"收拢选中的项目\";\r\n\t\t\t// \r\n\t\t\t// DocumentInspectorControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._MainToolbar);\r\n\t\t\tthis.Controls.Add(this._Container);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"DocumentInspectorControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(495, 341);\r\n\t\t\tthis._Container.Panel1.ResumeLayout(false);\r\n\t\t\tthis._Container.Panel2.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._Container)).EndInit();\r\n\t\t\tthis._Container.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ObjectDetailBox)).EndInit();\r\n\t\t\tthis._MainToolbar.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.SplitContainer _Container;\r\n\t\tprivate BrightIdeasSoftware.TreeListView _ObjectDetailBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ValueColumn;\r\n\t\tprivate RichTextBoxLinks.RichTextBoxEx _DescriptionBox;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFileMenu;\r\n\t\tprivate System.Windows.Forms.ImageList _ObjectTypeIcons;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _DescriptionColumn;\r\n\t\tprivate System.ComponentModel.BackgroundWorker _LoadDocumentWorker;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _OpenButton;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _SaveButton;\r\n\t\tprivate System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\tprivate System.Windows.Forms.ToolStripDropDownButton _ExportButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _ViewButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _DeleteButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _ExpandButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _CollapseButton;\r\n\t\tprivate System.Windows.Forms.ToolStripDropDownButton _AddObjectMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AddNameNode;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AddNumberNode;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AddStringNode;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AddBooleanNode;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AddDictNode;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AddArrayNode;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentInspectorControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Security.Permissions;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing BrightIdeasSoftware;\r\nusing iTextSharp.text.pdf;\r\nusing iTextSharp.text.pdf.fonts.cmaps;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic sealed partial class DocumentInspectorControl : FunctionControl, IDocumentEditor\r\n\t{\r\n\t\tstatic readonly PdfObjectType[] __XmlExportableTypes = [PdfObjectType.Page, PdfObjectType.Pages, PdfObjectType.Trailer];\r\n\t\tstatic Dictionary<string, int> __OpNameIcons;\r\n\t\tstatic Dictionary<int, int> __PdfObjectIcons;\r\n\r\n\t\tPdfPathDocument _pdf;\r\n\t\tImageExtractor _imgExp;\r\n\t\tstring _fileName;\r\n\t\tToolStripItem[] _addPdfObjectMenuItems;\r\n\t\tint[] _pdfTypeForAddObjectMenuItems;\r\n\r\n\t\tstatic readonly ImageExtracterOptions _imgExpOption = new ImageExtracterOptions() {\r\n\t\t\tOutputPath = Path.GetTempPath(),\r\n\t\t\tMergeImages = false\r\n\t\t};\r\n\r\n\t\tpublic override string FunctionName => \"结构探查器\";\r\n\r\n\t\tpublic override Bitmap IconImage => Properties.Resources.DocumentInspector;\r\n\r\n\t\tpublic event EventHandler<DocumentChangedEventArgs> DocumentChanged;\r\n\t\tpublic string DocumentPath {\r\n\t\t\tget => _fileName;\r\n\t\t\tset {\r\n\t\t\t\tif (_fileName != value) {\r\n\t\t\t\t\t_fileName = value;\r\n\t\t\t\t\tDocumentChanged?.Invoke(this, new DocumentChangedEventArgs(value));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic bool IsBusy => _LoadDocumentWorker.IsBusy;\r\n\t\tpublic bool IsDirty => false;\r\n\r\n\t\tpublic DocumentInspectorControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_MainToolbar.ScaleIcons(16);\r\n\t\t\t_ObjectDetailBox.ScaleColumnWidths();\r\n\r\n\t\t\t_ObjectDetailBox.EmptyListMsg = \"请使用“打开”按钮加载需要检查结构的 PDF 文件，或从资源管理器拖放文件到本列表框\";\r\n\r\n\t\t\tif (__OpNameIcons == null || __OpNameIcons.Count == 0) {\r\n\t\t\t\t__OpNameIcons = InitOpNameIcons();\r\n\t\t\t}\r\n\t\t\tif (__PdfObjectIcons == null || __PdfObjectIcons.Count == 0) {\r\n\t\t\t\t__PdfObjectIcons = InitPdfObjectIcons();\r\n\t\t\t}\r\n\t\t\t#region TreeListView init\r\n\t\t\t_ObjectDetailBox.SetTreeViewLine();\r\n\t\t\t_ObjectDetailBox.FixEditControlWidth();\r\n\t\t\tnew TypedColumn<DocumentObject>(_NameColumn) {\r\n\t\t\t\tAspectGetter = (DocumentObject d) => d.FriendlyName ?? d.Name,\r\n\t\t\t\tImageGetter = (DocumentObject d) => {\r\n\t\t\t\t\tif (d.ImageKey != null) {\r\n\t\t\t\t\t\treturn d.ImageKey;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (d.Type == PdfObjectType.Normal) {\r\n\t\t\t\t\t\treturn GetImageKey(d);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tswitch (d.Type) {\r\n\t\t\t\t\t\tcase PdfObjectType.Trailer:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Document\"];\r\n\t\t\t\t\t\tcase PdfObjectType.Root:\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase PdfObjectType.Pages:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Pages\"];\r\n\t\t\t\t\t\tcase PdfObjectType.Page:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Page\"];\r\n\t\t\t\t\t\tcase PdfObjectType.Image:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Image\"];\r\n\t\t\t\t\t\tcase PdfObjectType.Form:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Form\"];\r\n\t\t\t\t\t\tcase PdfObjectType.Resources:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Resources\"];\r\n\t\t\t\t\t\tcase PdfObjectType.Outline:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Outline\"];\r\n\t\t\t\t\t\tcase PdfObjectType.PageCommands:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"PageCommands\"];\r\n\t\t\t\t\t\tcase PdfObjectType.PageCommand:\r\n\t\t\t\t\t\t\tif (d.ImageKey == null) {\r\n\t\t\t\t\t\t\t\tvar n = d.ExtensiveObject as string;\r\n\t\t\t\t\t\t\t\tif ((n != null && __OpNameIcons.TryGetValue(n, out int ic))\r\n\t\t\t\t\t\t\t\t\t|| (d.Name.StartsWith(Constants.ContentPrefix + \":\") && __OpNameIcons.TryGetValue(d.Name, out ic))\r\n\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\td.ImageKey = ic;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\td.ImageKey = __OpNameIcons[\"?\"];\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn d.ImageKey;\r\n\t\t\t\t\t\tcase PdfObjectType.Hidden:\r\n\t\t\t\t\t\t\treturn __OpNameIcons[\"Hidden\"];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn GetImageKey(d);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<DocumentObject>(_ValueColumn) {\r\n\t\t\t\tAspectGetter = (DocumentObject d) => d.FriendlyValue ?? d.LiteralValue,\r\n\t\t\t\tAspectPutter = (DocumentObject d, object value) => {\r\n\t\t\t\t\tif (!d.UpdateDocumentObject(value)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar r = d.FindReferenceAncestor();\r\n\t\t\t\t\tif (r != null) {\r\n\t\t\t\t\t\tRefreshReferences(r);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (d.Parent?.Type == PdfObjectType.Outline && d.Name == \"Title\") {\r\n\t\t\t\t\t\td.Parent.Description = (string)value;\r\n\t\t\t\t\t\t_ObjectDetailBox.RefreshObject(d.Parent);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_DescriptionColumn.AspectGetter = (object o) => ((DocumentObject)o).Description;\r\n\t\t\t_ObjectDetailBox.PrimarySortColumn = null;\r\n\t\t\t_ObjectDetailBox.CopySelectionOnControlC = true;\r\n\t\t\t_ObjectDetailBox.CellEditStarting += (s, args) => {\r\n\t\t\t\tvar o = (DocumentObject)args.RowObject;\r\n\t\t\t\tstring t;\r\n\t\t\t\tbool readOnly = true;\r\n\t\t\t\tif (args.Column.Index == 2) {\r\n\t\t\t\t\tif (String.IsNullOrEmpty(o.Description) == false) {\r\n\t\t\t\t\t\tt = o.Description;\r\n\t\t\t\t\t\tgoto MAKE_CONTROL;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgoto EXIT;\r\n\t\t\t\t}\r\n\t\t\t\tvar po = o.Value;\r\n\t\t\t\tif (po != null) {\r\n\t\t\t\t\tswitch (po.Type) {\r\n\t\t\t\t\t\tcase PdfObject.BOOLEAN:\r\n\t\t\t\t\t\t\targs.Control = new CheckBox() { Checked = ((PdfBoolean)po).BooleanValue, Bounds = args.CellBounds };\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tcase PdfObject.NUMBER:\r\n\t\t\t\t\t\t\tt = ((PdfNumber)po).DoubleValue.ToText();\r\n\t\t\t\t\t\t\treadOnly = false;\r\n\t\t\t\t\t\t\tgoto MAKE_CONTROL;\r\n\t\t\t\t\t\tcase PdfObject.NAME:\r\n\t\t\t\t\t\t\tt = PdfName.DecodeName(((PdfName)po).ToString());\r\n\t\t\t\t\t\t\treadOnly = false;\r\n\t\t\t\t\t\t\tgoto MAKE_CONTROL;\r\n\t\t\t\t\t\tcase PdfObject.STRING:\r\n\t\t\t\t\t\t\tt = ((PdfString)po).ToUnicodeString();\r\n\t\t\t\t\t\t\treadOnly = false;\r\n\t\t\t\t\t\t\tgoto MAKE_CONTROL;\r\n\t\t\t\t\t\tcase PdfObject.DICTIONARY:\r\n\t\t\t\t\t\tcase PdfObject.STREAM:\r\n\t\t\t\t\t\tcase PdfObject.NULL:\r\n\t\t\t\t\t\t\targs.Cancel = true;\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (args.Value != null) {\r\n\t\t\t\t\tt = args.Value.ToString();\r\n\t\t\t\t\tgoto MAKE_CONTROL;\r\n\t\t\t\t}\r\n\t\t\t\tEXIT:\r\n\t\t\t\targs.Cancel = true;\r\n\t\t\t\treturn;\r\n\t\t\t\tMAKE_CONTROL:\r\n\t\t\t\targs.Control = new AutoResizingTextBox(args.CellBounds, t, (Control)s) { ReadOnly = readOnly };\r\n\t\t\t};\r\n\t\t\t_ObjectDetailBox.CanExpandGetter = (object o) => {\r\n\t\t\t\tif (o is not DocumentObject d) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (d.Type == PdfObjectType.GoToPage) {\r\n\t\t\t\t\td.ImageKey = __OpNameIcons[\"GoToPage\"];\r\n\t\t\t\t}\r\n\t\t\t\treturn d.HasChildren;\r\n\t\t\t};\r\n\t\t\t_ObjectDetailBox.ChildrenGetter = (object o) => o is DocumentObject d\r\n\t\t\t\t? (System.Collections.IEnumerable)d.Children\r\n\t\t\t\t: null;\r\n\t\t\t_ObjectDetailBox.RowFormatter = (OLVListItem olvItem) => {\r\n\t\t\t\tif (olvItem.RowObject is not DocumentObject o) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (o.Type == PdfObjectType.Normal) {\r\n\t\t\t\t\tvar po = o.Value;\r\n\t\t\t\t\tif (po == null) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (po.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\t\tolvItem.UseItemStyleForSubItems = false;\r\n\t\t\t\t\t\tolvItem.SubItems[_ValueColumn.Index].ForeColor = SystemColors.HotTrack;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (PdfHelper.CompoundTypes.Contains(po.Type)) {\r\n\t\t\t\t\t\tolvItem.UseItemStyleForSubItems = false;\r\n\t\t\t\t\t\tolvItem.SubItems[_ValueColumn.Index].ForeColor = SystemColors.GrayText;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (o.Type == PdfObjectType.Page) {\r\n\t\t\t\t\tolvItem.ForeColor = Color.DarkRed;\r\n\t\t\t\t}\r\n\t\t\t\telse if (o.Type == PdfObjectType.Pages) {\r\n\t\t\t\t\tolvItem.Font = new Font(olvItem.Font, FontStyle.Bold);\r\n\t\t\t\t\tolvItem.ForeColor = Color.DarkRed;\r\n\t\t\t\t\tolvItem.BackColor = Color.LightYellow;\r\n\t\t\t\t}\r\n\t\t\t\telse if (o.Type == PdfObjectType.Trailer) {\r\n\t\t\t\t\tolvItem.Font = new Font(olvItem.Font, FontStyle.Bold);\r\n\t\t\t\t\tolvItem.BackColor = Color.LightYellow;\r\n\t\t\t\t}\r\n\t\t\t\telse if (o.Type == PdfObjectType.Outline) {\r\n\t\t\t\t\tolvItem.UseItemStyleForSubItems = false;\r\n\t\t\t\t\tolvItem.SubItems[0].ForeColor = SystemColors.HotTrack;\r\n\t\t\t\t\tolvItem.SubItems[_ValueColumn.Index].ForeColor = SystemColors.HotTrack;\r\n\t\t\t\t}\r\n\t\t\t\telse if (o.Type == PdfObjectType.PageCommand && (o.Name == \"字符串\" || o.Name == \"换行字符串\")) {\r\n\t\t\t\t\tolvItem.UseItemStyleForSubItems = false;\r\n\t\t\t\t\tolvItem.SubItems[_DescriptionColumn.Index].Font = new Font(olvItem.Font, FontStyle.Underline);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ObjectDetailBox.SelectionChanged += _ObjectDetailBox_SelectionChanged;\r\n\t\t\t_ObjectDetailBox.IsSimpleDropSink = true;\r\n\t\t\t_ObjectDetailBox.CanDrop += _ObjectDetailBox_CanDrop;\r\n\t\t\t_ObjectDetailBox.Dropped += _ObjectDetailBox_Dropped;\r\n\t\t\t#endregion\r\n\t\t\t_AddNameNode.Image = _ObjectTypeIcons.Images[\"Name\"];\r\n\t\t\t_AddStringNode.Image = _ObjectTypeIcons.Images[\"String\"];\r\n\t\t\t_AddDictNode.Image = _ObjectTypeIcons.Images[\"Dictionary\"];\r\n\t\t\t_AddArrayNode.Image = _ObjectTypeIcons.Images[\"Array\"];\r\n\t\t\t_AddNumberNode.Image = _ObjectTypeIcons.Images[\"Number\"];\r\n\t\t\t_AddBooleanNode.Image = _ObjectTypeIcons.Images[\"Bool\"];\r\n\r\n\t\t\t_addPdfObjectMenuItems = [_AddNameNode, _AddStringNode, _AddDictNode, _AddArrayNode, _AddNumberNode, _AddBooleanNode];\r\n\t\t\t_pdfTypeForAddObjectMenuItems = [PdfObject.NAME, PdfObject.STRING, PdfObject.DICTIONARY, PdfObject.ARRAY, PdfObject.NUMBER, PdfObject.BOOLEAN];\r\n\r\n\t\t\t_OpenButton.DropDownOpening += FileListHelper.OpenPdfButtonDropDownOpeningHandler;\r\n\t\t\t_OpenButton.DropDownItemClicked += (s, args) => {\r\n\t\t\t\targs.ClickedItem.Owner.Hide();\r\n\t\t\t\tLoadDocument(args.ClickedItem.ToolTipText);\r\n\t\t\t};\r\n\t\t\tDisposed += (s, args) => _pdf?.Document.Dispose();\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tvar n = item.Name;\r\n\t\t\tswitch (n) {\r\n\t\t\t\tcase Commands.Action:\r\n\t\t\t\t\titem.Text = _SaveButton.Text;\r\n\t\t\t\t\titem.Image = _SaveButton.Image;\r\n\t\t\t\t\titem.ToolTipText = _SaveButton.ToolTipText;\r\n\t\t\t\t\treturn;\r\n\t\t\t\tcase Commands.Delete:\r\n\t\t\t\t\tEnableCommand(item, _DeleteButton.Enabled, true);\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (Commands.CommonSelectionCommands.Contains(n)\r\n\t\t\t\t|| Commands.RecentFiles == n\r\n\t\t\t\t) {\r\n\t\t\t\tEnableCommand(item, _ObjectDetailBox.GetItemCount() > 0, true);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbase.SetupCommand(item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\tvar p = AppContext.MainForm.ShowPdfFileDialog();\r\n\t\t\t\t\tif (p != null) {\r\n\t\t\t\t\t\tLoadDocument(p);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.OpenFile:\r\n\t\t\t\t\tLoadDocument(parameters[0]);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.Action:\r\n\t\t\t\t\tSaveDocument();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllItems:\r\n\t\t\t\t\t_ObjectDetailBox.SelectAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectNone:\r\n\t\t\t\t\t_ObjectDetailBox.SelectedObjects = null;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.InvertSelection:\r\n\t\t\t\t\t_ObjectDetailBox.InvertSelect();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n\t\tprotected override bool ProcessCmdKey(ref Message msg, Keys keyData) {\r\n\t\t\tif (_ObjectDetailBox.IsCellEditing) {\r\n\t\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t\t}\r\n\t\t\tswitch (keyData ^ Keys.Control) {\r\n\t\t\t\tcase Keys.O: ExecuteCommand(Commands.Open); return true;\r\n\t\t\t\tcase Keys.C: ExecuteCommand(Commands.Copy); return true;\r\n\t\t\t\tcase Keys.S: ExecuteCommand(Commands.Action); return true;\r\n\t\t\t}\r\n\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t}\r\n\r\n\t\tvoid RefreshReferences(DocumentObject r) {\r\n\t\t\tif (r.Value == null || r.Value.Type != PdfObject.INDIRECT) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar v = r.Value as PdfIndirectReference;\r\n\t\t\tvar l = _ObjectDetailBox.VirtualListSize;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tif (_ObjectDetailBox.GetModelObject(i) is not DocumentObject m) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (m.Type == PdfObjectType.PageCommands) {\r\n\t\t\t\t\ti += (_ObjectDetailBox.VirtualListDataSource as TreeListView.Tree).GetVisibleDescendentCount(m);\r\n\t\t\t\t}\r\n\t\t\t\tif (m.ExtensiveObject != null && m.Value != null && m.Value.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\tvar mv = m.Value as PdfIndirectReference;\r\n\t\t\t\t\tif (mv.Number == v.Number && mv.Generation == v.Generation && m != r) {\r\n\t\t\t\t\t\t_ObjectDetailBox.RefreshObject(m);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void CloseDocument() {\r\n\t\t\t_pdf.Document?.SafeFile.Close();\r\n\t\t}\r\n\r\n\t\tpublic void Reopen() {\r\n\t\t\t_pdf.Document?.SafeFile.ReOpen();\r\n\t\t}\r\n\r\n\t\tvoid _ObjectDetailBox_CanDrop(object sender, OlvDropEventArgs e) {\r\n\t\t\tif (e.DataObject is not DataObject o) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in o.GetFileDropList()) {\r\n\t\t\t\tif (FileHelper.HasExtension(item, Constants.FileExtensions.Xml)\r\n\t\t\t\t\t|| FileHelper.HasExtension(item, Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\te.Handled = true;\r\n\t\t\t\t\te.DropTargetLocation = DropTargetLocation.Background;\r\n\t\t\t\t\te.Effect = DragDropEffects.Move;\r\n\t\t\t\t\te.InfoMessage = \"打开文件\" + item;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\te.DropTargetLocation = DropTargetLocation.None;\r\n\t\t}\r\n\r\n\t\tvoid _ObjectDetailBox_Dropped(object sender, OlvDropEventArgs e) {\r\n\t\t\tif (e.DataObject is not DataObject o) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar f = o.GetFileDropList();\r\n\t\t\tif (f.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tLoadDocument(f[0]);\r\n\t\t}\r\n\r\n\t\tvoid _ObjectDetailBox_SelectionChanged(object sender, EventArgs e) {\r\n\t\t\tvar si = _ObjectDetailBox.SelectedItem;\r\n\t\t\tif (si == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_ExpandButton.Enabled = _CollapseButton.Enabled = true;\r\n\t\t\t_ViewButton.Enabled = false;\r\n\t\t\t_DeleteButton.Enabled = false;\r\n\t\t\t_ExportButton.Enabled = false;\r\n\t\t\t_AddObjectMenu.Enabled = false;\r\n\t\t\tif (_ObjectDetailBox.GetModelObject(si.Index) is not DocumentObject d) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (d.Value != null && (d.Value.Type == PdfObject.INDIRECT || d.Value.Type == PdfObject.STREAM)) {\r\n\t\t\t\tvar s = d.Value as PRStream ?? d.ExtensiveObject as PRStream;\r\n\t\t\t\tif (s != null) {\r\n\t\t\t\t\t_ViewButton.Enabled = d.Name.HasPrefix(\"Font\") == false;\r\n\t\t\t\t\t_ExportButton.Enabled = _AddObjectMenu.Enabled = true;\r\n\t\t\t\t\tif (PdfName.IMAGE.Equals(s.GetAsName(PdfName.SUBTYPE))) {\r\n\t\t\t\t\t\tShowDescription(\"图片\", null, PdfHelper.GetTypeName(PdfObject.STREAM));\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ((d.Value != null && d.Value is PdfDictionary) || d.ExtensiveObject is PdfDictionary) {\r\n\t\t\t\t_AddObjectMenu.Enabled = true;\r\n\t\t\t}\r\n\t\t\tif (__XmlExportableTypes.Contains(d.Type)) {\r\n\t\t\t\t_ExportButton.Enabled = true;\r\n\t\t\t}\r\n\t\t\tif (d.Parent == null) {\r\n\t\t\t\tif (d.Type == PdfObjectType.Trailer) {\r\n\t\t\t\t\tShowDescription(\"文档根节点\", _fileName, null);\r\n\t\t\t\t}\r\n\t\t\t\telse if (d.Type == PdfObjectType.Pages) {\r\n\t\t\t\t\tShowDescription(\"文档页面\", \"页数：\" + _pdf.PageCount, null);\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar i = PdfStructInfo.GetInfo(d.Parent.GetContextName(), d.Name);\r\n\t\t\tstring t = null;\r\n\t\t\tvar o = d.ExtensiveObject as PdfObject ?? d.Value;\r\n\t\t\tif (o != null) {\r\n\t\t\t\tt = PdfHelper.GetTypeName(o.Type);\r\n\t\t\t}\r\n\t\t\tShowDescription(String.IsNullOrEmpty(i.Name) || d.Name == i.Name ? d.Name : $\"{d.Name}:{i.Name}\", i.Description, t);\r\n\t\t\t_DeleteButton.Enabled = !i.IsRequired && d != null\r\n\t\t\t\t&& (d.Type == PdfObjectType.Normal || d.Type == PdfObjectType.Image || d.Type == PdfObjectType.Form || d.Type == PdfObjectType.Resources || d.Type == PdfObjectType.Outline && d.Name == \"Outlines\");\r\n\t\t}\r\n\r\n\t\tDictionary<string, int> InitOpNameIcons() {\r\n\t\t\tvar p = new string[] { \"Document\", \"Pages\", \"Page\", \"PageCommands\", \"Image\", \"Form\", \"Font\", \"Resources\", \"Hidden\", \"GoToPage\", \"Outline\", \"Null\" };\r\n\t\t\tvar n = new string[] {\r\n\t\t\t\t\"q\", \"Tm\", \"cm\", \"gs\", \"ri\", \"CS\", \"cs\",\r\n\t\t\t\t\"RG\", \"rg\", \"scn\", \"SCN\", \"sc\", \"SC\", \"K\", \"k\",\r\n\t\t\t\t\"g\", \"G\", \"s\", \"S\",\r\n\t\t\t\t\"f\", \"F\", \"f*\", \"b\", \"B\", \"b*\", \"B*\",\r\n\t\t\t\t\"Tf\", \"Tz\", \"Ts\", \"T*\", \"Td\", \"TD\",\r\n\t\t\t\t\"TJ\", \"Tj\", \"'\", \"\\\"\",\r\n\t\t\t\t\"Tk\", \"Tr\", \"Tc\", \"Tw\", \"TL\",\r\n\t\t\t\t\"BI\", \"BT\", \"BDC\", \"BMC\",\r\n\t\t\t\t\"Do\",\r\n\t\t\t\t\"W*\", \"W\", \"c\", \"v\", \"y\", \"l\", \"re\",\r\n\t\t\t\t\"m\", \"h\", \"n\", \"w\", \"J\", \"j\", \"M\", \"d\", \"i\",\r\n\t\t\t\t\"pdf:number\", \"pdf:string\", \"pdf:name\", \"pdf:dictionary\", \"pdf:array\", \"pdf:boolean\",\r\n\t\t\t\t\"?\" };\r\n\t\t\tvar ico = new string[] {\r\n\t\t\t\t\"op_q\", \"op_tm\", \"op_cm\", \"op_gs\", \"op_gs\", \"op_gs\", \"op_gs\",\r\n\t\t\t\t\"op_sc\", \"op_sc\", \"op_sc\", \"op_sc\", \"op_sc\", \"op_sc\", \"op_sc\", \"op_sc\",\r\n\t\t\t\t\"op_g\", \"op_g\", \"op_s\", \"op_s\",\r\n\t\t\t\t\"op_f\", \"op_f\", \"op_f\", \"op_b\", \"op_b\", \"op_b\", \"op_b\",\r\n\t\t\t\t\"Font\", \"op_Tz\", \"op_Ts\", \"op_Td\", \"op_Td\", \"op_Td\",\r\n\t\t\t\t\"op_TJ\", \"op_TJ\", \"op_TJ\", \"op_TJ\",\r\n\t\t\t\t\"op_Tr\", \"op_Tr\", \"op_Tc\", \"op_Tc\", \"op_Tl\",\r\n\t\t\t\t\"Image\", \"op_BT\", \"op_BDC\", \"op_BDC\",\r\n\t\t\t\t\"Resources\",\r\n\t\t\t\t\"op_W*\", \"op_W*\", \"op_c\", \"op_c\", \"op_c\", \"op_l\", \"op_re\",\r\n\t\t\t\t\"op_m\", \"op_h\", \"op_h\", \"op_w\", \"op_l\", \"op_l\", \"op_M_\", \"op_d\", \"op_gs\",\r\n\t\t\t\t\"Number\", \"String\", \"Name\", \"Dictionary\", \"Array\", \"Bool\",\r\n\t\t\t\t\"Error\" };\r\n\t\t\tvar d = new Dictionary<string, int>(n.Length + p.Length);\r\n\t\t\tforeach (var i in p) {\r\n\t\t\t\td.Add(i, _ObjectTypeIcons.Images.IndexOfKey(i));\r\n\t\t\t}\r\n\t\t\tfor (int i = 0; i < n.Length; i++) {\r\n\t\t\t\td.Add(n[i], _ObjectTypeIcons.Images.IndexOfKey(ico[i]));\r\n\t\t\t}\r\n\t\t\treturn d;\r\n\t\t}\r\n\t\tDictionary<int, int> InitPdfObjectIcons() {\r\n\t\t\tvar n = new int[] { PdfObject.NULL, PdfObject.ARRAY, PdfObject.BOOLEAN,\r\n\t\t\t\tPdfObject.DICTIONARY, PdfObject.INDIRECT, PdfObject.NAME,\r\n\t\t\t\tPdfObject.NUMBER, PdfObject.STREAM, PdfObject.STRING };\r\n\t\t\tvar d = new Dictionary<int, int>(n.Length);\r\n\t\t\tfor (int i = 0; i < n.Length; i++) {\r\n\t\t\t\td.Add(n[i], _ObjectTypeIcons.Images.IndexOfKey(PdfHelper.GetTypeName(n[i])));\r\n\t\t\t}\r\n\t\t\treturn d;\r\n\t\t}\r\n\r\n\t\tstatic int GetImageKey(DocumentObject d) {\r\n\t\t\tif (d.Value != null) {\r\n\t\t\t\tvar po = d.Value;\r\n\t\t\t\tif (po.Type == PdfObject.INDIRECT && d.ExtensiveObject is PdfObject e) {\r\n\t\t\t\t\tpo = e;\r\n\t\t\t\t}\r\n\t\t\t\treturn __PdfObjectIcons.GetOrDefault(po.Type);\r\n\t\t\t}\r\n\t\t\treturn __PdfObjectIcons[PdfObject.NULL];\r\n\t\t}\r\n\r\n\t\tvoid _GotoImportLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {\r\n\t\t\tAppContext.MainForm.SelectFunctionList(Function.Patcher);\r\n\t\t}\r\n\r\n\t\tvoid ControlEvent(object sender, EventArgs e) {\r\n\t\t\tif (sender == _OpenButton) {\r\n\t\t\t\tExecuteCommand(Commands.Open);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid LoadDocument(string path) {\r\n\t\t\t_MainToolbar.Enabled = _ObjectDetailBox.Enabled = false;\r\n\t\t\t_DescriptionBox.Text = \"正在打开文档：\" + path;\r\n\t\t\t_LoadDocumentWorker.RunWorkerAsync(path);\r\n\t\t}\r\n\r\n\t\tvoid ShowDescription(string name, string description, string type) {\r\n\t\t\t_DescriptionBox.Text = String.Empty;\r\n\t\t\tif (String.IsNullOrEmpty(name)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_DescriptionBox.SetSelectionFontSize(13);\r\n\t\t\t_DescriptionBox.SetSelectionBold(true);\r\n\t\t\t_DescriptionBox.AppendText(name);\r\n\t\t\t_DescriptionBox.SetSelectionFontSize(9);\r\n\t\t\tif (type != null) {\r\n\t\t\t\t_DescriptionBox.AppendText(Environment.NewLine);\r\n\t\t\t\t_DescriptionBox.AppendText(\"类型：\" + type);\r\n\t\t\t}\r\n\t\t\tif (description != null) {\r\n\t\t\t\t_DescriptionBox.AppendText(Environment.NewLine);\r\n\t\t\t\t_DescriptionBox.AppendText(description);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ToolbarItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tif (_ObjectDetailBox.FocusedItem == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar ci = e.ClickedItem;\r\n\t\t\tif (ci == _SaveButton) {\r\n\t\t\t\tSaveDocument();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar cn = ci.Name;\r\n\t\t\tvar n = _ObjectDetailBox.GetModelObject(_ObjectDetailBox.FocusedItem.Index) as DocumentObject;\r\n\t\t\tif (ci == _DeleteButton) {\r\n\t\t\t\tif (n == null || n.Parent == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (n.Parent.Value is not PdfObject po) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (po.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\tpo = n.Parent.ExtensiveObject as PdfObject;\r\n\t\t\t\t}\r\n\t\t\t\tif (PdfHelper.CompoundTypes.Contains(po.Type)\r\n\t\t\t\t\t&& n.Parent.RemoveChildByName(n.Name)) {\r\n\t\t\t\t\t_ObjectDetailBox.RefreshObject(n.Parent);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (ci == _ViewButton) {\r\n\t\t\t\tif (n == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (n.ExtensiveObject is not PRStream s) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (PdfName.IMAGE.Equals(s.GetAsName(PdfName.SUBTYPE))\r\n\t\t\t\t\t|| n.Name == \"Thumb\") {\r\n\t\t\t\t\tvar info = new Processor.Imaging.ImageInfo(s);\r\n\t\t\t\t\tvar bytes = info.DecodeImage(_imgExpOption);\r\n\t\t\t\t\tif (bytes != null) {\r\n\t\t\t\t\t\tif (info.LastDecodeError != null) {\r\n\t\t\t\t\t\t\tFormHelper.ErrorBox(\"导出图像时出现错误：\" + info.LastDecodeError);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (info.ExtName != Constants.FileExtensions.Dat) {\r\n\t\t\t\t\t\t\tnew ImageViewerForm(info, bytes).Show();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tusing (var f = new TextViewerForm(PdfReader.GetStreamBytes(s), true)) {\r\n\t\t\t\t\t\tf.ShowDialog(FindForm());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExportBinary\") {\r\n\t\t\t\tci.HidePopupMenu();\r\n\t\t\t\tExportBinaryStream(n, true);\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExportHexText\") {\r\n\t\t\t\tci.HidePopupMenu();\r\n\t\t\t\tExportBinHexStream(n, true);\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExportUncompressedBinary\") {\r\n\t\t\t\tci.HidePopupMenu();\r\n\t\t\t\tExportBinaryStream(n, false);\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExportUncompressedHexText\") {\r\n\t\t\t\tci.HidePopupMenu();\r\n\t\t\t\tExportBinHexStream(n, false);\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExportToUnicode\") {\r\n\t\t\t\tci.HidePopupMenu();\r\n\t\t\t\tExportToUnicode(n);\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExportXml\") {\r\n\t\t\t\tci.HidePopupMenu();\r\n\t\t\t\tvar so = _ObjectDetailBox.SelectedObjects;\r\n\t\t\t\tvar ep = new List<int>(so.Count);\r\n\t\t\t\tbool exportTrailer = false;\r\n\t\t\t\tif (_ObjectDetailBox.Items[0].Selected || n.Type == PdfObjectType.Trailer) {\r\n\t\t\t\t\texportTrailer = true;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var item in so) {\r\n\t\t\t\t\tif (item is not DocumentObject d) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (d.Type == PdfObjectType.Page) {\r\n\t\t\t\t\t\tep.Add((int)d.ExtensiveObject);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (d.Type == PdfObjectType.Pages) {\r\n\t\t\t\t\t\tforeach (var r in PageRangeCollection.Parse((string)d.ExtensiveObject, 1, _pdf.PageCount, true)) {\r\n\t\t\t\t\t\t\tep.AddRange(r);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (ep.Count == 1) {\r\n\t\t\t\t\tExportXmlInfo(n.FriendlyName ?? n.Name, exportTrailer, [(int)n.ExtensiveObject]);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tExportXmlInfo(Path.GetFileNameWithoutExtension(_fileName), exportTrailer, ep.ToArray());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_ExpandButton\") {\r\n\t\t\t\t_ObjectDetailBox.ExpandSelected();\r\n\t\t\t}\r\n\t\t\telse if (cn == \"_CollapseButton\") {\r\n\t\t\t\t_ObjectDetailBox.CollapseSelected();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid AddChildNode(DocumentObject documentObject, int objectType) {\r\n\t\t\tusing (var f = new AddPdfObjectForm()) {\r\n\t\t\t\tf.PdfObjectType = objectType;\r\n\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tvar v = f.PdfValue;\r\n\t\t\t\t\t((PdfDictionary)documentObject.ExtensiveObject).Put(new PdfName(f.ObjectName), f.CreateAsIndirect ? _pdf.Document.AddPdfObject(v) : v);\r\n\t\t\t\t\tdocumentObject.PopulateChildren(true);\r\n\t\t\t\t\t_ObjectDetailBox.RefreshObject(documentObject);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportXmlInfo(string fileName, bool exportTrailer, int[] pages) {\r\n\t\t\tusing (var d = new SaveFileDialog() {\r\n\t\t\t\tAddExtension = true,\r\n\t\t\t\tFileName = fileName + Constants.FileExtensions.Xml,\r\n\t\t\t\tDefaultExt = Constants.FileExtensions.Xml,\r\n\t\t\t\tFilter = Constants.FileExtensions.XmlFilter,\r\n\t\t\t\tTitle = \"请选择信息文件的保存位置\"\r\n\t\t\t}) {\r\n\t\t\t\tif (d.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tvar exp = new PdfContentExport(new ExporterOptions() { ExtractPageDictionary = true, ExportContentOperators = true });\r\n\t\t\t\t\tusing (XmlWriter w = XmlWriter.Create(d.FileName, DocInfoExporter.GetWriterSettings())) {\r\n\t\t\t\t\t\tw.WriteStartDocument();\r\n\t\t\t\t\t\tw.WriteStartElement(Constants.PdfInfo);\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.ContentPrefix, \"http://www.w3.org/2000/xmlns/\", Constants.ContentNamespace);\r\n\t\t\t\t\t\tDocInfoExporter.WriteDocumentInfoAttributes(w, _fileName, _pdf.PageCount);\r\n\t\t\t\t\t\tif (exportTrailer) {\r\n\t\t\t\t\t\t\texp.ExportTrailer(w, _pdf.Document);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\texp.ExportPage(_pdf.Document, w, pages);\r\n\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportBinHexStream(DocumentObject n, bool decode) {\r\n\t\t\tusing (var d = new SaveFileDialog() {\r\n\t\t\t\tAddExtension = true,\r\n\t\t\t\tFileName = (n.FriendlyName ?? n.Name) + Constants.FileExtensions.Txt,\r\n\t\t\t\tDefaultExt = Constants.FileExtensions.Txt,\r\n\t\t\t\tFilter = \"文本形式的二进制数据文件(*.txt)|*.txt|\" + Constants.FileExtensions.AllFilter,\r\n\t\t\t\tTitle = \"请选择文件流的保存位置\"\r\n\t\t\t}) {\r\n\t\t\t\tif (d.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tvar s = n.ExtensiveObject as PRStream;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tvar sb = decode ? DecodeStreamBytes(n) : PdfReader.GetStreamBytesRaw(s);\r\n\t\t\t\t\t\tsb.DumpHexBinBytes(d.FileName);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\tAppContext.MainForm.ErrorBox(\"导出流数据时出错\", ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportBinaryStream(DocumentObject n, bool decode) {\r\n\t\t\tusing (var d = new SaveFileDialog() {\r\n\t\t\t\tAddExtension = true,\r\n\t\t\t\tFileName = (n.FriendlyName ?? n.Name) + \".bin\",\r\n\t\t\t\tDefaultExt = \".bin\",\r\n\t\t\t\tFilter = \"二进制数据文件(*.bin,*.dat)|*.bin;*.dat|\" + Constants.FileExtensions.AllFilter,\r\n\t\t\t\tTitle = \"请选择文件流的保存位置\"\r\n\t\t\t}) {\r\n\t\t\t\tif (d.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tvar s = n.ExtensiveObject as PRStream;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tvar sb = decode ? DecodeStreamBytes(n) : PdfReader.GetStreamBytesRaw(s);\r\n\t\t\t\t\t\tsb.DumpBytes(d.FileName);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\tAppContext.MainForm.ErrorBox(\"导出流数据时出错\", ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportToUnicode(DocumentObject n) {\r\n\t\t\tusing (var d = new SaveFileDialog {\r\n\t\t\t\tAddExtension = true,\r\n\t\t\t\tFileName = (n.Parent.FriendlyName ?? n.Name) + \".xml\",\r\n\t\t\t\tDefaultExt = \".xml\",\r\n\t\t\t\tFilter = \"统一码映射信息文件(*.xml)|*.xml|\" + Constants.FileExtensions.AllFilter,\r\n\t\t\t\tTitle = \"请选择统一码映射表的保存位置\"\r\n\t\t\t}) {\r\n\t\t\t\tif (d.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tvar s = n.ExtensiveObject as PRStream;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tvar m = new CMapToUnicode();\r\n\t\t\t\t\t\tCMapParserEx.ParseCid(\"\", m, new CidLocationFromByte(PdfReader.GetStreamBytes(s)));\r\n\t\t\t\t\t\tusing (var w = XmlWriter.Create(d.FileName, DocInfoExporter.GetWriterSettings())) {\r\n\t\t\t\t\t\t\tw.WriteStartElement(\"toUnicode\");\r\n\t\t\t\t\t\t\tw.WriteAttributeString(\"name\", m.Name);\r\n\t\t\t\t\t\t\tw.WriteAttributeString(\"registry\", m.Registry);\r\n\t\t\t\t\t\t\tw.WriteAttributeString(\"supplement\", m.Supplement.ToText());\r\n\t\t\t\t\t\t\tw.WriteAttributeString(\"ordering\", m.Ordering);\r\n\t\t\t\t\t\t\tw.WriteAttributeString(\"oneByteMappings\", m.HasOneByteMappings().ToString());\r\n\t\t\t\t\t\t\tw.WriteAttributeString(\"twoByteMappings\", m.HasTwoByteMappings().ToString());\r\n\t\t\t\t\t\t\tforeach (var item in m.CreateDirectMapping()) {\r\n\t\t\t\t\t\t\t\tw.WriteStartElement(\"map\");\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(\"cid\", item.Key.ToText());\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(\"uni\", Char.ConvertFromUtf32(item.Value));\r\n\t\t\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\tAppContext.MainForm.ErrorBox(\"导出统一码映射表数据时出错\", ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbyte[] DecodeStreamBytes(DocumentObject d) {\r\n\t\t\tvar s = d.Value as PRStream ?? d.ExtensiveObject as PRStream;\r\n\t\t\tif (d.Type == PdfObjectType.Image) {\r\n\t\t\t\tvar info = new Processor.Imaging.ImageInfo(s);\r\n\t\t\t\treturn info.DecodeImage(_imgExpOption);\r\n\t\t\t}\r\n\t\t\treturn PdfReader.GetStreamBytes(s);\r\n\t\t}\r\n\r\n\t\tvoid SaveDocument() {\r\n\t\t\tstring path;\r\n\t\t\tusing (var d = new SaveFileDialog() {\r\n\t\t\t\tDefaultExt = Constants.FileExtensions.Pdf,\r\n\t\t\t\tFilter = Constants.FileExtensions.PdfFilter,\r\n\t\t\t\tAddExtension = true,\r\n\t\t\t\tFileName = FileHelper.GetNewFileNameFromSourceFile(_fileName, Constants.FileExtensions.Pdf),\r\n\t\t\t\tInitialDirectory = Path.GetDirectoryName(_fileName)\r\n\t\t\t}) {\r\n\t\t\t\tif (d.ShowDialog() != DialogResult.OK) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tpath = d.FileName;\r\n\t\t\t}\r\n\r\n\t\t\tbool o = false;\r\n\t\t\tvar n = String.Empty;\r\n\t\t\tif (FileHelper.ComparePath(path, _fileName) && FormHelper.YesNoBox(\"是否覆盖原始文件？\") == DialogResult.Yes) {\r\n\t\t\t\to = true;\r\n\t\t\t}\r\n\t\t\t_ObjectDetailBox.ClearObjects();\r\n\t\t\t_pdf.Document.RemoveUnusedObjects();\r\n\t\t\ttry {\r\n\t\t\t\tn = o ? FileHelper.GetTempNameFromFileDirectory(path, Constants.FileExtensions.Pdf) : path;\r\n\t\t\t\tusing (var s = new FileStream(n, FileMode.Create)) {\r\n\t\t\t\t\tvar w = new PdfStamper(_pdf.Document, s);\r\n\t\t\t\t\tif (AppContext.Patcher.FullCompression) {\r\n\t\t\t\t\t\tw.SetFullCompression();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw.Close();\r\n\t\t\t\t\t_pdf.Close();\r\n\t\t\t\t}\r\n\t\t\t\tif (o) {\r\n\t\t\t\t\tFile.Delete(path);\r\n\t\t\t\t\tFile.Move(n, path);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"保存文件时出错\", ex);\r\n\t\t\t\tif (o && File.Exists(n)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tFile.Delete(n);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception e2) {\r\n\t\t\t\t\t\tAppContext.MainForm.ErrorBox(\"无法删除临时文件：\" + n, e2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tLoadDocument(_fileName);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tLoadDocument(path);\r\n\t\t}\r\n\r\n\t\tvoid _LoadDocumentWorker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar path = e.Argument as string;\r\n\t\t\ttry {\r\n\t\t\t\tvar d = new PdfPathDocument(path);\r\n\t\t\t\t_pdf?.Close();\r\n\t\t\t\t_pdf = d;\r\n\t\t\t\te.Result = path;\r\n\t\t\t}\r\n\t\t\tcatch (iTextSharp.text.exceptions.BadPasswordException) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.PasswordInvalid);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"打开 PDF 文件时遇到错误\", ex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _LoadDocumentWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\t_DescriptionBox.Text = String.Empty;\r\n\t\t\tif (e.Result is string path) {\r\n\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, path);\r\n\t\t\t\tDocumentPath = path;\r\n\t\t\t\tReloadPdf();\r\n\t\t\t}\r\n\t\t\t_MainToolbar.Enabled = _ObjectDetailBox.Enabled = true;\r\n\t\t}\r\n\r\n\t\tvoid ReloadPdf() {\r\n\t\t\t_imgExp = new ImageExtractor(_imgExpOption);\r\n\r\n\t\t\t_ObjectDetailBox.ClearObjects();\r\n\t\t\t_ObjectDetailBox.Objects = ((IHierarchicalObject<DocumentObject>)_pdf).Children;\r\n\t\t\t_SaveButton.Enabled = true;\r\n\t\t\t_AddObjectMenu.Enabled = false;\r\n\t\t\t_DeleteButton.Enabled = false;\r\n\t\t}\r\n\r\n\t\tvoid _ExportButton_DropDownOpening(object sender, EventArgs e) {\r\n\t\t\tvar n = _ObjectDetailBox.GetModelObject(_ObjectDetailBox.FocusedItem.Index) as DocumentObject;\r\n\t\t\tvar m = _ExportButton.DropDownItems;\r\n\t\t\tm[\"_ExportHexText\"].Enabled\r\n\t\t\t\t= m[\"_ExportBinary\"].Enabled\r\n\t\t\t\t= m[\"_ExportUncompressedHexText\"].Enabled\r\n\t\t\t\t= m[\"_ExportUncompressedBinary\"].Enabled\r\n\t\t\t\t= n.ExtensiveObject is PRStream;\r\n\t\t\tm[\"_ExportXml\"].Enabled\r\n\t\t\t\t= __XmlExportableTypes.Contains(n.Type);\r\n\t\t\tm[\"_ExportToUnicode\"].Visible = n.ExtensiveObject is PRStream && n.Name == \"ToUnicode\";\r\n\t\t}\r\n\r\n\t\tvoid _AddObjectMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tAddChildNode(\r\n\t\t\t\t_ObjectDetailBox.GetModelObject(_ObjectDetailBox.FocusedItem.Index) as DocumentObject,\r\n\t\t\t\tValueHelper.MapValue(e.ClickedItem, _addPdfObjectMenuItems, _pdfTypeForAddObjectMenuItems)\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentInspectorControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_ExportBinary.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ExportHexText.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ExportXml.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ExportUncompressedBinary.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ExportUncompressedHexText.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ExportToUnicode.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ObjectTypeIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <data name=\"_ObjectTypeIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n    <value>\r\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\r\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq\r\n        QQAAAk1TRnQBSQFMAgEBNgEAAVwBAAFcAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r\n        AwABQAMAAeADAAEBAQABCAYAATgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\r\n        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\r\n        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\r\n        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm\r\n        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM\r\n        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA\r\n        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz\r\n        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ\r\n        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM\r\n        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA\r\n        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA\r\n        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ\r\n        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/\r\n        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA\r\n        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm\r\n        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ\r\n        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz\r\n        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA\r\n        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM\r\n        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM\r\n        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM\r\n        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA\r\n        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM\r\n        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ\r\n        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz\r\n        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm\r\n        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw\r\n        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/xUAAfQB8QEHAu8BBwHx\r\n        AfQ2AAH/AfEB7wEHBPIBBwHvAfEB/zMAAf8B8QHvAfABkwFuAkUBbgGTAfAB7wHxAf8yAAHyAQcB8AFF\r\n        AekEIAHpAUUBvAEHAfIxAAH/AQcBvAFoAUYCIALzAiAB6QFoAbwBBwH/MAAB8gEHAZMCRgIgAvMDIAHp\r\n        AZMB7wHyIAABBwHsAesB7AEHAwABBwFPAUkBTwEHAwAB8QG8AW4BRgMgAukDIAHpAW4BBwHxIAAB7QHv\r\n        AfIB7wHtAwABcQNVAXEBAAHvAU8B8AG8AUUBRgPpAfAB8QTpAUUBBwHwIAAB7QP0Ae0D9wFPA3cBTwEA\r\n        Ak8B8AG8AUUCRgLpAbwB8ATpAUUBBwHwIAAB7wG8Af8BvAHvAwACdwHkAncBAAGYAU8C8QFvBEYB8wHx\r\n        A+kBRgFvAbwB8SAAAbwD7wG8AwABBwF3AVUBdwEHAwAB8wG8AZMBRgFvAkYC/wRGAZMBBwHzMAAB/wHw\r\n        AfIDbwFGAv8BRgFvAUYBbwHxAfAB/zEAAfMBvAHxAW8BRgTjAUYBbwHxAbwB8zIAAf8B8gG8AfIBkwFv\r\n        AkYBbwGTAfIBvAHyAf8zAAH/AfMC8AHzAvIB8wLwAfMB/zYAAf8B8wHyAvEB8gHzAf9JAAHPARIBHD0A\r\n        AXMBdAFuAe8ZAAEHAbUItAG1AQcXAAGZAXMBGgHsAe8XAAEHAbUBvAjwAbwBtQEHAgABFAG8Aw4BvAEO\r\n        AbwDDgG8ARQIAAEHAe0B9AHrAZMWAAG1DLwBtRgAAQcB7AFGAUUBkxUAAbUB8Qq8AfABtRMAAZICbQH3\r\n        AgAB7wFFAUYBRQHvFAABtQHyAfAJvAHwAbUCAANDAeoBAANDAQAB6gNDAwABkgFtAQcB8AHrAe8CAAH3\r\n        AUUBRgFFAQcFAAEHAU8BSQFPAQcDAAEHAewB6wHsAgcBtQG7AfEB8Ai8AfABtREAAfcBbQG8AfcB7wHy\r\n        AewB7wEAAYYB9wNFAbwBAAFPAe8BAAFxA1UBcQMAAe0B7wHyAe8B7QG1AfQBtQPxAfAGvAHwAbURAAHs\r\n        AfEBBwHvAfcB7wHyAe0BBwGGAYsBBwFuAUUBbgHwAk8BAAFPA3cBTwP3Ae0D9AHtAQcBtQG7BPIB8QLw\r\n        A7wB8AG1AgABFQG8ARUBvAEVAbwBFQG8ARUBvAEVAbwBFQIAAZIB8gHwAQcBkgESAZIB8wHtAa0BzwEA\r\n        AfABbwFFAW8BTwGYAQACdwHkAncDAAHvAbwB/wG8Ae8BAAG1AfMK8gHzAbURAAEHAZIB8wHwAe0BvAHs\r\n        AfEBrgHPAbsDAAGTAUUDAAEHAXcBVQF3AQcDAAG8A+8BvAEAAbsB8QryAfEBuxIAAQcBkgHzAQcB6wEH\r\n        AW0BtAG1FwABvAG7AfEB8wEJAbUBCQTzAfEBuwG8AgABbQsUAW0EAAEHAe0B8wLrAfcaAAG8ArsBtQH0\r\n        AbUFuwG8FQABkgH3AW0B7x4AAQcBtQEHGwAB9wG8Aew9AAEHAZIB7z8AAc8BEgEcPQABcwF0AW4B7xoA\r\n        AQkBzwYAAa0BCQQAAQcBzgEHEQABmQFzARoB7AHvGQAB1QG0Aq0ChgKnAq0EAAOtAQAB6gFDAxEBEAEP\r\n        ARQJAAEHAe0B9AHrAZMGAAEUCw4BFAUAAQkBzwYAAa0BCQUAAa0UAAEHAewBRgFFAZMFAA0QFAABpxUA\r\n        Ae8BRQFGAUUB7wQADREGAAEUAQ8BFAEAAfcCDwEUBgABpwIAAxUEQwMRBAABkwFzAksBbgEcAZMBRQFG\r\n        AUUBBxcAARQB7wIAAW0BFAcAAYYQAAFLAZkCmgF0AUsBbgGTA0UBvBYAAewEQwHsBwABhhAAAXMBdASa\r\n        AVIBcwEHAW4BRQFuAfABAA0VBwAB7wESAe8B7AFDAe8HAAGtAgACFAYVBgABBwFLAZoDmQGaAnQBBwFv\r\n        AUUBbwEADRUIAAETAQcBbQETCAABrQ0AARwDSwFMAZoBSwEAAUsCmgJ0AQABkwFFFgAC7AEVAewIAAGt\r\n        DQABSwGZBJoBdAFLAXQBmgHtAYsB6xkAAQcB6gEUAQcHAAHPAbQBzwEAAW0GFAIVAW0BAAJ0AZkDeQGZ\r\n        AZoBmQF5AbQB3AGtBAABbQsUAW0JAAISCAABCQHVAQkMAAG8AnQBmQFvAekBTAFSAVEBUgHvAbQB9zQA\r\n        AbwBkwF0AUYBFgFGAVIBegFRAnQBvDUAAfABvAF0ARcBbwFSAVgBdAGZAbxVAAEHAbUKtAG1AQcNAAG1\r\n        AbQBtQ0AAbUBtAG1CAABkgPsAZIFAAG1AQkK8AEJAbUNAAG0AfQBtA0AAbQB9AG0CAABkgPzAZIFAAG1\r\n        AfADvATwA7wB8AG1DQABuwG0AbsMAAG8ArQBuwgAAfcB9AHzAfQB9wUAAbUB8AO8AbsCtQG7A7wB8AG1\r\n        DQABvAG1DAABvAG1AbwDAAEHBu8B7QH/AfQB/wHtAu8BBwIAAbUB8AK8AbUBBwK8AQcBtQK8AfABtQ0A\r\n        AQcBuwsAAbwBtQG8BAAB7wb/AfIBBwH/AQcB8gL/Ae8CAAG1AfEB8AG7AQcEAAEHAbsC8AG1DAABvAG1\r\n        AQcKAAG8AbUBvAUAAe8H9AHyAQcB8gP0Ae8CAAG1AvIBtQG8BAABvAG1AvABtQcAAQcBtQEHAfABvAG7\r\n        AQcKAAG8AbUBvAYAAfcC9AH3A/QB9wP0AfcC9AH3AgABtQLyAbUBvAQAAbwBtQLwAbUDAAHwAQcBuwK1\r\n        AfQCtQG7AQcB8AkAAbwBtQG8BwABkgLzAQcD8wEHA/MBBwLzAZICAAG1AvIBuwEHBAABBwG7AbwB8AG1\r\n        AwABBwG7AbwB8AEHAbUBBwwAAbwBtQG8CAAB7QPyAQcB7AEHB/IB7QIAAbUB8wHyAfABtQEHArwBBwG1\r\n        AfAB8gHzAbUCAAEHAbsBvBAAAbwBtQG8CQAB7ALxAQcB7QH0Ae0BBwbxAewCAAG7AfMC8gHwAbsCtQG7\r\n        AfAC8gHzAbsCAAG7AQcQAAG8AbUBvAoAAewC6wFtAfQB8wH0AW0G6wHsAgABuwHzBPIC8wTyAfMBuwIA\r\n        AbsBvA8AAbwBuwG8DgAB9wH/AfQB/wH3CQABuwHwCvMB8AG7AQABBwG1AQcNAAEHArUBvA8AAe8D/wHv\r\n        CQABvAy7AbwBAAG1AfQBtQ0AAbUB9AG1EAABBwPvAQcYAAEHAbUBBw0AAQcBtQEHJAAB7wGSGQAB7Qrr\r\n        Ae0XAAHwAe0B6gHrAfcB7wG8FgAB7Ar/AewCAAG1AbQBtQoAAbUBtAG1BAABBwHrBeoBbQHsAbwUAAHs\r\n        Cv8B7AIAAbQB9Ay0AfQBtAMAAfcGiwPqAW0BvAQAAfABCAHgAdkB0wFCAfwByQG1AfAFAAHtCP8B9AH/\r\n        Ae0CAAG7AbQBuwrwAbsBtAG7AwABvAH3AZEC0wGzAZEB6wPqAewEAAHwAQgBswHHAcUBgAGlAYMBtQHw\r\n        BQAB7QL/AfAB6gLyAeoBvAH0Af8B7QMAAbUB8Aq8AfABtQYAAbwC0wGzAe8BAAHvAW0C6gEHAwAB8AEI\r\n        AcABuAH8AcUBpwHOAbUB8AUAAe0B/wHzAW0BBwL/AQcBbQHyAf8B7QMAAbUB8Aq8AfABtQYAAbwC0wHb\r\n        AwAB7ALqAfcEAAHwAbwBmwFCAfwBrQEJAfAGAAGSAf8B7wH3Av8C9AH3Ae8B/wGSAwABtQHyAfAJvAHw\r\n        AbUGAAG8AtMB2wMAAe0C6gGSBQABvAF7AdMBQgGsAbsB8AYAAfcB/wHzAewBvAL0AQcB7AHyAfQB9wMA\r\n        AbUB8gHxAfAIvAHwAbUGAAG8AtMB2wMAAewC6gH3BQABvAE8Af4B0wGyAbsB8AYAAfcC/wHxAewB8wHy\r\n        AewBvAHzAfQB9wMAAbUB8gPxAfAGvAHwAbUGAAG8AtMB2wIAAfABbQLqAQcCAAPwAbwB+gG+Af4BgQG7\r\n        A/AEAAH3Av8F9ALzAfQB9wMAAbUF8gHxAvADvAHwAbUGAAG8AtMB2wIAAQcB6wHqAesDAAS8AR0BewG+\r\n        AZUBuwS8AwAB9wH/BfQC8wHxAfQB9wMAAbUB8wryAfMBtQMAAdQBvAEAAbwC0wHbAgAB1AEJAQcB7wMA\r\n        AVMBUgFdAbwBOQH6AXsBdgG7AeABswG6AbwDAAH3Af8E9ALzAvEB9AH3AwABuwHzCvIB8wG7AwAB1AO7\r\n        AtMB1AK7AdQBuwUAAU0BJQFYAX4BOgE5AfoBVAF8AZwBsgG5AbwDAAH3Af8D9ALzAfED9wHsAgABBwG1\r\n        AQkK8wEJAbUBBwIACtQBCQUAAU0BIAElATEBNwE6AR0BMwF2AZUB2QG5AbwDAAH3Af8C9ALzAvEB7wH/\r\n        AfcBBwIAAbUB9AG1CrsBtQH0AbUSAAFHAU0BUwF6AfsBOwE6ATkCWgF8AZwBvAMAAe8C/wX0AQcB7wEH\r\n        AwABBwG1AQcKAAEHAbUBByIACe8BBxsAAe8BkgsAAfcCbQH3GwAB8AoAAbwGAAHwAe0B6gHrAfcB7wG8\r\n        BwAB9wFtAbwB8AFtAfcYAAHwAbsBkgHvAQcFAAG8Ae8C9wHwBAABBwHrBeoBbQHsAbwEAAH3AesC7wEH\r\n        AfAB7AHvBAABrgIAARELAAFDAwABCQHTAdQBtAHtAe8BBwEAAfAB7wGzAtMB7wHwAwAB9wFtCOoBbQG8\r\n        AgAB7wHrAQcC9wHvAQcB8AHsAe8DAAGmAbQBAAERCwABQwQAAbsB1ALTAbQBkgHvAbQC0wGzAbsBvAQA\r\n        AbwB9wHsAW0C6gHsAesD6gHsAQAB7wHsAbwBBwHvAvcB7wEHAfEB7QEHAgAChgUAAdQC0wHUAdsKAAEJ\r\n        AdQB0wKzAdMBswG7AfAJAAG8Ae8B7AHvAQAB7wFtAuoBBwHsAfEBvAIHAe8C9wHvAQcB8gHtAQcBAAKn\r\n        BgAB1AHTAdsNAAG7AtMBswGSAfAEAALUAbwBAAEJAtMC2wLTAdQB0wGyAeoB9wHtAfIB8QG8AgcB7wL3\r\n        Ae8BBwHzAe0BBwKtBgAB1AHTAdsMAAG8AdQB0wHUAdMBkQHvBAABvAHbAgABCQHTAdQCAAHTAdQBAAG0\r\n        AdMBiwGSAQcB7QHyAfEBvAIHAZIBEgHtAe8BBwHzAe0BrQHPBgAB1AHTAdsLAAHwAbMB0wH3AbwC1AHt\r\n        AbwEAAHUAtsB1AHTAbsCAAHTAdQBAAG0AdMBswH3AQABBwHtAfIB8QG8AQcB7QG8AewB9wHvAfIBrgHP\r\n        AQkGAAHUAdMB2wsAAbsB0wG0AbwBAAG7AdMBkQHvBAABCQG6AbwC0wG8AgAB0wHUAfABiwHTAYsBBwIA\r\n        AQcB7QHyAfEBvAHvAesC9wHwAesBtAG1BwAB1AHTAdsJAALwAdQB0wH3A/AB1AGzAe0C8AMAAdQBugHT\r\n        AdsDAALTAbQC0wHrBAABBwHtAfMB8QG8AesBBwHwAW0B9wYAAbsCAAHUAdMB2wEAAbwBuwUAAfABBwHt\r\n        AdMBswGRAZIB9wGSAbMB0wHsAe0B9wG8AgAB2wLTAQkDAAHTAdQBCQG7AQcB7wUAAQcB7QHzAfEB6wHz\r\n        AW0B9wcAAdQCAAHUAdMB2wEAAbwB1AUAAbwM0wG1AbwCAAG8AdMB1AQAAdMB1AoAAZIB7QHzAesB7AHv\r\n        CAAI1AHbBQAB8AS8AbsB0wGzAe8FvAQAAQkBvAMAAdsB1AHbCgABkgEHAe0BbQHvHAABuwHTAbUB8BsA\r\n        AfcCAAHrHgABCQHwHAABBwGSAe0B7ycAAZQJsQKPA2oBsTAACrECjwRqEQABvAIJAbwB8BoAAZQJsQKP\r\n        A2oBsQMAAQcB7AHrAm0C7AH3AQcEAAG8AdwB2wHaAdsBCQG8LAAB7AHvAQcB8AG8AQcB7wHtAewB7QEH\r\n        AgABvAHcAtMB2gHbAQkBvBoAAc8BEgEcDgAB7AK8AQcFvAHvAewB7wEAAbwB3AHaAtMB1AHbAQkBvBkA\r\n        AXMBdAFuAe8NAALtArwDBwG8AQcCvAHsAQcB8AEJAdsB2gLTAdQB2wEJAbwRAAK8BQABmQFzARoB7AHv\r\n        DAABvAHsAe0B8AHsAQAB7AG8AQcB9wHqAe0BkgIAAQkB2wHaA9MB2wHcAbwFAALUAbwBAAEJAtMC2wLT\r\n        AdQB0wHUAbwEAAEHAe0B9AHrAZMIAAHvAuwBkgHvAesBvAGSAesBkgIHAuwBbQHsAwABvAHcAdsD0wHb\r\n        AdwBvAQAAbwB2wIAAQkB0wHUAgAB0wHUAQABugHTAboFAAEHAewBRgFFAZMHAAHsAe8BBwH3AewBkgG8\r\n        AQcBvAMHAewBBwHvAesEAAG8AdwB2wPTAdsB3AG8BAAB1ALbAdQB0wG7AgAB0wHUAQABuwHTAdQGAAHv\r\n        AUUBRgFFAe8GAAGSAbwCBwG8BwcB7wGSAu0FAAG8AdwB2wPTAdoB2wEJAwABCQG6AbwC0wG8AgAB0wHU\r\n        AQABuwHTAdsHAAGTAUUBRgFFAQcFAAH3Ae8DBwHtARQB7AIHAe8B7AH3AgcB9wYAAbwBCQHbAdQC0wHa\r\n        AdsBCQHwAgAB1AG6AdMB2wMAAtMB2wHUAdMBvAgAAZMDRQG8BAABBwGSAe8BvAEHAeoBbQETAe0B7wGS\r\n        AfcB7AHvAfcB7wcAAbwBCQHbAdQC0wHaAdwBvAIAAdsC0wEJAwAB0wHUAQkBuwG8CgABBwFuAUUBbgHw\r\n        BAABvAL3AQcB6wL3AeoC7wLxAe0BkgG8CAABvAEJAdsB2gLTAdwBvAIAAbwB0wHUBAAB0wHUDgAB8AFv\r\n        AUUBbwUAAfABBwH3Ae0C7AHvAgcC7wH3AQcKAAG8AQkB2wHaAdsB3AG8AwABCQG8AwAB2wHUAdsQAAGT\r\n        AUUBkwYAAfABBwHvAfcCkgH3Ae8BBwG8DAAB8AG8AgkBvB0AAZMBRUkAArwOAAK8FwAB7wn3A+8C9wYA\r\n        AfABtQHNAbwMAAHwAbsB0wG8FwABBwHxAwgC8QLwAfEBvAHdAbwB8wHvBQABuwHOAs0C1AG0CQABuwHU\r\n        AtMC2gG6CAAB7wFzBEsBcwEcAQcEAAG8AQgBVQGXAVYBuwHaAboB2wG7AacB5gGnAbwBBwUAAbUGzQHU\r\n        AfAHAAG7BtMB2gHwBgABSwF0A5oBmQJ0AUsBdAEHAgABvAEIApcB5AEIA9sBCQPmAfEBBwYAAbwB1AHN\r\n        AbsBtQLNAdUIAAG8AdoB0wK7AtMB2wYAAUsImgF0AVIBkwEAAbwBCAKXAeQBuwPbAQkD5gHdAQcCAAH3\r\n        BewBrgHvAQABCQLNAbsFAAG6BNsCAAG7AtMBuwUAAnQCmgOZBJoBdAGZAbwB8QMIAfED8AHxAbYB1wG2\r\n        AfMBBwIAAZIBEwVzAeoCAAHVAc0B1AUAAbsB2gHTAdoBCQMAAdsB0wHaBQABvAFzAXQBmgFLAQABSwKa\r\n        ARwBiwFzAXQBvAEbAXkCfgEbAvQB/wHwAaoB0QHLAfIBBwIAAbwBEwXlARIBBwEAAbwCzQG8BQAB2gHT\r\n        AdsEAAG8AtMBvAEAAe8CSwEcAe8BSwGaAXQBSwF0AZoBmQK0AYsBbgG8ARsDfgEbAvQB/wHxA9EB3gEH\r\n        AwAB6wFzBOUBcwHsAgAB1AHNAbsFAAHaAdMB2wUAAdoB0wG7AQACdAGaAXQBUgF0BJoCmQG0AtwBswG8\r\n        ARsDfgEbA/8B8gPRAfMBvAMAAe8B6gTlAXkBEgG8BM0BtAQAAdoB0wHbAwABvATTAboBdAGaAZkDmgaZ\r\n        Ae8CtAFzAbwB8wMaARsDGgHyAbYB8AG2AfQBBwQAARIBeQTlAeoB7wG1As0BzgUAAdoB0wHbBAABuwLT\r\n        AdoBAAJ0AZoCeQFvAekBbwJ5AXQBMAF0AnkBdAHwARsBeQJ6AZoBFwHjARcBtwGwAdIBqwHeAbwEAAHs\r\n        AXME5QFzAesBAAHUAc0BCQUAAdoB0wHbBQAB2gHTAQkBAAG8AnQBmgF5A0YBbwF0AlIBUQJ0AZkB8AEb\r\n        A3oBGgHjAhYBvQPSAd4BvAQAAQcBEgXlARMBvAEJAdUDAAHaAgAB2gHTAdsBAAG8AdoCAAEJAdsDAAG8\r\n        AnQBeQFGAhYBRgF0AVgCegFRAXQBvAHxARsDegEaA+MBvQPSAd4BvAUAARIFcwETAZIFAAHaAtsB1AHT\r\n        AdoC2wHaCAAB8AGZAXQBbwIXAXQBmgF5AlgBdAG8AQAB8AH/AxsB9gG9AhsB9AHeAfMB3gH/AbwFAAHv\r\n        BuwB9wUACLsBCQoAAfABBwGTBXQBmQG8AgABvAHwAfEB8AHxAfAB8QPwAfEB8AHxAfABvEMAAe0K6wHt\r\n        BAAB7QrrAe0EAAHrAQ4JiwGuBgABBwOLAbUB8QHwBwAB7Ar/AewEAAHsCv8B7AQAAQ8BbQm0AYsGAAH3\r\n        BGUBBwHwBwAB7AX/AVACTwFyAf8B7AQAAewK/wHsBAABEQFtCbQBiwYAAbwCBwGLAWUBtQHwBwAB7QH/\r\n        AW8CRQFGAVACVwFQAf8B7QQAAe0I/wH0Af8B7QQAAREBbQO0AfABvAS0AYsDAAHwBfEBrgFlAbUF8QHw\r\n        AgAB7QH/BEYBUAJXAVAB/wHtBAAB7Qf/AvQB/wHtBAABQwFtA7QBGQHxBLQBiwMAAZEFiwFmAWUFiwGR\r\n        AfECAAHtAf8BRgLjARcBVgJ9AVYB/wHtBAAB7Qb/A/QB/wHtBAABQwFtCbQBiwMAAZEFiwJlBYsBkQHw\r\n        AgABkgH/AUYBFwGNAa4BkAFxAVYBmAH/AZIEAAGSBf8E9AH/AZIEAAFDAW0DtALxBLQBiwcAAvABkgFl\r\n        AYsB7wHxAfAFAAH3Af8BkwFGAYsCswGLA/QB9wQAAfcE/wb0AfcEAAEVAesDtAG1ARkBCQO0AYsDAAPw\r\n        AbUB9wK1AZECZQGRAfED8AIAAfcD/wSzAfQB8wH0AfcEAAH3A/8F9AHzAfQB9wQAARUB6wS0AbsBGQG7\r\n        ArQBrQMAAQcB9wEHAYsGZQGLAbwB7wG8AfACAAH3Av8B9AGzAtsBswLzAfQB9wQAAfcC/wX0AvMB9AH3\r\n        BAABFQHsArQCtQG7ARkBuwK0AbMDAAH3AWUBkQHvBvcBtQGRAWUBtQHwAgAB9wH/AvQBuwKzAboB8wHx\r\n        AfQB9wQAAfcB/wX0AvMB8QH0AfcEAAEUAewCtAQZAbUCtAGzAwAB9wFlAYsIkQGLAWUBtQHwAgAB9wH/\r\n        BPQC8wLxAfQB9wQAAfcB/wT0AvMC8QH0AfcEAAEUAewBuge0AboBtAMAAfcMZQH3AfACAAH3Af8D9ALz\r\n        AfED9wHsBAAB9wH/A/QC8wHxA/cB7AQAARQB7AHcB7oB3AG0AwABvATvAfcCZQGSBO8BvAHwAgAB9wH/\r\n        AvQC8wLxAe8B/wH3AQcEAAH3Af8C9ALzAvEB7wH/AfcBBwQAARQBEgq0CAABvAGSAZEB8AgAAe8C/wX0\r\n        AQcB7wEHBQAB7wL/BfQBBwHvAQcFAAFtAe8CBwK8AfAC8wH0Af8B9xQACe8BBwYACe8BBwYAAZIBbQq0\r\n        BAAB7QrrAe0EAAHtCusB7QQAAZkIcwHxFgAB7Ar/AewEAAHsCv8B7AQAAXQEmgOZAUsBdAHxBwABBwGu\r\n        BIYBrgEHBgAB7Ar/AewEAAHsAf8FKgExAioB/wHsBAABdAOaAZkBeQN0AZoBdAHxBQABtQGGAacBrQLO\r\n        Aa0BpwGGAbUFAAHtCP8B9AH/Ae0EAAHtAf8FMQE3AjEB/wHtBAABkwSaAZkBeQV0BAABtQGGAa0CzgKt\r\n        As4BrQGGAbUEAAHtAf8B9wHsAbwD/wL0Af8B7QQAAe0B/wEqAzABMQFZAVgBMQH/Ae0EAAGTBZoBmQF5\r\n        AnQBmQGTAwABBwGLBK0C8wStAYsBBwMAAe0B/wHtAf8B9wHyAf8D9AH/Ae0EAAHtAf8BDwFDAUQBSwF5\r\n        AaABeQFYAf8B7QQAAZkImgGZAZoBmQMAAbQFrQHyAfMFrQG0AQAB7QLsAu0B8gH/AbwB8wP0Af8BkgQA\r\n        AZIB/wEVAUQCWAF6AuUBWQH/AZIEAAKZCXQBmQMAAc8FrQHwAfIFrQHPAQAB7Aj/BPQB9wQAAfcB/wFE\r\n        AVECWAFZAeUBWQFYAfQB9wQAAZkImgGZAZoBmQMAAa0BzwOtAacBvAHwAacFrQEAAfcC7QL3AfMB/wG8\r\n        AfMC9AHzAfQB9wQAAfcB/wFSB1gB9AH3BAABmQqaAZkDAAGtAc8DrQGnArwEpwKtAwAB9wH/Ae8B/wEH\r\n        AfIC9ALzAfQB9wQAAfcB/whYAfQB9wQAAZkKmgGZAwACzwStAoYBpwKGAacBrQHPAwAB9wH/AbwB7wHw\r\n        AvQC8wHxAfQB9wQAAfcB/wgxAfQB9wQAAZkKmgGZAwABtQLPA60C/wOtAc8BrQG1AwAB9wH/BPQC8wLx\r\n        AfQB9wQAAfcB/wT0AvMC8QH0AfcEAAGZA5oBSwGaAUsEmgGZAwABBwGtAdUCzwGtAv8BrQLPAbQBrQEH\r\n        AwAB9wH/A/QC8wHxA/cB7AQAAfcB/wP0AvMB8QP3AewEAAGZA5oBdAFLAXQBSwOaAZkEAAG1Aa0C1QG0\r\n        As8BtALVAa0BtQQAAfcB/wL0AvMC8QHvAf8B9wEHBAAB9wH/AvQC8wLxAe8B/wH3AQcEAAGZA5oDdAFS\r\n        A5oBmQUAAbUBrQHPBNUBzwGtAbUFAAHvAv8F9AEHAe8BBwUAAe8C/wX0AQcB7wEHBQABmQOaBHQDmgGZ\r\n        BgABvAG1Ac8CrQHPAbUBvAYACe8BBwYACe8BBwYAARoDmQRuA5kBGhoAAUsB7xgAAe0K6wHtEwAB7AXr\r\n        AUsBwwEDAW0D6wHsAQAC8AG8AgcBkgFtAQ4BbQGSAgcBvALwAwAB7Ar/AewTAAHsAfEBvAEHAfECBwFS\r\n        AXoBUQEcAQcB8AHsAQABrgSLAW0B9wHtAfcBbQSLAa4DAAHtCv8B7RMAAe0B/wLxAf8C8QGZAVIBegFR\r\n        AZkB9AHtAQABiwLvAQcBvAHwAfMB7QHzAfABvAEHAu8BiwMAAe0B/wFGARoBBwFGA/8B9AH/Ae0TAAHt\r\n        Af8BvAEHAf8BBwG8AfABmQFYAXoBUQEaAe0BAAGLBP8B9AHzAfcC9AT/AYsDAAHtAf8ERgL/AvQB/wHt\r\n        CAABHAFLARwIAAGSAf8C8QH/A/EB8AEaAVIBegLsAQABiwH/AUYCBwFGAfMB9wL0BP8BiwMAAe0B/wFG\r\n        AuMBRgH/A/QB/wHtAwABHAFLARwBAAEcAUsBmQFLARwHAAGSAf8BBwG8Af8DBwHvAfQBHAGSAfQB6gGT\r\n        AYsB/wRGAfMB9wL0BP8BiwMAAfcB/wFGAuMBRgT0Af8B9wMAAUsBmgFLAXMBSwGaAUsBmgJLAXMBBwQA\r\n        AfcB/wLxAf8F9AHwAQcBHAEWAUYBiwH/AUYC4wFGAfMB7wL0BP8BiwMAAfcB/wFGAuMBRgP0AfMB9AH3\r\n        AwABkwFSAZoBSwGaAUsBmgF0AZoCdAFLARwDAAH3Af8BBwG8AfQB7AHtAW0BEgH0Ae8CBwFGAZMBiwH/\r\n        AUYC4wFGAfMB7wL0BP8BiwMAAfcB/wEXAuMBRgL0AvMB9AH3BAABmQF0AZoBdAGaAXQBmgGZAXQBeQF0\r\n        AUwDAAH3Af8C8QH0AeoB7AHtAW0B8wK8AfMB9wEAAYsB/wEXAuMBRgHzAe8C9AT/AYsDAAH3Af8BFwLj\r\n        ARcB9ALzAfEB9AH3BAABkwJ0AZoBdAKaAnQBmQGaAXQDAAHvAf8B7QH3AfABEgHqAewB7QHzAewB9wG8\r\n        Ae8BAAGtAf8BFwLjARcB8wEHAvQE/wGtAwAB9wH/ARcCFgEXAvMC8QH0AfcEAAF0AZoCdAKaAZkDmgF0\r\n        AZkDAAHvAf8F9ALzAfIC8QHyAe8BAAGzAf8BFwIWARcB8wEHAvQE/wGzAwAB9wH/ARcCFgEXAfMB8QP3\r\n        AewEAAGZCXQBmQQAAe8B/wIHAfQDBwHvAfED9wHsAQABtAH/ARcCFgEXAfMBvAL0BP8BtAMAAfcB/wEX\r\n        AhYBFwLxAe8B/wH3AQcTAAHvBPQC8wHyAvEB7wH/Ae8BBwEAAbQB/wEXAhYBFwHzAe8B8wH0BP8BtAMA\r\n        Ae8B/wEXAhYBFwL0AQcB7wEHFAAB7wT0A/MC8gEHAe8BBwIAAbQB/wEXAhYBRgHvAQcB7wG8AfIB9AL/\r\n        AbQDAALvAUYCFgFGA+8BBxUAAQcK7wEHAwAC7wJGAW8BkwG8AQABvAEHBe8FAAFvAhcBbyoAAe0J6wGL\r\n        AZEUAAHtCusB7RQAAewJ/wGtAYsBtQEAAbwCBwGSAW0BDgFtAZICBwG8BfACAAHsCv8B7BQAAewF/wG0\r\n        BLMB2gGtAbUBrgKLAW0B9wHtAfcBbQeLAa4CAAHsCv8B7AUAAQcI7AEHBQAB7QX/AbMB3AXbAbMBiwEH\r\n        AbwB8AHxAe0B8wHwAbwBBwXvAYsCAAHtAf8CvAHwAbwD/wH0Af8B7QUAAZIBvAbzAbwBkgUAAe0F/wG6\r\n        BLQB3AGzAbsBiwL/AfQB8wH3AfMD9AX/AYsCAAHtAf8E8wL/AvQB/wHtBQAB7QHzAfIB8AHqAfAC8gHz\r\n        Ae0FAAHtBv8D9AG0AbMBuwEAAYsC/wH0AfMB9wHzBPQE/wGLAW8HHwFuA7wB/wHtBQABkgHzAfEDbQHx\r\n        AvMBkgUAAZIF/wT0AdwBtAIAAYsC/wH0AfMB9wHzAfQC7wG8AQcC8AH/AYsCHwMgBB8D8QH/AZIFAAH3\r\n        AfQC7AHwAuwB8QH0AfcFAAH3BP8G9AH3AgABiwL/AfQB8wHvAfME9AH/AvMB/wGLAiAB8wGTAkYBIAIf\r\n        ArwBBwH0AfcFAAH3AfQB7AHyAfQB8gLsAfQB9wUAAfcD/wX0AfMB9AH3AgABiwL/AfQB8wHvAfMB9AEq\r\n        ATABUgH/AfABvAH/AYsCIAFvAb0BlAG9AfQBbwEfA/EB9AH3BQAB7wH/BPQB8wHtAf8B7wUAAfcC/wX0\r\n        AvMB9AH3AgABiwL/AfQB8wHvAfMB9AFKAVgBWQH/AvMB/wGLAyAB4wFvAb0BRgIgAQcBvAEHAfQB9wUA\r\n        Ae8G/wHyAf8B7wUAAfcB/wX0AvMB8QH0AfcCAAGtAv8B9AHzAQcB8wH0ATcCWAH/AfABvAH/Aa0DIAFG\r\n        Ab0BbwMgAvMB8QH0AfcFAAHvAfIG/wHyAe8FAAH3Af8E9ALzAvEB9AH3AgABswL/AfQB8wEHAfME9AT/\r\n        AbMDIAH5Af8BRgMgAfMC8QH0AfcFAAG8CO8BvAUAAfcB/wP0AvMB8QP3AewCAAG0Av8B9AHzAbwB8wH0\r\n        Au8CvAP/AbQCIAL5BSAB8QP3AewUAAH3Af8C9ALzAvEB7wH/AfcBBwIAAbQC/wH0AfMB7wHzBPQE/wG0\r\n        AW8HIAFvAfEB7wH/AfcBBxQAAe8C/wX0AQcB7wEHAwABtAH0AfIBvAHvAQcB7wG8AfEB8wH0BP8BtAIA\r\n        Ae8C/wX0AQcB7wEHFQAJ7wEHBAAD7wEHAbwBAAG8AQcI7wIACe8BBwYAAe0K6wHtBAAB7QrrAe0EAAHt\r\n        CusB7QQAAe0K6wHtBAAB7Ar/AewEAAHsCv8B7AQAAewK/wHsBAAB7Ar/AewEAAHsCv8B7AQAAewK/wHs\r\n        BAAB7Ar/AewEAAHsAv8BvAHqAfIBBwHqAQcC/wHsBAAB7Qj/AfQB/wHtBAAB7QH/ArwB8AG8A/8B9AH/\r\n        Ae0EAAHtAv8B6gG8Af8BbQHxAf8B9AH/Ae0EAAHtAv8B8gHqAf8B6gH/AeoB9AH/Ae0EAAHtAv8BGgFp\r\n        Av8BaQEHAfQB/wHtBAAB7QH/BPMC/wL0Af8B7QQAAe0C/wHvAe0B/wHtAe8C9AH/Ae0EAAHtAv8B8gFt\r\n        Af8BbQH/AW0B9AH/Ae0EAAHtAv8BGgRpAfAB9AH/Ae0EAAHtAf8BvAHwAbwBBwS8Af8B7QQAAe0B/wHv\r\n        Bm0BvAH/Ae0EAAHtAv8BvAFtAf8BBwFtAQcB9AH/Ae0EAAGSA/8BjgIaAY4C9AH/AZIEAAGSAf8D8wHy\r\n        BPEB/wGSBAABkgP/AesC8AHrAvQB/wGSBAABkgX/BPQB/wGSBAAB9wP/ARoBkwFvARoD9AH3BAAB9wH/\r\n        AbwCBwG8AQcCvAEHAfQB9wQAAfcB/wHxBuwBBwH0AfcEAAH3Av8BvAHsAbwB8gHsAbwC9AH3BAAB9wP/\r\n        AfQCbwL0AfMB9AH3BAAB9wH/AfMB8gbxAfQB9wQAAfcD/wEHAe8B9AHvAQcB8wH0AfcEAAH3Av8B7AH0\r\n        AewB9AHsAfIB8wH0AfcEAAH3Av8C9ALzAfQC8wH0AfcEAAH3Af8BBwG8BAcBvAEHAfQB9wQAAfcC/wH0\r\n        AfIB7QH0AbwB7QHzAfQB9wQAAfcC/wHsAfQB7AH0AewB8AHzAfQB9wQAAfcB/wX0AvMB8QH0AfcEAAH3\r\n        Af8E8QH0AvMB8QH0AfcEAAH3Af8F9ALzAfEB9AH3BAAB9wH/AfQBvAHsAbwB8gHsAfAB8QH0AfcEAAH3\r\n        Af8E9ALzAvEB9AH3BAAB9wH/AgcBvAEHAvMC8QH0AfcEAAH3Af8E9ALzAvEB9AH3BAAB9wH/BPQC8wLx\r\n        AfQB9wQAAfcB/wP0AvMB8QP3AewEAAH3Af8D9ALzAfED9wHsBAAB9wH/A/QC8wHxA/cB7AQAAfcB/wP0\r\n        AvMB8QP3AewEAAH3Af8C9ALzAvEB7wH/AfcBBwQAAfcB/wL0AvMC8QHvAf8B9wEHBAAB9wH/AvQC8wLx\r\n        Ae8B/wH3AQcEAAH3Af8C9ALzAvEB7wH/AfcBBwQAAe8C/wX0AQcB7wEHBQAB7wL/BfQBBwHvAQcFAAHv\r\n        Av8F9AEHAe8BBwUAAe8C/wX0AQcB7wEHBQAJ7wEHBgAJ7wEHBgAJ7wEHBgAJ7wEHFgAB7QrrAe0EAAHt\r\n        CusB7QQAAe0K6wHtFAAB7Ar/AewEAAHsCv8B7AQAAewK/wHsCgABtAG1CAAB7Ar/AewEAAHsCv8B7AQA\r\n        AewK/wHsCgACiwG1BwAB7QH/AbwB8AG8AfABvAHwArwB/wHtBAAB7Qb/AQcB7QEHAf8B7QQAAe0B/wHV\r\n        Af8BvALwAfEB/wH0Af8B7QoAAYsB2gGLAbUGAAHtBv8B8gLxAf8B7QQAAe0E/wHvApIB9AGSAf8B7QQA\r\n        Ae0H/wL0Af8B7QoAAa0B2QHaAa0BtQUAAe0B/wIqAlIB/wEHArwB/wHtBAAB7QT/AfcB/wG8Ae8BvAH/\r\n        Ae0EAAHtAf8B6wH/AbwB8AG8AfABvAH0Af8B7QMAAbQHrQHaAdMB2gGtAbUEAAGSAf8BRAFSAXoBWQH0\r\n        A/EB/wGSBAABkgT/AfcE9AH/AZIEAAGSBf8E9AH/AZIDAAGzAdwD2wHaBbMB2gGzAbUDAAH3Af8CNwJY\r\n        AfQBBwG8AQcB9AH3BAAB9wH/AQcBkgEHAe8B9AEHAZIBBwH0AfcEAAH3Af8B1QH/AbwB8AG8AfAD9AH3\r\n        AwABswTbAdUBtAWzAdsBswMAAfcD/wP0A/EB9AH3BAAB9wH/Ae8B9ATvAfQB9wH0AfcEAAH3A/8F9AHz\r\n        AfQB9wMAAbMB3AnbAdwBswG7AwAB9wH/AQcBvAQHAbwBBwH0AfcEAAH3Af8B8QG8AfAC9AG8AQcBvAH0\r\n        AfcEAAH3Af8BbwH0BrwB9AH3AwABtAezAdwB2wHcAbMBuwQAAfcB/wTxAfQC8wHxAfQB9wQAAfcB/wX0\r\n        AvMB8QH0AfcEAAH3Af8F9ALzAfEB9AH3CgABtALcAbQBuwUAAfcB/wIHAbwBBwLzAvEB9AH3BAAB9wH/\r\n        BPQC8wLxAfQB9wQAAfcB/wFPAfQBBwG8AvMC8QH0AfcKAAG0AdwBtAG7BgAB9wH/A/QC8wHxA/cB7AQA\r\n        AfcB/wP0AvMB8QP3AewEAAH3Af8D9ALzAfED9wHsCgACtAG7BwAB9wH/AvQC8wLxAe8B/wH3AQcEAAH3\r\n        Af8C9ALzAvEB7wH/AfcBBwQAAfcB/wL0AvMC8QHvAf8B9wEHCgABugG7CAAB7wL/BfQBBwHvAQcFAAHv\r\n        Av8F9AEHAe8BBwUAAe8C/wX0AQcB7wEHFQAJ7wEHBgAJ7wEHBgAJ7wEHBAABQgFNAT4HAAE+AwABKAMA\r\n        AUADAAHgAwABAQEAAQEGAAEHFgAD/wEAAv8B8AEPBAAC/wHAAQMEAAL/AYABAQQAAv8BgAEBBAAC/wYA\r\n        Av8GAAIHBgABBwEEBwABBAYAAQcBBAYAAgcGAAL/BgAC/wGAAQEEAAL/AYABAQQAAv8BwAEDBAAC/wHw\r\n        AQ8EAAT/AfgH/wH4AX8C/wHAAQMC/wH4AT8C/wGAAQEBgAEDAfwBHwL/AYABAQL/Af4BDwL/AYABAQL/\r\n        AcMBBwL/AYABAQGEAUMBgQGDAuABAAEBAv8BAAGBASAB4AEAAQEC/wIAASACAAEBAYABAwEAARABIAHg\r\n        AYABAQL/AQABHALgAYABAQL/AYABPwL/AYABAQGAAQMBwAP/AcABAwL/AeED/wH4A/8B4wf/AeMH/wH4\r\n        B/8B+AF/Av8C5wGPAf8B+AE/Av8B4AEHAYgBBwH8AR8BgAEDAucB3wH/Af4BDwGAAQMC/wHfAv8BBwGA\r\n        AQMB8QEPAdgBAQHgAQMC/wH5AZ8B3wH/AeABAQL/AfgBHwHfAf8B4AEAAYABAwH4AR8B2AEHAeABAAGA\r\n        AQMB/AE/Ad8B/wEBAQQC/wH8AT8B3wH/AQABBwL/AfwBPwGIAQEBAAEHAYABAwH+AX8BjwH/AQABBwb/\r\n        AYABBwb/AcABDwr/AYABAQH/AfEB/wHxAf4BDwGAAQEB/wHxAf8B8QH+AQ8BgAEBAf8B8QH/AeEB/gEP\r\n        AYABAQH/AfMB/wHHAQABAQGAAQEB/wHzAf8BjwEAAQEBgwHBAf8B4wH/AR8BAAEBAYMBwQH8AQcB/gE/\r\n        AQABAQGDAcEBwAEHAfwBfwEAAQEBgwHBAcABfwH4Af8BAAEBAYABAQGPAf8B8QH/AQABAQGAAQEBnwH/\r\n        AeMB/wEAAQEBgAEBAZ8B/wHHAf8B4AH/AYABAQEfAf8BDwH/AeAB/wGAAQEBHwH/AR8B/wHgA/8BHwH/\r\n        AR8D/wH+AX8C/wHAAQMC/wH4AQ8C/wHAAQMBHwH4AfABAwL/AcABAwIAAeABAQHgAQcBwAEDAgAB4AEB\r\n        AeABBwHAAQMBgAEBAfgBIAHgAQcBwAEDAYABAQH4AXAB8AEPAcABAwGAAQEB+AFwAfgBDwHAAQMBgAEB\r\n        AfgBcAH4AQ8BwAEDAYABAQH4AWABwAEDAcABAwGAAQEB+AFhAcABAQHAAQMBgAEBAcgBYQHAAQEBwAED\r\n        AYABAQHAAQcBwAEBAcABAwIAAcABBwHAAQEBwAEDAgAC/wHAAQEBwAEHAR8B+AT/AcABDwL/Af4BfwHw\r\n        A/8B7wH9AfgBDwHgAX8C/wGDAeAB8AEDAcABPQGAAQMCgAHgAQEBgAEcAYABAwHAAQEB4AEBAQABDAH4\r\n        AT8B8AEHAfwBIAEAAQQB/AF/AfwBDwEQAwAB/AF/AfgBDwExAZACAAH8AX8B8AEHAYEBkAGAAQAB/AF/\r\n        AfABhwGBAYABwAEBAfwBfwHAAQEBwwGBAeABBwHsAU8BgAEAAcMBgQHwAQ8B7AFPAYABAAHHAZ8B+AEf\r\n        AeABDwGAAQEB5wEfAfgBPwL/AfwBPwL/AfsBfwL/Af4BfwL/AfgBfwT/AgAG/wIAAv8BgwP/AgAB4AEP\r\n        AQEF/wHgAQMBAAP/AccB/wHgAQEBAAF/Av8BwwH/AeACAAE/Af8B5wHBAf8B4AGAAcABHwEQAQEB4AH/\r\n        AgAB4AEPATEBkQHwAX8CAAHwAQcBgQGRAfgBPwIAAfgBAwGBAZEB/AEfAgAB/AEAAcMBgQH+AQ8CAAH+\r\n        AQABwwGDAf8BBwGAAQAB/wEAAccBnwH/AYcBwAEBAf8BgAHnAR8B/wHjAfABAwH/AcED/wHzCP8B/gF/\r\n        Af4BfwL/AQABAQH4AX8B+AF/Av8BAAEBAfABHwHwAR8B4AEPAQABAQHwAQcB8AEHAeABAwEAAQEB+AEH\r\n        AfgBBwHgAQEBAAEBAYABQwHgAcMB4AIAAQEBgAFjAeAB4wHgAYABAAEBAYABIQHxAeEDAAEBAcABMQLx\r\n        AwABAQHAAQAB8QHAAwABAQHgAQEB8QHhAwABAQHgAREC8QMAAQEB4AEDAbEBMwGAAgABAQHwAQ8BgAE/\r\n        AcABAQEAAQEB8AEPAYABPwHwAQMBAAEBCP8BwAEDAcABAwHAAQMB8AEfAcABAwHAAQMBwAEDAfABHwHA\r\n        AQMBwAEDAcABAwHwAR8BwAEDAcABAwHAAQMBgAEAAcABAwHAAQMBwAEDAYABAAHAAQMBwAEDAcABAwGA\r\n        AQABwAEDAcABAwHAAQMB+AEHAcABAwHAAQMBwAEDAYABAAHAAQMBwAEDAcABAwGAAQABwAEDAcABAwHA\r\n        AQMBgAEAAcABAwHAAQMBwAEDAYABAAHAAQMBwAEDAcABAwGAAQABwAEDAcABAwHAAQMBgAEAAcABAwHA\r\n        AQMBwAEDAfwBPwHAAQcBwAEHAcABAwL/AcABDwHAAQ8BwAEDAcABAwHAAQMBwAEPAv8BwAEDAcABAwHA\r\n        AQcB8AEPAcABAwHAAQMBwAEDAeABBwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBgAEBAcABAwHA\r\n        AQMBwAEDAYABAQEAAQMBwAEDAcABAwGAAQEBAAEDAcABAwHAAQMBgAEBAQABAwHAAQMBwAEDAYABAQHA\r\n        AQMBwAEDAcABAwGAAQEBwAEDAcABAwHAAQMBgAEBAcABAwHAAQMBwAEDAYABAQHAAQMBwAEDAcABAwHA\r\n        AQMBwAEDAcABAwHAAQMB4AEHAcABBwHAAQcBwAEDAfABDwHAAQ8BwAEPAcABAwL/Af4BPwL/AcABAwL/\r\n        AYABAQEAAQEBwAEDAv8BgAEBAQABAQHAAQMC/wGAAQEBAAEBAcABAwL/AYABAQEAAQEBwAEDAfwBfwGA\r\n        AQEBAAEBAcABAwGIAT8BgAIAAQEBwAEDAYABBwGAAgABAQHAAQMBgAEDAYACAAEBAcABAwHAAQMBgAEB\r\n        AQABAQHAAQMBwAEDAYABAQEAAQEBwAEDAcABAwGAAQEBAAEBAcABAwHAAQcBgAEBAQABAQHAAQMC/wGA\r\n        AQEBAAEBAcABBwL/AYABAwEAAQEBwAEPAv8BgAEHAgEB8AX/AcABAwL/AcABAwL/AcABAQIAAcABAwL/\r\n        AcADAAHAAQMB4AEHAcADAAHAAQMB4AEHAcADAAHAAQMB4AEHAcABAQMAAQMB4AEHAcABAwMAAQMB4AEH\r\n        AcABAwMAAQMB4AEHAcABAwMAAQMB4AEHAcABAwMAAQMB4AEHAcABAwMAAQMB4AEHAcABAwMAAQMB4AEH\r\n        AcABAwMAAQMC/wHAAQMDAAEDAv8BwAEHAgABwAEHAv8BwAEPAQQBAAHAAQ8BwAEDAcABAwHAAQMBwAED\r\n        AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED\r\n        AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED\r\n        AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED\r\n        AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQcBwAEHAcABBwHAAQcBwAEPAcABDwHAAQ8BwAEP\r\n        Av8BwAEDAcABAwHAAQMC/wHAAQMBwAEDAcABAwH/AT8BwAEDAcABAwHAAQMB/wEfAcABAwHAAQMBwAED\r\n        Af8BDwHAAQMBwAEDAcABAwH/AQcBwAEDAcABAwHAAQMBgAEDAcABAwHAAQMBwAEDAYABAQHAAQMBwAED\r\n        AcABAwGAAQEBwAEDAcABAwHAAQMBgAEBAcABAwHAAQMBwAEDAYABAwHAAQMBwAEDAcABAwH/AQcBwAED\r\n        AcABAwHAAQMB/wEPAcABAwHAAQMBwAEDAf8BHwHAAQMBwAEDAcABAwH/AT8BwAEHAcABBwHAAQcC/wHA\r\n        AQ8BwAEPAcABDws=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_RecentFileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>257, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_LoadDocumentWorker.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>393, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>158, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentOption/DocumentFontListForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class DocumentFontListForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n            this.label1 = new System.Windows.Forms.Label();\r\n            this._PageRangeBox = new System.Windows.Forms.TextBox();\r\n            this._FontListBox = new BrightIdeasSoftware.FastObjectListView();\r\n            this._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n            this._EmbeddedColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n            this._FirstPageColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n            this._ReferenceColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n            this._Worker = new System.ComponentModel.BackgroundWorker();\r\n            this._ProgressBar = new System.Windows.Forms.ProgressBar();\r\n            this._AddSelectedFontsButton = new System.Windows.Forms.Button();\r\n            this._SelectAllButton = new System.Windows.Forms.Button();\r\n            this._ListFontsButton = new System.Windows.Forms.Button();\r\n            this._SourceFileBox = new PDFPatcher.SourceFileControl();\r\n            this._AppConfigButton = new System.Windows.Forms.Button();\r\n            ((System.ComponentModel.ISupportInitialize)(this._FontListBox)).BeginInit();\r\n            this.SuspendLayout();\r\n            // \r\n            // label1\r\n            // \r\n            this.label1.AutoSize = true;\r\n            this.label1.Location = new System.Drawing.Point(23, 61);\r\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n            this.label1.Name = \"label1\";\r\n            this.label1.Size = new System.Drawing.Size(82, 15);\r\n            this.label1.TabIndex = 1;\r\n            this.label1.Text = \"页码范围：\";\r\n            // \r\n            // _PageRangeBox\r\n            // \r\n            this._PageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._PageRangeBox.Location = new System.Drawing.Point(146, 55);\r\n            this._PageRangeBox.Margin = new System.Windows.Forms.Padding(4);\r\n            this._PageRangeBox.Name = \"_PageRangeBox\";\r\n            this._PageRangeBox.Size = new System.Drawing.Size(470, 25);\r\n            this._PageRangeBox.TabIndex = 2;\r\n            // \r\n            // _FontListBox\r\n            // \r\n            this._FontListBox.AllColumns.Add(this._NameColumn);\r\n            this._FontListBox.AllColumns.Add(this._EmbeddedColumn);\r\n            this._FontListBox.AllColumns.Add(this._FirstPageColumn);\r\n            this._FontListBox.AllColumns.Add(this._ReferenceColumn);\r\n            this._FontListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._FontListBox.CheckBoxes = true;\r\n            this._FontListBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._EmbeddedColumn,\r\n            this._FirstPageColumn,\r\n            this._ReferenceColumn});\r\n            this._FontListBox.GridLines = true;\r\n            this._FontListBox.Location = new System.Drawing.Point(24, 128);\r\n            this._FontListBox.Margin = new System.Windows.Forms.Padding(4);\r\n            this._FontListBox.MultiSelect = false;\r\n            this._FontListBox.Name = \"_FontListBox\";\r\n            this._FontListBox.OwnerDraw = true;\r\n            this._FontListBox.ShowGroups = false;\r\n            this._FontListBox.ShowImagesOnSubItems = true;\r\n            this._FontListBox.Size = new System.Drawing.Size(699, 309);\r\n            this._FontListBox.TabIndex = 8;\r\n            this._FontListBox.UseCompatibleStateImageBehavior = false;\r\n            this._FontListBox.View = System.Windows.Forms.View.Details;\r\n            this._FontListBox.VirtualMode = true;\r\n            // \r\n            // _NameColumn\r\n            // \r\n            this._NameColumn.AspectName = \"\";\r\n            this._NameColumn.Text = \"字体名称\";\r\n            this._NameColumn.Width = 273;\r\n            // \r\n            // _EmbeddedColumn\r\n            // \r\n            this._EmbeddedColumn.AspectName = \"\";\r\n            this._EmbeddedColumn.CheckBoxes = true;\r\n            this._EmbeddedColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n            this._EmbeddedColumn.IsEditable = false;\r\n            this._EmbeddedColumn.Text = \"已嵌入\";\r\n            this._EmbeddedColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n            // \r\n            // _FirstPageColumn\r\n            // \r\n            this._FirstPageColumn.AspectName = \"\";\r\n            this._FirstPageColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n            this._FirstPageColumn.Text = \"首次出现页码\";\r\n            this._FirstPageColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n            this._FirstPageColumn.Width = 96;\r\n            // \r\n            // _ReferenceColumn\r\n            // \r\n            this._ReferenceColumn.AspectName = \"\";\r\n            this._ReferenceColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n            this._ReferenceColumn.Text = \"出现页数\";\r\n            this._ReferenceColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n            // \r\n            // _Worker\r\n            // \r\n            this._Worker.WorkerReportsProgress = true;\r\n            this._Worker.WorkerSupportsCancellation = true;\r\n            // \r\n            // _ProgressBar\r\n            // \r\n            this._ProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._ProgressBar.Location = new System.Drawing.Point(24, 446);\r\n            this._ProgressBar.Margin = new System.Windows.Forms.Padding(4);\r\n            this._ProgressBar.Name = \"_ProgressBar\";\r\n            this._ProgressBar.Size = new System.Drawing.Size(700, 29);\r\n            this._ProgressBar.TabIndex = 9;\r\n            // \r\n            // _AddSelectedFontsButton\r\n            // \r\n            this._AddSelectedFontsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._AddSelectedFontsButton.Location = new System.Drawing.Point(516, 91);\r\n            this._AddSelectedFontsButton.Margin = new System.Windows.Forms.Padding(4);\r\n            this._AddSelectedFontsButton.Name = \"_AddSelectedFontsButton\";\r\n            this._AddSelectedFontsButton.Size = new System.Drawing.Size(208, 29);\r\n            this._AddSelectedFontsButton.TabIndex = 7;\r\n            this._AddSelectedFontsButton.Text = \"添加选中项至替换列表\";\r\n            this._AddSelectedFontsButton.UseVisualStyleBackColor = true;\r\n            this._AddSelectedFontsButton.Click += new System.EventHandler(this._AddSelectedFontsButton_Click);\r\n            // \r\n            // _SelectAllButton\r\n            // \r\n            this._SelectAllButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._SelectAllButton.Location = new System.Drawing.Point(381, 91);\r\n            this._SelectAllButton.Margin = new System.Windows.Forms.Padding(4);\r\n            this._SelectAllButton.Name = \"_SelectAllButton\";\r\n            this._SelectAllButton.Size = new System.Drawing.Size(127, 29);\r\n            this._SelectAllButton.TabIndex = 6;\r\n            this._SelectAllButton.Text = \"全部选中(&Q)\";\r\n            this._SelectAllButton.UseVisualStyleBackColor = true;\r\n            this._SelectAllButton.Click += new System.EventHandler(this._SelectAllButton_Click);\r\n            // \r\n            // _ListFontsButton\r\n            // \r\n            this._ListFontsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._ListFontsButton.Location = new System.Drawing.Point(624, 55);\r\n            this._ListFontsButton.Margin = new System.Windows.Forms.Padding(4);\r\n            this._ListFontsButton.Name = \"_ListFontsButton\";\r\n            this._ListFontsButton.Size = new System.Drawing.Size(100, 29);\r\n            this._ListFontsButton.TabIndex = 3;\r\n            this._ListFontsButton.Text = \"列出字体\";\r\n            this._ListFontsButton.UseVisualStyleBackColor = true;\r\n            this._ListFontsButton.Click += new System.EventHandler(this._ListFontsButton_Click);\r\n            // \r\n            // _SourceFileBox\r\n            // \r\n            this._SourceFileBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._SourceFileBox.Location = new System.Drawing.Point(16, 15);\r\n            this._SourceFileBox.Margin = new System.Windows.Forms.Padding(5);\r\n            this._SourceFileBox.Name = \"_SourceFileBox\";\r\n            this._SourceFileBox.Size = new System.Drawing.Size(712, 32);\r\n            this._SourceFileBox.TabIndex = 0;\r\n            // \r\n            // _AppConfigButton\r\n            // \r\n            this._AppConfigButton.Location = new System.Drawing.Point(26, 91);\r\n            this._AppConfigButton.Name = \"_AppConfigButton\";\r\n            this._AppConfigButton.Size = new System.Drawing.Size(127, 29);\r\n            this._AppConfigButton.TabIndex = 10;\r\n            this._AppConfigButton.Text = \"程序配置...\";\r\n            this._AppConfigButton.UseVisualStyleBackColor = true;\r\n            this._AppConfigButton.Click += new System.EventHandler(this._AppConfigButton_Click);\r\n            // \r\n            // DocumentFontListForm\r\n            // \r\n            this.AcceptButton = this._ListFontsButton;\r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n            this.ClientSize = new System.Drawing.Size(744, 490);\r\n            this.Controls.Add(this._AppConfigButton);\r\n            this.Controls.Add(this._SelectAllButton);\r\n            this.Controls.Add(this._AddSelectedFontsButton);\r\n            this.Controls.Add(this._ProgressBar);\r\n            this.Controls.Add(this._FontListBox);\r\n            this.Controls.Add(this._ListFontsButton);\r\n            this.Controls.Add(this._PageRangeBox);\r\n            this.Controls.Add(this.label1);\r\n            this.Controls.Add(this._SourceFileBox);\r\n            this.Margin = new System.Windows.Forms.Padding(4);\r\n            this.MaximizeBox = false;\r\n            this.MinimizeBox = false;\r\n            this.Name = \"DocumentFontListForm\";\r\n            this.ShowInTaskbar = false;\r\n            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r\n            this.Text = \"PDF 文档使用的字体列表\";\r\n            ((System.ComponentModel.ISupportInitialize)(this._FontListBox)).EndInit();\r\n            this.ResumeLayout(false);\r\n            this.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate SourceFileControl _SourceFileBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _PageRangeBox;\r\n\t\tprivate System.Windows.Forms.Button _ListFontsButton;\r\n\t\tprivate BrightIdeasSoftware.FastObjectListView _FontListBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FirstPageColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _EmbeddedColumn;\r\n\t\tprivate System.ComponentModel.BackgroundWorker _Worker;\r\n\t\tprivate System.Windows.Forms.ProgressBar _ProgressBar;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ReferenceColumn;\r\n\t\tprivate System.Windows.Forms.Button _AddSelectedFontsButton;\r\n\t\tprivate System.Windows.Forms.Button _SelectAllButton;\r\n        private System.Windows.Forms.Button _AppConfigButton;\r\n    }\r\n}"
  },
  {
    "path": "App/Functions/DocumentOption/DocumentFontListForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class DocumentFontListForm : Form\r\n\t{\r\n\t\tDictionary<int, string> _fontIdNames;\r\n\t\tDictionary<string, PageFont> _pageFonts;\r\n\t\tinternal FontSubstitutionsEditor SubstitutionsEditor { get; set; }\r\n\r\n\t\tpublic IList<string> SelectedFonts {\r\n\t\t\tget {\r\n\t\t\t\tvar sf = new List<string>();\r\n\t\t\t\tforeach (PageFont item in _FontListBox.CheckedObjects) {\r\n\t\t\t\t\tsf.Add(item.Name);\r\n\t\t\t\t}\r\n\t\t\t\treturn sf;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic DocumentFontListForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tthis.SetIcon(Properties.Resources.Fonts);\r\n\t\t\tMinimumSize = Size;\r\n\t\t\tif (AppContext.Recent.SourcePdfFiles.HasContent()) {\r\n\t\t\t\t_SourceFileBox.FileList.Text = AppContext.Recent.SourcePdfFiles[0];\r\n\t\t\t}\r\n\t\t\t_Worker.ProgressChanged += (s, args) => {\r\n\t\t\t\tif (args.ProgressPercentage < 0) {\r\n\t\t\t\t\t_ProgressBar.Maximum = -args.ProgressPercentage;\r\n\t\t\t\t}\r\n\t\t\t\telse if (args.ProgressPercentage > 0) {\r\n\t\t\t\t\t_ProgressBar.SetValue(args.ProgressPercentage);\r\n\t\t\t\t}\r\n\t\t\t\telse if (args.UserState is PageFont pf) {\r\n\t\t\t\t\t_FontListBox.AddObject(pf);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_Worker.RunWorkerCompleted += (s, args) => {\r\n\t\t\t\t_ProgressBar.Value = _ProgressBar.Maximum;\r\n\t\t\t\tif (_pageFonts.HasContent()) {\r\n\t\t\t\t\t_FontListBox.AddObjects(_pageFonts.Values);\r\n\t\t\t\t}\r\n\t\t\t\t_ListFontsButton.Enabled = true;\r\n\t\t\t};\r\n\t\t\t_Worker.DoWork += (s, args) => {\r\n\t\t\t\t_fontIdNames = new Dictionary<int, string>();\r\n\t\t\t\t_pageFonts = new Dictionary<string, PageFont>();\r\n\t\t\t\t_FontListBox.ClearObjects();\r\n\t\t\t\ttry {\r\n\t\t\t\t\tusing (var p = PdfHelper.OpenPdfFile(_SourceFileBox.FirstFile, false, false)) {\r\n\t\t\t\t\t\tvar r = PageRangeCollection.Parse(_PageRangeBox.Text, 1, p.NumberOfPages, true);\r\n\t\t\t\t\t\tvar pp = new int[p.NumberOfPages + 1];\r\n\t\t\t\t\t\t_Worker.ReportProgress(-r.TotalPages);\r\n\t\t\t\t\t\tint i = 0;\r\n\t\t\t\t\t\tforeach (var range in r) {\r\n\t\t\t\t\t\t\tforeach (var page in range) {\r\n\t\t\t\t\t\t\t\tif (_Worker.CancellationPending) {\r\n\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t_Worker.ReportProgress(++i);\r\n\t\t\t\t\t\t\t\tif (pp[page] != 0) {\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tpp[page] = 1;\r\n\t\t\t\t\t\t\t\tRegisterFonts(PdfDocumentFont.GetPageFontReferences(p.GetPageNRelease(page)), page);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tAppContext.MainForm.ErrorBox(\"读取字体信息时出错\", ex);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_FontListBox.ScaleColumnWidths();\r\n\t\t\t_FontListBox.PersistentCheckBoxes = true;\r\n\t\t\tnew TypedColumn<PageFont>(_NameColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Name\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<PageFont>(_FirstPageColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.FirstPage\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<PageFont>(_EmbeddedColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Embedded\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<PageFont>(_ReferenceColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Reference\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvoid RegisterFonts(IEnumerable<ResourceReference> fontRefs, int pageNumber) {\r\n\t\t\tforeach (var item in fontRefs) {\r\n\t\t\t\tvar fr = item.Ref;\r\n\t\t\t\tif (_fontIdNames.TryGetValue(fr.Number, out string fn)) {\r\n\t\t\t\t\t_pageFonts[fn].IncrementReference();\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar bf = item.Resource.GetAsName(PdfName.BASEFONT);\r\n\t\t\t\tif (bf == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tfn = PdfHelper.GetPdfNameString(bf, AppContext.Encodings.FontNameEncoding); // 字体名称\r\n\t\t\t\tfn = PdfDocumentFont.RemoveSubsetPrefix(fn);\r\n\t\t\t\t_fontIdNames.Add(fr.Number, fn);\r\n\t\t\t\tif (_pageFonts.TryGetValue(fn, out PageFont pf)) {\r\n\t\t\t\t\tpf.IncrementReference();\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_pageFonts.Add(fn, new PageFont(fn, pageNumber, PdfDocumentFont.HasEmbeddedFont(item.Resource)));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ListFontsButton_Click(object sender, EventArgs e) {\r\n\t\t\t_ProgressBar.Value = 0;\r\n\t\t\t_ListFontsButton.Enabled = false;\r\n\t\t\t_Worker.RunWorkerAsync();\r\n\t\t}\r\n\r\n\t\tsealed class PageFont\r\n\t\t{\r\n\t\t\tpublic string Name { get; }\r\n\t\t\tpublic int FirstPage { get; }\r\n\t\t\tpublic int Reference { get; private set; }\r\n\t\t\tpublic bool Embedded { get; set; }\r\n\r\n\t\t\tpublic PageFont(string name, int firstPage, bool embedded) {\r\n\t\t\t\tName = name;\r\n\t\t\t\tFirstPage = firstPage;\r\n\t\t\t\tEmbedded = embedded;\r\n\t\t\t\tReference = 1;\r\n\t\t\t}\r\n\r\n\t\t\tpublic void IncrementReference() {\r\n\t\t\t\tReference++;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _SelectAllButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (_FontListBox.GetItemCount() == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_FontListBox.GetItem(0).Checked == false) {\r\n\t\t\t\t_FontListBox.CheckObjects(_FontListBox.Objects);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_FontListBox.CheckedObjects = null;\r\n\t\t\t}\r\n\t\t\t_FontListBox.Focus();\r\n\t\t}\r\n\r\n\t\tvoid _AddSelectedFontsButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (SubstitutionsEditor == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar sf = SelectedFonts;\r\n\t\t\tif (sf.Count == 0) {\r\n\t\t\t\tFormHelper.ErrorBox(\"请选择需要添加到替换列表的字体。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tSubstitutionsEditor.AddFonts(sf);\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _AppConfigButton_Click(object sender, EventArgs e) {\r\n\t\t\tthis.ShowDialog<AppOptionForm>();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/DocumentFontListForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_Worker.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentOption/DocumentInfoEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class DocumentInfoEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container ();\r\n\t\t\tthis.groupBox4 = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis._MetadataPanel = new System.Windows.Forms.Panel ();\r\n\t\t\tthis.label16 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._KeywordsBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label17 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._SubjectBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label18 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._AuthorBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label19 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._TitleBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis._ForceMetadataBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._RewriteXmpBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._PropertyMacroMenu = new PDFPatcher.Functions.MacroMenu (this.components);\r\n\t\t\tthis.groupBox4.SuspendLayout ();\r\n\t\t\tthis._MetadataPanel.SuspendLayout ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// groupBox4\r\n\t\t\t// \r\n\t\t\tthis.groupBox4.Controls.Add (this._MetadataPanel);\r\n\t\t\tthis.groupBox4.Controls.Add (this._ForceMetadataBox);\r\n\t\t\tthis.groupBox4.Location = new System.Drawing.Point (6, 23);\r\n\t\t\tthis.groupBox4.Name = \"groupBox4\";\r\n\t\t\tthis.groupBox4.Size = new System.Drawing.Size (426, 232);\r\n\t\t\tthis.groupBox4.TabIndex = 2;\r\n\t\t\tthis.groupBox4.TabStop = false;\r\n\t\t\tthis.groupBox4.Text = \"文档信息\";\r\n\t\t\t// \r\n\t\t\t// _MetadataPanel\r\n\t\t\t// \r\n\t\t\tthis._MetadataPanel.Controls.Add (this._RewriteXmpBox);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this.label16);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this._KeywordsBox);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this.label17);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this._SubjectBox);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this.label18);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this._AuthorBox);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this.label19);\r\n\t\t\tthis._MetadataPanel.Controls.Add (this._TitleBox);\r\n\t\t\tthis._MetadataPanel.Enabled = false;\r\n\t\t\tthis._MetadataPanel.Location = new System.Drawing.Point (6, 41);\r\n\t\t\tthis._MetadataPanel.Name = \"_MetadataPanel\";\r\n\t\t\tthis._MetadataPanel.Size = new System.Drawing.Size (414, 185);\r\n\t\t\tthis._MetadataPanel.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label16\r\n\t\t\t// \r\n\t\t\tthis.label16.AutoSize = true;\r\n\t\t\tthis.label16.Location = new System.Drawing.Point (3, 0);\r\n\t\t\tthis.label16.Name = \"label16\";\r\n\t\t\tthis.label16.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label16.TabIndex = 0;\r\n\t\t\tthis.label16.Text = \"标题：\";\r\n\t\t\t// \r\n\t\t\t// _KeywordsBox\r\n\t\t\t// \r\n\t\t\tthis._KeywordsBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._KeywordsBox.Location = new System.Drawing.Point (5, 133);\r\n\t\t\tthis._KeywordsBox.Name = \"_KeywordsBox\";\r\n\t\t\tthis._KeywordsBox.Size = new System.Drawing.Size (406, 21);\r\n\t\t\tthis._KeywordsBox.TabIndex = 7;\r\n\t\t\tthis._KeywordsBox.TextChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label17\r\n\t\t\t// \r\n\t\t\tthis.label17.AutoSize = true;\r\n\t\t\tthis.label17.Location = new System.Drawing.Point (3, 40);\r\n\t\t\tthis.label17.Name = \"label17\";\r\n\t\t\tthis.label17.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label17.TabIndex = 2;\r\n\t\t\tthis.label17.Text = \"作者：\";\r\n\t\t\t// \r\n\t\t\t// _SubjectBox\r\n\t\t\t// \r\n\t\t\tthis._SubjectBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SubjectBox.Location = new System.Drawing.Point (5, 94);\r\n\t\t\tthis._SubjectBox.Name = \"_SubjectBox\";\r\n\t\t\tthis._SubjectBox.Size = new System.Drawing.Size (406, 21);\r\n\t\t\tthis._SubjectBox.TabIndex = 5;\r\n\t\t\tthis._SubjectBox.TextChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label18\r\n\t\t\t// \r\n\t\t\tthis.label18.AutoSize = true;\r\n\t\t\tthis.label18.Location = new System.Drawing.Point (3, 79);\r\n\t\t\tthis.label18.Name = \"label18\";\r\n\t\t\tthis.label18.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label18.TabIndex = 4;\r\n\t\t\tthis.label18.Text = \"主题：\";\r\n\t\t\t// \r\n\t\t\t// _AuthorBox\r\n\t\t\t// \r\n\t\t\tthis._AuthorBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AuthorBox.Location = new System.Drawing.Point (5, 55);\r\n\t\t\tthis._AuthorBox.Name = \"_AuthorBox\";\r\n\t\t\tthis._AuthorBox.Size = new System.Drawing.Size (406, 21);\r\n\t\t\tthis._AuthorBox.TabIndex = 3;\r\n\t\t\tthis._AuthorBox.TextChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label19\r\n\t\t\t// \r\n\t\t\tthis.label19.AutoSize = true;\r\n\t\t\tthis.label19.Location = new System.Drawing.Point (3, 118);\r\n\t\t\tthis.label19.Name = \"label19\";\r\n\t\t\tthis.label19.Size = new System.Drawing.Size (53, 12);\r\n\t\t\tthis.label19.TabIndex = 6;\r\n\t\t\tthis.label19.Text = \"关键词：\";\r\n\t\t\t// \r\n\t\t\t// _TitleBox\r\n\t\t\t// \r\n\t\t\tthis._TitleBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TitleBox.Location = new System.Drawing.Point (5, 15);\r\n\t\t\tthis._TitleBox.Name = \"_TitleBox\";\r\n\t\t\tthis._TitleBox.Size = new System.Drawing.Size (406, 21);\r\n\t\t\tthis._TitleBox.TabIndex = 1;\r\n\t\t\tthis._TitleBox.TextChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _ForceMetadataBox\r\n\t\t\t// \r\n\t\t\tthis._ForceMetadataBox.AutoSize = true;\r\n\t\t\tthis._ForceMetadataBox.Location = new System.Drawing.Point (8, 20);\r\n\t\t\tthis._ForceMetadataBox.Name = \"_ForceMetadataBox\";\r\n\t\t\tthis._ForceMetadataBox.Size = new System.Drawing.Size (180, 16);\r\n\t\t\tthis._ForceMetadataBox.TabIndex = 0;\r\n\t\t\tthis._ForceMetadataBox.Text = \"使用此处设定的文档属性信息\";\r\n\t\t\tthis._ForceMetadataBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ForceMetadataBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point (6, 8);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size (221, 12);\r\n\t\t\tthis.label5.TabIndex = 0;\r\n\t\t\tthis.label5.Text = \"说明：以下设定优先于信息文件的内容。\";\r\n\t\t\t// \r\n\t\t\t// _RewriteXmpBox\r\n\t\t\t// \r\n\t\t\tthis._RewriteXmpBox.AutoSize = true;\r\n\t\t\tthis._RewriteXmpBox.Location = new System.Drawing.Point (5, 160);\r\n\t\t\tthis._RewriteXmpBox.Name = \"_RewriteXmpBox\";\r\n\t\t\tthis._RewriteXmpBox.Size = new System.Drawing.Size (198, 16);\r\n\t\t\tthis._RewriteXmpBox.TabIndex = 8;\r\n\t\t\tthis._RewriteXmpBox.Text = \"重写扩展标记（XML）元数据属性\";\r\n\t\t\tthis._RewriteXmpBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RewriteXmpBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _PropertyMacroMenu\r\n\t\t\t// \r\n\t\t\tthis._PropertyMacroMenu.Name = \"_PropertyMacroMenu\";\r\n\t\t\tthis._PropertyMacroMenu.Size = new System.Drawing.Size (61, 4);\r\n\t\t\t// \r\n\t\t\t// DocumentInfoEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this.groupBox4);\r\n\t\t\tthis.Controls.Add (this.label5);\r\n\t\t\tthis.Name = \"DocumentInfoEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (438, 270);\r\n\t\t\tthis.groupBox4.ResumeLayout (false);\r\n\t\t\tthis.groupBox4.PerformLayout ();\r\n\t\t\tthis._MetadataPanel.ResumeLayout (false);\r\n\t\t\tthis._MetadataPanel.PerformLayout ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox4;\r\n\t\tprivate System.Windows.Forms.Panel _MetadataPanel;\r\n\t\tprivate System.Windows.Forms.Label label16;\r\n\t\tprivate System.Windows.Forms.TextBox _KeywordsBox;\r\n\t\tprivate System.Windows.Forms.Label label17;\r\n\t\tprivate System.Windows.Forms.TextBox _SubjectBox;\r\n\t\tprivate System.Windows.Forms.Label label18;\r\n\t\tprivate System.Windows.Forms.TextBox _AuthorBox;\r\n\t\tprivate System.Windows.Forms.Label label19;\r\n\t\tprivate System.Windows.Forms.TextBox _TitleBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ForceMetadataBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate Functions.MacroMenu _PropertyMacroMenu;\r\n\t\tprivate System.Windows.Forms.CheckBox _RewriteXmpBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/DocumentInfoEditor.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class DocumentInfoEditor : UserControl\r\n\t{\r\n\t\tbool _settingsLockdown;\r\n\t\tGeneralInfo _Options;\r\n\t\tinternal GeneralInfo Options {\r\n\t\t\tget => _Options;\r\n\t\t\tset {\r\n\t\t\t\t_Options = value;\r\n\t\t\t\t_settingsLockdown = true;\r\n\t\t\t\t_AuthorBox.Text = _Options.Author;\r\n\t\t\t\t_MetadataPanel.Enabled = _ForceMetadataBox.Checked = _Options.SpecifyMetaData;\r\n\t\t\t\t_KeywordsBox.Text = _Options.Keywords;\r\n\t\t\t\t_SubjectBox.Text = _Options.Subject;\r\n\t\t\t\t_TitleBox.Text = _Options.Title;\r\n\t\t\t\t_RewriteXmpBox.Checked = _Options.RewriteXmp;\r\n\t\t\t\t_settingsLockdown = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic DocumentInfoEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_settingsLockdown = true;\r\n\t\t\t_TitleBox.ContextMenuStrip = _SubjectBox.ContextMenuStrip = _AuthorBox.ContextMenuStrip = _KeywordsBox.ContextMenuStrip = _PropertyMacroMenu;\r\n\t\t\t_PropertyMacroMenu.AddInsertMacroMenuItem(Constants.FileNameMacros.FileName);\r\n\t\t\t_PropertyMacroMenu.AddInsertMacroMenuItem(Constants.FileNameMacros.FolderName);\r\n\t\t\t_PropertyMacroMenu.ItemClicked += _PropertyMacroMenu.ProcessInsertMacroCommand;\r\n\t\t\t_settingsLockdown = false;\r\n\t\t}\r\n\r\n\t\tvoid DocumentInfoChanged(object sender, EventArgs e) {\r\n\t\t\tif (_settingsLockdown) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (sender == _AuthorBox) {\r\n\t\t\t\tOptions.Author = _AuthorBox.Text;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ForceMetadataBox) {\r\n\t\t\t\t_MetadataPanel.Enabled = Options.SpecifyMetaData = _ForceMetadataBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _KeywordsBox) {\r\n\t\t\t\tOptions.Keywords = _KeywordsBox.Text;\r\n\t\t\t}\r\n\t\t\telse if (sender == _SubjectBox) {\r\n\t\t\t\tOptions.Subject = _SubjectBox.Text;\r\n\t\t\t}\r\n\t\t\telse if (sender == _TitleBox) {\r\n\t\t\t\tOptions.Title = _TitleBox.Text;\r\n\t\t\t}\r\n\t\t\telse if (sender == _RewriteXmpBox) {\r\n\t\t\t\tOptions.RewriteXmp = _RewriteXmpBox.Checked;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/DocumentInfoEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_PropertyMacroMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentOption/FontCharSubstitutionForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class FontCharSubstitutionForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows Form Designer generated code\r\n\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._OriginalCharactersBox = new System.Windows.Forms.RichTextBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SubstituteCharactersBox = new System.Windows.Forms.RichTextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ChineseCaseBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._NumericWidthBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._LetterWidthBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PunctuationWidthBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(20, 23);\r\n\t\t\tthis.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"原字符：\";\r\n\t\t\t// \r\n\t\t\t// _OriginalCharactersBox\r\n\t\t\t// \r\n\t\t\tthis._OriginalCharactersBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OriginalCharactersBox.HideSelection = false;\r\n\t\t\tthis._OriginalCharactersBox.Location = new System.Drawing.Point(75, 20);\r\n\t\t\tthis._OriginalCharactersBox.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\r\n\t\t\tthis._OriginalCharactersBox.Multiline = false;\r\n\t\t\tthis._OriginalCharactersBox.Name = \"_OriginalCharactersBox\";\r\n\t\t\tthis._OriginalCharactersBox.Size = new System.Drawing.Size(237, 21);\r\n\t\t\tthis._OriginalCharactersBox.TabIndex = 1;\r\n\t\t\tthis._OriginalCharactersBox.Text = \"\";\r\n\t\t\tthis._OriginalCharactersBox.SelectionChanged += new System.EventHandler(this._OriginalCharactersBox_SelectionChanged);\r\n\t\t\tthis._OriginalCharactersBox.TextChanged += new System.EventHandler(this._OriginalCharactersBox_TextChanged);\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(9, 61);\r\n\t\t\tthis.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label2.TabIndex = 2;\r\n\t\t\tthis.label2.Text = \"替换字符：\";\r\n\t\t\t// \r\n\t\t\t// _SubstituteCharactersBox\r\n\t\t\t// \r\n\t\t\tthis._SubstituteCharactersBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SubstituteCharactersBox.HideSelection = false;\r\n\t\t\tthis._SubstituteCharactersBox.Location = new System.Drawing.Point(75, 59);\r\n\t\t\tthis._SubstituteCharactersBox.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\r\n\t\t\tthis._SubstituteCharactersBox.Multiline = false;\r\n\t\t\tthis._SubstituteCharactersBox.Name = \"_SubstituteCharactersBox\";\r\n\t\t\tthis._SubstituteCharactersBox.Size = new System.Drawing.Size(237, 21);\r\n\t\t\tthis._SubstituteCharactersBox.TabIndex = 3;\r\n\t\t\tthis._SubstituteCharactersBox.Text = \"\";\r\n\t\t\tthis._SubstituteCharactersBox.TextChanged += new System.EventHandler(this._SubstituteCharactersBox_TextChanged);\r\n\t\t\tthis._SubstituteCharactersBox.Enter += new System.EventHandler(this._SubstituteCharactersBox_Enter);\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(9, 101);\r\n\t\t\tthis.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label3.TabIndex = 4;\r\n\t\t\tthis.label3.Text = \"简繁汉字替换：\";\r\n\t\t\t// \r\n\t\t\t// _ChineseCaseBox\r\n\t\t\t// \r\n\t\t\tthis._ChineseCaseBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ChineseCaseBox.FormattingEnabled = true;\r\n\t\t\tthis._ChineseCaseBox.Items.AddRange(new object[] {\r\n            \"不改变\",\r\n            \"简体转繁体\",\r\n            \"繁体转简体\"});\r\n\t\t\tthis._ChineseCaseBox.Location = new System.Drawing.Point(103, 99);\r\n\t\t\tthis._ChineseCaseBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._ChineseCaseBox.Name = \"_ChineseCaseBox\";\r\n\t\t\tthis._ChineseCaseBox.Size = new System.Drawing.Size(109, 20);\r\n\t\t\tthis._ChineseCaseBox.TabIndex = 5;\r\n\t\t\tthis._ChineseCaseBox.SelectedIndexChanged += new System.EventHandler(this._ChineseCaseBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(33, 123);\r\n\t\t\tthis.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label4.TabIndex = 6;\r\n\t\t\tthis.label4.Text = \"数字替换：\";\r\n\t\t\t// \r\n\t\t\t// _NumericWidthBox\r\n\t\t\t// \r\n\t\t\tthis._NumericWidthBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._NumericWidthBox.FormattingEnabled = true;\r\n\t\t\tthis._NumericWidthBox.Items.AddRange(new object[] {\r\n            \"不改变\",\r\n            \"半角转全角\",\r\n            \"全角转半角\"});\r\n\t\t\tthis._NumericWidthBox.Location = new System.Drawing.Point(103, 121);\r\n\t\t\tthis._NumericWidthBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._NumericWidthBox.Name = \"_NumericWidthBox\";\r\n\t\t\tthis._NumericWidthBox.Size = new System.Drawing.Size(109, 20);\r\n\t\t\tthis._NumericWidthBox.TabIndex = 7;\r\n\t\t\tthis._NumericWidthBox.SelectedIndexChanged += new System.EventHandler(this._NumericWidthBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// _LetterWidthBox\r\n\t\t\t// \r\n\t\t\tthis._LetterWidthBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._LetterWidthBox.FormattingEnabled = true;\r\n\t\t\tthis._LetterWidthBox.Items.AddRange(new object[] {\r\n            \"不改变\",\r\n            \"半角转全角\",\r\n            \"全角转半角\"});\r\n\t\t\tthis._LetterWidthBox.Location = new System.Drawing.Point(103, 142);\r\n\t\t\tthis._LetterWidthBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._LetterWidthBox.Name = \"_LetterWidthBox\";\r\n\t\t\tthis._LetterWidthBox.Size = new System.Drawing.Size(109, 20);\r\n\t\t\tthis._LetterWidthBox.TabIndex = 9;\r\n\t\t\tthis._LetterWidthBox.SelectedIndexChanged += new System.EventHandler(this._LetterWidthBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(33, 144);\r\n\t\t\tthis.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label5.TabIndex = 8;\r\n\t\t\tthis.label5.Text = \"字母替换：\";\r\n\t\t\t// \r\n\t\t\t// _PunctuationWidthBox\r\n\t\t\t// \r\n\t\t\tthis._PunctuationWidthBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._PunctuationWidthBox.FormattingEnabled = true;\r\n\t\t\tthis._PunctuationWidthBox.Items.AddRange(new object[] {\r\n            \"不改变\",\r\n            \"半角转全角\",\r\n            \"全角转半角\"});\r\n\t\t\tthis._PunctuationWidthBox.Location = new System.Drawing.Point(103, 163);\r\n\t\t\tthis._PunctuationWidthBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._PunctuationWidthBox.Name = \"_PunctuationWidthBox\";\r\n\t\t\tthis._PunctuationWidthBox.Size = new System.Drawing.Size(109, 20);\r\n\t\t\tthis._PunctuationWidthBox.TabIndex = 11;\r\n\t\t\tthis._PunctuationWidthBox.SelectedIndexChanged += new System.EventHandler(this._PunctuationWidthBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(33, 165);\r\n\t\t\tthis.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label6.TabIndex = 10;\r\n\t\t\tthis.label6.Text = \"标点替换：\";\r\n\t\t\t// \r\n\t\t\t// FontCharSubstitutionForm\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(320, 192);\r\n\t\t\tthis.Controls.Add(this._PunctuationWidthBox);\r\n\t\t\tthis.Controls.Add(this._LetterWidthBox);\r\n\t\t\tthis.Controls.Add(this._NumericWidthBox);\r\n\t\t\tthis.Controls.Add(this._ChineseCaseBox);\r\n\t\t\tthis.Controls.Add(this.label6);\r\n\t\t\tthis.Controls.Add(this.label5);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._SubstituteCharactersBox);\r\n\t\t\tthis.Controls.Add(this._OriginalCharactersBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"FontCharSubstitutionForm\";\r\n\t\t\tthis.ShowIcon = false;\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r\n\t\t\tthis.Text = \"替换字符\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.RichTextBox _OriginalCharactersBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.RichTextBox _SubstituteCharactersBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.ComboBox _ChineseCaseBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.ComboBox _NumericWidthBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _LetterWidthBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.ComboBox _PunctuationWidthBox;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/DocumentOption/FontCharSubstitutionForm.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class FontCharSubstitutionForm : Form\r\n\t{\r\n\t\treadonly FontSubstitution _Substitution;\r\n\t\tpublic FontCharSubstitutionForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\t\tpublic FontCharSubstitutionForm(FontSubstitution substitution) : this() {\r\n\t\t\tthis.SetIcon(Properties.Resources.Replace);\r\n\t\t\tMinimumSize = Size;\r\n\t\t\tMaximumSize = new Size(999, Size.Height);\r\n\t\t\t_Substitution = substitution;\r\n\t\t\t_OriginalCharactersBox.Text = substitution.OriginalCharacters;\r\n\t\t\t_SubstituteCharactersBox.Text = substitution.SubstituteCharacters;\r\n\t\t\t_ChineseCaseBox.Select(substitution.TraditionalChineseConversion == -1 ? 2 : substitution.TraditionalChineseConversion);\r\n\t\t\t_LetterWidthBox.Select(substitution.AlphabeticWidthConversion == -1 ? 2 : substitution.AlphabeticWidthConversion);\r\n\t\t\t_NumericWidthBox.Select(substitution.NumericWidthConversion == -1 ? 2 : substitution.NumericWidthConversion);\r\n\t\t\t_PunctuationWidthBox.Select(substitution.PunctuationWidthConversion == -1 ? 2 : substitution.PunctuationWidthConversion);\r\n\t\t}\r\n\r\n\t\tvoid _OriginalCharactersBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\t_Substitution.OriginalCharacters = _OriginalCharactersBox.Text;\r\n\t\t}\r\n\r\n\t\tvoid _SubstituteCharactersBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\t_Substitution.SubstituteCharacters = _SubstituteCharactersBox.Text;\r\n\t\t}\r\n\r\n\t\tvoid _SubstituteCharactersBox_Enter(object sender, EventArgs e) {\r\n\t\t\t_SubstituteCharactersBox.Select(\r\n\t\t\t\t_OriginalCharactersBox.SelectionStart,\r\n\t\t\t\t_OriginalCharactersBox.SelectionLength\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tvoid _OriginalCharactersBox_SelectionChanged(object sender, EventArgs e) {\r\n\t\t\t_SubstituteCharactersBox.Select(\r\n\t\t\t\t_OriginalCharactersBox.SelectionStart,\r\n\t\t\t\t_OriginalCharactersBox.SelectionLength\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tvoid _ChineseCaseBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\t_Substitution.TraditionalChineseConversion = _ChineseCaseBox.SelectedIndex == 2 ? -1 : _ChineseCaseBox.SelectedIndex;\r\n\t\t}\r\n\r\n\t\tvoid _NumericWidthBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\t_Substitution.NumericWidthConversion = _NumericWidthBox.SelectedIndex == 2 ? -1 : _NumericWidthBox.SelectedIndex;\r\n\t\t}\r\n\r\n\t\tvoid _LetterWidthBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\t_Substitution.AlphabeticWidthConversion = _LetterWidthBox.SelectedIndex == 2 ? -1 : _LetterWidthBox.SelectedIndex;\r\n\t\t}\r\n\r\n\t\tvoid _PunctuationWidthBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\t_Substitution.PunctuationWidthConversion = _PunctuationWidthBox.SelectedIndex == 2 ? -1 : _PunctuationWidthBox.SelectedIndex;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/FontCharSubstitutionForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentOption/FontSubstitutionsEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class FontSubstitutionsEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tthis._FontSubstitutionsBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._SequenceColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._OriginalFontColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._SubstitutionColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._CharSubstitutionColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FontSubstitutionMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._CopySubstitutionFont = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._PasteSubstitutionFont = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RemoveSubstitutionButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._AddSubstitutionButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ListDocumentFontButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._EmbedLegacyCjkFontsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._EnableFontSubstitutionsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.panel1 = new System.Windows.Forms.Panel();\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox = new System.Windows.Forms.CheckBox();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FontSubstitutionsBox)).BeginInit();\r\n\t\t\tthis._FontSubstitutionMenu.SuspendLayout();\r\n\t\t\tthis.panel1.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _FontSubstitutionsBox\r\n\t\t\t// \r\n\t\t\tthis._FontSubstitutionsBox.AllColumns.Add(this._SequenceColumn);\r\n\t\t\tthis._FontSubstitutionsBox.AllColumns.Add(this._OriginalFontColumn);\r\n\t\t\tthis._FontSubstitutionsBox.AllColumns.Add(this._SubstitutionColumn);\r\n\t\t\tthis._FontSubstitutionsBox.AllColumns.Add(this._CharSubstitutionColumn);\r\n\t\t\tthis._FontSubstitutionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FontSubstitutionsBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._FontSubstitutionsBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._SequenceColumn,\r\n            this._OriginalFontColumn,\r\n            this._SubstitutionColumn,\r\n            this._CharSubstitutionColumn});\r\n\t\t\tthis._FontSubstitutionsBox.ContextMenuStrip = this._FontSubstitutionMenu;\r\n\t\t\tthis._FontSubstitutionsBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._FontSubstitutionsBox.Enabled = false;\r\n\t\t\tthis._FontSubstitutionsBox.GridLines = true;\r\n\t\t\tthis._FontSubstitutionsBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._FontSubstitutionsBox.HideSelection = false;\r\n\t\t\tthis._FontSubstitutionsBox.LabelEdit = true;\r\n\t\t\tthis._FontSubstitutionsBox.Location = new System.Drawing.Point(4, 69);\r\n\t\t\tthis._FontSubstitutionsBox.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._FontSubstitutionsBox.Name = \"_FontSubstitutionsBox\";\r\n\t\t\tthis._FontSubstitutionsBox.SelectColumnsOnRightClick = false;\r\n\t\t\tthis._FontSubstitutionsBox.SelectColumnsOnRightClickBehaviour = BrightIdeasSoftware.ObjectListView.ColumnSelectBehaviour.None;\r\n\t\t\tthis._FontSubstitutionsBox.ShowGroups = false;\r\n\t\t\tthis._FontSubstitutionsBox.Size = new System.Drawing.Size(575, 275);\r\n\t\t\tthis._FontSubstitutionsBox.TabIndex = 5;\r\n\t\t\tthis._FontSubstitutionsBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._FontSubstitutionsBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _SequenceColumn\r\n\t\t\t// \r\n\t\t\tthis._SequenceColumn.Text = \"序号\";\r\n\t\t\tthis._SequenceColumn.Width = 40;\r\n\t\t\t// \r\n\t\t\t// _OriginalFontColumn\r\n\t\t\t// \r\n\t\t\tthis._OriginalFontColumn.AspectName = \"\";\r\n\t\t\tthis._OriginalFontColumn.Text = \"原字体\";\r\n\t\t\tthis._OriginalFontColumn.Width = 160;\r\n\t\t\t// \r\n\t\t\t// _SubstitutionColumn\r\n\t\t\t// \r\n\t\t\tthis._SubstitutionColumn.AspectName = \"\";\r\n\t\t\tthis._SubstitutionColumn.Text = \"替换字体\";\r\n\t\t\tthis._SubstitutionColumn.Width = 160;\r\n\t\t\t// \r\n\t\t\t// _CharSubstitutionColumn\r\n\t\t\t// \r\n\t\t\tthis._CharSubstitutionColumn.Text = \"替换字符\";\r\n\t\t\tthis._CharSubstitutionColumn.Width = 71;\r\n\t\t\t// \r\n\t\t\t// _FontSubstitutionMenu\r\n\t\t\t// \r\n\t\t\tthis._FontSubstitutionMenu.ImageScalingSize = new System.Drawing.Size(20, 20);\r\n\t\t\tthis._FontSubstitutionMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._CopySubstitutionFont,\r\n            this._PasteSubstitutionFont});\r\n\t\t\tthis._FontSubstitutionMenu.Name = \"_FontSubstitutionMenu\";\r\n\t\t\tthis._FontSubstitutionMenu.Size = new System.Drawing.Size(192, 56);\r\n\t\t\tthis._FontSubstitutionMenu.Opening += new System.ComponentModel.CancelEventHandler(this._FontSubstitutionMenu_Opening);\r\n\t\t\tthis._FontSubstitutionMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._FontSubstitutionMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _CopySubstitutionFont\r\n\t\t\t// \r\n\t\t\tthis._CopySubstitutionFont.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\tthis._CopySubstitutionFont.Name = \"_CopySubstitutionFont\";\r\n\t\t\tthis._CopySubstitutionFont.Size = new System.Drawing.Size(191, 26);\r\n\t\t\tthis._CopySubstitutionFont.Text = \"复制替换字体(&F)\";\r\n\t\t\t// \r\n\t\t\t// _PasteSubstitutionFont\r\n\t\t\t// \r\n\t\t\tthis._PasteSubstitutionFont.Image = global::PDFPatcher.Properties.Resources.Paste;\r\n\t\t\tthis._PasteSubstitutionFont.Name = \"_PasteSubstitutionFont\";\r\n\t\t\tthis._PasteSubstitutionFont.Size = new System.Drawing.Size(191, 26);\r\n\t\t\tthis._PasteSubstitutionFont.Text = \"粘贴替换字体(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _RemoveSubstitutionButton\r\n\t\t\t// \r\n\t\t\tthis._RemoveSubstitutionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._RemoveSubstitutionButton.Enabled = false;\r\n\t\t\tthis._RemoveSubstitutionButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._RemoveSubstitutionButton.Location = new System.Drawing.Point(509, 4);\r\n\t\t\tthis._RemoveSubstitutionButton.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._RemoveSubstitutionButton.Name = \"_RemoveSubstitutionButton\";\r\n\t\t\tthis._RemoveSubstitutionButton.Size = new System.Drawing.Size(71, 29);\r\n\t\t\tthis._RemoveSubstitutionButton.TabIndex = 4;\r\n\t\t\tthis._RemoveSubstitutionButton.Text = \"删除\";\r\n\t\t\tthis._RemoveSubstitutionButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._RemoveSubstitutionButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RemoveSubstitutionButton.Click += new System.EventHandler(this._RemoveSubstitutionButton_Click);\r\n\t\t\t// \r\n\t\t\t// _AddSubstitutionButton\r\n\t\t\t// \r\n\t\t\tthis._AddSubstitutionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AddSubstitutionButton.Enabled = false;\r\n\t\t\tthis._AddSubstitutionButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddSubstitutionButton.Location = new System.Drawing.Point(431, 4);\r\n\t\t\tthis._AddSubstitutionButton.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._AddSubstitutionButton.Name = \"_AddSubstitutionButton\";\r\n\t\t\tthis._AddSubstitutionButton.Size = new System.Drawing.Size(71, 29);\r\n\t\t\tthis._AddSubstitutionButton.TabIndex = 3;\r\n\t\t\tthis._AddSubstitutionButton.Text = \"添加\";\r\n\t\t\tthis._AddSubstitutionButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._AddSubstitutionButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._AddSubstitutionButton.Click += new System.EventHandler(this._AddSubstitutionButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ListDocumentFontButton\r\n\t\t\t// \r\n\t\t\tthis._ListDocumentFontButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ListDocumentFontButton.Location = new System.Drawing.Point(276, 4);\r\n\t\t\tthis._ListDocumentFontButton.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._ListDocumentFontButton.Name = \"_ListDocumentFontButton\";\r\n\t\t\tthis._ListDocumentFontButton.Size = new System.Drawing.Size(147, 29);\r\n\t\t\tthis._ListDocumentFontButton.TabIndex = 2;\r\n\t\t\tthis._ListDocumentFontButton.Text = \"列出文档字体\";\r\n\t\t\tthis._ListDocumentFontButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ListDocumentFontButton.Click += new System.EventHandler(this._ListDocumentFontButton_Click);\r\n\t\t\t// \r\n\t\t\t// _EmbedLegacyCjkFontsBox\r\n\t\t\t// \r\n\t\t\tthis._EmbedLegacyCjkFontsBox.AutoSize = true;\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.Location = new System.Drawing.Point(4, 9);\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.Name = \"_EmbedLegacyCjkFontsBox\";\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.Size = new System.Drawing.Size(104, 19);\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.TabIndex = 0;\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.Text = \"嵌入汉字库\";\r\n\t\t\tthis._EmbedLegacyCjkFontsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _EnableFontSubstitutionsBox\r\n\t\t\t// \r\n\t\t\tthis._EnableFontSubstitutionsBox.AutoSize = true;\r\n\t\t\tthis._EnableFontSubstitutionsBox.Location = new System.Drawing.Point(124, 9);\r\n\t\t\tthis._EnableFontSubstitutionsBox.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._EnableFontSubstitutionsBox.Name = \"_EnableFontSubstitutionsBox\";\r\n\t\t\tthis._EnableFontSubstitutionsBox.Size = new System.Drawing.Size(119, 19);\r\n\t\t\tthis._EnableFontSubstitutionsBox.TabIndex = 1;\r\n\t\t\tthis._EnableFontSubstitutionsBox.Text = \"允许替换字体\";\r\n\t\t\tthis._EnableFontSubstitutionsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// panel1\r\n\t\t\t// \r\n\t\t\tthis.panel1.Controls.Add(this._TrimTrailingWhiteSpaceBox);\r\n\t\t\tthis.panel1.Controls.Add(this._FontSubstitutionsBox);\r\n\t\t\tthis.panel1.Controls.Add(this._EnableFontSubstitutionsBox);\r\n\t\t\tthis.panel1.Controls.Add(this._AddSubstitutionButton);\r\n\t\t\tthis.panel1.Controls.Add(this._EmbedLegacyCjkFontsBox);\r\n\t\t\tthis.panel1.Controls.Add(this._RemoveSubstitutionButton);\r\n\t\t\tthis.panel1.Controls.Add(this._ListDocumentFontButton);\r\n\t\t\tthis.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis.panel1.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis.panel1.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis.panel1.Name = \"panel1\";\r\n\t\t\tthis.panel1.Size = new System.Drawing.Size(584, 349);\r\n\t\t\tthis.panel1.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// _TrimTrailingWhiteSpaceBox\r\n\t\t\t// \r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.AutoSize = true;\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.Location = new System.Drawing.Point(4, 35);\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.Name = \"_TrimTrailingWhiteSpaceBox\";\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.Size = new System.Drawing.Size(179, 19);\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.TabIndex = 6;\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.Text = \"同时删除文本尾随空格\";\r\n\t\t\tthis._TrimTrailingWhiteSpaceBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// FontSubstitutionsEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this.panel1);\r\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis.Name = \"FontSubstitutionsEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size(584, 349);\r\n\t\t\tthis.Load += new System.EventHandler(this.FontSubstitutionsEditor_Load);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._FontSubstitutionsBox)).EndInit();\r\n\t\t\tthis._FontSubstitutionMenu.ResumeLayout(false);\r\n\t\t\tthis.panel1.ResumeLayout(false);\r\n\t\t\tthis.panel1.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _RemoveSubstitutionButton;\r\n\t\tprivate System.Windows.Forms.Button _AddSubstitutionButton;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _FontSubstitutionsBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _OriginalFontColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SubstitutionColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SequenceColumn;\r\n\t\tprivate System.Windows.Forms.Button _ListDocumentFontButton;\r\n\t\tprivate System.Windows.Forms.CheckBox _EmbedLegacyCjkFontsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _EnableFontSubstitutionsBox;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _FontSubstitutionMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _CopySubstitutionFont;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _PasteSubstitutionFont;\r\n\t\tprivate System.Windows.Forms.Panel panel1;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _CharSubstitutionColumn;\r\n\t\tprivate System.Windows.Forms.CheckBox _TrimTrailingWhiteSpaceBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/FontSubstitutionsEditor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class FontSubstitutionsEditor : UserControl\r\n\t{\r\n\t\tstring _copiedFont;\r\n\r\n\t\tFontUtility.FriendlyFontName[] _Fonts;\r\n\t\treadonly TypedObjectListView<FontSubstitution> _SubstitutionsBox;\r\n\t\tList<FontSubstitution> _Substitutions;\r\n\t\t[Browsable(false)]\r\n\t\tpublic List<FontSubstitution> Substitutions {\r\n\t\t\tget => _Substitutions;\r\n\t\t\tset { _Substitutions = value; _FontSubstitutionsBox.Objects = value; }\r\n\t\t}\r\n\t\tpublic PatcherOptions Options { get; set; }\r\n\r\n\t\tpublic FontSubstitutionsEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t\t_SubstitutionsBox = new TypedObjectListView<FontSubstitution>(_FontSubstitutionsBox);\r\n\t\t\t_FontSubstitutionsBox.FormatRow += (s, args) => args.Item.SubItems[0].Text = ValueHelper.ToText(args.RowIndex + 1);\r\n\t\t\tnew TypedColumn<FontSubstitution>(_OriginalFontColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.OriginalFont,\r\n\t\t\t\tAspectPutter = (o, v) => o.OriginalFont = v as string\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<FontSubstitution>(_SubstitutionColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Substitution,\r\n\t\t\t\tAspectPutter = (o, v) => o.Substitution = v as string\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<FontSubstitution>(_CharSubstitutionColumn) {\r\n\t\t\t\tAspectGetter = (o) => String.IsNullOrEmpty(o.OriginalCharacters) ? \"添加\" : \"修改\"\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_FontSubstitutionsBox.FixEditControlWidth();\r\n\t\t\t_FontSubstitutionsBox.ScaleColumnWidths();\r\n\t\t\t_FontSubstitutionsBox.FullRowSelect = true;\r\n\t\t\t_FontSubstitutionsBox.HideSelection = false;\r\n\t\t\t_FontSubstitutionsBox.LabelEdit = false;\r\n\t\t\t_FontSubstitutionsBox.CellEditStarting += (s, args) => {\r\n\t\t\t\tif (args.Column == _SubstitutionColumn) {\r\n\t\t\t\t\tEditSubstitutionItem(args);\r\n\t\t\t\t}\r\n\t\t\t\telse if (args.Column == _CharSubstitutionColumn) {\r\n\t\t\t\t\tusing (var f = new FontCharSubstitutionForm(args.RowObject as FontSubstitution)) {\r\n\t\t\t\t\t\tf.ShowDialog(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t\targs.Cancel = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_FontSubstitutionsBox.CellEditFinishing += (s, args) => {\r\n\t\t\t\tif (args.Column == _SubstitutionColumn) {\r\n\t\t\t\t\tvar c = args.Control as ComboBox;\r\n\t\t\t\t\tif (c.FindString(c.Text) != -1) {\r\n\t\t\t\t\t\targs.NewValue = c.Text;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvoid EditSubstitutionItem(CellEditEventArgs args) {\r\n\t\t\tvar cb = new ComboBox {\r\n\t\t\t\tAutoCompleteSource = AutoCompleteSource.ListItems,\r\n\t\t\t\tAutoCompleteMode = AutoCompleteMode.SuggestAppend,\r\n\t\t\t\tBounds = args.CellBounds\r\n\t\t\t};\r\n\t\t\tvar b = cb.Items;\r\n\t\t\tb.Add(String.Empty);\r\n\t\t\tvar sf = (args.RowObject as FontSubstitution).Substitution;\r\n\t\t\tbool cf = String.IsNullOrEmpty(sf) == false;\r\n\t\t\tif (cf) {\r\n\t\t\t\tsf = sf.ToUpperInvariant();\r\n\t\t\t}\r\n\t\t\tif (_Fonts.HasContent() == false) {\r\n\t\t\t\t_Fonts = FontUtility.InstalledFonts;\r\n\t\t\t}\r\n\t\t\tvar l = _Fonts.Length;\r\n\t\t\tstring fn;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tfn = _Fonts[i].ToString();\r\n\t\t\t\tb.Add(fn);\r\n\t\t\t\tif (String.Equals(fn, sf, StringComparison.OrdinalIgnoreCase)) {\r\n\t\t\t\t\tcb.SelectedIndex = i + 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (cb.SelectedIndex == -1) {\r\n\t\t\t\tcb.SelectedIndex = 0;\r\n\t\t\t}\r\n\t\t\targs.Control = cb;\r\n\t\t\tcb.ParentChanged += (s1, a) => {\r\n\t\t\t\tvar box = ((ComboBox)s1);\r\n\t\t\t\tif (box.Parent != null) {\r\n\t\t\t\t\tbox.DroppedDown = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvoid FontSubstitutionsEditor_Load(object sender, EventArgs e) {\r\n\t\t\tif (DesignMode) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_EmbedLegacyCjkFontsBox.Checked = Options.EmbedFonts;\r\n\t\t\t_EmbedLegacyCjkFontsBox.CheckedChanged += (s, args) => Options.EmbedFonts = _EmbedLegacyCjkFontsBox.Checked;\r\n\t\t\t_TrimTrailingWhiteSpaceBox.Checked = Options.TrimTrailingWhiteSpace;\r\n\t\t\t_TrimTrailingWhiteSpaceBox.CheckedChanged += (s, args) => Options.TrimTrailingWhiteSpace = _TrimTrailingWhiteSpaceBox.Checked;\r\n\t\t\t_EnableFontSubstitutionsBox.CheckedChanged += (s, args) => {\r\n\t\t\t\t_AddSubstitutionButton.Enabled\r\n\t\t\t\t\t= _RemoveSubstitutionButton.Enabled\r\n\t\t\t\t\t= _FontSubstitutionsBox.Enabled\r\n\t\t\t\t\t= _TrimTrailingWhiteSpaceBox.Enabled\r\n\t\t\t\t\t= Options.EnableFontSubstitutions\r\n\t\t\t\t\t= _EnableFontSubstitutionsBox.Checked;\r\n\t\t\t};\r\n\t\t\t_EnableFontSubstitutionsBox.Checked = Options.EnableFontSubstitutions;\r\n\t\t\t_FontSubstitutionMenu.Invalidate();\r\n\t\t}\r\n\r\n\t\tvoid _AddSubstitutionButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar s = new FontSubstitution { OriginalFont = \"请输入原字体名称\" };\r\n\t\t\t_Substitutions.Add(s);\r\n\t\t\t_FontSubstitutionsBox.AddObject(s);\r\n\t\t\t_FontSubstitutionsBox.EditSubItem(_FontSubstitutionsBox.GetLastItemInDisplayOrder(), 1);\r\n\t\t}\r\n\r\n\t\tvoid _RemoveSubstitutionButton_Click(object sender, EventArgs e) {\r\n\t\t\t_FontSubstitutionsBox.RemoveObjects(_FontSubstitutionsBox.SelectedObjects);\r\n\t\t\t_Substitutions.Clear();\r\n\t\t\t_Substitutions.AddRange(_SubstitutionsBox.Objects);\r\n\t\t}\r\n\r\n\t\tvoid _ListDocumentFontButton_Click(object sender, EventArgs e) {\r\n\t\t\tusing (var f = new DocumentFontListForm()) {\r\n\t\t\t\tf.SubstitutionsEditor = this;\r\n\t\t\t\tf.ShowDialog();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void AddFonts(IEnumerable<string> fonts) {\r\n\t\t\tvar s = new HashSet<string>(StringComparer.CurrentCultureIgnoreCase);\r\n\t\t\tforeach (var item in _Substitutions) {\r\n\t\t\t\ts.Add(item.OriginalFont);\r\n\t\t\t}\r\n\t\t\tforeach (var item in fonts) {\r\n\t\t\t\tif (s.Contains(item)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_Substitutions.Add(new FontSubstitution() { OriginalFont = item });\r\n\t\t\t}\r\n\t\t\t_SubstitutionsBox.Objects = _Substitutions;\r\n\t\t\t_EnableFontSubstitutionsBox.Checked = true;\r\n\t\t}\r\n\r\n\t\tvoid _FontSubstitutionMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tif (e.ClickedItem == _CopySubstitutionFont) {\r\n\t\t\t\t_copiedFont = _FontSubstitutionsBox.GetFirstSelectedModel<FontSubstitution>().Substitution;\r\n\t\t\t}\r\n\t\t\telse if (e.ClickedItem == _PasteSubstitutionFont) {\r\n\t\t\t\tforeach (var item in _SubstitutionsBox.SelectedObjects) {\r\n\t\t\t\t\titem.Substitution = _copiedFont;\r\n\t\t\t\t}\r\n\t\t\t\t_FontSubstitutionsBox.RefreshSelectedObjects();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _FontSubstitutionMenu_Opening(object sender, CancelEventArgs e) {\r\n\t\t\t_CopySubstitutionFont.Enabled = (_FontSubstitutionsBox.SelectedIndex != -1);\r\n\t\t\t_PasteSubstitutionFont.Enabled = String.IsNullOrEmpty(_copiedFont) == false;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/FontSubstitutionsEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_FontSubstitutionMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentOption/PageLabelEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class PageLabelEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tthis._PageLabelBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._SequenceColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageNumColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._LabelStyleColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._LabelPrefixColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._StartNumColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._RemovePageLabelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._AddPageLabelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._LabelStyleMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis.panel1 = new System.Windows.Forms.Panel();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PageLabelBox)).BeginInit();\r\n\t\t\tthis.panel1.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _PageLabelBox\r\n\t\t\t// \r\n\t\t\tthis._PageLabelBox.AllColumns.Add(this._SequenceColumn);\r\n\t\t\tthis._PageLabelBox.AllColumns.Add(this._PageNumColumn);\r\n\t\t\tthis._PageLabelBox.AllColumns.Add(this._LabelStyleColumn);\r\n\t\t\tthis._PageLabelBox.AllColumns.Add(this._LabelPrefixColumn);\r\n\t\t\tthis._PageLabelBox.AllColumns.Add(this._StartNumColumn);\r\n\t\t\tthis._PageLabelBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageLabelBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._PageLabelBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._SequenceColumn,\r\n            this._PageNumColumn,\r\n            this._LabelStyleColumn,\r\n            this._LabelPrefixColumn,\r\n            this._StartNumColumn});\r\n\t\t\tthis._PageLabelBox.GridLines = true;\r\n\t\t\tthis._PageLabelBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._PageLabelBox.HideSelection = false;\r\n\t\t\tthis._PageLabelBox.LabelEdit = true;\r\n\t\t\tthis._PageLabelBox.Location = new System.Drawing.Point(3, 32);\r\n\t\t\tthis._PageLabelBox.Name = \"_PageLabelBox\";\r\n\t\t\tthis._PageLabelBox.OwnerDraw = true;\r\n\t\t\tthis._PageLabelBox.ShowGroups = false;\r\n\t\t\tthis._PageLabelBox.Size = new System.Drawing.Size(432, 244);\r\n\t\t\tthis._PageLabelBox.TabIndex = 0;\r\n\t\t\tthis._PageLabelBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._PageLabelBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _SequenceColumn\r\n\t\t\t// \r\n\t\t\tthis._SequenceColumn.IsEditable = false;\r\n\t\t\tthis._SequenceColumn.Text = \"序号\";\r\n\t\t\tthis._SequenceColumn.Width = 40;\r\n\t\t\t// \r\n\t\t\t// _PageNumColumn\r\n\t\t\t// \r\n\t\t\tthis._PageNumColumn.Text = \"文档页码\";\r\n\t\t\tthis._PageNumColumn.Width = 65;\r\n\t\t\t// \r\n\t\t\t// _LabelStyleColumn\r\n\t\t\t// \r\n\t\t\tthis._LabelStyleColumn.IsEditable = false;\r\n\t\t\tthis._LabelStyleColumn.Text = \"页码样式\";\r\n\t\t\tthis._LabelStyleColumn.Width = 103;\r\n\t\t\t// \r\n\t\t\t// _LabelPrefixColumn\r\n\t\t\t// \r\n\t\t\tthis._LabelPrefixColumn.Text = \"前缀文本\";\r\n\t\t\tthis._LabelPrefixColumn.Width = 70;\r\n\t\t\t// \r\n\t\t\t// _StartNumColumn\r\n\t\t\t// \r\n\t\t\tthis._StartNumColumn.Text = \"起始号码\";\r\n\t\t\tthis._StartNumColumn.Width = 70;\r\n\t\t\t// \r\n\t\t\t// _RemovePageLabelButton\r\n\t\t\t// \r\n\t\t\tthis._RemovePageLabelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._RemovePageLabelButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._RemovePageLabelButton.Location = new System.Drawing.Point(382, 3);\r\n\t\t\tthis._RemovePageLabelButton.Name = \"_RemovePageLabelButton\";\r\n\t\t\tthis._RemovePageLabelButton.Size = new System.Drawing.Size(53, 23);\r\n\t\t\tthis._RemovePageLabelButton.TabIndex = 2;\r\n\t\t\tthis._RemovePageLabelButton.Text = \"删除\";\r\n\t\t\tthis._RemovePageLabelButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._RemovePageLabelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RemovePageLabelButton.Click += new System.EventHandler(this._RemovePageLabelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _AddPageLabelButton\r\n\t\t\t// \r\n\t\t\tthis._AddPageLabelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AddPageLabelButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddPageLabelButton.Location = new System.Drawing.Point(323, 3);\r\n\t\t\tthis._AddPageLabelButton.Name = \"_AddPageLabelButton\";\r\n\t\t\tthis._AddPageLabelButton.Size = new System.Drawing.Size(53, 23);\r\n\t\t\tthis._AddPageLabelButton.TabIndex = 1;\r\n\t\t\tthis._AddPageLabelButton.Text = \"添加\";\r\n\t\t\tthis._AddPageLabelButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._AddPageLabelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._AddPageLabelButton.Click += new System.EventHandler(this._AddPageLabelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _LabelStyleMenu\r\n\t\t\t// \r\n\t\t\tthis._LabelStyleMenu.Name = \"_LabelStyleMenu\";\r\n\t\t\tthis._LabelStyleMenu.Size = new System.Drawing.Size(61, 4);\r\n\t\t\t// \r\n\t\t\t// panel1\r\n\t\t\t// \r\n\t\t\tthis.panel1.Controls.Add(this._PageLabelBox);\r\n\t\t\tthis.panel1.Controls.Add(this._RemovePageLabelButton);\r\n\t\t\tthis.panel1.Controls.Add(this._AddPageLabelButton);\r\n\t\t\tthis.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis.panel1.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis.panel1.Name = \"panel1\";\r\n\t\t\tthis.panel1.Size = new System.Drawing.Size(438, 279);\r\n\t\t\tthis.panel1.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// PageLabelEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this.panel1);\r\n\t\t\tthis.Name = \"PageLabelEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size(438, 279);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PageLabelBox)).EndInit();\r\n\t\t\tthis.panel1.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _RemovePageLabelButton;\r\n\t\tprivate System.Windows.Forms.Button _AddPageLabelButton;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _PageLabelBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageNumColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _LabelStyleColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _LabelPrefixColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _StartNumColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SequenceColumn;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _LabelStyleMenu;\r\n\t\tprivate System.Windows.Forms.Panel panel1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/PageLabelEditor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class PageLabelEditor : UserControl\r\n\t{\r\n\t\treadonly TypedObjectListView<Model.PageLabel> _LabelBox;\r\n\t\tList<Model.PageLabel> _Labels;\r\n\r\n\t\t[Browsable(false)]\r\n\t\tpublic List<Model.PageLabel> Labels {\r\n\t\t\tget => _Labels;\r\n\t\t\tset { _Labels = value; _PageLabelBox.Objects = value; }\r\n\t\t}\r\n\r\n\t\tpublic PageLabelEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t\t_LabelBox = new TypedObjectListView<Model.PageLabel>(_PageLabelBox);\r\n\t\t\t_PageLabelBox.FormatRow += (s, args) => args.Item.SubItems[0].Text = (args.RowIndex + 1).ToText();\r\n\t\t\tnew TypedColumn<Model.PageLabel>(_PageNumColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.PageNumber,\r\n\t\t\t\tAspectPutter = (o, v) => { int i = v.ToString().ToInt32(); o.PageNumber = i > 0 ? i : 1; }\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<Model.PageLabel>(_StartNumColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.StartPage,\r\n\t\t\t\tAspectPutter = (o, v) => { int i = v.ToString().ToInt32(); o.StartPage = i > 0 ? i : 1; }\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<Model.PageLabel>(_LabelStyleColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Style ?? Constants.PageLabelStyles.Names[0]\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<Model.PageLabel>(_LabelPrefixColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Prefix,\r\n\t\t\t\tAspectPutter = (o, v) => o.Prefix = v as string\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tforeach (var item in Constants.PageLabelStyles.Names) {\r\n\t\t\t\t_LabelStyleMenu.Items.Add(item);\r\n\t\t\t}\r\n\t\t\t_PageLabelBox.FixEditControlWidth();\r\n\t\t\t_PageLabelBox.ScaleColumnWidths();\r\n\t\t\t_PageLabelBox.FullRowSelect = true;\r\n\t\t\t_PageLabelBox.LabelEdit = false;\r\n\t\t\t_PageLabelBox.CellClick += (s, args) => {\r\n\t\t\t\tif (args.Column == _LabelStyleColumn) {\r\n\t\t\t\t\tvar b = _PageLabelBox.GetSubItem(args.RowIndex, args.ColumnIndex).Bounds;\r\n\t\t\t\t\t_LabelStyleMenu.Show(_PageLabelBox, b.Left, b.Bottom);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_LabelStyleMenu.ItemClicked += (s, args) => {\r\n\t\t\t\t_LabelBox.SelectedObject.Style = args.ClickedItem.Text;\r\n\t\t\t\t_PageLabelBox.RefreshObject(_PageLabelBox.SelectedObject);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvoid _AddPageLabelButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar i = 0;\r\n\t\t\tforeach (var item in _Labels) {\r\n\t\t\t\tif (item.PageNumber > i) {\r\n\t\t\t\t\ti = item.PageNumber;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t++i;\r\n\t\t\t_Labels.Add(new Model.PageLabel() { PageNumber = i, StartPage = 1 });\r\n\t\t\t_LabelBox.Objects = _Labels;\r\n\t\t}\r\n\r\n\t\tvoid _RemovePageLabelButton_Click(object sender, EventArgs e) {\r\n\t\t\t_PageLabelBox.RemoveObjects(_PageLabelBox.SelectedObjects);\r\n\t\t\t_Labels.Clear();\r\n\t\t\t_Labels.AddRange(_LabelBox.Objects);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/PageLabelEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_LabelStyleMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DocumentOption/PageSettingsEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class PageSettingsEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tthis._RotateZeroMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._PageSettingsBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._SequenceColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageRangeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageFilterColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._SettingsColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageRangeFilterTypeMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._AllPagesMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._OddPagesMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._EvenPagesMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._PortraitPagesMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._LandscapePagesMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._PageSettingsMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._RotateMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RotateLeftMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RotateRightMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._Rotate180MenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RemoveButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._AddButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.panel1 = new System.Windows.Forms.Panel();\r\n\t\t\ttoolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PageSettingsBox)).BeginInit();\r\n\t\t\tthis._PageRangeFilterTypeMenu.SuspendLayout();\r\n\t\t\tthis._PageSettingsMenu.SuspendLayout();\r\n\t\t\tthis.panel1.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\ttoolStripSeparator1.Size = new System.Drawing.Size(138, 6);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(138, 6);\r\n\t\t\t// \r\n\t\t\t// _RotateZeroMenuItem\r\n\t\t\t// \r\n\t\t\tthis._RotateZeroMenuItem.Name = \"_RotateZeroMenuItem\";\r\n\t\t\tthis._RotateZeroMenuItem.Size = new System.Drawing.Size(149, 22);\r\n\t\t\tthis._RotateZeroMenuItem.Text = \"保持不变(&B)\";\r\n\t\t\t// \r\n\t\t\t// _PageSettingsBox\r\n\t\t\t// \r\n\t\t\tthis._PageSettingsBox.AllColumns.Add(this._SequenceColumn);\r\n\t\t\tthis._PageSettingsBox.AllColumns.Add(this._PageRangeColumn);\r\n\t\t\tthis._PageSettingsBox.AllColumns.Add(this._PageFilterColumn);\r\n\t\t\tthis._PageSettingsBox.AllColumns.Add(this._SettingsColumn);\r\n\t\t\tthis._PageSettingsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageSettingsBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._PageSettingsBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._SequenceColumn,\r\n            this._PageRangeColumn,\r\n            this._PageFilterColumn,\r\n            this._SettingsColumn});\r\n\t\t\tthis._PageSettingsBox.GridLines = true;\r\n\t\t\tthis._PageSettingsBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._PageSettingsBox.HideSelection = false;\r\n\t\t\tthis._PageSettingsBox.IsSimpleDragSource = true;\r\n\t\t\tthis._PageSettingsBox.IsSimpleDropSink = true;\r\n\t\t\tthis._PageSettingsBox.LabelEdit = true;\r\n\t\t\tthis._PageSettingsBox.Location = new System.Drawing.Point(3, 32);\r\n\t\t\tthis._PageSettingsBox.Name = \"_PageSettingsBox\";\r\n\t\t\tthis._PageSettingsBox.OwnerDraw = true;\r\n\t\t\tthis._PageSettingsBox.ShowGroups = false;\r\n\t\t\tthis._PageSettingsBox.Size = new System.Drawing.Size(432, 244);\r\n\t\t\tthis._PageSettingsBox.TabIndex = 3;\r\n\t\t\tthis._PageSettingsBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._PageSettingsBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _SequenceColumn\r\n\t\t\t// \r\n\t\t\tthis._SequenceColumn.IsEditable = false;\r\n\t\t\tthis._SequenceColumn.Text = \"序号\";\r\n\t\t\tthis._SequenceColumn.Width = 40;\r\n\t\t\t// \r\n\t\t\t// _PageRangeColumn\r\n\t\t\t// \r\n\t\t\tthis._PageRangeColumn.AspectName = \"\";\r\n\t\t\tthis._PageRangeColumn.Text = \"页码范围\";\r\n\t\t\tthis._PageRangeColumn.Width = 82;\r\n\t\t\t// \r\n\t\t\t// _PageFilterColumn\r\n\t\t\t// \r\n\t\t\tthis._PageFilterColumn.AspectName = \"\";\r\n\t\t\tthis._PageFilterColumn.IsEditable = false;\r\n\t\t\tthis._PageFilterColumn.Text = \"筛选页面\";\r\n\t\t\tthis._PageFilterColumn.Width = 61;\r\n\t\t\t// \r\n\t\t\t// _SettingsColumn\r\n\t\t\t// \r\n\t\t\tthis._SettingsColumn.IsEditable = false;\r\n\t\t\tthis._SettingsColumn.Text = \"处理方式\";\r\n\t\t\tthis._SettingsColumn.Width = 214;\r\n\t\t\t// \r\n\t\t\t// _PageRangeFilterTypeMenu\r\n\t\t\t// \r\n\t\t\tthis._PageRangeFilterTypeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AllPagesMenu,\r\n            toolStripSeparator1,\r\n            this._OddPagesMenu,\r\n            this._EvenPagesMenu,\r\n            toolStripSeparator2,\r\n            this._PortraitPagesMenu,\r\n            this._LandscapePagesMenu});\r\n\t\t\tthis._PageRangeFilterTypeMenu.Name = \"_PageRangeFilterTypeMenu\";\r\n\t\t\tthis._PageRangeFilterTypeMenu.Size = new System.Drawing.Size(142, 126);\r\n\t\t\t// \r\n\t\t\t// _AllPagesMenu\r\n\t\t\t// \r\n\t\t\tthis._AllPagesMenu.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\tthis._AllPagesMenu.Name = \"_AllPagesMenu\";\r\n\t\t\tthis._AllPagesMenu.Size = new System.Drawing.Size(141, 22);\r\n\t\t\tthis._AllPagesMenu.Text = \"所有页面(&Y)\";\r\n\t\t\t// \r\n\t\t\t// _OddPagesMenu\r\n\t\t\t// \r\n\t\t\tthis._OddPagesMenu.Image = global::PDFPatcher.Properties.Resources.OddPage;\r\n\t\t\tthis._OddPagesMenu.Name = \"_OddPagesMenu\";\r\n\t\t\tthis._OddPagesMenu.Size = new System.Drawing.Size(141, 22);\r\n\t\t\tthis._OddPagesMenu.Text = \"单数页(&D)\";\r\n\t\t\t// \r\n\t\t\t// _EvenPagesMenu\r\n\t\t\t// \r\n\t\t\tthis._EvenPagesMenu.Image = global::PDFPatcher.Properties.Resources.EvenPage;\r\n\t\t\tthis._EvenPagesMenu.Name = \"_EvenPagesMenu\";\r\n\t\t\tthis._EvenPagesMenu.Size = new System.Drawing.Size(141, 22);\r\n\t\t\tthis._EvenPagesMenu.Text = \"双数页(&S)\";\r\n\t\t\t// \r\n\t\t\t// _PortraitPagesMenu\r\n\t\t\t// \r\n\t\t\tthis._PortraitPagesMenu.Image = global::PDFPatcher.Properties.Resources.Portrait;\r\n\t\t\tthis._PortraitPagesMenu.Name = \"_PortraitPagesMenu\";\r\n\t\t\tthis._PortraitPagesMenu.Size = new System.Drawing.Size(141, 22);\r\n\t\t\tthis._PortraitPagesMenu.Text = \"纵向页面(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _LandscapePagesMenu\r\n\t\t\t// \r\n\t\t\tthis._LandscapePagesMenu.Image = global::PDFPatcher.Properties.Resources.Lanscape;\r\n\t\t\tthis._LandscapePagesMenu.Name = \"_LandscapePagesMenu\";\r\n\t\t\tthis._LandscapePagesMenu.Size = new System.Drawing.Size(141, 22);\r\n\t\t\tthis._LandscapePagesMenu.Text = \"横向页面(&H)\";\r\n\t\t\t// \r\n\t\t\t// _PageSettingsMenu\r\n\t\t\t// \r\n\t\t\tthis._PageSettingsMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._RotateMenu});\r\n\t\t\tthis._PageSettingsMenu.Name = \"_PageSettingsMenu\";\r\n\t\t\tthis._PageSettingsMenu.Size = new System.Drawing.Size(141, 26);\r\n\t\t\t// \r\n\t\t\t// _RotateMenu\r\n\t\t\t// \r\n\t\t\tthis._RotateMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._RotateZeroMenuItem,\r\n            this._RotateLeftMenuItem,\r\n            this._RotateRightMenuItem,\r\n            this._Rotate180MenuItem});\r\n\t\t\tthis._RotateMenu.Name = \"_RotateMenu\";\r\n\t\t\tthis._RotateMenu.Size = new System.Drawing.Size(140, 22);\r\n\t\t\tthis._RotateMenu.Text = \"旋转页面(&X)\";\r\n\t\t\t// \r\n\t\t\t// _RotateLeftMenuItem\r\n\t\t\t// \r\n\t\t\tthis._RotateLeftMenuItem.Image = global::PDFPatcher.Properties.Resources.RotateLeft;\r\n\t\t\tthis._RotateLeftMenuItem.Name = \"_RotateLeftMenuItem\";\r\n\t\t\tthis._RotateLeftMenuItem.Size = new System.Drawing.Size(149, 22);\r\n\t\t\tthis._RotateLeftMenuItem.Text = \"左转 90 度(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _RotateRightMenuItem\r\n\t\t\t// \r\n\t\t\tthis._RotateRightMenuItem.Image = global::PDFPatcher.Properties.Resources.RotateRight;\r\n\t\t\tthis._RotateRightMenuItem.Name = \"_RotateRightMenuItem\";\r\n\t\t\tthis._RotateRightMenuItem.Size = new System.Drawing.Size(149, 22);\r\n\t\t\tthis._RotateRightMenuItem.Text = \"右转 90 度(&Y)\";\r\n\t\t\t// \r\n\t\t\t// _Rotate180MenuItem\r\n\t\t\t// \r\n\t\t\tthis._Rotate180MenuItem.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\tthis._Rotate180MenuItem.Name = \"_Rotate180MenuItem\";\r\n\t\t\tthis._Rotate180MenuItem.Size = new System.Drawing.Size(149, 22);\r\n\t\t\tthis._Rotate180MenuItem.Text = \"旋转 180 度\";\r\n\t\t\t// \r\n\t\t\t// _RemoveButton\r\n\t\t\t// \r\n\t\t\tthis._RemoveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._RemoveButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._RemoveButton.Location = new System.Drawing.Point(382, 3);\r\n\t\t\tthis._RemoveButton.Name = \"_RemoveButton\";\r\n\t\t\tthis._RemoveButton.Size = new System.Drawing.Size(53, 23);\r\n\t\t\tthis._RemoveButton.TabIndex = 5;\r\n\t\t\tthis._RemoveButton.Text = \"删除\";\r\n\t\t\tthis._RemoveButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._RemoveButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RemoveButton.Click += new System.EventHandler(this._RemovePageSettingsButton_Click);\r\n\t\t\t// \r\n\t\t\t// _AddButton\r\n\t\t\t// \r\n\t\t\tthis._AddButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AddButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddButton.Location = new System.Drawing.Point(323, 3);\r\n\t\t\tthis._AddButton.Name = \"_AddButton\";\r\n\t\t\tthis._AddButton.Size = new System.Drawing.Size(53, 23);\r\n\t\t\tthis._AddButton.TabIndex = 4;\r\n\t\t\tthis._AddButton.Text = \"添加\";\r\n\t\t\tthis._AddButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._AddButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._AddButton.Click += new System.EventHandler(this._AddPageSettingsButton_Click);\r\n\t\t\t// \r\n\t\t\t// panel1\r\n\t\t\t// \r\n\t\t\tthis.panel1.Controls.Add(this._PageSettingsBox);\r\n\t\t\tthis.panel1.Controls.Add(this._AddButton);\r\n\t\t\tthis.panel1.Controls.Add(this._RemoveButton);\r\n\t\t\tthis.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis.panel1.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis.panel1.Name = \"panel1\";\r\n\t\t\tthis.panel1.Size = new System.Drawing.Size(438, 279);\r\n\t\t\tthis.panel1.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// PageSettingsEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this.panel1);\r\n\t\t\tthis.Name = \"PageSettingsEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size(438, 279);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PageSettingsBox)).EndInit();\r\n\t\t\tthis._PageRangeFilterTypeMenu.ResumeLayout(false);\r\n\t\t\tthis._PageSettingsMenu.ResumeLayout(false);\r\n\t\t\tthis.panel1.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _RemoveButton;\r\n\t\tprivate System.Windows.Forms.Button _AddButton;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _PageSettingsBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SequenceColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageRangeColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageFilterColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SettingsColumn;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _PageRangeFilterTypeMenu;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _PageSettingsMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _RotateMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _AllPagesMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _OddPagesMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _EvenPagesMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _LandscapePagesMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _PortraitPagesMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _RotateZeroMenuItem;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _RotateLeftMenuItem;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _RotateRightMenuItem;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _Rotate180MenuItem;\r\n\t\tprivate System.Windows.Forms.Panel panel1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/PageSettingsEditor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Data;\r\nusing System.Drawing;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class PageSettingsEditor : UserControl\r\n\t{\r\n\t\treadonly TypedObjectListView<PageBoxSettings> _SettingsBox;\r\n\t\tprivate List<PageBoxSettings> _Settings;\r\n\t\t[Browsable(false)]\r\n\t\tpublic List<PageBoxSettings> Settings {\r\n\t\t\tget => _Settings;\r\n\t\t\tset { _Settings = value; _SettingsBox.Objects = value; }\r\n\t\t}\r\n\r\n\t\tpublic PageSettingsEditor() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t\t_SettingsBox = new TypedObjectListView<PageBoxSettings>(_PageSettingsBox);\r\n\t\t\tnew TypedColumn<PageBoxSettings>(_PageFilterColumn) {\r\n\t\t\t\tAspectGetter = (o) => {\r\n\t\t\t\t\tvar f = o.Filter;\r\n\t\t\t\t\tvar eo = f & (PageFilterFlag.Even | PageFilterFlag.Odd);\r\n\t\t\t\t\tvar pl = f & (PageFilterFlag.Landscape | PageFilterFlag.Portrait);\r\n\t\t\t\t\treturn f == PageFilterFlag.NotSpecified ? \"所有页面\"\r\n\t\t\t\t\t\t: String.Concat(\r\n\t\t\t\t\t\t\teo == PageFilterFlag.Odd ? \"单数\"\r\n\t\t\t\t\t\t\t: eo == PageFilterFlag.Even ? \"双数\"\r\n\t\t\t\t\t\t\t: String.Empty,\r\n\t\t\t\t\t\t\tpl == PageFilterFlag.Landscape ? \"横向\"\r\n\t\t\t\t\t\t\t: pl == PageFilterFlag.Portrait ? \"纵向\"\r\n\t\t\t\t\t\t\t: String.Empty,\r\n\t\t\t\t\t\t\t\"页\");\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<PageBoxSettings>(_SettingsColumn) {\r\n\t\t\t\tAspectGetter = (o) => {\r\n\t\t\t\t\tvar r = o.Rotation;\r\n\t\t\t\t\treturn String.Concat(\r\n\t\t\t\t\t\t\tr == 0 ? Constants.Content.RotationDirections.Zero\r\n\t\t\t\t\t\t\t: r == 90 ? Constants.Content.RotationDirections.Right\r\n\t\t\t\t\t\t\t: r == 180 ? Constants.Content.RotationDirections.HalfClock\r\n\t\t\t\t\t\t\t: r == 270 ? Constants.Content.RotationDirections.Left\r\n\t\t\t\t\t\t\t: Constants.Content.RotationDirections.Zero\r\n\t\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<PageBoxSettings>(_PageRangeColumn) {\r\n\t\t\t\tAspectGetter = (o) => String.IsNullOrEmpty(o.PageRanges) ? Constants.PageFilterTypes.AllPages : o.PageRanges,\r\n\t\t\t\tAspectPutter = (o, v) => {\r\n\t\t\t\t\tvar s = v as string;\r\n\t\t\t\t\to.PageRanges = s != Constants.PageFilterTypes.AllPages ? s : null;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_PageSettingsBox.FormatRow += (s, args) => args.Item.SubItems[0].Text = (args.RowIndex + 1).ToText();\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_PageSettingsBox.FixEditControlWidth();\r\n\t\t\t_PageSettingsBox.ScaleColumnWidths();\r\n\t\t\t_PageSettingsBox.FullRowSelect = true;\r\n\t\t\t_PageSettingsBox.LabelEdit = false;\r\n\t\t\t_PageSettingsBox.CellClick += (s, args) => {\r\n\t\t\t\tif (args.Column == _PageFilterColumn) {\r\n\t\t\t\t\tShowMenuForClickedCell(args, _PageRangeFilterTypeMenu);\r\n\t\t\t\t}\r\n\t\t\t\telse if (args.Column == _SettingsColumn) {\r\n\t\t\t\t\tShowMenuForClickedCell(args, _PageSettingsMenu);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_PageRangeFilterTypeMenu.Opening += (s, args) => {\r\n\t\t\t\tvar f = _SettingsBox.SelectedObject.Filter;\r\n\t\t\t\t_AllPagesMenu.Checked = f == PageFilterFlag.All || f == PageFilterFlag.NotSpecified;\r\n\t\t\t\t_OddPagesMenu.Checked = (f & PageFilterFlag.Odd) == PageFilterFlag.Odd;\r\n\t\t\t\t_EvenPagesMenu.Checked = (f & PageFilterFlag.Even) == PageFilterFlag.Even;\r\n\t\t\t\t_PortraitPagesMenu.Checked = (f & PageFilterFlag.Portrait) == PageFilterFlag.Portrait;\r\n\t\t\t\t_LandscapePagesMenu.Checked = (f & PageFilterFlag.Landscape) == PageFilterFlag.Landscape;\r\n\t\t\t};\r\n\t\t\t_PageRangeFilterTypeMenu.ItemClicked += (s, args) => {\r\n\t\t\t\tvar o = _SettingsBox.SelectedObject;\r\n\t\t\t\tvar i = args.ClickedItem;\r\n\t\t\t\tif (_AllPagesMenu == i) {\r\n\t\t\t\t\to.Filter = PageFilterFlag.NotSpecified;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_OddPagesMenu == i) {\r\n\t\t\t\t\to.Filter &= ~PageFilterFlag.Even;\r\n\t\t\t\t\to.Filter ^= PageFilterFlag.Odd;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_EvenPagesMenu == i) {\r\n\t\t\t\t\to.Filter &= ~PageFilterFlag.Odd;\r\n\t\t\t\t\to.Filter ^= PageFilterFlag.Even;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_LandscapePagesMenu == i) {\r\n\t\t\t\t\to.Filter &= ~PageFilterFlag.Portrait;\r\n\t\t\t\t\to.Filter ^= PageFilterFlag.Landscape;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_PortraitPagesMenu == i) {\r\n\t\t\t\t\to.Filter &= ~PageFilterFlag.Landscape;\r\n\t\t\t\t\to.Filter ^= PageFilterFlag.Portrait;\r\n\t\t\t\t}\r\n\t\t\t\tif (o.Filter == PageFilterFlag.All) {\r\n\t\t\t\t\to.Filter = PageFilterFlag.NotSpecified;\r\n\t\t\t\t}\r\n\t\t\t\t_PageSettingsBox.RefreshObject(_PageSettingsBox.SelectedObject);\r\n\t\t\t};\r\n\t\t\t_RotateMenu.DropDownOpening += (s, args) => {\r\n\t\t\t\tvar r = _SettingsBox.SelectedObject.Rotation;\r\n\t\t\t\tforeach (ToolStripMenuItem item in _RotateMenu.DropDownItems) {\r\n\t\t\t\t\titem.Checked = false;\r\n\t\t\t\t}\r\n\t\t\t\tswitch (r) {\r\n\t\t\t\t\tcase 0: _RotateZeroMenuItem.Checked = true; break;\r\n\t\t\t\t\tcase 90: _RotateRightMenuItem.Checked = true; break;\r\n\t\t\t\t\tcase 180: _Rotate180MenuItem.Checked = true; break;\r\n\t\t\t\t\tcase 270: _RotateLeftMenuItem.Checked = true; break;\r\n\t\t\t\t\tdefault: _RotateZeroMenuItem.Checked = true; break;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_RotateMenu.DropDownItemClicked += (s, args) => {\r\n\t\t\t\tvar o = _SettingsBox.SelectedObject;\r\n\t\t\t\tvar i = args.ClickedItem;\r\n\t\t\t\tif (_RotateZeroMenuItem == i) {\r\n\t\t\t\t\to.Rotation = 0;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_RotateRightMenuItem == i) {\r\n\t\t\t\t\to.Rotation = 90;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_RotateLeftMenuItem == i) {\r\n\t\t\t\t\to.Rotation = 270;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_Rotate180MenuItem == i) {\r\n\t\t\t\t\to.Rotation = 180;\r\n\t\t\t\t}\r\n\t\t\t\t_PageSettingsBox.RefreshObject(o);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tprivate void ShowMenuForClickedCell(CellClickEventArgs args, ContextMenuStrip menu) {\r\n\t\t\tvar b = _PageSettingsBox.GetSubItem(args.RowIndex, args.ColumnIndex).Bounds;\r\n\t\t\tmenu.Show(_PageSettingsBox, b.Left, b.Bottom);\r\n\t\t}\r\n\r\n\t\tprivate void _AddPageSettingsButton_Click(object sender, EventArgs e) {\r\n\t\t\t_Settings.Add(new PageBoxSettings());\r\n\t\t\t_SettingsBox.Objects = _Settings;\r\n\t\t}\r\n\r\n\t\tprivate void _RemovePageSettingsButton_Click(object sender, EventArgs e) {\r\n\t\t\t_PageSettingsBox.RemoveObjects(_PageSettingsBox.SelectedObjects);\r\n\t\t\t_Settings.Clear();\r\n\t\t\t_Settings.AddRange(_SettingsBox.Objects);\r\n\t\t}\r\n\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/DocumentOption/PageSettingsEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"toolStripSeparator1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_PageRangeFilterTypeMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_PageSettingsMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>220, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/DraggableForm.cs",
    "content": "﻿using System;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic class DraggableForm : Form\r\n\t{\r\n\t\tprotected override void OnMouseDown(MouseEventArgs args) {\r\n\t\t\tif (args.Button == MouseButtons.Left) {\r\n\t\t\t\tNativeMethods.ReleaseCapture();\r\n\t\t\t\tNativeMethods.SendMessage(Handle, 0xa1, (IntPtr)0x2, (IntPtr)0);\r\n\t\t\t}\r\n\t\t\tbase.OnMouseMove(args);\r\n\t\t}\r\n\r\n\t\tstatic class NativeMethods\r\n\t\t{\r\n\t\t\t#region Form Dragging API Support\r\n\t\t\t//The SendMessage function sends a message to a window or windows.\r\n\t\t\t[DllImport(\"user32.dll\", SetLastError = false)]\r\n\t\t\tinternal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);\r\n\r\n\t\t\t//ReleaseCapture releases a mouse capture\r\n\t\t\t[DllImport(\"user32.dll\", SetLastError = false)]\r\n\t\t\tinternal static extern bool ReleaseCapture();\r\n\t\t\t#endregion\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/ActionEditorForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ActionEditorForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager (typeof (ActionEditorForm));\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._DestinationPanel = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis._PathPanel = new System.Windows.Forms.Panel ();\r\n\t\t\tthis._PathBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._NewWindowBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._NamedBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis._GotoNamedDestBox = new System.Windows.Forms.RadioButton ();\r\n\t\t\tthis._GotoLocationBox = new System.Windows.Forms.RadioButton ();\r\n\t\t\tthis._LocationPanel = new System.Windows.Forms.Panel ();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._KeepYBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._PageBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._KeepXBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._ZoomRateBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis._LeftBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._TopBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._RectanglePanel = new System.Windows.Forms.Panel ();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._WidthBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._HeightBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._ActionBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._TitleBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl ();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage ();\r\n\t\t\tthis._DefaultOpenBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._ScriptBox = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis._ScriptContentBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage ();\r\n\t\t\tthis._AttributesBox = new BrightIdeasSoftware.ObjectListView ();\r\n\t\t\tthis._AttrNameColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._AttrValueColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._DestinationPanel.SuspendLayout ();\r\n\t\t\tthis._PathPanel.SuspendLayout ();\r\n\t\t\tthis._LocationPanel.SuspendLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PageBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopBox)).BeginInit ();\r\n\t\t\tthis._RectanglePanel.SuspendLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._WidthBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._HeightBox)).BeginInit ();\r\n\t\t\tthis.tabControl1.SuspendLayout ();\r\n\t\t\tthis.tabPage1.SuspendLayout ();\r\n\t\t\tthis._ScriptBox.SuspendLayout ();\r\n\t\t\tthis.tabPage2.SuspendLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._AttributesBox)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point (293, 348);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 0;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler (this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point (374, 348);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 1;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler (this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _DestinationPanel\r\n\t\t\t// \r\n\t\t\tthis._DestinationPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._DestinationPanel.Controls.Add (this._PathPanel);\r\n\t\t\tthis._DestinationPanel.Controls.Add (this._NamedBox);\r\n\t\t\tthis._DestinationPanel.Controls.Add (this._GotoNamedDestBox);\r\n\t\t\tthis._DestinationPanel.Controls.Add (this._GotoLocationBox);\r\n\t\t\tthis._DestinationPanel.Controls.Add (this._LocationPanel);\r\n\t\t\tthis._DestinationPanel.Location = new System.Drawing.Point (6, 61);\r\n\t\t\tthis._DestinationPanel.Name = \"_DestinationPanel\";\r\n\t\t\tthis._DestinationPanel.Size = new System.Drawing.Size (417, 238);\r\n\t\t\tthis._DestinationPanel.TabIndex = 7;\r\n\t\t\tthis._DestinationPanel.TabStop = false;\r\n\t\t\tthis._DestinationPanel.Text = \"目标\";\r\n\t\t\t// \r\n\t\t\t// _PathPanel\r\n\t\t\t// \r\n\t\t\tthis._PathPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PathPanel.Controls.Add (this._PathBox);\r\n\t\t\tthis._PathPanel.Controls.Add (this.label4);\r\n\t\t\tthis._PathPanel.Controls.Add (this._NewWindowBox);\r\n\t\t\tthis._PathPanel.Enabled = false;\r\n\t\t\tthis._PathPanel.Location = new System.Drawing.Point (5, 185);\r\n\t\t\tthis._PathPanel.Name = \"_PathPanel\";\r\n\t\t\tthis._PathPanel.Size = new System.Drawing.Size (406, 47);\r\n\t\t\tthis._PathPanel.TabIndex = 15;\r\n\t\t\t// \r\n\t\t\t// _PathBox\r\n\t\t\t// \r\n\t\t\tthis._PathBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PathBox.Location = new System.Drawing.Point (105, 3);\r\n\t\t\tthis._PathBox.Name = \"_PathBox\";\r\n\t\t\tthis._PathBox.Size = new System.Drawing.Size (298, 21);\r\n\t\t\tthis._PathBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point (13, 6);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size (89, 12);\r\n\t\t\tthis.label4.TabIndex = 2;\r\n\t\t\tthis.label4.Text = \"外部文档路径：\";\r\n\t\t\t// \r\n\t\t\t// _NewWindowBox\r\n\t\t\t// \r\n\t\t\tthis._NewWindowBox.AutoSize = true;\r\n\t\t\tthis._NewWindowBox.Location = new System.Drawing.Point (105, 30);\r\n\t\t\tthis._NewWindowBox.Name = \"_NewWindowBox\";\r\n\t\t\tthis._NewWindowBox.Size = new System.Drawing.Size (96, 16);\r\n\t\t\tthis._NewWindowBox.TabIndex = 4;\r\n\t\t\tthis._NewWindowBox.Text = \"在新窗口打开\";\r\n\t\t\tthis._NewWindowBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _NamedBox\r\n\t\t\t// \r\n\t\t\tthis._NamedBox.Enabled = false;\r\n\t\t\tthis._NamedBox.Location = new System.Drawing.Point (110, 158);\r\n\t\t\tthis._NamedBox.Name = \"_NamedBox\";\r\n\t\t\tthis._NamedBox.Size = new System.Drawing.Size (215, 21);\r\n\t\t\tthis._NamedBox.TabIndex = 14;\r\n\t\t\t// \r\n\t\t\t// _GotoNamedDestBox\r\n\t\t\t// \r\n\t\t\tthis._GotoNamedDestBox.AutoSize = true;\r\n\t\t\tthis._GotoNamedDestBox.Location = new System.Drawing.Point (9, 159);\r\n\t\t\tthis._GotoNamedDestBox.Name = \"_GotoNamedDestBox\";\r\n\t\t\tthis._GotoNamedDestBox.Size = new System.Drawing.Size (95, 16);\r\n\t\t\tthis._GotoNamedDestBox.TabIndex = 13;\r\n\t\t\tthis._GotoNamedDestBox.TabStop = true;\r\n\t\t\tthis._GotoNamedDestBox.Text = \"转到命名位置\";\r\n\t\t\tthis._GotoNamedDestBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._GotoNamedDestBox.CheckedChanged += new System.EventHandler (this.Control_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _GotoLocationBox\r\n\t\t\t// \r\n\t\t\tthis._GotoLocationBox.AutoSize = true;\r\n\t\t\tthis._GotoLocationBox.Location = new System.Drawing.Point (6, 20);\r\n\t\t\tthis._GotoLocationBox.Name = \"_GotoLocationBox\";\r\n\t\t\tthis._GotoLocationBox.Size = new System.Drawing.Size (95, 16);\r\n\t\t\tthis._GotoLocationBox.TabIndex = 12;\r\n\t\t\tthis._GotoLocationBox.TabStop = true;\r\n\t\t\tthis._GotoLocationBox.Text = \"转到指定位置\";\r\n\t\t\tthis._GotoLocationBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._GotoLocationBox.CheckedChanged += new System.EventHandler (this.Control_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _LocationPanel\r\n\t\t\t// \r\n\t\t\tthis._LocationPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._LocationPanel.Controls.Add (this.label10);\r\n\t\t\tthis._LocationPanel.Controls.Add (this.label3);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._KeepYBox);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._PageBox);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._KeepXBox);\r\n\t\t\tthis._LocationPanel.Controls.Add (this.label5);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._ZoomRateBox);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._LeftBox);\r\n\t\t\tthis._LocationPanel.Controls.Add (this.label7);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._TopBox);\r\n\t\t\tthis._LocationPanel.Controls.Add (this.label6);\r\n\t\t\tthis._LocationPanel.Controls.Add (this._RectanglePanel);\r\n\t\t\tthis._LocationPanel.Enabled = false;\r\n\t\t\tthis._LocationPanel.Location = new System.Drawing.Point (39, 42);\r\n\t\t\tthis._LocationPanel.Name = \"_LocationPanel\";\r\n\t\t\tthis._LocationPanel.Size = new System.Drawing.Size (372, 110);\r\n\t\t\tthis._LocationPanel.TabIndex = 11;\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point (173, 86);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size (95, 12);\r\n\t\t\tthis.label10.TabIndex = 11;\r\n\t\t\tthis.label10.Text = \"（0：保持不变）\";\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point (0, 5);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"目标页面：\";\r\n\t\t\t// \r\n\t\t\t// _KeepYBox\r\n\t\t\t// \r\n\t\t\tthis._KeepYBox.AutoSize = true;\r\n\t\t\tthis._KeepYBox.Location = new System.Drawing.Point (145, 57);\r\n\t\t\tthis._KeepYBox.Name = \"_KeepYBox\";\r\n\t\t\tthis._KeepYBox.Size = new System.Drawing.Size (48, 16);\r\n\t\t\tthis._KeepYBox.TabIndex = 7;\r\n\t\t\tthis._KeepYBox.Text = \"默认\";\r\n\t\t\tthis._KeepYBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._KeepYBox.CheckedChanged += new System.EventHandler (this.Control_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _PageBox\r\n\t\t\t// \r\n\t\t\tthis._PageBox.Location = new System.Drawing.Point (71, 3);\r\n\t\t\tthis._PageBox.Maximum = new decimal (new int[] {\r\n            9999999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._PageBox.Minimum = new decimal (new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._PageBox.Name = \"_PageBox\";\r\n\t\t\tthis._PageBox.Size = new System.Drawing.Size (68, 21);\r\n\t\t\tthis._PageBox.TabIndex = 1;\r\n\t\t\tthis._PageBox.Value = new decimal (new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\t// \r\n\t\t\t// _KeepXBox\r\n\t\t\t// \r\n\t\t\tthis._KeepXBox.AutoSize = true;\r\n\t\t\tthis._KeepXBox.Location = new System.Drawing.Point (145, 30);\r\n\t\t\tthis._KeepXBox.Name = \"_KeepXBox\";\r\n\t\t\tthis._KeepXBox.Size = new System.Drawing.Size (48, 16);\r\n\t\t\tthis._KeepXBox.TabIndex = 4;\r\n\t\t\tthis._KeepXBox.Text = \"默认\";\r\n\t\t\tthis._KeepXBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._KeepXBox.CheckedChanged += new System.EventHandler (this.Control_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point (12, 31);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size (53, 12);\r\n\t\t\tthis.label5.TabIndex = 2;\r\n\t\t\tthis.label5.Text = \"横坐标：\";\r\n\t\t\t// \r\n\t\t\t// _ZoomRateBox\r\n\t\t\t// \r\n\t\t\tthis._ZoomRateBox.FormattingEnabled = true;\r\n\t\t\tthis._ZoomRateBox.Location = new System.Drawing.Point (71, 83);\r\n\t\t\tthis._ZoomRateBox.Name = \"_ZoomRateBox\";\r\n\t\t\tthis._ZoomRateBox.Size = new System.Drawing.Size (96, 20);\r\n\t\t\tthis._ZoomRateBox.TabIndex = 10;\r\n\t\t\tthis._ZoomRateBox.SelectedIndexChanged += new System.EventHandler (this.Control_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _LeftBox\r\n\t\t\t// \r\n\t\t\tthis._LeftBox.DecimalPlaces = 2;\r\n\t\t\tthis._LeftBox.Location = new System.Drawing.Point (71, 29);\r\n\t\t\tthis._LeftBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftBox.Minimum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._LeftBox.Name = \"_LeftBox\";\r\n\t\t\tthis._LeftBox.Size = new System.Drawing.Size (68, 21);\r\n\t\t\tthis._LeftBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point (2, 86);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label7.TabIndex = 9;\r\n\t\t\tthis.label7.Text = \"缩放比例：\";\r\n\t\t\t// \r\n\t\t\t// _TopBox\r\n\t\t\t// \r\n\t\t\tthis._TopBox.DecimalPlaces = 2;\r\n\t\t\tthis._TopBox.Location = new System.Drawing.Point (71, 56);\r\n\t\t\tthis._TopBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopBox.Minimum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._TopBox.Name = \"_TopBox\";\r\n\t\t\tthis._TopBox.Size = new System.Drawing.Size (68, 21);\r\n\t\t\tthis._TopBox.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point (12, 58);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size (53, 12);\r\n\t\t\tthis.label6.TabIndex = 5;\r\n\t\t\tthis.label6.Text = \"纵坐标：\";\r\n\t\t\t// \r\n\t\t\t// _RectanglePanel\r\n\t\t\t// \r\n\t\t\tthis._RectanglePanel.Controls.Add (this.label8);\r\n\t\t\tthis._RectanglePanel.Controls.Add (this._WidthBox);\r\n\t\t\tthis._RectanglePanel.Controls.Add (this.label9);\r\n\t\t\tthis._RectanglePanel.Controls.Add (this._HeightBox);\r\n\t\t\tthis._RectanglePanel.Enabled = false;\r\n\t\t\tthis._RectanglePanel.Location = new System.Drawing.Point (229, 27);\r\n\t\t\tthis._RectanglePanel.Name = \"_RectanglePanel\";\r\n\t\t\tthis._RectanglePanel.Size = new System.Drawing.Size (128, 56);\r\n\t\t\tthis._RectanglePanel.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point (3, 4);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label8.TabIndex = 0;\r\n\t\t\tthis.label8.Text = \"宽度：\";\r\n\t\t\t// \r\n\t\t\t// _WidthBox\r\n\t\t\t// \r\n\t\t\tthis._WidthBox.DecimalPlaces = 2;\r\n\t\t\tthis._WidthBox.Location = new System.Drawing.Point (54, 2);\r\n\t\t\tthis._WidthBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._WidthBox.Name = \"_WidthBox\";\r\n\t\t\tthis._WidthBox.Size = new System.Drawing.Size (68, 21);\r\n\t\t\tthis._WidthBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point (3, 31);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label9.TabIndex = 2;\r\n\t\t\tthis.label9.Text = \"高度：\";\r\n\t\t\t// \r\n\t\t\t// _HeightBox\r\n\t\t\t// \r\n\t\t\tthis._HeightBox.DecimalPlaces = 2;\r\n\t\t\tthis._HeightBox.Location = new System.Drawing.Point (54, 29);\r\n\t\t\tthis._HeightBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._HeightBox.Name = \"_HeightBox\";\r\n\t\t\tthis._HeightBox.Size = new System.Drawing.Size (68, 21);\r\n\t\t\tthis._HeightBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _ActionBox\r\n\t\t\t// \r\n\t\t\tthis._ActionBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ActionBox.FormattingEnabled = true;\r\n\t\t\tthis._ActionBox.Location = new System.Drawing.Point (49, 35);\r\n\t\t\tthis._ActionBox.Name = \"_ActionBox\";\r\n\t\t\tthis._ActionBox.Size = new System.Drawing.Size (156, 20);\r\n\t\t\tthis._ActionBox.TabIndex = 6;\r\n\t\t\tthis._ActionBox.SelectedIndexChanged += new System.EventHandler (this.Control_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point (6, 38);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label2.TabIndex = 5;\r\n\t\t\tthis.label2.Text = \"动作：\";\r\n\t\t\t// \r\n\t\t\t// _TitleBox\r\n\t\t\t// \r\n\t\t\tthis._TitleBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TitleBox.Location = new System.Drawing.Point (49, 10);\r\n\t\t\tthis._TitleBox.Name = \"_TitleBox\";\r\n\t\t\tthis._TitleBox.Size = new System.Drawing.Size (374, 21);\r\n\t\t\tthis._TitleBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (6, 13);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (41, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"名称：\";\r\n\t\t\t// \r\n\t\t\t// tabControl1\r\n\t\t\t// \r\n\t\t\tthis.tabControl1.Controls.Add (this.tabPage1);\r\n\t\t\tthis.tabControl1.Controls.Add (this.tabPage2);\r\n\t\t\tthis.tabControl1.Location = new System.Drawing.Point (12, 12);\r\n\t\t\tthis.tabControl1.Name = \"tabControl1\";\r\n\t\t\tthis.tabControl1.SelectedIndex = 0;\r\n\t\t\tthis.tabControl1.Size = new System.Drawing.Size (437, 330);\r\n\t\t\tthis.tabControl1.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add (this._DefaultOpenBox);\r\n\t\t\tthis.tabPage1.Controls.Add (this._TitleBox);\r\n\t\t\tthis.tabPage1.Controls.Add (this.label2);\r\n\t\t\tthis.tabPage1.Controls.Add (this.label1);\r\n\t\t\tthis.tabPage1.Controls.Add (this._ActionBox);\r\n\t\t\tthis.tabPage1.Controls.Add (this._DestinationPanel);\r\n\t\t\tthis.tabPage1.Controls.Add (this._ScriptBox);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point (4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding (3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size (429, 304);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"常规\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DefaultOpenBox\r\n\t\t\t// \r\n\t\t\tthis._DefaultOpenBox.AutoSize = true;\r\n\t\t\tthis._DefaultOpenBox.Location = new System.Drawing.Point (211, 37);\r\n\t\t\tthis._DefaultOpenBox.Name = \"_DefaultOpenBox\";\r\n\t\t\tthis._DefaultOpenBox.Size = new System.Drawing.Size (96, 16);\r\n\t\t\tthis._DefaultOpenBox.TabIndex = 9;\r\n\t\t\tthis._DefaultOpenBox.Text = \"默认打开书签\";\r\n\t\t\tthis._DefaultOpenBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ScriptBox\r\n\t\t\t// \r\n\t\t\tthis._ScriptBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ScriptBox.Controls.Add (this._ScriptContentBox);\r\n\t\t\tthis._ScriptBox.Location = new System.Drawing.Point (348, 37);\r\n\t\t\tthis._ScriptBox.Name = \"_ScriptBox\";\r\n\t\t\tthis._ScriptBox.Size = new System.Drawing.Size (75, 49);\r\n\t\t\tthis._ScriptBox.TabIndex = 8;\r\n\t\t\tthis._ScriptBox.TabStop = false;\r\n\t\t\tthis._ScriptBox.Text = \"脚本内容\";\r\n\t\t\tthis._ScriptBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _ScriptContentBox\r\n\t\t\t// \r\n\t\t\tthis._ScriptContentBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ScriptContentBox.Location = new System.Drawing.Point (6, 20);\r\n\t\t\tthis._ScriptContentBox.Multiline = true;\r\n\t\t\tthis._ScriptContentBox.Name = \"_ScriptContentBox\";\r\n\t\t\tthis._ScriptContentBox.Size = new System.Drawing.Size (63, 23);\r\n\t\t\tthis._ScriptContentBox.TabIndex = 16;\r\n\t\t\t// \r\n\t\t\t// tabPage2\r\n\t\t\t// \r\n\t\t\tthis.tabPage2.Controls.Add (this._AttributesBox);\r\n\t\t\tthis.tabPage2.Location = new System.Drawing.Point (4, 22);\r\n\t\t\tthis.tabPage2.Name = \"tabPage2\";\r\n\t\t\tthis.tabPage2.Padding = new System.Windows.Forms.Padding (3);\r\n\t\t\tthis.tabPage2.Size = new System.Drawing.Size (429, 304);\r\n\t\t\tthis.tabPage2.TabIndex = 1;\r\n\t\t\tthis.tabPage2.Text = \"属性\";\r\n\t\t\tthis.tabPage2.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AttributesBox\r\n\t\t\t// \r\n\t\t\tthis._AttributesBox.AllColumns.Add (this._AttrNameColumn);\r\n\t\t\tthis._AttributesBox.AllColumns.Add (this._AttrValueColumn);\r\n\t\t\tthis._AttributesBox.Columns.AddRange (new System.Windows.Forms.ColumnHeader[] {\r\n            this._AttrNameColumn,\r\n            this._AttrValueColumn});\r\n\t\t\tthis._AttributesBox.GridLines = true;\r\n\t\t\tthis._AttributesBox.Location = new System.Drawing.Point (6, 6);\r\n\t\t\tthis._AttributesBox.Name = \"_AttributesBox\";\r\n\t\t\tthis._AttributesBox.ShowGroups = false;\r\n\t\t\tthis._AttributesBox.Size = new System.Drawing.Size (417, 293);\r\n\t\t\tthis._AttributesBox.TabIndex = 0;\r\n\t\t\tthis._AttributesBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._AttributesBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _AttrNameColumn\r\n\t\t\t// \r\n\t\t\tthis._AttrNameColumn.Text = \"属性名称\";\r\n\t\t\t// \r\n\t\t\t// _AttrValueColumn\r\n\t\t\t// \r\n\t\t\tthis._AttrValueColumn.FillsFreeSpace = true;\r\n\t\t\tthis._AttrValueColumn.Text = \"属性值\";\r\n\t\t\t// \r\n\t\t\t// ActionEditorForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (461, 383);\r\n\t\t\tthis.Controls.Add (this._CancelButton);\r\n\t\t\tthis.Controls.Add (this._OkButton);\r\n\t\t\tthis.Controls.Add (this.tabControl1);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject (\"$this.Icon\")));\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"ActionEditorForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.Text = \"链接属性编辑器\";\r\n\t\t\tthis._DestinationPanel.ResumeLayout (false);\r\n\t\t\tthis._DestinationPanel.PerformLayout ();\r\n\t\t\tthis._PathPanel.ResumeLayout (false);\r\n\t\t\tthis._PathPanel.PerformLayout ();\r\n\t\t\tthis._LocationPanel.ResumeLayout (false);\r\n\t\t\tthis._LocationPanel.PerformLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PageBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopBox)).EndInit ();\r\n\t\t\tthis._RectanglePanel.ResumeLayout (false);\r\n\t\t\tthis._RectanglePanel.PerformLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._WidthBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._HeightBox)).EndInit ();\r\n\t\t\tthis.tabControl1.ResumeLayout (false);\r\n\t\t\tthis.tabPage1.ResumeLayout (false);\r\n\t\t\tthis.tabPage1.PerformLayout ();\r\n\t\t\tthis._ScriptBox.ResumeLayout (false);\r\n\t\t\tthis._ScriptBox.PerformLayout ();\r\n\t\t\tthis.tabPage2.ResumeLayout (false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._AttributesBox)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.GroupBox _DestinationPanel;\r\n\t\tprivate System.Windows.Forms.ComboBox _ActionBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _TitleBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _PageBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.CheckBox _NewWindowBox;\r\n\t\tprivate System.Windows.Forms.TextBox _PathBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepYBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepXBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _ZoomRateBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _TopBox;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _LeftBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _HeightBox;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _WidthBox;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.TextBox _NamedBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _GotoNamedDestBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _GotoLocationBox;\r\n\t\tprivate System.Windows.Forms.Panel _LocationPanel;\r\n\t\tprivate System.Windows.Forms.Panel _PathPanel;\r\n\t\tprivate System.Windows.Forms.Panel _RectanglePanel;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.TabControl tabControl1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage2;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _AttributesBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AttrNameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AttrValueColumn;\r\n\t\tprivate System.Windows.Forms.TextBox _ScriptContentBox;\r\n\t\tprivate System.Windows.Forms.GroupBox _ScriptBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _DefaultOpenBox;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/Editor/ActionEditorForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Data;\r\nusing System.Drawing;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class ActionEditorForm : System.Windows.Forms.Form\r\n\t{\r\n\t\tconst string KeepZoomRate = \"保持不变\";\r\n\t\tconst string NoAction = \"无\";\r\n\r\n\t\tpublic BookmarkElement Action { get; private set; }\r\n\t\tinternal UndoActionGroup UndoActions { get; private set; }\r\n\r\n\t\tpublic ActionEditorForm(BookmarkElement element) {\r\n\t\t\tInitializeComponent();\r\n\t\t\tAction = element;\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_ActionBox.Items.AddRange(Constants.ActionType.Names);\r\n\t\t\t_ActionBox.Items.Add(NoAction);\r\n\t\t\t_ZoomRateBox.Items.AddRange(Constants.DestinationAttributes.ViewType.Names);\r\n\t\t\t_ZoomRateBox.Items.AddRange(new string[] { \"————————\", \"4\", \"3\", \"2\", \"1.5\", \"1.3\", \"1.2\", \"1\", \"0\", \"0.9\", \"0.8\", \"0.5\", \"0.3\" });\r\n\r\n\t\t\tvar action = Action;\r\n\t\t\tint i = Array.IndexOf(Constants.ActionType.Names, action.GetAttribute(Constants.DestinationAttributes.Action));\r\n\t\t\t_ActionBox.SelectedIndex = (i != -1 ? i : 0);\r\n\t\t\tif (_ActionBox.SelectedIndex == 0 && action.HasAttribute(Constants.DestinationAttributes.Page) == false && action.HasAttribute(Constants.DestinationAttributes.Named) == false) {\r\n\t\t\t\t_ActionBox.SelectedItem = NoAction;\r\n\t\t\t\t_DestinationPanel.Enabled = false;\r\n\t\t\t}\r\n\t\t\t_DefaultOpenBox.Checked = action.IsOpen;\r\n\t\t\ti = Array.IndexOf(Constants.DestinationAttributes.ViewType.Names, action.GetAttribute(Constants.DestinationAttributes.View));\r\n\t\t\t_ZoomRateBox.SelectedIndex = (i != -1 ? i : 0);\r\n\t\t\ti = _ZoomRateBox.FindString(Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\tif (i != -1) {\r\n\t\t\t\t_ZoomRateBox.Items[i] = KeepZoomRate;\r\n\t\t\t}\r\n\r\n\t\t\tif (_ZoomRateBox.Text == Constants.DestinationAttributes.ViewType.XYZ\r\n\t\t\t\t&& action.GetAttribute(Constants.Coordinates.ScaleFactor).TryParse(out float f)) {\r\n\t\t\t\t_ZoomRateBox.SelectedIndex = -1;\r\n\t\t\t\t_ZoomRateBox.Text = f.ToText();\r\n\t\t\t}\r\n\t\t\t_TitleBox.Text = action.GetAttribute(Constants.BookmarkAttributes.Title);\r\n\t\t\t_PathBox.Text = action.GetAttribute(Constants.DestinationAttributes.Path);\r\n\t\t\t_NewWindowBox.Checked = action.GetAttribute(Constants.DestinationAttributes.NewWindow) == Constants.Boolean.True;\r\n\t\t\t_NamedBox.Text = action.GetAttribute(Constants.DestinationAttributes.Named);\r\n\t\t\t_GotoNamedDestBox.Checked = String.IsNullOrEmpty(_NamedBox.Text) == false;\r\n\t\t\t_GotoLocationBox.Checked = action.HasAttribute(Constants.DestinationAttributes.Named) == false\r\n\t\t\t\t&& action.HasAttribute(Constants.DestinationAttributes.NamedN) == false;\r\n\r\n\t\t\tInitCoordinateValue(action, Constants.DestinationAttributes.Page, _PageBox, null);\r\n\t\t\tInitCoordinateValue(action, Constants.Coordinates.Left, _LeftBox, _KeepXBox);\r\n\t\t\tInitCoordinateValue(action, Constants.Coordinates.Top, _TopBox, _KeepYBox);\r\n\t\t\tInitCoordinateValue(action, Constants.Coordinates.Right, _WidthBox, null);\r\n\t\t\t_ScriptContentBox.Text = action.GetAttribute(Constants.DestinationAttributes.ScriptContent);\r\n\t\t\tif (_WidthBox.Enabled) {\r\n\t\t\t\tvar v = _WidthBox.Value - _LeftBox.Value;\r\n\t\t\t\tif (v > _WidthBox.Maximum) {\r\n\t\t\t\t\tv = _WidthBox.Maximum;\r\n\t\t\t\t}\r\n\t\t\t\telse if (v < _WidthBox.Minimum) {\r\n\t\t\t\t\tv = _WidthBox.Minimum;\r\n\t\t\t\t}\r\n\t\t\t\t_WidthBox.Value = v;\r\n\t\t\t}\r\n\t\t\tInitCoordinateValue(action, Constants.Coordinates.Bottom, _HeightBox, null);\r\n\t\t\tif (_HeightBox.Enabled) {\r\n\t\t\t\tvar v = _TopBox.Value - _HeightBox.Value;\r\n\t\t\t\tif (v > _HeightBox.Maximum) {\r\n\t\t\t\t\tv = _HeightBox.Maximum;\r\n\t\t\t\t}\r\n\t\t\t\telse if (v < _HeightBox.Minimum) {\r\n\t\t\t\t\tv = _HeightBox.Minimum;\r\n\t\t\t\t}\r\n\t\t\t\t_HeightBox.Value = v;\r\n\t\t\t}\r\n\t\t\t_AttrNameColumn.AspectGetter = (object o) => o is XmlAttribute attr ? attr.Name : (object)null;\r\n\t\t\t_AttrValueColumn.AspectGetter = (object o) => {\r\n\t\t\t\tif (o is XmlAttribute attr) {\r\n\t\t\t\t\tif (attr.Name == Constants.Font.ThisName && attr.Value.TryParse(out int fid)) {\r\n\t\t\t\t\t\tvar n = attr.OwnerDocument.DocumentElement.SelectSingleNode(\r\n\t\t\t\t\t\t\t$\"{Constants.Font.DocumentFont}/{Constants.Font.ThisName}[@{Constants.Font.ID}='{attr.Value}']/@{Constants.Font.Name}\"\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\tif (n != null) {\r\n\t\t\t\t\t\t\treturn String.Concat(attr.Value, \" (\", n.Value, \")\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn attr.Value;\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t};\r\n\t\t\t_AttributesBox.ScaleColumnWidths();\r\n\t\t\t_AttributesBox.SetObjects(action.Attributes);\r\n\r\n\t\t\t_TitleBox.Select();\r\n\t\t\t_TitleBox.Focus();\r\n\t\t}\r\n\r\n\t\tvoid InitCoordinateValue(XmlElement element, string name, NumericUpDown control, CheckBox check) {\r\n\t\t\tif (element.HasAttribute(name)) {\r\n\t\t\t\tvar s = element.GetAttribute(name);\r\n\t\t\t\tif (s.TryParse(out decimal x)) {\r\n\t\t\t\t\tcontrol.SetValue(x);\r\n\t\t\t\t}\r\n\t\t\t\telse if (check != null) {\r\n\t\t\t\t\tcheck.Checked = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (check != null) {\r\n\t\t\t\tcheck.Checked = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SetValue(string name, string value) {\r\n\t\t\tUndoActions ??= new UndoActionGroup();\r\n\t\t\tbool a = Action.HasAttribute(name);\r\n\t\t\tif ((value == null && a == false)\r\n\t\t\t\t|| (a && Action.GetAttribute(name) == value)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tUndoActions.Add(UndoAttributeAction.GetUndoAction(Action, name, value));\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(object source, EventArgs args) {\r\n\t\t\tif (String.IsNullOrEmpty(_TitleBox.Text) == false) {\r\n\t\t\t\tSetValue(Constants.BookmarkAttributes.Title, _TitleBox.Text);\r\n\t\t\t}\r\n\t\t\tvar act = _ActionBox.SelectedItem as string;\r\n\t\t\tif (act == NoAction) {\r\n\t\t\t\tact = null;\r\n\t\t\t}\r\n\t\t\tSetValue(Constants.DestinationAttributes.Action, act);\r\n\t\t\tSetValue(Constants.BookmarkAttributes.Open, _DefaultOpenBox.Checked ? Constants.Boolean.True : null);\r\n\t\t\tif (act == null) {\r\n\t\t\t\tSetValue(Constants.DestinationAttributes.Page, null);\r\n\t\t\t}\r\n\t\t\telse if (_ScriptBox.Visible) {\r\n\t\t\t\tSetValue(Constants.DestinationAttributes.ScriptContent, _ScriptContentBox.Text);\r\n\t\t\t}\r\n\t\t\telse if (_GotoLocationBox.Checked) {\r\n\t\t\t\tSetValue(Constants.DestinationAttributes.Page, _PageBox.Value.ToText());\r\n\t\t\t\tif (_ZoomRateBox.Text.TryParse(out float f)) {\r\n\t\t\t\t\tSetValue(Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\t\tSetValue(Constants.Coordinates.ScaleFactor, f.ToText());\r\n\t\t\t\t}\r\n\t\t\t\telse if (_ZoomRateBox.Text == KeepZoomRate) {\r\n\t\t\t\t\tSetValue(Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\t\tSetValue(Constants.Coordinates.ScaleFactor, null);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tSetValue(Constants.DestinationAttributes.View, _ZoomRateBox.Text);\r\n\t\t\t\t}\r\n\t\t\t\tif (_LeftBox.Enabled || _KeepXBox.Enabled) {\r\n\t\t\t\t\tSetValue(Constants.Coordinates.Left, _KeepXBox.Checked ? null : _LeftBox.Value.ToText());\r\n\t\t\t\t}\r\n\t\t\t\tif (_TopBox.Enabled || _KeepYBox.Enabled) {\r\n\t\t\t\t\tSetValue(Constants.Coordinates.Top, _KeepYBox.Checked ? null : _TopBox.Value.ToText());\r\n\t\t\t\t}\r\n\t\t\t\tif (_RectanglePanel.Enabled) {\r\n\t\t\t\t\tSetValue(Constants.Coordinates.Right, (_LeftBox.Value + _WidthBox.Value).ToText());\r\n\t\t\t\t\tSetValue(Constants.Coordinates.Bottom, (_TopBox.Value - _HeightBox.Value).ToText());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (_GotoNamedDestBox.Checked) {\r\n\t\t\t\tSetValue(Constants.DestinationAttributes.Named, _NamedBox.Text);\r\n\t\t\t}\r\n\t\t\tif (_PathPanel.Enabled) {\r\n\t\t\t\tSetValue(Constants.DestinationAttributes.Path, _PathBox.Text);\r\n\t\t\t\tif (_NewWindowBox.Enabled) {\r\n\t\t\t\t\tSetValue(Constants.DestinationAttributes.NewWindow, _NewWindowBox.Checked ? Constants.Boolean.True : Constants.Boolean.False);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid Control_ValueChanged(object sender, EventArgs e) {\r\n\t\t\tif (sender == _ActionBox) {\r\n\t\t\t\tvar i = _ActionBox.SelectedItem as string;\r\n\t\t\t\tif (i == Constants.ActionType.Javascript) {\r\n\t\t\t\t\t_ScriptBox.Parent = _DestinationPanel.Parent;\r\n\t\t\t\t\t_ScriptBox.Top = _DestinationPanel.Top;\r\n\t\t\t\t\t_ScriptBox.Left = _DestinationPanel.Left;\r\n\t\t\t\t\t_ScriptBox.Size = _DestinationPanel.Size;\r\n\t\t\t\t\t_ScriptBox.Visible = true;\r\n\t\t\t\t\t_DestinationPanel.Visible = false;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_DestinationPanel.Visible = true;\r\n\t\t\t\t\t_DestinationPanel.Enabled = i != NoAction && i != Constants.ActionType.Javascript;\r\n\t\t\t\t}\r\n\t\t\t\tif (_DestinationPanel.Enabled) {\r\n\t\t\t\t\t_NewWindowBox.Enabled = ValueHelper.IsInCollection(i, Constants.ActionType.GotoR, Constants.ActionType.Uri);\r\n\t\t\t\t\t_PathPanel.Enabled = ValueHelper.IsInCollection(i, Constants.ActionType.GotoR, Constants.ActionType.Launch, Constants.ActionType.Uri);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (sender == _GotoLocationBox || sender == _GotoNamedDestBox) {\r\n\t\t\t\t_LocationPanel.Enabled = _GotoLocationBox.Checked;\r\n\t\t\t\t_NamedBox.Enabled = _GotoNamedDestBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _KeepXBox) {\r\n\t\t\t\t_LeftBox.Enabled = !_KeepXBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _KeepYBox) {\r\n\t\t\t\t_TopBox.Enabled = !_KeepYBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ZoomRateBox) {\r\n\t\t\t\tswitch (_ZoomRateBox.Text) {\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.XYZ:\r\n\t\t\t\t\tcase \"保持不变\":\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.Fit:\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitB:\r\n\t\t\t\t\t\t_TopBox.Enabled = _LeftBox.Enabled = _KeepXBox.Enabled = _KeepYBox.Enabled = _RectanglePanel.Enabled = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitBH:\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitH:\r\n\t\t\t\t\t\t_TopBox.Enabled = _KeepYBox.Enabled = true;\r\n\t\t\t\t\t\t_LeftBox.Enabled = _KeepXBox.Enabled = _RectanglePanel.Enabled = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitBV:\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitV:\r\n\t\t\t\t\t\t_LeftBox.Enabled = _KeepXBox.Enabled = true;\r\n\t\t\t\t\t\t_TopBox.Enabled = _KeepYBox.Enabled = _RectanglePanel.Enabled = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitR:\r\n\t\t\t\t\t\t_TopBox.Enabled = _LeftBox.Enabled = _RectanglePanel.Enabled = true;\r\n\t\t\t\t\t\t_KeepXBox.Enabled = _KeepYBox.Enabled = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t_TopBox.Enabled = _LeftBox.Enabled = _KeepXBox.Enabled = _KeepYBox.Enabled = true;\r\n\t\t\t\t\t\t_RectanglePanel.Enabled = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/ActionEditorForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\r\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        AAABAAcAEBAAAAAAAABoBAAAdgAAACAgAAAAAAAAqAgAAN4EAABAQAAAAAAAAChCAACGDQAAwMAAAAAA\r\n        AAAoUgIArk8AABAQAAAAAAAAaAQAANahAgAgIAAAAAAAAKgQAAA+pgIAMDAAAAAAAACoJQAA5rYCACgA\r\n        AAAQAAAAIAAAAAEAIAAAAAAAAAQAACMuAAAjLgAAAAAAAAAAAAAAAAAAAAAAACwsDGUqKguHKioLhyoq\r\n        C4cxPCCNToRyqGzQydV049/kb9fR2lmfkbZCZlCcQWNLeH///xl///8LAAAAAAAAAAA4OBeC////////\r\n        ///+////9P/+/8H+/v+7zP7//gj//7fb/f+O//7/pP/9/3DWz9V///+Kf///QQAAAAAAAAAASUkme///\r\n        ///+////+P7+/+H9/f+s/v7/ldT///8A///dSP//f////4P4//+qlfDuorn/9X///50AAAAAAAAAAFRU\r\n        L3f+////x8/A/7bZzf+h8uz/iPr4/4ns////AP///wD//+BT/v/4FP///wD//7KZ//d///+yAAAAAAAA\r\n        AABYWDN2/P/+/9rw4v+t+PD/s+Hy/62r/v/fb/3//wD///8A////AP///wD//8du/v1////yf///iAAA\r\n        qI0AAKT/AACi/wMGov8dO7T/YKvi//sA/v//AP///wD///8A////AP///wD///gQ//+F9P//f///53//\r\n        /2oAAK7/AACu/wAAsf8CBLL/Fy+//1Ch4f9om+f/paX8/7VM8f//AP///wD///8A////AP//1VL+/X//\r\n        //N///+LAAC1/wAAuf/h4f//kpPn/09Y1P83XNH/U6Xk/3Hj9v+J7P///wD///8A///ZUfv/9xT///8A\r\n        //+7iP/3f///sgAAvv8AAMf/UVHe/93d/f+io/D/wcj3/9Lt//97zPH/ldT///8A///rQ/j/f////4P4\r\n        //+sn/n0orn/83///5YAAMb/AADS/wAA1f9nZ+j/YWHl/8fH9/9FT9n/O3fb/4+5+f/3EP//lNr8/4j3\r\n        9f+f/Pf/fOXezn///4l///87AADN/wAA2v8AAN7/LS3l/9PT+v9kZOf/BgzR/yRI1P9Wrej/kfz6/5v5\r\n        9f+78Ob/3fTn/3WXeYB///8Zf///CwAA0f8AAOD/AADm/wUF6P/+/v//ICDh/wED1f8KFM3/GzfL/8nv\r\n        5P/Q697/3efX//Dy4f90eFFtf///An///wEAANX/AADj/wAA6v8AAOz/AADn/wAA3/8AANb/AQLL/wIF\r\n        wv/k59b/o6WV/6SllP+kpJP/SUklfAAAAAAAAAAAAADOjQAA2P8AANv/AADc/wAA2f8AANX/AADQ/wAA\r\n        yv9+fs3/5eXU/7a2pf//////enpRaHp6USUAAAAAAAAAAAAAAAAAAAAAfX1TZ/z89f/5+e//9vbq//T0\r\n        5f/z8+L/8vLh//Ly4f/CwrH/fX1TZ319UyUAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VU1/f1Vmf39VZn9/\r\n        VWZ/f1Vmf39VZn9/VWZ/f1Vmf39VZn9/VSQAAAAAAAAAAAAAAAAAAAAA4Af//8AB4AfgAMAB4ADgAOAA\r\n        4AAAAeAAAAAAAQAAAAAAAAAAAAEAAAADAAEABwADAAcABwAPAAfgHwAP///gHygAAAAgAAAAQAAAAAEA\r\n        CAAAAAAAAAQAACMuAAAjLgAAAAAAAAAAAAAAAAAA5+foAOXl5gDj4+QA4ODgAN7e3gDb29wA2dnbANfX\r\n        2gDT09QAzc3QAMfHzwDBwckAtra8AK6usADV1dYA2trcANjY2gDR0dEA0M/QAM7O0QDLy88AurrEAKmo\r\n        sACsq68A0tLSAN3d3QDc3N0As7O2AN/f3wBCP+wAOjjdAIeG6ACMjO0AionrAIiI6QDJyc8AzMzQAP7Z\r\n        /gD98v0AUU7pAKSj5ACop+AAn57lAJOS7ACYl+kAZ2bgAOHh4QD+v/4A/lbUAPr6+gD8+/wATEnvAGVj\r\n        4wCpqckA3t7fANbW2gB+feQAhYTcAFJQ5wD+xv4A/gT9AO/u7gD+5v0A9vX1ADQy1wBAPeYAqanXALi3\r\n        wQA9O+AAnJviAG5t2ACioeQAX13jAP4a+AD+D/sAHx27ACUkwwAjIcEAWVmGAENCoAAyMLEAg4LZAElI\r\n        mgA9O6gAKCa2ACgnxQBwb90A/gf9AO3s6wAfHbcAWlqEAFpZggBWU3wAUlGQAP4u6wDx8fEAOzmsADo4\r\n        rQA5NqwA/iLzAPLy8gALBhIALiy1ADYzqwBNTJYAqKi0AO/v8AD+BvwA+fn5AFZOcwCxsbQA/kHdAPX0\r\n        9AD+y8gA/szTAPDw8ADu7e0A7OrqAPj4+AD+w7kA/lgvAPf29QDz8/IA8fHwAL69ygD+MwAA/p6bAPv7\r\n        +wD+rpsA/qmYAEhE8AB1dOIA9PPzAMXFzAD+y98A/jUDAPxiPAD+PAwA+Pf2AEpH8ADk5OUA/k4iAO3r\r\n        6gBFQu8A5ubnAP5BEgD+NgQA6unpAP4/DwD+kKIA/rOgAFdU4gBPTOoA/sa/AP34/ABEQO8Ae3niAP7A\r\n        swBcWd8AVlPhAFRS4wBiYOQAeHbhAGtq2gDi4uIA////AP///wD///8A////AP///wD///8A////AP//\r\n        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//\r\n        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//\r\n        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//\r\n        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//\r\n        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//\r\n        /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUQBhoFHR0JJQYDA6UvBAUaGxsG\r\n        BwkMAAAAAAAAAAAACQF2j1l1ATajFo1ZWY92AQGRjaUdB4YAAAAAAAAAAAAIj3U+a2BZnYOfhll0az51\r\n        j3YBkQMbJAAAAAAAAAAAAAd1dGB7cXsgoJ+kEGtlZXRrdXYBjQUlAAAAAAAAAAAXhgF7cUB6elmjHow6\r\n        hhoBdVkvEgwMGQoAAAAAAAAAAICAC3t6i3dtbXd9oplHahwNHBdHn58WCgAAAAAAAAAznoJ1CXdAAwcP\r\n        bTICnyg0mKChg4MoKH0UAAAAAAAAAACaiocPGgGAmwFZgG0rSYZSnJ05IC0VLxMAAAAAAAAAAHN+iTOL\r\n        l4mCi0AzgI2YR5kqcXFla3YvFAAAAAAAJBFZj35+iZV+ljOLMzMzdyIeLHp6cWVrdgQUAAAAADM+eH+J\r\n        fn5+fokzeoAzMzNtQ4wli3pxdHWUHRQAAAAzc4mSfn5+fn6TcwEGMoCAgHpGHkhxQGVrWQEdCgAAAAAz\r\n        MzNzgn5+fn6OjwcdbTJtYDqQOWBgdT52kQUlAAAAAAAAADOHfoiBiYp5fBI+d4tgOYxXWY0SDwGNBiQA\r\n        AAAAAAAAAHN+f4AzcYGCcQF6emAgg4SFJicKBS8IhgAAAAAAAAAAeHltWWVAMjN6e3F7fH01DHEwMW0M\r\n        GyQUGw0AAAAAADNyc3RrdHR0dHR0dGs+dVl2YDw9MAEFdz8wYAAAAAAAbh0Fbxwcb28cHG9vb28WEAYd\r\n        Jj1KPzBwSzxxAAAAAGZnaGlpaWlpaWlpaWlpXmoQazMmPT1sPWwwbQAAAAAAVWFiYmJhYmNjYmJiYWFG\r\n        PzAxZD09PT09MGUAAAAAAABaWlpbWlpaXFtdWl5aWlI/MDFfPT09PT0wYBgAAAAAAExNTjpPUFFSQVJT\r\n        UlRVVlcqQDM/PT1YPT0wWRcAAAAAQUJCQzpELkNFRkcMSElCQkUTHSY9Sj8wMUs8LwAAAAA0NTUTNhEi\r\n        NzY4ORA2OjU1OxMaPD0wPgEzPzBAAAAAACghISkqKywqKi0sKiorISMuEy8wMTIlAAAAMwAAAAAAAB4f\r\n        ICEhISEiIiIjIyMgICQlBiYnBgAAAAAAAAAAAAAAAAAJBB0dBRobBgcRCA8ZFAwcAQUAAAAAAAAAAAAA\r\n        AAAAABkFGhsGBxEIDwkZExUMHBgMAAAAAAAAAAAAAAAAAAAADxARDwkSExQKFQsMFg4XGAAAAAAAAAAA\r\n        AAAAAAAAAAABAgMEBQYHCAkKCwwNDg4AAAAAAAAAAAAAAP/////8AAAP/AAAB/wAAAf8AAAH/AAAB/gA\r\n        AAf4AAAH8AAAB/gAAAf4AAAHwAAAB4AAAAcAAAAHgAAAB/AAAAf4AAAH+AAAAfAAAAHwAAAB4AAAA+AA\r\n        AAfgAAAD4AAAAeAAAAHgAAAB4AAAO/AAAH/8AAD//AAB//wAA//8AAf/KAAAAEAAAACAAAAAAQAgAAAA\r\n        AAAAQAAAIy4AACMuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAOzs7AS0tLQctLS0MLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSws\r\n        LA0sLCwNLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSws\r\n        LA0sLCwNLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSwsLA0sLCwNLCwsDSws\r\n        LA0sLCwNLCwsDSwsLA0sLCwNLy8vCywsLAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA7AAAAXQAAAGAAAABgAAAAYAAA\r\n        AGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAA\r\n        AGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAA\r\n        AGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYQAAAFIAAAAkJycnAwAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMYAwMDbQAA\r\n        AKsAAACyAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAA\r\n        ALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAA\r\n        ALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALIAAACYAAAAQC8v\r\n        LwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAGBYWFoCjo6P0rKys9ampqfWrq6v1q6ur9aysrPWsrKz1ra2t9a2trfWurq71rq6u9a+v\r\n        r/Wurq71r6+v9a+vr/Wrq6v1q6ur9bCwsPW0tLT1tra29ba2tvW2trb1tbW19bW1tfW1tbX1tbW19bS0\r\n        tPW0tLT1s7Oz9bKysvWysrL1srKy9bGxsfWwsLD1r6+v9bGxsfWysrL1sbGx9bGxsfWxsbH1sLCw9a+v\r\n        r/WsrKz1rq6u8JiYmMxEREQSAAAAAP///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcaGhqB2tra/+7u7v/t7e3/7+/v/+/v7//w8PD/8PDw//Ly\r\n        8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Hx8f/o6Of/2tjc/9TU1v/c293/5OXn//Dx8P/08/P/8/Pz//Pz\r\n        8//z8/P/8vLy//Ly8v/x8fH/8PDw//Dw8P/v7+//7u7u/+7u7v/t7e3/7Ozs/+vr6//q6ur/6enp/+np\r\n        6f/o6Oj/6Ojo/+fn5//l5eX/4uLi/+Li4v/GxsbvSUlJFgAAAAD///8BAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXGRkZgdHR0f/l5eX/5OTk/+fn\r\n        5//m5ub/5+fn/+jo6P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/j4+P/zczM/7e5rP+pqKT/tbit/8rK\r\n        xf/a2Nz/6Ojo/+rq6v/q6ur/6+vr/+rq6v/p6en/6Ojo/+jo6P/o6Oj/5+fn/+bm5v/l5eX/5OTk/+Tk\r\n        5P/k5OT/4+Pj/+Hh4f/i4uL/4eHh/+Dg4P/e3t7/3Nzc/9nZ2f7Z2dn/v7+/6klJSRgAAAAA////AQAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxkZ\r\n        GYHU1NT/6urq/+jo6P/r6+v/7e3t/+3t7f/t7e3/7e3t/+7u7v/v7+//7+/v/+/v7//u7u7/4N/g/8HD\r\n        vf9racT/UEvd/2pnzf+pqLX/zs/I/+Hh4//s7e3/7+/v/+/v7//v7+//7u7u/+7u7v/t7e3/7e3t/+zs\r\n        7P/r6+v/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5+fn/+Xl5f/k5OT/4+Pj/+Dg4P/c3Nz+3Nzc/8PD\r\n        w+tJSUkZAAAAAP///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAABcZGRmB1tbW/+zs7P/r6+v/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PD/8fHx//Hx\r\n        8f/x8fL/8PDy/+jo3v+UlNP/ODT3/0M9//9IQP//WVTo/6ysvP/Y2dL/5ufp//Dw7//x8fH/8PDw//Dw\r\n        8P/v7+//8PDw/+/v7//v7+//7u7u/+3t7f/s7Oz/7Ozs/+rq6v/p6en/6enp/+jo6P/n5+f/5eXl/+Xl\r\n        5f/i4uL/3t7e/t7e3v/ExMTsSEhIGQAAAAD///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXGRkZgdfX1//t7e3/7Ozs/+7u7v/v7+//7+/v//Dw\r\n        8P/x8fH/8fHx//Pz8//z8/P/8/Pz//Hx8//w8OX/i4rk/1NS+/9IR9v/Skri/0hB//9VUef/sbO7/97e\r\n        2v/r6+3/8vHx//Pz8//y8vL/8fHx//Hx8f/x8fH/8PDw/+/v7//u7u7/7u7u/+3t7f/s7Oz/6+vr/+vr\r\n        6//p6en/6Ojo/+fn5//m5ub/4+Pj/9/f3/7f39//x8fH7kpKShwAAAAA////AQAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBGBoaGoLY2Nj/7e3t/+3t\r\n        7f/w8PD/8fHx//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/y8vT//Pzu/42N7P8oIv//XFzb/46Q\r\n        ov9HRez/SED//2Jg2f/HyL//5eTm//Ly8v/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/x8fH/8PDw/+/v\r\n        7//v7+//7u7u/+3t7f/r6+v/6+vr/+rq6v/p6en/6Ojo/+Xl5f/h4eH+4eHh/8jIyO5KSkocAAAAAP//\r\n        /wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMAQAA\r\n        ABcWFhZ+3d3d//Hx8f/t7e3/8fHx//Ly8v/z8/P/9PT0//X19f/09PT/9fX1//b29v/39/f/9fT2//z8\r\n        9P/My/L/My/4/zQu/v9pZ8v/eXqy/1JO9/9HQP7/hYXC/9bVyv/n5un/8PDw//T09P/19fX/8/Pz//T0\r\n        9P/09PT/8/Pz//Ly8v/x8fH/8PDw/+/v7//u7u7/7e3t/+zs7P/q6uv/6Ojo/+fn5//k5OT/4eHh/uHh\r\n        4f/JycnvSkpKHQAAAAD///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA////AQAAAAATExMaMzMzksnJyf/q6ur/8vLy//Ly8v/09PT/9PT0//X19f/29vb/9vb2//b2\r\n        9v/39/f/9/f3//b29v/19fj////0/6Sk8/81MfT/NDH8/1ZU3P9PTuH/UU79/0xG7f+hoq7/zMzJ/9zd\r\n        3v/n5+f/7+/v//Ly8//z8/P/9vb2//X19f/z8/P/8vLy//Dx8P/v7u7/6+vr/+fn5//g4OD/2dna/9PT\r\n        1P/V1db/19fX/9ra2v7h4eH/y8vL8UtLSx8AAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5ubkJnZ2dlr69vfG6ubn/srKy/+Pj4//29vb/9PT0//X1\r\n        9f/29vb/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//f2+f////b/v774/09L9P8zLfr/MCz5/05L\r\n        9v9RSv//X1zC/6OjlP+1tLb/wsLG/9LS0//c3d3/5eXl/+vr6//t7e3/7+/v//Dw8P/s7Oz/4uLj/9jX\r\n        2f/My8//w8PF/7q6uP+4uLP/uLiz/769v//KzM3+3t7d/8zLy/FLS0sfAAAAAP///wIAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wIAAAAAw8PDhf///////////////9jY\r\n        2P+vr6//7e3t//j4+P/29vb/9/f3//f39//39/f/+Pj4//n5+f/5+fn/+fn5//j5+f/6+fn/+fj7////\r\n        +f/l5vr/hIT1/0VA9/85Nff/WVT4/0pE9/9nZqD/lpiQ/66uov+3trD/u7u7/8LCxf/IyMr/0tLU/9bW\r\n        1//X1tf/z87Q/7y+wP+ysav/qKmb/56gl/+Skpz/ioqc/4eImf+jpKH/wMC5/tfW2f/MzMzyTExLIAAA\r\n        AAD///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3NvcGPz8\r\n        /PT////+/vr5/v//////////xcXF/8DAwP/5+fn/+Pj4//j4+P/5+fn/+Pj4//n5+f/5+fn/+/v7//7+\r\n        /v///////P38//r6+v/59/z////5////+//W1/j/dXT0/0ZE9/9aVPz/OjT7/0ZD2/9wbsb/kpS2/62u\r\n        rP+0taj/s7On/62upf+qqqb/qamo/6Wmnf+Yloz/c3SV/1pYsv9GQtj/OTTw/zs48f85NvD/Skbd/6+w\r\n        wP7Z2tb/zM3N9ExMTCIAAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD///8CAAAAAPPz8zP9/Pz///////9uSv//yLr///////r5+P+wsLD/2dnZ//z8/P/4+Pj/+fn5//n5\r\n        +f/9/f3//v7+//f39//p6en/4eHh//Hx8f/9/v3//Pv7//n6+v/6+fv////7////8P+Njuv/Ukz2/1BI\r\n        /f8/Of7/QDj//zw39v9QT+X/amfU/3Z5vf94eqH/goGN/4mLif9zcZ7/R0TN/zo09f9IQ///UlH8/2Bd\r\n        8v9VU/D/RUH6/zcz/v+Xl9z+5ufa/8vLzvNNTUwiAAAAAP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA////AgAAAADo5+ct+/r6////////Viz//0og///49v//////4+Pj/6+v\r\n        r//w8PD//f39//7+/v/8/Pz/7u7u/9nZ2f/Ozs7/zMvL/8PDw/+wsLD/3d3d//7////7+/v/+/v8//n5\r\n        /P/7/Pf/4ODs/11b8v9TSvv/T0rz/3Bu6/9hWPv/SUH+/z43//8+OP//Qj70/zQw6v8yLeX/Qj34/1JO\r\n        /v9YVfv/Pz71/0JC5/9QUeD/RUPo/0dA+/9aVPf/v77h/+np4P/Nzs/1TU1NJAAAAAD///8CAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wIAAAAA6ejoIfz6+fj//////3dV//8Z\r\n        AP//knX////////////Gxsb/vr6+//Pz8//i4uL/0dHR/9LS0v/k4uH/+fb2////////////5eXl/7a2\r\n        tv/y8vL//v7+//z8/P/9/f3/+Pr8///+8f+amez/TUr4/1FK+P+jpcn/zc7c/6ys6f+Df+P/ambi/0dB\r\n        /f83MP//Qz///0NA+/82Mvj/Pzj4/0M++f9KQ/v/T0f9/19V/v+Oh/j/yMjq/+fp4v/k4+X/z8/P901N\r\n        TSUAAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAAPj4\r\n        +Bj++/vu//////+CYv7/JwH//zAD///Owf//////+vn5/7S0tP/Ix8f/3t3d//Lv7///////////////\r\n        ////9fP//vn3///////T09P/29vb///////8/Pz//f39//z7/f/9/fr/3N3r/11c8f9MRf//bGfk/83P\r\n        wv/S0Mf/vb2o/2Bdz/81MP7/Tk32/4iG8v+rqvT/oJ34/6Gg+P+kovf/qqj1/7a19v/MzfD/7e7s/+/w\r\n        6v/j4+T/5OTk/87OzvZNTU0mAAAAAP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Af//\r\n        /wH///8C////A////wH///8J//794v//////kHP+/yYA//8vAf//UCb///b0///////59vX//Pr5////\r\n        ///////////////Owf//gmX//0Ma///c0///////6Obm/+rq6v///////f39//39/f/9/f3/+/v+//39\r\n        8f+Uk+n/Tkn3/0tF+P+RkbD/qaud/11Y0v88OP//Wlb4/5ub8//3+fL////2////9f////X//P3z//v8\r\n        8P/6+/D/9ffv/+3t7v/p6Or/5OXk/+Pj4//Ozs75TU1NKAAAAAD///8CAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAAs7OzEfr29dz//////56F/v8kAP//Ogj//yUA//+M\r\n        bv//////////////////6eT//6WR//9bNv//MQD//xkA//+dhP///////////+zs7P/5+fn//v7+//z8\r\n        /P/9/f3//Pz8//z8/f/9/vr/1dPo/1pZ8f9MQv//YGC+/1tYw/88Nv//XVn2/7W07v////f/+fj3//T0\r\n        9//19Pb/9PP1//Lx8//x8PP/8O/x/+/u8P/t7e3/6urp/+Tk5P/j4+P/zs7O+k1NTSkAAAAA////AgAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGxsYEq6urHKGhoT6ZmZlsn5+fl6ysrMHy7+35//39//+p\r\n        lP//JwD//zYE//80A///LQD//8O0///Lv///d1n//z0Q//8mAP//LgD//yYA//+Xff////////////f2\r\n        9v/29vb///////39/f/9/f3//f39//z8/P/8/f3/+/v9//j47f+Cguv/TUj6/zw3+P82MPv/U0/5/6Cd\r\n        7/////T/9/f5//j4+P/49/f/9vb3//X19f/09PT/8/Pz//Hx8v/w8PD/7e3t/+rq6v/l5eX/4uLi/87O\r\n        zvpNTU0pAAAAAP///wIAAAAAAAAAAAAAAAAAAAAA////AQAAAACdnZ1Op6enrLu6utrQz87y5uPj//bz\r\n        8v//////////////////xrf//ykA//81Av//NAH//zEA//83BP//LwD//yYA//8xAP//Ogj//yYA//+G\r\n        aP////////7+//j39//19fX//v7+//39/f/+/v7///////7+/v/9/f3//fz9//z8/P/+/vf/vLzj/05K\r\n        8v9KQ/3/Qj76/31+6v/y8+3/+fj4//n5+f/5+Pj/9/f3//b29v/19fX/9PPz//Ly8v/x8fH/7+/v/+zs\r\n        7P/p6en/5OTk/+Li4v/Pz8/8Tk5OKwAAAAD///8CAAAAAAAAAAAAAAAAAAAAAAAAAACxsbFy7e3t+f/+\r\n        /f/////////////////////9/////v/v6///0sf//4tu//8uAP//NAL//zMA//80AP//MgD//zQB//82\r\n        A///NwT//yQA//94Vv/////////+//n4+P/09PT//v7+//39/f/8/Pz//f39//39/f/9/f3//Pz8//z8\r\n        /P/9/f3/+fn5/97f3f9hYuf/TEb8/0NA9v/Bw9b/9/by//j4+v/5+fj/+Pj4//f39//29vb/9fX1//Pz\r\n        8//y8vL/8fHx/+/v7//s7Oz/6enp/+Pj4//h4eH/zs7O/E5OTiwAAAAA////AgAAAAAAAAAAAAAAAAAA\r\n        AADj4+Mi+fn59v/////////8//79/v7h2f7+uKf//45y//9kPf//RBb//y4A//8qAP//NAD//zMA//8z\r\n        AP//MwD//zQB//8zAP//NQL//ygA//9pRP//+/r///////38/P/z8/P//f39//39/f/9/f3//f39//z8\r\n        /P/8/Pz//Pz8//39/f/9/P3//f38//f2+f/j5Nf/fHvR/0pE+/9OSPX/v8LS//bz8v/4+fn/+Pj5//f3\r\n        9//39/f/9vb2//T09P/y8vL/8fHx//Dw8P/u7u7/6+vr/+jo6P/i4uL/4eHh/8/Pz/1OTk4sAAAAAP//\r\n        /wIAAAAAAAAAAAAAAAAAAAAA////XP//////+vn8/35d//88Ef//KwD//yMA//8lAP//LAD//zIA//82\r\n        A///NgP//zMA//8zAP//MwD//zMA//8zAP//NQL//y0A//9VLP//+/r///////j39//Cw8P/8PDw////\r\n        ///7+/v//Pz8//z8/P/8/Pz//f39//z8/P/8/Pz//fz9//z9/P/z8/b/39/Q/1pZ2P8+Ovv/R0L7/5WS\r\n        3//y9Of/9vX4//j4+P/4+Pj/9vb2//X19f/09PT/8vLy//Dw8P/v7+//7e3t/+vr6//n5+f/4uLi/+Dg\r\n        4P/Pz8//T09PLgAAAAD///8CAAAAAAAAAAAAAAAAAAAAAP///0T///////39+/++rvz/jHH+/2lE//9K\r\n        H///NAH//ykA//8nAP//KwD//zEA//8zAP//MwD//zMA//8zAP//MwD//zQB//8xAf//PhT//8y+////\r\n        ///9+/v/xcXF/7e3t//39/f//f39//v7+//8/Pz/+/v7//z8/P/8/Pz/+/v7//z8/P/6+/z/7+/v/9DQ\r\n        y/9BPur/PDb9/0lE+v9xben/6uvf//b1+P/39/f/9/f3//X19f/09PT/8/Pz//Ly8v/w8PD/7u7u/+3t\r\n        7f/r6+v/5+fn/+Li4v/g4OD/z8/P/k9PTy8AAAAA////AgAAAAAAAAAAAAAAAAAAAAD///8G////v///\r\n        ////////////////////9PL9/9fN+/+smP3/gmX//1oy//89Df//MgD//zMA//8zAP//MwD//zUC//81\r\n        Av//NQH//y0A//84Df//1cr////////////AwMD/vLy8//n5+f/9/f3/+/v7//v7+//8/Pz/+/v7//r6\r\n        +v/7+/v/+Pn6/+/u6v+6vcv/PTnz/0RA+P9MR/v/WVTw/9jb3f/39vX/9vb3//X19f/09PT/8/Pz//Pz\r\n        8//w8PD/7+/v/+3t7f/s7Oz/6urq/+fn5//h4eH/4ODg/87Ozv9PT08wAAAAAP///wIAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAP///wr///9q//39sv/8+93//v7/////////////////////////////t6X//ysA//81\r\n        Av//MwD//zUB//8sAP//KwD//zUC//85Bv//LgD//0EX///g1/////////39/7u7u//AwMD/+fn5//v7\r\n        +//6+vr/+/v7//r6+v/6+vr/+vr6//j4+v/w8Of/q6rR/z45+f88PPf/SUf3/0tF+v/HyN7/9vbx//X1\r\n        9v/29vb/8fHx/+/v7//z8/P/8PDw/+7u7v/s7Oz/6+vr/+np6f/m5ub/4ODg/9/f3//Ozs7/UFBQMgAA\r\n        AAD///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8H////K////lz//v2Q//z7xf/6\r\n        +ff//////7mo//8pAP//NQP//zUB//8rAP//XjX//1ow//8pAP//JgD//zQA//8uAP//TCP//+nj////\r\n        ///8+/v/tbW1/8nJyf/7+/v/+vr6//r6+v/6+vr/+fn5//n5+v/49/n/8fHm/6Sj0/86Nv3/QUHs/0lF\r\n        9P9CPfr/urnd//f38P/y8vP/2dnZ/8fHx/+2trb/w8PD/+vr6//t7e3/6+vr/+np6f/n5+f/5eXl/9/f\r\n        3//e3t7/zc3N/1BQUDIAAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///wT///8BAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADz8O/S//////+mj/3/JgD//zgF//8vAf//Qhb///Ds///8+///wbL//3hY//88\r\n        D///KQD//yAA//9VLv//8+////////f29v+ysrL/5eXl//z8/P/4+Pj/+Pj4//j4+P/4+Pj/9/b4//Lz\r\n        5/+npdj/NzL+/0pJ3f9NSuv/Ozb8/7S04//49+7/5ubo/+3t7f/28/b/7uzu/7+/v/+7u7v/6+vr/+rq\r\n        6v/o6Oj/5ubm/+Pj4//e3t7/3Nzc/8zMzP9QUFAzAAAAAP7+/gMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAP///wH///8C////Bf///wT29vYH/Pj33f//////mX/+/yQA//85B///KAD//72s////\r\n        ////////////////////6eT//6SP//9eN///IQD//1Qq///w7f//////2NfX/9jY2P/8/Pz/9/f3//f3\r\n        9//39/f/+Pj3//b3+f/09ej/qqra/zMv//9QT9f/TErm/zcz/v+6uuf/+Pjt//n5+///////////////\r\n        ///+/v7/tLS0/8nJyf/s7Oz/5ubm/+Xl5f/h4eH/3Nzc/9ra2v/Jycn/UFBQNgAAAAAAAAAAAAAAAP//\r\n        /wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wEAAAAA6enpEvv49+j//////4tt//8o\r\n        AP//KQD//3xa/////////v3/9PLy//36+v///v3//////////////////9DE//+BZP//4dn//////+Xj\r\n        4//k5OT/+vr6//b29v/29vb/9vb2//b29v/29fb/9/bu/7i45P88Nfz/SEbq/0hG7v8+OPr/zc3p//X3\r\n        7/////////////+J///+4v7//////+3r7f+qqqr/2tra/+fn5//k5OT/4ODg/9ra2v/W1tb/ycnJ/05O\r\n        Ti4AAAAAxMTEDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8CAAAAAOPj\r\n        4xz6+Pfz//////9+Xf//IgH//0cb///v6///////9PLy/+bm5v/29vb/9/f3//v6+v///Pv/////////\r\n        ///////////////////u7u7/8/Pz//b29v/29vb/9fX1//T09P/19fb/8/P0//T28f/a2u3/NTH4/zg1\r\n        +v9HQ/b/aGjx/+/w6//x8PD/////////////Hf///03/////////////0M/Q/7Kysv/k5OT/4+Pj/+Dg\r\n        4P/b29v/0dHR/729vf+NjY2FoaGhn6GhocaRkZGWq6urJQAAAAD///8BAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA/v7+AgAAAADb2tom+vj4/f//////cU7//x8A///Bsf///////fv6/+Tl5f/09PT/9PT0//Pz\r\n        8//z8/P/9PT0//j39//8+vr///z7//7+/v/4+Pj/8/Pz//X19f/19fX/9fX1//T09P/z8/P/8/Pz//P0\r\n        8//w8PH/+Pfx/5OS9f9WU/f/g4L1/9rZ7v/w8ev/7+/w///9/////////03///8A////rP////////79\r\n        /v+1trX/w8PD/+Xl5f/V1dX/wsLC/7y8vP/Lysv/6ebp//r3+v/4+Pj/0dHR/5WVlazAwMAJAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wP///8B//7+M/z7+////////0oc//91Uf////////79/+np\r\n        6P/t7e3/9PT0//Ly8v/y8vL/8vLy//Ly8v/x8fH/8vLy//Pz8//z8/P/8vLy//Pz8//y8vL/8/Pz//Pz\r\n        8//y8vL/8fHx//Hx8f/y8vL/8vLy/+/v8P/4+e7/7u/v//T17v/x8uz/6+vt/+7t7f/+/P7///////9d\r\n        ////Af///xn////p////////7ezt/6ioqP+/v7//ycnJ/93b3f/28/b////////////////9/////f//\r\n        //7CwsLyl5eXQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NwBAAAAAJqamjL//////f39/v6j\r\n        jf/+6+b///7+//Tz8//m5ub/9fX1//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Pz\r\n        8//z8/P/8vLy//Pz8//z8/P/8vLy//Hx8f/x8fH/8fHx//Dw8P/v8O//7u3v/+/u7v/r6+z/6+rs/+rq\r\n        6v/p6ur//fn+////////bf///wD///8A////VP/////////////k4+T/6ufq///+///////////////4\r\n        ///+tv7//1z///7V/v/+/v7+4N7g86CgoDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGCQAA\r\n        ABoGBgYv6enq3v/////////////////////Y2Nn/3d3e/9/f4P/e3t//3t7f/97e3//e3t//3t7f/9/e\r\n        3//f3+D/39/g/9/f3//f3+D/397f/97e3//e3t//3t7f/93d3v/d3d7/3d3e/9zc3f/c3N3/4ODg/+bm\r\n        5//r6+z/7e3t/+3t7f/s7Oz/6urq//z4/P///////3////8A////B////wD///+m////////////////\r\n        /////////tn+//+C////LP///wD///85///+7/79/////8/Pz8Ourq4IAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AABLS0sBAAAAFAICA0UFBQZ1AAAAgTAxLJ2/wLvl6OXh9urp5f+3t7P/nZ2Z/6Kinv+hoZ3/oaKd/6Gi\r\n        nf+goZz/oKCc/6CgnP+goZz/oaGc/6ChnP+goZz/oaGd/6Ghnf+goZz/oKGc/5+gm/+fn5v/n5+b/5+f\r\n        m/+fn5v/oKCc/6Skov+0tLT/0dHR/93d3f/W1tb/y8vL/8HBwf/07/T///////+Q////AP///wX///8C\r\n        ////E////+f///72/v//qf///0////8J////AP///wD///88////9//+//////b29vS3t7c6AAAAAP//\r\n        /wIAAAAAAAAAAAAAAAAAAAAAAAAADAYGB0oAAACTBAUAthERG8wPDSDPEA8hzCsrPttXWGz9W1pu/1xc\r\n        b/9dXXD/XV1w/11dcP9dXXD/XF1w/1xdcP9bXG//XFxv/1tcb/9cXG//XFxv/1xcb/9cXG//XFxv/1xc\r\n        b/9cXG//XFxv/1tbb/9bW2//XF1v/1pbbv9mZ3H/iomJ/6qrqv/CwcL/zs3O/9rX2v/s6Oz//ff9////\r\n        ////qf///wD///8D////Af///wD///8v////KP///wD///8A////Af///wD///8t////6////////vv6\r\n        +/q9vb1RAAAAAP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAICAiQDAwF7DAsTwSMgdvE2NKf/REGz/0RB\r\n        s/89Oar/PTmq/z07qv88Oqv/PDur/zw6q/88Oqv/PDqr/z06qv89Oqr/PDqq/zw6qv88Oqr/PDqq/zw6\r\n        qv88Oqv/PDqq/zw6qv88Oqr/PDqr/zw6q/88Oqv/Pjur/zg1qv9TUKr/t7bL/+fl5//18fb///7/////\r\n        /////////////////////v///6D///8A////Av///wD///8B////AP///wD///8C////Bv///wD///8f\r\n        ////4f////////37/f+6urphAAAAAP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAHt7fAEAAAA0CgoKliQh\r\n        hfU9OsP/V1fB/1pZwP9cWcL/XlvD/15dxv9eXcf/XVzD/11aw/9cW8L/XFvD/11bwv9eXMX/X13H/2Bc\r\n        x/9gXMb/X13H/15cxP9eWsL/XlrD/15cxP9fXMf/XVzE/1xcwv9dW8P/XlvD/1xaw/9hXsP/5OTz////\r\n        ////////////////////6f///sL+//+O////Wv///yn///8I////AP///wD///8A////AP///wL///8C\r\n        ////Av///wD///8U////1P///////v////vGxsZxAAAAAP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAB+foADAAAANCAgQLQkILj/MC6z/i0qs/8sKbP/LSqy/y0qs/8nIqD/JSCd/yopsP8sKrP/LCqz/ywq\r\n        s/8sK7T/KCao/yMgl/8jH5n/IiCY/yIfnf8nI6z/LSu2/y4qtf8pJaf/Ix+a/ysoq/8sKrX/LSm1/zAt\r\n        tP8hHrD/cG7L///////8+P7//p/+//9l////OP///xX///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////Af///wH///8Y////yf///////vz7/P+/v7/BAAAAAP///wL9/f0CAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAfn6ABAAAADQnJlfAFRK9/w8Lr/0QDrL/EA6y/xEPs/8NCqr/Pj54/0xN\r\n        bP8UEKD/EAy0/xAOsP8RDrH/DAmx/yooiP9TVGj/UU9m/09PZf9JSGX/Kipr/w0Llf8NCbP/LSuE/1NU\r\n        aP8ZGJL/Dwq0/xEOr/8TEbL/AgCt/2Vjzv//////+/b///9m////Gf///wD///8A////AP///wD///8A\r\n        ////Av///wP///8A////AP///wD///8A////AP///wL///8A////Kf////P////////6+fr/sLCw8ZSU\r\n        lHMAAAAA////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+gAQAAAA1JCJawBYTx/8QDrb9EA+7/xAP\r\n        uv8QELv/DQq3/21slP+Gh4n/Gxm3/xEQw/8VE7//FxK6/woHu/9DQqD/k5OH/4uKmf+SlaD/k5SY/4+P\r\n        g/9DQ3r/AgCt/0xLnf+UlIL/KCan/w8MwP8TErz/EhK7/wwMuv8iIb//7u77/////////////v////3f\r\n        /v//tP///33///9H////Hv///wD///8A////AP///wD///8A////AP///wH///8A////Av///wD///85\r\n        ////9P////////f29/+srKz2mJiYZgAAAAD///8BAAAAAAAAAAAAAAAAAAAAAAAAAAB+foEEAAAANSQj\r\n        X8IdGtP/HBvD/Rwbxf8cG8X/HhzH/xcVxP93dqT/jY+a/xUUof8MDKT/Dw2t/xsaxf8XFMr/TUuw/6Gh\r\n        l/9TUr7/RUHX/1NR1f+Hhqz/lJWT/xgWqv9SUK3/oqCV/ygnr/8QDb7/FBS9/xkYxf8gHsf/ExPE/09O\r\n        0//DwvH/8e78//////////////////////////////L////Q////dv///wD///8C////AP///wD///8A\r\n        ////AP///wP///8F////AP///0n////7///////+8/Lz/6enp/CWlpZbAAAAAP///wEAAAAAAAAAAAAA\r\n        AAAAAAAAfn6BBAAAADYkI2DDJCLd/yko0f0oJ9L/KCfS/yop1P8jIc//iIe2/7Szr/94eJL/dXSM/2Rk\r\n        iv8wMI//GhjG/11cwf+8va//SUnB/x8d0P8eHtX/YmHF/76+rv87Orj/Xly7/728r/9WVpL/PT2D/0ZF\r\n        hf8xL6T/JSTS/ysq0/8fHtD/IiHQ/0A/1/9XVd//p6Te//Xz7//59fv///3//////////////7b///8A\r\n        ////Av///wH///8A////CP///wD///8A////AP///wf///8A////Wf///v/+//////7t7e3/o6Oj65mZ\r\n        mU0AAAAA////AgAAAAAAAAAAAAAAAH5+gQQAAAA3IyNmxC4r6v86ONz9Nzbd/zg23f85N9//MTDZ/5qZ\r\n        yv/Q0Mz/xsbX/87N2P/b3NT/tLO4/y4tsf9pZ8//1NbI/19dz/80M93/MzLf/2hozf/W2Mr/VFXQ/29t\r\n        zP/V1Mr/zs3J/9DPxv/X18b/e3vI/y4t3v86ON7/Ojje/zg33v85Ntz/FhXb/09Ovv/b28r/2Njb/9nZ\r\n        2f/49Pj///3///+U////AP///wT///8D////Af///7v////I////Yf///xX///8A////AP///wD///9t\r\n        ///+//7//////uno6f+amprPr6+vHAAAAAAAAAAAAAAAAAAAAAB+foEEAAAANyIiasU4NvT/TErl/UhH\r\n        6P9JR+j/S0np/0A/4/+wsdv/09Xh/2Jh6/9iYu//jYze/+7w4f9radP/cXDZ/+zu4P9ra93/QULr/zQy\r\n        1P+CgMb/7u7k/1pa4/+BgNz/6erg/5CN6f+JiPT/j47w/2pq8P9JSOr/Skjp/0lI6f9JR+n/UU/o/zEy\r\n        6v9cXMj/29vM/9TU1//MzMz/9/L3////////hf///wD///8I////AP///3T////////////////////r\r\n        //3/nv/+/0H///8F////AP///3P///78/v/////+ycnJ95WVlUwAAAAAAAAAAAAAAAAAAAAAf3+CAwAA\r\n        AC4kInC/QkL9/11c7f5ZWPH/Wlnw/1xb8v9QT+v/vr/q/+Lj6v9PTab/OTiU/5WUxP/9/vb/gH7u/4GC\r\n        5v/8/PP/eHa+/z4+nP9VVZn/19ne/+Pk9v9cWu7/k5Pm//r88v9kYrT/PTyg/0ZEov9HR63/VVPi/1pb\r\n        8v9aWfD/WVjw/2Fg8P88PPT/XFvN/9vczP/S0tX/zMzM//j0+P///////3P///8A////Af///yv////3\r\n        /////v//+vb6///8//7///////////////3/zv/8/3X///8d///+0/7//v7+/d7c3vKenp42AAAAAAAA\r\n        AAAAAAAAAAAAAHx8fwIAAAIUJid4sFBP//5wcPP9amv3/2xs9v9tbvf/Zmb0/83N9f////n/6ejn/+zs\r\n        5/////j/5Ob5/3p49/+dnfL////7/+3v7f/m5+H/+/vy//v9/v+qrPb/ZmP2/6qq8/////z/7e7o/+fo\r\n        4f/t7uP/1Nbf/21t5f9qbPn/bW32/2tr9/9zcvf/TEv3/19f2f/f387/zs7S/8zMzP/79/v///////9i\r\n        ////Af///wP////F////////+vj6/83Nzf3Kysr/7u3ut//8/9n//v//////////////+f/9//n/+///\r\n        ///GxsanwMDABv///wEAAAAAAAAAAAAAAADMzM4CAAAAACcna3lLS///jI33/H5++/9/fvv/fn76/4B/\r\n        /P+0tP7/z8/9/9DQ///R0P//w8P8/5uc+/99ffz/oJ7+/83N/P/Q0f//0tH//8nJ//+op/z/g4P8/3x7\r\n        /P+jpP3/zs78/8/Q///S0f//09L//8bF//+IiP7/fX36/39/+/99ffr/kZH6/0hI/P9xcN//4+PS/8zM\r\n        z//Ozs7//vv+////////Vf///wD///96//////////7//9ra2vzBwcH/zc3NmAAAAAD///8L////Uv/9\r\n        /63//P/z///////////s7OzHysvKFwAAAAD///8BAAAAAAAAAAAAAAAA////AV5fXAEBAQUZMTDr42pq\r\n        /v+fn/79nqD9/p2d/P6fn/3/oaH//6Cg/v+eoP3/n6D9/5+f/v+fn///oaH+/6Kg/v+hoP7/oKH+/5+f\r\n        /f+dn/7/nZ7//6Gg//+hov7/oaD+/6Gg/v+foP7/n6D9/5+f/v+fn/z/oKH+/6Kh/v+gof7/oaH//3p5\r\n        //8qKvj/uLna/9va1P/Ly83/0NDQ///+/////////yv///8j////+f///////+zr7PzCwsL/0dHRowAA\r\n        AAD///8DAAAAAAAAAAAAAAAA////Hv/+/1f///9N9PT0BgAAAAD///8BAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD//v8CAAAAAFpagTZWUv/UQkL7/1NS//9gX///WFf//1BP//9PT///T0///09P//9QT///UE///09P\r\n        //9PT///T0///1BP//9QT///UE///1BQ//9QT///UE///09P//9PT///UE///1BP//9QT///UE///09P\r\n        //9QT///UFD//0dG//85OPX/pKTe/93d1P/R0dT/ycnJ/9HQ0f////////////9M////v/////////r5\r\n        +vzHx8f/0dHRrQAAAAD///8C////Af///wH///8D////AgAAAAAAAAAAAAAAAAAAAAD///8BAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wIAAAAA+Pn+CM7O/zasreg/LzBqThoaVZehot38srPv/6us\r\n        6P+sren/q6zo/6ys6f+rrOj/qqvn/6ur5/+rrOj/qqvn/6mq5v+oqeX/qanm/6ip5f+nqOT/p6jk/6en\r\n        4/+mpuL/pabi/6Sl4f+kpOH/o6Tg/6Kj3/+oqN7/0NHY/9/g0//Q0dP/0NDP/8fHx//Dw8P//Pz8////\r\n        /////f////////////zV1dX/zs7Ot/z8/AYAAAAA////AgAAAAAAAAAAAAAAAAAAAAD///8C////A///\r\n        /wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AgAAAAAAAAAAAAAAAAEB\r\n        AQkREQVu4ODT+vb26f/t7d//7u7g/+3t3//t7eD/7e3f/+zs3//s7N//7O3f/+vr3v/r693/6urc/+rq\r\n        3P/p6dz/6Ojb/+fo2v/n59r/5ubZ/+bm2P/l5dj/5eXX/+Tj1v/j4tb/4ODU/9fX1P/Q0NT/0dHQ/8zM\r\n        zP/ExMX/sbGx/9HR0f////////////////zj4+P/zMzMvfr6+goAAAAA////AgAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD9/f4B/v7/BM/P0QMCAgQXEhIUd9LS1Pvn5+n/3d3g/97e4f/e3uD/3t7h/97e4P/d3eD/3d3g/93d\r\n        3//c3N//29ve/9vb3f/b293/2trd/9rZ3P/Z2dv/2Njb/9jY2v/X19n/1tbZ/9bW2P/U1Nf/09TW/9LS\r\n        1f/R0dL/0NDP/8zMzP/Gxsb/vLy8/6urq/+1tbX/3t7e/97d3vzR0dH/zMzMw/n5+Q0AAAAA////AgAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wEAAAAAAAAAFBEREXXT09P66Ojo/97e3v/g4OD/39/f/9/f\r\n        3//f39//39/f/97e3v/d3d3/3d3d/9zc3P/c3Nz/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Z2dn/19fX/9bW\r\n        1v/W1tb/1NTU/9PT0//R0dH/zs7O/8vLy//Gxsb/vr6+/7S0tP+kpKT/ubm5/83Nzfy/v7//yMjIyPn5\r\n        +RAAAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAAAAAABQRERF109PT++fn\r\n        5//d3d3/39/f/97e3v/e3t7/3d3d/93d3f/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9jY2P/X19f/1tbW/9fX\r\n        1//W1tb/1dXV/9XV1f/U1NT/0tLS/9HR0f/Pz8//zMzM/8nJyf/ExMT/vr6+/7W1tf+rq6v/oKCg/7y8\r\n        vPy+vr7/v7+/zvX19RQAAAAA////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AQAA\r\n        AAABAQEUEhISdNTU1Prl5eX/3Nzc/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9jY2P/X19f/1tbW/9XV\r\n        1f/V1dX/1NTU/9PT0//T09P/0tLS/9HR0f/Q0ND/z8/P/83Nzf/MzMz/ycnJ/8XFxf/BwcH/u7u7/7S0\r\n        tP+tra3/oaGh/6Wlpfu1tbX/t7e30/Dw8BcAAAAA////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAADBoaGlXb29vw4ODg+9jY2PvZ2dn72NjY+9bW1vvV1dX71NTU+9LS\r\n        0vvR0dH7z8/P+87OzvvOzs77zs7O+83NzfvMzMz7zMzM+8zMzPvLy8v7ycnJ+8jIyPvGxsb7w8PD+8DA\r\n        wPu8vLz7t7e3+7Gxsfuqqqr7oKCg/ZmZmf+np6f/tbW11+3t7RoAAAAA////AwAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA29vbAQMDAwEhISEj6+vr/uHh4f/e3t7/39/f/97e\r\n        3v/c3Nz/29vb/9ra2v/X19f/1tbW/9XV1f/S0tL/0tLS/9HR0f/Pz8//zc3N/8zMzP/Kysr/x8fH/8PD\r\n        w//BwcH/vb29/7q6uv+2trb/sbGx/6urq/+lpaX/n5+f/52dnf+ysrLxzc3Nn/X19RgAAAAA////AwAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wEAAAAA19fXB/r6\r\n        +mr39/d1+Pj4dfj4+HX39/d19/f3dfb29nX29vZ19vb2dfX19XX19fV19PT0dfT09HXz8/N18/PzdfLy\r\n        8nXx8fF17+/vde7u7nXs7Ox17Ozsderq6nXp6el16Ojodebm5nXk5OR14uLidePj42/u7u5O+vr6HgAA\r\n        AAAAAAAA////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////8AAAAAAA///g\r\n        AAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB///AAAAAA\r\n        AH//4AAAAAAAf//AAAAAAAB//4AAAAAAAH//gAAAAAAAf/+AAAAAAAB//4AAAAAAAH//gAAAAAAAf/+A\r\n        AAAAAAB//4AAAAAAAH//gAAAAAAAf/4AAAAAAAB/4AAAAAAAAH/AAAAAAAAAf4AAAAAAAAB/gAAAAAAA\r\n        AH+AAAAAAAAAf4AAAAAAAAB/4AAAAAAAAH/+AAAAAAAAf/+AAAAAAAB//4AAAAAAAH//gAAAAAAAf/+A\r\n        AAAAAAAH/4AAAAAAAAP/gAAAAAAAA/+AAAAAAAAD/4AAAAAAAAP/AAAAAAAAB/wAAAAAAAAP/AAAAAAA\r\n        AB/4AAAAAAAAP/gAAAAAAAA/+AAAAAAAAD/4AAAAAAAAH/gAAAAAAAAP+AAAAAAAAAf4AAAAAAAAA/gA\r\n        AAAAAAAD+AAAAAAAAAP4AAAAAAAAA/wAAAAAAAcH/AAAAAAAD//+AAAAAAAf///gAAAAAD////AAAAAA\r\n        f///8AAAAAD////wAAAAAf////AAAAAD////8AAAAAf////wAAAAD/////AAAAAf/////////////ygA\r\n        AADAAAAAgAEAAAEAIAAAAAAAAEACACMuAAAjLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAQAAAAEAAAADAAAABAAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA\r\n        AAcAAAAHAAAABwAAAAYAAAAFAAAABAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA\r\n        AAQAAAAIAAAADAAAABAAAAATAAAAFgAAABYAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAA\r\n        ABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAWAAAAFQAA\r\n        ABMAAAAPAAAACgAAAAcAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAkAAAAQAAAAGAAA\r\n        ACAAAAAmAAAAKwAAAC0AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAA\r\n        AC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAtAAAAKgAAACUAAAAeAAAAFgAA\r\n        AA0AAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABwAAAA8AAAAaAAAAKAAAADYAAABAAAAARwAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABMAAAATAAA\r\n        AEwAAABMAAAATAAAAEwAAABMAAAATAAAAEwAAABKAAAARgAAAD0AAAAyAAAAJAAAABYAAAANAAAABQAA\r\n        AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADAAAACgAAABYAAAAoAAAAPQAAAFEAAABgAAAAawAAAHEAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAAAHMAAABzAAAAcwAA\r\n        AHMAAABzAAAAcwAAAHMAAABwAAAAaAAAAFwAAABLAAAANgAAACIAAAATAAAABwAAAAEAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAEAAAADQAAABwAAAAyAAAATQAAAGYAAAB5AAAAiAAAAI8AAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAAAJEAAACRAAAAkQAA\r\n        AJEAAACOAAAAhAAAAHUAAABfAAAARAAAACsAAAAXAAAACgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAA\r\n        ACEAAAA6AAAAWQAAAHYAAACNAAAAnQAAAKYAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAA\r\n        AKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACkAAAAmQAA\r\n        AIcAAABuAAAATwAAADIAAAAcAAAACwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACQAAAA/AAAAYQAA\r\n        AIEAAACaAAAAqwAAALUAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAA\r\n        ALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAACzAAAApwAAAJQAAAB5AAAAVwAA\r\n        ADcAAAAeAAAADQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIYAAACgAAAAsgAA\r\n        ALwAAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAA\r\n        AL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAC7AAAArgAAAJoAAAB+AAAAWwAAADkAAAAfAAAADQAA\r\n        AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTdxMTE/8bGxv/AwMD/vr6+/7u7\r\n        u/+3t7f/tra2/7e3t/+4uLj/ubm5/7m5uf+5ubn/ubm5/7q6uv+6urr/u7u7/7u7u/+7u7v/vLy8/7y8\r\n        vP+8vLz/vLy8/729vf+9vb3/vb29/729vf+9vb3/vr6+/76+vv++vr7/vr6+/76+vv+/v7//v7+//7+/\r\n        v/++vr7/v7+//7+/v/+/v7//v7+//7+/v//AwMD/wMDA/8HBwf/AwMD/v7+//7+/v/+/v7//wMDA/8DA\r\n        wP/AwMD/x8fH/8rKyv/Pz8//0dHR/9LS0v/S0tL/0tLS/9PT0//S0tL/0tLS/9LS0v/S0tL/0dHR/9HR\r\n        0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR\r\n        0f/Q0ND/0NDQ/9DQ0P/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/87Ozv/Ozs7/zc3N/83N\r\n        zf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Ly8v/y8vL/8zMzP/Nzc3/z8/P/9DQ0P/V1dX/1dXV/9XV\r\n        1f/V1dX/1dXV/9XV1f/U1NT/1NTU/9TU1P/U1NT/1NTU/9PT0//T09P/09PT/9PT0//T09P/0dHR/9HR\r\n        0f/Q0ND/z8/P/83Nzf/Nzc3/zs7O/8/Pz//IyMj/yMjI/8PDw/+cnJxuAAAADQAAAAMAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTdzMzM/9nZ2f/a2tr/29vb/9vb2//b29v/29vb/9zc\r\n        3P/e3t7/3t7e/97e3v/c3Nz/3d3d/93d3f/e3t7/3t7e/97e3v/f39//39/f/9/f3//f39//4ODg/+Dg\r\n        4P/g4OD/4ODg/+Dg4P/h4eH/4eHh/+Hh4f/h4eH/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li\r\n        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/9/f3//e3t7/3d3d/9vb2//a2tr/29vb/9zc3P/c3Nz/4eHh/+Dg\r\n        4P/g4OD/4eHh/+Li4v/j4+P/4+Pj/+Li4v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Tk\r\n        5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Li4v/i4uL/4uLi/+Hh\r\n        4f/g4OD/4ODg/+Dg4P/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/97e3v/e3t7/3d3d/93d\r\n        3f/d3d3/3d3d/93d3f/c3Nz/29vb/9vb2//c3Nz/3d3d/97e3v/a2tr/2tra/9ra2v/a2tr/2tra/9ra\r\n        2v/a2tr/2tra/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9jY2P/Y2Nj/19fX/9fX1//X19f/1dXV/9PT\r\n        0//S0tL/0NDQ/8/Pz//Pz8//zc3N/8fHx/+ZmZlvAAAADQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAA\r\n        ACUAAABCAAAAZQAAAIaUlJTdzs7O/93d3f/d3d3/3d3d/97e3v/f39//39/f/+Dg4P/h4eH/4eHh/+Hh\r\n        4f/h4eH/4eHh/+Li4v/i4uL/4uLi/+Li4v/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk\r\n        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Xl5f/l5eX/5eXl/+Xl5f/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Pj\r\n        4//j4+P/4+Pj/+Dg4P/e3t7/29vb/9jY2P/V1dX/1dXV/9fX1//Z2dn/39/f/93d3f/c3Nz/3t7e/+Hh\r\n        4f/k5OT/5ubm/+bm5v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+bm5v/m5ub/5ubm/+bm\r\n        5v/m5ub/5ubm/+bm5v/m5ub/5OTk/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Pj4//k5OT/5OTk/+Pj\r\n        4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Hh4f/h4eH/4eHh/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4eHh/+Dg\r\n        4P/f39//3t7e/97e3v/d3d3/3Nzc/9zc3P/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d\r\n        3f/d3d3/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//b29v/2dnZ/9nZ2f/Z2dn/2NjY/9bW1v/W1tb/1NTU/9HR\r\n        0f/S0tL/0NDQ/8rKyv+ZmZlvAAAADQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAA\r\n        AIaUlJTd0NDQ/9/f3//e3t7/3d3d/+Dg4P/h4eH/4eHh/+Hh4f/j4+P/5OTk/+Tk5P/j4+P/4+Pj/+Pj\r\n        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5OTk/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5ubm/+bm\r\n        5v/m5ub/5ubm/+fn5//n5+f/5+fn/+fn5//o6Oj/5+fn/+fn5//m5ub/5eXl/+Tk5P/j4+P/4uLi/9ra\r\n        2v/Y2Nj/1NTU/8/Pz//MzMz/y8vL/83Nzf/Pz8//1NTU/9TU1P/W1tb/2NjY/9zc3P/h4eH/5OTk/+fn\r\n        5//m5ub/5ubm/+bm5v/m5ub/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn\r\n        5//n5+f/5ubm/+bm5v/m5ub/5ubm/+Xl5f/l5eX/5eXl/+Xl5f/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Li\r\n        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/h4eH/4ODg/+Dg4P/g4OD/4ODg/+Dg\r\n        4P/g4OD/39/f/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/93d3f/d3d3/3Nzc/9zc\r\n        3P/c3Nz/3Nzc/9vb2//b29v/29vb/9vb2//a2tr/2NjY/9fX1//W1tb/1NTU/9LS0v/R0dH/0NDQ/8rK\r\n        yv+YmJhvAAAADQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd0tLS/+Hh\r\n        4f/i4uL/4ODg/+Hh4f/h4eH/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm\r\n        5v/m5ub/5ubm/+fn5//n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+np\r\n        6f/p6en/6enp/+np6f/o6Oj/6enp/+fn5//n5+f/5ubm/+Xl5f/j4+P/2tra/9XZzv/Szs3/08zR/83F\r\n        z//Fxsr/vsPG/8TGx//Kxcf/z83D/9PPzv/X09j/0tTV/9fb3P/c3eH/6Ozh/+Xn2//o6Oj/5ubm/+rq\r\n        6v/p6en/6enp/+vr6//p6en/6urq/+np6f/p6en/6enp/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+jo\r\n        6P/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl\r\n        5f/l5eX/5OTk/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/i4uL/4eHh/+Hh4f/i4uL/4uLi/+Li\r\n        4v/h4eH/4eHh/+Hh4f/h4eH/4ODg/+Dg4P/g4OD/4ODg/9/f3//f39//39/f/9/f3//e3t7/3t7e/93d\r\n        3f/d3d3/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/X19f/1dXV/9TU1P/S0tL/0dHR/83Nzf+YmJhvAAAADgAA\r\n        AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd0tLS/+Hh4f/i4uL/4eHh/+Li\r\n        4v/j4+P/5OTk/+Xl5f/l5eX/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5+fn/+fn5//n5+f/5+fn/+jo\r\n        6P/o6Oj/6Ojo/+jo6P/p6en/6enp/+np6f/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq\r\n        6v/q6ur/6+vr/+rq6v/p6en/6Ojo/+bm5v/j4+P/2dnZ/83P0P/O0ND/xMbG/8XGxP+6uLf/v7y4/728\r\n        uP+9u7r/vby+/8XGwv/My83/1dXb/8/U0v/e4+H/2NXe/+fe6P/p6en/6enp/+zs7P/q6ur/6enp/+rq\r\n        6v/o6Oj/6enp/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo\r\n        6P/o6Oj/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5eXl/+Xl\r\n        5f/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/i4uL/4+Pj/+Pj4//h4eH/4eHh/+Hh\r\n        4f/h4eH/4eHh/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/9/f3//f39//3t7e/97e3v/d3d3/3d3d/9zc\r\n        3P/b29v/2tra/9nZ2f/Y2Nj/1tbW/9TU1P/T09P/0tLS/87Ozv+amppxAAAADgAAAAMAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd09PT/+Hh4f/j4+P/4uLi/+Pj4//k5OT/5eXl/+bm\r\n        5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+np6f/p6en/6urq/+rq\r\n        6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7e3t/+vr\r\n        6//q6ur/5+fn/+Tk5P/f39//1NTU/9PL0v/IycX/uL65/7S3rv+2rLj/tq+0/7e1u/+vtrH/tLm6/7m8\r\n        xP/Excn/yMTD/9jR1v/V1Mr/2NTf/9/h6f/n5+f/6urq/+3t7f/r6+v/6+vr/+zs7P/q6ur/6+vr/+vr\r\n        6//r6+v/6+vr/+zs7P/r6+v/6+vr/+vr6//q6ur/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np\r\n        6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl\r\n        5f/l5eX/5eXl/+Xl5f/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li\r\n        4v/i4uL/4uLi/+Dg4P/h4eH/4ODg/+Dg4P/g4OD/39/f/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9ra\r\n        2v/Z2dn/1tbW/9XV1f/T09P/0tLS/87Ozv+enp58AAAADgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAA\r\n        ACUAAABCAAAAZQAAAIaUlJTd09PT/+Li4v/k5OT/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+np\r\n        6f/p6en/6enp/+np6f/p6en/6enp/+rq6v/q6ur/6urq/+rq6v/q6ur/6+vr/+vr6//r6+v/6+vr/+zs\r\n        7P/s7Oz/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7u7u/+vr6//p6en/5eXl/+Dg\r\n        4P/Z2dn/zs7O/8fBzP+8u7//s7qr/6OkqP+pqqH/qaSm/6Wpnv+boJ7/trOu/6utrv+0vrL/wcS7/8zJ\r\n        u//by9z/2dfW/9Xd3P/g4OD/5ubm/+rq6v/q6ur/6+vr/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7e3t/+3t\r\n        7f/s7Oz/7Ozs/+zs7P/s7Oz/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6enp/+np\r\n        6f/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm\r\n        5v/m5ub/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li\r\n        4v/i4uL/4uLi/+Hh4f/h4eH/4ODg/+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9vb2//Z2dn/19fX/9XV\r\n        1f/U1NT/09PT/87Ozv+enp58AAAADgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAA\r\n        AIaUlJTd09PT/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+np6f/q6ur/6urq/+rq\r\n        6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs\r\n        7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+vr6//p6en/4+Pj/93d3f/W1tb/ysrK/7vA\r\n        vv+rsK7/pqip/6OpqP+TmKf/j5Kn/4yKoP+hoKr/qKOk/6+usv+qrbL/srqv/77Ev//Gyr//1tXL/9zZ\r\n        1f/a2tr/4+Pj/+jo6P/o6Oj/6urq/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t\r\n        7f/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+rq\r\n        6v/p6en/6enp/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn5//n5+f/5ubm/+bm\r\n        5v/m5ub/5ubm/+bm5v/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Li\r\n        4v/i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//Z2dn/19fX/9XV1f/V1dX/1NTU/8/P\r\n        z/+fn598AAAADgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd1NTU/+Pj\r\n        4//l5eX/5OTk/+bm5v/n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr\r\n        6//s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7u7u/+7u7v/t7e3/7e3t/+rq6v/n5+f/4uLi/9vb2//T09P/x8fH/8C+tP+0r7D/oZ+y/32I\r\n        o/9aXr3/TEjQ/0g80P9aVL//Zm+4/42Zo/+pnrj/vbS+/7m1wP+4usX/u7zG/9PVyf/Y2Nj/4+Pj/+fn\r\n        5//o6Oj/6+vr/+3t7f/u7u7/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t\r\n        7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/6urq/+rq\r\n        6v/q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+fn5//m5ub/5ubm/+bm\r\n        5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4uLi/+Hh\r\n        4f/h4eH/4ODg/97e3v/d3d3/3Nzc/9vb2//a2tr/19fX/9XV1f/W1tb/1dXV/8/Pz/+fn598AAAADgAA\r\n        AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd1NTU/+Tk5P/m5ub/5eXl/+bm\r\n        5v/o6Oj/6enp/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+zs\r\n        7P/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v\r\n        7//t7e3/7u7u/+vr6//o6Oj/4uLi/9ra2v/R0dH/xMTE/7+7uv+oq7P/dXq5/zcg7v8uGv//OC///0dM\r\n        7/9BOfj/MSv8/zIZ5f+Diaz/o6So/7a1sf+7vb7/vsHF/8bNxv/T09P/4ODg/+Tk5P/m5ub/6+vr/+3t\r\n        7f/v7+//7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t\r\n        7f/t7e3/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr\r\n        6//q6ur/6urq/+rq6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+bm\r\n        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/i4uL/4ODg/9/f\r\n        3//e3t7/3d3d/9zc3P/a2tr/2NjY/9bW1v/X19f/1dXV/9DQ0P+enp59AAAADgAAAAQAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd1NTU/+Tk5P/m5ub/5ubm/+fn5//p6en/6enp/+np\r\n        6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u\r\n        7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx/+/v\r\n        7//r6+v/5OTk/9vb2//R0dH/w8PD/6G1uv9oadn/Jhbw/yQg+/85OP//Skj//1lO//9fWP//WFj//z86\r\n        +/8tHPX/ZmvI/5qjrf+2rLj/xbrE/8nIxP/Kysr/2dnZ/97e3v/h4eH/6Ojo/+vr6//u7u7/7Ozs/+/v\r\n        7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6+vr/+rq\r\n        6v/q6ur/6urq/+rq6v/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn5//n5+f/5ubm/+bm\r\n        5v/m5ub/5ubm/+Tk5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//3t7e/93d\r\n        3f/b29v/2NjY/9fX1//Y2Nj/1dXV/9DQ0P+enp59AAAADwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAA\r\n        ACUAAABCAAAAZQAAAIaUlJTd1tbW/+fn5//m5ub/5ubm/+fn5//p6en/6urq/+vr6//s7Oz/7Ozs/+zs\r\n        7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7+/v/+7u7v/u7u7/7u7u/+/v\r\n        7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/w8PD/7+/v/+/w7v/s7ev/4eHh/9rZ\r\n        2//T0tb/xcTI/5Gaxv8UEvT/Nzbg/zE09P9FN///TTn+/0dC+/9QSv3/Yln//2Zo9v9rYP//NB///1Zh\r\n        0P+aobX/sLSu/8fEvP/E0L7/0tHT/9vV1v/o5ef/2+Dj/+ft8v/q6e3/8ubs//Hx8f/u7u7/8vLy//Dw\r\n        8P/v7+//8fHx//Dw8P/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+vr6//r6+v/7Ozs/+vr6//r6+v/6urq/+rq\r\n        6v/q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl\r\n        5f/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4uLi/+Hh4f/f39//39/f/97e3v/c3Nz/2dnZ/9jY\r\n        2P/Y2Nj/2NjY/9HR0f+dnZ19AAAADwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAA\r\n        AIaUlJTd19fX/+fn5//m5ub/5+fn/+jo6P/p6en/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t\r\n        7f/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//u7u7/7u7u/+/v7//w8PD/8PDw//Dw\r\n        8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/8fHx//Dx7//t7uz/4uLi/9rZ2//T0tb/xMPH/2ln\r\n        2P8yMPj/Vk7u/0tM9P9FP/L/Rz31/zg27v9AO///Sj/6/1xR//9YVvz/X17//zsu//9VUtD/q6W8/7i3\r\n        u//ExcP/xsnH/9LQ3P/d3tX/6e3h/9/h6f/t7+//8e/n//Hx8f/u7u7/8fHx//Hx8f/w8PD/8PDw/+/v\r\n        7//w8PD/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq\r\n        6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+bm5v/l5eX/5eXl/+Xl\r\n        5f/k5OT/5OTk/+Tk5P/k5OT/4uLi/+Hh4f/g4OD/39/f/97e3v/c3Nz/2tra/9jY2P/Z2dn/2NjY/9LS\r\n        0v+dnZ19AAAADwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd19fX/+fn\r\n        5//m5ub/6Ojo/+jo6P/q6ur/6+vr/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/y8vL/8fHx//Dx7//u7+3/5eXl/97d3//W1dn/xsXJ/0M67/9MR/b/cGft/2Ji\r\n        8v9fYfX/T1fw/zs18v8wNfX/Pjz0/0g89P9DQ/v/V1n0/2JZ/f86Mf3/W1vR/6mmv/+4tLr/xc3C/8XH\r\n        z//d3Nj/6OLj/+Li3P/m6+L/7/Lw//Hx8f/t7e3/8PDw//Ly8v/x8fH/8PDw//Dw8P/y8vL/8PDw//Dw\r\n        8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//w8PD/7+/v/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u\r\n        7v/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6+vr/+rq6v/q6ur/6enp/+np\r\n        6f/p6en/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Tk\r\n        5P/k5OT/4uLi/+Hh4f/g4OD/39/f/97e3v/c3Nz/2tra/9jY2P/Z2dn/2dnZ/9LS0v+ioqKHAAAADwAA\r\n        AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd19fX/+jo6P/n5+f/6Ojo/+np\r\n        6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+/v7//v7+//7+/v//Dw\r\n        8P/w8PD/8PDw//Dw8P/v7+//8PDw//Dw8P/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Hy8P/v8O7/6enp/+Lh4//Z2Nz/ysnN/y0u7v9lZe//eW/4/2509f9OTvT/IyPr/0M3\r\n        4/8lFez/Lif+/0hL9P9AOvP/Qz71/1xL//9gWv//LSr1/2Fb0v+lqrn/sre2/8TDxf/RzNX/2t7L/+zi\r\n        8v/m5ef/4efm/+/v7//u7u7/8PDw//Ly8v/y8vL/8fHx//Hx8f/y8vL/8fHx//Dw8P/w8PD/8PDw//Dw\r\n        8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//v7+//7+/v/+7u7v/u7u7/7e3t/+3t\r\n        7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+rq6v/q6ur/6enp/+np\r\n        6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5eXl/+Xl5f/l5eX/4+Pj/+Li\r\n        4v/h4eH/4ODg/9/f3//d3d3/29vb/9nZ2f/a2tr/2tra/9LS0v+jo6OKAAAADwAAAAQAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd19fX/+jo6P/n5+f/6Ojo/+np6f/q6ur/6+vr/+zs\r\n        7P/t7e3/7e3t/+3t7f/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Dw8P/x8fH/8fHx//Dw\r\n        8P/w8PD/8PDw//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/8/Pz//Hy\r\n        8P/w8e//6+vr/+Tj5f/b2t7/zczQ/yst/f9mYvf/dXn2/1FW+f8mFv3/FAj8/3iNrP93ha//RD7f/zY6\r\n        7f9YVvD/TUf0/z00//9VSfv/Y13//yUp7P9nacf/pqe7/765tv/Aw8H/z9XU/+Ld3//n3+r/4efm/+zs\r\n        7P/v7+//8PDw//Hx8f/y8vL/8vLy//Pz8//y8vL/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Dw\r\n        8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+3t7f/u7u7/7u7u/+3t\r\n        7f/t7e3/7e3t/+3t7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo\r\n        6P/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5ubm/+Xl5f/l5eX/4+Pj/+Li4v/h4eH/4ODg/9/f\r\n        3//d3d3/29vb/9nZ2f/b29v/2tra/9PT0/+kpKSKAAAADwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAA\r\n        ACUAAABCAAAAZQAAAIaUlJTd2NjY/+np6f/o6Oj/6Ojo/+np6f/q6ur/7Ozs/+3t7f/t7e3/7u7u/+7u\r\n        7v/v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly\r\n        8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Dx7//w8e//7e3t/+jn\r\n        6f/g3+P/09LW/ygx7f9hXvr/anX1/ykn/f8yKv//GAv7/3+RqP+Wlqb/h46h/0A21v86PPT/XVr9/0JH\r\n        6v9EQ/3/WVD7/09R//8wIO//f4W0/66ru/+8v8P/xs3K/83Pyf/g29z/6Orq/+np6f/v7+//8PDw//Dw\r\n        8P/y8vL/8/Pz//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/w8PD/8PDw//Dw8P/w8PD/7+/v//Dw8P/v7+//7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u\r\n        7v/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6urq/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo\r\n        6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+bm5v/m5ub/5OTk/+Pj4//i4uL/4eHh/+Dg4P/e3t7/3Nzc/9ra\r\n        2v/c3Nz/29vb/9PT0/+kpKSKAAAADwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAA\r\n        AIaUlJTd2NjY/+np6f/o6Oj/6enp/+np6f/r6+v/7Ozs/+3t7f/u7u7/7u7u/+7u7v/w8PD/8PDw//Dw\r\n        8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/x8fH/8fHx//Ly8v/z8/P/8/Pz//Pz\r\n        8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/y8vL/8/Pz//Hy8P/x8vD/8PDw/+3s7v/n5ur/29re/ycn\r\n        7/9QTvz/SEX4/ygm/P9XV///JBv0/3WBt/+ippv/m56c/4aOrP8lEvH/SEbz/15c9v86QO3/RTv//2NS\r\n        //9CPvv/PCTu/5Cdtf+wtLX/wr7E/8vMyP/b3Nj/4d/f/+jo6P/u7u7/7+/v//Hx8f/z8/P/8vLy//Pz\r\n        8//z8/P/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/w8PD/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7e3t/+3t\r\n        7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+jo\r\n        6P/n5+f/5+fn/+fn5//m5ub/5OTk/+Pj4//i4uL/4eHh/+Dg4P/e3t7/3Nzc/9ra2v/d3d3/29vb/9PT\r\n        0/+kpKSKAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd2NjY/+np\r\n        6f/o6Oj/6enp/+rq6v/r6+v/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx\r\n        8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T0\r\n        9P/09PT/9PT0//T09P/19fX/9vb2//P08v/z9PL/8vLy/+/u8P/q6e3/397i/z0++v8vHv//MCH4/z5B\r\n        +v9TSv7/OTL//1BI0f+ema7/lZyl/5KYl/9zc6n/Jxf4/05b9/9fWO//RTX0/05I+/9cWf//ODH4/1hZ\r\n        y/+nqq7/w7i7/8bHxf/O0dn/5N/g/+jo6P/t7e3/7e3t//Hx8f/09PT/8fHx//Pz8//09PT/8/Pz//Pz\r\n        8//y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/w8PD/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t\r\n        7f/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn\r\n        5//n5+f/5eXl/+Tk5P/i4uL/4eHh/+Dg4P/f39//3Nzc/9ra2v/d3d3/3Nzc/9PT0/+kpKSKAAAAEAAA\r\n        AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd2tra/+rq6v/q6ur/6enp/+rq\r\n        6v/s7Oz/7e3t/+7u7v/v7+//8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz\r\n        8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1\r\n        9f/29vb/9vb2//X19f/z8/P/8fHx/+/v7//s7Oz/6enp/3OH8v8uIfP/DQX5/0VD//9NQv//Oj7//xkd\r\n        /v9ZYsn/qaCj/6KXof+VlpT/UFPA/y8r7v9mafP/WVT3/0Y5+f9RTP//XFj9/yAd//9vc8T/pqjA/7y+\r\n        xv/Rysf/0tLM/+Li4v/l5eX/7e3t//T09P/v7+//8vLy//T09P/y8vL/9PT0//T09P/z8/P/8/Pz//Pz\r\n        8//z8/P/8vLy//Ly8v/y8vL/8fHx//T09P/z8/P/8/Pz//Pz8//w8PD/8PDw//Hx8f/x8fH/8PDw//Dw\r\n        8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+3t7f/t7e3/7u7u/+zs7P/r6+v/6+vr/+vr\r\n        6//r6+v/6urq/+rq6v/r6+v/6+vr/+np6f/q6ur/6Ojo/+jo6P/q6ur/6Ojo/+bm5v/n5+f/5ubm/+Tk\r\n        5P/l5eX/5OTk/+Dg4P/e3t7/3d3d/9ra2v/d3d3/3d3d/9PT0/+jo6OLAAAAEAAAAAQAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAFAAAAEQAAACUAAABCAAAAZQAAAIaUlJTd29vb/+vr6//q6ur/6urq/+vr6//s7Oz/7e3t/+7u\r\n        7v/v7+//8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz\r\n        8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//T0\r\n        9P/z8/P/8/Pz//Ly8v/w8PD/7e3t/8LF8f8bE/r/NTH8/z0z//89Ov//OD3w/0Mu9f8hEv//ZmrQ/5+i\r\n        p/+ampr/hYmb/0pFyv89QvX/XF/9/1VM8P9JO/7/VFf//1RK+v8rIPL/lqSi/7GtuP+5vb7/1tHQ/9nZ\r\n        2f/e3t7/5eXl/+zs7P/r6+v/8fHx//T09P/19fX/8PDw//Ly8v/19fX/9fX1//X19f/09PT/8/Pz//Ly\r\n        8v/z8/P/8vLy//T09P/y8vL/8vLy//Pz8//x8fH/8vLy//Ly8v/y8vL/8fHx//Hx8f/w8PD/8PDw//Dw\r\n        8P/w8PD/7+/v/+7u7v/v7+//7+/v/+3t7f/t7e3/7u7u/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+vr\r\n        6//q6ur/6enp/+rq6v/r6+v/6Ojo/+fn5//o6Oj/6Ojo/+bm5v/l5eX/4+Pj/+Li4v/j4+P/4uLi/9/f\r\n        3//d3d3/3Nzc/9ra2v/d3d3/3d3d/9TU1P+jo6OLAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAA\r\n        ACUAAABCAAAAZQAAAIaUlJTd29vb/+vr6//q6ur/6+vr/+vr6//t7e3/7u7u/+7u7v/v7+//8PDw//Dw\r\n        8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0\r\n        9P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//T09P/09PT/9fX1//b2\r\n        9v/09PT/8vLy/+3m8/+Lg/j/HR/2/zQz9P84M+z/STv1/z09+/85Lf//FhP4/2tzzP+YoZ7/oJOh/3aB\r\n        of8pGfP/VVj3/2Fh8f9IPe3/R0D//2Vc//87NP//UljD/6inq/+qrrn/ycTB/87Ozv/Y2Nj/4eHh/+jo\r\n        6P/p6en/7u7u/+3t7f/s7Oz/7u7u//Ly8v/09PT/8/Pz//Ly8v/y8vL/8/Pz//Pz8//z8/P/8vLy//T0\r\n        9P/z8/P/8/Pz//T09P/y8vL/8/Pz//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/x8fH/7+/v/+/v\r\n        7//w8PD/7+/v/+7u7v/t7e3/7u7u/+7u7v/u7u7/7e3t/+vr6//r6+v/6urq/+rq6v/p6en/6Ojo/+rq\r\n        6v/o6Oj/5ubm/+Xl5f/l5eX/5+fn/+fn5//k5OT/4uLi/+Hh4f/i4uL/4eHh/9/f3//e3t7/3d3d/9vb\r\n        2//d3d3/3t7e/9TU1P+lpaWNAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQAAACUAAABCAAAAZQAA\r\n        AIaUlJTd29vb/+vr6//r6+v/6+vr/+zs7P/t7e3/7u7u/+/v7//v7+//8PDw//Hx8f/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//X1\r\n        9f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//X19f/19fX/9vb2//f39//19fX/8vLy//f2\r\n        6P/a4fL/aWP2/yEj8/8/P/H/QT/t/zkz8P87Ovz/OzD//xUW+v9aWNr/n6Gp/5qZuf9VV8P/OSz8/2pw\r\n        7f9eU/D/Qzr8/01Q+f9iWf//LyT9/29zrf+sqLP/tby5/8TExP/Q0ND/1tbW/9zc3P/g4OD/6Ojo/+rq\r\n        6v/s7Oz/8PDw//Pz8//09PT/8/Pz//Ly8v/z8/P/8/Pz//Pz8//z8/P/8vLy//X19f/19fX/9fX1//b2\r\n        9v/z8/P/9PT0//Ly8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/x8fH/8PDw/+7u\r\n        7v/t7e3/7e3t/+3t7f/u7u7/7Ozs/+rq6v/p6en/6Ojo/+fn5//l5eX/5OTk/+bm5v/i4uL/4ODg/97e\r\n        3v/d3d3/4eHh/+Pj4//f39//3t7e/97e3v/f39//39/f/9/f3//e3t7/3d3d/9zc3P/e3t7/3t7e/9TU\r\n        1P+pqamXAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEQQEBCYJCQlFCAgIaAgICImUlJTe2NjY/+fn\r\n        5//n5+f/6urq/+zs7P/u7u7/7+/v/+/v7//w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz\r\n        8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X1\r\n        9f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//19fX/8vLy/+jv+P/59uH/z8/t/ycW\r\n        //8rK/P/SEP9/0ZA8/81NvL/Ozb9/zg19v8wK/j/OTnj/31+uv+GjqX/QULa/0lE8/9xbfT/RkXz/0E8\r\n        /f9YVPr/Uk77/ygX8P+bnqP/nqmt/7e3t//Dw8P/ysrK/9HR0f/X19f/4eHh/+Tk5P/o6Oj/6enp/+zs\r\n        7P/v7+//8fHx//Pz8//z8/P/8vLy//Hx8f/w8PD/7+/v//Ly8v/y8vL/8/Pz//T09P/y8vL/8/Pz//Pz\r\n        8//z8/P/8vLy//Ly8v/x8fH/8fHx//Hx8f/x8fH/8PDw//Hx8f/w8PD/7+/v/+7u7v/t7e3/7Ozs/+zs\r\n        7P/r6+v/6urq/+jo6P/n5+f/5ubm/+Pj4//f39//3d3d/97e3v/Z2dn/19fX/9XV1f/T09P/19fX/9ra\r\n        2v/W1tb/2NjY/9nZ2f/a2tr/2tra/9vb2//b29v/2tra/9ra2v/e3t7/3t7e/9XV1f+qqqqXAAAAEAAA\r\n        AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAFKioqFzAwMDI1NTVXMTExfC0tLZuWlpbkzc3N/9nZ2f/a2tr/4ODg/+fn\r\n        5//s7Oz/7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//X1\r\n        9f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2\r\n        9v/19fX/9vb2//b29v/29vb/9/f3//f39//29vb/9PT0//T3/P/o7fD/8vX6/8W+9/8gGPH/NCr4/01J\r\n        7v9GS+3/RDvp/z89+/88Qfz/MS72/ycg8/9YVdD/dHiz/x8V//9gYPr/Wl7z/0FB7f9MQv//YFv//zwy\r\n        9v9UT8r/j5al/6urq/+3t7f/v7+//8fHx//Ozs7/1tbW/9jY2P/c3Nz/4ODg/+Dg4P/k5OT/6enp/+3t\r\n        7f/u7u7/8PDw//Hx8f/v7+//7+/v//Hx8f/x8fH/8vLy//T09P/z8/P/9PT0//X19f/09PT/8/Pz//Ly\r\n        8v/y8vL/8fHx//Hx8f/x8fH/7u7u/+/v7//u7u7/7e3t/+zs7P/r6+v/6Ojo/+jo6P/n5+f/5eXl/+Li\r\n        4v/f39//3Nzc/9ra2v/Y2Nj/19fX/9LS0v/Nzc3/zc3N/87Ozv/MzMz/z8/P/9LS0v/Q0ND/0NDQ/9LS\r\n        0v/U1NT/1tbW/9nZ2f/Z2dn/2dnZ/9ra2v/e3t7/39/f/9XV1f+qqqqXAAAAEAAAAAQAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AABQUFAKZGRkKWtra1dxcXGMcXFxsXFxccqbm5vytLS0/7i4uP+7u7v/yMjI/9nZ2f/m5ub/7u7u//Dw\r\n        8P/x8fH/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X1\r\n        9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//19fX/9vb2//b2\r\n        9v/29vb/9/f3//f39//39/f/9vb2//b69f/w9vH/+f3y/+bv8//d2/j/ZGXz/zMs8/9MSO7/UEj5/0k/\r\n        7f8uM/r/Qz///0k2//8rJv7/FRDv/0M/5P82Mf7/b3Xy/05I9f9JPvj/Tkz//2Vm9P8rF/n/eX+u/5ub\r\n        m/+kpKT/rKys/7a2tv+8vLz/x8fH/83Nzf/S0tL/19fX/9fX1//a2tr/4eHh/+Xl5f/m5ub/6urq/+/v\r\n        7//u7u7/7u7u//Hx8f/y8vL/8/Pz//X19f/09PT/9fX1//Pz8//z8/P/8vLy//Hx8f/x8fH/8fHx//Hx\r\n        8f/x8fH/7e3t/+7u7v/r6+v/6enp/+np6f/m5ub/4+Pj/+Li4v/f39//3Nzc/9jY2P/U1NT/0NDQ/87O\r\n        zv/Nzc3/zMzM/8XFxf/CwsL/xMTE/8bGxv/FxcX/xsbG/8jIyP/IyMj/ycnJ/8zMzP/Ozs7/0tLS/9bW\r\n        1v/Y2Nj/2dnZ/9vb2//e3t7/39/f/9XV1f+oqKiYAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnweJiYkgiYmJVouL\r\n        i5KNjY3Bj4+P3ZCQkOyenp77pKSk/6SkpP+np6f/srKy/8PDw//W1tb/5OTk/+7u7v/y8vL/8vLy//Pz\r\n        8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b2\r\n        9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//29vb/9/f3//f39//39/f/9vb2//f3\r\n        9//4+Pj/+Pj4//Dy/P/89/T/9u75//b48v/r8/P/5+n7/4F9+/8fIPT/RUL1/0xM9P9XRu3/PTL6/zU8\r\n        /f89Pfv/NDT+/xcU/f8XC/3/WV3x/29p7P9EPvf/TEX//1RW+v9WSfn/SkfF/4mJif+Tk5P/np6e/6ur\r\n        q/+xsbH/urq6/76+vv/CwsL/y8vL/8vLy//Q0ND/2dnZ/9vb2//a2tr/3d3d/+Pj4//k5OT/5eXl/+vr\r\n        6//t7e3/7u7u/+/v7//t7e3/7e3t//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/7u7u/+3t\r\n        7f/q6ur/5+fn/+bm5v/j4+P/3t7e/93d3f/U1NT/09PT/9LS0v/Pz8//y8vL/8bGxv/CwsL/wMDA/729\r\n        vf+7u7v/vb29/8DAwP++vr7/u7u7/7u7u/+9vb3/w8PD/8bGxv/Jycn/zc3N/9PT0//W1tb/19fX/9nZ\r\n        2f/e3t7/39/f/9bW1v+oqKiYAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBp+fnxqYmJhNl5eXlKamptjIyMj12tra/dra\r\n        2v7Pz8//ycnJ/6ampv+fn5//pKSk/66urv+/v7//1NTU/+Xl5f/v7+//8/Pz//T09P/09PT/9PT0//X1\r\n        9f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3\r\n        9//39/f/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//r5\r\n        9f/59/b/9fX1//X29P/y9fP/9vX//+Xg/f+9suD/ERf+/zIt9P9ZUO3/VUnv/0E79P84N+v/QTz1/0M9\r\n        +v8pJ/3/HSD+/2xv+f9kWfX/Qz3u/05M+v9dX///PC3z/1tbp/+OgpT/kZSS/5ydof+qoK3/qq6i/6+r\r\n        t/+stK3/vLe4/8TCwf/BxcD/xsvJ/8nPzv/P0tb/0dLW/9bX2//Y2Nj/2tra/+Dg4P/j4+P/5OTk/+bm\r\n        5v/o6Oj/5+fn/+bm5v/o6Oj/6urq/+3t7f/q6ur/6urq/+/v7//v7+//5+vg/+Lj3//h4t7/3+LZ/9rY\r\n        2P/Y0t3/19PY/9LUyP/Qzs3/ycfH/8PCxv/Bwsb/v8HB/7u+vP+5ubn/tLO1/7Szt/+vrrD/r6+v/6+w\r\n        rv+srav/rq6u/7Kxs/+ysbX/uLm1/766wP/Cvcz/vcPC/8bP0v/O2dH/2NfT/+PX1//c3Nz/3t7e/9bW\r\n        1v+pqamYAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAACfn58Cn5+fFp+fn0K/v7+q7Ozs8/////////////////////////////////z8\r\n        /P/V1dX/ra2t/6Ojo/+srKz/vr6+/9PT0//m5ub/8fHx//T09P/19fX/9fX1//X19f/19fX/9fX1//X1\r\n        9f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f3\r\n        9//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//v5+f/7+fn/+Pj4//n6\r\n        +P/2+vX/9vj5//Ly///m4fz/1tP6/3V5/f8kJPr/Oj3z/1pV+P9LQPv/Q0Dz/zky8f83Mfz/MSb//05G\r\n        /v9rbOz/UkT2/049//9bUP//VVf8/yAY7v9fd4P/kYmT/5yRk/+XlJD/lZmT/6itrP+qpKn/q6ux/7e2\r\n        uv/BvL7/yMHE/8jBxP/Kxcb/x8nD/8vRxv/Ozs7/1dXV/9nZ2f/X19f/1tbW/9zc3P/f39//3Nzc/+Xl\r\n        5f/m5ub/5ubm/+fn5//k5OT/4+Pj/+jo6P/n5+f/5eHn/+Te6f/b2OH/1NXZ/9PV1v/MzdH/wsTE/8LD\r\n        v/+/wLz/urq6/7q1t/+4s7X/trGy/7CwsP+prLD/oqWt/6WkqP+ioqL/o6Sg/6SmoP+ho53/oaKe/6Oj\r\n        o/+joqb/qquh/7Kzt/+xta//v7y3/8/Lxv/Q1Mn/y8rU/9XV1f/c3Nz/3d3d/9bW1v+pqamYAAAAEAAA\r\n        AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AACfn58Hn5+fLby8vIL7+/v8////////////////////////////////////////////////+fn5/66u\r\n        rv+ioqL/ra2t/7+/v//a2tr/7Ozs//Pz8//19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9vb2//b2\r\n        9v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//j4\r\n        +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//z5+//8+fv/+Pf5//n6+P/4/Pb/9Pjy//T2\r\n        9v/29/v/9Pn3/+rt8f+mpvT/KBzw/yMc+f9MSez/WVD6/0pP8f9VR/P/OC7z/yAe+v9ubfL/bF75/zY8\r\n        7f9IR/H/cmH//00/8f9BSLv/dX2K/3+Gf/+LkI//m5ed/5OYmf+inZz/ra+p/6ysrP+tq7H/srGz/7i4\r\n        sv/Awbf/xMW8/8XDwv/Hx8f/yMjI/8zMzP/Ozs7/zc3N/8/Pz//U1NT/19fX/9ra2v/b29v/2tra/9zc\r\n        3P/a2tr/2tra/93d3f/d3d3/2tLc/9bU1P/Kz8b/xMzB/8PKxf+8v8P/s7K7/7Cwtv+tq7H/q6ix/6ik\r\n        r/+joKn/n5+f/6Ghm/+hopn/n5yX/5udl/+Zmpj/mpmb/5qYnv+WlJr/lpWX/5mamP+Zm5X/o52Y/6iq\r\n        qv+rrbX/xL+8/8q+vP/Mws7/y8/J/8zO2P/b29v/3d3d/9bW1v+pqamYAAAAEAAAAAQAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwGfn58OxcXFYvr6\r\n        +vX///////////////////////////////////////////////////////////Dw8P+lpaX/o6Oj/6+v\r\n        r//Kysr/4eHh//Hx8f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3\r\n        9//39/f/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//n5+f/5+fn/+fn5//r4+P/6+fv/+fj6//n4+v/8/fv/+Pz3//X58//1+fP/9/f//+7x\r\n        9f/6+fv/7PHw/5yd+P8kHPL/Lij9/1hO9P9UX/f/U1Ts/y4r8/9IRPv/a2/z/0tN8v9LQf//XVD6/2Nd\r\n        //8tG/L/YWaX/4OFhf99g4j/i5eL/42Slf+cmJ3/nKSZ/6Knnv+ur63/s7Cy/6qprf+tq7H/r7G5/7K1\r\n        vf++vr7/urq6/729vf/CwsL/wsLC/8HBwf/Gxsb/zMzM/87Ozv/Pz8//zs7O/8/Pz//Pz8//zc3N/83N\r\n        zf/Ly8v/0M7G/8TCwf+6vbv/trq1/6+xsf+tq7H/rKmr/6mnn/+copf/m5+Z/5ibmf+Ul5X/kZWP/5SW\r\n        kP+Yl5P/m5aX/4+Rmf+NkJX/jI+U/4qNkf+GiY3/h4qP/4yPlP+OkJj/oZ2i/6akpP+orKf/sriz/7q+\r\n        sv/NyMf/19HW/9PQ3//c3Nz/3t7e/9fX1/+tra2jAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwHW1tYo+vr65///////////////////\r\n        ///////////////////////////////////////////////////i4uL/oKCg/6enp/+4uLj/0dHR/+np\r\n        6f/09PT/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//j4\r\n        +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//j4+P/5+fn/+/r8//r5/f/49/v/+fj8//r6+v/6+/f/9/b4//z3///39/f/8fL8/+Xr\r\n        8v/g7Pj/ioz4/ycY9f8oKvT/VFb6/09Q+P8gG/j/YWP9/3Bo9f8/PPD/Q0L8/2Jg//89QvX/Gwv4/0s4\r\n        1f9sa63/fYSd/5CLoP+LlZX/pZ6b/6Kdn/+ko6z/oqWt/6Knqv+nrKv/sK6t/7Svrv+0tLT/tLS0/7W1\r\n        tf+1tbX/tra2/7q6uv+9vb3/u7u7/7+/v//AwMD/wMDA/8LCwv/CwsL/wMDA/76+vv+7u7v/uLyw/7Kx\r\n        tf+vq7f/qamp/6Khnf+emJ3/nJSb/5mRkf+WkJH/k5GR/42Skf+KlZP/hpKW/36Lm/94fqH/dnep/2dl\r\n        sf9mY7P/ZmC5/2Rcu/9hWbj/Yly1/2Visv9nZbH/e4ml/5uepv+xrLX/srq6/7/Kwv/Hwcb/zsbH/9jf\r\n        0v/c3Nz/3t7e/9fX1/+vr6+lAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwL29vaE////////////////////////////////////////\r\n        ////////////////////////////////////////w8PD/6Kiov+rq6v/wcHB/9vb2//t7e3/9vb2//b2\r\n        9v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//n5\r\n        +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v8\r\n        +v/3+Pb/+fr4//r5+//39P3/9/T9//n4/P/6+vr///nu///6///y8v//9Pv+//H39v/y8///3+T9/9Pj\r\n        +v+SkPT/NiD0/zQt+v8dK+//Ozr7/3Rn//9SU/H/Rz/3/01P//9dYv3/LSX//ywk7f8fGPX/HhL4/19Y\r\n        x/98fan/n52z/6Chr/+lqqv/oKih/6erpf+srav/rqqp/6+qqf+urq7/rKys/6ysrP+vr6//sLCw/7Ky\r\n        sv+ysrL/sLCw/62trf+vr6//rq6u/7Gxsf+0tLT/srKy/7CwsP+urq7/oqem/6WnqP+joaH/nZqV/5qX\r\n        k/+VkJH/iouH/4iNfv9+h4v/fIKJ/3h7iv9ycZj/ZmCx/0lCzf8rH+n/Gwv8/xwb+/8eHfz/HyD6/x8h\r\n        +P8eIPf/HR74/xwb+v8bGvr/JxX2/2t1q/+io7f/sre6/7vAv//OxtH/1NDV/8vWzv/b29v/3t7e/9fX\r\n        1/+vr6+lAAAAEQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwP6+vqw////////////////////////////////////////////////////////\r\n        ////////////////////////+fn5/6qqqv+jo6P/srKy/8jIyP/i4uL/8fHx//b29v/39/f/9/f3//f3\r\n        9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//z7/f/3+Pb/+fr2//v8\r\n        +v/7+v7//vr///z5+//9/Pj//P37//r49////fX//f70//T6///r9/n/+v/0//rv8f/o6f7/zM/u/46H\r\n        //8gHPf/Fhjy/2lq+P9vYvT/TT/4/0pG+f9iWv//TUr+/zAl//9CRvP/ODb0/ysi9P8oHf3/Ni3o/1pX\r\n        3P+Hisf/nJ+u/66tr/+vrbP/pKit/6Gtrf+srKz/pqam/6ampv+qqqr/qamp/6Wlpf+jo6P/pKSk/6Cg\r\n        oP+ioqL/np6e/5+fn/+hoaH/n5+f/5+fn/+enp7/mpyk/56env+Yk5T/j4eR/4yHkP+DiIv/cn6K/2dy\r\n        kP9mY6H/U0+2/zgw0f8jGuz/IRf9/ygg//81Lvv/QDn4/zk4+v87Ovz/Ozn9/zs5/f87Of3/Ozn9/zk4\r\n        +v82Nff/IRv8/y4d9v9VRdj/qbK7/7+7xv/HycP/ztHP/87Q2P/b29v/3t7e/9fX1/+vr6+lAAAAEQAA\r\n        AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+f\r\n        nwP9/f3Y/////////////////////////////////9/X//+cg///7Of/////////////////////////\r\n        /////////////+Li4v+goKD/p6en/7a2tv/S0tL/5+fn//T09P/39/f/9/f3//f39//39/f/9/f3//j4\r\n        +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+vr6//r6\r\n        +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r5/f/7/Pr//f/5//n79f/7+fn//fr8//r5\r\n        9f/7/PP/9vn9//f79f/6+vr///r////99P//+fX//vb///b4+f/v+ez/6unr/+Lk7P+3t+X/S0jy/zE1\r\n        +P9xdfL/YFrv/0k4+f9YSvz/ZmT//yQi/v86N/H/UUnq/0VJ9v9DR+z/Oj7x/y8r9v8lGfX/Jx3i/1xX\r\n        4v+NjtL/oqW0/7KwqP+vr6//rq6u/62trf+oqKj/o6Oj/6Ghof+enp7/mJiY/5WVlf+VlZX/kJCQ/5CQ\r\n        kP+Tk5P/lJSU/5WVlf+Wlpb/jY6S/42Pif+QjIv/jYaN/3+Egv9ueIn/Tkm2/zER5v8VF/H/JCP7/zQu\r\n        //88Nv//QDz//z49/v84O///Njr//0I4/f9COPz/Pzf2/z028f8+N/L/Pzf2/z81+f89M/j/ODn5/yQm\r\n        /P8lFvP/nKLP/8DDwf/O18r/0dbV/9jT0P/b29v/3t7e/9jY2P+wsLClAAAAEQAAAAQAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/Pzwb////7////////\r\n        /////////////////////////1wz//8zAP//ZT////z7////////////////////////////////////\r\n        ///Dw8P/oaGh/6qqqv/CwsL/2tra/+7u7v/19fX/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4\r\n        +P/4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/6+vr/+fn5//j4\r\n        +P/29vb/9PT0//Ly8v/19fX/9/f3//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6\r\n        +v/6+vr/+vr6//v7+//7+/v/+vr6//n5+f/49O//7e/v/+Xq6//n5OD/wMTg/yIX+f9rYfv/a2j0/0RB\r\n        9f9JQ///WVP//1hS/f8lHfb/QTH6/zw+8P9HO+3/TUbv/0pC8/9ERO7/PD73/yss+P8fHfP/Ghbr/z5F\r\n        8P+Hhcv/k5rB/5qewf+borH/pK2q/5mapP+Ulpf/lJeO/42Slf+Nloz/iJKG/4aKhf+MiYT/kJCC/42R\r\n        i/+DhZD/i4aD/4uJif99gpH/ZW2i/zpCvf8bF/L/IR///ywn//9DOP//RDv//0U8/v9DOvz/QTb2/0U8\r\n        8f9VTvL/ZmP1/3ty8f97e+//dnj0/3J38v9zcv7/cWz9/3Bt+f9rbu7/aV76/01P8/8DE/n/nprb/8rG\r\n        y//Z0dz/1NfO/9PQ2f/a2tr/3d3d/9fX1/+xsbGlAAAAEQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf39yL/////////////////////////////\r\n        /////////zkH//8zAP//MwD//6KL///////////////////////////////////////5+fn/qamp/6Oj\r\n        o/+wsLD/yMjI/+Tk5P/x8fH/9/f3//f39//4+Pj/+Pj4//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5\r\n        +f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+Pj4//X19f/y8vL/7u7u/+rq6v/l5eX/4eHh/9/f\r\n        3//j4+P/6urq//Dw8P/19fX/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7\r\n        +//7+/v/+vr6//n5+f/7/Pj//Pf///Xx/f/k7Ov/1tnn/4KH3P8vL/n/fXn2/1pf8P9EOfP/VUj3/2Jd\r\n        /v84Mv3/PTr//1NL//9OR/z/RTv//zwy+v9DQvD/Qjzv/0o/+v9KR/H/Q0D0/zUx9f8hJOv/HhH7/yIP\r\n        7v9QS+L/ZWTM/3p5u/+Lkqb/goOd/4WFl/+Khov/jYWF/42FjP+Ig5L/hYaQ/4eKjv+LiYn/gYKW/29u\r\n        pv9DOsr/IRX3/ywp+v9AOPr/Qjf5/0I6/f9EPPX/QD3x/0ZK7/9dZvP/dX/1/36F8v95e/H/cHHx/1BJ\r\n        /v9BOPr/NCj8/ygi/f8bFv//Iyn0/yof/f9BMv//YmT4/2tv7P8ZE/z/mpLZ/8zX1f/X1t//2Nnd/9Pc\r\n        2f/b29v/3t7e/9jY2P+xsbGlAAAAEQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2QX//////////////////////////////////////0IT//8z\r\n        AP//MwD//zkH///f1///////////////////////////////////////4uLi/6CgoP+np6f/uLi4/9LS\r\n        0v/p6en/9vb2//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+vr6//r6\r\n        +v/6+vr/+fn5//f39//09PT/7e3t/+Pj4//Y2Nj/zc3N/8TExP/AwMD/vb29/7y8vP/BwcH/ysrK/9jY\r\n        2P/m5ub/8vLy//n5+f/7+/v/+/v7//v7+//7+/v/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+vr6//r6\r\n        +v/0+fj/+fTx//b08//m8Or/4+Pv/8fN1P8lJvL/Y1j6/2pr6/9MP/X/UT7//15X//9XTP//GhP2/15X\r\n        9P9ga///bmD7/2ZZ+/9XTP//Qzj//0E8+/8+OvH/RT32/0tF6v9LQ/T/TUrz/0RB9f8zNPD/Jyj0/xob\r\n        +f8SFfn/Cg73/0o/y/9NRr//U1Kw/2Jkpf9udJf/dn6P/3mAlP92d53/QELE/yUX+f8vKP//RDz//0w6\r\n        //9GN///Qj30/0pE9/9qZ/n/dnj1/32B+P9qbf7/RkX//y4q+P8vMOz/PULk/2Jj1f90dcv/h46//3V7\r\n        xP9TVNr/Jhrw/y4s8P8zLfD/KCP6/0dA+/8YEPH/pqbU/8/S2v/k4Nv/4+DS/9rU3//d3d3/39/f/9jY\r\n        2P+ysrKlAAAAEQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwH//////////////////////////////////////0wf//8zAP//MwD//zMA//9f\r\n        N////Pv//////////////////////////////////////8PDw/+hoaH/rKys/7+/v//c3Nz/7+/v//f3\r\n        9//4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//j4+P/09PT/7+/v/+fn\r\n        5//f39//1dXV/8nJyf+8vLz/sbGx/6mpqf+np6f/paWl/6Wlpf+oqKj/sLCw/729vf/Ozs7/4ODg//Hx\r\n        8f/4+Pj/+/v7//v7+//7+/v/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+vr6//r6+v/5+f//+vfz//L0\r\n        9P/y7u3/7e3z/93f6v+Ijer/NSz+/3Jx9v9mX/b/Oy/z/0tD//9sY///Oiz8/zou5v81J/v/WUr//2pi\r\n        /f92c/H/dnT8/11Y+/9RT/3/T0r//0c8/P9GPfH/Qjjw/0tA+v9JRO3/UFDw/05J+P9JQvf/RT/w/zAs\r\n        9/8qKvj/ICH7/xsW+/8bEPL/GxPq/x0Y7/8YFPX/LDD7/zY0/P9DQvb/PDf4/z476/9ZVPf/bm/7/3R/\r\n        +P9pbP3/SkT9/zIl9f88MuP/X1/L/3uBvP9/hMH/eXrL/2x5z/9iaNH/SELd/ygZ8f8lI/j/KS/6/zg6\r\n        9/9OTff/dnf//1JJ//8mHvT/v7/d/+Tf3v/h3N7/2uTT/9ne3//e3t7/4ODg/9jY2P+0tLSqAAAAEQAA\r\n        AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+f\r\n        nwL+/v7i/////////////////////////////////2I7//8zAP//MwD//zMA//8zAP//mX//////////\r\n        //////////////////////////////n5+f+rq6v/pKSk/6+vr//Kysr/4+Pj//T09P/5+fn/+fn5//r6\r\n        +v/6+vr/+vr6//r6+v/6+vr/+vr6//n5+f/29vb/8/Pz/+7u7v/m5ub/29vb/8vLy/+9vb3/srKy/7Cw\r\n        sP++vr7/yMjI/9XV1f/j4+P/4eHh/7q6uv+goKD/oqKi/6enp/+xsbH/xMTE/+Li4v/z8/P/+vr6//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//3+/D/9Pvs//n7/P/48vP/9fDx/+Dh\r\n        9f/PzeD/Jh3v/1ZW//9xcfP/UU3z/0U7//9dWfj/YVT8/zk96v99jc//YWvh/0xN8f82K/f/UD///21Z\r\n        //9+bvz/enD//2pf//9TVvj/U1D//0Y/+v9JQvf/Qjzp/0c97v9LP/P/TEXp/0ZJ8v9HRPT/RUH0/zo5\r\n        8/8hIPL/EQz3/yUd/v89Ofz/RTv//0I99P9BPvH/Vlj6/3F87v95eP3/YFv8/zo28/8MDP//Dwz8/xIL\r\n        9v8QCvf/Dgv6/xEQ+v8dGPX/KSDy/y0l9P8vKfj/PD/1/zs99v8+Nvn/Szr//2ld/f+Hgv3/hIT//0gx\r\n        9/96h+n/1NXj/9vP4f/i4tb/3OHf/9Xc2f/f39//4ODg/9jY2P+0tLSyAAAAEgAAAAUAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwH+/v7a////////\r\n        /////////////////////////2xH//8zAP//MwD//zMA//8zAP//NQP//9nP////////////////////\r\n        ///////////////////n5+f/oKCg/6ampv+3t7f/0dHR/+vr6//29vb/+fn5//r6+v/6+vr/+vr6//r6\r\n        +v/4+Pj/9fX1//Dw8P/m5ub/29vb/8/Pz//ExMT/urq6/7Gxsf+9vb3/29vb//v7+///////////////\r\n        ///////////////////t7e3/vr6+/6Ghof+kpKT/s7Oz/9HR0f/p6en/+Pj4//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//+/f//9fj8///7/f/1+vj/8+3u//H25//g3+H/iZPq/y8t\r\n        +/9scun/Zlr6/0A16f9QUP//Ylv//zQs//+Bf8v/r7bH/73Az/+0sNr/lpbi/2dq8f8uJPL/Myb2/1NJ\r\n        9/9sX/v/cGf+/3Jv+/9rZv//Xlj9/1dS//9NQ///ST///0RD9/8+Pvb/MCv4/ygd//8oH///NjD//0M8\r\n        //9DOP//PTf0/1tP//97cfr/gH3w/1BT8v8hG///MCr5/1ZD8P9RS/D/SEjw/0JG8v9ER/b/TEr4/05L\r\n        9f9MTPT/Rkzx/0dI8P9ERPb/PkDy/z868/9cVfr/e23//5iS/f+Hd/r/QzD5/4eE4P/H0eL/3d/p/+Dn\r\n        4P/h2+D/6ODh/+Hc3f/g4OD/4ODg/9jY2P+0tLSyAAAAEgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f3D////////////////////////\r\n        /////////39f//8zAP//MwD//zMA//8zAP//MwD//1kv///8+///////////////////////////////\r\n        ////////x8fH/6Ghof+qqqr/v7+//9vb2//u7u7/9/f3//r6+v/5+fn/9vb2//Hx8f/q6ur/4eHh/9jY\r\n        2P/MzMz/wMDA/7S0tP+0tLT/z8/P//Dw8P//////////////////////////////////////////////\r\n        /////////////+vr6/+jo6P/qamp/8DAwP/d3d3/9PT0//v7+//8/Pz//Pz8//v7+//7+/v/+/v7//z8\r\n        /P/8/Pz/+/v7//v7+//+/Pz/9fj8//v+7//4//j/8e/1//f26P/b2Oj/0tvo/ygX9P9bXPT/b231/1RM\r\n        7f9AOv3/WVr//1FO8f9XUNv/tLm4/7fBwf+/ytL/z9jb/97d7f/Nzev/sb3n/4mT6v9QXvT/KB31/zYm\r\n        //9FOf3/XVH//29p/v94dPz/fHf8/3py//9LPf//KBr8/zAr/P9CPfz/Qzn9/0Q8+/9FRPL/enD//3J1\r\n        9f9JT/b/IiT+/y4w8v9JP/f/T0T0/0NF6v9DQPP/Qz/y/0Q+8f9BPfD/PDvv/zs58P9BOPP/Rzj3/0Y7\r\n        /f9YS/r/Z1D+/4Zz//+RhP//hoH8/1pF+P9eUvL/qKfp/93j4v/s6N3/4ePk/9/m4//d3en/293e/93j\r\n        3v/g4OD/4ODg/9jY2P+0tLSyAAAAEgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwH9/f23/////////////////////////////////4xv//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//+Zf///////////////////////////////////////+vr6/6ur\r\n        q/+jo6P/sLCw/8fHx//h4eH/8PDw//Pz8//w8PD/6Ojo/93d3f/Pz8//wcHB/7W1tf+vr6//xMTE/+Tk\r\n        5P/+/v7/////////////////////////////////////////////////////////////////////////\r\n        ///Y2Nj/pKSk/7Gxsf/Pz8//7Ozs//j4+P/8/Pz//Pz8//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//v7\r\n        +///+/r//fz///T7+P/99v3/7Pj6//v19v/y7+r/3Njj/4eM6f89Mv7/ZXD2/11b9P9ENvn/Skf//3Nl\r\n        +f8pJPv/oJbB/7+9w//Oysn/2NjS/9fW2P/a1+f/3Nvd/+Db3P/Hx9X/trfM/5mexf9/gNb/WFrX/zY1\r\n        3/8jGvf/Kyv//ywi//8vJf//NjD//z49//86Ovz/QDzz/2Fc9f+Affj/S1P0/ykf//8oIfj/Ny37/zoy\r\n        9P9APPn/Rkf7/0dH//9TS///Uk///1NT+/9YVvz/YFf//2hd//9vZv3/dm77/4F+/P+Ihf//gHn//2hj\r\n        //9ANvv/VE/w/5ad7P/T3fX/4N70/9vk5//m5ub/4uPf/+nl4P/k5N7/4eDk/+Le3f/g4OD/4ODg/9fX\r\n        1/+0tLSyAAAAEgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwH8/Pyk/////////////////////////////////5l///8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//81A///2c///////////////////////////////////////+fn5/+fn5//pqam/7W1\r\n        tf/Ozs7/29vb/9zc3P/S0tL/yMjI/729vf+0tLT/urq6/9fX1//4+Pj/////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////wcHB/6io\r\n        qP/CwsL/39/f//Pz8//7+/v//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/+/v7//r6\r\n        +v/4+Pj/9vb2//X19f/u7u7/5eXl/8/a2P8hE///aGft/2xo9/9DSu3/RDz//2ZU//9WU/3/SVDj/7a4\r\n        wv/Bxcb/1MnF/9zV0v/K3Nv/3Nvd/9PO0P/Ix9D/w8PD/8G3xP+0qrf/pKOl/5OXqv9VW8z/Agz//zUo\r\n        //9FO///QTj//zk8/P9JT+7/eXT3/2tq8P8rL///FRb6/xwb+/8mI/v/NS/+/0hA//9bUf//amD//3Jp\r\n        //94bf//eW///3x1//+AeP//gHf//39y//95av//dmP//0pJ/f86MPX/QCzw/3Nm9/+usPD/2OLp/+Tq\r\n        5f/p5+3/5+fn/+fn5//m5ub/5eXl/+Pj4//i4uL/4ODg/97e3v/g4OD/4ODg/9fX1/+zs7OzAAAAEgAA\r\n        AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD8/PyT/////////////////////////////////6+b//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//WS////z7///////////////////////////////////////Hx8f/oaGh/6ioqP+5ubn/wsLC/8HB\r\n        wf+3t7f/srKy/8vLy//s7Oz/////////////////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////////8/Pz/6SkpP+6urr/1tbW//Dw\r\n        8P/7+/v//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/+/v7//z8/P/8/Pz/+vr6//f3\r\n        9//09PT/7+/v/9PZ5P+Ag+v/Oy///3Fw9f9TV+z/RDr+/1JM/f9hWv7/MiH7/5CYvf/AwMb/0s3E/8bI\r\n        yP/T0tz/zNDK/8nAyv/IxcH/ubi6/6myqP+pqaP/n5ms/1pZ0f8kHPz/OjP6/0ZB+v85Of//PT3v/2Nc\r\n        8/9+dfv/Tkz6/ycg8/+Yjuv/lpXz/42M8/+AfvX/b231/15c9f9OTvT/REXz/z5A8v9IP/P/SD/0/0s/\r\n        9f9MQfX/Uknz/1tX8/9naPb/cXP3/52d9/+usvP/w87u/9nl7//k6+7/6+3u/+7p6//w6uv/6Ojo/+jo\r\n        6P/n5+f/5eXl/+Pj4//i4uL/4ODg/93d3f/g4OD/4ODg/9fX1/+zs7OzAAAAEgAAAAUAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/PyD////////\r\n        /////////////////////////7mn//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//5V7////\r\n        ///////////////////////////////////6+vr/q6ur/6Ghof+mpqb/qamp/8DAwP/g4OD//Pz8////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        /////////////////////////////////////////////7Kysv+5ubn/1dXV/+/v7//7+/v//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9/f3/+/v7//z8/P/9/f3/+fn5//X19f/z8/P/8fHx/+Lo\r\n        7//ByNf/Ixvy/2Bl9v9uZ/j/SUbw/0A/+f9mWf//SkD+/1la2v+1sb3/u7zG/7nDtv/Oy8P/w8PD/8O+\r\n        u/+9vav/tLC1/6enrf+QmqT/VVDT/ywb/v89OPn/TkH//zw8+v89O+v/aGzz/3x59P9HOPT/a2f//8/T\r\n        7//b3u3/7+vw/+3q8//s6PT/6uf2/+no+P/o6Pj/5+r4/+fq+P/f6PL/3+f0/+Hn9P/e5PH/3OLv/+Dl\r\n        7v/k6u//6O/y/+ns6v/u8e//8fLw/+7v7f/q6Oj/7+rs//Hq7f/y6/D/6enp/+np6f/n5+f/5eXl/+Pj\r\n        4//h4eH/39/f/9zc3P/g4OD/39/f/9fX1/+zs7OzAAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pxr////////////////////////\r\n        /////////8y///8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zUD///Sx///////////////\r\n        ////////////////////////5+fn/6urq//R0dH/9fX1////////////////////////////////////\r\n        /////////////////////////////////////////////////////Pv//8Kz//+Zf///r5v///z7////\r\n        /////////////////////////////8vLy/+/v7//3d3d//Pz8//7+/v//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz/+/v7//39/f/9/f3/+/v7//n5+f/4+Pj/9vb2/+jt6//b1+P/dXvk/zU1\r\n        /f97dPP/VFXt/0E9+v9YS///XVv1/ysi+/+ambv/p6zB/7q4uP+1sbb/uq/D/7m2sf+qqa3/rKun/5iY\r\n        qv9SS9T/IyT2/z5A+f9UQ/7/PjH5/0RF+f91df//c2z3/zMw9/91f/H/4uLo/+nn7f/69f7/8fb0//H2\r\n        9f/x9fb/8PT1//L09f/y9PT/8vXz//L28f/y8/f/8vT0//L28P/x9+z/8ffs//Hy8P/w7vT/7+v2//Py\r\n        7v/w7u7/7+vw/+7s8v/v7vL/7O7u/+rt6//p7ej/6enp/+np6f/o6Oj/5eXl/+Pj4//h4eH/39/f/9zc\r\n        3P/g4OD/39/f/9bW1v+zs7OzAAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pxi/////////////////////////////////9nP//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//9SJ///+ff/////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        /////////////////////////+Xf//+Ve///SRv//zMA//8zAP//MwD//8W3////////////////////\r\n        /////////////9vb2//IyMj/5+fn//f39//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/7+/v//Pz8//39/f/8/Pz/+/v7//v7+//6+vr/9fX1/+vq7P/i3uP/w87c/ygg9/9mae//Zl/2/0ZC\r\n        7/9HPv//YmD5/zc2/P9iZsz/oaul/6+xq/+oqqT/qaqm/6emov+gpKX/lZyl/1FIzv8yJP7/Q0P//zxA\r\n        9/8+Ov3/YFL4/3Z9/P9lau//LyX7/5KU8//g6Oj/4u7o//P06v/39O///Prw//v48P/79/L/+vXy//j0\r\n        8//48/T/9vT0//b09P/28vj/9PD2//Lu9P/y7vP/8/Dy//bx8v/28vH/9fHw/+7t9//s7fH/7PDr/+vx\r\n        7P/q7+7/5+vs/+fr7P/p7u3/6enp/+np6f/n5+f/5eXl/+Pj4//h4eH/39/f/93d3f/g4OD/39/f/9bW\r\n        1v+3t7e/AAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD7+/tG/////////////////////////////////+Xf//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//j3P/////////////////////////////////////////\r\n        //////////////////////////////////////////////////////////////////////////n3//+5\r\n        p///bEf//zMA//8zAP//MwD//zMA//8zAP//Pw///+zn/////////////////////////////////9LS\r\n        0v/R0dH/8PDw//r6+v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39\r\n        /f/7+/v/+vr6//v7+//5+fn/8/Pz//Tz9//x8eX/1Nfc/25q6P87OP//eHD5/1NS7v9GPvf/VUz//1RR\r\n        +/8iHer/kZGj/5icp/+oo6L/nKKh/5+jqP+HlKL/T0XO/zss//9COv//Qzr//0A/+f9TWPD/fHv//2NY\r\n        +v8qGvT/pqnt/+zr9f/y8fX/+fX7//P4+//w8/j/8vX5//H0+P/z9Pj/8vP3//Py9v/18fb/9fH2//fx\r\n        9v/x9fD/8fTy//Dy8//w8fX/8PH1/+/x8f/u8u3/7vPq/+3w7v/t7/D/7e7y/+zr7//u7e//7e3t/+/r\r\n        8P/s5/D/6enp/+jo6P/n5+f/5eXl/+Pj4//i4uL/39/f/93d3f/g4OD/39/f/9bW1v+2trbAAAAAEwAA\r\n        AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD///8///////////////////////////////////z7//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//NQP//9LH////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////c0///j3P//0IT//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//81A///z8P//////////////////////////////////////9DQ0P/c3Nz/9fX1//v7\r\n        +//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39/f/9/f3//f39//7+\r\n        /v/+/v7/+/v7//Hx8f/39vL/4drn/7i93P8uIvb/XmXy/2Jl8P9HPOz/SD///2Nc//8yKvP/bW25/46R\r\n        oP+ckZn/kZWa/4KNqP9LR9b/MSby/0Q6//9KRfr/PDj1/19f8/97fPb/WVr4/1pX6f/R0e//4+L2/+zt\r\n        9//58vX//Prv//Lv+P/v9/b/9PT6//T0+v/09fn/8fX2//H29f/x9vX/8Pb1//D29f/z8vb/8/L0//Ly\r\n        8v/x8u7/8fLu//Dy7P/x8+3/8fPt//Hv7//y8e3/9PXs/+7v5v/v8Of/7u7o//Dv6//t7Oj/6enp/+np\r\n        6f/n5+f/5eXl/+Pj4//i4uL/39/f/93d3f/g4OD/39/f/9bW1v+2trbAAAAAEwAAAAUAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn58Bn5+fAZ+fnwH19fUj////////\r\n        //////////////////////////////81A///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//1In///59///////////////////////////////////////////////////////////////\r\n        ///////////////18///r5v//183//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zUD//+8\r\n        q////////////////////////////////////////f39/9PT0//o6Oj/+Pj4//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/+/v7//z8/P/9/f3//Pz8//v7+//8/Pz//Pz8//f2\r\n        +P/n5+3/7Ojn/9TZ4v9kXuv/O0j+/3F07v9WR/b/RTv//1pM//9bS/f/NTfR/42Njf+RjIv/jo6O/1NK\r\n        wv8sI///REL5/0Q//v8+Nvn/ZWD3/3Jv//9VUPP/Wlby/9fb4P/a4fL/9PT6//v39v/6+fX/9fL0//v6\r\n        8P/9+Pf/+fj0//n58//7+PP/+vfy//r38v/79vP/+vXy//r19P/08vH/9PLx//Ty8f/08vL/9PHz//Tw\r\n        9f/x7/X/8O70//Tz7//x7vD/8O70/+3q8//v7fP/6evs/+rs7P/p6+v/6enp/+np6f/n5+f/5eXl/+Pj\r\n        4//h4eH/39/f/9zc3P/g4OD/39/f/9bW1v+2trbAAAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAn5+fAp+fnwefn58Mn5+fEp+fnxfPz882////////////////////////\r\n        //////////////9MH///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//+P\r\n        c///////////////////////////////////////////////////////////////////0sf//4Vn//88\r\n        C///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//6yX////////////////////\r\n        ////////////////////////5OTk/+Tk5P/09PT/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+r2+P/78u//7unm/+fp\r\n        6f+vruD/LCb7/29u8/9bXPL/STbx/01I9/9TXPr/KCXs/2Z3nv+Dh5r/QEHP/ycf//9GQv//RkP3/z02\r\n        /f9XXun/eX30/1dG//9iYeb/6eLl/+vr6//z8/P/+Pj4//b29v/09PT/9vb2//j4+P/39/f/9vb2//b2\r\n        9v/29vb/9vb2//X19f/19fX/9fX1//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Ly8v/x8fH/8fHx//Dw\r\n        8P/w8PD/7+/v/+/v7//u7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/n5+f/5eXl/+Pj4//g4OD/3t7e/9zc\r\n        3P/f39//3t7e/9XV1f+3t7fAAAAAEwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwKfn58Gn5+fB5+f\r\n        nwufn58Rn5+fHZ+fny2fn58/n5+fUZ+fn2Kfn590//////////////////////////////////////9Z\r\n        L///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//81A///z8P/////////\r\n        ////////////////////////////////////7+v//6WP//9VK///MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//oov/////////////////////////////////////////\r\n        ///6+vr/39/f//Ly8v/6+vr//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//X6+//9+vX/7ubx/93h3P/T0e7/UE7j/09Q\r\n        /v9paPT/TUXw/0pB//9WU///PDL//0dLwf9NT7X/MR34/zs8+P9FO///Pjf+/1ZQ9f9ydf//WVP//1hW\r\n        7//g2e7/4+v4//Hx8f/29vb/+Pj4//f39//29vb/+Pj4//j4+P/39/f/9vb2//b29v/29vb/9vb2//X1\r\n        9f/19fX/9fX1//X19f/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v\r\n        7//u7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/n5+f/5eXl/+Pj4//g4OD/3t7e/9zc3P/f39//3t7e/9XV\r\n        1f+3t7fAAAAAEwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAACfn58Bn5+fA5+fnwefn58Mn5+fFJ+fnx6fn58qn5+fNJ+fnz+fn59Ln5+fXZ+f\r\n        n3Kfn5+Hn5+fnZ+fn7Ofn5/H+/v7/f////////////////////////////////9lP///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//TB////Xz////////////////////\r\n        /////////8m7//95V///OQf//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//+Mb/////////////////////////////////////////////39/f/k5OT/8fHx//r6\r\n        +v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8///9/f/y8/f/9PLy/+fq4f/h3u3/l57X/yYm//9wbvb/VlP8/z84\r\n        9f9PR///VVL1/yUV9v8aEvP/Ni35/0M///8/M///TUb1/3B0+P9gV/v/IhXz/8XK4//q79r/6PD9//b2\r\n        9v/39/f/+Pj4//j4+P/4+Pj/+fn5//j4+P/29vb/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//X1\r\n        9f/09PT/9PT0//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v7//u7u7/7Ozs/+zs\r\n        7P/r6+v/6enp/+np6f/n5+f/5eXl/+Pj4//h4eH/3t7e/9zc3P/f39//3t7e/9XV1f+3t7fAAAAAEwAA\r\n        AAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn58Cn5+fCZ+f\r\n        nw+fn58Un5+fG5+fnyWfn580n5+fR5+fn12fn592n5+fjp+fn6Wfn5+4n5+fxp+fn9Gfn5/Yn5+f4aen\r\n        p+u+vr71+Pj4/v////////////////////////////////95V///MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//4lr/////////////+nj//+cg///TB///zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//3xb////\r\n        /////////////////////////////////////////v7+/+fn5//v7+//+fn5//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//32+f/19///9v3u/+zt4//f3uj/z9Hb/ycj5v9WVfn/ZWjz/0M97v9IQP//ZFr//ygf\r\n        //8QFf7/RD7//z0z//9JP/D/bG/v/21x9f8kE/7/sbTr/+Ha5//p8PP/9/j0//b29v/29vb/9vb2//j4\r\n        +P/5+fn/+Pj4//f39//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9fX1//X19f/09PT/8/Pz//Pz\r\n        8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/v7+//7+/v/+7u7v/t7e3/7Ozs/+vr6//r6+v/6urq/+np\r\n        6f/n5+f/5eXl/+Pj4//h4eH/3t7e/9zc3P/f39//3t7e/9XV1f+3t7fAAAAAEwAAAAYAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fA5+fnw2fn58dn5+fNJ+fn0qfn59en5+fcJ+f\r\n        n4Gfn5+Sn5+foJ+fn7Cfn5/Cn5+f0p+fn+Gjo6Ptt7e398vLy/zg4OD99fX1////////////////////\r\n        //////////////////////////////+CY///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//+ii///b0v//zUD//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//dVP///z7////////////////////\r\n        ////////////////////////5+fn/+3t7f/4+Pj//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39\r\n        /f/9/f3//f39//39/f/9/f3//f39//39/f/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//75\r\n        +v/2+ff/+f34//n27v/e5ej/4tzn/4F+5f80Lv//bG/p/1RO+/9BOvX/XU7//0RK+/8ZHvz/PjH//z08\r\n        6v9xZvj/cHnh/zEp//+Aiuj/6d/r/+3t7f/x8Pr/9/j0//X19f/29vb/9/f3//n5+f/5+fn/9/f3//f3\r\n        9//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9fX1//T09P/09PT/8/Pz//Pz8//y8vL/8vLy//Hx\r\n        8f/x8fH/8fHx//Dw8P/v7+//7+/v/+7u7v/t7e3/7Ozs/+vr6//r6+v/6enp/+jo6P/n5+f/5eXl/+Pj\r\n        4//h4eH/3t7e/9zc3P/f39//3t7e/9XV1f+4uLjFAAAAEwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwGfn58Hn5+fGZ+fnzSfn59Wn5+feJ+fn5Wfn5+vn5+fxZ+fn9efn5/joKCg6bKy\r\n        svHHx8f42tra/e3t7f//////////////////////////////////////////////////////////////\r\n        //////////////+Zf///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//9iO///9fP/////////////////////////////////////////\r\n        ///o6Oj/7e3t//j4+P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/9/f3//f39//39\r\n        /f/9/f3//f39//39/f/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//r99P//////9ff4//bu\r\n        9f/m7u7/4t/h/7m31f8qI/D/ZGHz/11Y+f9COe3/UUb6/1JV/v8pHP//OC/x/1Vb8P+HfPr/Pzz2/1xp\r\n        6//W0uX/4ebl//n19P/49fH/9vr1//f39//4+Pj/+vr6//r6+v/5+fn/9/f3//f39//4+Pj/9vb2//b2\r\n        9v/19fX/9fX1//X19f/19fX/9PT0//T09P/09PT/8/Pz//Pz8//y8vL/8vLy//Hx8f/x8fH/8fHx/+/v\r\n        7//v7+//7+/v/+7u7v/t7e3/7Ozs/+vr6//r6+v/6enp/+jo6P/n5+f/5eXl/+Pj4//g4OD/3t7e/9zc\r\n        3P/f39//3t7e/9XV1f+7u7vMAAAAEwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fAp+f\r\n        nwufn58hn5+fTp+fn4Gfn5+yn5+fzp+fn96tra3rv7+/9tbW1vvp6en+/Pz8////////////////////\r\n        //////////////////////////////////////////////////////////////////////////////+l\r\n        j///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//1Ur///18////////////////////////////////////////////+zs7P/r6+v/+Pj4//v7\r\n        +//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39\r\n        /f/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//3/+f/5+f//+Pn1//fz/v/q6e3/5+nj/9HP\r\n        2/9XWd3/SUT9/2Jj8/9RRfH/SD3//1FR//8+OPX/Myf7/29z//9eXu7/KR3z/8TH3P/b4dz/6+3u//L0\r\n        9f/79fb/+fzz//f39//5+fn/+vr6//n5+f/4+Pj/9/f3//f39//39/f/9vb2//b29v/19fX/9fX1//X1\r\n        9f/19fX/9PT0//T09P/09PT/8/Pz//Pz8//y8vL/8fHx//Hx8f/x8fH/8fHx/+/v7//v7+//7+/v/+7u\r\n        7v/t7e3/7Ozs/+vr6//q6ur/6enp/+jo6P/m5ub/5eXl/+Li4v/g4OD/3d3d/9zc3P/f39//3t7e/9XV\r\n        1f+7u7vMAAAAEwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn58Dn5+fEZ+fnzOfn59ln5+fmbq6\r\n        utLR0dHy4+Pj/Pj4+P//////////////////////////////////////////////////////////////\r\n        //////////////////////////////////////////////////////////////+yn///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//Uif//+zn////\r\n        ////////////////////////////////////////7e3t/+rq6v/39/f//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//33///4//n/+Pn3/+vw8f/y6ez/4eLm/8zP3f+OmdP/Ih/+/2dv\r\n        8v9hVPD/Ozvz/09N//9OTPn/HhH5/25z9P8YHf//mpnZ/87J3v/f4eL/6uzs//H17//39f//+/T3//b2\r\n        9v/4+Pj/+Pj4//f39//39/f/9/f3//f39//39/f/9vb2//X19f/19fX/9fX1//X19f/19fX/9PT0//T0\r\n        9P/09PT/8/Pz//Pz8//y8vL/8fHx//Hx8f/x8fH/8fHx/+/v7//v7+//7+/v/+7u7v/t7e3/7Ozs/+vr\r\n        6//q6ur/6Ojo/+jo6P/m5ub/5OTk/+Li4v/g4OD/3d3d/9vb2//f39//3t7e/9XV1f+6urrNAAAAEwAA\r\n        AAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn58Kn5+fLKKiomjJycnJ7+/v+P//////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////Ft///MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//9FF///4tv/////////////////////////\r\n        ///////////////////w8PD/6Ojo//b29v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z9+//8/Pz/+fn5//T09P/x8fH/5ubm/9fX1//CwcP/HxT3/1td8f9YXfX/PDnz/1JE\r\n        /v9gWv//Jx3//zE9+/9rWdz/vsLD/+Db2v/d4eL/5vHn//f17f/89fj/9vr1//j4+P/4+Pj/+Pj4//j4\r\n        +P/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/09PT/9PT0//Pz8//z8/P/8/Pz//Ly\r\n        8v/x8fH/8fHx//Hx8f/w8PD/8PDw/+/v7//v7+//7u7u/+3t7f/t7e3/7Ozs/+vr6//q6ur/5+fn/+fn\r\n        5//m5ub/5OTk/+Hh4f/f39//3d3d/93d3f/e3t7/3d3d/9bW1v+6urrNAAAAFAAAAAYAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwKfn58Uo6OjUOrq6tz/////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        //////////n3///Pw///pY///3VT//9JG///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zwL///f1/////////////////////////////////////////////Pz\r\n        8//n5+f/9fX1//v7+//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z9\r\n        +//7+/v/+fn5//X19f/y8vL/5ubm/9jY2P/FxMb/XGTf/0M5/f9hZfP/Uk3u/0U7//9YUv//Qjj//xYY\r\n        +f+dmdv/xcrT/9XZ1P/f3+X/7e7s//z3+f/9+Pn/8vf1//j4+P/4+Pj/+Pj4//j4+P/4+Pj/9/f3//f3\r\n        9//39/f/9vb2//b29v/29vb/9vb2//X19f/09PT/9PT0//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Hx\r\n        8f/w8PD/8PDw/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs/+rq6v/q6ur/5+fn/+fn5//m5ub/5OTk/+Hh\r\n        4f/f39//3d3d/9zc3P/e3t7/3d3d/9bW1v+6urrNAAAAFAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+f\r\n        nwSfn58c6enpv///////////////////////////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////4tv//7Wj//+Ja///XDP//zUD//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//PAv//8/D////////////////////////////////////////////8/Pz/+fn5//09PT/+/v7//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z9+//6+vr/+Pj4//T0\r\n        9P/x8fH/5OTk/9nZ2f/Ix8n/jprE/y4e+P9iZfD/ZFrt/zs1+P9NSvr/X1j9/xYT+f+mrcD/vsfU/9Pe\r\n        1P/t6PH/8+nv//vx/f/4+ff/9vv6//j4+P/4+Pj/+Pj4//j4+P/4+Pj/9/f3//f39//29vb/9vb2//b2\r\n        9v/29vb/9vb2//X19f/09PT/9PT0//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/8PDw/+/v\r\n        7//u7u7/7u7u/+3t7f/s7Oz/6+vr/+rq6v/p6en/5+fn/+fn5//l5eX/5OTk/+Hh4f/f39//3d3d/9zc\r\n        3P/e3t7/3d3d/9bW1v+6urrNAAAAFAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwXw8PB/////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        //////////Lv///Ft///nIP//29L//8/D///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//81A///wrP/////////\r\n        ///////////////////////////////////39/f/5ubm//T09P/7+/v//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//3+/P/6+vr/9/f3//Pz8//u7u7/4ODg/9bW\r\n        1v/JyMr/qKu6/zgy4/9XVvL/aF7x/z868/9JRfz/Ylj+/yso+f+Kj8b/vMfP/9Pay//o4uf/7ebt//nx\r\n        /P/29vb/9Pn4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X1\r\n        9f/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v7//u7u7/7e3t/+3t\r\n        7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//l5eX/4+Pj/+Hh4f/f39//3d3d/9zc3P/e3t7/3d3d/9bW\r\n        1v+6urrNAAAAFAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwb9/f3k////////////////////////\r\n        ///////////////////////////////////////////////8+///2c///6mT//9/X///Uif//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//+5p///////////////////////////////\r\n        //////////////n5+f/h4eH/8vLy//n5+f/7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//3+/P/6+vr/+Pj4//T09P/t7e3/3t7e/9PT0//FxMb/sLO3/0hN\r\n        0v88Nfr/aWbx/09G9P9JQf//Ukn//0g///9XT+L/usPM/9zZy//f3d3/5urr//X19f/39Pb/9Pf1//j4\r\n        +P/4+Pj/+Pj4//j4+P/39/f/9/f3//b29v/29vb/9vb2//b29v/29vb/9fX1//X19f/09PT/8/Pz//Pz\r\n        8//y8vL/8vLy//Hx8f/x8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+zs7P/s7Oz/6+vr/+rq\r\n        6v/p6en/6Ojo/+bm5v/l5eX/4+Pj/+Hh4f/f39//3d3d/9zc3P/e3t7/3d3d/9bW1v+6urrNAAAAFAAA\r\n        AAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPn5+VD/////////////////////////////////////////////\r\n        /////////+nj//+/r///j3P//2I7//88C///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//6WP////////////////////////////////////////////+Pj4/9XV\r\n        1f/n5+f/+Pj4//v7+//7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z9+//6+vr/+fn5//b29v/v7+//3t7e/9DQ0P/Av8H/qa2y/zo53f8cEv//Zmvv/1tR\r\n        8f9EPvv/SEj//15S//8qG/P/pq7M/+HY1P/h39//5Ozr/+/z7f/48/X/9/f3//f39//4+Pj/+Pj4//j4\r\n        +P/39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/8/Pz//Pz8//y8vL/8vLy//Hx\r\n        8f/x8fH/8PDw/+/v7//v7+//7+/v/+7u7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+np6f/p6en/6Ojo/+bm\r\n        5v/k5OT/4+Pj/+Hh4f/f39//3d3d/9vb2//e3t7/3d3d/9bW1v+9vb3ZAAAAFAAAAAYAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAP39/Z7//////////////////////////////////////7mn//91U///SRv//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//j3P////////////////////////////////////////////7+/v/wMDA/8rKyv/j4+P/9PT0//r6\r\n        +v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//r7\r\n        +f/5+fn/+Pj4//Pz8//s7Oz/3Nzc/87Ozv+9vL7/mJu3/yEW9v8KBv//WVj0/2Na8P89Puz/Q0f5/2JY\r\n        //8yJP7/h4vS/8vK0//d2d7/5Ono/+zw6//z9PL/9fT2//f39//39/f/9/f3//f39//39/f/9/f3//b2\r\n        9v/29vb/9vb2//X19f/19fX/9fX1//X19f/09PT/8/Pz//Pz8//x8fH/8fHx//Hx8f/x8fH/8PDw/+/v\r\n        7//v7+//7+/v/+7u7v/t7e3/7e3t/+zs7P/r6+v/6+vr/+np6f/o6Oj/6Ojo/+bm5v/k5OT/4+Pj/+Hh\r\n        4f/f39//3d3d/9vb2//e3t7/3d3d/9bW1v+9vb3ZAAAAFAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+\r\n        /qH/////////////////////////////////r5v//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//98W///////////////\r\n        //////////////////////////////z8/P+1tbX/p6en/7a2tv/Q0ND/5+fn//X19f/7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//r7+f/4+Pj/9PT0/+7u\r\n        7v/o6Oj/2tra/83Nzf+8u73/jY66/xEL/v8DDfX/STv3/25n+P8/RO3/REH//1xT/f9DPvj/a27W/7jA\r\n        0f/d1+L/6Obm/+rs7P/z+O//9vT6//f39//39/f/9/f3//f39//39/f/9/f3//b29v/29vb/9fX1//X1\r\n        9f/19fX/9fX1//T09P/09PT/8/Pz//Pz8//x8fH/8fHx//Hx8f/x8fH/8PDw/+/v7//v7+//7+/v/+7u\r\n        7v/t7e3/7Ozs/+zs7P/r6+v/6urq/+np6f/o6Oj/6Ojo/+bm5v/k5OT/4+Pj/+Hh4f/f39//3d3d/9vb\r\n        2//e3t7/3d3d/9bW1v+9vb3ZAAAAFAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/oX/////////////\r\n        ////////////////////zL///zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//9iO////Pv/////////////////////////\r\n        ///////////////////Gxsb/oaGh/6ioqP+6urr/0dHR/+fn5//09PT/+vr6//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//X6/f/69vX/9PDv/+nr6//a4dr/29fd/9TK\r\n        2/+3uLT/aXPR/yAZ9v8UEv7/IR79/3Fo9P9LUvX/NTXz/1ZN//9WT/j/JBL//7a71P/U29T/5uHe/+rp\r\n        6//z8fD/8/L2//n5+f/4+Pj/9/f3//b29v/39/f/9/f3//f39//29vb/9fX1//T09P/09PT/8/Pz//T0\r\n        9P/z8/P/8/Pz//Pz8//y8vL/8vLy//Hx8f/w8PD/8PDw/+/v7//v7+//7u7u/+7u7v/t7e3/7e3t/+zs\r\n        7P/r6+v/6urq/+rq6v/p6en/5+fn/+bm5v/l5eX/4+Pj/+Hh4f/f39//3Nzc/9vb2//e3t7/3t7e/9TU\r\n        1P++vr7aAAAAFQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4D/////////////////////////////\r\n        /////////9zT//+Ve///aUP//zwL//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//dVP///z7////////////////////////////////////\r\n        ///9/f3/vr6+/6Ghof+oqKj/ubm5/9TU1P/p6en/9fX1//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//X5+v/9+fj/9vHy/+jq6v/a4dr/19TW/8vE0f+wtbT/SUnd/ykk\r\n        +/8hIf3/HBP9/2Zb8f9TVvj/OTnx/05H/P9aVvz/Jxb//6Wq0f/P1tP/5eLe/+np6f/w7/H/9fX1//f3\r\n        9//29vb/9vb2//b29v/39/f/9/f3//b29v/29vb/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly\r\n        8v/y8vL/8fHx//Hx8f/w8PD/8PDw/+/v7//u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/r6+v/6urq/+rq\r\n        6v/p6en/5+fn/+bm5v/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/e3t7/3t7e/9TU1P++vr7aAAAAFQAA\r\n        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///y//////////////////////////////////////////////\r\n        ///////////////Zz///r5v//4Jj//9VK///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//4Jj/////////////////////////////////////////////f39/7W1\r\n        tf+hoaH/qqqq/7u7u//U1NT/6urq//b29v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//H29f/6+Pf/9/L0/+jq6v/f497/2dfW/8jHy/+usr3/Ihns/zUx//8zM/v/IBX//1dN\r\n        9P9eXvj/QT3w/0VB+P9bV/3/NCT//4qL1f/Fz8//4d7a/+fo5v/v7fP/9/nz//X19f/19fX/9vb2//b2\r\n        9v/29vb/9vb2//b29v/19fX/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/x8fH/8fHx//Hx\r\n        8f/w8PD/7+/v/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/r6+v/6urq/+np6f/p6en/5ubm/+Xl\r\n        5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/d3d3/3t7e/9TU1P++vr7aAAAAFQAAAAcAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD///+v////////////////////////////////////////////////////////\r\n        ////////////////////9fP//8m7//+cg///b0v//0IT//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//+Mb/////////////////////////////////////////////r6+v+ysrL/oqKi/6qq\r\n        qv++vr7/1dXV/+vr6//29vb/+vr6//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//T5\r\n        +P/6+Pf/9fL0/+Xn5//a3dv/09PN/7vAv/+Ynb7/Ewr7/zw5//89OPf/Myz//0Q6+P9mZvb/S0Xy/0I9\r\n        /P9UUP3/Rjv//2li4f++y83/2dfX/+bn5f/v7PX/9fjv//X19f/19fX/9fX1//b29v/29vb/9vb2//X1\r\n        9f/19fX/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+7u\r\n        7v/u7u7/7e3t/+3t7f/s7Oz/7Ozs/+vr6//q6ur/6urq/+np6f/p6en/5ubm/+Xl5f/k5OT/4uLi/+Dg\r\n        4P/e3t7/3Nzc/9vb2//d3d3/3d3d/9TU1P++vr7aAAAAFQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD///8v////////////////////////////////////////////////////////////////////////\r\n        ///////////////////////////////i2///taP//4xv//9cM///NQP//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//pY/////////////////////////////////////////////29vb/rq6u/6Ghof+rq6v/vr6+/9ra\r\n        2v/s7Oz/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7\r\n        +//7+/v/+/v7//v7+//6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//T29v/z8fD/8Ozx/+Ll\r\n        4//a2tr/09TL/7vDw/+IiMj/GBj//0E9//89NfT/SUj2/ywj9f9laPP/VE30/0M7/v9NSv7/U079/0c4\r\n        7f+2xs3/09PZ/+Xm5P/p6u7/9PTu//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/8/Pz//Pz\r\n        8//y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8PDw//Dw8P/v7+//7u7u/+7u7v/t7e3/7e3t/+zs\r\n        7P/s7Oz/6+vr/+vr6//q6ur/6enp/+np6f/o6Oj/5+fn/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9vb\r\n        2//c3Nz/3d3d/9TU1P++vr7aAAAAFQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////r///\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////////////////////////////////////+ff//8/D//+lj///dVP//0kb//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//6+b////\r\n        ////////////////////////////////////////9PT0/6ioqP+jo6P/ra2t/8DAwP/Z2dn/7u7u//j4\r\n        +P/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6\r\n        +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//f5+f/08vH/7ezw/+Pn4v/c2dv/1dLN/7nB\r\n        yP9xbdL/Iif4/z87//8/NPT/V1vw/xoV9P9cYPX/WlX4/z429f9JRf//WFX4/y8f9v+os9P/1Nbe/+Tl\r\n        4//m6Oj/8/Hx//X19f/29vb/9vb2//X19f/19fX/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8fHx//Hx8f/w8PD/8PDw/+/v7//v7+//7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq\r\n        6v/p6en/6enp/+jo6P/o6Oj/5+fn/+Xl5f/j4+P/4eHh/+Dg4P/e3t7/3d3d/9zc3P/c3Nz/3Nzc/9PT\r\n        0//AwMDhAAAAFQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////D////3/////v////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////s5///v6///49z//9cM///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zUD//+8q///////////////\r\n        //////////////////////////////Dw8P+mpqb/o6Oj/66urv/Dw8P/2tra/+7u7v/4+Pj/+vr6//r6\r\n        +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//n5+f/5+fn/+fn5//b4+f/z9PL/6+rs/+Lm4P/c2N3/0c7K/7C4yf9cUdf/LC/2/0A5\r\n        //9FPPf/Xl7y/xIQ9v9NUPn/XFv3/0Q47v9FQ///WVL5/ywi/v+Sldn/1NjZ/+Ti4f/k6ej/9PD1//T0\r\n        9P/09PT/9fX1//X19f/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/y8vL/8fHx//Hx\r\n        8f/w8PD/8PDw/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq6v/p6en/6Ojo/+jo\r\n        6P/o6Oj/5ubm/+Xl5f/j4+P/4eHh/9/f3//e3t7/3Nzc/9vb2//c3Nz/3Nzc/9PT0//AwMDmAAAAFQAA\r\n        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8X////j/////f/////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////Cs///MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//81A///z8P/////////////////////////\r\n        ///////////////////o6Oj/pKSk/6Ojo/+vr6//w8PD/97e3v/v7+//+Pj4//r6+v/6+vr/+vr6//r6\r\n        +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5+fn/+fn5//n5+f/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//b4+f/4+ff/7ezu/+Pn4f/g2eD/z8rL/62zyv9PQdz/ODf9/0I6//9JQvf/XFf2/w4Q\r\n        +P89P/v/XWD4/0xD7f9BQPz/W1D//zQv//+AfNv/0NfU/+Lg3//n7Ov/9vL4//Ly8v/z8/P/9PT0//X1\r\n        9f/09PT/9PT0//Pz8//z8/P/8vLy//Ly8v/y8vL/8fHx//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v\r\n        7//u7u7/7u7u/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+rq6v/p6en/6Ojo/+jo6P/n5+f/5ubm/+Xl\r\n        5f/i4uL/4ODg/9/f3//d3d3/3Nzc/9vb2//b29v/3Nzc/9PT0//AwMDmAAAAFQAAAAcAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///w////9H////gP///7T////v////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        //////////////////////////////+yn///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//PAv//9LH////////////////////////////////////\r\n        ////////5OTk/6Ghof+kpKT/r6+v/8TExP/c3Nz/7+/v//f39//5+fn/+fn5//n5+f/5+fn/+vr6//r6\r\n        +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//Xz\r\n        8//w8vP/8+3y/+Lk5f/T1tT/zM3E/769x/8hJPv/Qzn//zs99v9US/n/TU35/xoW8f8tNvH/YWTv/1BF\r\n        9f9BO/7/VUv//0M//P9ZWvL/zc7S/+Lc3f/g5uH/7uvt//Pz8//z8/P/9PT0//T09P/09PT/8/Pz//Pz\r\n        8//x8fH/8PDw//Dw8P/u7u7/7e3t/+vr6//s7Oz/7Ozs/+7u7v/v7+//7+/v/+7u7v/u7u7/7e3t/+3t\r\n        7f/s7Oz/7Ozs/+rq6v/q6ur/6urq/+np6f/p6en/6Ojo/+fn5//m5ub/5eXl/+Tk5P/i4uL/4eHh/9/f\r\n        3//d3d3/29vb/9nZ2f/b29v/29vb/9PT0//BwcHmAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////I////1v///+T////zP//\r\n        //v/////////////////////////////////////////////////////////////////////////////\r\n        //////////////+ii///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//0UX///f1////////////////////////////////////////////9/f\r\n        3/+goKD/pKSk/7CwsP/Hx8f/39/f//Dw8P/4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n39//w8vL/8Ovt/+Di\r\n        4//V2Nb/zs7I/7y6xv8aHPb/Qzv+/zs7+f9XT/b/SEj4/ygm6v8nK/b/Y2Ty/1NL9v8/Ovv/UUn//0M/\r\n        /P9PUO7/y8vR/+Db3P/i6OP/7+zu//T09P/09PT/9PT0//T09P/z8/P/8fHx/+3t7f/p6en/5ubm/+Tk\r\n        5P/h4eH/3t7e/9zc3P/e3t7/4uLi/+np6f/s7Oz/7u7u/+7u7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq\r\n        6v/q6ur/6enp/+np6f/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/i4uL/4ODg/9/f3//d3d3/2tra/9nZ\r\n        2f/b29v/29vb/9PT0//BwcHmAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wf///87////b///\r\n        /6v////f//////////////////////////////////////////////////////////////////////+Z\r\n        f///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//9FF///7Of////////////////////////////////////////////V1dX/oKCg/6Sk\r\n        pP+ysrL/yMjI/+Pj4//y8vL/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5\r\n        +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//r49//x8/P/8Ovs/+Di4v/V2Nb/zs3J/7q3\r\n        x/8UFPT/RD77/zs6//9fVfX/PUH4/zs+3P8aGfj/ZGD1/1dS9f88N/b/Tkb//0VC/P9BQev/zMrQ/9zZ\r\n        2//m6uX/7+vw//T09P/09PT/8/Pz//Pz8//w8PD/6urq/9/f3//R0dH/yMjI/8PDw/+/v7//urq6/7m5\r\n        uf+9vb3/ycnJ/9ra2v/m5ub/6+vr/+3t7f/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/p6en/6enp/+jo\r\n        6P/n5+f/5ubm/+bm5v/m5ub/5OTk/+Pj4//i4uL/4ODg/97e3v/c3Nz/2tra/9nZ2f/b29v/29vb/9PT\r\n        0//AwMDmAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////F///\r\n        /0////+H////vP////P///////////////////////////////////////////9/X///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zUD//+5p///iWv//z8P//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//Uif//+zn////////////////////////////////////////////z8/P/6CgoP+mpqb/tra2/9DQ\r\n        0P/m5ub/9vb2//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/4+Pj/+Pj4//j4\r\n        +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j38//x9PL/8+/u/+Lk5P/V2Nb/zcvK/7m0yf8SEfX/RkH7/zs4\r\n        //9jWvH/MzX3/05Vyv8UD/T/Xljz/1dW8v88NvP/SUL9/0pI//81Muz/zcrT/9rZ2//n6+b/7enu//Pz\r\n        8//z8/P/8/Pz//Hx8f/p6en/2tra/8jIyP+6urr/sbGx/6ysrP+oqKj/paWl/6Wlpf+np6f/s7Oz/8TE\r\n        xP/V1dX/4uLi/+rq6v/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5ubm/+bm\r\n        5v/m5ub/5OTk/+Pj4//h4eH/4ODg/97e3v/c3Nz/2tra/9jY2P/b29v/2tra/9PT0//AwMDmAAAAFgAA\r\n        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD///8v/v7+6v////////////////////////////////95V///MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//5l///////////////n3//+5p///ZT///zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//183///1\r\n        8////////////////////////////////////////////8nJyf+goKD/qamp/729vf/Y2Nj/7+/v//f3\r\n        9//4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4\r\n        +P/4+Pj/+Pj4//f28v/w8/H/9PDv/+Tm5v/W2df/z83N/7u1zP8SD/j/Q0D6/zs4//9kW/H/LSz4/1tk\r\n        vv8bFOv/WE71/1hZ7/89OPL/R0L8/05J//8nJPD/zcnU/9fa3v/m6uX/6+fs//Ly8v/y8vL/8fHx/+rq\r\n        6v/b29v/xMTE/7i4uP/Nzc3/3Nzc/9zc3P/Pz8//ycnJ/6ampv+fn5//pKSk/66urv+/v7//0dHR/+Hh\r\n        4f/p6en/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5ubm/+bm5v/m5ub/4+Pj/+Li\r\n        4v/h4eH/39/f/93d3f/b29v/2dnZ/9jY2P/a2tr/2dnZ/9LS0v/AwMDmAAAAFgAAAAcAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn58E////+P//\r\n        //////////////////////////////9lP///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//WS////z7/////////////////////////////+Xf//+Sd///SRv//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//9iO////Pv/////////\r\n        //////////////////////////////39/f+9vb3/o6Oj/6+vr//Ly8v/6Ojo//T09P/4+Pj/+Pj4//j4\r\n        +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f1\r\n        9P/w8/H/8+/u/+Pl5f/X2tj/0tDQ/7640f8SD/n/Qz79/zw4+/9fWvH/LSb5/2FruP8sKd3/UUX3/1pb\r\n        8f8/OvP/RED9/05K//8bFvP/zcnU/9Xc3//m5+P/7Ojt//Hx8f/x8fH/6+vr/93d3f/S0tL/7e3t////\r\n        //////////////////////////////z8/P/V1dX/ra2t/6Ojo/+srKz/vLy8/8/Pz//h4eH/6enp/+vr\r\n        6//q6ur/6urq/+np6f/p6en/6Ojo/+fn5//m5ub/5ubm/+Xl5f/l5eX/4+Pj/+Li4v/g4OD/3t7e/93d\r\n        3f/b29v/2NjY/9fX1//Z2dn/2NjY/9HR0f/AwMDmAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn58F////////////////////////\r\n        //////////////9VK///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//81\r\n        A///2c///////////////////////////////////////////////Pv//8Kz//91U///NQP//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//dVP///z7////////////////////\r\n        ///////////////////29vb/pKSk/6ioqP+/v7//29vb/+/v7//39/f/9/f3//f39//39/f/9/f3//f3\r\n        9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f19f/v8fH/8u3u/+Pl\r\n        5f/Y29n/1NLS/7+50v8SD/n/QDz//z869P9aV/P/MCL8/2Bqt/89Qc//SD34/1pb8f9BPPP/Qz/8/01K\r\n        /v8XEfr/z8vX/9bf4//l5uL/7urv//Ly8v/w8PD/4+Pj/9bW1v/7+/v/////////////////////////\r\n        ////////////////////////+fn5/66urv+hoaH/rKys/729vf/V1dX/4+Pj/+np6f/p6en/6enp/+jo\r\n        6P/o6Oj/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/4uLi/+Hh4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9fX\r\n        1//Z2dn/19fX/9DQ0P/Dw8PzAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx8fEk//////////////////////////////////////9M\r\n        H///MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//+cg///////////////\r\n        ////////////////////////////////////////////////////7Of//6KL//9SJ///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//4Jj////////////////////////////////////\r\n        ////////ycnJ/6Wlpf+5ubn/1NTU/+zs7P/39/f/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4\r\n        +P/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f09v/w8vP/8+7v/+Pl5f/X2tj/09HQ/7+5\r\n        0P8SD/n/Pzz//0E88/9VVfX/MiD9/15otv9JUMP/QTb4/1la8v9BPPH/QD/7/01K/v8WEP//08/b/9rj\r\n        5//l5uL/7urv//Ly8v/t7e3/4eHh//n5+f//////////////////////////////////////////////\r\n        //////////////Dw8P+lpaX/o6Oj/66urv/Gxsb/2dnZ/+Xl5f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn\r\n        5//m5ub/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9bW1v/Y2Nj/19fX/9DQ\r\n        0P/Dw8PzAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADv7+8q//////////////////////////////////////81A///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//183///8+///////////////////////////////\r\n        ////////////////////////////////////////////////////z8P//39f//85B///MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//+Mb///////////////////////////////////////9vb2/6am\r\n        pv+4uLj/0tLS/+vr6//29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3\r\n        9//39/f/9/f3//f39//39/f/9/f3//X3+P/0+PP/6fHx/+Xo3//j4Nz/2tDc/7C7yf8TEvH/PkD9/zo+\r\n        9P9XSvr/MSb4/15ps/9PU8T/PjL8/1lU8/9APO//Pzn//0lH//8eGfH/yc7X/97g4f/z6PL/7+/v//Dw\r\n        8P/t7e3/+fn5////////////////////////////////////////////////////////////////////\r\n        ///i4uL/oKCg/6ampv+1tbX/y8vL/97e3v/m5ub/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk\r\n        5P/j4+P/4uLi/+Dg4P/e3t7/3Nzc/9vb2//Z2dn/19fX/9bW1v/W1tb/09PT/87Ozv/Dw8PzAAAAFgAA\r\n        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD19fVH//////////////////////////////////z7//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//OQf//9/X////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////18///rJf//1wz//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//qZP//////////////////////////////////////8zMzP+6urr/1tbW/+zs\r\n        7P/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3\r\n        9//39/f/9/f3//Tz9f/19vL/6/Dx/+bn4//i39v/2tPa/7bBz/8VE/X/RT7//zk4+f9TT/T/Miz1/19n\r\n        uv9TV8D/Nizw/1FR8f9BOvX/P0H6/0I8//8sJ/T/zM7g/+Dl5P/y7ez/7/Lw/+7u7v/z8/P/////////\r\n        ////////////////////////////////////////////////////////////////////////w8PD/6Gh\r\n        of+pqan/vLy8/9LS0v/h4eH/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4eHh/+Dg\r\n        4P/e3t7/3Nzc/9ra2v/Y2Nj/1tbW/9XV1f/V1dX/0tLS/83Nzf/CwsLzAAAAFgAAAAcAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwH19fVT////////\r\n        /////////////////////////+Xf//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//oov/////////////////////////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////c0///jG///0IT//8zAP//MwD//zMA//8z\r\n        AP//OQf//+zn/////////////////////////////////9XV1f++vr7/2tra/+7u7v/19fX/9vb2//b2\r\n        9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//f0\r\n        9v/4+PL/7fHy/+jn6f/h397/29nZ/7/H2P8cFPv/ST3//z46/f9LTfH/MSzz/15kw/9ZXcb/Nyvv/01S\r\n        9P9AOfb/PED3/z42//88NPP/ztDi/+Dl4//s6+H/6Ovp/+3t7f/39/f/////////////////////////\r\n        ////////////////////////////////////////////////////////+fn5/6qqqv+jo6P/r6+v/8HB\r\n        wf/X19f/5OTk/+fn5//m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4ODg/9/f3//d3d3/3Nzc/9ra\r\n        2v/X19f/1dXV/9PT0//U1NT/0dHR/8zMzP/CwsLzAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwH39/do////////////////////////\r\n        /////////9nP//8zAP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zMA//9fN////Pv/////////\r\n        //////////////////////////////z8/P//////////////////////////////////////////////\r\n        //////////////////////////////////////////n3//+5p///bEf//zMA//8zAP//MwD//9/X////\r\n        /////////////////////////////8fHx//ExMT/4eHh//Dw8P/29vb/9vb2//b29v/29vb/9vb2//b2\r\n        9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//n2+P/6+PD/7vDx/+zn\r\n        8P/i4+H/4eDc/8fO3f8lHPn/QTb+/0I9/P9EQ/H/PDT3/1Nb1P9OUdf/PjH3/01R8P8/PPD/Nzj+/zwx\r\n        //9USfP/2tvp/+bt6v/s7eT/6uzs/+3t7f/7+/v//////////////////////////////////9f///+D\r\n        ////5////////////////////////////////////////+Li4v+goKD/pqam/7Kysv/Kysr/29vb/+Tk\r\n        5P/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Pj4//j4+P/39/f/9/f3//d3d3/29vb/9nZ2f/X19f/1NTU/9LS\r\n        0v/T09P/0NDQ/8vLy//BwcHzAAAAFgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwEAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4+Ph3/////////////////////////////////8y///8z\r\n        AP//MwD//zMA//8zAP//MwD//zMA//8zAP//MwD//zkH///f1///////////////////////////////\r\n        ////////6enp/9nZ2f/y8vL//Pz8////////////////////////////////////////////////////\r\n        /////////////////////////////////////////+Xf//+pk///taP/////////////////////////\r\n        /////////////8PDw//Pz8//6enp//Pz8//29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2\r\n        9v/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//Xy9P/08ez/7Ozs/+rm8f/l6Ob/4+Tg/8zS\r\n        3/8zKfH/PTn9/0Y//v9EPvH/T0b6/zk85f80Mur/TUX+/1ZX7f9CQO7/NTb//zMf//97der/4ePt/+nu\r\n        7f/r7Oj/6+zw/+3t7f///////////////////////////////////////zP///8A////P/////v/////\r\n        ///////////////////////////////////Dw8P/oaGh/6ioqP+7u7v/z8/P/97e3v/k5OT/5OTk/+Tk\r\n        5P/k5OT/4+Pj/+Pj4//i4uL/39/f/97e3v/d3d3/29vb/9nZ2f/W1tb/09PT/9HR0f/S0tL/z8/P/8rK\r\n        yv/AwMDzAAAAFwAAAAefn58Cn5+fBZ+fnwifn58On5+fFJ+fnxifn58Sn5+fC5+fnwMAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwH5+fmI/////////////////////////////////7mn//8zAP//MwD//zMA//8z\r\n        AP//MwD//zMA//8zAP//MwD//6KL///////////////////////////////////////5+fn/0NDQ/+bm\r\n        5v/x8fH/9PT0//b29v/6+vr//v7+////////////////////////////////////////////////////\r\n        /////////////////////////////////////////////////////////////////////////////8jI\r\n        yP/c3Nz/7+/v//T09P/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X1\r\n        9f/19fX/9fX1//X19f/19fX/9fX1//X09v/28+//8PHv//Dt9v/s8e//6+no/9fZ4f9NR+z/NTX9/0I2\r\n        //9APuz/W1X2/yEc9P8jHPP/Wlb1/1xZ6/9EQvD/MjT+/zIg9/+rr9//4uDs/+Pm6v/n6Ob/6unt/+/v\r\n        7////////////////////////////////////////wf///8A////AP///4v/////////////////////\r\n        ///////////////////5+fn/qamp/6Kiov+tra3/wMDA/9bW1v/f39//5OTk/+Pj4//j4+P/4+Pj/+Li\r\n        4v/h4eH/39/f/97e3v/c3Nz/2tra/9jY2P/V1dX/0tLS/9DQ0P/R0dH/zs7O/8nJyf/AwMDzIiIiHGxs\r\n        bBWfn58Zn5+fJJ+fny+fn588n5+fR5+fn02fn59Cn5+fL5+fnxufn58Nn5+fBAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+f\r\n        nwH6+vqb/////////////////////////////////6+b//8zAP//MwD//zMA//8zAP//MwD//zMA//8z\r\n        AP//Xzf///z7///////////////////////////////////////Z2dn/3t7e/+7u7v/z8/P/9PT0//T0\r\n        9P/09PT/9PT0//f39//8/Pz/////////////////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////////9fX1/93d3f/s7Oz/9PT0//X1\r\n        9f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/09PT/9PT0//T09P/09PT/9PT0//T0\r\n        9P/09PT/9PT0//Hz8//y8O//7vLt/+7t8f/r8O7/6+jq/9/e4P9ubO7/MCv8/0E1//85PvH/W1L8/ygi\r\n        //9BP/3/Z2by/1tY8f9GQu//KSf9/1pZ7//V3uL/5uLt/+jp7f/q6ur/8O/r/+3t7f//////////////\r\n        /////////////////////////xP///8A////AP///wf////X////////////////////////////////\r\n        ////////4uLi/6CgoP+lpaX/s7Oz/8fHx//Z2dn/4uLi/+Pj4//j4+P/4uLi/+Hh4f/h4eH/39/f/97e\r\n        3v/b29v/2dnZ/9bW1v/U1NT/0dHR/9DQ0P/Pz8//zc3N/8fHx/++vr76Z2dnOJOTk0Wfn59in5+fgJ+f\r\n        n5ifn5+kn5+fq5+fn66fn5+in5+fiZ+fn2Gfn585n5+fGJ+fnwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwH7+/un////////\r\n        /////////////////////////5l///8zAP//MwD//zMA//8zAP//MwD//zMA//85B///39f/////////\r\n        /////////////////////////////+jo6P/X19f/6urq//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0\r\n        9P/09PT/9fX1//n5+f/9/f3/////////////////////////////////////////////////////////\r\n        ///////////////////////////////////+/v7/5eXl/+zs7P/z8/P/9fX1//X19f/19fX/9fX1//X1\r\n        9f/19fX/9fX1//X19f/19fX/9fX1//X19f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//D1\r\n        9P/z8fH/8PTu/+/u8P/u8/H/7+vw/+3r6v+Njvz/KCD2/z42//8mL/D/QTH0/ykp9/9eaPb/bmrx/1xX\r\n        +P9JRO3/Ixf//4qg7v/r8ez/6+fs/+7t7//t6uz/8vLm/+7u7v//////////////////////////////\r\n        /////////x////8A////AP///wD///83////+////////////////////////////////////////8PD\r\n        w/+hoaH/qamp/7m5uf/Ozs7/3d3d/+Li4v/i4uL/4uLi/+Hh4f/g4OD/39/f/93d3f/b29v/2NjY/9XV\r\n        1f/T09P/0dHR/87Ozv/Ly8v/x8fH/7+/v/+2trb/jY2Nd5ubm42fn5+un5+fzJ+fn+Kfn5/qn5+f7Z+f\r\n        n+2fn5/mn5+f0Z+fn6ufn59+n5+fTJ+fnx2fn58HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwL8/PzB////////////////////////\r\n        /////////49z//8zAP//MwD//zMA//8zAP//MwD//zMA//+ii///////////////////////////////\r\n        ////////9/f3/8/Pz//k5OT/8PDw//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8/Pz//Pz\r\n        8//z8/P/9vb2//r6+v/+/v7/////////////////////////////////////////////////////////\r\n        ///////////////////v7+//7e3t//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0\r\n        9P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//P08v/z9PL/8fHx/+/v\r\n        7//v7vD/7+7w/+rp7f/k4+f/GBf2/yAi//8NDfP/Kifz/2dm/P92dPz/ZWL+/05T9f8xJOr/gH/m/9DW\r\n        6f/u7u7/7Ovv/+rx6v/w8+r/8uvy/+zs7P/8/Pz//////////////////////////////////zv///8A\r\n        ////AP///wD///8A////f/////////////////////////////////////////n5+f+rq6v/o6Oj/6ys\r\n        rP/AwMD/09PT/97e3v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/a2tr/1tbW/9PT0//Q0ND/y8vL/8fH\r\n        x//Dw8P/u7u7/7Gxsf+qqqr/m5ubzqOjo966urrwx8fH+NXV1f7j4+P+4eHh/7q6uv6fn5/8n5+f9p+f\r\n        n+mfn5/On5+fmZ+fn0Wfn58Xn5+fAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwL8/PzF/////////////////////////////////39f//8z\r\n        AP//MwD//zMA//8zAP//MwD//183///8+///////////////////////////////////////1tbW/+Dg\r\n        4P/t7e3/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz\r\n        8//09PT/9/f3//z8/P////////////////////////////////////////////////////////////j4\r\n        +P/u7u7/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0\r\n        9P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Lz8f/x8vD/8PDw/+7u7v/v7vD/8fDy/+/u\r\n        8v/r6u7/jJb//y8c9f8kE/7/R0ry/1FW5/9aVvX/RED3/yUc9f+Ghez/0tT//+jq6//o4+T/8e3y/+bs\r\n        5//m6uT/8Ozx/+3t7f/7+/v//////////////////////////////////0f///8A////AP///wD///8A\r\n        ////A////8/////////////////////////////////////////n5+f/oKCg/6SkpP+ysrL/xcXF/9fX\r\n        1//f39//4ODg/9/f3//e3t7/3d3d/9zc3P/Y2Nj/09PT/83Nzf/Gxsb/vr6+/7a2tv+xsbH/rKys/6am\r\n        pv+4uLj/2tra+vv7+//////////////////////////////////t7e3/vr6+/6CgoP2fn5/wn5+fx5+f\r\n        n3Wfn58zn5+fCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAJ+fnwP+/v7i/////////////////////////////////2xH//8zAP//MwD//zMA//8z\r\n        AP//PAv//+Xf///////////////////////////////////////n5+f/1tbW/+rq6v/x8fH/8/Pz//Pz\r\n        8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8/Pz//Pz\r\n        8//19fX/+fn5//7+/v/////////////////////////////////9/f3/9fX1//Ly8v/z8/P/9PT0//T0\r\n        9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8vLy//P08v/y8/H/8fHx/+/v7//v7vD/8fDy//Dv8f/t7O7/7ufq/7u5\r\n        9f9YUPf/KBv//zEo+v9NQPD/hXv3/7fA8v/W3O//6uzt//fx7P/x6er/6ufp/+ft6P/t8ez/8Ozx/+zs\r\n        7P/5+fn//////////////////////////////////1////8A////AP///wD///8A////AP///y/////7\r\n        ////////////////////////////////////////x8fH/6CgoP+np6f/t7e3/8zMzP/Z2dn/39/f/9/f\r\n        3//c3Nz/2dnZ/9XV1f/Ozs7/xsbG/8DAwP+4uLj/sLCw/6mpqf+vr6//zc3N//Dw8P//////////////\r\n        /////////////////////////////////////////////+vr6/+ioqL9n5+f45+fn6Wfn59Wn5+fFp+f\r\n        nwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+f\r\n        nwP+/v7q/////////////////////////////////2U///8zAP//MwD//zMA//8zAP//qZP/////////\r\n        //////////////////////////////f39//T09P/5OTk//Dw8P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz\r\n        8//19fX/+Pj4//r6+v/6+vr/+Pj4//b29v/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz\r\n        8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Lz8f/z8/P/8vLy//Hx8f/w8PD/8O/x/+7t7//s6+3/5e7k/+jx9f/e5/T/2eDv/97g\r\n        8v/i5e3/4+zv/+Dq9P/t7e3/6OPk//Lq6//y7ez/6uvp/+rv7f/q7O3/7urw/+vr6//4+Pj/////////\r\n        /////////////////////////2////8A////AP///wD///8A////AP///wD///9/////////////////\r\n        ////////////////////////+vr6/6urq/+ioqL/rKys/7y8vP/Q0ND/2tra/9nZ2f/W1tb/z8/P/8fH\r\n        x/+9vb3/s7Oz/6urq/+pqan/wsLC/+Pj4//+/v7/////////////////////////////////////////\r\n        ///////////////////////////////////Y2Nj/n5+f8p+fn82fn598n5+fLJ+fnwsAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+fnwP/////////////\r\n        /////////////////////////0wf//8zAP//MwD//zMA//9lP///////////////////////////////\r\n        /////////////9XV1f/e3t7/7e3t//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz\r\n        8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Dw\r\n        8P/x8fH/8vLy//Hx8f/x8fH/8PDw/+/v7//t7e3/8/Dy/+fk7f/v8/T/8PXs/+/u6v/27vX/8+rt//bw\r\n        6//q6e3/8+/0/+zp6//r7Or/7fDu/+rr7//s6+//7ejp/+rq6v/29vb/////////////////////////\r\n        /////////3////8A////AP///wD///8A////AP///wD///8D////z///////////////////////////\r\n        /////////////+fn5/+fn5//pKSk/6+vr//BwcH/ysrK/8nJyf/BwcH/ubm5/7Kysv+srKz/tbW1/9bW\r\n        1v/4+Pj/////////////////////////////////////////////////////////////////////////\r\n        ////////////////////////wMDA+5+fn+Wfn5+fn5+fUJ+fnxmfn58CAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHx8Q3/////////////////////////////\r\n        /////////0UX//8zAP//MwD//zwL///l3///////////////////////////////////////5ubm/9fX\r\n        1//p6en/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Dw\r\n        8P/w8PD/8PDw//Dw8P/v7+//9PLq//Xz8v/u7e//7e3t/+rs7P/q7ev/7/Du/+zs7P/q8er/6O7p/+nv\r\n        6v/q7+3/6uvv/+vp7//t6uz/7e3n/+rq6v/09PT//////////////////////////////////5v///8A\r\n        ////AP///wD///8A////AP///wD///8A////L/////v/////////////////////////////////////\r\n        ///Hx8f/oaGh/6Wlpf+ysrL/t7e3/7a2tv+vr6//ra2t/8rKyv/s7Oz/////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////////8/Pz/5+fn/Cfn5+1n5+faZ+fnyKfn58EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/CD//////////////////////////////////////zMA//8z\r\n        AP//MwD//6mT///////////////////////////////////////39/f/0NDQ/+Tk5P/v7+//8vLy//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly\r\n        8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx\r\n        8f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Ly8v/x8fH/8PDw/+/v7//v7+//7u/t/+7v\r\n        7f/u7+3/7+3t/+/u6v/x7+7/7u/r/+nx5//o7u3/5uvu/+nw6f/u8ej/5+vl/+zw6//o6uv/7Ovv/+3q\r\n        7P/h4uD/6+/q/+np6f/z8/P//////////////////////////////////6f///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///3v////////////////////////////////////////6+vr/q6ur/6Gh\r\n        of+kpKT/pqam/76+vv/f39///Pz8////////////////////////////////////////////////////\r\n        /////////////////////////////////////////////////////////////////////////////66u\r\n        rvSfn5+4n5+fbJ+fnyOfn58EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAP///wv//////////////////////////////////////08j//8zAP//dVP/////////\r\n        ///////////////////////////////////W1tb/3Nzc/+zs7P/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly\r\n        8v/y8vL/8vLy//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw\r\n        8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7u7u/+/v7//v8O7/7u/t/+7v7f/t7uz/7u/z/+7s\r\n        6//y7+v/8evw//Dq9f/w7e//7Ovn//Hr8P/v6O//7+vw/+7q7//s6O7/7ejp/+7u6P/q7un/4uXp/+np\r\n        6f/w8PD//////////////////////////////////7////8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wP////H////////////////////////////////////////5+fn/6urq//R0dH/9fX1////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////+////7P///9/////m/////v//////////////////////////////////8nJyfSfn5+nn5+fVp+f\r\n        nxqfn58CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAgAA\r\n        AAL////7/////////////////////////////////9/X//+5p////Pv/////////////////////////\r\n        /////////////+Pj4//W1tb/6Ojo//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx\r\n        8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v\r\n        7//v7+//7+/v//Dw8P/w8PD/7+/v/+7u7v/t7e3/7e3t/+7u7v/v7+//7e3t/+7u7v/u7u7/7e3t/+3t\r\n        7f/t7e3/7Ozs/+rq6v/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6enp/+jo6P/w8PD/////////\r\n        /////////////////////////8////8A////AP///wD///8A////AP///wD///8A////AP///wD///8n\r\n        ////9///////////////////////////////////////////////////////////////////////////\r\n        /////////////////////////////////////////////////////////9////97////G////wD///8A\r\n        ////AP///7f//////////////////////////////////9nZ2fKfn5+Pn5+fOp+fnw8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAADAAAABQAAAAcAAAAKAAAACwAAAA38/PzR////////\r\n        ////////////////////////////////////////////////////////////////////////9vb2/87O\r\n        zv/g4OD/6+vr/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t\r\n        7f/t7e3/7e3t/+3t7f/s7Oz/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/t7e3/7e3t/+3t\r\n        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t\r\n        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr\r\n        6//r6+v/6+vr/+rq6v/q6ur/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+np\r\n        6f/q6ur/6urq/+np6f/p6en/6enp/+np6f/o6Oj/6Ojo/+fn5//t7e3/////////////////////////\r\n        /////////9////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////c///////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        //////////////////////////f///+n////R////wD///8A////AP///wD///8A////D////+f/////\r\n        /////////////////////////////83NzeGfn591n5+fIp+fnwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAEAAAACAAAABAAAAAcAAAAMAAAAEAAAABUAAAAZAAAAHAAAAB7U1NRy////////////////////////\r\n        ////////////////////////////////////////////////////////1NTU/9fX1//g4OD/5OTk/+Tk\r\n        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk\r\n        5P/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5OTk/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl\r\n        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk\r\n        5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Hh4f/i4uL/4uLi/+Li\r\n        4v/i4uL/4+Pj/+Xl5f/m5ub/6enp/+rq6v/r6+v/6urq/+rq6v/r6+v/6+vr/+rq6v/q6ur/6enp/+np\r\n        6f/o6Oj/6Ojo/+jo6P/o6Oj/5+fn/+fn5//t7e3///////////////////////////////////v///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////A////8f/////////////////////\r\n        ///////////////////////////////////////////////////////////////////////////////T\r\n        ////c////xP///8A////AP///wD///8A////AP///wD///8D////w///////////////////////////\r\n        /////////////8LCwsGfn59Yn5+fFJ+fnwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAHAAAADQAA\r\n        ABMAAAAbAAAAIwAAACoAAAAwAAAANAAAADcNDQ079vb24///////////////////////////////////\r\n        ///////////////////////////////////k5OT/y8vL/9LS0v/V1dX/1tbW/9bW1v/W1tb/1tbW/9bW\r\n        1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW\r\n        1v/X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9bW\r\n        1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9XV1f/V1dX/1dXV/9XV\r\n        1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/U1NT/1NTU/9PT0//T09P/1NTU/9TU1P/V1dX/19fX/9nZ\r\n        2f/b29v/3t7e/+Hh4f/l5eX/5+fn/+jo6P/q6ur/6urq/+rq6v/q6ur/6enp/+jo6P/o6Oj/6Ojo/+jo\r\n        6P/n5+f/5+fn/+bm5v/o6Oj///////////////////////////////////////8D////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///yf////3////////////////////////////////\r\n        ///////////////////////////////////////////////z////m////zf///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wP///+r/////////////////////////////////////////f39/aqq\r\n        qoKfn584n5+fCp+fnwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABAAAAAkAAAAQAAAAGgAAACUAAAAxAAAAPQAA\r\n        AEcAAABPAAAAVQAAAFgAAABbiYmJi/v7+/f/////////////////////////////////////////////\r\n        /////////////+bm5v+8vLz/v7+//8HBwf/CwsL/wsLC/8LCwv/Dw8P/w8PD/8PDw//Dw8P/w8PD/8PD\r\n        w//Dw8P/w8PD/8PDw//Dw8P/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/w8PD/8PDw//Dw8P/w8PD/8PD\r\n        w//Dw8P/w8PD/8PDw//CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/wsLC/8PDw//Dw8P/wsLC/8LC\r\n        wv/CwsL/wsLC/8LCwv/CwsL/wsLC/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB\r\n        wf/BwcH/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wcHB/8HBwf/CwsL/xMTE/8jIyP/Ly8v/z8/P/9TU\r\n        1P/b29v/4ODg/+Tk5P/n5+f/6Ojo/+np6f/p6en/6enp/+jo6P/o6Oj/5+fn/+bm5v/k5OT/4uLi/+Dg\r\n        4P/h4eH///////////////////////////////////////8f////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///9z////////////////////////////////////////////////\r\n        ////////////////////x////2f///8L////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///5f/////////////////////////////////////////////3d3dyp+fn0Kfn58Xn5+fAgAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAEAAAAEAAAACgAAABMAAAAfAAAALgAAAD8AAABPAAAAXgAAAGoAAAByAAAAeAAA\r\n        AHwAAAB+AAAAf1tbW5vy8vLz////////////////////////////////////////////////4eHh/6en\r\n        p/+oqKj/qKio/6ioqP+pqan/qamp/6mpqf+qqqr/qqqq/6qqqv+qqqr/qqqq/6qqqv+qqqr/qqqq/6mp\r\n        qf+pqan/qamp/6mpqf+pqan/qamp/6mpqf+pqan/qKio/6ioqP+oqKj/qKio/6ioqP+pqan/qamp/6mp\r\n        qf+pqan/qamp/6mpqf+pqan/qamp/6mpqf+pqan/qamp/6qqqv+qqqr/qqqq/6qqqv+pqan/qamp/6mp\r\n        qf+pqan/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+np6f/p6en/6en\r\n        p/+np6f/p6en/6ioqP+oqKj/qKio/6ioqP+pqan/rKys/7Gxsf+0tLT/vb29/8TExP/Ozs7/1tbW/93d\r\n        3f/j4+P/5ubm/+fn5//n5+f/5ubm/+Xl5f/j4+P/39/f/9ra2v/V1dX/0NDQ/8vLy//Gxsb/////////\r\n        //////////////////////////////8v////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8D////w///////////////////////////////////////////////6////4////8r\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////i///////////\r\n        ///////////////////////////////////6+vr1q6urWZ+fnxyfn58GAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA\r\n        AAQAAAAKAAAAFAAAACIAAAA0AAAASQAAAFwAAABvAAAAfQAAAIgAAACRAAAAlQAAAJgAAACaAAAAmgAA\r\n        AJovLy+nw8PD3/f39/v///////////////////////////r6+v/X19f/jo6O/42Njf+Ojo7/j4+P/4+P\r\n        j/+Pj4//j4+P/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kJCQ/4+Pj/+Pj4//j4+P/4+P\r\n        j/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//kJCQ/5CQkP+QkJD/kJCQ/5CQkP+Pj4//j4+P/4+P\r\n        j/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5CQkP+QkJD/kJCQ/5CQkP+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+P\r\n        j/+Ojo7/jo6O/46Ojv+Ojo7/jo6O/46Ojv+Ojo7/jo6O/46Ojv+Ojo7/jo6O/46Ojv+Ojo7/jY2N/46O\r\n        jv+Ojo7/j4+P/4+Pj/+Pj4//kpKS/5eXl/+ampr/paWl/66urv+6urr/xsbG/9DQ0P/X19f/3Nzc/93d\r\n        3f/b29v/2dnZ/9bW1v/S0tL/zMzM/8bGxv/AwMD/urq6/7S0tP+vr6//+/v7////////////////////\r\n        //////////////8/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////H/////P//////////////////////////////7v///9X////B////wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///9v////////////////////////////////\r\n        //////////////39/fzMzMx/n5+fHp+fnwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAAAASAAAAIgAA\r\n        ADYAAABMAAAAZAAAAHkAAACLAAAAmAAAAKEAAACnAAAAqwAAAKwAAACuAAAArgAAAK8AAACvAAAAsAoK\r\n        CrRWVlbIlJSU239/f9eAgIDugoKC/4KCgv+AgID/fHx8/3x8fP99fX3/fn5+/35+fv9+fn7/fn5+/39/\r\n        f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/319\r\n        ff99fX3/fX19/319ff99fX3/fX19/319ff99fX3/fX19/319ff9+fn7/fn5+/35+fv9+fn7/fn5+/35+\r\n        fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/319ff99fX3/fn5+/35+fv9+fn7/fn5+/319\r\n        ff99fX3/fX19/319ff99fX3/fX19/319ff99fX3/fX19/319ff99fX3/fX19/3x8fP98fHz/fX19/319\r\n        ff9+fn7/gICA/4SEhP+IiIj/kZGR/5qamv+np6f/tLS0/76+vv/Gxsb/ysrK/8jIyP/Gxsb/v7+//7m5\r\n        uf+zs7P/r6+v/6ysrP+qqqr/p6en/6ysrP/AwMD/+Pj4//////////////////////////////////9X\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///2v/////\r\n        /////////+P///+D////H////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///1v//////////////////////////////////////////////v7+/tfX\r\n        14+fn58ln5+fBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAA8AAAAdAAAAMgAAAEwAAABmAAAAfgAA\r\n        AJIAAACiAAAArAAAALIAAAC2AAAAuAAAALoAAAC6AAAAuwAAALsAAAC7AAAAuwAAALsAAAC8AAAAvQAA\r\n        AL5BRUPoZmtp/3B1c/9vdHL/b3Bu/3Bxb/9wcW//cHFv/3Bxb/9xcnD/cXJw/3FycP9xcnD/cXJw/3Fy\r\n        cP9xcnD/cXJw/3FycP9xcnD/cXJw/29ycP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29y\r\n        cP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29y\r\n        cP9vcnD/b3Jw/29ycP9vcnD/b3Jw/29ycP9vcnD/cHFv/3Bxb/9wcW//cHFv/3Bxb/9wcW//cHFv/3Bx\r\n        b/9ucW//bnFv/25xb/9ucW//bnFv/25xb/9ucW//bnFv/29wdP9ucHH/bnBw/3Bxb/9xcm7/cnNx/3d1\r\n        df98enz/i4KG/4+Mj/+VmZb/naOc/6iqpf+wrq7/s7Gz/7Gxsv+vr6//rKys/6enp/+oqKj/ubm5/8vL\r\n        y//g4OD/9fX1//////////////////////////////////////////////////9j////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+L////S////wP///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////U/////v/////////////////////////////////////////////2tranJ+fnyifn58KAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAEAAAADAAAACgAAABcAAAArAAAARQAAAGEAAAB8AAAAlAAAAKYAAACyAAAAuAAA\r\n        ALwAAAC+AAAAvhcXGMozNDbZMjQ22TI0NtkyNTXZMjU12TIyNdkwMDPZLy8x2SsrLtlKSk/xYWFn/2lp\r\n        b/9oaG7/ZWVr/2Vla/9mZmz/ZmZs/2ZmbP9mZmz/Z2dt/2dnbf9nZ23/Z2dt/2dnbf9nZ23/Z2dt/2dn\r\n        bf9nZ23/Z2dt/2dnbf9nZ23/Z2dt/2dnbf9nZ23/Z2dt/2dnbf9nZ23/ZmZs/2ZmbP9mZmz/ZmZs/2Zm\r\n        bP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2Zm\r\n        bP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2ZmbP9mZmz/ZmZs/2ZmbP9lZWv/ZWVr/2Vl\r\n        a/9lZWv/ZWVr/2Vla/9lZWv/ZWVr/2FqZ/9gaGf/Ymdq/2Jma/9kaGz/aWxw/3J1dv97f37/iIuB/46O\r\n        jv+Vk5f/nJyc/5+goP+hoqL/o6Ok/7S0s//IyMj/2tra/+3t7f//////////////////////////////\r\n        //////////////////////////////////////////////9/////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///87////8///////////\r\n        ///////////////////////////////////e3t6pn5+fKZ+fnwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAEAAAAFAAAAEAAAACAAAAA5AAAAVwAAAHUAAACQAAAApAAAALIAAAC6AAAAvRocHctBR2DqSlB5+kZH\r\n        gf9BPob/PTeJ/zsyjP86MYv/OjGL/zc0if81Mof/MzCF/zAtgv8tKn//MS6D/zYziP81Mof/NDGG/zQx\r\n        hv80MYb/NDGG/zQxhv81Mof/NTKH/zUyh/81Mof/NTKH/zUyh/81Mof/NTKH/zUyh/81Mof/NTKH/zUy\r\n        h/81Mof/NTKH/zUyh/81Mof/NTKH/zUyh/81Mof/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQx\r\n        hv80MYb/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQx\r\n        hv80MYb/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQxhv80MYb/NDGG/zQx\r\n        hv80MYb/NDGG/zkyh/84MIf/OTCJ/zw2h/9GQ4X/W1uH/3J0jf+Fh5T/kZOW/5iYmf+qqar/vr2+/9XV\r\n        1f/o6Oj//Pz8////////////////////////////////////////////////////////////////////\r\n        //////////////////////////////+P////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///yv////z////////////////////////////////\r\n        /////////////+fn57qfn58un5+fDJ+fnwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAIAAAAFgAA\r\n        ACoAAABGAAAAZwAAAIUAAACdAAAArwAAALkHCAjBPEBa5zw3k/8aFpT/GBKV/xcQl/8ZEJ3/GQ+f/xgP\r\n        n/8ZEZ7/GhOe/xYSof8UEJ//FBCf/xQQn/8SDp3/Ew+e/xURoP8UEJ//EhCf/xIQn/8SEJ//EhCf/xIQ\r\n        n/8SEJ//EhCf/xMRoP8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQ\r\n        n/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQ\r\n        n/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQ\r\n        n/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xIQn/8SEJ//EhCf/xgR\r\n        mv8aE5z/IRmf/zMsn/9NR57/aWWd/52ctP/IyM7/4eHi//f39///////////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        //////////////+f////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////J////+f/////////////////////////////////////////////6Ojoxp+f\r\n        nzKfn58PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAALAAAAHAAAADMAAABSAAAAdAAA\r\n        AJEAAACnAAAAtRQVFsZAQXf3IxqZ/xEKk/8VDaD/IBqn/y0qr/84OLT/P0K1/0VJuf9ITbr/Sk+8/1FO\r\n        u/9PTLn/UE26/1FOu/9QTbr/UE26/1BNuv9QTbr/Tk66/05Ouv9OTrr/Tk66/05Ouv9OTrr/Tk66/05O\r\n        uv9OTrr/Tk66/05Ouv9OTrr/Tk66/05Ouv9OTrr/Tk66/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BN\r\n        uv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BN\r\n        uv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/Tk66/05Ouv9OTrr/Tk66/05O\r\n        uv9OTrr/Tk66/05Ouv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/0tNvf9OULz/V1q3/2tt\r\n        sP+rq8X/6urt////////////////////////////////////////////////////////////////////\r\n        //////////////////////////////////////////////////////////////////////////////+3\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8X\r\n        ////2//////////////////////////////////////////////t7e3SpKSkOZ+fnxCfn58BAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAOAAAAIAAAADoAAABcAAAAfgAAAJkAAACtFRYYw0E+\r\n        hvcZDZv/Fg2k/yMhqf9PTbf/W1rB/2RmxP9pa8P/am3C/2prxf9qacn/amjM/25rwf9tasD/bWrA/29s\r\n        wv9vbML/bmvB/21qwP9ua8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9tbML/bWzC/21swv9sa8H/bGvB/2xr\r\n        wf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xr\r\n        wf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xr\r\n        wf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xr\r\n        wf9sa8H/bGvB/2xrwf9sa8H/bGvB/2xrwf9sa8H/bGvB/2dky/9sa8b/fHy6/9jZ5P//////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        //////////////////////////////////////////f////D////j////1P///8b////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wv////X////////////////\r\n        //////////////////////////////Ly8t2kpKQ8n5+fEp+fnwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAQAAAAQAAAAJQAAAEAAAABjAAAAhAAAAJ4CAgOyQ0J58R4Zmv8UCqr/MC24/01O\r\n        vv9dWcL/Yl/G/2Nhxf9iYMD/YV+//2BdwP9hWsL/Y1zF/11cxP9cW8P/XFvD/11cxP9eXcX/XVzE/1xb\r\n        w/9dXMT/XVzE/11cxP9dXMT/XVzE/11cxP9dXMT/XVzE/11cxP9dXMT/XVzE/11cxP9dXMT/XVzE/11c\r\n        xP9dXMT/XVzE/19bxP9fW8T/X1vE/19bxP9fW8T/X1vE/19bxP9fW8T/X1vE/19bxP9fW8T/X1vE/19b\r\n        xP9fW8T/X1vE/19bxP9fW8T/X1vE/19bxP9fW8T/X1vE/19bxP9fW8T/X1vE/19bxP9fW8T/X1vE/19b\r\n        xP9fW8T/X1vE/19bxP9fW8T/XVzE/11cxP9dXMT/XVzE/11cxP9dXMT/XVzE/11cxP9fW8T/X1vE/19b\r\n        xP9fW8T/X1vE/19bxP9fW8T/X1vE/2RdxP9qY8D/x8Xe////////////////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////2////6P///9r////M////wP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////C////8P/////////////////////////////////////\r\n        ////////8vLy4q6urkWfn58Wn5+fAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAUAAAATAAAAJwAAAEMAAABnAAAAiAAAAKFERF3WKiGa/w8In/8lKqv/Sk26/1RQuf9MTrr/TE66/01M\r\n        uv9MSrv/T068/1BNuv9PTbf/UVC4/1FOu/9RTrv/UE26/1BNuv9ST7z/UU67/1FOu/9RTrv/UU67/1FO\r\n        u/9RTrv/UU67/1FOu/9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1FO\r\n        u/9RTrv/UU67/1FOu/9RTrv/UU67/1FOu/9RTrv/UE26/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BN\r\n        uv9RTrv/UU67/1FOu/9RTrv/UU67/1FOu/9RTrv/UU67/1BNuv9QTbr/UE26/1BNuv9QTbr/UE26/1BN\r\n        uv9QTbr/UU67/1FOu/9RTrv/UU67/1FOu/9RTrv/UU67/1FOu/9RTrv/UU67/1FOu/9RTrv/UU67/1FO\r\n        u/9RTrv/UU67/1JOtf+hn9T/////////////////////////////////////////////////////////\r\n        /////////////////////////////////////////+////+3////g////0v///8P////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8D////s//////////////////////////////////////////////29vbsubm5VZ+f\r\n        nxWfn58DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAATAAAAKAAA\r\n        AEYAAABqAAAAiwMEBKQ4OJ34EQyj/yAbpv88OrH/QT27/zk7uP9BPbr/QT26/0E9uv9BPbr/QT26/0E9\r\n        uv9BPbr/QT26/0E+vP9APrn/Qj6//z88uv9ARLT/P0G3/zo6vP87Prj/QT65/z87uP9BP7r/QkK2/0BA\r\n        tv9BPbr/QDu8/0E5u/9APrr/QD66/0A+uv9APrr/QD66/0A+uv9APrr/QD66/0VCtv9CQbX/QkG5/z4+\r\n        uv8+Prr/QD+3/0BAtv9CP7r/Qjy5/0M+uf9EP7j/Qz63/0A+tv9BP7f/Qj+6/0E+uf8+QLb/PT62/z48\r\n        t/9CPrv/Qjy5/0E6uf9EPbz/Qjq8/0Q/uv9CPbb/Q0O1/0A8uf9BP7v/QD65/z8+tv8+P7f/Qj+9/0E/\r\n        uv8+QLb/P0G3/z9AuP8/QLr/QD65/z89uP9BPrn/QT65/0E+uf9BPrn/QT65/0E+uf9BPrn/QT65/0JA\r\n        uf/p6fb////////////////////////////////////////////////////////////////////////7\r\n        ////z////5P///9f////J////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///+n\r\n        //////////////////////////////////////////////j4+PS1tbVgn5+fGp+fnwYAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAUAAAAKQAAAEYAAABrAAAAi0FD\r\n        TsErKaD/Dguk/yIerf83NLL/ODK5/y8xs/8zMbP/MzGz/zMxs/8zMbP/MzGz/zMxs/8zMbP/MzGz/zY1\r\n        tf8zMrD/NDC3/zMvtv8zNK7/NTKw/zMttP83NLL/NjGy/zQvsv8zMbP/MTKy/zAxsf8xMbP/NDK0/zg0\r\n        tf8zMbP/MzGz/zMxs/8zMbP/MzGz/zMxs/8zMbP/MzGz/zMysv80M7P/NTO1/zMxs/8yMbH/NTOv/zYy\r\n        r/81MLH/NTGy/zQxr/8zMK7/MzGt/zQyrv81MrD/NDOz/zQzs/82Mbb/NTC1/zo4uv8zMbP/MTCw/zk1\r\n        tv80L7L/NTCz/zcxuP83Mrf/NzSy/zMvsP8zL7D/NDCx/zQwsf81MbL/NjKz/zYys/80M7H/MzS0/zMy\r\n        t/81Mrf/NDG2/zYxtP80MrT/NDK0/zQytP80MrT/NDK0/zQytP80MrT/NDK0/3Jwyf//////////////\r\n        /////////////////////////////////////////+P///+v////c////zv///8L////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///4//////////////////////\r\n        ////////////////////////9/f3+7S0tJSdnZ04n5+fCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAUAAAAKgAAAEcAAABsAAAAjFpdedodF57/Dwyo/yAe\r\n        s/8tJ7T/KSO2/yUnsf8pJrL/KSay/ykmsv8pJrL/KSay/ykmsv8pJrL/KSay/yknr/8nJqz/Kye2/y0m\r\n        t/8rJqv/JyOg/yYem/8oH5f/Jh6a/ygjnv8mJKb/JiWx/yYns/8lJrL/Jiaw/yYnrf8oJ7P/KCez/ygn\r\n        s/8oJ7P/KCez/ygns/8oJ7P/KCez/yQktP8oJbb/JiOu/yQjo/8iIJf/JCGU/ychlv8lH5b/ISCU/yEg\r\n        lP8iIZX/IiGV/yEflv8gH5f/IiCb/yQinv8rIan/LSat/yYiqv8oKLL/Kiq0/yQkrv8rKLP/Kiiw/yQg\r\n        tf8pJbT/JyOr/ycjoP8mIZr/JSCZ/yUgm/8nIZ7/JSSk/yglqv8pJrH/JyS1/yYjtf8pI7b/KSS1/ygk\r\n        s/8qJ7P/Kiez/yons/8qJ7P/Kiez/yons/8qJ7P/Kiez/6ur4P//////////////////////////////\r\n        /////////6f///9T////G////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////c///////////////////////////////////////////\r\n        ///6+vr/tLS05Jubm4ydnZ1En5+fE5+fnwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAcAAAAUAAAAKgAAAEcAAABtAAAAjGFikecVD6T/Dg2w/xwatP8fGbT/HBe2/xse\r\n        r/8cGbL/HBmy/xwZsv8cGbL/HBmy/xwZsv8cGbL/HBmy/xsZrv8bGqz/Hhu0/x4ZsP8ZFJn/GhiC/xoV\r\n        cP8ZEmf/FxFo/xgZcf8XFIf/GBSj/x0bsP8dHLL/HRqz/x0bsP8cGbL/HBmy/xwZsv8cGbL/HBmy/xwZ\r\n        sv8cGbL/HBmy/x0btP8dGK//FxOa/xcXg/8UFWv/ExJi/xURY/8VEWP/FRNl/xQSZP8TEWP/EBFi/xER\r\n        Zf8UE2n/FhRu/xUSbv8UD3j/GRWG/x0amP8YGKL/GRmt/x4ctf8bGrD/HBqw/x0Ztf8dGqv/Fg+W/xsa\r\n        fP8WFG3/ExBm/xYRbP8cF3P/FxaW/xsZof8eGq//HRm1/xwXtv8dGbX/IBu0/x4ZsP8cGbL/HBmy/xwZ\r\n        sv8cGbL/HBmy/xwZsv8cGbL/HBmy/6qp4v//////////////////////////////////m////wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///9b//////////////////////////////////////////////z8/P+1tbX/n5+f756e\r\n        nsGenp55n5+fOJ+fnxCfn58BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAcAAAAVAAAAKwAAAEgAAABtAAAAjV9fnO4VDa7/Cwux/xERsf8UDbH/FA20/xIUr/8UErL/FBKy/xQS\r\n        sv8UErL/FBKy/xQSsv8UErL/FBKy/xcStf8UErL/FRCx/w8Mpf8PDYn/JSl3/zQ6Zf84OVv/Ojlh/zY5\r\n        Zf8fIHj/EguW/xIPqP8UEK//Fg61/xgQsf8TEbH/ExGx/xMRsf8TEbH/ExGx/xMRsf8TEbH/ExGx/xMT\r\n        rf8SDaT/Ew2K/ysref82OWX/ODpc/zo7Xf88O13/ODZa/zk4Wv85OFr/ODhc/zo5YP82NV3/KSdR/xoX\r\n        RP8REkr/Dw5W/xAPb/8QDon/Eg+g/xQRrf8TDrH/FBC1/xURsP8VEp3/EwuI/zAzcP84OWX/Njdd/zg4\r\n        YP88O2f/CgyJ/xAQmv8UEKv/FA6z/xQOs/8UD7D/FRGw/xMQrP8TEbH/ExGx/xMRsf8TEbH/ExGx/xMR\r\n        sf8TEbH/ExGx/46N2v//////////////////////////////////v////wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///87\r\n        ////+//////////////////////////////////////////////Gxsb/n5+f+p+fn+afn5+zn5+fdJ+f\r\n        nzSfn58Rn5+fAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAVAAAAKwAA\r\n        AEgAAABtAAAAjV1bnu8TDLH/CAiy/wwKsP8QCq//EQqz/woKsP8LCa//Cwmv/wsJr/8LCa//Cwmv/wsJ\r\n        r/8LCa//Cwmv/wsIsv8LCLH/Cgmt/wsIpP8VE47/R06H/2t0ff90eXj/dHR6/2dteP84OoD/Fg+a/w8K\r\n        qf8OCq//EAa2/xIJs/8LCa//Cwmv/wsJr/8LCa//Cwmv/wsJr/8LCa//Cwmv/wwNq/8OCKP/GROK/0xN\r\n        hf9qcHv/c3d4/3V3eP90dnb/dXR4/3d2eP92dXf/dHN1/3Z1ef96eH7/dnV+/3Fwev9lann/Rkpn/xob\r\n        U/8JCF7/CQV8/wsGl/8SDa7/DAax/wwIrf8PDJf/GxCK/1hegf9vdH3/cHN3/29yd/9tb3f/BgmJ/woL\r\n        mf8PCqv/Dwqz/wwKsP8MC67/Dguu/w4Kr/8LCa//Cwmv/wsJr/8LCa//Cwmv/wsJr/8LCa//Cwmv/4aF\r\n        1////////////////////////////////////////9P///97////Q////wv///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////U/////v/////\r\n        ///////////////////////////////////9/f3/vr6+/5+fn/qfn5/ln5+ftZ+fn2qfn58xn5+fDZ+f\r\n        nwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAVAAAAKwAAAEkAAABtAAAAjVpa\r\n        ne8UDLP/CQi2/w4Ltf8SDLH/EQ2z/wsJtv8NDbX/DQ21/w0Ntf8NDbX/DQ21/w0Ntf8NDbX/DQ21/w4N\r\n        t/8MDLb/Cwuz/wwJrP8YE5b/VFaQ/3uAgf+EgXz/goCA/3R7fv8/QYj/Fg2j/wsJr/8MDLT/DQq6/w4M\r\n        sv8PDLX/Dwy1/w8Mtf8PDLX/Dwy1/w8Mtf8PDLX/Dwy1/wkMtP8PCa7/HRWS/1lZj/97gIP/goR+/4OB\r\n        gP+DgHz/goB//4SDf/+Eg3//gYF7/31+ev99fnr/f4B+/4GBgf9/gYH/fX6C/3Fxg/9AP2n/FRNf/wwJ\r\n        fP8NCZ7/EQy1/wsJuf8ODZ//HRGT/2ZtiP98gYD/foB6/4F/fv97enz/Cw6U/w8No/8PC7H/Dwq5/w4L\r\n        tf8MDbH/DAyy/w4Ltf8NDbX/DQ21/w0Ntf8NDbX/DQ21/w0Ntf8NDbX/DQ21/zo4wv//////////////\r\n        ///////////////////////////////////////////////P////m////2P///8r////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///2P/////////////////////\r\n        /////////////////////////f39/7W1tf6fn5/5n5+f4J+fn7Cfn59rn5+fLZ+fnwsAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAVAAAAKwAAAEkAAABuAAAAjlpanO8XELX/DQy6/xEN\r\n        uv8UD7L/FBC1/xAOvP8PDrj/Dw64/w8OuP8PDrj/Dw64/w8OuP8PDrj/Dw64/w4Qtf8ODrj/Dg64/xIN\r\n        tv8fFqP/W1mb/4KCiP+JgIP/hH+I/3h/iP9DRJT/Fw+v/w0Nuf8LELn/DQ68/w0Ps/8RDrj/EQ64/xEO\r\n        uP8RDrj/EQ64/xEOuP8RDrj/EQ64/wgMvv8QC7r/Hhed/1tclv98f4f/gYGB/4eAh/+HgYb/g4KG/3+A\r\n        hP+AgoP/g4WF/4SGhv+ChIT/gYOE/4GDhP+FgIH/hIF9/4WGhP94eoX/R0h0/xcXcf8LCZH/Dgqv/wkL\r\n        xP8QEKr/IRSg/2pyj/99gYL/gH97/4SAhf9+e4T/EhOf/xIQqv8TDbr/Egy9/w8Nuv8ODrb/Dg23/w8M\r\n        vP8PD7f/Dw+3/w8Pt/8PD7f/Dw+3/w8Pt/8PD7f/Dw+3/xEOuP+1tOn/////////////////////////\r\n        ////////////////////////////////////////////////////8////7v///+D////S////xP///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///9v////////////////////////////////\r\n        //////////////r6+v+ysrL/n5+f9p+fn9+fn5+pn5+fZ5+fnymfn58LAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAcAAAAVAAAAKwAAAEkAAABuAAAAjlhao+8QCb7/Dwy//xUUvv8TE7n/EhG7/xUS\r\n        vP8TErz/ExK8/xMSvP8TErz/ExK8/xMSvP8TErz/ExK8/xERu/8UEL3/FBO9/xAStv8bFbD/YGCg/4SI\r\n        if+KiIf/kYmK/36Eif9ERJ7/GxK2/xUSvP8UEr//FhO9/xQRu/8QEr7/ExO9/xYWvP8VEbb/GBK3/xsU\r\n        u/8VELn/GRO+/xUTuf8RD7z/Ghep/19env+HiIz/i4mJ/4eJif+Ghoz/hoiT/4aCq/+Ij6j/hpKc/4uT\r\n        oP+NkJ7/ioyW/4OMif+Fio3/lImF/5CMh/+AhYj/foOG/z47ef8ODYX/Eg+h/xQSsv8VFLf/GxOm/290\r\n        k/+JhYr/ioWG/4aFh/+BgIn/FBeo/xUUsP8WErj/FhK//xQSv/8VFL7/FBO9/xISvP8VD7z/FxS+/xIR\r\n        u/8REL7/FBLC/xMSwP8UE73/ERG3/xMSvP8+Psj/////////////////////////////////////////\r\n        ///////////////////////////////////////////////////////////////b////o////2////8z\r\n        ////A////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////j///////////////////////////////////////////\r\n        ///29vb/rq6u/p+fn/mfn5/en5+fqZ+fn1ufn58nn5+fCZ+fnwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAcAAAAVAAAAKwAAAEkAAABuAAAAjllapfARCr//EA3B/xcWwP8WFr7/FRS+/xgVv/8WFb//FhW//xYV\r\n        v/8WFb//FhW//xYVv/8WFb//FhW//xUVv/8ZFcL/FxbA/xMVuf8eGLP/ZGSk/4qOj/+Rj47/lZKO/4KO\r\n        kP9GSKD/Gxa1/xUVvf8UFL7/FRW//xYWwP8TEsD/ExLA/xYUwf8aFsP/GRbA/xgVv/8aF8H/FxS+/xkX\r\n        vf8VE8D/Hhut/2Rjo/+NjpL/kY+P/42Pj/+MjJL/eHS1/3pvz/+Cgtb/honT/42K2f+PitX/kYrT/46P\r\n        yf+Dh6r/k42S/5OOj/+Gi4n/jI6P/29wlv8WFoD/FhOf/xYUtP8YF7r/Hxeq/3R5mP+Pi5D/kYyN/4yL\r\n        jf+Hho//FRas/xcWtP8YE7z/FxLB/xcTwP8VFL7/FRS+/xUTwP8VFL7/FxbA/xYVv/8VFL7/FRPA/xQS\r\n        v/8WFb//Fha+/xYVv/8WFb//trbr////////////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////////////////////9////8P///+P\r\n        ////U////xv///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///5v/////////////////////////////////////////////9PT0/6io\r\n        qP6fn5/1n5+f2Z+fn6Ofn59dn5+fI5+fnwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAVAAAAKwAA\r\n        AEkAAABvAAAAjlxdrPUSC8D/EA/D/xoYxf8aGsL/GhnD/xwZw/8aGcP/GhnD/xoZw/8aGcP/GhnD/xoZ\r\n        w/8aGcP/GhnD/xkZw/8cGMX/GhnD/xYYvP8hG7b/aGio/5GVlv+YlpX/lpaW/4iTm/9GSqL/HBqw/xoZ\r\n        vP8WFrz/GRq+/xsbwf8dGsP/HxzG/xkXxP8aGcf/GRfH/xgXxf8cHMj/GBbD/xwawP8YFsP/IR6w/2hn\r\n        p/+TlJj/mJaW/5SWlv+Tk5n/U1G1/0lByv9RTdT/VlXT/1pV2v9fV9n/ZmDd/2lq2v9uccb/jIut/5KR\r\n        mv+UmZD/mZeW/4qPmP85Oor/GBSb/xgWtv8aGbz/Ihqt/3p/nv+Wkpf/mJOU/5OTk/+OjZb/Ghq0/xwa\r\n        uv8eGcL/HRnG/x0Zxv8aGcP/GxrE/xwax/8YG8T/FxrD/xoaxP8cHMT/GxrE/xoZw/8ZF8T/GRnF/xoZ\r\n        w/8aGcP/JyfH/4yM4f/x8fv/////////////////////////////////////////////////////////\r\n        ///////////////////////////////////////////////////////////////////////////////n\r\n        ////r////3P///8z////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wP///+r//////////////////////////////////////////////Dw8P+mpqb/n5+f9J+f\r\n        n9afn5+bn5+fWZ+fnyGfn58HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAWAAAAKwAAAEkAAABvAAAAjlxd\r\n        rfUTC8P/EhHF/x4cyf8eHsb/Hh3H/yAdx/8eHcf/Hh3H/x4dx/8eHcf/Hh3H/x4dx/8eHcf/Hh3H/x0d\r\n        x/8gHMn/HRzG/xocwP8kHrn/bGys/5ebnP+enJv/m5mf/46Vpv9LS5//Hxqf/xsapv8XFKX/Fxik/xYX\r\n        pf8aFqX/Hhut/xsZs/8cG77/Hh/H/xsbx/8bGsj/HRvL/x8dw/8cGsf/JCGz/2xrq/+am5//n52d/5qc\r\n        nP+ZmZ//RUm5/ysowf8qKcX/Ky3H/y8qy/8zL8v/PDnS/0FEz/9HS8//bmq8/5SUpP+fopn/oZ2c/5SY\r\n        k/9tcp//HRad/xkYtv8cHLz/Jh6x/4CFpP+dmZ7/n5qb/5qamv+UlJr/Gxy0/xwbuf8eGr//IBzB/x4d\r\n        wf8dHL//HRzA/x4cwv8cHsP/GxzE/xwbxf8hHsj/IB3G/yAgyP8eHcf/HR3J/x4dx/8eHcf/Hh3H/x4d\r\n        x/8yMcz/nJzm//j4/f//////////////////////////////////////////////////////////////\r\n        //////////////////////////////////////////////////////////////////////////////+z\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8D\r\n        ////w//////////////////////////////////////////////o6Oj/o6Oj/J+fn/Ofn5/Tn5+fm5+f\r\n        n06fn58fn5+fBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAWAAAALAAAAEoAAABwAAAAjlxdrfUSDcT/FBLJ/yEf\r\n        zP8iIsr/IiHL/yQgzf8iIcv/IiHL/yIhy/8iIcv/IiHL/yIhy/8iIcv/IiHL/yIizP8lIc7/IiHL/yAi\r\n        xv8pI77/cXGx/5+jpP+npaT/rKar/5qbqf9RTY7/HBl1/xUUcv8TEXH/Fxdx/xYXcv8XFnj/FxZ+/xka\r\n        jP8YGZn/Ghyq/yMiwP8kIcr/Ih/P/yQiyP8hH8z/Kie5/3Jxsf+io6f/qKam/6KkpP+hoaf/Rky9/yYh\r\n        wv8gH8n/IiLM/yIfz/8nIc7/KifR/yotzP8wM9X/Rj3D/5OWsv+opqX/qKSj/6impv+MlKX/Jhuh/x0c\r\n        uP8fH7//KiK1/4aLrP+loaf/qKOk/6Kjof+cnaH/HiCk/xwcpP8bGqb/HBun/x0dp/8dHaX/Ghym/xsc\r\n        qv8dHa3/IR+5/yEdw/8lIc7/Ih/J/yIiyv8iIsr/ISHL/yIhy/8iIcv/IiHL/yIhy/8iIcv/IiHL/y8u\r\n        zv9gX9n/kJDl/7298P/x8fz/////////////////////////////////////////////////////////\r\n        //////////////////////////////////////////////////////////////+f////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////C////8f/////\r\n        ////////////////////////////////////////5OTk/6CgoP2fn5/xn5+f0p+fn5afn59Sn5+fG5+f\r\n        nwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAcAAAAWAAAALAAAAEoAAABwAAAAj1xdr/UTDcb/FxXM/yUj0f8mJ8//JibS/ygk\r\n        0f8mJc//JiXP/yYlz/8mJc//JiXP/yYlz/8mJc//JiXP/yYm0P8qJtP/JiXP/yQmyv8sJsH/dXW1/6er\r\n        rP+vraz/s6+q/6alp/9wb5H/Sklz/0VGbP9FRGz/Rkhq/0RFa/82N2r/GRpS/xcXV/8aHGr/Gxt//yEg\r\n        nv8lI7n/KSXK/ycly/8lI9D/LSq8/3d2tv+pqq7/sK6u/6qsrP+pqa//S1G8/yomwv8oJc7/KSnR/yYk\r\n        0v8oJc//KSXS/ykqzv8mKtb/NyvR/4yOt/+trK7/rKqp/7Ovtf+boqX/Ny6n/yAguv8iI8H/Lia5/4yR\r\n        sv+sqK7/r6qr/6qrqf+lp6j/ICF8/xoZef8WFXX/FRVz/xYXcf8WF3H/FhZ0/xcWeP8ZF3v/IR+X/yAa\r\n        r/8pJcv/JyXS/yQkzv8mJs7/JibO/ycm0P8nJtD/JybQ/ycm0P8nJtD/JybQ/ycm0P8nJtD/JiXP/yUl\r\n        0f8pJs//Q0PW/3Nz4f+Xluj/0M/z//7+/v//////////////////////////////////////////////\r\n        //////////////////////////////////////////////+L////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///xf////X////////////////\r\n        /////////////////////////////9/f3/+goKD+n5+f8J+fn86fn5+Pn5+fS5+fnxmfn58EAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAcAAAAWAAAALAAAAEoAAABwAAAAj1xdsPUUDcj/GhjQ/ygn1f8rLNT/KirW/ysp1v8rKtT/KyrU/ysq\r\n        1P8rKtT/KyrU/ysq1P8rKtT/KyrU/yoq1P8uKtf/KinT/ygqzv8wKsX/enq6/6+ztP+4trX/urev/7m6\r\n        tv+rrLr/p6qy/62xsv+ysLb/sbCy/62stf+sq7v/qqq4/5qarP9qaoj/MzJq/xkZc/8gHpr/LCm7/yoo\r\n        zv8oJtP/MS7A/3x7u/+xsrb/ube3/7O1tf+xsbf/UFi9/zAuxP8tLM//LC7Q/ysr0f8uLdH/LCzU/ywu\r\n        0v8kKdL/NCzT/4GAuP+ztLj/sraw/7eyu/+tsLj/UU6x/yUlv/8nKMb/Myu+/5KXuP+0sLb/uLO0/7O0\r\n        sv+vsbL/UVB6/0xLd/9IR3P/R0dv/0lJbf9ISWv/SEdv/0pHdP9KTHX/QkCM/yEemf8oJcH/KyvV/ygq\r\n        1v8sK9X/LSrU/ysq1P8rKtT/KyrU/ysq1P8rKtT/KyrU/ysq1P8rKtT/KinT/yoq1v8uK9T/KSnT/yop\r\n        1/8KCcr/GBHG/6OjtP/Nzc3/4uLi//Ly8v/6+vr/////////////////////////////////////////\r\n        //////////////////////////////9/////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8X////5///////////////////////////\r\n        ///////////////////V1dX/n5+f/J+fn/Gfn5/Jn5+fip+fnz6fn58Un5+fAQAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAWAAAALAAA\r\n        AEsAAABwAAAAkF1esfUVDsn/HBrS/ysq2P8uL9f/Li7a/y4s2f8vLtj/Ly7Y/y8u2P8vLtj/Ly7Y/y8u\r\n        2P8vLtj/Ly7Y/y4u2P8yLtv/Li3X/ywu0v81L8r/gIDA/7a6u/+/vbz/wr+7/7+/v/+7u8f/u8C+/8HC\r\n        uf/Cvbz/wb24/8K8wf/Av7v/w8G5/8HAtv/BwcH/mZiy/0dGiP8eHoj/KSmr/y0r0f8rKdb/NTLE/4GA\r\n        wP+3uLz/wL6+/7q8vP+5ub//VVjE/zMuzf8vLNb/Li3X/y8t2v8zL9z/MCzf/y8u3P8qMdT/My7N/4N+\r\n        w/+6vL3/vMS6/7u6vv+2tsj/XmKx/ysrxf8tLsz/OTHE/5mev/+8uL7/wLu8/7y9u/+4urv/uLa8/7Wy\r\n        u/+0srj/tbS2/7W2tP+1tLD/tbK0/7ayuP+tsbL/hIWx/zk2nf8rKb7/LS7W/yst2f8xL9z/MizZ/y8u\r\n        2P8vLtj/Ly7Y/y8u2P8vLtj/Ly7Y/y8u2P8vLtj/Li7W/y0t2f8xLtf/LCzW/ywr2f8LCsz/GRLH/6Gg\r\n        tP+/v7//zMzM/9fX1//a2tr/3d3d/+Xl5f/s7Oz/9PT0//39/f//////////////////////////////\r\n        //////////////9f////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wP///+n////a////w////8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////J////+f/////////////////////////////////////\r\n        ////////z8/P/5+fn/yfn5/qn5+fv5+fn3Wfn581n5+fCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAWAAAALQAAAEsAAABxAAAAkFtb\r\n        t/UNCtH/GhzY/zYy3/86M9z/ODPc/zY32/82NNr/NjTa/zY02v82NNr/NjTa/zY02v82NNr/NjTa/zM0\r\n        3P84Mt3/NzXb/zM02P85OcP/hILI/8LCzv/Hx8f/yMPF/8bHw//Cws7/xsrF/8vGx//Mx8T/y8bD/8vG\r\n        x//JyMr/v8m9/8nCyf/RyMT/xMTK/6+yx/9BQIL/IyuW/zEvvv8zMs7/OzbH/4SDx//CxMz/xcXF/8TH\r\n        xf/CwcX/W17H/zkwzf80Mtj/MzXZ/zMz2f83Ntr/NDTc/zM02P81MtX/Nz3G/4N+yf/Dwsv/vMfF/8jJ\r\n        x//EwMz/XF/B/zI0z/8yNM//PDPD/5+hyv/FxsL/xsbG/8bGxv/KxsX/x8bK/8LBw//CwcP/xMTE/8PD\r\n        w//DwsT/wsHF/8C/w/+7wL//lZ6//z85wP8wLNn/MTPf/zMw5P83Ntn/NzPZ/zY02v82NNr/NjTa/zY0\r\n        2v82NNr/NjTa/zY02v82NNr/NDHa/zo03/83NdX/NTba/zcz2P8FBdv/CwzS/6Khq/+9vb3/y8vL/9bW\r\n        1v/Z2dn/2dnZ/9fX1//V1dX/1dXV/9PT0//Z2dn/+vr6//////////////////////////////////9X\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///3//////\r\n        //////////f///+n////P////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///zf////z/////////////////////////////////////////////8nJ\r\n        yf+fn5/7n5+f4p+fn6ifn59bn5+fGZ+fnwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAWAAAALQAAAEsAAABxAAAAkF9fv/kOC9L/HB7a/zk2\r\n        4P8+N97/PDfg/zo73/87Od//Oznf/zs53/87Od//Oznf/zs53/87Od//Oznf/zg43v87Nt//Ojje/zY3\r\n        2/89Pcf/iIbM/8fI0v/Mzcv/zs7I/8nQyf+5utb/ur7W/8DC2v/Gxtj/xcXX/8TG2P/Bv9X/xtLS/83O\r\n        zP/WzMz/0c/P/8TFz/+QkLj/MzCd/zIwv/81NND/PjnK/4iHyf/HydH/y8vL/8vOzP/JyMz/YmLM/0A4\r\n        0/89Od7/OTvd/zY23P88O9//Ojfg/zg32/84Ndj/NTfF/4qIyv/Ny9H/xs7N/9LRzf/Cwcr/Z2fT/zk7\r\n        1v84OtX/QjnJ/6ao0f/Mzcn/zczO/83Nzf/OzMz/zs7O/83OzP/Nzsr/zc7K/8vMyP/Ky8f/ysvH/8rL\r\n        yf/KydL/pKrP/1RP0P8/PN//OTvf/zk35f87O9v/PTjh/zo43v86ON7/Ojje/zo43v86ON7/Ojje/zo4\r\n        3v86ON7/OTbf/z454v87Otj/ODnd/zo22/8GBtz/DA3T/6OirP++vr7/y8vL/9bW1v/Z2dn/2NjY/9bW\r\n        1v/U1NT/09PT/9LS0v/Nzc3//f39//////////////////////////////////8/////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////L/////v/////////////////////\r\n        /////////9////93////G////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///87////+/////////////////////////////////////////39/f+9vb3/n5+f85+f\r\n        n9Gfn5+An5+fL5+fnwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAcAAAAWAAAALQAAAEwAAABxAAAAkV5gwvoOC9b/HyHd/z885f9EP+L/QT3i/0FA\r\n        4/9AP+P/QD/j/0A/4/9AP+P/QD/j/0A/4/9AP+P/QD/j/z0+4v9BPeP/QD/j/zw+4P9EQsr/jozS/87P\r\n        2f/V1tT/1tTT/8nO1/+cmOD/kZDm/5ic6/+cn+n/oaHv/6Gj6f+qqef/srvh/87S1//Z0tf/19fR/9TV\r\n        0f/HydT/Ukis/zY0w/84N9P/Qj7N/46Nz//P0tf/1NTU/9TX1f/S0dX/Y2fN/0I80f9BQN7/P0Lg/z49\r\n        4f9CP+L/QT3j/z8/3/9APt7/NzXE/5ORxf/Y1df/0dPU/9fW0v/R1Nn/aGbh/0JB3f8+QNv/Rz7O/6ut\r\n        1v/S1dP/1dTW/9TT1f/V0tT/wL3W/8bD3P/Kyd3/ycnb/8nJ2//Jydv/ycnb/8nJ2//Dv+P/o6Tg/2Vg\r\n        4f9OTOX/P0Pe/0A+5P8/QN7/QD3m/0A/4/9AP+P/QD/j/0A/4/9AP+P/QD/j/0A/4/9AP+P/Pz7i/0RA\r\n        5v9BQNz/Pj/j/z084P8HBt7/DQ3V/6Ohrf++vr7/y8vL/9XV1f/Y2Nj/19fX/9XV1f/S0tL/0tLS/9DQ\r\n        0P/Kysr///////////////////////////////////////8r////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8D////z///////////////////////////////////////////\r\n        ////+////7P///9T////A////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////U/////v////////////////////////////////////////29vb/oqKi+p+fn+afn5+in5+fU5+f\r\n        nxmfn58CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAcAAAAWAAAALQAAAEsAAABxAAAAkF5fw/oPDNj/IiTh/0RC6P9LRuX/RkPm/0ZG5v9GQ+b/RkPm/0ZD\r\n        5v9GQ+b/RkPm/0ZD5v9GQ+b/RkPm/0VF5f9IQ+b/R0Tn/0BD4v9JR8//lJPX/9XW4P/d3tz/4uDf/83T\r\n        5v+Be+b/aGPu/21v8/9wcfH/d3P6/3l69P+Bfuz/gYXk/7W24v/b2d//3N3Z/97f1v/Z29v/gHfI/zw7\r\n        x/8+Ptj/R0PS/5ST1f/W2d7/3Nzc/9zf3f/Z2Nz/am/V/0RB0/9CRN7/Q0ni/0JE5v9GROT/REHk/0RE\r\n        3v84OMz/Qz7B/66u0v/g29z/3tvd/93c2P/M0t3/VVHY/0hI4v9ERN7/S0LS/7Cy2//Y29n/3Nvf/9na\r\n        3v/a1tv/jYbh/5mS7f+hm/L/op3y/6Sg8v+kofH/op/v/6Of8f+bluv/h4Xp/2Fg7P9OUen/RUfi/0dE\r\n        5/9FROD/R0Pp/0dE5/9HROf/R0Tn/0dE5/9HROf/R0Tn/0dE5/9HROf/R0Tn/0lG6f9GRuD/Q0Xn/0JB\r\n        5f8IB9//Dg7W/6Ghr/++vr7/y8vL/9XV1f/X19f/1tbW/9TU1P/R0dH/0NDQ/87Ozv/Q0ND/////////\r\n        //////////////////////////////8f////AP///wD///8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///+D////////////////////////////////////////////////////////////////\r\n        ////5////4v///8n////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///2P/////\r\n        ////////////////////////////////////////ycnJ/p+fn++fn5+0n5+faJ+fnyKfn58EAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAWAAAALAAA\r\n        AEoAAABwAAAAj19fxfoPC9n/JCbj/0lI7P9QTOf/TEjn/0xL6f9MS+n/TEvp/0xL6f9MS+n/TEvp/0xL\r\n        6f9MS+n/TEvp/0pM5/9NSOn/TEvp/0VI5v9NTNL/mZja/9vd5f/j5OL/5ejZ/9Lb5f91cN3/UE3f/1JV\r\n        5v9VVub/WFbv/1pc5v9iXOn/Xlvn/42H3v/d4uX/3+Pk/+Hi3v/e3uT/l5bU/0ZF0f9FRd//TEnV/5mY\r\n        2v/c3+T/4uLi/+Hk4v/f3uL/b3Lf/0tG3f9ISuT/SE3m/0pK6v9QS+z/Skbl/0RE1v9BQb3/RECn/8XF\r\n        3f/n4uP/5OHj/+Tl4//Dxef/V1Tg/09Q6P9KS+P/UEjV/7a44f/f4uD/4+Lm/9/g5P/e3eH/YGHh/2xu\r\n        6/90dvL/dXjy/3d78v92evD/dHju/3N37v9wbO3/ZGTu/1ZY8v9NUez/Skrq/09K6/9PS+b/T0rt/0xL\r\n        6f9MS+n/TEvp/0xL6f9MS+n/TEvp/0xL6f9MS+n/S0ro/09K6/9NS+T/SUzr/0ZF6P8IB9//DA7Y/6Kh\r\n        sf++vr7/ysrK/9TU1P/W1tb/1tbW/9PT0//Q0ND/z8/P/8zMzP/Pz8//////////////////////////\r\n        //////////////8D////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///zf////7\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////w////1////8H////AP///wD///8A////AP///wD///8A////AP///wD///9v////////////////\r\n        ////////////////////////9vb2/6KiovGfn5+3n5+fbJ+fnyOfn58EAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAVAAAAKwAAAEgAAABtAAAAjV5g\r\n        yPoQCt3/Jifn/01M7/9VU+j/UU/p/1FQ7P9RUev/UVHr/1FR6/9RUev/UVHr/1FR6/9RUev/UVHr/1FR\r\n        6/9UUOz/U1Ds/0xO6f9SUdb/nZze/+Hj6//p6ub/6erg/9rh8P96ddj/T0zR/1BP2/9PT9n/UEzb/05N\r\n        0v9PSs//Qj7F/310zv/f5OX/4+fs/+Tm5v/c3ev/nZ3d/1JS3P9OT+f/Uk/b/52d3f/h5On/6Ojo/+fp\r\n        6f/j4ub/b2/Z/09I2f9NTd3/TE7c/05K3/9RTN3/SEPO/zw8uP84OJL/bGyo/93d6//s6ur/6Ojo/+Lk\r\n        5f+zsvL/Yl/r/1dW7P9PUOb/VE3Y/7u95f/l6eT/5+nq/+Xm6v/j4ub/TUrj/1FP5f9UUuf/VVTm/1ZW\r\n        5v9WVub/VVXl/1VU5v9ZV9//UlLi/1FT5/9OT+X/Uk7t/1VQ7/9UUer/U1Ds/1FR6/9RUev/UVHr/1FR\r\n        6/9RUev/UVHr/1FR6/9RUev/UFDq/1RR7f9SUef/TlHw/0xL7v8JCOL/Dg/b/6Kgs/++vr7/ysrK/9TU\r\n        1P/W1tb/1dXV/9PT0//Pz8//zc3N/8vLy//T09P///////////////////////////////////v///8A\r\n        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////B////9f/////////////////////\r\n        ///////////////////////////////////////////////////////////////////////////////z\r\n        ////l////zP///8A////AP///wD///8A////AP///wD///8A////k///////////////////////////\r\n        /////////////8rKyvWfn5+wn5+fYZ+fnx+fn58DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAATAAAAKAAAAEQAAABoAAAAiGBhy/oSDOH/Jyrq/1JS\r\n        8v9aWev/VlTt/1dX8f9YVu//WFbv/1hW7/9YVu//WFbv/1hW7/9YVu//WFbv/1dY7v9aVvH/WVfx/1FT\r\n        7f9XV9n/oqLi/+bo8P/v8Oz/7+zu/+Pk+P97dcb/R0Wp/0Q/sv9DP7D/Pzyp/zw7ov81NJL/PkKT/6Ch\r\n        zf/o5+v/6+zw/+7y7f/k5vH/oJvw/15e6P9WV+//V1Tg/6Ki4v/m6e7/7e3t/+zu7v/p6Oz/dHPD/0lC\r\n        tf9BQrL/QESt/z8+rP8+OqP/NzaU/zM3hf85OnT/ur7Q//Hw+f/s7Oz/7/Lw/+To7f+ck/T/Z2ju/1xc\r\n        7v9WVuj/WVHa/8DD6f/r7+n/7O7v/+nr7P/o5+n/Ske7/0RBtP9BP7D/Q0Gy/0NCsP9DQbL/Q0Gy/0RB\r\n        tP9FQ63/QEC2/0VJv/9KS8v/V1Hm/1lU7f9YWOz/U1bu/1hW7/9YVu//WFbv/1hW7/9YVu//WFbv/1hW\r\n        7/9YVu//WFft/1lX8f9XV+v/VVb0/1FQ8/8ICeP/Dw/d/6Oitv+/v7//y8vL/9TU1P/W1tb/1dXV/9LS\r\n        0v/Ozs7/zMzM/8fHx//T09P//////////////////////////////////9////8A////AP///wD///8A\r\n        ////AP///wD///8A////AP///wD///8A////i///////////////////////////////////////////\r\n        ///////////////////////////////////////////////////////////////////////////////T\r\n        ////b////xP///8A////AP///wD///8A////B////+f//////////////////////////////////9TU\r\n        1PWfn5+jn5+fUZ+fnxifn58CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAQAAAAQAAAAIwAAAD4AAABhAAAAgmVm0/4UDuP/Ki3t/1ZX9f9eXu7/Wlnv/1tb\r\n        9f9cW/H/XFvx/1xb8f9cW/H/XFvx/1xb8f9cW/H/XFvx/1tc8v9eW/T/XVv0/1VY8P9aWtz/pqbm/+nr\r\n        8//y8+//+PTz/+bo8v90dKr/Nzp3/y0sfP8vLnj/Kixt/yYrav8sLGj/ZG+N/+Hp6P/58fj/8/Dy//H0\r\n        6//r7/T/lInx/2Vl7f9cXfX/W1jk/6Wl5f/q7fL/8fHx//Dy8v/t6/H/dXWl/zs1h/8nLHf/KjF2/yos\r\n        c/8pKWn/LS9l/ztEZf+pqtD/7vbs/+3s8P/09vb/6/Du/9zk6/+IfPL/bG7w/2Fi8v9aW+v/Xlfe/8XJ\r\n        7P/v8+3/8PLy/+zw8f/s6+3/Q0KG/zc2ev8wL3H/MTBy/zEwcv8vLnD/MC9z/y8tc/8vLnb/LiyF/zc7\r\n        lP9ERLD/WlHe/11X6v9bXu//VVzz/1xb8f9cW/H/XFvx/1xb8f9cW/H/XFvx/1xb8f9cW/H/XFvx/11b\r\n        9P9bW+3/WVr4/1RT9v8JCuT/ERHf/6Sjt//AwMD/zMzM/9TU1P/W1tb/1dXV/9HR0f/Nzc3/y8vL/8bG\r\n        xv/X19f//////////////////////////////////8////8A////AP///wD///8A////AP///wD///8A\r\n        ////AP///wD///83////+/////////////////////////////////////////z8/P//////////////\r\n        //////////////////////////////////////////////////////////////////////////f///+n\r\n        ////R////wD///8A////AP///9f//////////////////////////////////8PDw+ufn5+Sn5+fPp+f\r\n        nxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAMAAAANAAAAHgAAADcAAABXAAAAeGtp2v8YCe3/LjDz/1pi6/9iY+n/Z2H8/15k6/9jZPL/Y2Ty/2Nk\r\n        8v9jZPL/Y2Ty/2Nk8v9jZPL/Y2Ty/2Rj7/9iYPb/X2Px/19h7/9lYOX/pajl/+zx8v/58/j/8vT8/+Tl\r\n        7/+8vMr/mJen/5GPov+Ni57/jo2d/5ycqv/LytT/8fDs//jz8P/78/r/+Pnw/+767v/T1v//jHv0/29x\r\n        9f9hYPL/YmHf/6ap5v/s7vb/+/bz//f09v/t8vX/sq/I/5yZsv+Ni6H/j42h/5KRof+em6r/wb/L/+jm\r\n        8v/17vX/9/Py//X17//2+Pn/4OP//62u8v+CgPH/cm/6/2Rn8f9jYOz/Z1/c/8LG7//w8/f/+fT2//Xx\r\n        9v/x8u7/mJas/5ORp/+PjaP/joyi/46Mov+Ni6H/jYuh/46Mov+QjaP/kZGh/5OWtf9XV6P/UlDL/15f\r\n        7f9gYvD/YmTu/2Jj8f9iY/H/YmPx/2Jj8f9iY/H/YmPx/2Jj8f9iY/H/XGTz/2xj8/9lZ+v/X2Xs/1lb\r\n        9f8GAvX/GA/s/6ius//ExMT/zMzM/9PT0//T09P/0dHR/9DQ0P/MzMz/yMjI/8TExP/b29v/////////\r\n        /////////////////////////7////8A////AP///wD///8A////AP///wD///8A////AP///wf////X\r\n        ////////////////////////////////////////5ubm/7+/v//c3Nz/8/Pz////////////////////\r\n        /////////////////////////////////////////////////////////////////////////9////+T\r\n        ////o////////////////////////////////////////7e3t86fn59zn5+fJ5+fnwkAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAFwAA\r\n        AC0AAABKAAAAa25w3P8TCe//LzHz/2Ro9v9rZ+//a2r2/2Zn9/9oafX/aGn1/2hp9f9oafX/aGn1/2hp\r\n        9f9oafX/aGn1/2pq9P9oZ/n/Zmn0/2Rl8f9sZ+j/ra7q/+/09f/69ff/9ff3//f5+v/x8vb/7ez1//Lx\r\n        +v/y8fr/7+/1//Hx9//y8vL/+/n4//z3+P/48/T/+Pz3/+fw+f+3uPT/jYP1/3V3+f9pZ/b/a2nk/62x\r\n        7P/w8vr//vr1//r49//y9/b/8/T+/+3u+P/u7fb/8PD2//Dx9f/w7/P/9PP1//z7/f/49fH/+/r2//n7\r\n        +//t8P7/yMz1/5qb6/9+ffH/dHH8/2ps9v9oZfD/cmni/8jO8//0+Pn//Pf4//v29//3+fP/9Pb3//Hz\r\n        9P/v8fL/7/Hy/+/x8v/v8fL/7/Hy//Dy8//w8Pb/7fD0/9nd9f+AgMb/YF7V/2Zl8f9oafX/Zmjy/2hp\r\n        9f9oafX/aGn1/2hp9f9oafX/aGn1/2hp9f9oafX/Ymn2/25m+f9mZ+3/a2z6/19j8v8HCPL/Egvo/6mv\r\n        uv/Gxsb/zc3N/9PT0//T09P/0dHR/9DQ0P/MzMz/yMjI/8TExP/e3t7/////////////////////////\r\n        /////////6f///8A////AP///wD///8A////AP///wD///8A////AP///4v/////////////////////\r\n        ///////////////////4+Pj/vb29/8nJyf/Hx8f/wsLC/8vLy//l5eX/+Pj4////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        /////////////////////////////6amppKfn59Jn5+fE5+fnwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAEQAAACMAAAA9AAAAW3N2\r\n        4f0KCen/Mjf4/2po/f95c/r/b27z/21u/P9vb/f/b2/3/29v9/9vb/f/b2/3/29v9/9vb/f/b2/3/3Fw\r\n        9f9wb/v/bXD3/25v9f97du//uLn1//L5/P/9+vz/+Pr0//n69v/6+/n/+/v7//v7+//8/Pz/+/v7//j5\r\n        9//7/ff/+Pf7//z6///2+Pj/8Pb9/9HU//+cnPD/i4j2/3h69/9wbvb/d3bq/7e49P/z9f////35//38\r\n        +P/3/fj/+Pz3//n9+P/7/Pj/+/z4//z9+f/9/vr/+fv1//X38f/+//v/9/n6/+vt///S1Pz/qq3x/4yN\r\n        7/+Afvn/dXL9/29v9/9xbvP/fnfq/87U9//2+f3/+/n5//v5+f/5/ff/+vr6//n5+f/5+fn/+vr6//v7\r\n        +//6+vr/+vr6//r6+v/4+/L//f/7/+3x//+Yl9n/cW7h/25u9v9ucPr/bm72/29v9/9vb/f/b2/3/29v\r\n        9/9vb/f/b2/3/29v9/9vb/f/a2/2/3Nt//9vcPb/dnD9/2Ro7/8ECu3/EArr/6+zxf/Kysr/z8/P/9TU\r\n        1P/T09P/0dHR/9DQ0P/MzMz/yMjI/8TExP/j4+P//////////////////////////////////5v///8A\r\n        ////AP///wD///8A////AP///wD///8A////N/////v/////////////////////////////////////\r\n        ///Pz8//wcHB/8jIyP/Kysr/xsbG/8TExP+4uLj/uLi4rP///1H///+z////+///////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////////9fX165+fn0afn58bn5+fBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACwAAABkAAAAuAAAASXR43O8JC+z/Ky/6/29t\r\n        //9/evv/dXP1/3V4+P92dvj/dnb4/3Z2+P92dvj/dnb4/3Z2+P92dvj/dnb4/3V38/90dvr/dHb4/3t6\r\n        +v+Lhvn/vr/8/+3y///49///+vz9//f4/P/3+Pz/9vf7//X1+//29vz/+fn///j4/v/4+///9fP///Tz\r\n        ///o7P7/z9P2/66u+v+Tkfv/hIT4/3x8+P99efr/iof0/76+/v/t7///+fn///j5/f/1+v3/+vz9//j6\r\n        +//3+fr/9vf7//f4/P/5+v7/+fn///j4/v/z8///4eL8/8nM+f+vsfj/lJb1/4eH+f+Af/3/d3T5/3d2\r\n        +/9/ffn/j4n4/8/W/f/y9f//9vX+//f2///2+f3/+Pr6//j6+v/4+vr/+fv7//n7+//4+vr/+Pr6//j6\r\n        +v/39/f/+Pr7/+zt//+sqfH/hYP0/3h4+v9zdfn/d3b7/3Z2+P92dvj/dnb4/3Z2+P92dvj/dnb4/3Z2\r\n        +P92dvj/dnj1/3Zz/v93dvz/eHXz/2Bj9P8CBu7/GxL1/7W5y//Nzc3/0dHR/9TU1P/T09P/0dHR/8/P\r\n        z//MzMz/yMjI/8TExP/m5ub//////////////////////////////////3////8A////AP///wD///8A\r\n        ////AP///wD///8H////1////////////////////////////////////////+Tk5P+8vLz/ysrK/8rK\r\n        yv/Gxsb/w8PD/8LCwv+1tbW36urqBgAAAAAAAAAA////F////3f////X////////////////////////\r\n        ///////////////////////////////////////////////////////////////////+/v790dHRcZ+f\r\n        nxqfn58GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAABAAAABwAAABEAAAAhAAAAN32EzMYPBvf/GBf2/3F2//98fPL/gYD4/3x/\r\n        +f99ffn/fX35/319+f99ffn/fX35/319+f99ffn/fX35/36A9v97ffr/enz4/4WE/P+Sj/3/trX9/9TX\r\n        /f/e3vz/4d/8/+Lg/f/j4f7/5OL//+Ti///j4f7/4+H+/+Ph///d3P7/1tX8/87N9//Cw/X/qqzy/5iX\r\n        +f+Pjf//gIH7/4GA+P+GhPz/k5H7/7e2///V1v//39/9/9/g+v/e4Pj/4+L8/+Ph/v/j4f7/4+H//+Lf\r\n        ///f3v7/3Nv9/9nY+v/OzPr/wb/6/62t+/+YmPz/ior8/4KD/f9+fvr/fH33/4B8/f+Ghvz/lJH+/8DG\r\n        +//a3P7/4d/9/+Hh///e4vv/4uH7/+Lh+//j4vz/4uH7/+Lh+//h4Pr/4eD6/+Hg+v/k4f//3t78/9XS\r\n        //+qp/z/jov+/36A/P95e/f/f4D6/319+f99ffn/fX35/319+f99ffn/fX35/319+f99ffn/fYHy/3t6\r\n        +P96ePr/fIDw/09O/P8FBfP/LiTz/7zAy//Q0ND/09PT/9TU1P/S0tL/0dHR/8/Pz//MzMz/yMjI/8TE\r\n        xP/t7e3//////////////////////////////////3P///8A////AP///wD///8A////AP///wD///+L\r\n        ////////////////////////////////////////9vb2/76+vv/FxcX/y8vL/83Nzf/Hx8f/wsLC/7S0\r\n        tMDm5uYJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////N////5v////z////////////////////////\r\n        ///////////////////////////////////////////////////t7e2nn5+fFp+fnwMAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAABAAAABAAAAAoAAAAWAAAAJo6WuowZBvX/DQn1/1pn+f+Eh/r/ior0/4B///+EhPr/hIT6/4SE\r\n        +v+EhPr/hIT6/4SE+v+EhPr/hIT6/4WG+P+Eg/v/g4L6/4qJ/f+TkP3/o6T8/7O0+P+8vPj/vLv5/7y7\r\n        +f+8vPj/u7v3/7y8+P+7u/f/urn3/7y7+f++vP7/t7b4/7Gw+P+lpvf/nJv7/5OS//+Hhv7/goP9/4OD\r\n        +f+Jifv/k5H7/6Si+/+zsvr/urv4/72++P+9vvj/vbz6/7++/P++vfv/vLv7/727/f++vP7/urn9/7Sz\r\n        9/+qqPr/pKL8/5mW/f+Li/3/h4b+/4WE/P+Cgvj/hYX5/4WD+/+Ki/v/kY///6is8/+4t/f/vbr4/76+\r\n        +v+6vvj/vbr//767//++u///vbr//726//+9uv//vbr//726//+7t/7/t7b2/7Ow+P+dm/v/jo3//4aI\r\n        /v+Dg/f/hoP3/4SE+v+EhPr/hIT6/4SE+v+EhPr/hIT6/4SE+v+EhPr/goXx/4eF/f+Dgf3/e4X7/zEs\r\n        /f8JBPP/S0fi/8bJzv/S0tL/09PT/9PT0//S0tL/0NDQ/87Ozv/Ly8v/x8fH/8TExP/u7u7/////////\r\n        /////////////////////////1////8A////AP///wD///8A////AP///zf////7////////////////\r\n        ////////////////////////y8vL/8bGxv/Ly8v/ysrK/8rKyv/FxcX/tbW1yerq6g8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8L////X////8P/////////////////////////////\r\n        //////////////////////////////n5+baurq4Un5+fAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA\r\n        AAUAAAAMAAAAGD9DSDVJPfH2DQf6/y849P+AhP//joz2/4WE//+Kivz/ior8/4qK/P+Kivz/ior8/4qK\r\n        /P+Kivz/ior8/4qL+/+Kif3/iYj8/4yN/f+Rkf3/mJf+/5ya+v+jofv/o6P//6Gi/f+hovz/oqP9/6Kk\r\n        /P+hovz/oaL9/6Gh//+hovr/np37/5mZ/f+Qkfn/jpD8/42N//+Hh/n/jI39/4qK/v+OjP3/lJL8/5iU\r\n        /f+cm/3/oKH8/6Oj/f+lov7/oqL8/6Oj/f+jov7/oKH8/6Gh//+iov//nqD+/5qc+v+XmP//k5P9/42O\r\n        /P+Jifv/ion9/4uL/f+Jivr/jI39/4yN/f+OkPz/kI7//5ea9f+gnPv/o576/6Ki/P+eovv/oqP5/6Kj\r\n        +f+io/n/oaL4/6Kj+f+jpPr/oqP5/6Gi+P+iof//oaH7/5yd9/+Ulf3/jI3//4mN/f+Mi/n/kIr7/4qK\r\n        /P+Kivz/ior8/4qK/P+Kivz/ior8/4qK/P+Kivz/iIv4/5GK//+Lif//YWn8/xIO+v8UD/T/f4jY/9DN\r\n        1v/T09P/09PT/9LS0v/R0dH/0NDQ/87Ozv/Kysr/x8fH/8PDw//39/f/////////////////////////\r\n        /////////0f///8A////AP///wD///8A////C////9//////////////////////////////////////\r\n        ///i4uL/vr6+/8jIyP/Nzc3/yMjI/8LCwv+7u7vS2traFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8n////h////+f/////////////////////////////\r\n        ///////k+fn5VJ+fnwWfn58CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAGAAAADQAA\r\n        ABd+gOWjCQb2/xAO+v9tcPb/kYv//4yP//+PkP//j5D//4+Q//+PkP//j5D//4+Q//+PkP//j5D//5CO\r\n        //+Rkf//jo7//4+Q/v+Pkf3/lJL//5GP//+Wk///kZP//42P//+Okf3/kJT9/46S+/+Okf3/kJP//46R\r\n        /v+Slff/k5H//4+N//+Pkf//jpH+/4+P//+Tkv//kZP3/46P//+Qj/3/lJH+/5OP//+Rjv//kJH//5KR\r\n        //+UkP//kpX+/5CT/P+Qk/z/kZP//4+S/v+NkPz/jpH9/46U//+MkP//i4///5CS//+PkP7/kZD+/5OS\r\n        //+Qj/3/jo/9/5CQ/P+Okfr/kI7//5GR+/+Xkf//lpD//5KR//+Pkv//kJL+/5GT//+Rk///kJL+/5CS\r\n        /v+Rk///kJL+/4+R/f+Qkf//kJT6/5CT9f+QlP3/i4///4yP/P+Sj/z/mJH//4+Q//+PkP//j5D//4+Q\r\n        //+PkP//j5D//4+Q//+PkP//j5D//5GH//+Kivz/O0Hu/wMC/P8nIvr/rsTd/9XO2//T09P/09PT/9LS\r\n        0v/R0dH/0NDQ/87Ozv/Kysr/xsbG/8PDw//5+fn//////////////////////////////////z////8A\r\n        ////AP///wD///8A////k/////////////////////////////////////////b29v+/v7//xcXF/8vL\r\n        y//Nzc3/xsbG/8DAwNvV1dUZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wP///8v////a////5////+T////b////0f///8PAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAABgAAAAxrbHkmRUD35woG\r\n        //8gGPn/dn///4mY//+Zmvz/mJb//5aS//+Vlf//lpz7/5Wd9/+SmPv/k5b//5aW//+Vlf//lZX//5WV\r\n        //+Vlf//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW\r\n        //+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW\r\n        //+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5aW\r\n        //+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lZX//5WV//+Wlv//lpb//5aW//+Wlv//lpb//5aW\r\n        //+Wlv//lpb//5aW//+Wlv//lpb//5aW//+Wlv//lpb//5mW//+YmPz/mJr4/5qZ+/+alf//m5P//5uW\r\n        //+cm/n/kZf//4GO+P9GSP//BAD9/xgW8v99heL/zNHU/+HT2f/U1NT/09PT/9LS0v/R0dH/0NDQ/83N\r\n        zf/Jycn/xsbG/8LCwv///////////////////////////////////////x////8A////AP///wD///8/\r\n        /////////////////////////////////////////////8vLy//ExMT/ycnJ/87Ozv/BwcH/xMTE5NjY\r\n        2B8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAUAAAAKsbTeVjMs8fwDCfz/Ewv//2Fa\r\n        //+RkP7/mZv//5ug+/+anfj/nZz+/6Gd//+hnf//oJ3//5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f\r\n        /f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f\r\n        /f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f\r\n        /f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/6Cg/v+goP7/oKD+/6Cg\r\n        /v+goP7/oKD+/6Cg/v+goP7/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f/f+fn/3/n5/9/5+f\r\n        /f+fn/3/n5/9/5+f/f+fn/3/n5/9/5yh9v+eoP7/np3//5uc//+anf//mJ79/5ed/v+Umf//c3T//yYg\r\n        //8DAP7/Fwz2/2pj6f/Dydz/1dnU/9PX0v/U1NT/09PT/9LS0v/Q0ND/z8/P/8zMzP/IyMj/xcXF/8TE\r\n        xP///////////////////////////////////////xf///8A////AP///wv////f////////////////\r\n        ////////////////////////4uLi/7+/v//Jycn/y8vL/8PDw//Ly8vq1tbWJQAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAADAAAABrO48GwzMPf8Dgv1/xgE//8wJff/UU3//3R5\r\n        //+Jkf//lJb//5yX//+imP//pZr//56b/v+em/7/npv+/56b/v+em/7/n5z//5+c//+em/7/npv+/56b\r\n        /v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b\r\n        /v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b\r\n        /v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b\r\n        /v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b/v+em/7/npv+/56b\r\n        /v+em/7/npv+/56d+/+dm///mpn//5ia//+Ul///hoT//2pe/v9QPfj/EAX//woH9v8hF/f/enbn/8XJ\r\n        2//R1Nj/09fR/9PR0f/T09P/0tLS/9HR0f/Pz8//zc3N/8rKyv/Hx8f/xcXF/8jIyP//////////////\r\n        /////////////////////////wD///8A////AP///5P/////////////////////////////////////\r\n        ///29vb/vr6+/8fHx//Jycn/x8fH/8bGxu3X19cuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAALQ0/RFcGr+5RoX7/8PDPz/Cwf6/woF+/8KB/3/CQn9/wgK\r\n        +P8GC/T/Bw30/wQI+/8FCfz/BQn8/wQI+/8DB/r/BQn8/wYK/f8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ\r\n        /P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ\r\n        /P8FCfz/BQn8/wUJ/P8FCfz/Bgr9/wYK/f8GCv3/Bgr9/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ\r\n        /P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wQI+/8ECPv/BAj7/wQI+/8ECPv/BAj7/wQI+/8ECPv/BQn8/wUJ\r\n        /P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/wUJ/P8FCfz/BQn8/woF\r\n        //8JB///CQj+/wcJ+/8HCfv/Bgr9/wQK/f8CCPv/Dw3z/z496/+dpt//z9PY/9PS1v/Q19L/zs3W/93V\r\n        3P/T09P/0tLS/9DQ0P/Ozs7/zMzM/8nJyf/Gxsb/xMTE/8LCwv//////////////////////////////\r\n        /////////yP///8A////U//////////////////////////////////////////////Kysr/xMTE/8rK\r\n        yv/IyMj/x8fH89ra2jcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA8vP/D7/K/WpsdP/PTEz8/ywj9v8dD/v/FQz9/xEM+/8ODff/DQ74/w8K\r\n        //8QC///Eg3//w4J/v8LBvv/Dwr//xEM//8LBvv/Dgn+/w4J/v8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w4J\r\n        /v8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w4J\r\n        /v8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w4J/v8OCf7/DQj9/w0I/f8PCv//Dwr//w8K//8PCv//Dwr//w8K\r\n        //8PCv//Dwr//w8K//8PCv//Dwr//w8K//8PCv//Dwr//w8K//8PCv//Dwr//w8K//8PCv//Dwr//w8K\r\n        //8OCf7/Dgn+/w4J/v8PCv//Dwr//w8K//8OCf7/Dgn+/w4J/v8OCf7/Dgn+/w8I/f8RC/z/Ew38/xAJ\r\n        +v8RCPj/Gxb1/y0x9P8/S/f/h4vq/7XB3f/Q19r/09TY/9jT1P/Y0tP/1NLR/8rR1P/S0tL/0dHR/8/P\r\n        z//Nzc3/y8vL/8jIyP/FxcX/wsLC/729vf/+/v7//////////////////////////////////9f///+n\r\n        ////+////////////////////////////////////////97e3v/AwMD/yMjI/8jIyP/MzMz21NTUQAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrz/yHr8v8z6/L/M+7z/zPl6fU1xsbSPpqcpk12d39hV1hefUJD\r\n        SJl7fYfPztHg/+Dj8v/f4vH/1Nfm/9TX5v/U1+b/1Nfm/9TX5v/U1+b/1Nfm/9TX5v/U1+b/1Nfm/9TX\r\n        5v/U1+b/1Nfm/9TX5v/U1+b/1Nfm/9PW5f/T1uX/09bl/9PW5f/T1uX/09bl/9PW5f/T1uX/0tXk/9LV\r\n        5P/S1eT/0tXk/9LV5P/R1OP/0dTj/9HU4//P0uH/z9Lh/8/S4f/P0uH/z9Lh/8/S4f/P0uH/z9Lh/87R\r\n        4P/O0eD/ztHg/87R4P/O0eD/ztHg/87R4P/O0eD/zdDf/83Q3//Mz97/zM/e/8zP3v/Mz97/zM/e/8vO\r\n        3f/Lzt3/y87d/8vO3f/Lzt3/y87d/8rN3P/Kzdz/ys3c/8TP1//Dztb/xc7X/8rQ2//Nzd3/y8nc/87K\r\n        3f/Qzd3/1NnY/9nT2P/a1tX/09fR/9PT0//c19T/2drR/8bP0v/R0dH/0NDQ/87Ozv/MzMz/ysrK/8bG\r\n        xv/Dw8P/wMDA/7u7u//x8fH/////////////////////////////////////////////////////////\r\n        ////////////////////////9fX1/76+vv/FxcX/xsbG/8nJyfnX19dMAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9sbWvE3d7c//Hy\r\n        8P/r7Or/4uPh/+Lj4f/i4+H/4uPh/+Lj4f/i4+H/4uPh/+Lj4f/h4uD/4eLg/+Hi4P/h4uD/4eLg/+Hi\r\n        4P/h4uD/4eLg/+Dh3//g4d//4OHf/+Dh3//g4d//4OHf/+Dh3//g4d//4OHf/+Dh3//g4d//4OHf/9/g\r\n        3v/f4N7/3+De/9/g3v/f4N7/3+De/9/g3v/f4N7/3+De/9/g3v/f4N7/3+De/93e3P/d3tz/3d7c/93e\r\n        3P/d3tz/3d7c/93e3P/d3tz/29za/9vc2v/b3Nr/29za/9rb2f/a29n/2tvZ/9rb2f/Z2tj/2drY/9na\r\n        2P/Y2df/2NnX/9jZ1//Y2df/2NnX/9Xa2f/T19j/0tXZ/9TW1//U19X/1tfT/9fY1v/b2Nr/1dLU/9zT\r\n        1v/e1dL/1tfO/9Hbzv/N09L/zcnU/9nW0v/Pz8//zs7O/83Nzf/Ly8v/ycnJ/8XFxf/BwcH/vr6+/7i4\r\n        uP/R0dH/////////////////////////////////////////////////////////////////////////\r\n        ////////y8vL/8XFxf/Hx8f/ysrK/NbW1lUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9qamrE3d3d//Pz8//q6ur/4uLi/+Li\r\n        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Dg\r\n        4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4eHh/+Dg4P/g4OD/4ODg/+Dg4P/f39//39/f/9/f\r\n        3//d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc\r\n        3P/c3Nz/29vb/9vb2//a2tr/2tra/9ra2v/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9jY\r\n        2P/X19f/19fX/9vW1//b1tj/29Xa/9nW2P/Y1tb/1dbU/9TV0f/T1c//1tnQ/9XZ1P/T0df/1s7Z/9DR\r\n        2//K1NT/0dbN/9vOzP/Ozs7/zc3N/8zMzP/Kysr/yMjI/8TExP/AwMD/vb29/7a2tv+0tLT/9PT0////\r\n        ///////////////////////////////////////////////////////////////////j4+P/xMTE/8fH\r\n        x//Hx8f80dHRXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9ra2vE3d3d//Dw8P/q6ur/4uLi/+Li4v/h4eH/4eHh/+Hh\r\n        4f/h4eH/4eHh/+Hh4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg\r\n        4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/f39//39/f/9/f3//f39//3t7e/97e3v/e3t7/3t7e/93d\r\n        3f/d3d3/3d3d/93d3f/d3d3/3d3d/9zc3P/c3Nz/3Nzc/9zc3P/b29v/29vb/9vb2//b29v/2tra/9ra\r\n        2v/a2tr/2tra/9ra2v/a2tr/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9fX\r\n        1//X19f/19fX/9bW1v/W1tb/1tbW/9XV1f/V1dX/1dXV/9TU1P/T09P/09PT/9PT0//S0tL/0dHR/9DQ\r\n        0P/Pz8//zc3N/8rKyv/IyMj/xcXF/8HBwf+9vb3/urq6/7S0tP+xsbH/xMTE//z8/P//////////////\r\n        /////////////////////////////////////////////+rq6v/Hx8f/ycnJ/8rKyv/Ozs5kAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAA\r\n        ACAAAAA6AAAAXAAAAH9ra2vE3d3d//Dw8P/q6ur/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh\r\n        4f/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg\r\n        4P/g4OD/39/f/9/f3//f39//3t7e/97e3v/e3t7/3t7e/97e3v/d3d3/3d3d/93d3f/d3d3/3d3d/93d\r\n        3f/d3d3/3d3d/9zc3P/c3Nz/3Nzc/9vb2//b29v/29vb/9vb2//b29v/2tra/9ra2v/a2tr/2tra/9ra\r\n        2v/a2tr/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9jY2P/Y2Nj/19fX/9fX1//W1tb/1tbW/9bW\r\n        1v/V1dX/1dXV/9XV1f/V1dX/1NTU/9PT0//T09P/0tLS/9LS0v/R0dH/0NDQ/8/Pz//Ozs7/zMzM/8nJ\r\n        yf/Gxsb/w8PD/7+/v/+7u7v/uLi4/7Kysv+urq7/qamp/8rKyv/8/Pz/////////////////////////\r\n        ////////////////////////7e3t/8bGxv/Gxsb/ysrK/8nJyWoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAA\r\n        AH9ra2vE3d3d//Dw8P/q6ur/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/+Dg\r\n        4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3t7e/97e\r\n        3v/e3t7/3t7e/97e3v/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/c3Nz/3Nzc/9zc\r\n        3P/b29v/29vb/9vb2//b29v/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/Z2dn/2dnZ/9nZ\r\n        2f/Z2dn/2dnZ/9nZ2f/Z2dn/2NjY/9fX1//X19f/1tbW/9bW1v/W1tb/1tbW/9XV1f/V1dX/1NTU/9TU\r\n        1P/U1NT/09PT/9LS0v/S0tL/0dHR/9DQ0P/Pz8//zs7O/83Nzf/MzMz/ysrK/8fHx//ExMT/wcHB/729\r\n        vf+4uLj/tbW1/6+vr/+rq6v/p6en/76+vv/i4uL/8/Pz//39/f////////////////////////////z8\r\n        /P/t7e3/ycnJ/8jIyP/Gxsb/xsbGcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9qamrE3d3d//Dw\r\n        8P/p6en/4eHh/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg\r\n        4P/g4OD/4ODg/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3t7e/97e3v/e3t7/3d3d/93d\r\n        3f/d3d3/3d3d/93d3f/c3Nz/3Nzc/93d3f/d3d3/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//b29v/29vb/9vb\r\n        2//b29v/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9jY\r\n        2P/Y2Nj/19fX/9fX1//W1tb/1tbW/9bW1v/V1dX/1dXV/9XV1f/U1NT/1NTU/9PT0//T09P/0tLS/9HR\r\n        0f/Q0ND/0NDQ/8/Pz//Ozs7/zMzM/8vLy//Kysr/yMjI/8XFxf/CwsL/vr6+/7q6uv+1tbX/srKy/62t\r\n        rf+np6f/pqam/8HBwf/b29v/19fX/9fX1//e3t7/5+fn/+Xl5f/b29v/0NDQ/8rKyv/Kysr/yMjI/8LC\r\n        wv/Kysp5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9qamrE3Nzc/+/v7//p6en/4ODg/+Dg\r\n        4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f\r\n        3//f39//39/f/9/f3//f39//3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3d3d/93d3f/d3d3/3d3d/9zc\r\n        3P/c3Nz/3Nzc/9zc3P/c3Nz/29vb/9vb2//c3Nz/3Nzc/9vb2//b29v/29vb/9vb2//a2tr/2tra/9ra\r\n        2v/a2tr/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2NjY/9jY2P/X19f/19fX/9fX1//X19f/19fX/9fX\r\n        1//W1tb/1tbW/9XV1f/V1dX/1dXV/9TU1P/T09P/09PT/9PT0//S0tL/0dHR/9DQ0P/Pz8//zs7O/83N\r\n        zf/MzMz/y8vL/8rKyv/IyMj/xsbG/8LCwv+/v7//vLy8/7i4uP+zs7P/sLCw/6urq/+lpaX/paWl/8TE\r\n        xP/W1tb/09PT/9HR0f/Pz8//zc3N/83Nzf/Gxsb/yMjI/8rKyv/ExMT/xMTE/8rKyoEAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9qamrE3Nzc/+/v7//p6en/4ODg/+Dg4P/g4OD/4ODg/+Dg\r\n        4P/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f\r\n        3//e3t7/3t7e/97e3v/e3t7/3t7e/93d3f/d3d3/3d3d/93d3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9vb\r\n        2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/2tra/9ra2v/a2tr/2tra/9nZ2f/Z2dn/2NjY/9nZ\r\n        2f/Z2dn/2dnZ/9jY2P/Y2Nj/19fX/9fX1//W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1dXV/9XV\r\n        1f/U1NT/1NTU/9PT0//T09P/0tLS/9HR0f/R0dH/0NDQ/8/Pz//Ozs7/zc3N/8zMzP/Kysr/ycnJ/8jI\r\n        yP/FxcX/w8PD/8DAwP+9vb3/ubm5/7W1tf+wsLD/ra2t/6mpqf+jo6P/pqam/8fHx//R0dH/zs7O/83N\r\n        zf/Ly8v/y8vL/8fHx//Jycn/xcXF/8LCwv/BwcH/ysrKhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAA\r\n        ACAAAAA6AAAAXAAAAH9qamrE3Nzc/+/v7//o6Oj/4ODg/+Dg4P/g4OD/39/f/9/f3//f39//39/f/9/f\r\n        3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3t7e/97e3v/e3t7/3t7e/93d\r\n        3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb\r\n        2//b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY\r\n        2P/X19f/19fX/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9XV1f/V1dX/1dXV/9PT0//T09P/09PT/9LS\r\n        0v/R0dH/0dHR/9DQ0P/Q0ND/zs7O/83Nzf/MzMz/y8vL/8rKyv/IyMj/x8fH/8bGxv/CwsL/wMDA/729\r\n        vf+6urr/tra2/7Kysv+urq7/qqqq/6ampv+ioqL/p6en/8nJyf/Nzc3/y8vL/8rKyv/Hx8f/xMTE/8nJ\r\n        yf/ExMT/xMTE/8LCwv/JycmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAA\r\n        AH9qamrE3Nzc/+/v7//o6Oj/4ODg/+Dg4P/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f\r\n        3//f39//39/f/9/f3//f39//39/f/97e3v/e3t7/3t7e/97e3v/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc\r\n        3P/c3Nz/3Nzc/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//a2tr/2tra/9nZ\r\n        2f/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/19fX/9fX1//Y2Nj/2NjY/9fX1//X19f/1tbW/9bW\r\n        1v/W1tb/1tbW/9bW1v/W1tb/1dXV/9XV1f/U1NT/1NTU/9PT0//S0tL/0tLS/9HR0f/Q0ND/0NDQ/8/P\r\n        z//Pz8//zc3N/8zMzP/Ly8v/ysrK/8nJyf/Hx8f/xcXF/8TExP/AwMD/vb29/7q6uv+3t7f/tLS0/7Cw\r\n        sP+srKz/qKio/6SkpP+hoaH/p6en/8vLy//Ly8v/ycnJ/8jIyP/ExMT/wsLC/8DAwP/CwsL/vb29/8bG\r\n        xpYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9qamrE29vb/+/v\r\n        7//o6Oj/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//e3t7/3t7e/97e3v/e3t7/3d3d/93d\r\n        3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/29vb/9vb\r\n        2//a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2dnZ/9nZ2f/Z2dn/2dnZ/9fX1//X19f/19fX/9fX\r\n        1//Y2Nj/2NjY/9jY2P/Y2Nj/19fX/9fX1//X19f/1tbW/9bW1v/W1tb/1tbW/9XV1f/W1tb/1dXV/9XV\r\n        1f/U1NT/09PT/9LS0v/S0tL/0dHR/9HR0f/R0dH/0NDQ/9DQ0P/Pz8//zs7O/83Nzf/MzMz/zMzM/8vL\r\n        y//Jycn/x8fH/8bGxv/ExMT/wcHB/7+/v/+9vb3/urq6/7e3t/+0tLT/r6+v/6ysrP+pqan/pqam/56e\r\n        nv+ioqL/uLi4/8LCwv/FxcX/xMTE/8TExP/AwMD/v7+//7+/v/+9vb3/yMjInwAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9qamrE2tra/+/v7//n5+f/39/f/9/f\r\n        3//f39//3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/d3d3/3d3d/93d3f/d3d3/3d3d/93d\r\n        3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//b29v/29vb/9vb2//b29v/2tra/9ra2v/a2tr/2dnZ/9nZ\r\n        2f/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX\r\n        1//X19f/1tbW/9bW1v/W1tb/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1NTU/9TU1P/T09P/0tLS/9LS\r\n        0v/R0dH/0dHR/9DQ0P/Q0ND/z8/P/87Ozv/Ozs7/zc3N/8zMzP/Ly8v/ysrK/8nJyf/Hx8f/xcXF/8TE\r\n        xP/CwsL/v7+//76+vv+6urr/t7e3/7S0tP+ysrL/rq6u/6urq/+np6f/oqKi/5+fn/+fn5//t7e3/8XF\r\n        xf/ExMT/v7+//8DAwP+8vLz/v7+//7q6uv/BwcGl5eXlAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAADAAAADgAAACAAAAA6AAAAXAAAAH9ra2vE29vb/+7u7v/n5+f/3t7e/97e3v/e3t7/3t7e/97e\r\n        3v/d3d3/3d3d/93d3f/e3t7/3d3d/93d3f/d3d3/3d3d/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc\r\n        3P/b29v/29vb/9vb2//b29v/2tra/9ra2v/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9jY2P/X19f/19fX/9fX\r\n        1//X19f/19fX/9fX1//W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1NTU/9TU\r\n        1P/U1NT/1NTU/9TU1P/T09P/09PT/9PT0//T09P/09PT/9LS0v/S0tL/0dHR/9DQ0P/Q0ND/0NDQ/8/P\r\n        z//Ozs7/zc3N/83Nzf/MzMz/y8vL/8rKyv/Jycn/yMjI/8bGxv/ExMT/w8PD/8HBwf+/v7//vb29/7u7\r\n        u/+4uLj/tbW1/7Kysv+urq7/qqqq/6ioqP+kpKT/n5+f/5ycnP+kpKT/u7u7/8LCwv+9vb3/urq6/729\r\n        vf+5ubn/uLi4/8DAwKvi4uIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAA\r\n        ACAAAAA6AAAAXAAAAH9tbW3E3Nzc/+7u7v/o6Oj/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d\r\n        3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc3P/c3Nz/29vb/9vb2//b29v/29vb/9vb2//a2tr/2tra/9ra\r\n        2v/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9fX1//X19f/19fX/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9XV\r\n        1f/V1dX/1dXV/9TU1P/U1NT/1NTU/9TU1P/U1NT/1NTU/9TU1P/U1NT/09PT/9LS0v/S0tL/0tLS/9LS\r\n        0v/S0tL/0dHR/9HR0f/R0dH/0NDQ/9DQ0P/Q0ND/z8/P/8/Pz//Ozs7/zs7O/83Nzf/Nzc3/zMzM/8vL\r\n        y//Kysr/ycnJ/8jIyP/Hx8f/xcXF/8TExP/CwsL/wMDA/76+vv+8vLz/ubm5/7i4uP+0tLT/s7Oz/7Cw\r\n        sP+rq6v/p6en/6SkpP+ioqL/n5+f/5qamv+wsLD/vr6+/7q6uv+4uLj/urq6/7i4uP+1tbX/vLy8seLi\r\n        4gYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACAAAAA6AAAAXAAA\r\n        AH9ubm7E3d3d/+7u7v/n5+f/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d\r\n        3f/c3Nz/3Nzc/9vb2//b29v/29vb/9ra2v/a2tr/2tra/9nZ2f/Z2dn/2NjY/9jY2P/Y2Nj/19fX/9fX\r\n        1//X19f/1tbW/9bW1v/W1tb/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9TU1P/U1NT/1NTU/9PT\r\n        0//T09P/09PT/9PT0//T09P/0tLS/9LS0v/S0tL/0dHR/9HR0f/R0dH/0dHR/9HR0f/Q0ND/0NDQ/9DQ\r\n        0P/Pz8//z8/P/8/Pz//Ozs7/zs7O/83Nzf/Nzc3/zc3N/8vLy//Ly8v/ysrK/8nJyf/IyMj/x8fH/8XF\r\n        xf/ExMT/wsLC/8HBwf+/v7//vb29/7u7u/+5ubn/tra2/7S0tP+wsLD/r6+v/6ysrP+oqKj/paWl/6Ki\r\n        ov+fn5//nZ2d/56env+2trb/ubm5/7S0tP+4uLj/tra2/7Kysv+8vLy33d3dBgAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADQAAAB8AAAA4AAAAWAAAAHpxcXHA39/f/+3t\r\n        7f/m5ub/3d3d/93d3f/d3d3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//b29v/2tra/9ra\r\n        2v/a2tr/2dnZ/9jY2P/Y2Nj/2NjY/9fX1//X19f/1tbW/9bW1v/W1tb/1dXV/9XV1f/V1dX/1dXV/9TU\r\n        1P/U1NT/1NTU/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9LS0v/S0tL/0tLS/9LS\r\n        0v/R0dH/0dHR/9HR0f/R0dH/0NDQ/9DQ0P/Q0ND/0NDQ/8/Pz//Pz8//z8/P/8/Pz//Ozs7/zs7O/83N\r\n        zf/Nzc3/zMzM/8vLy//Ly8v/y8vL/8nJyf/IyMj/x8fH/8bGxv/FxcX/xMTE/8LCwv/BwcH/v7+//729\r\n        vf+7u7v/ubm5/7e3t/+1tbX/srKy/7Gxsf+vr6//rKys/6enp/+lpaX/pKSk/5+fn/+ampr/mJiY/6io\r\n        qP+3t7f/tLS0/7S0tP+zs7P/rq6u/7m5ub3Z2dkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADAAAADAAAABwAAAA0AAAAUQAAAHB5eXm54eHh/+3t7f/k5OT/3Nzc/9zc\r\n        3P/c3Nz/3Nzc/9zc3P/b29v/29vb/9vb2//b29v/2tra/9ra2v/a2tr/2dnZ/9jY2P/Y2Nj/2NjY/9fX\r\n        1//X19f/1tbW/9bW1v/V1dX/1dXV/9TU1P/U1NT/1NTU/9PT0//T09P/09PT/9LS0v/S0tL/0tLS/9LS\r\n        0v/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//z8/P/8/P\r\n        z//Pz8//zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zc3N/83Nzf/MzMz/y8vL/8vLy//Kysr/ycnJ/8nJ\r\n        yf/IyMj/yMjI/8bGxv/FxcX/xMTE/8PDw//CwsL/wMDA/76+vv+9vb3/u7u7/7q6uv+3t7f/tbW1/7S0\r\n        tP+xsbH/r6+v/62trf+srKz/qKio/6SkpP+ioqL/oKCg/5qamv+ZmZn/nZ2d/6+vr/+0tLT/sbGx/7Ky\r\n        sv+vr6//urq6w9fX1wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAACAAAACgAAABkAAAAsAAAARgAAAGGDg4Ou5OTk/+3t7f/k5OT/29vb/9vb2//b29v/29vb/9vb\r\n        2//b29v/29vb/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/2NjY/9fX1//X19f/19fX/9bW1v/W1tb/1dXV/9XV\r\n        1f/U1NT/1NTU/9PT0//T09P/0tLS/9LS0v/S0tL/0tLS/9HR0f/R0dH/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ\r\n        0P/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//zs7O/87Ozv/Ozs7/zc3N/83Nzf/Nzc3/zMzM/8zM\r\n        zP/MzMz/y8vL/8vLy//Ly8v/y8vL/8vLy//Jycn/ycnJ/8jIyP/IyMj/x8fH/8bGxv/FxcX/xcXF/8PD\r\n        w//Dw8P/wsLC/8DAwP+/v7//vr6+/7y8vP+7u7v/ubm5/7e3t/+1tbX/s7Oz/7Gxsf+vr6//rKys/6qq\r\n        qv+lpaX/o6Oj/6Ghof+fn5//m5ub/5eXl/+dnZ3/qqqq/7Kysv+xsbH/rq6u/66urv+xsbHJ1NTUDAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA\r\n        ABMAAAAjAAAANwAAAEyVlZWg5ubm/+7u7v/i4uL/2tra/9ra2v/a2tr/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ\r\n        2f/X19f/19fX/9fX1//W1tb/1tbW/9bW1v/V1dX/1dXV/9TU1P/U1NT/1NTU/9PT0//S0tL/0dHR/9HR\r\n        0f/R0dH/0NDQ/9DQ0P/Q0ND/z8/P/87Ozv/Ozs7/zc3N/83Nzf/Ozs7/zc3N/83Nzf/Nzc3/zc3N/83N\r\n        zf/Nzc3/zc3N/8vLy//Ly8v/y8vL/8vLy//Ly8v/ysrK/8rKyv/Kysr/ysrK/8nJyf/Jycn/yMjI/8jI\r\n        yP/Hx8f/x8fH/8bGxv/Gxsb/xsbG/8XFxf/ExMT/w8PD/8PDw//CwsL/wsLC/8DAwP+/v7//vr6+/729\r\n        vf+7u7v/urq6/7m5uf+4uLj/tLS0/7Kysv+ysrL/sbGx/66urv+qqqr/p6en/6enp/+lpaX/oqKi/52d\r\n        nf+cnJz/mJiY/5qamv+np6f/rq6u/7Kysv+urq7/qqqq/7a2tszV1dUPAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0AAAAXAAAAJQAA\r\n        ADOurq6N6enp/+3t7f/k5OT/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/X19f/19fX/9bW\r\n        1v/W1tb/1dXV/9XV1f/U1NT/1NTU/9PT0//T09P/09PT/9LS0v/R0dH/0NDQ/9DQ0P/Pz8//z8/P/8/P\r\n        z//Ozs7/zs7O/83Nzf/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Kysr/ysrK/8nJ\r\n        yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/IyMj/yMjI/8fHx//Gxsb/xsbG/8XF\r\n        xf/Dw8P/w8PD/8LCwv/CwsL/wcHB/8DAwP/AwMD/wMDA/7y8vP+7u7v/urq6/7m5uf+3t7f/tra2/7S0\r\n        tP+zs7P/sbGx/7CwsP+urq7/q6ur/6mpqf+np6f/paWl/6Kiov+fn5//n5+f/5mZmf+ampr/mZmZ/52d\r\n        nf+srKz/sLCw/6mpqf+pqan/vb29z+Hh4RIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAcAAAAOAAAAFgAAAB/Hx8d/6urq/+rq\r\n        6v/l5eX/19fX/9fX1//X19f/19fX/9fX1//X19f/1tbW/9bW1v/V1dX/1dXV/9XV1f/U1NT/09PT/9PT\r\n        0//T09P/0tLS/9LS0v/R0dH/0dHR/9DQ0P/Pz8//zs7O/87Ozv/Nzc3/zc3N/83Nzf/MzMz/y8vL/8vL\r\n        y//Kysr/ysrK/8nJyf/Ly8v/y8vL/8vLy//Kysr/ysrK/8rKyv/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ\r\n        yf/IyMj/yMjI/8jIyP/Hx8f/x8fH/8bGxv/Gxsb/xcXF/8TExP/Dw8P/wsLC/8LCwv/CwsL/wcHB/8DA\r\n        wP+/v7//vr6+/729vf+9vb3/vLy8/7u7u/+6urr/uLi4/7e3t/+1tbX/s7Oz/7Kysv+xsbH/ra2t/62t\r\n        rf+rq6v/qKio/6enp/+np6f/paWl/6Ghof+goKD/l5eX/5mZmf+YmJj/oqKi/7Gxsf+urq7/r6+v/7Oz\r\n        s/zR0dGH8fHxCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAQAAAAHAAAACwAAAA/g4OB07u7u/+vr6//r6+v/6Ojo/+jo\r\n        6P/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Tk\r\n        5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/g4OD/4ODg/+Dg4P/f39//3t7e/97e3v/d3d3/3d3d/9zc\r\n        3P/a2tr/2tra/9ra2v/a2tr/2dnZ/9nZ2f/Y2Nj/2NjY/9fX1//X19f/1tbW/9XV1f/U1NT/09PT/9PT\r\n        0//S0tL/0NDQ/8/Pz//Ozs7/zc3N/8zMzP/Kysr/ysrK/8nJyf/Hx8f/xsbG/8XFxf/ExMT/wsLC/8HB\r\n        wf+/v7//v7+//76+vv+9vb3/u7u7/7m5uf+4uLj/tra2/7W1tf+0tLT/sLCw/6+vr/+tra3/q6ur/6io\r\n        qP+mpqb/o6Oj/6CgoP+goKD/nZ2d/5+fn/+srKz/srKy/7Gxsf+4uLj8v7+/qPDw8DMAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAQAAAAEAAAACAAAABAAAAAXw8PBt7u7u/+np6f/q6ur/7e3t/+3t7f/s7Oz/7Ozs/+zs\r\n        7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+fn\r\n        5//m5ub/5ubm/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//h4eH/4eHh/+Hh\r\n        4f/g4OD/4ODg/9/f3//f39//39/f/9ra2v/a2tr/2dnZ/9jY2P/X19f/1tbW/9XV1f/V1dX/0tLS/9LS\r\n        0v/R0dH/z8/P/87Ozv/Nzc3/zMzM/8vLy//IyMj/yMjI/8fHx//FxcX/xMTE/8LCwv/BwcH/wcHB/76+\r\n        vv+9vb3/u7u7/7q6uv+5ubn/t7e3/7a2tv+1tbX/sbGx/6+vr/+tra3/ra2t/6qqqv+mpqb/pqam/6io\r\n        qP+ioqL/qKio/7a2tv+2trb/zc3N2PPz84H5+fkYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD8/Pxp8/Pz/+zs7P/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr\r\n        6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm\r\n        5v/m5ub/5+fn/+bm5v/m5ub/5ubm/+bm5v/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Pj\r\n        4//i4uL/4uLi/+Pj4//j4+P/4uLi/+Li4v/i4uL/4eHh/+Hh4f/h4eH/4ODg/9/f3//f39//3t7e/9zc\r\n        3P/b29v/29vb/9ra2v/b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Y2Nj/2NjY/9fX1//W1tb/1dXV/9TU\r\n        1P/U1NT/09PT/9LS0v/R0dH/z8/P/8zMzP/Ly8v/zc3N/8zMzP/Kysr/zs7O89TU1Mzm5ua98vLylvf3\r\n        91f8/PwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////////////////////////////////////////////////////////////////////////////////\r\n        ////////////////////////////////////////+AAAAAAAAAAAAAAAAAAAAAH/////////8AAAAAAA\r\n        AAAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAD/////////4AAAAAAAAAAAAAAAAAAAAAD/\r\n        ////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAA\r\n        AAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf\r\n        ////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAA\r\n        AAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf\r\n        ////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAA\r\n        AAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAf////////4AAAAAAAAAAAAAAAAAAAAAAP\r\n        ////////4AAAAAAAAAAAAAAAAAAAAAAP////////4AAAAAAAAAAAAAAAAAAAAAAP////////4AAAAAAA\r\n        AAAAAAAAAAAAAAAP////////4AAAAAAAAAAAAAAAAAAAAAAP////////4AAAAAAAAAAAAAAAAAAAAAAP\r\n        ////////4AAAAAAAAAAAAAAAAAAAAAAP////////4AAAAAAAAAAAAAAAAAAAAAAP////////4AAAAAAA\r\n        AAAAAAAAAAAAAAAP////////4AAAAAAAAAAAAAAAAAAAAAAP////////4AAAAAAAAAAAAAAAAAAAAAAP\r\n        ////////4AAAAAAAAAAAAAAAAAAAAAAP////////gAAAAAAAAAAAAAAAAAAAAAAP////////AAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////+AAAAAAAAAAAAAAAAAAAAAAAP///////8AAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////4AAAAAAAAAAAAAAAAAAAAAAAP///////4AAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////gAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAAAAAAAAAAAAP\r\n        /////+AAAAAAAAAAAAAAAAAAAAAAAAAP/////AAAAAAAAAAAAAAAAAAAAAAAAAAP////4AAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///8AAAAAAAAAAAAAAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///gAAAAAAAAAAAAAAAAAAAAAAAAAAAP///AAAAAAAAAAAAAAAAAAAAAAAAAAAAP///AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///AAAAAAAAAAAAAAAAAAAAAAAAAAAAP///AAAAAAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///gAAAAAAAAAAAAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///+AAAAAAAAAAAAAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAAAAAAAAAAAAP/////gAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAA\r\n        AAAAAAAAAAAAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAP///////gAAAAAAAAAAAAAAAAAAAAAAAP\r\n        ///////gAAAAAAAAAAAAAAAAAAAAAAAOA//////gAAAAAAAAAAAAAAAAAAAAAAAIAf/////gAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AD/////gAAAAAAAAAAAAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAB/////gAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAB/////gAAAAAAAAAAAAAAAAAAAAAAAAAB/////gAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AB/////gAAAAAAAAAAAAAAAAAAAAAAAAAB/////gAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AH/////4AAAAAAAAAAAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAAAAAAAAAAAAf////gAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        B////8AAAAAAAAAAAAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAAAAAAAAAAAAH////4AAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAAAAAAAAAAAAf////wAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        /////wAAAAAAAAAAAAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAD\r\n        /////wAAAAAAAAAAAAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAf////wAAAAAAAAAAAAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        H////wAAAAAAAAAAAAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAAAAAAAAAAAAB////wAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAA////wAAAAAAAAAAAAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAD///wAAAAAAAAAAAAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AB///wAAAAAAAAAAAAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAAAAAAAAAAAB///wAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AB///4AAAAAAAAAAAAAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAAAAAAAAAAAD///4AAAAAAAAAA\r\n        AAAAAAAAAAAAAEAAAH///4AAAAAAAAAAAAAAAAAAAAAAAPgAAP///4AAAAAAAAAAAAAAAAAAAAAAAf4A\r\n        AP///4AAAAAAAAAAAAAAAAAAAAAAA//AAf///8AAAAAAAAAAAAAAAAAAAAAAB//wB////8AAAAAAAAAA\r\n        AAAAAAAAAAAAD///P////+AAAAAAAAAAAAAAAAAAAAAAH/////////AAAAAAAAAAAAAAAAAAAAAAP///\r\n        //////gAAAAAAAAAAAAAAAAAAAAAf/////////wAAAAAAAAAAAAAAAAAAAAA//////////8AAAAAAAAA\r\n        AAAAAAAAAAAB////////////4AAAAAAAAAAAAAAAAAAD////////////8AAAAAAAAAAAAAAAAAAH////\r\n        ////////8AAAAAAAAAAAAAAAAAAP////////////8AAAAAAAAAAAAAAAAAAf////////////8AAAAAAA\r\n        AAAAAAAAAAA/////////////8AAAAAAAAAAAAAAAAAB/////////////8AAAAAAAAAAAAAAAAAD/////\r\n        ////////8AAAAAAAAAAAAAAAAAD/////////////8AAAAAAAAAAAAAAAAAH/////////////8AAAAAAA\r\n        AAAAAAAAAAP/////////////8AAAAAAAAAAAAAAAAAf/////////////8AAAAAAAAAAAAAAAAA//////\r\n        ////////8AAAAAAAAAAAAAAAAB//////////////8AAAAAAAAAAAAAAAAD//////////////8AAAAAAA\r\n        AAAAAAAAAH//////////////8AAAAAAAAAAAAAAAAP//////////////8AAAAAAAAAAAAAAAAf//////\r\n        ////////8AAAAAAAAAAAAAAAA///////////////8AAAAAAAAAAAAAAAB///////////////8AAAAAAA\r\n        AAAAAAAAD///////////////8AAAAAAAAAAAAAAAH///////////////+AAAAAAAAAAAAAAAP///////\r\n        ////////+AAAAAAAAAAAAAAA////////////////+AAAAAAAAAAAAAAD////////////////+AAAAAAA\r\n        AAAAAAA/////////////////////////////////////////////////////////////////////////\r\n        //8oAAAAEAAAACAAAAABACAAAAAAAAAEAAAjLgAAIy4AAAAAAAAAAAAAAAAAAAAAAAAsLAxlKioLhyoq\r\n        C4ctMhSJOE0zkjxXP5Y8Vz+WPFY+ljdMMZI7VTyVPFY+lkFjS3h///8bf///BwAAAAAAAAAAODgXgv//\r\n        ////////+f///8r7/v+66/7/vOb+/7rq/f/b8Pv/t+38/7zn/P97ssbPhvH/cH///xAAAAAAAAAAAElJ\r\n        Jnv///////////j+/v/J9/3/54j9//lN/f/NtP3/r+H8/8m4+//4Tv3/v0TS0Yzl/3R///8RAAAAAAAA\r\n        AABUVC93/////8zMu//Hzb3/suzi/7qx6//7K/7/+i7+/+tg/P/6Lv3/+yv+/56S2dN///93f///EAAA\r\n        AAAAAAAAWFgzdv///v/t7dz/6u3d/8zy5v+q3fX/5y////kH///4Df///gH//+cv//+LxuLbf///S3//\r\n        /wYAAKiNAACk/wAAov8AAKD/AACe/x06s/9YseD/fZbp/95C///JNv//7RL//+0S///eQv//mLXp4X//\r\n        /7F///86AACu/wAArv8AALH/AACx/wAAsP9XruX/aHHg/8AP7f+6TP//oV7//61S//+nWP//x0D//+Ub\r\n        6eGls/+hf///rgAAtf8AALn/4eH//5KS5/9MTNH/Ybzs/7UD6f+7Eez/2Uv//9lM//+Ucf//2Uz//9lM\r\n        ///jIOje/QP/tX///7QAAL7/AADH/1FR3v/d3f3/oqLw/5bs/P+h+P//fNPz/1u25//Wg/L/8zn2/9SC\r\n        8f+g/Pj/e+bf0X///6x///+rAADG/wAA0v8AANX/Z2fo/2Fh5f/Fyff/QkbX/wYNv/85c9X/tK7h/+1G\r\n        7P+2sOP/v/jv/299WnR///8If///CAAAzf8AANr/AADe/y0t5f/T0/r/ZGTn/wAAz/8BA8T/Hj3J/6vw\r\n        8//3TPL/qe7w/9b16P9xdU1uAAAAAAAAAAAAANH/AADg/wAA5v8FBej//v7//yAg4f8AANT/AADJ/wgR\r\n        wf+k9/H/offx/6P28P/q8+P/dHRMawAAAAAAAAAAAADV/wAA4/8AAOr/AADs/wAA5/8AAN//AADW/wAA\r\n        y/8AAMH/5ubV/6Skk/+kpJP/pKST/0lJJXwAAAAAAAAAAAAAzo0AANj/AADb/wAA3P8AANn/AADV/wAA\r\n        0P8AAMr/fn7N/+Xl1P+2tqX//////3p6UWh6elElAAAAAAAAAAAAAAAAAAAAAH19U2f8/PX/+fnv//b2\r\n        6v/09OX/8/Pi//Ly4f/y8uH/wsKx/319U2d9fVMlAAAAAAAAAAAAAAAAAAAAAAAAAAB/f1VNf39VZn9/\r\n        VWZ/f1Vmf39VZn9/VWZ/f1Vmf39VZn9/VWZ/f1UkAAAAAAAAAAAAAAAAAAAAAOAH///AA+AH4APAA+AD\r\n        4APgA+ADAAHgAwAAAAEAAAAAAAAAAAAHAAAABwAHAAcABwAHAAcADwAH4B8AD///4B8oAAAAIAAAAEAA\r\n        AAABACAAAAAAAAAQAAAjLgAAIy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADAAA\r\n        AAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA\r\n        AAwAAAAMAAAADAAAAAwAAAAMAAAACwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AC0AAACMAAAAkgAAAJIAAACSAAAAkgAAAJIAAACSAAAAkgAAAJIAAACSAAAAkgAAAJIAAACSAAAAkgAA\r\n        AJIAAACSAAAAkgAAAJIAAACSAAAAkgAAAJIAAACKAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAPMzMzPna2tr/29vb/93d3f/e3t7/39/f/9/f3//U1NT/zMzM/9vb2//j4+P/4+Pj/+Li\r\n        4v/h4eH/4ODg/97e3v/d3d3/3Nzc/9zc3P/b29v/2dnZ/9TU1P/CwsKUAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAA81NTU+efn5//q6ur/6+vr/+zs7P/t7e3/5+fn/6ysxP96d8n/urnE/+Tk\r\n        5P/s7Oz/7Ozs/+vr6//q6ur/6Ojo/+fn5//m5ub/5OTk/+Li4v/f39//2dnZ/8bGxpcAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzX19f56+vr/+3t7f/u7u7/7+/v//Hx8f/r7Ov/enrm/0hF\r\n        6f9dWen/w8TP/+zs7P/w8PD/7+/v/+7u7v/t7e3/6+vr/+rq6v/o6Oj/5ubm/+Pj4//c3Nz/ysrKmAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPNnZ2fnt7e3/8PDw//Hx8f/z8/P/9PT0//Pz\r\n        8v+IhvP/VlTc/1xZ2/9tat3/2tra/+/v7//y8vL/8vLy//Dw8P/v7+//7e3t/+rq6v/n5+f/5OTk/97e\r\n        3v/MzMyaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmZmQOfn5+KxMTE/Ofn5//z8/P/9PT0//X1\r\n        9f/29vb/9vb2/+zs9f94dvX/QD3t/0xH9/+JiLn/xcXF/93d3f/o6Oj/7e3t/+zs7P/h4eH/0dDQ/8HB\r\n        wf/BwMD/0tLS/83NzZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT0Vv77+v78+/v/yMjI//Pz\r\n        8//29vb/9/f3//j4+P/5+fn/+fn5//j4+P+8vPf/YmD0/1BL6f9ubb7/oKG1/7W1tf+2trb/tLS0/5iX\r\n        ov9vb7X/XFrM/15cyv+6usf/zc3NnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f1+/7+w//+q\r\n        lf/t7e3/09PT//j4+P/19fX/4+Pj/9nZ2f/V1dX/+fn5//r6+v/l5fD/XFf0/1RO8v9PSfX/V1Pn/1ZU\r\n        zf9UUcj/SUXv/0ZE8/9RUen/U073/7u73v/Ozs6fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39\r\n        /W7/zcD//zwL///j3f/W1tb/3d3d/+fn5//7+/v///j2/+fn5//s7Oz/+/v7//n5+P+dnO7/X1vs/8XF\r\n        zf+Egsv/RUD5/3t49f9/fff/iIX1/5uW9f/Lyuz/4eHh/8/Pz6EAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AACXl5cD8vLyaP/c1P//MwD//2U////9/f//9/X//7Sh//9kPv//ppD/9/f3//X19f/8/Pz/+/v7/+Tk\r\n        7/9YU/X/bm6+/1BM7/+qqPP/9PT0//X09P/y8fL/7+/v/+rq6v/h4eH/zs7OowAAAAAAAAAAAAAAAJSU\r\n        lAKysrJKycnJmNjY2M3s7Ozy/+vn//8zAP//MwD//2pE//8/D///MwD//5B0//39/f/39/f//Pz8//z8\r\n        /P/8/Pz/+Pj3/4mJ6/9CPPj/kpDt//X29f/29vb/9PT0//Ly8v/v7+//6urq/+Dg4P/Ozs6kAAAAAAAA\r\n        AAAAAAAA8fHxWP39/f3/7+v//8O1//+Xff//aUT//zMA//8zAP//MwD//zMA//+AYP/9/Pz/9vb2//v7\r\n        +//8/Pz//Pz8//z8/P/5+fn/srHa/0pF+P/MzN//9/f3//b29v/09PT/8PDw/+3t7f/p6en/39/f/87O\r\n        zqYAAAAAAAAAAAAAAAD+/v6O/9rR//9tSf//QRL//zMA//8zAP//MwD//zMA//8zAP//NgT//9/Y/+fn\r\n        5//b29v/+vr6//v7+//7+/v/+/v7//b29v+dnNf/Qj73/6Oh5P/19PX/9fX1//Ly8v/v7+//7Ozs/+jo\r\n        6P/f39//zc3NqAAAAAAAAAAAAAAAAP7+/h////+q////6P/+/v//4Nj//6yY//8zAP//MwD//zMA//8z\r\n        AP//TiL//+vm/9nZ2f/f39//+fn5//r6+v/5+fn/8fLx/4WD4P9FQvT/gX/r//Hx8f/x8fH/7e3t/+7u\r\n        7v/q6ur/5ubm/97e3v/MzMypAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////IP7+/on/5uD//zMA//81\r\n        A///sJ3//4Bh//88C///Vy3///Hu/9HR0f/u7u7/+Pj4//f39//x8fH/fXvl/0lH6P9vbO3/7Ozs/+Tk\r\n        5P/R0dH/1tbW/+jo6P/k5OT/29vb/8rKyqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8ZP/X\r\n        zf//MwD//5R5//v7+//9/f3///Tx//+umf//qpX/9PT0/+jo6P/29vb/9vb2//Hx8f+Hher/R0Xo/3Vz\r\n        8P/09PP//9/////u///Nzc3/3t7e/+Hh4f/X19f/xcXFrJqamgqYmJgFAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD8/Px1/8i6//9WLP/++ff/7Ozs//Ly8v/19fX/+vr6//39/f/29vb/8/Pz//T09P/z8/P/8fHw/7y7\r\n        8f9kYvT/wsLs//X09P//tP///1z///n5+f/CwsL/3Nzc/8nJyf/Ozs7q3Nzc5rm5ubmZmZkKAAAAAAAA\r\n        AAAAAAAAAAAAAPz8/ID/0MT//9fN//Dw8P/v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v\r\n        7//u7u7/7e3t/+3s7P/q6uv/8fHx///H////AP///6///+jo6P/e3t7/+Pj4///k////vP//8fHx+5yc\r\n        nCsAAAAAAAAAAAAAAAYAAAA9TExMht/f3/He3t7+srKy/7Ozs/+zs7P/srKy/7Kysv+zs7P/s7Oz/7Ky\r\n        sv+ysrL/sbGx/7Gxsf+6urr/2tra/9vb2//f39///9r///8A////F////+f///+w////TP///xD////K\r\n        ///09PS/mJiYBQAAAAAAAAAAAAAANw8OMb0uLHnqNTOA7UtKkf1OTZT/Tk6V/05Nlf9OTZT/Tk2U/05N\r\n        lP9OTZT/Tk2U/05NlP9OTZT/U1KU/6qqtP/a2tr/7+/v//39/f//3////wD///8A////Bv///wD///8G\r\n        ////u///+fn51NfX1xQAAAAAAAAAAAAAAAAPEBZcJyWm+js5t/87OLf/Ojeq/zo4tf87Obj/Ozi1/zk2\r\n        pf85NqX/Oziz/zw4tP86N6v/Ozm4/zw5uP+dnNr//+b///+X////YP///yj///8B////AP///wD///8A\r\n        ////Av///6r///Ly8vXNzc0mAAAAAAAAAAAAAAAAAAAAASEhO2gQDbb/EA+2/xAOtf9eX4b/GBas/xEP\r\n        tv8dGqr/dHSB/3R1iv9RUX7/Hx2g/1JSiP8RDrX/EA+2/39/2P//6v///53///9m////Lv///wP///8A\r\n        ////AP///wD///8B////pP//8fHx/aysrJaXl5cFAAAAAAAAAAAAAAABIiNBah4cy/8kI83/IyLM/4mI\r\n        rv9ZWZ3/QUCh/zEvvv+EhLH/NDLR/4KBtf9IR7L/g4Kk/zw6oP8qKbv/JybO/29v4P+op+n/9fX1//7+\r\n        /v//4v///wD///8A////CP///wD///8E////tf//7Ozs/Kenp4eYmJgCAAAAAAAAAAEjI0lrNDLg/0NB\r\n        4/9CQOP/sLHV/4uK3f+4t9f/ZmTL/6qq1v9AQN3/nJvO/29u2P/Cwdf/oKDc/19f4P9DQeP/Q0Hj/z4+\r\n        1v/Pz8//39/f///a////AP///xn////q////tv///1P///8P////w///4eHh95ycnCoAAAAAAAAAADIz\r\n        ZldNTPH/ZmXz/2Vl8//Pz/H/qqnK/9fY5/+KiPD/3d7q/6ipx//T1e//f33w/9ra5/+lpcb/hoXU/2Rl\r\n        8/9lZfP/UVHm/8/Pz//d3d3//8f///8A////sv//7u7u/+fn5+f////q/+n////A///19fXpmpqaFQAA\r\n        AAAAAAAAREhlElBP9+mMjPv/jY38/6Sk/P+rq/z/oKD7/5KS/P+qqvz/qqr9/5eX/P+Skvv/q6r8/6ur\r\n        /P+dnvz/jY37/4eH+/9oaOv/0NDQ/+Hh4f//tP///17///r6+v/MzMzpvr6+J/7+/gX+/v5S////kfj4\r\n        +DcAAAAAAAAAAAAAAAAAAAAAR0L0K0A9+4M6OdOhhITq+oyM8P+Li+//i4vv/4uL7/+Kiu7/ioru/4mJ\r\n        7f+IiOz/h4fr/4eH6/+Ghur/h4bm/8nJ1f/MzMz/29vb///f////7///29vb7sjIyC8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbT09P14ODg/9/f3//f39//3t7e/93d\r\n        3f/c3Nz/29vb/9nZ2f/Y2Nj/19fX/9XV1f/S0tL/zs7O/8PDw/+0tLT/5+fn/97e3vHHx8c2AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANtLS0vXe3t7/3d3d/9zc\r\n        3P/b29v/2dnZ/9jY2P/X19f/1tbW/9TU1P/S0tL/z8/P/8vLy//CwsL/s7Oz/6urq//AwMDzwcHBOwAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp1dXV8dra\r\n        2v/Y2Nj/1tbW/9PT0//R0dH/z8/P/87Ozv/Nzc3/y8vL/8jIyP/Dw8P/u7u7/7CwsP+hoaH/q6ur9bOz\r\n        s0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAPn5+ea5eXlquPj46rg4OCq3t7eqtvb26rZ2dmq19fXqtPT06rNzc2qyMjIqsLCwqq5ubmqr6+vqK+v\r\n        r4e4uLgmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAP/AAAB/wA\r\n        AAf8AAAH/AAAB/gAAAf4AAAH+AAAB/gAAAf4AAAHwAAAB4AAAAcAAAAHgAAAB/AAAAf4AAAH+AAAAfAA\r\n        AAHwAAAB4AAAA+AAAAfgAAAD4AAAAeAAAAHgAAAB4AAAO/AAAH/8AAD//AAB//wAA//8AAf/KAAAADAA\r\n        AABgAAAAAQAgAAAAAAAAJAAAIy4AACMuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADAwMDIQQEBDQEBAQ2BAQENgQEBDYEBAQ2BAQENgQEBDYEBAQ2BAQENgQE\r\n        BDYEBAQ2BAQENgQEBDYEBAQ2BAQENgQEBDYEBAQ2BAQENgQEBDYEBAQ2BAQENgQEBDYEBAQ2BAQENgQE\r\n        BDYEBAQ2BAQENgQEBDYEBAQ2BAQENgQEBDYEBAQ2BQUFLgAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAgICbQAAAKsAAACxAAAAsQAAALEAAACxAAAAsQAA\r\n        ALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAA\r\n        ALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAsQAAALEAAACxAAAAmAAAAEAAAAACAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFRUVgKGhofSpqan1qqqq9aqq\r\n        qvWrq6v1rKys9aysrPWtra31rq6u9a2trfWurq71qqqq9aqqqvWxsbH1tbW19bW1tfW0tLT1tLS09bS0\r\n        tPWzs7P1s7Oz9bGxsfWxsbH1sbGx9bCwsPWurq71sLCw9bGxsfWwsLD1sLCw9a+vr/WsrKz1ra2t8JeX\r\n        l8w4ODgJ////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGBgYgdXV\r\n        1f/o6Oj/6+vr/+rq6v/r6+v/7e3t/+7u7v/u7u7/7u7u/+7u7v/i4eH/yMjE/76+vf/P0M3/5eTm/+7t\r\n        7f/u7u7/7+/v/+7u7v/s7Oz/7Ozs/+zs7P/q6ur/6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/5OTk/+Li\r\n        4v/e3t7+3d3d/8HBwexBQUEL////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAALFxcXgdTU1P/p6en/6+vr/+3t7f/t7e3/7e3t/+7u7v/v7+//7+/v/+7u7v/Q0c7/a2nE/1BL\r\n        3f+Jh8H/zs/I/+Hh4//t7u7/7+/v/+/v7//u7u7/7e3t/+3t7f/r6+v/6+vr/+rq6v/o6Oj/5+fn/+bm\r\n        5v/m5ub/5OTk/+Pj4//d3d3+3Nzc/8LCwutHR0cM////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAALFxcXgdbW1v/r6+v/7e3t/+7u7v/u7u7/7+/v//Dw8P/x8fH/8fHy//Dw\r\n        8v++vtj/ODT3/0M9//9QSvP/rKy8/9jZ0v/r6+z/8fHx//Dw8P/v7+//8PDw/+/v7//u7u7/7e3t/+zs\r\n        7P/r6+v/6enp/+np6f/n5+f/5eXl/+Xl5f/f39/+3t7e/8PDw+xHR0cM////AQAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGBgYgdfX1//s7Oz/7+/v//Dw8P/w8PD/8vLy//Ly\r\n        8v/z8/P/9PT0//Hx8//AwOj/PTr9/1JR2/9ZV9v/Tkjz/4mJyv/d3dr/8vHx//Pz8//y8vL/8fHx//Hx\r\n        8f/w8PD/7+/v/+7u7v/t7e3/7Ozs/+vr6//p6en/6Ojo/+fn5//h4eH+4ODg/8bGxu5ISEgO////AQAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFBQUft3d3f/v7+//8fHx//Ly\r\n        8v/z8/P/9fX1//T09P/19fX/9/f3//X09v/k4/P/My/4/zQu/v9xcL7/Uk73/0dA/v+trcb/5+bp//Dw\r\n        8P/09PT/8/Pz//T09P/z8/P/8vLy//Hx8f/v7+//7u7u/+3t7f/r6+v/6Ojo/+fn5//i4uL+4eHh/8jI\r\n        yO9GRkYO////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wEJCQkNMjIyksnJ\r\n        yf/u7u7/8vLy//T09P/09PT/9vb2//b29v/29vb/9/f3//b29v/6+vb/pKTz/zUx9P9FQuz/T07h/1FO\r\n        /f92dM3/zMzJ/9zd3v/r6+v/8vLz//Pz8//19fX/8/Pz//Ly8v/v7+//6+vr/+fn5//c3N3/09PU/9XV\r\n        1v/X19f+4eHh/8rKyvFKSkoP////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AQAA\r\n        AADS0tKI3t7e+Nzc3P/Gxsb/8fHx//b29v/19fX/9/f3//f39//39/f/+Pj4//j4+P/4+Pj//Pv4/9/e\r\n        +P96ePf/Ojb4/0NA9v9UT+v/hYSa/6Wmo/++vrr/y8zM/9PT1f/c3N3/4uLj/+Pj4//W1tf/xcTC/7q6\r\n        tf+rq6v/oaGn/5+gpv+5urj+2trb/8vKyvFISEgP////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAANTU1Bj9/f35/fn4/v/////i4uL/wMDA//n5+f/4+Pj/+fn5//j4+P/5+fn/+/v7//7+\r\n        /v/9/v3/+vr6//n3/P////r/1tf4/3V09P9QTPn/OjT7/0ZD2/+Bgb7/ra6s/7S1qP+wsKb/qqqm/6mp\r\n        qP+enpT/c3SV/1pYsv8/O+T/Ozjx/zk28P97es7+2drW/8vMzPRLS0sR////AgAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD///8BAAAAAPDw8DP+/f3//25K///Iuv/8/Pv/sLCw/9nZ2f/6+vr/+fn5//n5\r\n        +f/9/f3/9/f3/+np6f/p6en//f79//z7+//5+fr////7////8P9vbfD/UEj9/z85/v8+N/r/UE/l/2pn\r\n        1P93ea//goGN/4mLif9dWrX/OjT1/0hD//9ZV/f/VVPw/0VB+v9lZOv+5ufa/8rKzfNLS0sR////AgAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAAOTk5Cf8+/v9/2ZA//8xEP//4dr/8fHx/7q6\r\n        uv/n5+f/8PDw/+bm5v/f3t7/4+Li/+Xl5f/V1dX/ycnJ//j4+P/8/Pz/+/v8//n7+f+1tO7/UEr5/1BK\r\n        9f+QjuL/enbz/2Bb8f9MR/T/NTD0/zo28v9DP/r/S0b5/0E+9/9KR+//Ukzz/2pj+f+xsOn/5ubi/83N\r\n        zvZISEgS////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPT09Bj+/Pz2/4Fh/v8n\r\n        Af//f2L///////r5+f++vb3/3t3d//Lv7//////////////18//+/Pv/09PT/9vb2//9/f3//f39//z7\r\n        /f/s7fL/XVzx/0xF//+cm9P/0tDH/729qP9KRub/Tk32/4iG8v+lo/b/oaD4/6Si9/+wrvX/zM3w/+3u\r\n        7P/p6ef/5OTk/83NzfZJSUkT////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///wH///8C////Af//\r\n        /wn//v3w/49y/v8mAP//PxP///b0///////6+Pf/////////////5uD//4Jl//9DGv//7en/6Obm/+rq\r\n        6v/+/v7//f39//39/f/8/Pf/lJPp/05J9/9ua9T/qaud/11Y0v9LR/v/m5vz//f58v////X////1//z9\r\n        8//6+/D/9ffv/+3t7v/m5uf/4+Pj/83NzflMTEwU////AgAAAAAAAAAAAAAAAAAAAAAAAAAAv7+/AqOj\r\n        ow6ampoqnp6eS6mpqWn59/b0/6OM/v8lAP//MgP//1w3///h2f//0MX//5N6//9lSP//OA3//1g+///O\r\n        wf/9/Pz/8fHx//z8/P/9/f3//f39//z8/P/7/Pz/5uXq/25t7v9NSOv/SETf/0dC/P+sqvH/+/v4//j4\r\n        9//19fb/9PT1//Py8//x8PL/7+/w/+3t7f/n5+b/4uLi/83NzfpKSkoU////AgAAAAAAAAAAAAAAAP//\r\n        /wGcnJwnpqamrLm5udra2Nj49vPy/////////////8a3//8pAP//NAH//zEA//83BP//KgD//zEA//86\r\n        CP//VjT////////+/v/29vb//v7+//39/f/+/v7//v7+//39/f/8/Pz//v73/7y84/9MRvf/Qj76/31+\r\n        6v/19fL/+fn5//n4+P/29vb/9fX1//Tz8//x8fH/7+/v/+zs7P/m5ub/4uLi/87OzvxNTU0V////AgAA\r\n        AAAAAAAAAAAAAAAAAADZ2dm1//79/////////////////f////7/4Nn//4tu//8uAP//MwH//zQA//8y\r\n        AP//NQL//zcE//8kAP//u6r////+//n4+P/5+fn//f39//z8/P/9/f3//f39//z8/P/8/Pz/+fn5/97f\r\n        3f9WVPH/Q0D2/8HD1v/39/b/+fn4//j4+P/29vb/9fX1//Pz8//x8fH/7+/v/+zs7P/m5ub/4eHh/83N\r\n        zfxLS0sW////AgAAAAAAAAAAAAAAAPb29j/9+/v7/76t/f+chf7+eF/+/1k5//9IHv//Ngb//zAB//8z\r\n        AP//MwD//zMA//8zAP//MgH//z4W//+yn//9/Pv/39/f//Hx8f/9/f3//Pz8//z8/P/8/Pz//Pz8//z8\r\n        /P/8/Pz/9fT3/+Hh0/9XVOf/SkX4/6qq2P/19fL/+Pj4//f39//19fX/9PT0//Ly8v/v7+//7e3t/+vr\r\n        6//k5OT/4ODg/87Ozv5MTEwW////AgAAAAAAAAAAAAAAAP///0T//f39/72t/P+LcP7/WTH//zQB//8p\r\n        AP//KQD//zEA//8zAP//MwD//zMA//8zAP//MgH//z4U///Mvv/+/f3/xcXF/7e3t//6+vr/+/v7//z8\r\n        /P/7+/v//Pz8//v7+//7+/z/7+/v/9DQy/8+OvP/SUT6/3Ft6f/w8Ov/9/f3//f39//09PT/8/Pz//Ly\r\n        8v/v7+//7e3t/+vr6//k5OT/4ODg/87Ozv5LS0sX////AgAAAAAAAAAAAAAAAP///wb////f////////\r\n        ////+fj+/9bM+/+rl/3/bkv//z0N//8yAP//MwD//zMA//81Av//NQH//y0A//84Df//6uT//////8DA\r\n        wP/a2tr//f39//v7+//7+/v/+/v7//r6+v/5+vr/7+7q/7q9y/9APPX/TEf7/1lU8P/n6On/9vb3//X1\r\n        9f/z8/P/8/Pz//Dw8P/u7u7/7Ozs/+rq6v/k5OT/4ODg/87Ozv9KSkoY////AgAAAAAAAAAAAAAAAAAA\r\n        AAD+/v4d//z8Wf/7+nL//v2h//79x//8/OL+/f39/7im//8qAP//NAH//zAA//9FGv//OAz//y8D//8x\r\n        AP//ZkT///Tx///+/v/Kysr/4eHh//v7+//6+vr/+vr6//n5+f/4+Pn/8PDm/6em0v89Ovb/SUb1/0ZB\r\n        +v/b2+b/8/P0/+fn5//X19f/29vb/+3t7f/s7Oz/6urq/+jo6P/i4uL/3t7e/83Nzf9MTEwZ////AgAA\r\n        AAAAAAAAAAAAAAAAAAD///8C////AQAAAAAAAAAAAAAAAAAAAAD59/fo/6WN/f8mAP//MwP//0IW///w\r\n        7P//3tb//3hY//88D///JAD//1Uu///z7//7+vr/srKy/+Xl5f/6+vr/+Pj4//j4+P/39/j/8vPn/6el\r\n        2P9APe3/TUrr/zs2/P/W1ej/5ubo/+3t7f/y7/L/v7+//7u7u//q6ur/6Ojo/+bm5v/g4OD/3Nzc/8zM\r\n        zP9QUFAZqqqqAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8D////BNra2gf9+vru/5h9/v8k\r\n        AP//MAP//72s///////////////////p5P//gWP//yEA//9UKv//9/b/2NfX/9jY2P/5+fn/9/f3//f3\r\n        9//39/j/9PXo/6qq2v9BP+v/TErm/zcz/v/Z2er/+fn7/////////////v7+/7S0tP/a2tr/5ubm/+Xl\r\n        5f/e3t7/2tra/8nJyf9LS0sbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3d\r\n        3Rf8+/r2/4Rl//8lAP//dlj///////n49//z8vL/+/r6//38/P///v7//+fh///Asf//9/X/6ejo/+vr\r\n        6//39/f/9fX1//X19f/19PX/9fbv/8nJ6P88OPb/R0Ty/1NQ9f/o6ez////////////+df7///////b1\r\n        9v/BwcH/5eXl/+Pj4//d3d3/09PT/8PDw/+MjIxUoaGhapCQkEulpaUJAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAB/f38BAAAAANbW1ib7+/v+/3FO//8fAP//4Nj//fv6/+Tl5f/09PT/8/Pz//Pz8//29fX//Pr6///8\r\n        +//7+/v/8/Pz//X19f/19fX/9PT0//Pz8//z8/P/8PDx//j38f90cvb/g4L1/9rZ7v/v8O3///3/////\r\n        ////Jv///6z////////Z2dn/w8PD/+Xl5f/Ly8v/vLy8/8vKy//x7vH/+Pj4/9HR0f+VlZVaAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD///8B////Af/6+jP9/f3//0oc//91Uf///v7/6eno/+3t7f/z8/P/8vLy//Ly\r\n        8v/x8fH/8vLy//Pz8//y8vL/8/Pz//Ly8v/z8/P/8vLy//Hx8f/x8fH/8vLy/+/v8P/z9O7/9PXu//Hy\r\n        7P/s7O3//vz+////////L////xn////p///29fb/qKio/7+/v//T0tP/9vP2///////////+/////f//\r\n        //63t7eaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADVFRUTD4+Pj2/tHG//718v/y8fL/4eHi/+rq\r\n        6v/o6On/6Ojp/+jo6f/o6Oj/6Ojp/+jo6f/o6Oj/6ejp/+jo6P/o6On/5+fo/+fn5//m5uf/5ubm/+fo\r\n        5//r6uv/7Ozs/+zr7P/q6ur//Pj9////////Ov///wP///8q////6P//8fHx//Tz9P/+9f7//8D///+S\r\n        ///+Uv7//eD9/v7+/v7Pzs99AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAsBAQEdQAAAIGDhH/B5+Tg9urp\r\n        5f+qqqb/oqKe/6Ghnf+hop3/oKGc/6CgnP+goJz/oaGc/6ChnP+goZz/oaGd/6ChnP+foJv/n5+b/5+f\r\n        m/+fn5v/oKCc/6Skov/CwsL/3d3d/9bW1v/Gxsb/9O/0////////SP///wX///8C////ff///vb+//+p\r\n        ////LP///wD///8A////mP/+//////X19fS0tLQd////AgAAAAAAAAAAAAAAAAAAAAwBAQJuAgQAthAQ\r\n        GswODR7NKSk921ZWav1bW27/XV1w/11dcP9dXXD/XF1w/1xdcP9bXG//W1xv/1xcb/9cXG//XFxv/1xc\r\n        b/9cXG//XFxv/1tbb/9bXG//Wltu/2Zncf+ampn/wsHC/87Nzv/j3+P//ff9////////VP///wP///8B\r\n        ////F////yj///8A////AP///wD///8t////9P/++vn6+ry8vFH///8BAAAAAAAAAAAAAAAAAAAAAAAA\r\n        ACwQDjOxLyyd+EZFtP9PTbr/TUq2/01LuP9MS7f/TEq3/0xKtv9MSrb/TUu3/05LuP9OS7j/TUu4/01L\r\n        t/9NSrb/TUu3/01LuP9MS7b/TEq3/01Kt/9MSrb/m5rO/9va5f/29fb///7////0///+0/7//6z///+T\r\n        ////Kv///wH///8A////AP///wH///8C////Bv///3n////v//729fbauLi4MP///wEAAAAAAAAAAAAA\r\n        AAAAAAAAVVVVAwAAADQhH4XZLi2y/i0qs/8sKbL/LSqz/ycioP8nJKb/LCqz/ywqs/8sKrP/KCao/yMg\r\n        l/8iH5j/Ih+d/ycjrP8tKrX/KSWn/yMfmv8rKbD/LSm1/zAttP9IRr3///////z4/v/+gv7//zj///8V\r\n        ////AP///wD///8A////AP///wD///8A////AP///wH///8B////cP///////vz7/P++vr5g////An9/\r\n        fwIAAAAAAAAAAAAAAAAAAAAAPz9/BAAAADQbGpDfDgqt/RAOsv8QDrL/DQqq/z4+eP8wLob/EAy0/xAO\r\n        sP8OC7H/KiiI/1NUaP9QT2X/SUhl/yoqa/8NCqT/LSuE/1NUaP8UEaP/EQ6v/xMRsv8zMb3///////v2\r\n        ////P////wD///8A////AP///wD///8C////Af///wD///8A////AP///wL///8A////jv////////r5\r\n        +v+lpaWyAAAAAP///wEAAAAAAAAAAAAAAAAAAAAAPz9/BAAAADUdG5vfFRO7/RYVwP8WFcD/Eg+9/3Jx\r\n        nP9QUJ7/Dg6z/xIQtv8UEcD/SEao/5qaj/9tbLP/c3K2/4uKl/88O5j/T02l/5uai/8bGbT/ExO8/xUV\r\n        wP8YF8D/np7n/+Hg+P/7+v7//u/+///Z////sP///4j///9o////Hf///wH///8A////AP///wD///8C\r\n        ////D////57////9///k5OT8oaGhq5SUlC0AAAAAAAAAAAAAAAAAAAAAPz9/BAAAADYjIqbhKCfQ/Sgn\r\n        0v8pKNP/IyHP/4iHtv+WlaD/dXSM/2Rkiv8lJKr/XVzB/7y9r/80M8j/Hh7V/2Jhxf98fLP/Xly7/728\r\n        r/9JSYr/RkWF/zEvpP8oJ9L/Hx7Q/yIh0P9LStv/p6Te//Xz7//8+f3/////////////W////wL///8B\r\n        ////BP///wD///8A////A////wD///9Z///+//7+7e3t/6KiouuYmJgm////AgAAAAAAAAAAPz9/BAAA\r\n        ADcoJrDhOTfb/Tc23f84Nt7/MTDZ/5qZyv/Ly9H/zs3Y/9vc1P9xcLT/aWfP/9TWyP9JSNb/MzLf/2ho\r\n        zf+Vls3/b23M/9XUyv/Pzsf/19fG/3t7yP80Mt7/Ojje/zg33v8nJdv/T06+/9vbyv/Y2Nr/+PT4///9\r\n        ////Sv///wT///8D////Xv///8j///9h////Cv///wD///8A///+tv7//////uno6f+bm5t1AAAAAAAA\r\n        AAAAAAAASEhtAwAAADIwL7rgU1Ln/VBP7P9SUez/SEfn/7e44v+Zmdf/TU3B/5GQ0f+1teb/eXnf//T1\r\n        6f9YWMj/REO2/6ys0v+hoer/ionh//Hz6f9ubMz/amnJ/1hYzv9QT+n/UVDs/1FP7P9HR+3/XFvK/9vb\r\n        zP/Pz9D/9/P3////////Pf///wT///8V////2f///Pr8///9//7/4f/+/5///v9o//3/Qf///uf+//7+\r\n        /v3FxMWaAAAAAAAAAAAAAAAAAAAAAgAAABQ9PcbXbm7y/Wpr9/9sbfb/Zmb0/83N9f/08/D/7Ozn////\r\n        +P+vr/j/nZ3y////+//p6+f/+/vy//v9/v+Ih/b/qqrz/////P/q6+T/7e7j/9TW3/9rbO//bW32/2tr\r\n        9/9fXvf/X1/Z/9/fzv/Nzc//+/f7////////Mf///wP////F///8+/z/zMzM/crKyv/29PbI//7/////\r\n        ////+//+//j/+//////Dw8NW////AQAAAAAAAAAAf39/AgAAAAA+Ps68i4z2/H5++/9+fvr/gH/8/7S0\r\n        /v/Pz/7/0dD//8PD/P+MjPv/oJ7+/83N/P/R0f//ycn//6in/P9/f/z/o6T9/87O/P/Q0P//09L//8bF\r\n        //+Cgvz/f3/7/319+v9sbPv/cXDf/+Pj0v/Nzc7//vv+////////Kv///3r////////s6+z9wcHB/8zM\r\n        zJj///8F/v7+Uv/8/63//f/5/////+vr68fHx8cL////AQAAAAAAAAAAAAAAAKpUqgEzMsNMYF7+6W9v\r\n        +/56ev3+e3v+/3h4//93d/7/d3f+/3d3/v93d/7/eHf+/3h3/v93d/7/dnf+/3Z3//94eP7/eHf+/3h3\r\n        /v93d/7/d3f+/3d3/f94eP7/eHj+/3Rz//9gX/L/ysvX/9bV1P/NzM3///7/////////Vv////z///z7\r\n        /P3Qz9Dp0NDQUf///wH///8B////Af///wH+/P4d////JtTU1AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD///8B39/fCMvL/zZkZKBGGRlUl6Ch3Pyur+v/rK3p/6us6P+rrOj/qqvn/6ur5/+qq+f/qarm/6ip\r\n        5f+oqeX/p6jk/6eo5P+mpuL/pabi/6Sl4f+jpOD/oqPf/6io3v/X2NX/0NHT/9DQz//FxcX//Pz8////\r\n        /////v///////NXV1f/MzMxeAAAAAP///wIAAAAAAAAAAAAAAAD///8C////AwAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAD///8BAAAAAAAAAAAAAAAEEBAEbt/f0vrx8eT/7u7g/+3t3//t7d//7Ozf/+zs\r\n        3//r7N7/6+vd/+rq3P/p6dz/6Ojb/+fo2v/m5tn/5ubY/+Xl2P/k5Nb/4+LW/+Dg1P/T09T/0dHQ/8zM\r\n        zP+6urv/0dHR///////////94+Pj/8vLy73l5eUF////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMvL/wIKCgoLEBARdtHR0vri4uP/39/g/97e\r\n        3//e3t//3t7f/93d3//c3N7/29vd/9vb3P/a2tz/2tnb/9nZ2v/Y2Nn/19fY/9bW1//V1db/09PU/9HR\r\n        0//Ozs7/ycnJ/8LCwv+vr6//t7e3/9XV1f3MzMzwzs7Oaevr6wb///8BAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wEAAAAKDw8PddLS\r\n        0vvi4uL/39/f/97e3v/d3d3/3d3d/9zc3P/a2tr/2dnZ/9nZ2f/X19f/1tbW/9fX1//V1dX/1dXV/9TU\r\n        1P/R0dH/z8/P/8zMzP/Gxsb/vr6+/7W1tf+lpaX/u7u7/L6+vv/CwsJxAAAAAP///wMAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//\r\n        /wEAAAAKERERdNPT0/rg4OD/3t7e/93d3f/b29v/2tra/9nZ2f/X19f/1tbW/9XV1f/U1NT/09PT/9PT\r\n        0//R0dH/0NDQ/8/Pz//MzMz/ycnJ/8XFxf++vr7/tLS0/62trf+ioqL9tbW1/7a2ttPo6OgL////AwAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAADGRkZPOLi4vfd3d3929vb/dra2v3X19f91tbW/dTU1P3S0tL9z8/P/c/P\r\n        z/3Ozs79zMzM/cvLy/3IyMj9xcXF/cPDw/2+vr79ubm5/bW1tf2tra39o6Oj/Z2dnf6rq6vjubm5d+vr\r\n        6w3///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtra2B/f392r29vZ19vb2dfb29nX19fV19PT0dfT0\r\n        9HX09PR18fHxdfHx8XXx8fF18fHxde/v73Xt7e116+vrdevr63Xo6Oh15+fndeTk5HXg4OB14eHhb+vr\r\n        60729vYPAAAAAP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAP//////////////////////gAAAAD////8AAAAAH/+A/wAAAAAf/wD/AAAAAB//AP8A\r\n        AAAAH/8A/wAAAAAf/wD/gAAAAB//AP8AAAAAH/+A/gAAAAAf/wD+AAAAAB/+AP4AAAAAH/4A/gAAAAAf\r\n        /gD+AAAAAB/+AP4AAAAAH/4A/gAAAAAf/gDAAAAAAB/+AIAAAAAAH8AAgAAAAAAfgACAAAAAAB+AAIAA\r\n        AAAAH4AA8AAAAAAfgAD+AAAAAB/wAP4AAAAAH/4A/gAAAAAf/gD+AAAAAAP+AP4AAAAAAf4A/gAAAAAD\r\n        /gD8AAAAAAP+APgAAAAAB/wA8AAAAAAP+ADwAAAAAB/wAPAAAAAAD/AA8AAAAAAH8ADwAAAAAAPwAPAA\r\n        AAAAA/AA8AAAAAAB8ADwAAAAAAPwAPAAAAAAw/AA+AAAAAP/8AD/AAAAB//4AP+AAAAH//8A/4AAAB//\r\n        /4D/gAAAP///gP+AAAA///+A/4AAAP///4D/////////gA==\r\n</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/AutoBookmarkForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class AutoBookmarkForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows Form Designer generated code\r\n\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1;\r\n\t\t\tthis._LoadListButton = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SaveListButton = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._BookmarkConditionBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._ConditionColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._LevelColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._BoldColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItalicColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ColorColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._OpenColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._GoToTopColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._AutoBookmarkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._MergeAdjacentTitleBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._Toolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._SetPatternMenu = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\tthis._RemoveButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._KeepExistingBookmarksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\ttoolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BookmarkConditionBox)).BeginInit();\r\n\t\t\tthis._Toolbar.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// toolStripDropDownButton1\r\n\t\t\t// \r\n\t\t\ttoolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._LoadListButton,\r\n            this._SaveListButton});\r\n\t\t\ttoolStripDropDownButton1.Image = global::PDFPatcher.Properties.Resources.TextFile;\r\n\t\t\ttoolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\ttoolStripDropDownButton1.Name = \"toolStripDropDownButton1\";\r\n\t\t\ttoolStripDropDownButton1.Size = new System.Drawing.Size(109, 22);\r\n\t\t\ttoolStripDropDownButton1.Text = \"识别条件列表\";\r\n\t\t\t// \r\n\t\t\t// _LoadListButton\r\n\t\t\t// \r\n\t\t\tthis._LoadListButton.Image = global::PDFPatcher.Properties.Resources.OpenFile;\r\n\t\t\tthis._LoadListButton.Name = \"_LoadListButton\";\r\n\t\t\tthis._LoadListButton.Size = new System.Drawing.Size(180, 22);\r\n\t\t\tthis._LoadListButton.Text = \"加载条件列表...\";\r\n\t\t\t// \r\n\t\t\t// _SaveListButton\r\n\t\t\t// \r\n\t\t\tthis._SaveListButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._SaveListButton.Name = \"_SaveListButton\";\r\n\t\t\tthis._SaveListButton.Size = new System.Drawing.Size(180, 22);\r\n\t\t\tthis._SaveListButton.Text = \"保存条件列表...\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkConditionBox\r\n\t\t\t// \r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._ConditionColumn);\r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._LevelColumn);\r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._BoldColumn);\r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._ItalicColumn);\r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._ColorColumn);\r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._OpenColumn);\r\n\t\t\tthis._BookmarkConditionBox.AllColumns.Add(this._GoToTopColumn);\r\n\t\t\tthis._BookmarkConditionBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BookmarkConditionBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._BookmarkConditionBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._BookmarkConditionBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._ConditionColumn,\r\n            this._LevelColumn,\r\n            this._BoldColumn,\r\n            this._ItalicColumn,\r\n            this._ColorColumn,\r\n            this._OpenColumn,\r\n            this._GoToTopColumn});\r\n\t\t\tthis._BookmarkConditionBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._BookmarkConditionBox.GridLines = true;\r\n\t\t\tthis._BookmarkConditionBox.HideSelection = false;\r\n\t\t\tthis._BookmarkConditionBox.Location = new System.Drawing.Point(14, 24);\r\n\t\t\tthis._BookmarkConditionBox.Name = \"_BookmarkConditionBox\";\r\n\t\t\tthis._BookmarkConditionBox.ShowGroups = false;\r\n\t\t\tthis._BookmarkConditionBox.Size = new System.Drawing.Size(453, 143);\r\n\t\t\tthis._BookmarkConditionBox.TabIndex = 1;\r\n\t\t\tthis._BookmarkConditionBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._BookmarkConditionBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _ConditionColumn\r\n\t\t\t// \r\n\t\t\tthis._ConditionColumn.IsEditable = false;\r\n\t\t\tthis._ConditionColumn.Text = \"识别条件\";\r\n\t\t\tthis._ConditionColumn.Width = 148;\r\n\t\t\t// \r\n\t\t\t// _LevelColumn\r\n\t\t\t// \r\n\t\t\tthis._LevelColumn.Text = \"书签级别\";\r\n\t\t\t// \r\n\t\t\t// _BoldColumn\r\n\t\t\t// \r\n\t\t\tthis._BoldColumn.CheckBoxes = true;\r\n\t\t\tthis._BoldColumn.Text = \"粗体\";\r\n\t\t\tthis._BoldColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._BoldColumn.Width = 37;\r\n\t\t\t// \r\n\t\t\t// _ItalicColumn\r\n\t\t\t// \r\n\t\t\tthis._ItalicColumn.CheckBoxes = true;\r\n\t\t\tthis._ItalicColumn.Text = \"斜体\";\r\n\t\t\tthis._ItalicColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._ItalicColumn.Width = 37;\r\n\t\t\t// \r\n\t\t\t// _ColorColumn\r\n\t\t\t// \r\n\t\t\tthis._ColorColumn.IsEditable = false;\r\n\t\t\tthis._ColorColumn.Text = \"颜色\";\r\n\t\t\t// \r\n\t\t\t// _OpenColumn\r\n\t\t\t// \r\n\t\t\tthis._OpenColumn.CheckBoxes = true;\r\n\t\t\tthis._OpenColumn.Text = \"展开\";\r\n\t\t\tthis._OpenColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._OpenColumn.Width = 37;\r\n\t\t\t// \r\n\t\t\t// _GoToTopColumn\r\n\t\t\t// \r\n\t\t\tthis._GoToTopColumn.CheckBoxes = true;\r\n\t\t\tthis._GoToTopColumn.Text = \"到页首\";\r\n\t\t\tthis._GoToTopColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._GoToTopColumn.Width = 49;\r\n\t\t\t// \r\n\t\t\t// _AutoBookmarkButton\r\n\t\t\t// \r\n\t\t\tthis._AutoBookmarkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AutoBookmarkButton.Image = global::PDFPatcher.Properties.Resources.AutoBookmark;\r\n\t\t\tthis._AutoBookmarkButton.Location = new System.Drawing.Point(367, 4);\r\n\t\t\tthis._AutoBookmarkButton.Name = \"_AutoBookmarkButton\";\r\n\t\t\tthis._AutoBookmarkButton.Size = new System.Drawing.Size(101, 23);\r\n\t\t\tthis._AutoBookmarkButton.TabIndex = 4;\r\n\t\t\tthis._AutoBookmarkButton.Text = \"生成书签(&K)\";\r\n\t\t\tthis._AutoBookmarkButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._AutoBookmarkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._AutoBookmarkButton.Click += new System.EventHandler(this._AutoBookmarkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MergeAdjacentTitleBox\r\n\t\t\t// \r\n\t\t\tthis._MergeAdjacentTitleBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._MergeAdjacentTitleBox.AutoSize = true;\r\n\t\t\tthis._MergeAdjacentTitleBox.Checked = true;\r\n\t\t\tthis._MergeAdjacentTitleBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._MergeAdjacentTitleBox.Location = new System.Drawing.Point(14, 171);\r\n\t\t\tthis._MergeAdjacentTitleBox.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\r\n\t\t\tthis._MergeAdjacentTitleBox.Name = \"_MergeAdjacentTitleBox\";\r\n\t\t\tthis._MergeAdjacentTitleBox.Size = new System.Drawing.Size(168, 16);\r\n\t\t\tthis._MergeAdjacentTitleBox.TabIndex = 5;\r\n\t\t\tthis._MergeAdjacentTitleBox.Text = \"合并同字体尺寸的相邻标题\";\r\n\t\t\tthis._MergeAdjacentTitleBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _Toolbar\r\n\t\t\t// \r\n\t\t\tthis._Toolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            toolStripDropDownButton1,\r\n            this._SetPatternMenu,\r\n            this._RemoveButton});\r\n\t\t\tthis._Toolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._Toolbar.Name = \"_Toolbar\";\r\n\t\t\tthis._Toolbar.Size = new System.Drawing.Size(485, 25);\r\n\t\t\tthis._Toolbar.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// _SetPatternMenu\r\n\t\t\t// \r\n\t\t\tthis._SetPatternMenu.Enabled = false;\r\n\t\t\tthis._SetPatternMenu.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\tthis._SetPatternMenu.Name = \"_SetPatternMenu\";\r\n\t\t\tthis._SetPatternMenu.Size = new System.Drawing.Size(109, 22);\r\n\t\t\tthis._SetPatternMenu.Text = \"文本识别模式\";\r\n\t\t\t// \r\n\t\t\t// _RemoveButton\r\n\t\t\t// \r\n\t\t\tthis._RemoveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._RemoveButton.Enabled = false;\r\n\t\t\tthis._RemoveButton.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\tthis._RemoveButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._RemoveButton.Name = \"_RemoveButton\";\r\n\t\t\tthis._RemoveButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._RemoveButton.Text = \"删除\";\r\n\t\t\tthis._RemoveButton.Click += new System.EventHandler(this._RemoveButton_Click);\r\n\t\t\t// \r\n\t\t\t// _KeepExistingBookmarksBox\r\n\t\t\t// \r\n\t\t\tthis._KeepExistingBookmarksBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._KeepExistingBookmarksBox.AutoSize = true;\r\n\t\t\tthis._KeepExistingBookmarksBox.Location = new System.Drawing.Point(223, 171);\r\n\t\t\tthis._KeepExistingBookmarksBox.Name = \"_KeepExistingBookmarksBox\";\r\n\t\t\tthis._KeepExistingBookmarksBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._KeepExistingBookmarksBox.TabIndex = 7;\r\n\t\t\tthis._KeepExistingBookmarksBox.Text = \"保留原有书签\";\r\n\t\t\tthis._KeepExistingBookmarksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// AutoBookmarkForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._AutoBookmarkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(485, 195);\r\n\t\t\tthis.Controls.Add(this._KeepExistingBookmarksBox);\r\n\t\t\tthis.Controls.Add(this._MergeAdjacentTitleBox);\r\n\t\t\tthis.Controls.Add(this._AutoBookmarkButton);\r\n\t\t\tthis.Controls.Add(this._BookmarkConditionBox);\r\n\t\t\tthis.Controls.Add(this._Toolbar);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"AutoBookmarkForm\";\r\n\t\t\tthis.ShowIcon = false;\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r\n\t\t\tthis.Text = \"自动生成书签\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BookmarkConditionBox)).EndInit();\r\n\t\t\tthis._Toolbar.ResumeLayout(false);\r\n\t\t\tthis._Toolbar.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _BookmarkConditionBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ConditionColumn;\r\n\t\tprivate System.Windows.Forms.Button _AutoBookmarkButton;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _LevelColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _BoldColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ItalicColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ColorColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _OpenColumn;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeAdjacentTitleBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _GoToTopColumn;\r\n\t\tprivate System.Windows.Forms.ToolStrip _Toolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _LoadListButton;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SaveListButton;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepExistingBookmarksBox;\r\n\t\tprivate System.Windows.Forms.ToolStripDropDownButton _SetPatternMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _RemoveButton;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/AutoBookmarkForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Functions.Editor;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class AutoBookmarkForm : DraggableForm\r\n\t{\r\n\t\tList<EditModel.AutoBookmarkSettings> _list;\r\n\t\treadonly Controller _controller;\r\n\r\n\t\tinternal AutoBookmarkForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\tinternal AutoBookmarkForm(Controller controller) : this() {\r\n\t\t\t_controller = controller;\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tMinimumSize = Size;\r\n\t\t\t_Toolbar.ScaleIcons(16);\r\n\r\n\t\t\t_ConditionColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => $\"字体为{o.FontName} 尺寸为{o.FontSize}{(o.MatchPattern != null ? o.MatchPattern.ToString() : String.Empty)}\";\r\n\t\t\t});\r\n\t\t\t_LevelColumn.CellEditUseWholeCell = true;\r\n\t\t\t_LevelColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.Level;\r\n\t\t\t\tc.AspectPutter = (o, v) => o.Level = Convert.ToInt32(v).LimitInRange(1, 10);\r\n\t\t\t});\r\n\t\t\t_BoldColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.Bookmark.IsBold;\r\n\t\t\t\tc.AspectPutter = (o, v) => o.Bookmark.IsBold = (bool)v;\r\n\t\t\t});\r\n\t\t\t_ItalicColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.Bookmark.IsItalic;\r\n\t\t\t\tc.AspectPutter = (o, v) => o.Bookmark.IsItalic = (bool)v;\r\n\t\t\t});\r\n\t\t\t_ColorColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => \"点击设置颜色\";\r\n\t\t\t});\r\n\t\t\t_OpenColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.Bookmark.IsOpened;\r\n\t\t\t\tc.AspectPutter = (o, v) => o.Bookmark.IsOpened = (bool)v;\r\n\t\t\t});\r\n\t\t\t_GoToTopColumn.AsTyped<EditModel.AutoBookmarkSettings>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.Bookmark.GoToTop;\r\n\t\t\t\tc.AspectPutter = (o, v) => o.Bookmark.GoToTop = (bool)v;\r\n\t\t\t});\r\n\t\t\t_BookmarkConditionBox.ScaleColumnWidths();\r\n\t\t\t_BookmarkConditionBox.IsSimpleDragSource = true;\r\n\t\t\t_BookmarkConditionBox.IsSimpleDropSink = true;\r\n\t\t\t_BookmarkConditionBox.CellClick += (s, args) => {\r\n\t\t\t\tif (args.ColumnIndex == _ColorColumn.Index) {\r\n\t\t\t\t\tvar b = ((EditModel.AutoBookmarkSettings)args.Model).Bookmark;\r\n\t\t\t\t\tthis.ShowCommonDialog<ColorDialog>(\r\n\t\t\t\t\t\tf => f.Color = b.ForeColor == Color.Transparent ? Color.White : b.ForeColor,\r\n\t\t\t\t\t\tf => {\r\n\t\t\t\t\t\t\tb.ForeColor = f.Color == Color.White || f.Color == Color.Black ? Color.Transparent : f.Color;\r\n\t\t\t\t\t\t\t_BookmarkConditionBox.RefreshItem(args.Item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_BookmarkConditionBox.RowFormatter = (r) => {\r\n\t\t\t\tvar b = ((EditModel.AutoBookmarkSettings)r.RowObject).Bookmark;\r\n\t\t\t\tr.UseItemStyleForSubItems = false;\r\n\t\t\t\tr.SubItems[_ColorColumn.Index].ForeColor = b.ForeColor == Color.Transparent ? _BookmarkConditionBox.ForeColor : b.ForeColor;\r\n\t\t\t};\r\n\t\t\t_BookmarkConditionBox.SelectionChanged += _BookmarkConditionBox_SelectionChanged;\r\n\t\t\t_LoadListButton.Click += _LoadListButton_Click;\r\n\t\t\t_SaveListButton.Click += _SaveListButton_Click;\r\n\r\n\t\t\tQuickSelectCommand.RegisterMenuItemsWithPattern(_SetPatternMenu.DropDownItems);\r\n\t\t\t_SetPatternMenu.DropDownItems.AddRange(new ToolStripItem[] {\r\n\t\t\t\tnew ToolStripSeparator(),\r\n\t\t\t\tnew ToolStripMenuItem(\"自定义文本匹配模式...\") {\r\n\t\t\t\t\tTag = \"CustomPattern\"\r\n\t\t\t\t},\r\n\t\t\t\tnew ToolStripMenuItem(\"清除文本匹配模式\") {\r\n\t\t\t\t\tTag = \"ClearPattern\",\r\n\t\t\t\t\tImage = Properties.Resources.Delete\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t_SetPatternMenu.DropDownItemClicked += _SetPattern_DropDownItemClicked;\r\n\t\t}\r\n\r\n\t\tvoid _BookmarkConditionBox_SelectionChanged(object sender, EventArgs e) {\r\n\t\t\t_SetPatternMenu.Enabled = _RemoveButton.Enabled = _BookmarkConditionBox.SelectedItems.Count > 0;\r\n\t\t}\r\n\r\n\t\tvoid _SetPattern_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tif (e.ClickedItem.Tag is MatchPattern p) {\r\n\t\t\t\tSetMatchPatternToSelectedBookmarkStyles(p);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (e.ClickedItem.Tag is string s) {\r\n\t\t\t\tswitch (s) {\r\n\t\t\t\t\tcase \"ClearPattern\":\r\n\t\t\t\t\t\tSetMatchPatternToSelectedBookmarkStyles(null);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tcase \"CustomPattern\":\r\n\t\t\t\t\t\tp = (_BookmarkConditionBox.SelectedObject as EditModel.AutoBookmarkSettings)?.MatchPattern;\r\n\t\t\t\t\t\tthis.ShowDialog<CustomPatternForm>(f => {\r\n\t\t\t\t\t\t\tif (p != null) {\r\n\t\t\t\t\t\t\t\tf.Pattern = p.Text;\r\n\t\t\t\t\t\t\t\tf.MatchCase = p.MatchCase;\r\n\t\t\t\t\t\t\t\tf.FullMatch = p.FullMatch;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}, f => {\r\n\t\t\t\t\t\t\tSetMatchPatternToSelectedBookmarkStyles(f.Pattern.Length != 0 ? new MatchPattern(f.Pattern, f.MatchCase, f.FullMatch, true) : null);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SetMatchPatternToSelectedBookmarkStyles(MatchPattern p) {\r\n\t\t\tforeach (EditModel.AutoBookmarkSettings item in _BookmarkConditionBox.SelectedObjects) {\r\n\t\t\t\titem.MatchPattern = p;\r\n\t\t\t}\r\n\t\t\t_BookmarkConditionBox.RefreshObjects(_BookmarkConditionBox.SelectedObjects);\r\n\t\t}\r\n\r\n\t\tinternal void SetValues(List<EditModel.AutoBookmarkSettings> list) {\r\n\t\t\t_BookmarkConditionBox.Objects = _list = list;\r\n\t\t}\r\n\r\n\t\tvoid _RemoveButton_Click(object sender, EventArgs e) {\r\n\t\t\t_BookmarkConditionBox.SelectedObjects.ForEach<EditModel.AutoBookmarkSettings>(i => _list.Remove(i));\r\n\t\t\t_BookmarkConditionBox.RemoveObjects(_BookmarkConditionBox.SelectedObjects);\r\n\t\t}\r\n\r\n\t\tvoid _AutoBookmarkButton_Click(object sender, EventArgs e) {\r\n\t\t\tSyncList();\r\n\t\t\t_controller.AutoBookmark(_list, _MergeAdjacentTitleBox.Checked, _KeepExistingBookmarksBox.Checked);\r\n\t\t}\r\n\r\n\t\tvoid _SaveListButton_Click(object sender, EventArgs e) {\r\n\t\t\tthis.ShowCommonDialog<SaveFileDialog>(d => {\r\n\t\t\t\td.Title = \"请输入需要保存自动书签格式列表的文件名\";\r\n\t\t\t\td.Filter = Constants.FileExtensions.XmlFilter;\r\n\t\t\t\td.DefaultExt = Constants.FileExtensions.Xml;\r\n\t\t\t}, d => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tSyncList();\r\n\t\t\t\t\tusing (var w = new FilePath(d.FileName).OpenTextWriter(false, null)) {\r\n\t\t\t\t\t\tSerialize(_list, w);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tthis.ErrorBox(\"保存自动书签格式列表时出现错误\", ex);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tstatic void Serialize(List<EditModel.AutoBookmarkSettings> list, System.IO.StreamWriter writer) {\r\n\t\t\tusing (var x = System.Xml.XmlWriter.Create(writer)) {\r\n\t\t\t\tx.WriteStartDocument();\r\n\t\t\t\tx.WriteStartElement(\"autoBookmark\");\r\n\t\t\t\tforeach (var item in list) {\r\n\t\t\t\t\tx.WriteStartElement(\"style\");\r\n\t\t\t\t\tx.WriteAttributeString(\"fontName\", item.FontName);\r\n\t\t\t\t\tx.WriteAttributeString(\"fontSize\", item.FontSize.ToText());\r\n\t\t\t\t\tx.WriteAttributeString(\"level\", item.Level.ToText());\r\n\t\t\t\t\titem.Bookmark.WriteXml(x);\r\n\t\t\t\t\titem.MatchPattern?.WriteXml(x);\r\n\t\t\t\t\tx.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t\tx.WriteEndElement();\r\n\t\t\t\tx.WriteEndDocument();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _LoadListButton_Click(object sender, EventArgs e) {\r\n\t\t\tthis.ShowCommonDialog<OpenFileDialog>(d => {\r\n\t\t\t\td.Title = \"请选择需要打开的自动书签格式列表\";\r\n\t\t\t\td.Filter = Constants.FileExtensions.XmlFilter;\r\n\t\t\t\td.DefaultExt = Constants.FileExtensions.Xml;\r\n\t\t\t}, d => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t_list.Clear();\r\n\t\t\t\t\t_list.AddRange(Deserialize(d.FileName));\r\n\t\t\t\t\t_BookmarkConditionBox.Objects = _list;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tthis.ErrorBox(\"加载自动书签格式列表时出现错误\", ex);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tstatic IEnumerable<EditModel.AutoBookmarkSettings> Deserialize(FilePath path) {\r\n\t\t\tvar doc = new System.Xml.XmlDocument();\r\n\t\t\tdoc.Load(path);\r\n\t\t\tforeach (System.Xml.XmlElement item in doc.DocumentElement.GetElementsByTagName(\"style\")) {\r\n\t\t\t\tvar s = new EditModel.AutoBookmarkSettings(\r\n\t\t\t\t\titem.GetValue(\"level\", 1),\r\n\t\t\t\t\titem.GetValue(\"fontName\"),\r\n\t\t\t\t\titem.GetValue(\"fontSize\", 0));\r\n\t\t\t\ts.Bookmark.ReadXml(item.GetElement(\"bookmark\").CreateNavigator().ReadSubtree());\r\n\t\t\t\tvar p = item.GetElement(\"pattern\");\r\n\t\t\t\tif (p != null) {\r\n\t\t\t\t\ts.MatchPattern = new Model.MatchPattern();\r\n\t\t\t\t\ts.MatchPattern.ReadXml(p.CreateNavigator().ReadSubtree());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tyield return s;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SyncList() {\r\n\t\t\t_list.Clear();\r\n\t\t\t_list.AddRange(new TypedObjectListView<EditModel.AutoBookmarkSettings>(_BookmarkConditionBox).Objects);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/AutoBookmarkForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"toolStripDropDownButton1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Toolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/AutoResizingTextBox.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed class AutoResizingTextBox : TextBox\r\n\t{\r\n\t\treadonly int _MinHeight, _MaxHeight, _Width;\r\n\r\n\t\tpublic AutoResizingTextBox(Rectangle bound, string text, Control parent = null) {\r\n\t\t\tBounds = bound;\r\n\t\t\t_Width = bound.Width;\r\n\t\t\t_MinHeight = bound.Height;\r\n\t\t\t_MaxHeight = bound.Height * 8;\r\n\t\t\tMaximumSize = new Size(_Width, _MaxHeight);\r\n\t\t\tMultiline = true;\r\n\t\t\tParent = parent;\r\n\t\t\tAcceptsReturn = text?.IndexOf('\\n') >= 0;\r\n\t\t\tText = text;\r\n\t\t}\r\n\r\n\t\tvoid ResizeForText() {\r\n\t\t\tusing (var g = CreateGraphics()) {\r\n\t\t\t\t// NOTE: 当文本无处换行但又溢出文本框时，PreferredSize 的计算有误，故改用 MeasureString\r\n\t\t\t\tvar height = g.MeasureString(Text, Font, _Width, StringFormat.GenericDefault).Height + Margin.Vertical;\r\n\t\t\t\tSize = new Size(_Width, Math.Min(Math.Max((int)height, _MinHeight), _MaxHeight));\r\n\t\t\t\tif (Parent?.ClientRectangle.Height < Bottom) {\r\n\t\t\t\t\tLocation = new Point(Location.X, Location.Y - (Bottom - Parent.ClientRectangle.Height));\r\n\t\t\t\t}\r\n\t\t\t\t// NOTE：如果解除下面的注释，可能会在编辑过程中抛出 ObjectDisposedException\r\n\t\t\t\t//if (height > _MaxHeight) {\r\n\t\t\t\t//\tScrollBars = ScrollBars.Vertical;\r\n\t\t\t\t//}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnTextChanged(EventArgs e) {\r\n\t\t\tbase.OnTextChanged(e);\r\n\t\t\tResizeForText();\r\n\t\t}\r\n\r\n\t\tprotected override void OnKeyDown(KeyEventArgs e) {\r\n\t\t\tif (e.KeyData == (Keys.Shift | Keys.Enter)) {\r\n\t\t\t\tAcceptsReturn = true;\r\n\t\t\t}\r\n\t\t\telse if (e.KeyData == (Keys.Control | Keys.Enter)) {\r\n\t\t\t\te.Handled = true;\r\n\t\t\t\te.SuppressKeyPress = true;\r\n\t\t\t\tParent.Focus();\r\n\t\t\t}\r\n\t\t\tbase.OnKeyDown(e);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/BookmarkEditorView.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class BookmarkEditorView\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container ();\r\n\t\t\tthis._BookmarkNameColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._BookmarkOpenColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._BookmarkPageColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\tthis._ActionColumn = new BrightIdeasSoftware.OLVColumn ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _BookmarkBox\r\n\t\t\t// \r\n\t\t\tthis.AllColumns.Add (this._BookmarkNameColumn);\r\n\t\t\tthis.AllColumns.Add (this._BookmarkOpenColumn);\r\n\t\t\tthis.AllColumns.Add (this._BookmarkPageColumn);\r\n\t\t\tthis.AllColumns.Add (this._ActionColumn);\r\n\t\t\tthis.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis.Columns.AddRange (new System.Windows.Forms.ColumnHeader[] {\r\n            this._BookmarkNameColumn,\r\n            this._BookmarkOpenColumn,\r\n            this._BookmarkPageColumn,\r\n            this._ActionColumn});\r\n\t\t\tthis.CopySelectionOnControlC = false;\r\n\t\t\tthis.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis.GridLines = true;\r\n\t\t\tthis.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis.IsSimpleDragSource = true;\r\n\t\t\tthis.IsSimpleDropSink = true;\r\n\t\t\tthis.LabelEdit = true;\r\n\t\t\tthis.Location = new System.Drawing.Point (0, 0);\r\n\t\t\tthis.Name = \"_BookmarkBox\";\r\n\t\t\tthis.OwnerDraw = true;\r\n\t\t\tthis.RevealAfterExpand = false;\r\n\t\t\tthis.ShowGroups = false;\r\n\t\t\tthis.Size = new System.Drawing.Size (408, 208);\r\n\t\t\tthis.TabIndex = 0;\r\n\t\t\tthis.UseCellFormatEvents = false;\r\n\t\t\tthis.UseHotItem = false;\r\n\t\t\tthis.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis.UseHyperlinks = true;\r\n\t\t\tthis.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis.VirtualMode = true;\r\n\t\t\t// \r\n\t\t\t// _BookmarkNameColumn\r\n\t\t\t// \r\n\t\t\tthis._BookmarkNameColumn.AspectName = \"\";\r\n\t\t\tthis._BookmarkNameColumn.Text = \"书签文本\";\r\n\t\t\tthis._BookmarkNameColumn.Width = 160;\r\n\t\t\t// \r\n\t\t\t// _BookmarkOpenColumn\r\n\t\t\t// \r\n\t\t\tthis._BookmarkOpenColumn.AspectName = \"\";\r\n\t\t\tthis._BookmarkOpenColumn.CheckBoxes = true;\r\n\t\t\tthis._BookmarkOpenColumn.DisplayIndex = 2;\r\n\t\t\tthis._BookmarkOpenColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._BookmarkOpenColumn.Text = \"打开\";\r\n\t\t\tthis._BookmarkOpenColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\tthis._BookmarkOpenColumn.Width = 40;\r\n\t\t\t// \r\n\t\t\t// _BookmarkPageColumn\r\n\t\t\t// \r\n\t\t\tthis._BookmarkPageColumn.AspectName = \"\";\r\n\t\t\tthis._BookmarkPageColumn.DisplayIndex = 1;\r\n\t\t\tthis._BookmarkPageColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._BookmarkPageColumn.Text = \"页码\";\r\n\t\t\tthis._BookmarkPageColumn.Width = 42;\r\n\t\t\t// \r\n\t\t\t// _ActionColumn\r\n\t\t\t// \r\n\t\t\tthis._ActionColumn.AspectName = \"\";\r\n\t\t\tthis._ActionColumn.Hyperlink = true;\r\n\t\t\tthis._ActionColumn.IsEditable = false;\r\n\t\t\tthis._ActionColumn.Text = \"书签动作\";\r\n\t\t\tthis._ActionColumn.Width = 100;\r\n\t\t\t// \r\n\t\t\t// Editor\r\n\t\t\t// \r\n\t\t\tthis.Name = \"BookmarkEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (408, 208);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _BookmarkNameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _BookmarkOpenColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _BookmarkPageColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ActionColumn;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/BookmarkEditorView.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class BookmarkEditorView : TreeListView\r\n\t{\r\n\t\t[EditorBrowsable(EditorBrowsableState.Never)]\r\n\t\tinternal static List<BookmarkElement> _copiedBookmarks;\r\n\r\n\t\t[EditorBrowsable(EditorBrowsableState.Never)]\r\n\t\tinternal UndoManager Undo { get; set; }\r\n\r\n\t\tpublic bool OperationAffectsDescendants { get; set; }\r\n\t\tpublic OLVColumn BookmarkOpenColumn => _BookmarkOpenColumn;\r\n\t\tpublic OLVColumn BookmarkNameColumn => _BookmarkNameColumn;\r\n\t\tpublic OLVColumn BookmarkPageColumn => _BookmarkPageColumn;\r\n\t\tpublic bool HasMarker => _markers.Count > 0;\r\n\r\n\t\treadonly Dictionary<BookmarkElement, Color> _markers = new Dictionary<BookmarkElement, Color>();\r\n\r\n\t\tpublic event EventHandler BookmarkChanged;\r\n\r\n\t\tpublic BookmarkEditorView() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tInitEditorBox();\r\n\t\t}\r\n\r\n\t\tvoid InitEditorBox() {\r\n\t\t\tif (IsDesignMode) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tUseOverlays = false;\r\n\t\t\t#region 修复树视图无法正确选择节点的问题\r\n\t\t\tSmallImageList = new ImageList();\r\n\t\t\t#endregion\r\n\t\t\tthis.SetTreeViewLine();\r\n\t\t\tthis.FixEditControlWidth();\r\n\t\t\t// 避免与 OnCellEditFinished 的行为冲突\r\n\t\t\tCellEditKeyEngine.SetKeyBehaviour(Keys.Tab, CellEditCharacterBehaviour.Ignore, CellEditAtEdgeBehaviour.Ignore);\r\n\t\t\tCanExpandGetter = (object x) => x is BookmarkElement e && e.HasSubBookmarks;\r\n\t\t\tChildrenGetter = (object x) => ((BookmarkElement)x).SubBookmarks;\r\n\t\t\t_BookmarkNameColumn.AutoCompleteEditorMode = AutoCompleteMode.Suggest;\r\n\t\t\tSelectedBackColor = UnfocusedSelectedBackColor = BackColor;\r\n\t\t\tSelectedForeColor = UnfocusedSelectedForeColor = ForeColor;\r\n\t\t\tHideSelection = true;\r\n\t\t\tSelectedRowDecoration = new RowBorderDecoration() {\r\n\t\t\t\tFillBrush = new SolidBrush(Color.FromArgb(40, SystemColors.Highlight)),\r\n\t\t\t\tBoundsPadding = new Size(0, 0),\r\n\t\t\t\tCornerRounding = 3,\r\n\t\t\t\tBorderPen = new Pen(Color.FromArgb(216, SystemColors.Highlight))\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<BookmarkElement>(_BookmarkNameColumn) {\r\n\t\t\t\tAspectGetter = (e) => e.Title,\r\n\t\t\t\tAspectPutter = (e, newValue) => {\r\n\t\t\t\t\tvar s = newValue as string;\r\n\t\t\t\t\tif (e.Title == s) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar p = new ReplaceTitleTextProcessor(s);\r\n\t\t\t\t\tUndo?.AddUndo(\"编辑书签文本\", p.Process(e));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<BookmarkElement>(_BookmarkOpenColumn) {\r\n\t\t\t\tAspectGetter = (e) => e == null ? false : (object)e.IsOpen,\r\n\t\t\t\tAspectPutter = (e, newValue) => {\r\n\t\t\t\t\tif (e == null || e.HasSubBookmarks == false) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar p = new BookmarkOpenStatusProcessor((bool)newValue);\r\n\t\t\t\t\tUndo.AddUndo(p.Name, p.Process(e));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tnew TypedColumn<XmlElement>(_BookmarkPageColumn) {\r\n\t\t\t\tAspectGetter = (e) => {\r\n\t\t\t\t\tif (e == null) {\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tint p = e.GetValue(Constants.DestinationAttributes.Page, 0);\r\n\t\t\t\t\tif (e.HasAttribute(Constants.DestinationAttributes.FirstPageNumber)) {\r\n\t\t\t\t\t\tint o = e.GetValue(Constants.DestinationAttributes.FirstPageNumber, 0);\r\n\t\t\t\t\t\tif (o > 0) {\r\n\t\t\t\t\t\t\tp += o;\r\n\t\t\t\t\t\t\te.RemoveAttribute(Constants.DestinationAttributes.FirstPageNumber);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t},\r\n\t\t\t\tAspectPutter = (e, value) => {\r\n\t\t\t\t\tif (e == null) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (value.ToString().TryParse(out int n)) {\r\n\t\t\t\t\t\tvar p = new ChangePageNumberProcessor(n, true, false);\r\n\t\t\t\t\t\tUndo.AddUndo(p.Name, p.Process(e));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ActionColumn.AspectGetter = (object x) => {\r\n\t\t\t\tif (x is not XmlElement e) {\r\n\t\t\t\t\treturn String.Empty;\r\n\t\t\t\t}\r\n\t\t\t\tvar a = e.GetAttribute(Constants.DestinationAttributes.Action);\r\n\t\t\t\tif (String.IsNullOrEmpty(a)) {\r\n\t\t\t\t\treturn e.HasAttribute(Constants.DestinationAttributes.Page) ? Constants.ActionType.Goto : \"无\";\r\n\t\t\t\t}\r\n\t\t\t\treturn a;\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal void FireBookmarkChanged() {\r\n\t\t\tBookmarkChanged?.Invoke(this, EventArgs.Empty);\r\n\t\t}\r\n\r\n\t\tpublic BookmarkElement GetBookmark(int index) {\r\n\t\t\treturn GetModelObject(index) as BookmarkElement;\r\n\t\t}\r\n\r\n\t\tprotected override void OnBeforeSorting(BeforeSortingEventArgs e) {\r\n\t\t\te.Canceled = true; // 禁止排序\r\n\t\t\tbase.OnBeforeSorting(e);\r\n\t\t}\r\n\t\t#region 拖放操作\r\n\t\tprotected override void OnCanDrop(OlvDropEventArgs args) {\r\n\t\t\tif (args.DataObject is not DataObject o) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in o.GetFileDropList()) {\r\n\t\t\t\tif (FileHelper.HasExtension(item, Constants.FileExtensions.Xml)\r\n\t\t\t\t\t|| FileHelper.HasExtension(item, Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\targs.Handled = true;\r\n\t\t\t\t\targs.DropTargetLocation = DropTargetLocation.Background;\r\n\t\t\t\t\targs.Effect = DragDropEffects.Copy;\r\n\t\t\t\t\targs.InfoMessage = \"打开文件\" + item;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbase.OnCanDrop(args);\r\n\t\t}\r\n\t\tprotected override void OnModelCanDrop(ModelDropEventArgs e) {\r\n\t\t\tvar si = e.SourceModels;\r\n\t\t\tvar ti = e.TargetModel as XmlElement;\r\n\t\t\tif (si == null || si.Count == 0 || e.TargetModel == null) {\r\n\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar copy = (ModifierKeys & Keys.Control) != Keys.None || (e.SourceModels[0] as XmlElement).OwnerDocument != ti.OwnerDocument;\r\n\t\t\tif (copy == false) {\r\n\t\t\t\tif (e.DropTargetItem.Selected) {\r\n\t\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (XmlElement item in si) {\r\n\t\t\t\t\tif (IsAncestorOrSelf(item, ti)) {\r\n\t\t\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\t\t\te.InfoMessage = \"目标书签不能是源书签的子书签。\";\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar d = e.DropTargetItem;\r\n\t\t\tvar ml = e.MouseLocation;\r\n\t\t\tvar child = ml.X > d.Position.X + d.GetBounds(ItemBoundsPortion.ItemOnly).Width / 2;\r\n\t\t\tvar append = ml.Y > d.Position.Y + d.Bounds.Height / 2;\r\n\t\t\tif (child == false && copy == false) {\r\n\t\t\t\tvar xi = e.DropTargetIndex + (append ? 1 : -1);\r\n\t\t\t\tif (xi > -1 && xi < e.ListView.Items.Count\r\n\t\t\t\t\t&& e.ListView.Items[xi].Selected\r\n\t\t\t\t\t&& ti.ParentNode == (e.ListView.GetModelObject(xi) as XmlElement).ParentNode) {\r\n\t\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\te.Effect = copy ? DragDropEffects.Copy : DragDropEffects.Move;\r\n\t\t\te.InfoMessage = String.Concat((copy ? \"复制\" : \"移动\"), \"到\", (child ? \"所有子书签\" : String.Empty), (append ? \"后面\" : \"前面\"));\r\n\t\t\tbase.OnModelCanDrop(e);\r\n\t\t}\r\n\r\n\t\tprotected override void OnModelDropped(ModelDropEventArgs args) {\r\n\t\t\tbase.OnModelDropped(args);\r\n\t\t\tvar t = args.TargetModel as BookmarkElement;\r\n\t\t\tvar se = GetSelectedElements(args.SourceListView as BrightIdeasSoftware.TreeListView, false);\r\n\t\t\tif (se == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar ti = args.TargetModel as BookmarkElement;\r\n\t\t\tvar d = args.DropTargetItem;\r\n\t\t\tvar ml = args.MouseLocation;\r\n\t\t\tFreeze();\r\n\t\t\tvar child = ml.X > d.Position.X + d.GetBounds(ItemBoundsPortion.ItemOnly).Width / 2;\r\n\t\t\tvar append = ml.Y > d.Position.Y + d.Bounds.Height / 2;\r\n\t\t\tvar copy = (ModifierKeys & Keys.Control) != Keys.None || (args.SourceModels[0] as BookmarkElement).OwnerDocument != ti.OwnerDocument;\r\n\t\t\tvar deepCopy = copy && (OperationAffectsDescendants || (ModifierKeys & Keys.Shift) != Keys.None);\r\n\t\t\tvar tii = TopItemIndex;\r\n\t\t\tCopyOrMoveElement(se, ti, child, append, copy, deepCopy);\r\n\t\t\t//e.RefreshObjects ();\r\n\t\t\tTopItemIndex = tii;\r\n\t\t\tUnfreeze();\r\n\t\t\targs.Handled = true;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tinternal void LoadBookmarks(XmlNodeList bookmarks) {\r\n\t\t\tRoots = bookmarks.ToXmlNodeArray();\r\n\t\t\tforeach (BookmarkElement item in Roots) {\r\n\t\t\t\tif (item?.IsOpen == true) {\r\n\t\t\t\t\tExpand(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_markers.Clear();\r\n\t\t\tMark(bookmarks);\r\n\t\t}\r\n\r\n\t\t#region 标记书签\r\n\t\tvoid Mark(XmlNodeList bookmarks) {\r\n\t\t\tforeach (BookmarkElement item in bookmarks) {\r\n\t\t\t\tif (item == null || item.MarkerColor == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_markers.Add(item, Color.FromArgb(item.MarkerColor));\r\n\t\t\t\tMark(item.ChildNodes);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void MarkItems(List<BookmarkElement> items, Color color) {\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\t_markers[item] = color;\r\n\t\t\t\titem.MarkerColor = color.ToArgb();\r\n\t\t\t}\r\n\t\t\tRefreshObjects(items);\r\n\t\t}\r\n\t\tinternal List<BookmarkElement> SelectMarkedItems(Color color) {\r\n\t\t\tFreeze();\r\n\t\t\tvar items = new List<BookmarkElement>();\r\n\t\t\tvar c = color.ToArgb();\r\n\t\t\tvar r = new List<BookmarkElement>();\r\n\t\t\tforeach (var item in _markers) {\r\n\t\t\t\tif (item.Value.ToArgb() == c) {\r\n\t\t\t\t\tvar k = item.Key;\r\n\t\t\t\t\tDebug.Assert((k.ParentNode == null || k.OwnerDocument == null) == false);\r\n\t\t\t\t\tif (k.ParentNode == null || k.OwnerDocument == null) {\r\n\t\t\t\t\t\tr.Add(k);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\titems.Add(k);\r\n\t\t\t\t\tMakeItemVisible(k);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tforeach (var item in r) {\r\n\t\t\t\t_markers.Remove(item);\r\n\t\t\t}\r\n\t\t\tSelectObjects(items);\r\n\t\t\tEnsureItemsVisible(items);\r\n\t\t\tUnfreeze();\r\n\t\t\treturn items;\r\n\t\t}\r\n\t\tinternal void UnmarkItems(List<BookmarkElement> items) {\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\t_markers.Remove(item);\r\n\t\t\t\titem.MarkerColor = 0;\r\n\t\t\t}\r\n\t\t\tRefreshObjects(items);\r\n\t\t}\r\n\t\tinternal void ClearMarks(bool refresh) {\r\n\t\t\tif (refresh) {\r\n\t\t\t\tvar items = new List<XmlElement>(_markers.Count);\r\n\t\t\t\tforeach (var item in _markers) {\r\n\t\t\t\t\titems.Add(item.Key);\r\n\t\t\t\t\titem.Key.MarkerColor = 0;\r\n\t\t\t\t}\r\n\t\t\t\t_markers.Clear();\r\n\t\t\t\tRefreshObjects(items);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_markers.Clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tinternal void MakeItemVisible(XmlElement item) {\r\n\t\t\tvar p = item.ParentNode;\r\n\t\t\tvar a = new Stack<XmlNode>(); //ancestorsToExpand\r\n\t\t\ta.Push(null);\r\n\t\t\ta.Push(p);\r\n\t\t\twhile (p.Name != Constants.DocumentBookmark) {\r\n\t\t\t\tp = p.ParentNode;\r\n\t\t\t\ta.Push(p);\r\n\t\t\t}\r\n\t\t\twhile (a.Peek() != null) {\r\n\t\t\t\tExpand(a.Pop());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void EnsureItemsVisible(ICollection<BookmarkElement> items) {\r\n\t\t\tif (items.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar cr = ClientRectangle;\r\n\t\t\tOLVListItem fi = null, li = null;\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\tvar i = ModelToItem(item);\r\n\t\t\t\tif (i != null) {\r\n\t\t\t\t\tvar r = GetItemRect(i.Index);\r\n\t\t\t\t\tif (r.Top >= cr.Top && r.Bottom <= cr.Bottom) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tli = i;\r\n\t\t\t\t\tfi ??= i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ((fi ?? li) != null) {\r\n\t\t\t\tEnsureVisible(fi.Index);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void SelectPreviousBookmark() {\r\n\t\t\tvar si = this.GetFocusedOrFirstSelectedItem();\r\n\t\t\tif (si == null) {\r\n\t\t\t\tif (GetItemCount() != 0) {\r\n\t\t\t\t\t(SelectedItem = GetItem(0)).Focused = true;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (si.Index < 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t(SelectedItem = GetItem(si.Index - 1)).Focused = true;\r\n\t\t}\r\n\t\tinternal void SelectNextBookmark() {\r\n\t\t\tvar si = this.GetFocusedOrFirstSelectedItem();\r\n\t\t\tif (si == null) {\r\n\t\t\t\tif (GetItemCount() != 0) {\r\n\t\t\t\t\t(SelectedItem = GetItem(0)).Focused = true;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (si.Index == GetItemCount() - 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t(SelectedItem = GetItem(si.Index + 1)).Focused = true;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 检查 <paramref name=\"source\"/> 是否为 <paramref name=\"target\"/> 的先代元素。\r\n\t\t/// </summary>\r\n\t\tstatic bool IsAncestorOrSelf(XmlElement source, XmlElement target) {\r\n\t\t\tdo {\r\n\t\t\t\tif (source == target) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t} while ((target = target.ParentNode as XmlElement) != null);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 复制或移动书签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"source\">需要复制或移动的源书签。</param>\r\n\t\t/// <param name=\"target\">目标书签。</param>\r\n\t\t/// <param name=\"child\">是否复制为子节点。</param>\r\n\t\t/// <param name=\"after\">是否复制到后面。</param>\r\n\t\t/// <param name=\"copy\">是否复制书签。</param>\r\n\t\t/// <param name=\"deepCopy\">是否深度复制书签。</param>\r\n\t\tinternal void CopyOrMoveElement(List<BookmarkElement> source, XmlElement target, bool child, bool after, bool copy, bool deepCopy) {\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tbool spr = false; // source parent is root\r\n\t\t\tbool tpr = false; // target parent is root\r\n\t\t\tvar pn = new List<XmlNode>();\r\n\t\t\tif (copy) {\r\n\t\t\t\tvar clones = new List<BookmarkElement>(source.Count);\r\n\t\t\t\tvar td = target.OwnerDocument;\r\n\t\t\t\tforeach (XmlElement item in source) {\r\n\t\t\t\t\tif (item.OwnerDocument == td) {\r\n\t\t\t\t\t\tclones.Add((BookmarkElement)item.CloneNode(deepCopy));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tclones.Add(td.ImportNode(item, deepCopy) as BookmarkElement);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsource = clones;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tforeach (var item in source) {\r\n\t\t\t\t\tvar e = item.ParentNode as XmlElement;\r\n\t\t\t\t\tif (e.Name == Constants.DocumentBookmark) {\r\n\t\t\t\t\t\tspr = true;\r\n\t\t\t\t\t\tpn = null;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpn.Add(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (child) {\r\n\t\t\t\tif (after) {\r\n\t\t\t\t\ttpr = target.Name == Constants.DocumentBookmark;\r\n\t\t\t\t\tforeach (XmlElement item in source) {\r\n\t\t\t\t\t\tif (!copy) {\r\n\t\t\t\t\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttarget.AppendChild(item);\r\n\t\t\t\t\t\tundo.Add(new RemoveElementAction(item));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsource.Reverse();\r\n\t\t\t\t\tforeach (XmlElement item in source) {\r\n\t\t\t\t\t\tif (!copy) {\r\n\t\t\t\t\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttarget.PrependChild(item);\r\n\t\t\t\t\t\tundo.Add(new RemoveElementAction(item));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tExpand(target);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar p = target.ParentNode;\r\n\t\t\t\ttpr = p.Name == Constants.DocumentBookmark;\r\n\t\t\t\tif (after) {\r\n\t\t\t\t\tsource.Reverse();\r\n\t\t\t\t\tforeach (XmlElement item in source) {\r\n\t\t\t\t\t\tif (!copy) {\r\n\t\t\t\t\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tp.InsertAfter(item, target);\r\n\t\t\t\t\t\tundo.Add(new RemoveElementAction(item));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tforeach (XmlElement item in source) {\r\n\t\t\t\t\t\tif (!copy) {\r\n\t\t\t\t\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tp.InsertBefore(item, target);\r\n\t\t\t\t\t\tundo.Add(new RemoveElementAction(item));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tUndo?.AddUndo(copy ? \"复制书签\" : \"移动书签\", undo);\r\n\t\t\tif (copy == false && spr || tpr) {\r\n\t\t\t\tRoots = (target.OwnerDocument as PdfInfoXmlDocument).BookmarkRoot.SubBookmarks;\r\n\t\t\t}\r\n\t\t\tif (pn != null) {\r\n\t\t\t\tRefreshObjects(pn);\r\n\t\t\t}\r\n\t\t\tRefreshObject(target);\r\n\t\t\tSelectedObjects = source;\r\n\t\t}\r\n\r\n\t\tinternal void CopySelectedBookmark() {\r\n\t\t\t_copiedBookmarks = GetSelectedElements(false);\r\n\t\t\tClipboard.Clear();\r\n\t\t}\r\n\t\tinternal void PasteBookmarks(XmlElement target, bool asChild) {\r\n\t\t\ttry {\r\n\t\t\t\tvar t = Clipboard.GetText();\r\n\t\t\t\tbool c = false;\r\n\t\t\t\tif (t.IsNullOrWhiteSpace() == false) {\r\n\t\t\t\t\tvar doc = new PdfInfoXmlDocument();\r\n\t\t\t\t\tusing (var s = new System.IO.StringReader(t)) {\r\n\t\t\t\t\t\tOutlineManager.ImportSimpleBookmarks(s, doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_copiedBookmarks = doc.Bookmarks.ToNodeList<BookmarkElement>() as List<BookmarkElement>;\r\n\t\t\t\t\tc = true;\r\n\t\t\t\t}\r\n\t\t\t\tif (_copiedBookmarks == null || _copiedBookmarks.Count == 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tCopyOrMoveElement(_copiedBookmarks, target, asChild, true, true, c || OperationAffectsDescendants);\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\t// ignore\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal List<BookmarkElement> GetSelectedElements() { return GetSelectedElements(this, true); }\r\n\t\tinternal List<BookmarkElement> GetSelectedElements(bool selectChildren) { return GetSelectedElements(this, selectChildren); }\r\n\t\tstatic List<BookmarkElement> GetSelectedElements(TreeListView treeList, bool selectChildren) {\r\n\t\t\tif (treeList == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar si = treeList.SelectedIndices;\r\n\t\t\tvar il = new int[si.Count];\r\n\t\t\tsi.CopyTo(il, 0);\r\n\t\t\tArray.Sort(il);\r\n\t\t\tvar el = new List<BookmarkElement>();\r\n\t\t\tvar l = -1;\r\n\t\t\tBookmarkElement e;\r\n\t\t\tforeach (var item in il) {\r\n\t\t\t\te = treeList.GetModelObject(item) as BookmarkElement;\r\n\t\t\t\tif (selectChildren) {\r\n\t\t\t\t\tel.Add(e);\r\n\t\t\t\t}\r\n\t\t\t\telse if (item > l) {\r\n\t\t\t\t\tl = item + (treeList.VirtualListDataSource as Tree).GetVisibleDescendentCount(e);\r\n\t\t\t\t\tel.Add(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn el;\r\n\t\t}\r\n\r\n\t\tprotected override void OnCellClick(CellClickEventArgs args) {\r\n\t\t\tbase.OnCellClick(args);\r\n\t\t\tif (args.ColumnIndex == 0 && IsCellEditing == false && SelectedIndices.Count < 2) {\r\n\t\t\t\tif (args.ClickCount > 1) {\r\n\t\t\t\t\tEditSubItem(args.Item, 0);\r\n\t\t\t\t}\r\n\t\t\t\telse if (args.Model != SelectedObject) {\r\n\t\t\t\t\tSelectedObject = args.Model;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region 单元格编辑\r\n\t\tprotected override void OnBeforeLabelEdit(LabelEditEventArgs e) {\r\n\t\t\tbase.OnBeforeLabelEdit(e);\r\n\t\t\te.CancelEdit = true;\r\n\t\t\tEditSubItem(GetItem(e.Item), 0);\r\n\t\t}\r\n\r\n\t\tprotected override void OnItemActivate(EventArgs e) {\r\n\t\t\tbase.OnItemActivate(e);\r\n\t\t\tEditSubItem(SelectedItem, 0);\r\n\t\t}\r\n\r\n\t\tprotected override void OnCellEditStarting(CellEditEventArgs e) {\r\n\t\t\tbase.OnCellEditStarting(e);\r\n\t\t\tif (e.Column == _BookmarkNameColumn) {\r\n\t\t\t\te.Control = new AutoResizingTextBox(e.CellBounds, e.Value as string, this);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnCellEditFinishing(CellEditEventArgs e) {\r\n\t\t\tbase.OnCellEditFinishing(e);\r\n\t\t\tif (e.Column == _BookmarkNameColumn) {\r\n\t\t\t\tstring newTitle = e.NewValue as string;\r\n\t\t\t\tif (String.IsNullOrEmpty(newTitle) || newTitle == e.Value as string) {\r\n\t\t\t\t\te.Cancel = true;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnCellEditFinished(CellEditEventArgs e) {\r\n\t\t\tbase.OnCellEditFinished(e);\r\n\t\t\tif (e.Cancel || FormHelper.IsCtrlKeyDown) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (e.Column == _BookmarkNameColumn) {\r\n\t\t\t\tvar i = GetItem(e.ListViewItem.Index);\r\n\t\t\t\tvar o = e.RowObject as XmlElement;\r\n\t\t\t\tif (o.HasChildNodes) {\r\n\t\t\t\t\tExpand(o);\r\n\t\t\t\t}\r\n\t\t\t\tif (e.Value as string != Constants.Bookmark && i.Index < Items.Count - 1) {\r\n\t\t\t\t\tEditSubItem(GetItem(i.Index + 1), 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (e.Column == _BookmarkPageColumn) {\r\n\t\t\t\tSelectedItem = FocusedItem as OLVListItem;\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tprotected override void OnHyperlinkClicked(HyperlinkClickedEventArgs e) {\r\n\t\t\tbase.OnHyperlinkClicked(e);\r\n\t\t\tif (e.Column != _ActionColumn) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\te.Handled = true;\r\n\t\t\tShowBookmarkProperties(e.Model as BookmarkElement);\r\n\t\t}\r\n\r\n\t\tprotected override void OnHotItemChanged(HotItemChangedEventArgs e) {\r\n\t\t\tif ((e.HotColumnIndex == _ActionColumn.Index || e.OldHotColumnIndex == _ActionColumn.Index)\r\n\t\t\t\t//&& (e.HotRowIndex != e.OldHotRowIndex || e.HotColumnIndex != e.OldHotColumnIndex)\r\n\t\t\t\t) {\r\n\t\t\t\t// e.handled = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\te.Handled = true;\r\n\t\t\tbase.OnHotItemChanged(e);\r\n\t\t}\r\n\r\n\t\tprotected override void OnMouseMove(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseMove(e);\r\n\t\t\tvar t = HitTest(e.X, e.Y);\r\n\t\t\tif (t.Item != null\r\n\t\t\t\t&& (t.Location == ListViewHitTestLocations.Label || t.Location == ListViewHitTestLocations.Image)\r\n\t\t\t\t&& t.Item.SubItems[0] == t.SubItem) {\r\n\t\t\t\tCursor = Cursors.Hand;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tCursor = Cursors.Default;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnFormatRow(FormatRowEventArgs args) {\r\n\t\t\tbase.OnFormatRow(args);\r\n\t\t\tif (args.Model is not BookmarkElement b) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar item = args.Item;\r\n\t\t\titem.UseItemStyleForSubItems = false;\r\n\t\t\targs.UseCellFormatEvents = false;\r\n\t\t\tColor c;\r\n\t\t\tif (b.MarkerColor != 0) {\r\n\t\t\t\titem.BackColor = Color.FromArgb(b.MarkerColor);\r\n\t\t\t}\r\n\t\t\tc = b.ForeColor;\r\n\t\t\tif (c != Color.Transparent) {\r\n\t\t\t\titem.ForeColor = c;\r\n\t\t\t}\r\n\r\n\t\t\tif (b.Title.IndexOf('\\n') >= 0) {\r\n\t\t\t\titem.GetSubItem(0).Decoration = new TextDecoration(\"…\", ContentAlignment.BottomRight) { Font = Font };\r\n\t\t\t}\r\n\t\t\tvar ts = b.TextStyle;\r\n\t\t\tif (ts != FontStyle.Regular) {\r\n\t\t\t\titem.Font = new Font(item.Font, ts);\r\n\t\t\t}\r\n\t\t\tif (_ActionColumn.Index != -1) {\r\n\t\t\t\titem.SubItems[_ActionColumn.Index].ForeColor = Color.Blue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region 使右键点击选中行的空白位置时，不取消选中状态\r\n\t\tprotected override void OnMouseDown(MouseEventArgs e) {\r\n\t\t\tif (e.Button != MouseButtons.Left) {\r\n\t\t\t\tFullRowSelect = true;\r\n\t\t\t}\r\n\t\t\tbase.OnMouseDown(e);\r\n\t\t}\r\n\r\n\t\tprotected override void OnMouseUp(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseUp(e);\r\n\t\t\tif (e.Button != MouseButtons.Left) {\r\n\t\t\t\tFullRowSelect = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tinternal void ShowBookmarkProperties(BookmarkElement bookmark) {\r\n\t\t\tif (bookmark == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tusing (var form = new ActionEditorForm(bookmark)) {\r\n\t\t\t\tif (form.ShowDialog() == DialogResult.OK && form.UndoActions.Count > 0) {\r\n\t\t\t\t\tUndo?.AddUndo(\"更改书签动作属性\", form.UndoActions);\r\n\t\t\t\t\tRefreshObject(bookmark);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal BookmarkElement SearchBookmark(BookmarkMatcher matcher) {\r\n\t\t\tvar s = this.GetFirstSelectedModel<BookmarkElement>();\r\n\t\t\tif (s == null) {\r\n\t\t\t\ts = GetModelObject(0) as BookmarkElement;\r\n\t\t\t\tif (s == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar n = s.CreateNavigator();\r\n\t\t\tBookmarkElement e;\r\n\t\t\twhile (n.MoveToFollowing(Constants.Bookmark, String.Empty)) {\r\n\t\t\t\te = n.UnderlyingObject as BookmarkElement;\r\n\t\t\t\tif (e != null && matcher.Match(e)) {\r\n\t\t\t\t\tMakeItemVisible(e);\r\n\t\t\t\t\tEnsureModelVisible(e);\r\n\t\t\t\t\tSelectedObject = e;\r\n\t\t\t\t\treturn e;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tinternal List<BookmarkElement> SearchBookmarks(BookmarkMatcher matcher) {\r\n\t\t\tvar matches = new List<BookmarkElement>();\r\n\t\t\tFreeze();\r\n\t\t\ttry {\r\n\t\t\t\tforeach (BookmarkElement item in Roots) {\r\n\t\t\t\t\tSearchBookmarks(matcher, matches, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"匹配文本时出现错误\", ex);\r\n\t\t\t}\r\n\t\t\tUnfreeze();\r\n\t\t\tif (matches.Count > 0) {\r\n\t\t\t\tEnsureItemsVisible(matches);\r\n\t\t\t\tSelectedObjects = matches;\r\n\t\t\t}\r\n\t\t\treturn matches;\r\n\t\t}\r\n\r\n\t\tvoid SearchBookmarks(BookmarkMatcher matcher, List<BookmarkElement> matches, BookmarkElement item) {\r\n\t\t\tif (item.HasChildNodes) {\r\n\t\t\t\tforeach (BookmarkElement c in item.SelectNodes(Constants.Bookmark)) {\r\n\t\t\t\t\tSearchBookmarks(matcher, matches, c);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (matcher.Match(item)) {\r\n\t\t\t\tmatches.Add(item);\r\n\t\t\t\tMakeItemVisible(item);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/BookmarkEditorView.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/Commands/BookmarkActionCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class BookmarkActionCommand : IEditorCommand\r\n\t{\r\n\t\treadonly string _viewType;\r\n\r\n\t\tpublic BookmarkActionCommand(string viewType) {\r\n\t\t\t_viewType = viewType;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tif (b.FocusedItem == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (_viewType) {\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.XYZ:\r\n\t\t\t\t\tusing (var form = new ZoomRateEntryForm()) {\r\n\t\t\t\t\t\tif (form.ShowDialog() != DialogResult.OK) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar z = form.ZoomRate;\r\n\t\t\t\t\t\tfloat r;\r\n\t\t\t\t\t\tif (z == Constants.Coordinates.Unchanged) {\r\n\t\t\t\t\t\t\tcontroller.ProcessBookmarks(new ChangeZoomRateProcessor(null));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (z.TryParse(out r)) {\r\n\t\t\t\t\t\t\tcontroller.ProcessBookmarks(new ChangeZoomRateProcessor(r));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.Coordinates.Unchanged:\r\n\t\t\t\t\tcontroller.ProcessBookmarks(new ChangeZoomRateProcessor(null));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_ChangeCoordinates\":\r\n\t\t\t\t\tusing (var f = new NewCoordinateEntryForm()) {\r\n\t\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\t\tcontroller.ProcessBookmarks(new ChangeCoordinateProcessor(f.CoordinateName, f.AdjustmentValue, f.IsAbsolute, f.IsProportional));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.EditorBookmarkSetCurrentCoordinates:\r\n\t\t\t\t\tvar pp = controller.View.Viewer.GetCurrentScrollPosition();\r\n\t\t\t\t\tif (pp.Page == 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontroller.ProcessBookmarks(new ChangePageCoordinateProcessor(Constants.Coordinates.Top, pp.Page, pp.PageX, pp.PageY));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_BookmarkAction\":\r\n\t\t\t\t\tb.ShowBookmarkProperties(b.GetFirstSelectedModel<Model.BookmarkElement>());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tcontroller.ProcessBookmarks(new ChangeZoomRateProcessor(_viewType));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/BookmarkLevelCommand.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class BookmarkLevelCommand : IEditorCommand\r\n\t{\r\n\t\treadonly bool _levelUp;\r\n\t\tpublic BookmarkLevelCommand(bool levelUp) {\r\n\t\t\t_levelUp = levelUp;\r\n\t\t}\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tBookmarkLevel(controller, _levelUp);\r\n\t\t}\r\n\r\n\t\tinternal void BookmarkLevel(Controller controller, bool levelUp) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tvar si = b.GetSelectedElements(true);\r\n\t\t\tb.BeginUpdate();\r\n\t\t\tvar ld = controller.ProcessBookmarks(false, false, levelUp ? new LevelUpProcessor() as IPdfInfoXmlProcessor : new LevelDownProcessor());\r\n\t\t\tif (ld != null) {\r\n\t\t\t\tforeach (var item in ld) {\r\n\t\t\t\t\tb.Expand(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tb.RefreshObjects(si);\r\n\t\t\tb.SelectedObjects = si;\r\n\t\t\tb.EndUpdate();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/BookmarkMarkerCommand.cs",
    "content": "﻿using System.Drawing;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class BookmarkMarkerCommand : IEditorCommand\r\n\t{\r\n\t\tstatic readonly string[] __commands = {\r\n\t\t\t\"_MarkBookmarkRed\",\r\n\t\t\t\"_MarkBookmarkYellow\",\r\n\t\t\t\"_MarkBookmarkGreen\",\r\n\t\t\t\"_MarkBookmarkBlue\",\r\n\t\t\t\"_MarkBookmarkCyan\",\r\n\t\t\t\"_MarkBookmarkPurple\",\r\n\t\t\t\"_UnmarkBookmark\",\r\n\t\t\t\"_ClearBookmarkMarks\",\r\n\t\t\t\"_SelectRedMarks\",\r\n\t\t\t\"_SelectYellowMarks\",\r\n\t\t\t\"_SelectGreenMarks\",\r\n\t\t\t\"_SelectBlueMarks\",\r\n\t\t\t\"_SelectCyanMarks\",\r\n\t\t\t\"_SelectPurpleMarks\"\r\n\t\t};\r\n\t\tinternal static void RegisterCommands(CommandRegistry<Controller> registry) {\r\n\t\t\tforeach (var item in __commands) {\r\n\t\t\t\tregistry.Register(new BookmarkMarkerCommand(item), item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treadonly string _command;\r\n\r\n\t\tpublic BookmarkMarkerCommand(string command) {\r\n\t\t\t_command = command;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tswitch (_command) {\r\n\t\t\t\tcase \"_MarkBookmarkRed\": b.MarkItems(b.GetSelectedElements(true), Color.PeachPuff); break;\r\n\t\t\t\tcase \"_MarkBookmarkYellow\": b.MarkItems(b.GetSelectedElements(true), Color.Yellow); break;\r\n\t\t\t\tcase \"_MarkBookmarkGreen\": b.MarkItems(b.GetSelectedElements(true), Color.GreenYellow); break;\r\n\t\t\t\tcase \"_MarkBookmarkBlue\": b.MarkItems(b.GetSelectedElements(true), Color.LightSkyBlue); break;\r\n\t\t\t\tcase \"_MarkBookmarkCyan\": b.MarkItems(b.GetSelectedElements(true), Color.Aqua); break;\r\n\t\t\t\tcase \"_MarkBookmarkPurple\": b.MarkItems(b.GetSelectedElements(true), Color.Violet); break;\r\n\t\t\t\tcase \"_UnmarkBookmark\": b.UnmarkItems(b.GetSelectedElements(true)); break;\r\n\t\t\t\tcase \"_ClearBookmarkMarks\":\r\n\t\t\t\t\tif (b.HasMarker && FormHelper.YesNoBox(\"是否确定清除书签标记？\") == DialogResult.Yes) {\r\n\t\t\t\t\t\tb.ClearMarks(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SelectRedMarks\": b.SelectMarkedItems(Color.PeachPuff); break;\r\n\t\t\t\tcase \"_SelectYellowMarks\": b.SelectMarkedItems(Color.Yellow); break;\r\n\t\t\t\tcase \"_SelectGreenMarks\": b.SelectMarkedItems(Color.GreenYellow); break;\r\n\t\t\t\tcase \"_SelectBlueMarks\": b.SelectMarkedItems(Color.LightSkyBlue); break;\r\n\t\t\t\tcase \"_SelectCyanMarks\": b.SelectMarkedItems(Color.Aqua); break;\r\n\t\t\t\tcase \"_SelectPurpleMarks\": b.SelectMarkedItems(Color.Violet); break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/BookmarkPageCommand.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class BookmarkPageCommand : IEditorCommand\r\n\t{\r\n\t\treadonly int _number;\r\n\t\tbool _takeFollowing;\r\n\r\n\t\tpublic BookmarkPageCommand(int number, bool takeFollowing = false) {\r\n\t\t\t_number = number;\r\n\t\t\t_takeFollowing = takeFollowing;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar n = _number;\r\n\t\t\tif (_number == 0) {\r\n\t\t\t\tusing (var form = new ShiftPageNumberEntryForm() { TakeFollowing = _takeFollowing }) {\r\n\t\t\t\t\tif (form.ShowDialog() != DialogResult.OK\r\n\t\t\t\t\t\t|| form.ShiftNumber == 0 && form.TakeFollowing == false) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tn = form.ShiftNumber;\r\n\t\t\t\t\t_takeFollowing = form.TakeFollowing;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontroller.ProcessBookmarks(new ChangePageNumberProcessor(n, false, true, _takeFollowing));\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/BookmarkSelectionCommand.cs",
    "content": "﻿using System;\r\nusing System.Linq;\r\nusing System.Xml;\r\nusing BrightIdeasSoftware;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class BookmarkSelectionCommand : IEditorCommand\r\n\t{\r\n\t\treadonly string _command;\r\n\r\n\t\tpublic BookmarkSelectionCommand(string command) {\r\n\t\t\t_command = command;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tswitch (_command) {\r\n\t\t\t\tcase Commands.SelectAllItems:\r\n\t\t\t\t\tb.SelectAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectNone:\r\n\t\t\t\t\tb.DeselectAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectChildren:\r\n\t\t\t\t\tvar s = b.GetSelectedElements(false);\r\n\t\t\t\t\tforeach (var item in s) {\r\n\t\t\t\t\t\tb.Expand(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tb.SelectedObjects = s.SelectMany(i => i.SubBookmarks.Cast<Model.BookmarkElement>()).ToList();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.InvertSelection:\r\n\t\t\t\t\tb.InvertSelect();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.CollapseAll:\r\n\t\t\t\t\tb.CollapseAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.ExpandAll:\r\n\t\t\t\t\tb.ExpandAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.CollapseChildren:\r\n\t\t\t\t\tforeach (var item in b.GetSelectedElements(false)) {\r\n\t\t\t\t\t\tforeach (XmlNode ci in item.SubBookmarks) {\r\n\t\t\t\t\t\t\tb.Collapse(ci);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.ExpandSelection:\r\n\t\t\t\t\tb.Expand(b.SelectedObjects, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.CollapseSelection:\r\n\t\t\t\t\tb.Collapse(b.SelectedObjects, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/BookmarkStyleCommand.cs",
    "content": "﻿using System;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class BookmarkStyleCommand : IEditorCommand\r\n\t{\r\n\t\treadonly SetTextStyleProcessor.Style _style;\r\n\r\n\t\tpublic BookmarkStyleCommand(SetTextStyleProcessor.Style style) {\r\n\t\t\t_style = style;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tif (b.FocusedItem == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar i = b.GetFirstSelectedModel<Model.BookmarkElement>();\r\n\t\t\tif (i == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcontroller.ProcessBookmarks(new SetTextStyleProcessor(i, _style));\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/CopyBookmarkItemCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class CopyBookmarkItemCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tcontroller.View.Bookmark.CopySelectedBookmark();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/DeleteBookmarkItemCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class DeleteBookmarkItemCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tRemoveItems(controller, controller.View.Bookmark.GetSelectedElements(false));\r\n\t\t}\r\n\r\n\t\tstatic void RemoveItems(Controller controller, System.Collections.IList si) {\r\n\t\t\tif (si.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tb.RemoveObjects(si);\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tvar l = new List<XmlNode>();\r\n\t\t\tforeach (XmlElement item in si) {\r\n\t\t\t\tif (item == null || item.ParentNode == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\t\tvar p = item.ParentNode;\r\n\t\t\t\tp.RemoveChild(item);\r\n\t\t\t\tif (l.Contains(p) == false) {\r\n\t\t\t\t\tl.Add(p);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tforeach (var item in l) {\r\n\t\t\t\tif (item.ParentNode != null) {\r\n\t\t\t\t\tb.RefreshObject(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontroller.Model.Undo.AddUndo(\"删除书签\", undo);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/DocumentPropertyCommand.cs",
    "content": "﻿namespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class DocumentPropertyCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tusing (var f = new DocumentInfoForm() {\r\n\t\t\t\tDocument = controller.Model.PdfDocument,\r\n\t\t\t\tInfoDocument = controller.Model.Document\r\n\t\t\t}) {\r\n\t\t\t\tf.ShowDialog();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/InsertBookmarkCommand.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Text.RegularExpressions;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class InsertBookmarkCommand : IEditorCommand\r\n\t{\r\n\t\tstatic readonly Regex __RemoveOcrWhiteSpace = new Regex(@\"\\s{2,}\", RegexOptions.Compiled);\r\n\t\tstatic readonly Regex __FirstChildPatterns = new Regex(@\"^ *[（\\(\\<【〖]?(?:第一[篇章节部節]|一[、\\.，\\)） 】〗]|1[\\)）、])\", RegexOptions.Compiled);\r\n\t\tstatic InsertBookmarkForm _dialog;\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tBookmarkAtClientPoint(controller, v.TransposeVirtualImageToClient(v.PinPoint.X, v.PinPoint.Y));\r\n\t\t}\r\n\r\n\t\tstatic void BookmarkAtClientPoint(Controller controller, Point cp) {\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tvar pp = v.TransposeClientToPagePosition(cp.X, cp.Y);\r\n\t\t\tif (pp.Page == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (Control.ModifierKeys == Keys.Control) {\r\n\t\t\t\tv.PinPoint = v.PointToImage(cp);\r\n\t\t\t\tShowInsertBookmarkDialog(controller, cp, new EditModel.Region(pp, null, EditModel.TextSource.Empty));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tShowInsertBookmarkDialog(controller, cp, controller.CopyText(cp, pp));\r\n\t\t}\r\n\r\n\t\tstatic void ShowInsertBookmarkDialog(Controller controller, Point mousePoint, EditModel.Region region) {\r\n\t\t\tvar p = region.Position;\r\n\t\t\tif (p.Page == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar f = GetDialog(controller);\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tPoint fp;\r\n\t\t\tvar sr = v.SelectionRegion;\r\n\t\t\tif (sr != RectangleF.Empty) {\r\n\t\t\t\tfp = v.TransposeVirtualImageToClient(sr.Left, sr.Top);\r\n\t\t\t\tif (v.HorizontalFlow) {\r\n\t\t\t\t\tfp.X += sr.Width.ToInt32() + 20;\r\n\t\t\t\t}\r\n\t\t\t\tfp.Y -= f.Height + 20;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfp = new Point(mousePoint.X + 20, mousePoint.Y - f.Height);\r\n\t\t\t}\r\n\t\t\tvar l = v.PointToScreen(fp);\r\n\t\t\tif (l.Y < 0) {\r\n\t\t\t\tl.Y = l.Y + (int)sr.Height + f.Height + 40;\r\n\t\t\t\tif (l.Y + f.Height > Screen.PrimaryScreen.WorkingArea.Height) {\r\n\t\t\t\t\tl.Y = Screen.PrimaryScreen.WorkingArea.Height - f.Height;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (l.X < v.PointToScreen(Point.Empty).X) {\r\n\t\t\t\tl.X = v.PointToScreen(Point.Empty).X;\r\n\t\t\t}\r\n\t\t\tf.Location = l;\r\n\t\t\tf.TargetPosition = p.PageY;\r\n\t\t\tif (String.IsNullOrEmpty(region.Text) == false) {\r\n\t\t\t\tf.Title = __RemoveOcrWhiteSpace.Replace(region.Text, \" \").Trim();\r\n\t\t\t\tif (__FirstChildPatterns.IsMatch(f.Title)) {\r\n\t\t\t\t\tf.SetInsertMode(InsertBookmarkPositionType.AsChild);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tf.Comment = region.LiteralTextSource;\r\n\t\t\tf.Show();\r\n\t\t\tf.TargetPageNumber = p.Page;\r\n\t\t}\r\n\r\n\t\tstatic InsertBookmarkForm GetDialog(Controller controller) {\r\n\t\t\tif (_dialog != null && _dialog.IsDisposed == false) {\r\n\t\t\t\t_dialog.Controller = controller;\r\n\t\t\t\treturn _dialog;\r\n\t\t\t}\r\n\t\t\t_dialog = new InsertBookmarkForm {\r\n\t\t\t\tController = controller\r\n\t\t\t};\r\n\t\t\t_dialog.OkClicked += (object sender, CancelEventArgs e) => {\r\n\t\t\t\tvar f = (InsertBookmarkForm)sender;\r\n\t\t\t\tvar c = f.Controller;\r\n\t\t\t\tvar t = f.Title;\r\n\t\t\t\tif (string.IsNullOrEmpty(t) && f.InsertMode != 0) {\r\n\t\t\t\t\tf.Comment = \"书签标题不能为空。\";\r\n\t\t\t\t\tf.FocusTitleBox();\r\n\t\t\t\t\te.Cancel = true;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tc.Model.LockDownViewer = true;\r\n\t\t\t\tc.InsertBookmark(t, f.TargetPageNumber, f.TargetPosition, f.InsertMode);\r\n\t\t\t\tc.Model.LockDownViewer = false;\r\n\t\t\t};\r\n\t\t\t_dialog.Deactivate += (s, args) => {\r\n\t\t\t\t(s as Form).Visible = false;\r\n\t\t\t};\r\n\t\t\t_dialog.VisibleChanged += (s, args) => {\r\n\t\t\t\tvar f = (InsertBookmarkForm)s;\r\n\t\t\t\tf.Controller.View.Viewer.ShowPinPoint = f.Visible;\r\n\t\t\t};\r\n\t\t\treturn _dialog;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/InsertPageLabelCommand.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class InsertPageLabelCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller context, params string[] parameters) {\r\n\t\t\tvar v = context.View.Viewer;\r\n\t\t\tvar position = v.TransposeVirtualImageToPagePosition(v.PinPoint.X, v.PinPoint.Y);\r\n\t\t\tif (position.Page == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar labels = context.Model.PageLabels;\r\n\t\t\tvar f = new InsertPageLabelForm {\r\n\t\t\t\tLocation = Cursor.Position.Transpose(-16, -16),\r\n\t\t\t\tPageNumber = position.Page,\r\n\t\t\t\tModel = context.Model,\r\n\t\t\t\tViewer = v\r\n\t\t\t};\r\n\t\t\tf.FormClosing += InsertPageLabelFormClosed;\r\n\t\t\tf.Show();\r\n\t\t\tvar pl = labels.Find(position.Page);\r\n\t\t\tif (pl.IsEmpty == false) {\r\n\t\t\t\tf.SetValues(pl);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void InsertPageLabelFormClosed(object sender, EventArgs e) {\r\n\t\t\tvar form = sender as InsertPageLabelForm;\r\n\t\t\tform.FormClosing -= InsertPageLabelFormClosed;\r\n\t\t\tif (form.DialogResult == DialogResult.Cancel) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar l = form.Model.PageLabels;\r\n\t\t\tif (form.DialogResult == DialogResult.OK) {\r\n\t\t\t\tif (l == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tl.Add(form.PageLabel);\r\n\t\t\t}\r\n\t\t\telse if (form.DialogResult == DialogResult.Abort) {\r\n\t\t\t\tform.Model.PageLabels.Remove(form.PageLabel);\r\n\t\t\t}\r\n\t\t\tvar pl = form.Model.Document.PageLabelRoot;\r\n\t\t\tpl.InnerText = String.Empty;\r\n\t\t\tforeach (var item in l) {\r\n\t\t\t\tpl.AppendChild(form.Model.Document.CreatePageLabel(item));\r\n\t\t\t}\r\n\t\t\tform.Viewer.PageLabels = form.Model.PageLabels;\r\n\t\t\tform.Viewer.Invalidate();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/LoadDocumentCommand.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class LoadDocumentCommand : IEditorCommand\r\n\t{\r\n\t\treadonly bool _showDialog, _importBookmark;\r\n\t\tpublic LoadDocumentCommand(bool showDialog, bool importBookmark) {\r\n\t\t\t_showDialog = showDialog;\r\n\t\t\t_importBookmark = importBookmark;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tif (controller.Model.Undo.IsDirty\r\n\t\t\t\t&& AppContext.MainForm.ConfirmYesBox(Messages.ConfirmAbandonDocument) == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_showDialog) {\r\n\t\t\t\tusing (var f = new OpenFileDialog {\r\n\t\t\t\t\tDefaultExt = _importBookmark ? Constants.FileExtensions.Xml : Constants.FileExtensions.Pdf,\r\n\t\t\t\t\tTitle = _importBookmark ? \"打开需要导入的书签文件\" : \"打开需要编辑的文件\",\r\n\t\t\t\t\tFilter = Constants.FileExtensions.AllEditableFilter\r\n\t\t\t\t}) {\r\n\t\t\t\t\tif (f.ShowDialog() != DialogResult.OK) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tparameters = new string[] { f.FileName };\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tcontroller.LoadDocument(parameters[0], _importBookmark);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"加载信息文件时出现错误\", ex);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/OcrPageCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class OcrPageCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tvar pp = v.TransposeVirtualImageToPagePosition(v.PinPoint.X, v.PinPoint.Y);\r\n\t\t\tif (pp.Page == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar or = v.OcrPage(pp.Page, true);\r\n\t\t\tif (or.HasContent()) {\r\n\t\t\t\tClipboard.SetText(String.Join(Environment.NewLine, v.CleanUpOcrResult(or)));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tFormHelper.InfoBox(\"页面不包含可识别的文本，或出现识别引擎错误。\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/PagePropertiesCommand.cs",
    "content": "﻿using System;\r\nusing System.Text.RegularExpressions;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class PagePropertiesCommand : IEditorCommand\r\n\t{\r\n\t\t//static readonly Regex __RemoveOcrWhiteSpace = new Regex (@\"\\s{2,}\", RegexOptions.Compiled);\r\n\t\tstatic PagePropertyForm _dialog;\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tvar l = v.PinPoint;\r\n\t\t\tvar p = v.TransposeVirtualImageToPagePosition(l.X, l.Y);\r\n\t\t\tvar f = GetDialog();\r\n\t\t\tusing (var page = controller.Model.PdfDocument.LoadPage(p.Page - 1)) {\r\n\t\t\t\tf.Location = v.PointToScreen(v.TransposeVirtualImageToClient(l.X, l.Y));\r\n\t\t\t\tf.Show();\r\n\t\t\t\tf.LoadPage(page);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static PagePropertyForm GetDialog() {\r\n\t\t\tif (_dialog != null && _dialog.IsDisposed == false) {\r\n\t\t\t\treturn _dialog;\r\n\t\t\t}\r\n\t\t\t_dialog = new PagePropertyForm();\r\n\t\t\t_dialog.Deactivate += (s, args) => ((Form)s).Visible = false;\r\n\t\t\treturn _dialog;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/PasteBookmarkItemCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class PasteBookmarkItemCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tb.PasteBookmarks(b.FocusedItem != null\r\n\t\t\t\t\t\t? b.GetModelObject(b.FocusedItem.Index) as XmlElement\r\n\t\t\t\t\t\t: controller.Model.Document.BookmarkRoot,\r\n\t\t\t\t\t\tb.FocusedItem == null);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/QuickSelectCommand.cs",
    "content": "﻿using System.Drawing;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class QuickSelectCommand : IEditorCommand\r\n\t{\r\n\t\tconst string __N = \"[0-9０-９一二三四五六七八九十〇]+\";\r\n\t\tconst string __S = @\"\\s*\";\r\n\t\tconst string __D = __S + @\"[\\.． ]\";\r\n\t\tconst string __ND = __N + __D;\r\n\t\tconst string __NN = @\"(?:\\s*[^0-9０-９\\.．一二三四五六七八九十〇]|$)\";\r\n\t\tconst string __UC = \"[A-Z]+\";\r\n\t\tconst string __UCNS = @\"[A-Z0-9\\s]*\";\r\n\t\tconst string __OD = @\"(?:[0-9]+\\.?)?\";\r\n\r\n\t\tstatic readonly MatchPattern[] __Patterns = {\r\n\t\t\tnew MatchPattern (\"^\" + __S + __ND + \"?\" + __NN, true, false, true){ Name =  \"“N.”模式\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + __ND + __ND + \"?\" + __NN, true, false, true){ Name =  \"“N.N”模式\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + __ND + __ND + __ND + \"?\" + __NN, true, false, true){ Name =  \"“N.N.N”模式\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + __ND + __ND + __ND + __ND + \"?\" + __NN, true, false, true){ Name =  \"“N.N.N.N”模式\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + __ND + __ND + __ND + __ND + __ND + \"?\" + __NN, true, false, true){ Name =  \"“N.N.N.N.N”模式\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + \"第\" + __S + __N + __S + \"(?:部分|部)|^\" + __S + \"part\" + __S + \"[0-9]\", false, false, true){ Name =  \"“第N部分”\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + \"第\" + __S + __N + __S + \"[篇卷]|^\" + __S + \"(?:volume|vol)\" + __S + \"[0-9]\", false, false, true){ Name =  \"“第N篇”或“第N卷”\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + \"第\" + __S + __N + __S + \"章|^\" + __S + \"chapter\" + __S + \"[0-9]\", false, false, true){ Name =  \"“第N章”\" },\r\n\t\t\tnew MatchPattern (\"^\" + __S + \"第\" + __S + __N + __S + \"节|^\" + __S + \"section\" + __S + \"[0-9]\", false, false, true){ Name =  \"“第N节”\" },\r\n\t\t\tnew MatchPattern (\"^(?:\" + __S + __OD + __S + __UC + __UCNS + \")+\", true, true, true){ Name =  \"全英文大写\" },\r\n\t\t};\r\n\t\tinternal static void RegisterCommands(CommandRegistry<Controller> registry) {\r\n\t\t\tforeach (var item in __Patterns) {\r\n\t\t\t\tregistry.Register(new QuickSelectCommand(item), item.Name);\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal static void RegisterMenuItems(ToolStripItemCollection container) {\r\n\t\t\tfor (int i = 0; i < __Patterns.Length; i++) {\r\n\t\t\t\tvar item = __Patterns[i];\r\n\t\t\t\tcontainer.Add(new ToolStripMenuItem($\"(&{i}) {item.Name}\") { Name = item.Name });\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal static void RegisterMenuItemsWithPattern(ToolStripItemCollection container) {\r\n\t\t\tforeach (var item in __Patterns) {\r\n\t\t\t\tcontainer.Add(new ToolStripMenuItem(item.Name) { Name = item.Name, Tag = item });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treadonly BookmarkMatcher _command;\r\n\r\n\t\tpublic QuickSelectCommand(MatchPattern command) {\r\n\t\t\t_command = BookmarkMatcher.Create(command.Text, BookmarkMatcher.MatcherType.Regex, command.MatchCase, command.FullMatch);\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tcontroller.View.Bookmark.SearchBookmarks(_command);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/SaveDocumentCommand.cs",
    "content": "﻿using System;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class SaveDocumentCommand : IEditorCommand\r\n\t{\r\n\t\treadonly bool _showDialog, _saveAsBookmark;\r\n\t\tpublic SaveDocumentCommand(bool showDialog, bool saveAsBookmark) {\r\n\t\t\t_saveAsBookmark = saveAsBookmark;\r\n\t\t\t_showDialog = showDialog;\r\n\t\t}\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tif (_saveAsBookmark) {\r\n\t\t\t\tSaveBookmark(controller, _showDialog);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tSavePdf(controller);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SaveBookmark(Controller controller, bool showDialog) {\r\n\t\t\tvar infoDoc = controller.Model.Document;\r\n\t\t\tvar mupdf = controller.Model.PdfDocument;\r\n\t\t\tvar t = new FilePath(controller.Model.DocumentPath);\r\n\t\t\tif (infoDoc == null || infoDoc.DocumentElement == null || t == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (t.HasExtension(Constants.FileExtensions.Xml) == false\r\n\t\t\t\t|| showDialog) {\r\n\t\t\t\tusing (var d = new SaveFileDialog() {\r\n\t\t\t\t\tDefaultExt = Constants.FileExtensions.Xml,\r\n\t\t\t\t\tTitle = \"指定保存文件的路径\",\r\n\t\t\t\t\tFilter = Constants.FileExtensions.XmlFilter + \"|\" + Constants.FileExtensions.TxtFilter\r\n\t\t\t\t}) {\r\n\t\t\t\t\tif (t.ExistsFile) {\r\n\t\t\t\t\t\td.InitialDirectory = t.Directory;\r\n\t\t\t\t\t\td.FileName = t.FileNameWithoutExtension;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (d.ShowDialog() != DialogResult.OK) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tt = d.FileName;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (t.HasExtension(Constants.FileExtensions.Txt)) {\r\n\t\t\t\tusing (var writer = new StreamWriter(t)) {\r\n\t\t\t\t\tconst string indentString = \"\\t\";\r\n\t\t\t\t\twriter.WriteLine(\"#版本=\" + Constants.InfoDocVersion);\r\n\t\t\t\t\tif (mupdf != null) {\r\n\t\t\t\t\t\twriter.WriteLine(\"#\" + Constants.Info.DocumentPath + \"=\" + mupdf.FilePath);\r\n\t\t\t\t\t}\r\n\t\t\t\t\twriter.WriteLine(\"#缩进标记=\" + indentString);\r\n\t\t\t\t\twriter.WriteLine(\"#首页页码=1\");\r\n\t\t\t\t\twriter.WriteLine();\r\n\t\t\t\t\tOutlineManager.WriteSimpleBookmark(writer, infoDoc.BookmarkRoot, 0, indentString);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tt = t.EnsureExtension(Constants.FileExtensions.Xml);\r\n\t\t\t\tvar ws = DocInfoExporter.GetWriterSettings();\r\n\t\t\t\ttry {\r\n\t\t\t\t\tSaveBookmarkDocument(infoDoc, mupdf, t, ws);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (EncoderFallbackException) when (ws.Encoding != Encoding.UTF8) {\r\n\t\t\t\t\tws.Encoding = Encoding.UTF8;\r\n\t\t\t\t\tSaveBookmarkDocument(infoDoc, mupdf, t, ws);\r\n\t\t\t\t}\r\n\t\t\t\tcontroller.View.DocumentPath = t;\r\n\r\n\t\t\t\tRecentFileMenuHelper.AddRecentHistoryFile(t);\r\n\t\t\t}\r\n\t\t\tcontroller.Model.Undo.MarkClean();\r\n\t\t}\r\n\r\n\t\tstatic void SaveBookmarkDocument(Model.PdfInfoXmlDocument infoDoc, MuPDF.Document mupdf, FilePath t, XmlWriterSettings ws) {\r\n\t\t\tusing (var writer = XmlWriter.Create(t, ws)) {\r\n\t\t\t\tif (mupdf != null) {\r\n\t\t\t\t\tinfoDoc.PdfDocumentPath = t.GetRelativePath(mupdf.FilePath);\r\n\t\t\t\t}\r\n\t\t\t\tinfoDoc.WriteContentTo(writer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SavePdf(Controller controller) {\r\n\t\t\tvar m = controller.Model;\r\n\t\t\tvar vv = controller.View.Viewer;\r\n\t\t\tusing (var f = new SavePdfForm(m.GetPdfFilePath(), m.LastSavedPdfPath, m.Document)) {\r\n\t\t\t\tf.DoWork = (s, args) => vv.CloseFile();\r\n\t\t\t\tf.Finished = (success) => {\r\n\t\t\t\t\tvv.Reopen();\r\n\t\t\t\t\tvv.Enabled = true;\r\n\t\t\t\t\tif (success) { m.Undo.MarkClean(); }\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tvv.Enabled = false;\r\n\t\t\t\t\tm.Document.PdfDocumentPath = f.SourceFilePath;\r\n\t\t\t\t\tm.LastSavedPdfPath = f.TargetFilePath;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/SavePageImageCommand.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor.Imaging;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class SavePageImageCommand : IEditorCommand\r\n\t{\r\n\t\tstatic SaveFileDialog _dialog;\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tvar l = v.PinPoint;\r\n\t\t\tvar p = v.TransposeVirtualImageToPagePosition(l.X, l.Y);\r\n\t\t\t_dialog = InitDialog();\r\n\t\t\t_dialog.FileName = ((FilePath)controller.Model.DocumentPath).FileNameWithoutExtension + \".\" + p.Page;\r\n\r\n\t\t\tif (_dialog.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t_dialog.DefaultExt = ((FilePath)_dialog.FileName).FileExtension;\r\n\t\t\t\tv.GetPageImage(p.Page).SaveAs(_dialog.FileName);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic SaveFileDialog InitDialog() {\r\n\t\t\treturn _dialog ??= new SaveFileDialog {\r\n\t\t\t\tDefaultExt = Constants.FileExtensions.Png,\r\n\t\t\t\tFilter = Constants.FileExtensions.ImageFilter\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/SimpleBookmarkCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class SimpleBookmarkCommand<T> : IEditorCommand where T : IPdfInfoXmlProcessor, new()\r\n\t{\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tif (b.FocusedItem == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcontroller.ProcessBookmarks(new T());\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class SimpleBookmarkCommand<T, P> : IEditorCommand where T : IPdfInfoXmlProcessor<P>, new()\r\n\t{\r\n\t\treadonly P _parameter;\r\n\r\n\t\tpublic SimpleBookmarkCommand(P parameter) {\r\n\t\t\t_parameter = parameter;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar b = controller.View.Bookmark;\r\n\t\t\tif (b.FocusedItem == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcontroller.ProcessBookmarks(new T() { Parameter = _parameter });\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/ViewerCommand.cs",
    "content": "﻿using System.Drawing;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class ViewerCommand : IEditorCommand\r\n\t{\r\n\t\tstatic readonly Color __DarkModeColor = Color.DarkGray;\r\n\t\tstatic readonly Color __GreenModeColor = Color.FromArgb(0xCC, 0xFF, 0xCC);\r\n\t\tstatic readonly string[] __commands = {\r\n\t\t\t\"_FirstPage\",\r\n\t\t\t\"_PreviousPage\",\r\n\t\t\t\"_NextPage\",\r\n\t\t\t\"_LastPage\",\r\n\t\t\t\"_ScrollVertical\",\r\n\t\t\t\"_ScrollHorizontal\",\r\n\t\t\t\"_TrueColorSpace\",\r\n\t\t\t\"_GrayColorSpace\",\r\n\t\t\t\"_InvertColor\",\r\n\t\t\t\"_MoveMode\",\r\n\t\t\t\"_SelectionMode\",\r\n\t\t\t\"_FullPageScroll\",\r\n\t\t\t\"_ShowTextBorders\",\r\n\t\t\t\"_DarkMode\",\r\n\t\t\t\"_GreenMode\",\r\n\t\t\t\"_ShowBookmarks\",\r\n\t\t\t\"_ShowAnnotations\",\r\n\t\t\t\"_OcrDetectPunctuation\",\r\n\t\t\t\"_FullScreen\"\r\n\t\t};\r\n\t\tinternal static void RegisterCommands(CommandRegistry<Controller> registry) {\r\n\t\t\tforeach (var item in __commands) {\r\n\t\t\t\tregistry.Register(new ViewerCommand(item), item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treadonly string _command;\r\n\r\n\t\tpublic ViewerCommand(string command) {\r\n\t\t\t_command = command;\r\n\t\t}\r\n\r\n\t\tpublic void Process(Controller controller, params string[] parameters) {\r\n\t\t\tvar v = controller.View.Viewer;\r\n\t\t\tswitch (_command) {\r\n\t\t\t\tcase \"_FirstPage\":\r\n\t\t\t\tcase \"_PreviousPage\":\r\n\t\t\t\tcase \"_NextPage\":\r\n\t\t\t\tcase \"_LastPage\": v.ExecuteCommand(_command); break;\r\n\t\t\t\tcase \"_ScrollVertical\": v.ContentDirection = Editor.ContentDirection.TopToDown; break;\r\n\t\t\t\tcase \"_ScrollHorizontal\": v.ContentDirection = Editor.ContentDirection.RightToLeft; break;\r\n\t\t\t\tcase \"_TrueColorSpace\": v.GrayScale = false; break;\r\n\t\t\t\tcase \"_GrayColorSpace\": v.GrayScale = true; break;\r\n\t\t\t\tcase \"_InvertColor\": v.InvertColor = !v.InvertColor; break;\r\n\t\t\t\tcase \"_MoveMode\": v.MouseMode = Editor.MouseMode.Move; break;\r\n\t\t\t\tcase \"_SelectionMode\": v.MouseMode = Editor.MouseMode.Selection; break;\r\n\t\t\t\tcase \"_FullPageScroll\": v.FullPageScroll = !v.FullPageScroll; break;\r\n\t\t\t\tcase \"_ShowTextBorders\": v.ShowTextBorders = !v.ShowTextBorders; break;\r\n\t\t\t\tcase \"_DarkMode\": v.TintColor = v.TintColor != __DarkModeColor ? __DarkModeColor : Color.Transparent; break;\r\n\t\t\t\tcase \"_GreenMode\": v.TintColor = v.TintColor != __GreenModeColor ? __GreenModeColor : Color.Transparent; break;\r\n\t\t\t\tcase \"_ShowAnnotations\": v.HideAnnotations = !v.HideAnnotations; break;\r\n\t\t\t\tcase \"_ShowBookmarks\": controller.View.MainPanel.Panel1Collapsed = !controller.View.MainPanel.Panel1Collapsed; break;\r\n\t\t\t\tcase \"_OcrDetectPunctuation\": v.OcrOptions.DetectContentPunctuations = !v.OcrOptions.DetectContentPunctuations; break;\r\n\t\t\t\tcase \"_FullScreen\": AppContext.MainForm.FullScreen = !AppContext.MainForm.FullScreen; break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Commands/ViewerScrollToBookmarkCommand.cs",
    "content": "﻿using System;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\t/// <summary>\r\n\t/// 将阅读器的视图滚动到和书签编辑器选中书签对应的位置。\r\n\t/// </summary>\r\n\tsealed class ViewerScrollToBookmarkCommand : IEditorCommand\r\n\t{\r\n\t\tpublic void Process(Controller context, params string[] parameters) {\r\n\t\t\tBookmarkElement el;\r\n\t\t\tvar b = context.View.Bookmark;\r\n\t\t\tvar i = b.GetFirstSelectedIndex();\r\n\t\t\tif (i == -1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tel = b.GetModelObject(i) as BookmarkElement;\r\n\t\t\tif (context.Model.LockDownViewer == false\r\n\t\t\t\t&& b.SelectedIndices.Count == 1\r\n\t\t\t\t&& (i = el.Page) > 0\r\n\t\t\t\t&& el.Action == Constants.ActionType.Goto) {\r\n\t\t\t\tvar v = context.View.Viewer;\r\n\t\t\t\tif (context.Model.PdfDocument != null && el.Page > 0 && el.Page <= v.Document.PageCount) {\r\n\t\t\t\t\tvar pb = v.GetPageBound(el.Page);\r\n\t\t\t\t\tv.ScrollToPosition(new Editor.PagePosition(el.Page,\r\n\t\t\t\t\t\tv.HorizontalFlow ? el.Left > pb.Width ? pb.Width : el.Left : 0,\r\n\t\t\t\t\t\tv.HorizontalFlow || el.Top == 0 ? 0 : el.Top.LimitInRange(pb.Top, pb.Bottom),\r\n\t\t\t\t\t\t0, 0, true)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Controller.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing BrightIdeasSoftware;\r\nusing MuPDF.Extensions;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed class Controller\r\n\t{\r\n\t\tpublic EditModel Model { get; }\r\n\t\tpublic IEditView View { get; }\r\n\r\n\t\tBackgroundWorker _loader;\r\n\r\n\t\tpublic Controller(IEditView view) {\r\n\t\t\tModel = new EditModel();\r\n\t\t\tView = view;\r\n\t\t\tModel.Undo.OnAddUndo += (UndoManager u, IUndoAction a) => View.UndoButton.Enabled = true;\r\n\t\t\tView.Bookmark.Undo = Model.Undo;\r\n\t\t}\r\n\t\tpublic bool IsBusy => _loader?.IsBusy == true;\r\n\r\n\t\tpublic void ExecuteCommand(string command, params string[] parameters) {\r\n\t\t\tEditorCommands.Execute(command, this, parameters);\r\n\t\t}\r\n\r\n\t\tinternal IEnumerable<XmlNode> ProcessBookmarks(IPdfInfoXmlProcessor processor) {\r\n\t\t\treturn ProcessBookmarks(View.AffectsDescendantBookmarks, true, processor);\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 逐个处理选中的书签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"includeDescendant\">处理操作是否包含选中书签的内层书签。</param>\r\n\t\t/// <param name=\"selectChildren\">处理时是否遍历选中的内层书签。</param>\r\n\t\t/// <param name=\"processor\">用于处理书签的 <see cref=\"IPdfInfoXmlProcessor\"/>。</param>\r\n\t\t/// <returns>处理后的书签。</returns>\r\n\t\tinternal IEnumerable<XmlNode> ProcessBookmarks(bool includeDescendant, bool selectChildren, IPdfInfoXmlProcessor processor) {\r\n\t\t\tvar b = View.Bookmark;\r\n\t\t\tb.Freeze();\r\n\t\t\tvar si = b.GetSelectedElements(selectChildren);\r\n\t\t\tvar pi = new HashSet<XmlElement>();\r\n\t\t\tvar r = ProcessBookmarks(si, pi, includeDescendant, processor);\r\n\t\t\tif (r != null) {\r\n\t\t\t\tforeach (var item in r) {\r\n\t\t\t\t\tvar i = item as XmlElement;\r\n\t\t\t\t\tif (i.ParentNode.Name == Constants.DocumentBookmark) {\r\n\t\t\t\t\t\tb.Roots = i.ParentNode.SelectNodes(Constants.Bookmark).ToXmlNodeArray();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tb.FireBookmarkChanged();\r\n\t\t\t\tb.RefreshObjects(r.ToArray());\r\n\t\t\t}\r\n\t\t\tb.Unfreeze();\r\n\t\t\treturn r;\r\n\t\t}\r\n\t\tHashSet<XmlNode> ProcessBookmarks(IList si, HashSet<XmlElement> processedItems, bool includeDescendant, IPdfInfoXmlProcessor processor) {\r\n\t\t\tif (si == null || si.Count == 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tforeach (BookmarkElement item in si) {\r\n\t\t\t\tProcessItem(includeDescendant, processor, processedItems, undo, item);\r\n\t\t\t}\r\n\t\t\tif (undo.Count > 0) {\r\n\t\t\t\tModel.Undo.AddUndo(processor.Name, undo);\r\n\t\t\t}\r\n\t\t\treturn new HashSet<XmlNode>(undo.AffectedElements);\r\n\t\t}\r\n\r\n\t\tstatic void ProcessItem(bool includeDescendant, IPdfInfoXmlProcessor processor, HashSet<XmlElement> processedItems, UndoActionGroup undo, BookmarkElement item) {\r\n\t\t\tif (item == null || processedItems.Contains(item)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tundo.Add(processor.Process(item));\r\n\t\t\tprocessedItems.Add(item);\r\n\t\t\tif (includeDescendant) {\r\n\t\t\t\tforeach (BookmarkElement d in item.SubBookmarks) {\r\n\t\t\t\t\tProcessItem(includeDescendant, processor, processedItems, undo, d);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ClearBookmarks() {\r\n\t\t\tModel.Document.BookmarkRoot.RemoveAll();\r\n\t\t\tView.Bookmark.ClearObjects();\r\n\t\t}\r\n\r\n\t\tvoid LoadPdfDocument() {\r\n\t\t\tvar s = Model.GetPdfFilePath();\r\n\t\t\tvar v = View.Viewer;\r\n\t\t\tif (s != null) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar d = v.Document;\r\n\t\t\t\t\tModel.PdfDocument = v.Document = PdfHelper.OpenMuDocument(s);\r\n\t\t\t\t\td.TryDispose();\r\n\t\t\t\t\tView.AutoBookmark.TryDispose();\r\n\t\t\t\t\tv.Enabled = true;\r\n\t\t\t\t\tView.ViewerToolbar.Enabled = true;\r\n\t\t\t\t\tView.Viewer.Invalidate();\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tAppContext.MainForm.ErrorBox(\"加载文件时出错\", ex);\r\n\t\t\t\t\ts = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (s == null) {\r\n\t\t\t\tUninitialize(v);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void Uninitialize(ViewerControl v) {\r\n\t\t\tv.Document.TryDispose();\r\n\t\t\tView.AutoBookmark.TryDispose();\r\n\t\t\tModel.PdfDocument = v.Document = null;\r\n\t\t\tv.Enabled = false;\r\n\t\t\tView.ViewerToolbar.Enabled = false;\r\n\t\t}\r\n\r\n\t\tinternal void Destroy() {\r\n\t\t\tif (_loader != null) {\r\n\t\t\t\t_loader.RunWorkerCompleted -= _LoadBookmarkWorker_RunWorkerCompleted;\r\n\t\t\t\t_loader.Dispose();\r\n\t\t\t}\r\n\t\t\tModel.PdfDocument.TryDispose();\r\n\t\t\tView.AutoBookmark.TryDispose();\r\n\t\t}\r\n\r\n\t\tinternal void InitBookmarkEditor() {\r\n\t\t\tModel.Undo.Clear();\r\n\t\t\tView.Bookmark.DeselectAll();\r\n\t\t\tView.UndoButton.DropDown.Items.Clear();\r\n\t\t\tView.UndoButton.Enabled = false;\r\n\t\t\tView.Bookmark.ClearMarks(false);\r\n\t\t}\r\n\r\n\t\tinternal void LoadDocument(string path, bool importMode) {\r\n\t\t\tif (File.Exists(path) == false) {\r\n\t\t\t\tFormHelper.ErrorBox(\"找不到文件：\" + path);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar ext = Path.GetExtension(path).ToLowerInvariant();\r\n\t\t\tvar infoDoc = new PdfInfoXmlDocument();\r\n\t\t\tswitch (ext) {\r\n\t\t\t\tcase Constants.FileExtensions.Txt:\r\n\t\t\t\t\tOutlineManager.ImportSimpleBookmarks(path, infoDoc);\r\n\t\t\t\t\tgoto case \"<load>\";\r\n\t\t\t\tcase Constants.FileExtensions.Xml:\r\n\t\t\t\t\tinfoDoc.Load(path);\r\n\t\t\t\t\tgoto case \"<load>\";\r\n\t\t\t\tcase Constants.FileExtensions.Pdf:\r\n\t\t\t\t\tView.MainPanel.Enabled = View.BookmarkToolbar.Enabled = false;\r\n\t\t\t\t\tif (importMode == false) {\r\n\t\t\t\t\t\tView.DocumentPath = path;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_loader = new BackgroundWorker();\r\n\t\t\t\t\t_loader.RunWorkerCompleted += _LoadBookmarkWorker_RunWorkerCompleted;\r\n\t\t\t\t\t_loader.DoWork += _LoadBookmarkWorker_DoWork;\r\n\t\t\t\t\tModel.IsLoadingDocument = true;\r\n\t\t\t\t\t_loader.RunWorkerAsync(new object[] { path, importMode });\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"<load>\":\r\n\t\t\t\t\tif (importMode) {\r\n\t\t\t\t\t\tLoadInfoDocument(infoDoc, importMode);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tView.Bookmark.ClearObjects();\r\n\t\t\t\t\tView.DocumentPath = path;\r\n\t\t\t\t\tLoadInfoDocument(infoDoc, importMode);\r\n\t\t\t\t\tLoadPdfDocument();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tRecentFileMenuHelper.AddRecentHistoryFile(path);\r\n\t\t}\r\n\r\n\t\tvoid _LoadBookmarkWorker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar args = e.Argument as object[];\r\n\t\t\tvar path = args[0] as string;\r\n\t\t\tbool importMode = (bool)args[1];\r\n\t\t\tTracker.DebugMessage(\"open file\");\r\n\t\t\tusing (var reader = PdfHelper.OpenPdfFile(path, AppContext.LoadPartialPdfFile, false)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tTracker.DebugMessage(\"consolidate\");\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\treader.ConsolidateNamedDestinations();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.DebugMessage(\"get bookmark\");\r\n\t\t\t\t\te.Result = new object[] {\r\n\t\t\t\t\tOutlineManager.GetBookmark (reader, new UnitConverter () { Unit = Constants.Units.Point }),\r\n\t\t\t\t\t\timportMode,\r\n\t\t\t\t\t\tpath\r\n\t\t\t\t\t};\r\n\t\t\t\t\tTracker.DebugMessage(\"finished loading\");\r\n\t\t\t\t}\r\n\t\t\t\tcatch (iTextSharp.text.exceptions.BadPasswordException) {\r\n\t\t\t\t\tFormHelper.ErrorBox(Messages.PasswordInvalid);\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, Messages.PasswordInvalid);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tAppContext.MainForm.ErrorBox(\"在打开 PDF 文件时遇到错误\", ex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _LoadBookmarkWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\t((BackgroundWorker)sender).Dispose();\r\n\t\t\tModel.IsLoadingDocument = false;\r\n\t\t\tView.MainPanel.Enabled = View.BookmarkToolbar.Enabled = true;\r\n\t\t\tvar r = e.Error == null ? e.Result as object[] : null;\r\n\t\t\tif (r == null) {\r\n\t\t\t\t// 异常终止\r\n\t\t\t\tClearBookmarks();\r\n\t\t\t\tInitBookmarkEditor();\r\n\t\t\t\tUninitialize(View.Viewer);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tLoadPdfDocument();\r\n\t\t\tvar importMode = (bool)r[1];\r\n\t\t\tif (importMode == false) {\r\n\t\t\t\tView.DocumentPath = r[2] as string;\r\n\t\t\t}\r\n\t\t\tif (r[0] is XmlElement b) {\r\n\t\t\t\tvar infoDoc = new PdfInfoXmlDocument();\r\n\t\t\t\tvar root = infoDoc.DocumentElement;\r\n\t\t\t\t(root.AppendChild(infoDoc.CreateElement(Constants.Units.ThisName)) as XmlElement).SetAttribute(Constants.Units.Unit, Constants.Units.Point);\r\n\t\t\t\troot.AppendChild(infoDoc.ImportNode(b, true));\r\n\t\t\t\tLoadInfoDocument(infoDoc, importMode);\r\n\t\t\t\tif (importMode == false) {\r\n\t\t\t\t\tinfoDoc.PdfDocumentPath = Model.DocumentPath;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (importMode) {\r\n\t\t\t\t\tFormHelper.InfoBox(\"文档不包含书签。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tClearBookmarks();\r\n\t\t\t\tInitBookmarkEditor();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void LoadInfoDocument(PdfInfoXmlDocument document, bool importMode) {\r\n\t\t\tvar b = View.Bookmark;\r\n\t\t\tvar m = document.Bookmarks;\r\n\t\t\tif (importMode) {\r\n\t\t\t\tif (m.Count > 0) {\r\n\t\t\t\t\tImportBookmarks(b, m);\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// 文档不包含书签\r\n\t\t\tif (m.Count == 0) {\r\n\t\t\t\tClearBookmarks();\r\n\t\t\t\tInitBookmarkEditor();\r\n\t\t\t\tModel.Document = new PdfInfoXmlDocument();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tModel.Document = document;\r\n\t\t\tLoadBookmarks(b, m);\r\n\t\t\tif (Model.PdfDocument != null && document.PageLabelRoot.HasChildNodes) {\r\n\t\t\t\tvar pl = Model.PageLabels;\r\n\t\t\t\tpl.Clear();\r\n\t\t\t\tforeach (PageLabelElement item in document.PageLabels) {\r\n\t\t\t\t\tpl.Add(item.ToPageLabel());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid LoadBookmarks(BookmarkEditorView view, XmlNodeList bookmarks) {\r\n\t\t\tInitBookmarkEditor();\r\n\t\t\tview.LoadBookmarks(bookmarks);\r\n\t\t}\r\n\r\n\t\tvoid ImportBookmarks(BookmarkEditorView editView, XmlNodeList bookmarks) {\r\n\t\t\tvar d = Model.Document;\r\n\t\t\tvar g = new UndoActionGroup();\r\n\t\t\tvar s = editView.GetFirstSelectedModel<BookmarkElement>();\r\n\t\t\tvar il = new List<XmlNode>();\r\n\t\t\tXmlElement n;\r\n\t\t\tif (s != null) {\r\n\t\t\t\tforeach (XmlNode item in bookmarks) {\r\n\t\t\t\t\tn = s.AppendChild(d.ImportNode(item, true)) as XmlElement;\r\n\t\t\t\t\tg.Add(new RemoveElementAction(n));\r\n\t\t\t\t\til.Add(n);\r\n\t\t\t\t}\r\n\t\t\t\teditView.RefreshObject(s);\r\n\t\t\t\teditView.Expand(s);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar r = d.BookmarkRoot;\r\n\t\t\t\tforeach (XmlNode item in bookmarks) {\r\n\t\t\t\t\tn = r.AppendChild(d.ImportNode(item, true)) as XmlElement;\r\n\t\t\t\t\tg.Add(new RemoveElementAction(n));\r\n\t\t\t\t\til.Add(n);\r\n\t\t\t\t}\r\n\t\t\t\teditView.Roots = d.Bookmarks;\r\n\t\t\t}\r\n\t\t\teditView.SelectedObjects = il;\r\n\t\t\tModel.Undo.AddUndo(\"导入书签\", g);\r\n\t\t}\r\n\r\n\t\tinternal EditModel.Region CopyText(Point cp, PagePosition pp) {\r\n\t\t\tvar v = View.Viewer;\r\n\t\t\tvar ps = v.IsClientPointInSelection(cp);\r\n\t\t\tvar lines = ps ? v.FindTextLines(v.GetSelectionPageRegion()) : v.FindTextLines(pp).Lines;\r\n\t\t\tstring t = null;\r\n\t\t\tEditModel.TextSource ts;\r\n\t\t\tif (Model.InsertBookmarkWithOcrOnly == false && lines.HasContent()) {\r\n\t\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\t\tvar r = lines[0].Bound;\r\n\t\t\t\tforeach (var line in lines) {\r\n\t\t\t\t\tif (sb.Length > 100) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tt = line.GetText().TrimEnd();\r\n\t\t\t\t\tif (sb.Length > 0 && t.Length > 0) {\r\n\t\t\t\t\t\tvar c = t[0];\r\n\t\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t\t\tr = r.Union(line.Bound);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsb.Append(t);\r\n\t\t\t\t}\r\n\t\t\t\tt = StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t\t\tvar b = v.MuRectangleToImageRegion(pp.Page, r);\r\n\t\t\t\tv.SelectionRegion = b;\r\n\t\t\t\tv.PinPoint = b.Location.Round();\r\n\t\t\t\tb.Offset(v.GetVirtualImageOffset(pp.Page));\r\n\t\t\t\tpp = v.TransposeVirtualImageToPagePosition(pp.Page, v.PinPoint.X, v.PinPoint.Y);\r\n\t\t\t\tts = EditModel.TextSource.Text;\r\n\t\t\t}\r\n\t\t\telse if (t == null && ModiOcr.ModiInstalled && v.OcrLanguage != 0) {\r\n\t\t\t\tv.UseWaitCursor = true;\r\n\t\t\t\tvar r = v.OcrPage(pp.Page, true);\r\n\t\t\t\tv.UseWaitCursor = false;\r\n\t\t\t\tif (r.HasContent()) {\r\n\t\t\t\t\tvar ir = v.GetSelection().ImageRegion;\r\n\t\t\t\t\tvar ib = new Bound(ir.Left, ir.Bottom, ir.Right, ir.Top);\r\n\t\t\t\t\tvar b = RectangleF.Empty;\r\n\t\t\t\t\tif (ps) {\r\n\t\t\t\t\t\tvar mr = r.FindAll((i) => i.Region.IntersectWith(ib));\r\n\t\t\t\t\t\tif (mr.HasContent()) {\r\n\t\t\t\t\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\t\t\t\t\tb = mr[0].Region;\r\n\t\t\t\t\t\t\tforeach (var line in mr) {\r\n\t\t\t\t\t\t\t\tt = OcrProcessor.CleanUpText(line.Text, v.OcrOptions);\r\n\t\t\t\t\t\t\t\tif (sb.Length > 0 && t.Length > 0) {\r\n\t\t\t\t\t\t\t\t\tvar c = t[0];\r\n\t\t\t\t\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t\t\t\t\t\tb = b.Union(line.Region);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tsb.Append(t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tt = StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar l = v.TransposeClientToPageImage(cp.X, cp.Y);\r\n\t\t\t\t\t\tvar tl = r.Find((i) => i.Region.Contains(l.ImageX, l.ImageY));\r\n\t\t\t\t\t\tif (tl != null) {\r\n\t\t\t\t\t\t\tt = tl.Text;\r\n\t\t\t\t\t\t\tb = (RectangleF)tl.Region;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (b != RectangleF.Empty) {\r\n\t\t\t\t\t\tb.Offset(v.GetVirtualImageOffset(pp.Page));\r\n\t\t\t\t\t\tv.SelectionRegion = b;\r\n\t\t\t\t\t\tv.PinPoint = b.Location.Round();\r\n\t\t\t\t\t\tpp = v.TransposeVirtualImageToPagePosition(pp.Page, b.Left.ToInt32(), b.Top.ToInt32());\r\n\t\t\t\t\t\tts = EditModel.TextSource.OcrText;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tts = EditModel.TextSource.Empty;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tts = EditModel.TextSource.OcrError;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tv.PinPoint = v.PointToImage(cp);\r\n\t\t\t\tts = EditModel.TextSource.Empty;\r\n\t\t\t}\r\n\t\t\treturn new EditModel.Region(pp, t, ts);\r\n\t\t}\r\n\r\n\t\tinternal void InsertBookmark(InsertBookmarkPositionType position = InsertBookmarkPositionType.Undefined) {\r\n\t\t\tif (position == InsertBookmarkPositionType.Undefined) {\r\n\t\t\t\tposition = (Control.ModifierKeys & Keys.Shift) > 0 ? InsertBookmarkPositionType.BeforeCurrent : InsertBookmarkPositionType.AfterCurrent;\r\n\t\t\t}\r\n\t\t\tif (Model.PdfDocument != null) {\r\n\t\t\t\tvar pn = View.Viewer.CurrentPageNumber;\r\n\t\t\t\tvar p = View.Viewer.TransposeClientToPagePosition(0, 0).PageY;\r\n\t\t\t\tvar pt = View.Viewer.GetPageBound(pn).Y1;\r\n\t\t\t\tif (pt < p) {\r\n\t\t\t\t\tp = pt;\r\n\t\t\t\t}\r\n\t\t\t\tInsertBookmark(null, pn, p, position);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tInsertBookmark(null, 0, 0, position);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void InsertBookmark(string title, int pageNumber, float position, InsertBookmarkPositionType type) {\r\n\t\t\tvar b = View.Bookmark;\r\n\t\t\tvar d = Model.Document;\r\n\t\t\tint i = b.SelectedIndex;\r\n\t\t\tBookmarkElement c = null;\r\n\t\t\tif (i == -1 && b.Items.Count == 0) {\r\n\t\t\t\tc = d.BookmarkRoot.AppendBookmark();\r\n\t\t\t\tModel.Undo.AddUndo(\"插入书签\", new RemoveElementAction(c));\r\n\t\t\t\tvar s = title ?? Path.GetFileNameWithoutExtension(Model.DocumentPath);\r\n\t\t\t\tc.SetTitleAndGotoPagePosition(\r\n\t\t\t\t\tstring.IsNullOrEmpty(s) ? Constants.Bookmark : s,\r\n\t\t\t\t\tpageNumber > 0 ? pageNumber : 1,\r\n\t\t\t\t\tposition);\r\n\t\t\t\tb.Roots = new XmlElement[] { c };\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar o = b.GetModelObject(i != -1 ? i : b.GetItemCount() - 1) as BookmarkElement;\r\n\t\t\t\tvar t = title ?? Constants.Bookmark;\r\n\t\t\t\tvar p = pageNumber > 0 ? pageNumber : o.Page;\r\n\t\t\t\tif (type == InsertBookmarkPositionType.Undefined) {\r\n\t\t\t\t\tvar g = new UndoActionGroup();\r\n\t\t\t\t\tif (t.Length > 0) {\r\n\t\t\t\t\t\tg.SetAttribute(o, Constants.BookmarkAttributes.Title, t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tg.SetAttribute(o, Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\t\t\tg.SetAttribute(o, Constants.DestinationAttributes.Page, p.ToText());\r\n\t\t\t\t\tg.SetAttribute(o, Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\t\tg.SetAttribute(o, Constants.Coordinates.Top, position.ToText());\r\n\t\t\t\t\tModel.Undo.AddUndo(\"替换书签\", g);\r\n\t\t\t\t\tc = o;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tc = d.CreateBookmark();\r\n\t\t\t\t\tc.SetTitleAndGotoPagePosition(t, p, position);\r\n\t\t\t\t\tswitch (type) {\r\n\t\t\t\t\t\tcase InsertBookmarkPositionType.AfterCurrent:\r\n\t\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t\tcase InsertBookmarkPositionType.AsChild:\r\n\t\t\t\t\t\t\to.AppendChild(c);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase InsertBookmarkPositionType.AfterParent:\r\n\t\t\t\t\t\t\tif (o.ParentBookmark != null) {\r\n\t\t\t\t\t\t\t\to.ParentBookmark.ParentNode.InsertAfter(c, o.ParentBookmark);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase InsertBookmarkPositionType.BeforeCurrent:\r\n\t\t\t\t\t\t\to.ParentNode.InsertBefore(c, o);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase InsertBookmarkPositionType.AfterGrandParent:\r\n\t\t\t\t\t\t\tif (o.ParentBookmark?.ParentBookmark != null) {\r\n\t\t\t\t\t\t\t\to.ParentBookmark.ParentBookmark.ParentNode.InsertAfter(c, o.ParentBookmark.ParentBookmark);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tgoto case InsertBookmarkPositionType.AfterParent;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase InsertBookmarkPositionType.LastRoot:\r\n\t\t\t\t\t\t\to.BookmarkRoot.AppendChild(c);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\to.ParentNode.InsertAfter(c, o);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tModel.Undo.AddUndo(\"插入书签\", new RemoveElementAction(c));\r\n\t\t\t\t}\r\n\t\t\t\tif (c.ParentNode.Name == Constants.DocumentBookmark) {\r\n\t\t\t\t\tb.SetObjects(c.Parent.SubBookmarks);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tb.RefreshObject(c.ParentNode);\r\n\t\t\t\t\tb.RefreshObject(c);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (c != null) {\r\n\t\t\t\tif (c.ParentNode.Name == Constants.Bookmark) {\r\n\t\t\t\t\tb.Expand(c.ParentNode);\r\n\t\t\t\t}\r\n\t\t\t\tb.Expand(c);\r\n\t\t\t\tb.EnsureItemsVisible(new BookmarkElement[] { c });\r\n\t\t\t\tb.SelectedObjects = new BookmarkElement[] { c };\r\n\t\t\t\tb.FocusedObject = c;\r\n\t\t\t\tb.ModelToItem (c).BeginEdit ();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void Undo(int step) {\r\n\t\t\tif (Model.Undo.CanUndo == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tModel.LockDownViewer = true;\r\n\t\t\tvar sl = View.Bookmark.SelectedObjects;\r\n\t\t\tXmlElement e;\r\n\t\t\tbool r = false; // 是否需要刷新根节点\r\n\t\t\tvar rl = new HashSet<XmlNode>();\r\n\t\t\twhile (step-- > 0) {\r\n\t\t\t\tvar a = Model.Undo.Undo();\r\n\t\t\t\tforeach (var item in a) {\r\n\t\t\t\t\te = item as XmlElement;\r\n\t\t\t\t\tif (r == false && e.Name == Constants.DocumentBookmark) {\r\n\t\t\t\t\t\tr = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\trl.Add(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tView.Bookmark.RefreshObjects(rl.ToArray());\r\n\t\t\tif (r) {\r\n\t\t\t\tView.Bookmark.Roots = Model.Document.Bookmarks;\r\n\t\t\t}\r\n\t\t\tView.Bookmark.SelectedObjects = sl;\r\n\t\t\tView.UndoButton.Enabled = Model.Undo.CanUndo;\r\n\t\t\tModel.LockDownViewer = false;\r\n\t\t\tView.Bookmark.FireBookmarkChanged();\r\n\t\t}\r\n\r\n\t\tinternal void MergeBookmark(IList<BookmarkElement> es) {\r\n\t\t\tvar l = es.Count;\r\n\t\t\tif (l < 2) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar p = es[0].ParentNode;\r\n\t\t\tfor (int i = 1; i < l; i++) {\r\n\t\t\t\tif (es[i].ParentNode != p && es[i].ParentNode != es[0]) {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"合并的书签必须有相同的上级书签。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tvar ts = new string[l];\r\n\t\t\tvar dest = es[0];\r\n\t\t\tts[0] = dest.Title;\r\n\t\t\tvar ct = dest.OwnerDocument.CreateDocumentFragment();\r\n\t\t\tfor (int i = 1; i < l; i++) {\r\n\t\t\t\tref var title = ref ts[i];\r\n\t\t\t\tvar be = es[i];\r\n\t\t\t\ttitle = be.GetAttribute(Constants.BookmarkAttributes.Title);\r\n\t\t\t\tif (title.Length > 0) {\r\n\t\t\t\t\tvar c = title[0];\r\n\t\t\t\t\tif (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {\r\n\t\t\t\t\t\ttitle = \" \" + title;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\twhile (be.HasChildNodes) {\r\n\t\t\t\t\tif (be.FirstChild is not XmlElement c) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tundo.Add(new AddElementAction(c));\r\n\t\t\t\t\tct.AppendChild(c);\r\n\t\t\t\t}\r\n\t\t\t\tif (be.ParentNode == p) {\r\n\t\t\t\t\tundo.Add(new AddElementAction(be));\r\n\t\t\t\t\tp.RemoveChild(be);\r\n\t\t\t\t}\r\n\t\t\t\telse /*be.ParentNode = es[0]*/ {\r\n\t\t\t\t\tundo.Add(new AddElementAction(be));\r\n\t\t\t\t\tdest.RemoveChild(be);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twhile (ct.HasChildNodes) {\r\n\t\t\t\tdest.AppendChild(ct.FirstChild);\r\n\t\t\t}\r\n\t\t\tundo.Add(UndoAttributeAction.GetUndoAction(dest, Constants.BookmarkAttributes.Title, String.Concat(ts)));\r\n\t\t\tvar b = View.Bookmark;\r\n\t\t\tif (p.Name != Constants.DocumentBookmark) {\r\n\t\t\t\tb.RefreshObject(p);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tb.SetObjects(p.SelectNodes(Constants.Bookmark));\r\n\t\t\t}\r\n\t\t\tModel.Undo.AddUndo(\"合并书签\", undo);\r\n\t\t\tb.RefreshObject(dest);\r\n\t\t\tb.SelectObject(dest);\r\n\t\t}\r\n\r\n\r\n\t\tinternal void ConfigAutoBookmarkTextStyles(int level, Editor.TextInfo textInfo) {\r\n\t\t\tif (textInfo.Spans == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var span in textInfo.Spans) {\r\n\t\t\t\tvar s = span.Font;\r\n\t\t\t\tif (s == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar fn = PdfDocumentFont.RemoveSubsetPrefix(s.Name);\r\n\t\t\t\tbool m = false;\r\n\t\t\t\tint fs = span.Size.ToInt32();\r\n\t\t\t\tforeach (var item in Model.TitleStyles) {\r\n\t\t\t\t\tif (item.FontSize == fs && item.FontName == fn && item.MatchPattern == null) {\r\n\t\t\t\t\t\tm = true;\r\n\t\t\t\t\t\tgoto NEXT;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (m == false) {\r\n\t\t\t\t\tModel.TitleStyles.Add(new EditModel.AutoBookmarkSettings(level, fn, fs));\r\n\t\t\t\t}\r\n\t\t\tNEXT:;\r\n\t\t\t}\r\n\t\t\tShowAutoBookmarkForm();\r\n\t\t}\r\n\r\n\t\tinternal void ShowAutoBookmarkForm() {\r\n\t\t\tvar f = View.AutoBookmark;\r\n\t\t\tif (f.Visible == false) {\r\n\t\t\t\tf.Location = Cursor.Position.Transpose(-16, -16);\r\n\t\t\t\tf.Show(View.Viewer);\r\n\t\t\t}\r\n\t\t\tf.SetValues(Model.TitleStyles);\r\n\t\t}\r\n\r\n\t\tinternal void AutoBookmark(IEnumerable<EditModel.AutoBookmarkSettings> list, bool mergeAdjacentTitle, bool keepExisting) {\r\n\t\t\tView.Bookmark.CancelCellEdit();\r\n\t\t\tvar pdf = Model.PdfDocument;\r\n\t\t\tBookmarkContainer bm = Model.Document.BookmarkRoot;\r\n\t\t\tvar c = pdf.PageCount;\r\n\t\t\tvar bs = new List<EditModel.AutoBookmarkSettings>(list);\r\n\t\t\tif (bs.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbs.Sort((x, y) => x.Level - y.Level);\r\n\t\t\tvar mp = new Func<string, bool>[bs.Count];\r\n\t\t\tfor (var i = 0; i < bs.Count; i++) {\r\n\t\t\t\tvar m = bs[i].MatchPattern?.CreateMatcher();\r\n\t\t\t\tif (m != null) {\r\n\t\t\t\t\tmp[i] = m.Matches;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar ug = new UndoActionGroup();\r\n\t\t\tModel.Undo.AddUndo(\"自动生成书签\", ug);\r\n\t\t\tforeach (XmlElement item in bm.SubBookmarks) {\r\n\t\t\t\tug.Add(new AddElementAction(item));\r\n\t\t\t}\r\n\t\t\tif (keepExisting == false) {\r\n\t\t\t\tbm.RemoveAll();\r\n\t\t\t}\r\n\t\t\tvar spans = new List<MuPDF.TextSpan>(3);\r\n\t\t\tvar bl = 0;\r\n\t\t\tfor (int i = 0; i < c;) {\r\n\t\t\t\tusing (var p = pdf.LoadPage(i++)) {\r\n\t\t\t\t\tvar pb = p.Bound;\r\n\t\t\t\t\tvar h = pb.Height;\r\n\t\t\t\t\tvar dh = pb.Y1 - h;\r\n\t\t\t\t\tvar pt = pb.Y0;\r\n\t\t\t\t\tforeach (var block in p.TextPage) {\r\n\t\t\t\t\t\tstring jointBlockText = null;\r\n\t\t\t\t\t\tbool hasJointText = false;\r\n\t\t\t\t\t\tforeach (var line in block) {\r\n\t\t\t\t\t\t\tvar matchLine = false;\r\n\t\t\t\t\t\t\tforeach (var span in line.GetSpans()) {\r\n\t\t\t\t\t\t\t\tif (matchLine) {\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tfor (var si = 0; si < bs.Count; si++) {\r\n\t\t\t\t\t\t\t\t\tvar style = bs[si];\r\n\t\t\t\t\t\t\t\t\tvar matcher = mp[si];\r\n\t\t\t\t\t\t\t\t\tif (style.FontName != PdfDocumentFont.RemoveSubsetPrefix(span.Font.Name)\r\n\t\t\t\t\t\t\t\t\t\t|| style.FontSize != span.Size.ToInt32()) {\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tvar t = span.ToString();\r\n\t\t\t\t\t\t\t\t\tif (t.Length == 0) {\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tvar b = span.Bound;\r\n\t\t\t\t\t\t\t\t\tif (bl < style.Level) {\r\n\t\t\t\t\t\t\t\t\t\tif (matcher != null) {\r\n\t\t\t\t\t\t\t\t\t\t\tjointBlockText ??= GetLineText(line, block, out hasJointText);\r\n\t\t\t\t\t\t\t\t\t\t\tif ((matchLine = matcher(jointBlockText)) == false) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tbm = NewBookmark(bm, bm, spans);\r\n\t\t\t\t\t\t\t\t\t\t++bl;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\telse if (bl == style.Level) {\r\n\t\t\t\t\t\t\t\t\t\t// todo 删除重复的文本\r\n\t\t\t\t\t\t\t\t\t\tvar cb = bm as BookmarkElement;\r\n\t\t\t\t\t\t\t\t\t\tvar bb = h - cb.Bottom + dh;\r\n\t\t\t\t\t\t\t\t\t\tvar bt = h - cb.Top;\r\n\t\t\t\t\t\t\t\t\t\tvar lt = b.Y0 - b.Height * 2 + dh;\r\n\t\t\t\t\t\t\t\t\t\tvar lb = b.Y1;\r\n\t\t\t\t\t\t\t\t\t\tif (cb.Page == p.PageNumber + 1\r\n\t\t\t\t\t\t\t\t\t\t\t&& (bb >= lt && bb <= lb || bt >= lt && bt <= lb || bt < lt && bb > lb)\r\n\t\t\t\t\t\t\t\t\t\t\t&& (mergeAdjacentTitle || spans[spans.Count - 1].Bound.IsHorizontalNeighbor(b))) {\r\n\t\t\t\t\t\t\t\t\t\t\tif (/*m == false &&*/ t.Length > 0) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t// 保留英文和数字文本之间的空格\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar ct = cb.Title;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (ct.Length > 0) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar lc = ct[ct.Length - 1];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcb.Title = (Char.IsLetterOrDigit(lc) || Char.IsPunctuation(lc)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t&& lc != '-') && t[0] != ' '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ct + ' ' + t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ct + t;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\tcb.Bottom = h - lb + pt;\r\n\t\t\t\t\t\t\t\t\t\t\t\tspans.Add(span);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tif (matcher != null) {\r\n\t\t\t\t\t\t\t\t\t\t\tjointBlockText ??= GetLineText(line, block, out hasJointText);\r\n\t\t\t\t\t\t\t\t\t\t\tif ((matchLine = matcher(jointBlockText)) == false) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tbm = NewBookmark(bm, bm.Parent, spans);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\t\twhile (bl > style.Level) {\r\n\t\t\t\t\t\t\t\t\t\t\tbm = bm.ParentBookmark;\r\n\t\t\t\t\t\t\t\t\t\t\t--bl;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tif (matcher != null) {\r\n\t\t\t\t\t\t\t\t\t\t\tjointBlockText ??= GetLineText(line, block, out hasJointText);\r\n\t\t\t\t\t\t\t\t\t\t\tif ((matchLine = matcher(jointBlockText)) == false) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tbm = NewBookmark(bm, bm.Parent, spans);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tvar be = bm as BookmarkElement;\r\n\t\t\t\t\t\t\t\t\tvar s = style.Bookmark;\r\n\t\t\t\t\t\t\t\t\tif (s.IsBold || s.IsItalic) {\r\n\t\t\t\t\t\t\t\t\t\tbe.TextStyle = s.IsBold && s.IsItalic ? FontStyle.Bold | FontStyle.Italic\r\n\t\t\t\t\t\t\t\t\t\t\t: s.IsBold ? FontStyle.Bold\r\n\t\t\t\t\t\t\t\t\t\t\t: s.IsItalic ? FontStyle.Italic\r\n\t\t\t\t\t\t\t\t\t\t\t: FontStyle.Regular;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tbe.Title = matchLine ? jointBlockText : t;\r\n\t\t\t\t\t\t\t\t\tbe.Top = (s.GoToTop ? h + dh : h - b.Y1 + b.Height + dh) + pt;\r\n\t\t\t\t\t\t\t\t\tbe.Bottom = h - b.Y0 + dh + pt;\r\n\t\t\t\t\t\t\t\t\tbe.Action = Constants.ActionType.Goto;\r\n\t\t\t\t\t\t\t\t\tbe.Page = p.PageNumber + 1;\r\n\t\t\t\t\t\t\t\t\tif (s.IsOpened) {\r\n\t\t\t\t\t\t\t\t\t\tbe.IsOpen = true;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tbe.ForeColor = s.ForeColor;\r\n\t\t\t\t\t\t\t\t\t//todo 删除尾随的空格\r\n\t\t\t\t\t\t\t\t\tug.Add(new RemoveElementAction(bm));\r\n\t\t\t\t\t\t\t\t\tspans.Add(span);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (matchLine) {\r\n\t\t\t\t\t\t\t\tif (hasJointText) {\r\n\t\t\t\t\t\t\t\t\tgoto NEXT_BLOCK;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tNEXT_BLOCK:;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tView.Bookmark.Roots = Model.Document.Bookmarks;\r\n\t\t\tView.Bookmark.RebuildAll(false);\r\n\t\t}\r\n\r\n\t\tstatic BookmarkContainer NewBookmark(BookmarkContainer bm, BookmarkContainer container, List<MuPDF.TextSpan> spans) {\r\n\t\t\tif (TrimBookmarkText(bm)) {\r\n\t\t\t\tbm = container.AppendBookmark();\r\n\t\t\t}\r\n\t\t\tspans.Clear();\r\n\t\t\treturn bm;\r\n\t\t}\r\n\r\n\t\tstatic string GetLineText(MuPDF.TextLine line, MuPDF.TextBlock block, out bool jointLines) {\r\n\t\t\tstring t = null;\r\n\t\t\tjointLines = false;\r\n\t\t\tforeach (var item in block) {\r\n\t\t\t\tif (line == item) {\r\n\t\t\t\t\tt += item.GetText();\r\n\t\t\t\t}\r\n\t\t\t\telse if (line.Bound.IsHorizontalNeighbor(item.Bound)) {\r\n\t\t\t\t\tjointLines = true;\r\n\t\t\t\t\tt += item.GetText();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn t;\r\n\t\t}\r\n\r\n\t\tstatic bool TrimBookmarkText(BookmarkContainer bm) {\r\n\t\t\tif (bm is BookmarkElement b) {\r\n\t\t\t\tvar t = b.Title;\r\n\t\t\t\tvar t2 = t.Trim();\r\n\t\t\t\tif (t2 != t) {\r\n\t\t\t\t\tb.Title = t2;\r\n\t\t\t\t}\r\n\t\t\t\treturn t2.Length != 0;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/CustomPatternForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions.Editor\r\n{\r\n\tpartial class CustomPatternForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose(bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose();\r\n\t\t\t}\r\n\t\t\tbase.Dispose(disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows Form Designer generated code\r\n\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent() {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PatternBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._MatchCaseBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._FullMatchBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 15);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(116, 18);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"正则表达式：\";\r\n\t\t\t// \r\n\t\t\t// _PatternBox\r\n\t\t\t// \r\n\t\t\tthis._PatternBox.AutoSize = true;\r\n\t\t\tthis._PatternBox.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right;\r\n\t\t\tthis._PatternBox.Multiline = true;\r\n\t\t\tthis._PatternBox.Location = new System.Drawing.Point(134, 12);\r\n\t\t\tthis._PatternBox.Name = \"_PatternBox\";\r\n\t\t\tthis._PatternBox.Size = new System.Drawing.Size(364, 28);\r\n\t\t\tthis._PatternBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _MatchCaseBox\r\n\t\t\t// \r\n\t\t\tthis._MatchCaseBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left;\r\n\t\t\tthis._MatchCaseBox.AutoSize = true;\r\n\t\t\tthis._MatchCaseBox.Location = new System.Drawing.Point(134, 46);\r\n\t\t\tthis._MatchCaseBox.Name = \"_MatchCaseBox\";\r\n\t\t\tthis._MatchCaseBox.Size = new System.Drawing.Size(160, 22);\r\n\t\t\tthis._MatchCaseBox.TabIndex = 2;\r\n\t\t\tthis._MatchCaseBox.Text = \"区分英文大小写\";\r\n\t\t\tthis._MatchCaseBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FullMatchBox\r\n\t\t\t// \r\n\t\t\tthis._FullMatchBox.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left;\r\n\t\t\tthis._FullMatchBox.AutoSize = true;\r\n\t\t\tthis._FullMatchBox.Location = new System.Drawing.Point(374, 46);\r\n\t\t\tthis._FullMatchBox.Name = \"_FullMatchBox\";\r\n\t\t\tthis._FullMatchBox.Size = new System.Drawing.Size(124, 22);\r\n\t\t\tthis._FullMatchBox.TabIndex = 3;\r\n\t\t\tthis._FullMatchBox.Text = \"匹配全标题\";\r\n\t\t\tthis._FullMatchBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left;\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(134, 74);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(124, 30);\r\n\t\t\tthis._OkButton.TabIndex = 4;\r\n\t\t\tthis._OkButton.Text = \"确定\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(264, 74);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(124, 30);\r\n\t\t\tthis._CancelButton.TabIndex = 5;\r\n\t\t\tthis._CancelButton.Text = \"取消\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// CustomPatternForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(525, 129);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.Controls.Add(this._FullMatchBox);\r\n\t\t\tthis.Controls.Add(this._MatchCaseBox);\r\n\t\t\tthis.Controls.Add(this._PatternBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;\r\n\t\t\tthis.Name = \"CustomPatternForm\";\r\n\t\t\tthis.Text = \"自定义书签文本匹配模式\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _PatternBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MatchCaseBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FullMatchBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/CustomPatternForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Data;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text.RegularExpressions;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tpublic partial class CustomPatternForm : Form\r\n\t{\r\n\t\tpublic CustomPatternForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\tpublic string Pattern { get => _PatternBox.Text; set => _PatternBox.Text = value; }\r\n\t\tpublic bool MatchCase { get => _MatchCaseBox.Checked; set => _MatchCaseBox.Checked = value; }\r\n\t\tpublic bool FullMatch { get => _FullMatchBox.Checked; set => _FullMatchBox.Checked = value; }\r\n\r\n\t\tvoid _OkButton_Click(object sender, EventArgs e) {\r\n\t\t\ttry {\r\n\t\t\t\tnew Regex(Pattern);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tthis.ErrorBox(\"正则表达式格式错误\", ex);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(object sender, EventArgs e) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/CustomPatternForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/DocumentInfoForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions.Editor\r\n{\r\n\tpartial class DocumentInfoForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows Form Designer generated code\r\n\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._TitleBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SubjectBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._AuthorBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._CreatorBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ProducerBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis._KeywordsBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._FilePathBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label();\r\n\t\t\tthis._CreationDateBox = new System.Windows.Forms.Label();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ModDateBox = new System.Windows.Forms.Label();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PageCountBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 45);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label1.TabIndex = 2;\r\n\t\t\tthis.label1.Text = \"标题：\";\r\n\t\t\t// \r\n\t\t\t// _TitleBox\r\n\t\t\t// \r\n\t\t\tthis._TitleBox.Location = new System.Drawing.Point(101, 42);\r\n\t\t\tthis._TitleBox.Name = \"_TitleBox\";\r\n\t\t\tthis._TitleBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._TitleBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(12, 72);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label2.TabIndex = 4;\r\n\t\t\tthis.label2.Text = \"主题：\";\r\n\t\t\t// \r\n\t\t\t// _SubjectBox\r\n\t\t\t// \r\n\t\t\tthis._SubjectBox.Location = new System.Drawing.Point(101, 69);\r\n\t\t\tthis._SubjectBox.Name = \"_SubjectBox\";\r\n\t\t\tthis._SubjectBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._SubjectBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(12, 99);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label3.TabIndex = 6;\r\n\t\t\tthis.label3.Text = \"作者：\";\r\n\t\t\t// \r\n\t\t\t// _AuthorBox\r\n\t\t\t// \r\n\t\t\tthis._AuthorBox.Location = new System.Drawing.Point(101, 96);\r\n\t\t\tthis._AuthorBox.Name = \"_AuthorBox\";\r\n\t\t\tthis._AuthorBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._AuthorBox.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(12, 126);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis.label4.TabIndex = 8;\r\n\t\t\tthis.label4.Text = \"创建者：\";\r\n\t\t\t// \r\n\t\t\t// _CreatorBox\r\n\t\t\t// \r\n\t\t\tthis._CreatorBox.Location = new System.Drawing.Point(101, 123);\r\n\t\t\tthis._CreatorBox.Name = \"_CreatorBox\";\r\n\t\t\tthis._CreatorBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._CreatorBox.TabIndex = 9;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(12, 153);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis.label5.TabIndex = 10;\r\n\t\t\tthis.label5.Text = \"制作者：\";\r\n\t\t\t// \r\n\t\t\t// _ProducerBox\r\n\t\t\t// \r\n\t\t\tthis._ProducerBox.Location = new System.Drawing.Point(101, 150);\r\n\t\t\tthis._ProducerBox.Name = \"_ProducerBox\";\r\n\t\t\tthis._ProducerBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._ProducerBox.TabIndex = 11;\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(12, 180);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis.label6.TabIndex = 12;\r\n\t\t\tthis.label6.Text = \"关键词：\";\r\n\t\t\t// \r\n\t\t\t// _KeywordsBox\r\n\t\t\t// \r\n\t\t\tthis._KeywordsBox.Location = new System.Drawing.Point(101, 177);\r\n\t\t\tthis._KeywordsBox.Name = \"_KeywordsBox\";\r\n\t\t\tthis._KeywordsBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._KeywordsBox.TabIndex = 13;\r\n\t\t\t// \r\n\t\t\t// _FilePathBox\r\n\t\t\t// \r\n\t\t\tthis._FilePathBox.Location = new System.Drawing.Point(101, 15);\r\n\t\t\tthis._FilePathBox.Name = \"_FilePathBox\";\r\n\t\t\tthis._FilePathBox.ReadOnly = true;\r\n\t\t\tthis._FilePathBox.Size = new System.Drawing.Size(324, 21);\r\n\t\t\tthis._FilePathBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(12, 18);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label7.TabIndex = 0;\r\n\t\t\tthis.label7.Text = \"文档路径：\";\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point(12, 211);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label8.TabIndex = 14;\r\n\t\t\tthis.label8.Text = \"创建日期：\";\r\n\t\t\t// \r\n\t\t\t// _CreationDateBox\r\n\t\t\t// \r\n\t\t\tthis._CreationDateBox.AutoSize = true;\r\n\t\t\tthis._CreationDateBox.Location = new System.Drawing.Point(99, 211);\r\n\t\t\tthis._CreationDateBox.Name = \"_CreationDateBox\";\r\n\t\t\tthis._CreationDateBox.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis._CreationDateBox.TabIndex = 15;\r\n\t\t\tthis._CreationDateBox.Text = \"创建日期\";\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(12, 232);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label10.TabIndex = 16;\r\n\t\t\tthis.label10.Text = \"修改日期：\";\r\n\t\t\t// \r\n\t\t\t// _ModDateBox\r\n\t\t\t// \r\n\t\t\tthis._ModDateBox.AutoSize = true;\r\n\t\t\tthis._ModDateBox.Location = new System.Drawing.Point(99, 232);\r\n\t\t\tthis._ModDateBox.Name = \"_ModDateBox\";\r\n\t\t\tthis._ModDateBox.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis._ModDateBox.TabIndex = 17;\r\n\t\t\tthis._ModDateBox.Text = \"修改日期\";\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(12, 253);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label9.TabIndex = 18;\r\n\t\t\tthis.label9.Text = \"页数：\";\r\n\t\t\t// \r\n\t\t\t// _PageCountBox\r\n\t\t\t// \r\n\t\t\tthis._PageCountBox.AutoSize = true;\r\n\t\t\tthis._PageCountBox.Location = new System.Drawing.Point(99, 253);\r\n\t\t\tthis._PageCountBox.Name = \"_PageCountBox\";\r\n\t\t\tthis._PageCountBox.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis._PageCountBox.TabIndex = 19;\r\n\t\t\tthis._PageCountBox.Text = \"页数\";\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(269, 280);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 20;\r\n\t\t\tthis._OkButton.Text = \"确定\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(350, 280);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 20;\r\n\t\t\tthis._CancelButton.Text = \"取消\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// DocumentInfoForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(437, 315);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.Controls.Add(this.label9);\r\n\t\t\tthis.Controls.Add(this._ModDateBox);\r\n\t\t\tthis.Controls.Add(this._PageCountBox);\r\n\t\t\tthis.Controls.Add(this._CreationDateBox);\r\n\t\t\tthis.Controls.Add(this.label10);\r\n\t\t\tthis.Controls.Add(this.label8);\r\n\t\t\tthis.Controls.Add(this.label7);\r\n\t\t\tthis.Controls.Add(this._FilePathBox);\r\n\t\t\tthis.Controls.Add(this._KeywordsBox);\r\n\t\t\tthis.Controls.Add(this.label6);\r\n\t\t\tthis.Controls.Add(this._ProducerBox);\r\n\t\t\tthis.Controls.Add(this.label5);\r\n\t\t\tthis.Controls.Add(this._CreatorBox);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this._AuthorBox);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this._SubjectBox);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._TitleBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"DocumentInfoForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r\n\t\t\tthis.Text = \"文档属性\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _TitleBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _SubjectBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.TextBox _AuthorBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.TextBox _CreatorBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.TextBox _ProducerBox;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.TextBox _KeywordsBox;\r\n\t\tprivate System.Windows.Forms.TextBox _FilePathBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.Label _CreationDateBox;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.Label _ModDateBox;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.Label _PageCountBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/DocumentInfoForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing MuPDF;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed partial class DocumentInfoForm : Form\r\n\t{\r\n\t\tinternal Document Document { get; set; }\r\n\t\tinternal Model.PdfInfoXmlDocument InfoDocument { get; set; }\r\n\r\n\t\tpublic DocumentInfoForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tif (Document != null) {\r\n\t\t\t\tvar info = Document.Info;\r\n\t\t\t\t_AuthorBox.Text = info.Author;\r\n\t\t\t\t_CreationDateBox.Text = Processor.PdfHelper.ParseDateTime(info.CreationDate).ToString();\r\n\t\t\t\t_CreatorBox.Text = info.Creator;\r\n\t\t\t\t_FilePathBox.Text = Document.FilePath;\r\n\t\t\t\t_KeywordsBox.Text = info.Keywords;\r\n\t\t\t\t_ModDateBox.Text = Processor.PdfHelper.ParseDateTime(info.ModificationDate).ToString();\r\n\t\t\t\t_PageCountBox.Text = Document.PageCount.ToString();\r\n\t\t\t\t_ProducerBox.Text = info.Producer;\r\n\t\t\t\t_SubjectBox.Text = info.Subject;\r\n\t\t\t\t_TitleBox.Text = info.Title;\r\n\t\t\t}\r\n\t\t\tif (InfoDocument != null) {\r\n\t\t\t\tvar info = InfoDocument.InfoNode;\r\n\t\t\t\tSetText(_AuthorBox, info.Author);\r\n\t\t\t\tSetText(_CreatorBox, info.Creator);\r\n\t\t\t\tSetText(_KeywordsBox, info.Keywords);\r\n\t\t\t\tSetText(_ProducerBox, info.Producer);\r\n\t\t\t\tSetText(_SubjectBox, info.Subject);\r\n\t\t\t\tSetText(_TitleBox, info.Title);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_OkButton.Enabled = false;\r\n\t\t\t}\r\n\t\t\t_OkButton.Click += (s, args) => {\r\n\t\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\t\tvar info = InfoDocument.InfoNode;\r\n\t\t\t\tinfo.Author = _AuthorBox.Text;\r\n\t\t\t\tinfo.Creator = _CreatorBox.Text;\r\n\t\t\t\tinfo.Keywords = _KeywordsBox.Text;\r\n\t\t\t\tinfo.Producer = _ProducerBox.Text;\r\n\t\t\t\tinfo.Subject = _SubjectBox.Text;\r\n\t\t\t\tinfo.Title = _TitleBox.Text;\r\n\t\t\t\tClose();\r\n\t\t\t};\r\n\t\t\t_CancelButton.Click += (s, args) => {\r\n\t\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\t\tClose();\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tstatic void SetText(Control control, string value) {\r\n\t\t\tif (value == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcontrol.Text = value;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/DocumentInfoForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/DoubleClickableRadioButton.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed class DoubleClickableRadioButton : RadioButton\r\n\t{\r\n\t\tpublic DoubleClickableRadioButton() {\r\n\t\t\tSetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true);\r\n\t\t}\r\n\r\n\t\tpublic new event EventHandler DoubleClick;\r\n\r\n\t\tprotected override void OnMouseDoubleClick(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseDoubleClick(e);\r\n\r\n\t\t\tDoubleClick?.Invoke(this, e);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/EditModel.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.IO;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tinternal sealed class EditModel\r\n\t{\r\n\t\tpublic EditModel() {\r\n\t\t\tUndo = new UndoManager();\r\n\t\t\tTitleStyles = new List<AutoBookmarkSettings>();\r\n\t\t\tDocument = new PdfInfoXmlDocument();\r\n\t\t}\r\n\r\n\t\tinternal bool IsLoadingDocument { get; set; }\r\n\t\tinternal PdfInfoXmlDocument Document { get; set; }\r\n\t\tinternal bool LockDownViewer { get; set; }\r\n\t\tinternal bool InsertBookmarkWithOcrOnly { get; set; }\r\n\t\tinternal UndoManager Undo { get; }\r\n\t\tinternal string DocumentPath { get; set; }\r\n\t\tinternal string LastSavedPdfPath { get; set; }\r\n\t\tMuPDF.Document _Document;\r\n\t\tinternal MuPDF.Document PdfDocument {\r\n\t\t\tget => _Document;\r\n\t\t\tset {\r\n\t\t\t\tif (_Document != value) {\r\n\t\t\t\t\t_Document = value;\r\n\t\t\t\t\t_PageLabels = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tMuPDF.PageLabelCollection _PageLabels;\r\n\t\tinternal MuPDF.PageLabelCollection PageLabels {\r\n\t\t\tget {\r\n\t\t\t\tif (_PageLabels == null && PdfDocument != null) {\r\n\t\t\t\t\t_PageLabels = new MuPDF.PageLabelCollection(PdfDocument);\r\n\t\t\t\t}\r\n\t\t\t\treturn _PageLabels;\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal List<AutoBookmarkSettings> TitleStyles { get; }\r\n\t\tinternal string GetPdfFilePath() {\r\n\t\t\tif (DocumentPath == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar s = FileHelper.HasExtension(DocumentPath, Constants.FileExtensions.Pdf) ? DocumentPath : null;\r\n\t\t\tif (string.IsNullOrEmpty(s)) {\r\n\t\t\t\ts = Document.PdfDocumentPath;\r\n\t\t\t\tif (Path.IsPathRooted(s) == false) {\r\n\t\t\t\t\ts = Path.Combine(Path.GetDirectoryName(DocumentPath), s);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (File.Exists(s) == false) {\r\n\t\t\t\ts = null;\r\n\t\t\t}\r\n\t\t\treturn s;\r\n\t\t}\r\n\r\n\t\tinternal sealed class Region\r\n\t\t{\r\n\t\t\tinternal PagePosition Position { get; }\r\n\t\t\tinternal string Text { get; }\r\n\t\t\tinternal TextSource TextSource { get; }\r\n\t\t\tinternal string LiteralTextSource {\r\n\t\t\t\tget {\r\n\t\t\t\t\tswitch (TextSource) {\r\n\t\t\t\t\t\tcase TextSource.Empty: return \"当前位置不包含文本\";\r\n\t\t\t\t\t\tcase TextSource.Text: return \"已自动匹配文本层文本\";\r\n\t\t\t\t\t\tcase TextSource.OcrText: return \"已自动识别图像文本\";\r\n\t\t\t\t\t\tcase TextSource.OcrError: return \"当前页面不包含可识别文本，或识别过程出错\";\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tthrow new System.IndexOutOfRangeException(\"TextSource\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic Region(PagePosition position, string text, TextSource source) {\r\n\t\t\t\tPosition = position;\r\n\t\t\t\tText = text;\r\n\t\t\t\tTextSource = source;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal enum TextSource\r\n\t\t{\r\n\t\t\tEmpty, Text, OcrText, OcrError\r\n\t\t}\r\n\t\tinternal sealed class AutoBookmarkSettings\r\n\t\t{\r\n\t\t\tinternal readonly string FontName;\r\n\t\t\tinternal readonly int FontSize;\r\n\t\t\tinternal readonly BookmarkSettings Bookmark;\r\n\t\t\tinternal MatchPattern MatchPattern;\r\n\r\n\t\t\tinternal int Level;\r\n\r\n\t\t\tpublic AutoBookmarkSettings(int level, string fontName, int fontSize) {\r\n\t\t\t\tLevel = level;\r\n\t\t\t\tFontName = fontName;\r\n\t\t\t\tFontSize = fontSize;\r\n\t\t\t\tBookmark = new BookmarkSettings();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}"
  },
  {
    "path": "App/Functions/Editor/EditorCommands.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n    static class EditorCommands\r\n    {\r\n\t\tstatic readonly CommandRegistry<Controller> __Commands = InitCommands();\r\n\r\n\t\t// 在此注册编辑器的命令和对应的命令标识符\r\n\t\tstatic CommandRegistry<Controller> InitCommands() {\r\n\t\t\tvar d = new CommandRegistry<Editor.Controller>();\r\n\t\t\td.Register(new Editor.LoadDocumentCommand(true, false), Commands.Open);\r\n\t\t\td.Register(new Editor.LoadDocumentCommand(true, true), Commands.ImportBookmark);\r\n\t\t\td.Register(new Editor.LoadDocumentCommand(false, false), Commands.OpenFile);\r\n\t\t\td.Register(new Editor.InsertBookmarkCommand(), Commands.EditorInsertBookmark);\r\n\t\t\td.Register(new Editor.SaveDocumentCommand(false, true), \"_SaveButton\", Commands.SaveBookmark);\r\n\t\t\td.Register(new Editor.SaveDocumentCommand(true, true), Commands.SaveAsInfoFile);\r\n\t\t\td.Register(new Editor.SaveDocumentCommand(true, false), Commands.Action, Commands.EditorSavePdf);\r\n\t\t\td.Register(new Editor.BookmarkLevelCommand(true), Commands.EditorBookmarkLevelUp);\r\n\t\t\td.Register(new Editor.BookmarkLevelCommand(false), Commands.EditorBookmarkLevelDown);\r\n\t\t\td.Register(new Editor.DocumentPropertyCommand(), Commands.DocumentProperties);\r\n\t\t\td.Register(new Editor.CopyBookmarkItemCommand(), Commands.Copy);\r\n\t\t\td.Register(new Editor.PasteBookmarkItemCommand(), Commands.Paste);\r\n\t\t\td.Register(new Editor.DeleteBookmarkItemCommand(), Commands.EditorBookmarkDelete, Commands.Delete);\r\n\t\t\td.Register(new Editor.BookmarkStyleCommand(SetTextStyleProcessor.Style.SetBold), Commands.EditorBookmarkBold);\r\n\t\t\td.Register(new Editor.BookmarkStyleCommand(SetTextStyleProcessor.Style.SetItalic), Commands.EditorBookmarkItalic);\r\n\t\t\td.Register(new Editor.BookmarkPageCommand(1), Commands.EditorBookmarkPageNumberIncrement);\r\n\t\t\td.Register(new Editor.BookmarkPageCommand(-1), Commands.EditorBookmarkPageNumberDecrement);\r\n\t\t\td.Register(new Editor.BookmarkPageCommand(0), Commands.EditorBookmarkPageNumberShift);\r\n\t\t\td.Register(new Editor.BookmarkPageCommand(0, true), Commands.EditorBookmarkPageNumberShiftTakeFollowing);\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<ClearDestinationOffsetProcessor, ClearDestinationOffsetProcessor.PositionType>(ClearDestinationOffsetProcessor.PositionType.XY), \"_ClearPositionXY\");\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<ClearDestinationOffsetProcessor, ClearDestinationOffsetProcessor.PositionType>(ClearDestinationOffsetProcessor.PositionType.X), \"_ClearPositionX\");\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<ClearDestinationOffsetProcessor, ClearDestinationOffsetProcessor.PositionType>(ClearDestinationOffsetProcessor.PositionType.Y), \"_ClearPositionY\");\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<BookmarkOpenStatusProcessor, bool>(true), \"_SetOpenStatusTrue\");\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<BookmarkOpenStatusProcessor, bool>(false), \"_SetOpenStatusFalse\");\r\n\t\t\tforeach (var item in Constants.DestinationAttributes.ViewType.Names) {\r\n\t\t\t\td.Register(new Editor.BookmarkActionCommand(item), item);\r\n\t\t\t}\r\n\t\t\td.Register(new Editor.BookmarkActionCommand(Constants.Coordinates.Unchanged), Constants.Coordinates.Unchanged);\r\n\t\t\td.Register(new Editor.BookmarkActionCommand(\"_ChangeCoordinates\"), \"_ChangeCoordinates\");\r\n\t\t\td.Register(new Editor.BookmarkActionCommand(Commands.EditorBookmarkSetCurrentCoordinates), Commands.EditorBookmarkSetCurrentCoordinates);\r\n\t\t\td.Register(new Editor.BookmarkActionCommand(\"_BookmarkAction\"), \"_BookmarkAction\");\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<DestinationGotoTopProcessor>(), \"_SetGotoTop\");\r\n\t\t\td.Register(new Editor.SimpleBookmarkCommand<ForceInternalLinkProcessor>(), \"_ForceInternalLink\");\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.SelectAllItems), Commands.SelectAllItems);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.SelectNone), Commands.SelectNone);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.SelectChildren), Commands.SelectChildren);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.InvertSelection), Commands.InvertSelection);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.ExpandAll), Commands.ExpandAll);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.CollapseAll), Commands.CollapseAll);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.ExpandSelection), Commands.ExpandSelection);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.CollapseSelection), Commands.CollapseSelection);\r\n\t\t\td.Register(new Editor.BookmarkSelectionCommand(Commands.CollapseChildren), Commands.CollapseChildren);\r\n\t\t\td.Register(new Editor.OcrPageCommand(), Commands.EditorOcrPage);\r\n\t\t\td.Register(new Editor.PagePropertiesCommand(), Commands.EditorPageProperties);\r\n\t\t\td.Register(new Editor.SavePageImageCommand(), Commands.EditorSavePageImage);\r\n\t\t\td.Register(new Editor.ViewerScrollToBookmarkCommand(), Commands.EditorViewerScrollToBookmark);\r\n\t\t\td.Register(new Editor.InsertPageLabelCommand(), Commands.EditorInsertPageLabel);\r\n\t\t\tEditor.BookmarkMarkerCommand.RegisterCommands(d);\r\n\t\t\tEditor.ViewerCommand.RegisterCommands(d);\r\n\t\t\tEditor.QuickSelectCommand.RegisterCommands(d);\r\n\t\t\treturn d;\r\n\t\t}\r\n\r\n\t\tpublic static void Execute(string command, Controller controller, params string[] parameters) {\r\n\t\t\t__Commands.Process(command, controller, parameters);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/IEditView.cs",
    "content": "﻿using System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tinternal interface IEditView\r\n\t{\r\n\t\tbool AffectsDescendantBookmarks { get; }\r\n\t\tToolStripSplitButton UndoButton { get; }\r\n\t\tAutoBookmarkForm AutoBookmark { get; }\r\n\t\tBookmarkEditorView Bookmark { get; }\r\n\t\tViewerControl Viewer { get; }\r\n\t\tToolStrip ViewerToolbar { get; }\r\n\t\tToolStrip BookmarkToolbar { get; }\r\n\t\tSplitContainer MainPanel { get; }\r\n\t\tstring DocumentPath { get; set; }\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/IEditorCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tinterface IEditorCommand : Common.ICommand<Controller>\r\n\t{\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/InsertBookmarkForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions.Editor\r\n{\r\n\tpartial class InsertBookmarkForm\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._TitleBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PositionBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._PageLabel = new System.Windows.Forms.Label();\r\n\t\t\tthis._DirectionBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._CommentBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._AfterParentBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\tthis._BeforeCurrentBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\tthis._AsChildBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\tthis._AfterCurrentBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\tthis._ReplaceBookmarkBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\tthis._AfterGrandParentBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\tthis._AfterLastRootBox = new PDFPatcher.Functions.DoubleClickableRadioButton();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PositionBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 15);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"书签文本：\";\r\n\t\t\t// \r\n\t\t\t// _TitleBox\r\n\t\t\t// \r\n\t\t\tthis._TitleBox.Location = new System.Drawing.Point(83, 12);\r\n\t\t\tthis._TitleBox.Name = \"_TitleBox\";\r\n\t\t\tthis._TitleBox.Size = new System.Drawing.Size(275, 21);\r\n\t\t\tthis._TitleBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Image = global::PDFPatcher.Properties.Resources.ImportInfoFile;\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(14, 156);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(96, 23);\r\n\t\t\tthis._OkButton.TabIndex = 14;\r\n\t\t\tthis._OkButton.Text = \"插入(&C)\";\r\n\t\t\tthis._OkButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(12, 53);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(101, 12);\r\n\t\t\tthis.label2.TabIndex = 2;\r\n\t\t\tthis.label2.Text = \"插入到当前书签：\";\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(153, 156);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(96, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 15;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(281, 53);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label3.TabIndex = 10;\r\n\t\t\tthis.label3.Text = \"目标位置：\";\r\n\t\t\t// \r\n\t\t\t// _PositionBox\r\n\t\t\t// \r\n\t\t\tthis._PositionBox.DecimalPlaces = 2;\r\n\t\t\tthis._PositionBox.Location = new System.Drawing.Point(283, 107);\r\n\t\t\tthis._PositionBox.Maximum = new decimal(new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._PositionBox.Minimum = new decimal(new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._PositionBox.Name = \"_PositionBox\";\r\n\t\t\tthis._PositionBox.Size = new System.Drawing.Size(75, 21);\r\n\t\t\tthis._PositionBox.TabIndex = 13;\r\n\t\t\t// \r\n\t\t\t// _PageLabel\r\n\t\t\t// \r\n\t\t\tthis._PageLabel.AutoSize = true;\r\n\t\t\tthis._PageLabel.Location = new System.Drawing.Point(281, 72);\r\n\t\t\tthis._PageLabel.Name = \"_PageLabel\";\r\n\t\t\tthis._PageLabel.Size = new System.Drawing.Size(35, 12);\r\n\t\t\tthis._PageLabel.TabIndex = 11;\r\n\t\t\tthis._PageLabel.Text = \"第N页\";\r\n\t\t\t// \r\n\t\t\t// _DirectionBox\r\n\t\t\t// \r\n\t\t\tthis._DirectionBox.AutoSize = true;\r\n\t\t\tthis._DirectionBox.Location = new System.Drawing.Point(281, 92);\r\n\t\t\tthis._DirectionBox.Name = \"_DirectionBox\";\r\n\t\t\tthis._DirectionBox.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis._DirectionBox.TabIndex = 12;\r\n\t\t\tthis._DirectionBox.Text = \"方位：\";\r\n\t\t\t// \r\n\t\t\t// _CommentBox\r\n\t\t\t// \r\n\t\t\tthis._CommentBox.ForeColor = System.Drawing.SystemColors.GrayText;\r\n\t\t\tthis._CommentBox.Location = new System.Drawing.Point(83, 36);\r\n\t\t\tthis._CommentBox.Name = \"_CommentBox\";\r\n\t\t\tthis._CommentBox.Size = new System.Drawing.Size(275, 12);\r\n\t\t\tthis._CommentBox.TabIndex = 16;\r\n\t\t\t// \r\n\t\t\t// _AfterParentBox\r\n\t\t\t// \r\n\t\t\tthis._AfterParentBox.AutoSize = true;\r\n\t\t\tthis._AfterParentBox.Location = new System.Drawing.Point(153, 90);\r\n\t\t\tthis._AfterParentBox.Name = \"_AfterParentBox\";\r\n\t\t\tthis._AfterParentBox.Size = new System.Drawing.Size(101, 16);\r\n\t\t\tthis._AfterParentBox.TabIndex = 6;\r\n\t\t\tthis._AfterParentBox.Text = \"上级书签后(&S)\";\r\n\t\t\tthis._AfterParentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _BeforeCurrentBox\r\n\t\t\t// \r\n\t\t\tthis._BeforeCurrentBox.AutoSize = true;\r\n\t\t\tthis._BeforeCurrentBox.Location = new System.Drawing.Point(34, 68);\r\n\t\t\tthis._BeforeCurrentBox.Name = \"_BeforeCurrentBox\";\r\n\t\t\tthis._BeforeCurrentBox.Size = new System.Drawing.Size(65, 16);\r\n\t\t\tthis._BeforeCurrentBox.TabIndex = 3;\r\n\t\t\tthis._BeforeCurrentBox.Text = \"前面(&Q)\";\r\n\t\t\tthis._BeforeCurrentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AsChildBox\r\n\t\t\t// \r\n\t\t\tthis._AsChildBox.AutoSize = true;\r\n\t\t\tthis._AsChildBox.Location = new System.Drawing.Point(34, 90);\r\n\t\t\tthis._AsChildBox.Name = \"_AsChildBox\";\r\n\t\t\tthis._AsChildBox.Size = new System.Drawing.Size(77, 16);\r\n\t\t\tthis._AsChildBox.TabIndex = 5;\r\n\t\t\tthis._AsChildBox.Text = \"子书签(&Z)\";\r\n\t\t\tthis._AsChildBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AfterCurrentBox\r\n\t\t\t// \r\n\t\t\tthis._AfterCurrentBox.AutoSize = true;\r\n\t\t\tthis._AfterCurrentBox.Checked = true;\r\n\t\t\tthis._AfterCurrentBox.Location = new System.Drawing.Point(153, 68);\r\n\t\t\tthis._AfterCurrentBox.Name = \"_AfterCurrentBox\";\r\n\t\t\tthis._AfterCurrentBox.Size = new System.Drawing.Size(65, 16);\r\n\t\t\tthis._AfterCurrentBox.TabIndex = 4;\r\n\t\t\tthis._AfterCurrentBox.TabStop = true;\r\n\t\t\tthis._AfterCurrentBox.Text = \"后面(&H)\";\r\n\t\t\tthis._AfterCurrentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ReplaceBookmarkBox\r\n\t\t\t// \r\n\t\t\tthis._ReplaceBookmarkBox.AutoSize = true;\r\n\t\t\tthis._ReplaceBookmarkBox.Location = new System.Drawing.Point(14, 134);\r\n\t\t\tthis._ReplaceBookmarkBox.Name = \"_ReplaceBookmarkBox\";\r\n\t\t\tthis._ReplaceBookmarkBox.Size = new System.Drawing.Size(113, 16);\r\n\t\t\tthis._ReplaceBookmarkBox.TabIndex = 9;\r\n\t\t\tthis._ReplaceBookmarkBox.TabStop = true;\r\n\t\t\tthis._ReplaceBookmarkBox.Text = \"替换当前书签(&T)\";\r\n\t\t\tthis._ReplaceBookmarkBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AfterGrandParentBox\r\n\t\t\t// \r\n\t\t\tthis._AfterGrandParentBox.AutoSize = true;\r\n\t\t\tthis._AfterGrandParentBox.Location = new System.Drawing.Point(34, 112);\r\n\t\t\tthis._AfterGrandParentBox.Name = \"_AfterGrandParentBox\";\r\n\t\t\tthis._AfterGrandParentBox.Size = new System.Drawing.Size(113, 16);\r\n\t\t\tthis._AfterGrandParentBox.TabIndex = 7;\r\n\t\t\tthis._AfterGrandParentBox.Text = \"上两级书签后(&L)\";\r\n\t\t\tthis._AfterGrandParentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AfterLastRootBox\r\n\t\t\t// \r\n\t\t\tthis._AfterLastRootBox.AutoSize = true;\r\n\t\t\tthis._AfterLastRootBox.Location = new System.Drawing.Point(153, 112);\r\n\t\t\tthis._AfterLastRootBox.Name = \"_AfterLastRootBox\";\r\n\t\t\tthis._AfterLastRootBox.Size = new System.Drawing.Size(101, 16);\r\n\t\t\tthis._AfterLastRootBox.TabIndex = 8;\r\n\t\t\tthis._AfterLastRootBox.Text = \"根书签最后(&G)\";\r\n\t\t\tthis._AfterLastRootBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// InsertBookmarkForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(375, 185);\r\n\t\t\tthis.Controls.Add(this._AfterLastRootBox);\r\n\t\t\tthis.Controls.Add(this._AfterGrandParentBox);\r\n\t\t\tthis.Controls.Add(this._ReplaceBookmarkBox);\r\n\t\t\tthis.Controls.Add(this._CommentBox);\r\n\t\t\tthis.Controls.Add(this._DirectionBox);\r\n\t\t\tthis.Controls.Add(this._PageLabel);\r\n\t\t\tthis.Controls.Add(this._PositionBox);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._AfterParentBox);\r\n\t\t\tthis.Controls.Add(this._BeforeCurrentBox);\r\n\t\t\tthis.Controls.Add(this._AsChildBox);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._AfterCurrentBox);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.Controls.Add(this._TitleBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;\r\n\t\t\tthis.Name = \"InsertBookmarkForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.Manual;\r\n\t\t\tthis.Text = \"插入书签\";\r\n\t\t\tthis.TopMost = true;\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._PositionBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _TitleBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate DoubleClickableRadioButton _AfterCurrentBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate DoubleClickableRadioButton _AsChildBox;\r\n\t\tprivate DoubleClickableRadioButton _BeforeCurrentBox;\r\n\t\tprivate DoubleClickableRadioButton _AfterParentBox;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _PositionBox;\r\n\t\tprivate System.Windows.Forms.Label _PageLabel;\r\n\t\tprivate System.Windows.Forms.Label _DirectionBox;\r\n\t\tprivate System.Windows.Forms.Label _CommentBox;\r\n\t\tprivate DoubleClickableRadioButton _ReplaceBookmarkBox;\r\n\t\tprivate DoubleClickableRadioButton _AfterGrandParentBox;\r\n\t\tprivate DoubleClickableRadioButton _AfterLastRootBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/InsertBookmarkForm.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed partial class InsertBookmarkForm : DraggableForm\r\n\t{\r\n\t\tpublic event CancelEventHandler OkClicked;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置书签标题。\r\n\t\t/// </summary>\r\n\t\tpublic string Title { get => _TitleBox.Text; set => _TitleBox.Text = value; }\r\n\t\tpublic string Comment { get => _CommentBox.Text; set => _CommentBox.Text = value; }\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置书签的位置。\r\n\t\t/// </summary>\r\n\t\tpublic float TargetPosition { get => (float)_PositionBox.Value; set => _PositionBox.SetValue(value); }\r\n\t\tint _TargetPageNumber;\r\n\t\tpublic int TargetPageNumber {\r\n\t\t\tget => _TargetPageNumber;\r\n\t\t\tset { _TargetPageNumber = value; _PageLabel.Text = $\"第{value.ToText()}页\"; }\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 获取新书签的插入位置。\r\n\t\t/// </summary>\r\n\t\tpublic InsertBookmarkPositionType InsertMode => _AfterCurrentBox.Checked ? InsertBookmarkPositionType.AfterCurrent\r\n\t\t\t\t\t: _AsChildBox.Checked ? InsertBookmarkPositionType.AsChild\r\n\t\t\t\t\t: _AfterParentBox.Checked ? InsertBookmarkPositionType.AfterParent\r\n\t\t\t\t\t: _BeforeCurrentBox.Checked ? InsertBookmarkPositionType.BeforeCurrent\r\n\t\t\t\t\t: _AfterGrandParentBox.Checked ? InsertBookmarkPositionType.AfterGrandParent\r\n\t\t\t\t\t: _AfterLastRootBox.Checked ? InsertBookmarkPositionType.LastRoot\r\n\t\t\t\t\t: InsertBookmarkPositionType.Undefined;\r\n\r\n\t\t[Browsable(false)]\r\n\t\tinternal Controller Controller { get; set; }\r\n\r\n\t\tpublic InsertBookmarkForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\t\tpublic void SetInsertMode(InsertBookmarkPositionType positionType) {\r\n\t\t\tswitch (positionType) {\r\n\t\t\t\tcase InsertBookmarkPositionType.AfterCurrent: _AfterCurrentBox.Checked = true; return;\r\n\t\t\t\tcase InsertBookmarkPositionType.AsChild: _AsChildBox.Checked = true; return;\r\n\t\t\t\tcase InsertBookmarkPositionType.AfterParent: _AfterParentBox.Checked = true; return;\r\n\t\t\t\tcase InsertBookmarkPositionType.BeforeCurrent: _BeforeCurrentBox.Checked = true; return;\r\n\t\t\t\tcase InsertBookmarkPositionType.AfterGrandParent: _AfterGrandParentBox.Checked = true; return;\r\n\t\t\t\tcase InsertBookmarkPositionType.LastRoot: _AfterLastRootBox.Checked = true; return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tvoid OnLoad() {\r\n\t\t\t_AfterCurrentBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_AfterParentBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_AsChildBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_BeforeCurrentBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_ReplaceBookmarkBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_AfterGrandParentBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_AfterLastRootBox.DoubleClick += InsertModeBox_DoubleClick;\r\n\t\t\t_OkButton.Click += OkButtonClicked;\r\n\t\t\t_CancelButton.Click += (s, args) => Hide();\r\n\t\t}\r\n\r\n\t\tvoid InsertModeBox_DoubleClick(object sender, EventArgs e) {\r\n\t\t\t_OkButton.PerformClick();\r\n\t\t}\r\n\r\n\t\tvoid OkButtonClicked(object sender, EventArgs args) {\r\n\t\t\tvar cancel = new CancelEventArgs();\r\n\t\t\tOkClicked?.Invoke(this, cancel);\r\n\t\t\tif (cancel.Cancel == false) {\r\n\t\t\t\tif (_AfterCurrentBox.Checked == false) {\r\n\t\t\t\t\t_AfterCurrentBox.Checked = true;\r\n\t\t\t\t}\r\n\t\t\t\tHide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnVisibleChanged(EventArgs e) {\r\n\t\t\tbase.OnVisibleChanged(e);\r\n\t\t\tif (!Visible) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tFocusTitleBox();\r\n\t\t}\r\n\r\n\t\tpublic void FocusTitleBox() {\r\n\t\t\t_TitleBox.Focus();\r\n\t\t\t_TitleBox.SelectAll();\r\n\t\t}\r\n\r\n\t\tprotected override void OnActivated(EventArgs e) {\r\n\t\t\tbase.OnActivated(e);\r\n\t\t\t_TitleBox.Focus();\r\n\t\t}\r\n\r\n\t\tprotected override void OnDeactivate(EventArgs e) {\r\n\t\t\tHide();\r\n\t\t\tbase.OnDeactivate(e);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/InsertBookmarkForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/InsertPageLabelForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions.Editor\r\n{\r\n\tpartial class InsertPageLabelForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows Form Designer generated code\r\n\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PrefixBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._NumericStyleBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._StartAtBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PageNumberBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._RemoveLabelButton = new System.Windows.Forms.Button();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._StartAtBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 41);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 4;\r\n\t\t\tthis.label1.Text = \"前缀文本：\";\r\n\t\t\t// \r\n\t\t\t// _PrefixBox\r\n\t\t\t// \r\n\t\t\tthis._PrefixBox.Location = new System.Drawing.Point(83, 38);\r\n\t\t\tthis._PrefixBox.Name = \"_PrefixBox\";\r\n\t\t\tthis._PrefixBox.Size = new System.Drawing.Size(63, 21);\r\n\t\t\tthis._PrefixBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(152, 13);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label2.TabIndex = 2;\r\n\t\t\tthis.label2.Text = \"编号格式：\";\r\n\t\t\t// \r\n\t\t\t// _NumericStyleBox\r\n\t\t\t// \r\n\t\t\tthis._NumericStyleBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._NumericStyleBox.FormattingEnabled = true;\r\n\t\t\tthis._NumericStyleBox.Location = new System.Drawing.Point(223, 11);\r\n\t\t\tthis._NumericStyleBox.Name = \"_NumericStyleBox\";\r\n\t\t\tthis._NumericStyleBox.Size = new System.Drawing.Size(121, 20);\r\n\t\t\tthis._NumericStyleBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(152, 40);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label3.TabIndex = 6;\r\n\t\t\tthis.label3.Text = \"起始页号：\";\r\n\t\t\t// \r\n\t\t\t// _StartAtBox\r\n\t\t\t// \r\n\t\t\tthis._StartAtBox.Location = new System.Drawing.Point(223, 38);\r\n\t\t\tthis._StartAtBox.Maximum = new decimal(new int[] {\r\n            99999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._StartAtBox.Minimum = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._StartAtBox.Name = \"_StartAtBox\";\r\n\t\t\tthis._StartAtBox.Size = new System.Drawing.Size(63, 21);\r\n\t\t\tthis._StartAtBox.TabIndex = 7;\r\n\t\t\tthis._StartAtBox.Value = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(202, 79);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 8;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(286, 79);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 9;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(12, 14);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis.label4.TabIndex = 0;\r\n\t\t\tthis.label4.Text = \"目标页面\";\r\n\t\t\t// \r\n\t\t\t// _PageNumberBox\r\n\t\t\t// \r\n\t\t\tthis._PageNumberBox.Location = new System.Drawing.Point(81, 14);\r\n\t\t\tthis._PageNumberBox.Name = \"_PageNumberBox\";\r\n\t\t\tthis._PageNumberBox.Size = new System.Drawing.Size(65, 19);\r\n\t\t\tthis._PageNumberBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _RemoveLabelButton\r\n\t\t\t// \r\n\t\t\tthis._RemoveLabelButton.Location = new System.Drawing.Point(14, 79);\r\n\t\t\tthis._RemoveLabelButton.Name = \"_RemoveLabelButton\";\r\n\t\t\tthis._RemoveLabelButton.Size = new System.Drawing.Size(117, 23);\r\n\t\t\tthis._RemoveLabelButton.TabIndex = 10;\r\n\t\t\tthis._RemoveLabelButton.Text = \"删除本页码标签(&S)\";\r\n\t\t\tthis._RemoveLabelButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// InsertPageLabelForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(373, 114);\r\n\t\t\tthis.Controls.Add(this._RemoveLabelButton);\r\n\t\t\tthis.Controls.Add(this._PageNumberBox);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.Controls.Add(this._StartAtBox);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this._NumericStyleBox);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._PrefixBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;\r\n\t\t\tthis.Name = \"InsertPageLabelForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.Manual;\r\n\t\t\tthis.Text = \"插入页码标签\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._StartAtBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _PrefixBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.ComboBox _NumericStyleBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _StartAtBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.Label _PageNumberBox;\r\n\t\tprivate System.Windows.Forms.Button _RemoveLabelButton;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/InsertPageLabelForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed partial class InsertPageLabelForm : DraggableForm\r\n\t{\r\n\t\tpublic int PageNumber {\r\n\t\t\tget => _PageNumberBox.Text.ToInt32();\r\n\t\t\tset => _PageNumberBox.Text = value.ToText();\r\n\t\t}\r\n\r\n\t\tinternal MuPDF.PageLabel PageLabel => new MuPDF.PageLabel(PageNumber - 1, (int)_StartAtBox.Value, _PrefixBox.Text, (MuPDF.PageLabelStyle)Constants.PageLabelStyles.PdfValues[_NumericStyleBox.SelectedIndex]);\r\n\r\n\t\tinternal EditModel Model { get; set; }\r\n\t\tinternal ViewerControl Viewer { get; set; }\r\n\r\n\t\tpublic InsertPageLabelForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_NumericStyleBox.AddRange(Constants.PageLabelStyles.Names).Select(0);\r\n\t\t\t_RemoveLabelButton.Enabled = false;\r\n\t\t\t_CancelButton.Click += HandleCommandButtonClick;\r\n\t\t\t_OkButton.Click += HandleCommandButtonClick;\r\n\t\t\t_RemoveLabelButton.Click += HandleCommandButtonClick;\r\n\t\t}\r\n\r\n\t\tprotected override void OnFormClosed(FormClosedEventArgs e) {\r\n\t\t\tbase.OnFormClosed(e);\r\n\t\t\tModel = null;\r\n\t\t\tViewer = null;\r\n\t\t}\r\n\r\n\t\tvoid HandleCommandButtonClick(object sender, EventArgs e) {\r\n\t\t\tDialogResult = sender == _CancelButton ? DialogResult.Cancel\r\n\t\t\t\t: sender == _OkButton ? DialogResult.OK\r\n\t\t\t\t: sender == _RemoveLabelButton ? DialogResult.Abort\r\n\t\t\t\t: DialogResult.None;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tinternal void SetValues(MuPDF.PageLabel label) {\r\n\t\t\tvar s = Array.IndexOf(Constants.PageLabelStyles.PdfValues, (char)label.NumericStyle);\r\n\t\t\t_NumericStyleBox.Select(s);\r\n\t\t\t_PrefixBox.Text = label.Prefix;\r\n\t\t\t_StartAtBox.SetValue(label.StartAt);\r\n\t\t\t_RemoveLabelButton.Enabled = true;\r\n\t\t}\r\n\r\n\t\tprotected override void OnDeactivate(EventArgs e) {\r\n\t\t\tbase.OnDeactivate(e);\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/InsertPageLabelForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/NewCoordinateEntryForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class NewCoordinateEntryForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._CoordinateBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._AdjustmentAmountBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._RelativeBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._AbsoluteBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ProportionBox = new System.Windows.Forms.RadioButton();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._AdjustmentAmountBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(142, 158);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 5;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(61, 158);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 4;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 20);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(101, 12);\r\n\t\t\tthis.label1.TabIndex = 6;\r\n\t\t\tthis.label1.Text = \"需要调整的坐标：\";\r\n\t\t\t// \r\n\t\t\t// _CoordinateBox\r\n\t\t\t// \r\n\t\t\tthis._CoordinateBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._CoordinateBox.FormattingEnabled = true;\r\n\t\t\tthis._CoordinateBox.Items.AddRange(new object[] {\r\n            \"上\",\r\n            \"下\",\r\n            \"左\",\r\n            \"右\"});\r\n\t\t\tthis._CoordinateBox.Location = new System.Drawing.Point(119, 17);\r\n\t\t\tthis._CoordinateBox.Name = \"_CoordinateBox\";\r\n\t\t\tthis._CoordinateBox.Size = new System.Drawing.Size(87, 20);\r\n\t\t\tthis._CoordinateBox.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(12, 45);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label2.TabIndex = 8;\r\n\t\t\tthis.label2.Text = \"坐标调整量：\";\r\n\t\t\t// \r\n\t\t\t// _AdjustmentAmountBox\r\n\t\t\t// \r\n\t\t\tthis._AdjustmentAmountBox.DecimalPlaces = 2;\r\n\t\t\tthis._AdjustmentAmountBox.Location = new System.Drawing.Point(119, 43);\r\n\t\t\tthis._AdjustmentAmountBox.Maximum = new decimal(new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._AdjustmentAmountBox.Minimum = new decimal(new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._AdjustmentAmountBox.Name = \"_AdjustmentAmountBox\";\r\n\t\t\tthis._AdjustmentAmountBox.Size = new System.Drawing.Size(87, 21);\r\n\t\t\tthis._AdjustmentAmountBox.TabIndex = 9;\r\n\t\t\tthis._AdjustmentAmountBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _RelativeBox\r\n\t\t\t// \r\n\t\t\tthis._RelativeBox.AutoSize = true;\r\n\t\t\tthis._RelativeBox.Checked = true;\r\n\t\t\tthis._RelativeBox.Location = new System.Drawing.Point(14, 71);\r\n\t\t\tthis._RelativeBox.Name = \"_RelativeBox\";\r\n\t\t\tthis._RelativeBox.Size = new System.Drawing.Size(179, 16);\r\n\t\t\tthis._RelativeBox.TabIndex = 10;\r\n\t\t\tthis._RelativeBox.TabStop = true;\r\n\t\t\tthis._RelativeBox.Text = \"相对调整（原坐标加调整量）\";\r\n\t\t\tthis._RelativeBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AbsoluteBox\r\n\t\t\t// \r\n\t\t\tthis._AbsoluteBox.AutoSize = true;\r\n\t\t\tthis._AbsoluteBox.Location = new System.Drawing.Point(14, 93);\r\n\t\t\tthis._AbsoluteBox.Name = \"_AbsoluteBox\";\r\n\t\t\tthis._AbsoluteBox.Size = new System.Drawing.Size(191, 16);\r\n\t\t\tthis._AbsoluteBox.TabIndex = 11;\r\n\t\t\tthis._AbsoluteBox.Text = \"绝对调整（原坐标设为调整值）\";\r\n\t\t\tthis._AbsoluteBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ProportionBox\r\n\t\t\t// \r\n\t\t\tthis._ProportionBox.AutoSize = true;\r\n\t\t\tthis._ProportionBox.Location = new System.Drawing.Point(14, 114);\r\n\t\t\tthis._ProportionBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._ProportionBox.Name = \"_ProportionBox\";\r\n\t\t\tthis._ProportionBox.Size = new System.Drawing.Size(191, 16);\r\n\t\t\tthis._ProportionBox.TabIndex = 12;\r\n\t\t\tthis._ProportionBox.TabStop = true;\r\n\t\t\tthis._ProportionBox.Text = \"比例调整（原坐标乘以调整量）\";\r\n\t\t\tthis._ProportionBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// NewCoordinateEntryForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(229, 194);\r\n\t\t\tthis.Controls.Add(this._ProportionBox);\r\n\t\t\tthis.Controls.Add(this._AbsoluteBox);\r\n\t\t\tthis.Controls.Add(this._RelativeBox);\r\n\t\t\tthis.Controls.Add(this._AdjustmentAmountBox);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._CoordinateBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"NewCoordinateEntryForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r\n\t\t\tthis.Text = \"输入坐标调整值\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._AdjustmentAmountBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.ComboBox _CoordinateBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _AdjustmentAmountBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _RelativeBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _AbsoluteBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ProportionBox;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/NewCoordinateEntryForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class NewCoordinateEntryForm : Form\r\n\t{\r\n\t\tpublic string CoordinateName => _CoordinateBox.Text;\r\n\t\tpublic float AdjustmentValue => (float)_AdjustmentAmountBox.Value;\r\n\t\tpublic bool IsAbsolute => _AbsoluteBox.Checked;\r\n\t\tpublic bool IsProportional => _ProportionBox.Checked;\r\n\r\n\t\tpublic NewCoordinateEntryForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_CoordinateBox.SelectedIndex = 0;\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_AdjustmentAmountBox.Select();\r\n\t\t\t_AdjustmentAmountBox.Focus();\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(object sender, EventArgs e) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(object sender, EventArgs e) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/NewCoordinateEntryForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/PagePropertyForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions.Editor\r\n{\r\n\tpartial class PagePropertyForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._CloseButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._PageDimensionBox = new System.Windows.Forms.ListBox();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._TopBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._RightBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._BottomBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._LeftBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis._RotationBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._MainTab = new System.Windows.Forms.TabControl();\r\n\t\t\tthis._DimensionPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._TextStylePage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._TextStyleBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._FontNameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._SizeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label();\r\n\t\t\tthis._WidthBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._HeightBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis._MainTab.SuspendLayout();\r\n\t\t\tthis._DimensionPage.SuspendLayout();\r\n\t\t\tthis._TextStylePage.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TextStyleBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _CloseButton\r\n\t\t\t// \r\n\t\t\tthis._CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CloseButton.Location = new System.Drawing.Point(368, 282);\r\n\t\t\tthis._CloseButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._CloseButton.Name = \"_CloseButton\";\r\n\t\t\tthis._CloseButton.Size = new System.Drawing.Size(100, 29);\r\n\t\t\tthis._CloseButton.TabIndex = 1;\r\n\t\t\tthis._CloseButton.Text = \"关闭(&G)\";\r\n\t\t\tthis._CloseButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _PageDimensionBox\r\n\t\t\t// \r\n\t\t\tthis._PageDimensionBox.FormattingEnabled = true;\r\n\t\t\tthis._PageDimensionBox.ItemHeight = 15;\r\n\t\t\tthis._PageDimensionBox.Location = new System.Drawing.Point(133, 20);\r\n\t\t\tthis._PageDimensionBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._PageDimensionBox.Name = \"_PageDimensionBox\";\r\n\t\t\tthis._PageDimensionBox.Size = new System.Drawing.Size(159, 109);\r\n\t\t\tthis._PageDimensionBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(39, 20);\r\n\t\t\tthis.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(82, 15);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"页面边框：\";\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(301, 20);\r\n\t\t\tthis.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(37, 15);\r\n\t\t\tthis.label2.TabIndex = 6;\r\n\t\t\tthis.label2.Text = \"上：\";\r\n\t\t\t// \r\n\t\t\t// _TopBox\r\n\t\t\t// \r\n\t\t\tthis._TopBox.Location = new System.Drawing.Point(348, 16);\r\n\t\t\tthis._TopBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TopBox.Name = \"_TopBox\";\r\n\t\t\tthis._TopBox.ReadOnly = true;\r\n\t\t\tthis._TopBox.Size = new System.Drawing.Size(69, 25);\r\n\t\t\tthis._TopBox.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(301, 54);\r\n\t\t\tthis.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(37, 15);\r\n\t\t\tthis.label3.TabIndex = 8;\r\n\t\t\tthis.label3.Text = \"右：\";\r\n\t\t\t// \r\n\t\t\t// _RightBox\r\n\t\t\t// \r\n\t\t\tthis._RightBox.Location = new System.Drawing.Point(348, 50);\r\n\t\t\tthis._RightBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._RightBox.Name = \"_RightBox\";\r\n\t\t\tthis._RightBox.ReadOnly = true;\r\n\t\t\tthis._RightBox.Size = new System.Drawing.Size(69, 25);\r\n\t\t\tthis._RightBox.TabIndex = 9;\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(8, 74);\r\n\t\t\tthis.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(37, 15);\r\n\t\t\tthis.label4.TabIndex = 2;\r\n\t\t\tthis.label4.Text = \"下：\";\r\n\t\t\t// \r\n\t\t\t// _BottomBox\r\n\t\t\t// \r\n\t\t\tthis._BottomBox.Location = new System.Drawing.Point(55, 70);\r\n\t\t\tthis._BottomBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._BottomBox.Name = \"_BottomBox\";\r\n\t\t\tthis._BottomBox.ReadOnly = true;\r\n\t\t\tthis._BottomBox.Size = new System.Drawing.Size(69, 25);\r\n\t\t\tthis._BottomBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(8, 108);\r\n\t\t\tthis.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(37, 15);\r\n\t\t\tthis.label5.TabIndex = 4;\r\n\t\t\tthis.label5.Text = \"左：\";\r\n\t\t\t// \r\n\t\t\t// _LeftBox\r\n\t\t\t// \r\n\t\t\tthis._LeftBox.Location = new System.Drawing.Point(55, 104);\r\n\t\t\tthis._LeftBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._LeftBox.Name = \"_LeftBox\";\r\n\t\t\tthis._LeftBox.ReadOnly = true;\r\n\t\t\tthis._LeftBox.Size = new System.Drawing.Size(69, 25);\r\n\t\t\tthis._LeftBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(71, 158);\r\n\t\t\tthis.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(52, 15);\r\n\t\t\tthis.label6.TabIndex = 14;\r\n\t\t\tthis.label6.Text = \"旋转：\";\r\n\t\t\t// \r\n\t\t\t// _RotationBox\r\n\t\t\t// \r\n\t\t\tthis._RotationBox.Location = new System.Drawing.Point(133, 154);\r\n\t\t\tthis._RotationBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._RotationBox.Name = \"_RotationBox\";\r\n\t\t\tthis._RotationBox.ReadOnly = true;\r\n\t\t\tthis._RotationBox.Size = new System.Drawing.Size(53, 25);\r\n\t\t\tthis._RotationBox.TabIndex = 15;\r\n\t\t\t// \r\n\t\t\t// _MainTab\r\n\t\t\t// \r\n\t\t\tthis._MainTab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._MainTab.Controls.Add(this._DimensionPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._TextStylePage);\r\n\t\t\tthis._MainTab.Location = new System.Drawing.Point(16, 15);\r\n\t\t\tthis._MainTab.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._MainTab.Name = \"_MainTab\";\r\n\t\t\tthis._MainTab.SelectedIndex = 0;\r\n\t\t\tthis._MainTab.Size = new System.Drawing.Size(452, 260);\r\n\t\t\tthis._MainTab.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _DimensionPage\r\n\t\t\t// \r\n\t\t\tthis._DimensionPage.Controls.Add(this._PageDimensionBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._RotationBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label1);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label6);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label9);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label2);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._LeftBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._HeightBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._TopBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label5);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._WidthBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label4);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label8);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._RightBox);\r\n\t\t\tthis._DimensionPage.Controls.Add(this.label3);\r\n\t\t\tthis._DimensionPage.Controls.Add(this._BottomBox);\r\n\t\t\tthis._DimensionPage.Location = new System.Drawing.Point(4, 25);\r\n\t\t\tthis._DimensionPage.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._DimensionPage.Name = \"_DimensionPage\";\r\n\t\t\tthis._DimensionPage.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._DimensionPage.Size = new System.Drawing.Size(444, 231);\r\n\t\t\tthis._DimensionPage.TabIndex = 1;\r\n\t\t\tthis._DimensionPage.Text = \"页面尺寸\";\r\n\t\t\tthis._DimensionPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _TextStylePage\r\n\t\t\t// \r\n\t\t\tthis._TextStylePage.Controls.Add(this._TextStyleBox);\r\n\t\t\tthis._TextStylePage.Controls.Add(this.label7);\r\n\t\t\tthis._TextStylePage.Location = new System.Drawing.Point(4, 25);\r\n\t\t\tthis._TextStylePage.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TextStylePage.Name = \"_TextStylePage\";\r\n\t\t\tthis._TextStylePage.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TextStylePage.Size = new System.Drawing.Size(444, 231);\r\n\t\t\tthis._TextStylePage.TabIndex = 2;\r\n\t\t\tthis._TextStylePage.Text = \"文本样式\";\r\n\t\t\tthis._TextStylePage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _TextStyleBox\r\n\t\t\t// \r\n\t\t\tthis._TextStyleBox.AllColumns.Add(this._FontNameColumn);\r\n\t\t\tthis._TextStyleBox.AllColumns.Add(this._SizeColumn);\r\n\t\t\tthis._TextStyleBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._FontNameColumn,\r\n            this._SizeColumn});\r\n\t\t\tthis._TextStyleBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._TextStyleBox.Location = new System.Drawing.Point(11, 22);\r\n\t\t\tthis._TextStyleBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TextStyleBox.Name = \"_TextStyleBox\";\r\n\t\t\tthis._TextStyleBox.ShowGroups = false;\r\n\t\t\tthis._TextStyleBox.Size = new System.Drawing.Size(421, 196);\r\n\t\t\tthis._TextStyleBox.TabIndex = 1;\r\n\t\t\tthis._TextStyleBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._TextStyleBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _FontNameColumn\r\n\t\t\t// \r\n\t\t\tthis._FontNameColumn.Text = \"字体名称\";\r\n\t\t\tthis._FontNameColumn.Width = 219;\r\n\t\t\t// \r\n\t\t\t// _SizeColumn\r\n\t\t\t// \r\n\t\t\tthis._SizeColumn.Text = \"字体尺寸\";\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(8, 4);\r\n\t\t\tthis.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(202, 15);\r\n\t\t\tthis.label7.TabIndex = 0;\r\n\t\t\tthis.label7.Text = \"本页面包含如下样式的文本：\";\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point(301, 121);\r\n\t\t\tthis.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size(37, 15);\r\n\t\t\tthis.label8.TabIndex = 12;\r\n\t\t\tthis.label8.Text = \"宽：\";\r\n\t\t\t// \r\n\t\t\t// _WidthBox\r\n\t\t\t// \r\n\t\t\tthis._WidthBox.Location = new System.Drawing.Point(348, 117);\r\n\t\t\tthis._WidthBox.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._WidthBox.Name = \"_WidthBox\";\r\n\t\t\tthis._WidthBox.ReadOnly = true;\r\n\t\t\tthis._WidthBox.Size = new System.Drawing.Size(69, 25);\r\n\t\t\tthis._WidthBox.TabIndex = 13;\r\n\t\t\t// \r\n\t\t\t// _HeightBox\r\n\t\t\t// \r\n\t\t\tthis._HeightBox.Location = new System.Drawing.Point(348, 83);\r\n\t\t\tthis._HeightBox.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._HeightBox.Name = \"_HeightBox\";\r\n\t\t\tthis._HeightBox.ReadOnly = true;\r\n\t\t\tthis._HeightBox.Size = new System.Drawing.Size(69, 25);\r\n\t\t\tthis._HeightBox.TabIndex = 11;\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(301, 87);\r\n\t\t\tthis.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(37, 15);\r\n\t\t\tthis.label9.TabIndex = 10;\r\n\t\t\tthis.label9.Text = \"高：\";\r\n\t\t\t// \r\n\t\t\t// PagePropertyForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._CloseButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(484, 326);\r\n\t\t\tthis.Controls.Add(this._MainTab);\r\n\t\t\tthis.Controls.Add(this._CloseButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;\r\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"PagePropertyForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.Text = \"页面属性\";\r\n\t\t\tthis._MainTab.ResumeLayout(false);\r\n\t\t\tthis._DimensionPage.ResumeLayout(false);\r\n\t\t\tthis._DimensionPage.PerformLayout();\r\n\t\t\tthis._TextStylePage.ResumeLayout(false);\r\n\t\t\tthis._TextStylePage.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TextStyleBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _CloseButton;\r\n\t\tprivate System.Windows.Forms.ListBox _PageDimensionBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _TopBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.TextBox _RightBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.TextBox _BottomBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.TextBox _LeftBox;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.TextBox _RotationBox;\r\n\t\tprivate System.Windows.Forms.TabControl _MainTab;\r\n\t\tprivate System.Windows.Forms.TabPage _DimensionPage;\r\n\t\tprivate System.Windows.Forms.TabPage _TextStylePage;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _TextStyleBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FontNameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SizeColumn;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.TextBox _HeightBox;\r\n\t\tprivate System.Windows.Forms.TextBox _WidthBox;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/Editor/PagePropertyForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing MuPDF;\r\nusing PDFPatcher.Common;\r\nusing MuRectangle = MuPDF.Box;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tsealed partial class PagePropertyForm : DraggableForm\r\n\t{\r\n\t\tpublic int PageNumber { get; set; }\r\n\r\n\t\tpublic PagePropertyForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\t\tvoid OnLoad() {\r\n\t\t\t_PageDimensionBox.SelectedIndexChanged += _PageDimensionBox_SelectedIndexChanged;\r\n\t\t\t_CloseButton.Click += (s, args) => Hide();\r\n\t\t\t_FontNameColumn.AsTyped<MuFontAndSize>(f => f.AspectGetter = o => o.FontName);\r\n\t\t\t_SizeColumn.AsTyped<MuFontAndSize>(f => f.AspectGetter = o => o.Size);\r\n\t\t\t_TextStyleBox.ScaleColumnWidths();\r\n\t\t}\r\n\r\n\t\tpublic void LoadPage(Page page) {\r\n\t\t\t_PageDimensionBox.Items.Clear();\r\n\t\t\tAddBox(page, page.CropBox, Constants.Content.PageSettings.CropBox);\r\n\t\t\tAddBox(page, page.MediaBox, Constants.Content.PageSettings.MediaBox);\r\n\t\t\tAddBox(page, page.TrimBox, Constants.Content.PageSettings.TrimBox);\r\n\t\t\tAddBox(page, page.ArtBox, Constants.Content.PageSettings.ArtBox);\r\n\t\t\tAddBox(page, page.BleedBox, Constants.Content.PageSettings.BleedBox);\r\n\t\t\t_RotationBox.Text = page.Rotation.ToString();\r\n\t\t\tif (_PageDimensionBox.Items.Count > 0) {\r\n\t\t\t\t_PageDimensionBox.SelectedIndex = 0;\r\n\t\t\t}\r\n\t\t\tvar ts = new HashSet<MuFontAndSize>(new FontAndSizeComparer());\r\n\t\t\tforeach (var block in page.TextPage) {\r\n\t\t\t\tforeach (var line in block) {\r\n\t\t\t\t\tvar c = line.FirstCharacter;\r\n\t\t\t\t\tts.Add(new MuFontAndSize(Model.PdfDocumentFont.RemoveSubsetPrefix(c.Font.Name), c.Size));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_TextStyleBox.Objects = ts;\r\n\t\t\t_TextStyleBox.Sort(_SizeColumn, SortOrder.Descending);\r\n\t\t\tPageNumber = page.PageNumber + 1;\r\n\t\t}\r\n\r\n\t\tvoid AddBox(Page page, MuRectangle rect, string title) {\r\n\t\t\tif (rect.IsValid && rect.IsEmpty == false) {\r\n\t\t\t\t_PageDimensionBox.Items.Add(new Box(rect, title));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _PageDimensionBox_SelectedIndexChanged(object sender, EventArgs args) {\r\n\t\t\tif (_PageDimensionBox.SelectedItem is not Box v) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar r = v.Rect;\r\n\t\t\t_TopBox.Text = r.Bottom.ToText();\r\n\t\t\t_RightBox.Text = r.Right.ToText();\r\n\t\t\t_BottomBox.Text = r.Top.ToText();\r\n\t\t\t_LeftBox.Text = r.Left.ToText();\r\n\t\t\t_WidthBox.Text = r.Width.ToText();\r\n\t\t\t_HeightBox.Text = r.Height.ToText();\r\n\t\t}\r\n\r\n\t\tprotected override void OnDeactivate(EventArgs e) {\r\n\t\t\tHide();\r\n\t\t\tbase.OnDeactivate(e);\r\n\t\t}\r\n\r\n\t\tsealed class Box\r\n\t\t{\r\n\t\t\tpublic readonly MuRectangle Rect;\r\n\t\t\tpublic readonly string Title;\r\n\t\t\tpublic Box(MuRectangle rect, string title) {\r\n\t\t\t\tRect = rect;\r\n\t\t\t\tTitle = title;\r\n\t\t\t}\r\n\t\t\tpublic override string ToString() {\r\n\t\t\t\treturn Title;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class MuFontAndSize\r\n\t\t{\r\n\t\t\tpublic readonly string FontName;\r\n\t\t\tpublic readonly float Size;\r\n\r\n\t\t\tpublic MuFontAndSize(string fontName, float size) {\r\n\t\t\t\tFontName = fontName;\r\n\t\t\t\tSize = size;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsealed class FontAndSizeComparer : IEqualityComparer<MuFontAndSize>\r\n\t\t{\r\n\t\t\tpublic bool Equals(MuFontAndSize x, MuFontAndSize y) {\r\n\t\t\t\treturn x.FontName == y.FontName && x.Size == y.Size;\r\n\t\t\t}\r\n\r\n\t\t\tpublic int GetHashCode(MuFontAndSize obj) {\r\n\t\t\t\treturn obj.FontName.GetHashCode() ^ obj.Size.GetHashCode();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/PagePropertyForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/Parts/BookmarkInViewSynchronizer.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions.Editor.Parts\r\n{\r\n\tinternal sealed class BookmarkInViewSynchronizer\r\n\t{\r\n\t\treadonly BookmarkEditorView _BookmarkBox;\r\n\t\treadonly ViewerControl _ViewerBox;\r\n\t\treadonly RowBorderDecoration _BookmarkInViewDecoration = new RowBorderDecoration() {\r\n\t\t\tFillBrush = new SolidBrush(Color.FromArgb(40, Color.Yellow)),\r\n\t\t\tBorderPen = new Pen(Color.FromArgb(216, Color.Yellow))\r\n\t\t};\r\n\t\tBookmarkElement _BookmarkInView = null;\r\n\r\n\t\tpublic BookmarkInViewSynchronizer(BookmarkEditorView bookmark, ViewerControl viewer) {\r\n\t\t\t_BookmarkBox = bookmark;\r\n\t\t\t_BookmarkBox.FormatRow += HighlightInViewRow;\r\n\t\t\t_BookmarkBox.ItemsChanged += HandleBookmarkChange;\r\n\t\t\t_BookmarkBox.BookmarkChanged += HandleBookmarkChange;\r\n\t\t\t_ViewerBox = viewer;\r\n\t\t\t_ViewerBox.PageChanged += SyncBookmarkPosition;\r\n\t\t}\r\n\r\n\t\tvoid HandleBookmarkChange(object sender, EventArgs e) {\r\n\t\t\tSyncView();\r\n\t\t}\r\n\r\n\t\tpublic BookmarkElement BookmarkInView {\r\n\t\t\tget => _BookmarkInView;\r\n\t\t\tinternal set {\r\n\t\t\t\tif (value != _BookmarkInView) {\r\n\t\t\t\t\tvar old = _BookmarkInView;\r\n\t\t\t\t\t_BookmarkInView = value;\r\n\t\t\t\t\tvar i = _BookmarkBox.IndexOf(old);\r\n\t\t\t\t\tif (i >= 0) {\r\n\t\t\t\t\t\t_BookmarkBox.RedrawItem(i);\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti = _BookmarkBox.IndexOf(value);\r\n\t\t\t\t\tif (i >= 0) {\r\n\t\t\t\t\t\t_BookmarkBox.RedrawItem(i);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SyncBookmarkPosition(object sender, ViewerControl.PageChangedEventArgs e) {\r\n\t\t\tSyncView();\r\n\t\t}\r\n\r\n\t\tvoid SyncView() {\r\n\t\t\tint l = _BookmarkBox.GetItemCount();\r\n\t\t\tif (l == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar p = _ViewerBox.GetCurrentScrollPosition();\r\n\t\t\tif (p.Page == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tBookmarkInView = FindNearestBookmark(l, p);\r\n\t\t}\r\n\r\n\t\tBookmarkElement FindNearestBookmark(int itemCount, PagePosition p) {\r\n\t\t\tBookmarkElement e = null;\r\n\t\t\tfloat t = float.NaN;\r\n\t\t\tvar h = _ViewerBox.HorizontalFlow;\r\n\t\t\tint start = 0, end = itemCount, i = itemCount >> 1, bp;\r\n\t\t\tBookmarkElement b, c;\r\n\t\t\t// 使用二分法查找最近的书签，这里假设书签指向的页面从上到下是顺序的\r\n\t\t\twhile (i != start && i != end) {\r\n\t\t\t\tc = _BookmarkBox.GetBookmark(i);\r\n\t\t\t\tbp = c.Page;\r\n\t\t\t\tif (bp == 0) {\r\n\t\t\t\t\t++i;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tb = c;\r\n\t\t\t\tif (bp > p.Page) {\r\n\t\t\t\t\tend = i;\r\n\t\t\t\t\ti = start + ((i - start) >> 1);\r\n\t\t\t\t}\r\n\t\t\t\telse if (bp < p.Page) {\r\n\t\t\t\t\tstart = i;\r\n\t\t\t\t\ti = end - ((end - i) >> 1);\r\n\t\t\t\t\tif (Single.IsNaN(t)) {\r\n\t\t\t\t\t\te = b;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (h) {\r\n\t\t\t\t\t\te = b;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (Single.IsNaN(t)) {\r\n\t\t\t\t\t\tt = b.Top;\r\n\t\t\t\t\t\te = b;\r\n\t\t\t\t\t\tif (t > p.PageY) {\r\n\t\t\t\t\t\t\tstart = i;\r\n\t\t\t\t\t\t\t++i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (t < p.PageY) {\r\n\t\t\t\t\t\t\tend = i;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (t > p.PageY) {\r\n\t\t\t\t\t\t\tif (t > b.Top && t - p.PageY >= Math.Abs(b.Top - p.PageY)) {\r\n\t\t\t\t\t\t\t\tt = b.Top;\r\n\t\t\t\t\t\t\t\te = b;\r\n\t\t\t\t\t\t\t\tstart = i;\r\n\t\t\t\t\t\t\t\t++i;\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (t < p.PageY) {\r\n\t\t\t\t\t\t\tif (t < b.Top && p.PageY - t >= Math.Abs(b.Top - p.PageY)) {\r\n\t\t\t\t\t\t\t\tt = b.Top;\r\n\t\t\t\t\t\t\t\te = b;\r\n\t\t\t\t\t\t\t\tend = i;\r\n\t\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\te = b;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn e ?? _BookmarkBox.GetBookmark(start);\r\n\t\t}\r\n\r\n\t\tvoid HighlightInViewRow(object sender, FormatRowEventArgs e) {\r\n\t\t\tif (e.Model == _BookmarkInView) {\r\n\t\t\t\te.Item.Decorations.Add(_BookmarkInViewDecoration);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/Parts/BookmarkTitleEditHandler.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\n\r\nnamespace PDFPatcher.Functions.Editor.Parts\r\n{\r\n    /// <summary>\r\n\t/// 处理书签栏书签标题在编辑过程的动作。\r\n\t/// </summary>\r\n\tsealed class BookmarkTitleEditHandler\r\n    {\r\n\t\tController _controller;\r\n\t\tBookmarkEditorView _bookmarkBox;\r\n\t\tViewerControl _viewerBox;\r\n\r\n\t\tpublic BookmarkTitleEditHandler(Controller controller) {\r\n\t\t\t_controller = controller;\r\n\t\t\t_bookmarkBox = controller.View.Bookmark;\r\n\t\t\t_viewerBox = controller.View.Viewer;\r\n\t\t\t_bookmarkBox.BeforeLabelEdit += BookmarkBoxBeforeLabelEdit;\r\n\t\t\t_bookmarkBox.CellClick += BookmarkBoxCellClick;\r\n\t\t\t_bookmarkBox.CellEditStarting += BookmarkBoxCellEditStarting;\r\n\t\t}\r\n\r\n\t\tvoid BookmarkBoxBeforeLabelEdit(object sender, LabelEditEventArgs e) {\r\n\t\t\t((TreeListView)sender).SelectedIndex = e.Item;\r\n\t\t\tScrollToSelectedBookmarkLocation();\r\n\t\t}\r\n\r\n\t\tvoid BookmarkBoxCellClick(object sender, CellClickEventArgs e) {\r\n\t\t\tif (e.ColumnIndex != 0 || e.ClickCount > 1 || Control.ModifierKeys != Keys.None) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tScrollToSelectedBookmarkLocation();\r\n\t\t}\r\n\r\n\t\tvoid BookmarkBoxCellEditStarting(object sender, CellEditEventArgs e) {\r\n\t\t\tif (e.Column.Index == 0) {\r\n\t\t\t\tScrollToSelectedBookmarkLocation();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ScrollToSelectedBookmarkLocation() {\r\n\t\t\t_controller.ExecuteCommand(Commands.EditorViewerScrollToBookmark);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/SavePdfForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class SavePdfForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._MessageLabel = new System.Windows.Forms.Label();\r\n\t\t\tthis._SourceFileBox = new PDFPatcher.SourceFileControl();\r\n\t\t\tthis._TargetFileBox = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._OverwriteBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._OptionsBox = new PDFPatcher.Functions.PatcherOptionsControl();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(322, 443);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 0;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(403, 443);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 1;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MessageLabel\r\n\t\t\t// \r\n\t\t\tthis._MessageLabel.AutoSize = true;\r\n\t\t\tthis._MessageLabel.Location = new System.Drawing.Point(12, 421);\r\n\t\t\tthis._MessageLabel.Name = \"_MessageLabel\";\r\n\t\t\tthis._MessageLabel.Size = new System.Drawing.Size(347, 12);\r\n\t\t\tthis._MessageLabel.TabIndex = 2;\r\n\t\t\tthis._MessageLabel.Text = \"点击“确定”按钮，将书签编辑器的书签写入到目标 PDF 文档。\";\r\n\t\t\t// \r\n\t\t\t// _SourceFileBox\r\n\t\t\t// \r\n\t\t\tthis._SourceFileBox.Location = new System.Drawing.Point(12, 12);\r\n\t\t\tthis._SourceFileBox.Name = \"_SourceFileBox\";\r\n\t\t\tthis._SourceFileBox.Size = new System.Drawing.Size(469, 26);\r\n\t\t\tthis._SourceFileBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _TargetFileBox\r\n\t\t\t// \r\n\t\t\tthis._TargetFileBox.Location = new System.Drawing.Point(12, 44);\r\n\t\t\tthis._TargetFileBox.Name = \"_TargetFileBox\";\r\n\t\t\tthis._TargetFileBox.Size = new System.Drawing.Size(469, 25);\r\n\t\t\tthis._TargetFileBox.TabIndex = 4;\r\n\t\t\t// \r\n\t\t\t// _OverwriteBox\r\n\t\t\t// \r\n\t\t\tthis._OverwriteBox.AutoSize = true;\r\n\t\t\tthis._OverwriteBox.Location = new System.Drawing.Point(115, 75);\r\n\t\t\tthis._OverwriteBox.Name = \"_OverwriteBox\";\r\n\t\t\tthis._OverwriteBox.Size = new System.Drawing.Size(126, 16);\r\n\t\t\tthis._OverwriteBox.TabIndex = 13;\r\n\t\t\tthis._OverwriteBox.Text = \"覆盖原始 PDF 文件\";\r\n\t\t\tthis._OverwriteBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _OptionsBox\r\n\t\t\t// \r\n\t\t\tthis._OptionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OptionsBox.ForEditor = false;\r\n\t\t\tthis._OptionsBox.Location = new System.Drawing.Point(12, 97);\r\n\t\t\tthis._OptionsBox.Name = \"_OptionsBox\";\r\n\t\t\tthis._OptionsBox.Options = null;\r\n\t\t\tthis._OptionsBox.Size = new System.Drawing.Size(466, 321);\r\n\t\t\tthis._OptionsBox.TabIndex = 14;\r\n\t\t\t// \r\n\t\t\t// SavePdfForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(490, 478);\r\n\t\t\tthis.Controls.Add(this._OptionsBox);\r\n\t\t\tthis.Controls.Add(this._OverwriteBox);\r\n\t\t\tthis.Controls.Add(this._TargetFileBox);\r\n\t\t\tthis.Controls.Add(this._SourceFileBox);\r\n\t\t\tthis.Controls.Add(this._MessageLabel);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"SavePdfForm\";\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"保存PDF文件\";\r\n\t\t\tthis.Load += new System.EventHandler(this.ImportBookmarkForm_Load);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label _MessageLabel;\r\n\t\tprivate SourceFileControl _SourceFileBox;\r\n\t\tprivate TargetFileControl _TargetFileBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _OverwriteBox;\r\n\t\tprivate PatcherOptionsControl _OptionsBox;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/Editor/SavePdfForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class SavePdfForm : Form\r\n\t{\r\n\t\treadonly PdfInfoXmlDocument _bookmarkDocument;\r\n\t\tpublic EventHandler DoWork;\r\n\t\tpublic Action<bool> Finished;\r\n\r\n\t\tpublic string SourceFilePath => _SourceFileBox.Text;\r\n\t\tpublic string TargetFilePath => _TargetFileBox.Text;\r\n\r\n\t\tSavePdfForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_OptionsBox.Options = AppContext.Editor;\r\n\t\t\t_OptionsBox.ForEditor = true;\r\n\t\t}\r\n\r\n\t\tpublic SavePdfForm(string sourcePath, string targetPath, PdfInfoXmlDocument bookmarkDocument) : this() {\r\n\t\t\tif (String.IsNullOrEmpty(sourcePath) == false) {\r\n\t\t\t\t_SourceFileBox.Text = sourcePath;\r\n\t\t\t\t_SourceFileBox.Enabled = false;\r\n\t\t\t}\r\n\t\t\tif (String.IsNullOrEmpty(targetPath) == false) {\r\n\t\t\t\t_TargetFileBox.Text = targetPath;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttargetPath = sourcePath;\r\n\t\t\t}\r\n\t\t\tif (targetPath.IsNullOrWhiteSpace() == false) {\r\n\t\t\t\tvar p = new FilePath(targetPath);\r\n\t\t\t\t_TargetFileBox.FileDialog.FileName = p.FileName;\r\n\t\t\t\t_TargetFileBox.FileDialog.InitialDirectory = p.Directory;\r\n\t\t\t}\r\n\t\t\t_bookmarkDocument = new PdfInfoXmlDocument();\r\n\t\t\tusing (var r = bookmarkDocument.CreateNavigator().ReadSubtree()) {\r\n\t\t\t\t_bookmarkDocument.Load(r);\r\n\t\t\t}\r\n\r\n\t\t\t_OverwriteBox.CheckedChanged += (s, args) => _TargetFileBox.Enabled = !_OverwriteBox.Checked;\r\n\t\t\tif (AppContext.Editor.DefaultOverwriteDocument) {\r\n\t\t\t\t_OverwriteBox.Checked = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ImportBookmarkForm_Load(object sender, EventArgs e) {\r\n\t\t\t_TargetFileBox.FileMacroMenu.LoadStandardSourceFileMacros();\r\n\t\t\t_OptionsBox.OnLoad();\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(object source, EventArgs args) {\r\n\t\t\t_OptionsBox.Apply();\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar doc = _bookmarkDocument;\r\n\t\t\tvar s = _SourceFileBox.Text;\r\n\t\t\tvar t = _OverwriteBox.Checked ? _SourceFileBox.Text : _TargetFileBox.Text;\r\n\t\t\tif (String.IsNullOrEmpty(s)) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (String.IsNullOrEmpty(t)) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_SourceFileBox.FileList.AddHistoryItem();\r\n\t\t\t_TargetFileBox.FileList.AddHistoryItem();\r\n\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tDoWork?.Invoke(this, null);\r\n\t\t\t\targ.Result = Processor.Worker.PatchDocument(new SourceItem.Pdf(s), t, _bookmarkDocument, AppContext.Importer, AppContext.Editor, true);\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerCompleted += (dummy, arg) => Finished?.Invoke(arg.Result.CastOrDefault<bool>());\r\n\t\t\tworker.RunWorkerAsync();\r\n\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\t_OptionsBox.Apply();\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/SavePdfForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/SearchBookmarkForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class SearchBookmarkForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._SearchButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._MatchCaseBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._FullMatchBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ReplaceButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ResultLabel = new System.Windows.Forms.Label();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._NormalSearchBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._RegexSearchBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._XPathSearchBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ReplaceInSelectionBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ReplaceInAllBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.panel1 = new System.Windows.Forms.Panel();\r\n\t\t\tthis.panel2 = new System.Windows.Forms.Panel();\r\n\t\t\tthis._SearchNextButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ReplaceTextBox = new PDFPatcher.HistoryComboBox();\r\n\t\t\tthis._SearchTextBox = new PDFPatcher.HistoryComboBox();\r\n\t\t\tthis._CloseButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.panel1.SuspendLayout();\r\n\t\t\tthis.panel2.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _SearchButton\r\n\t\t\t// \r\n\t\t\tthis._SearchButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SearchButton.Location = new System.Drawing.Point(357, 10);\r\n\t\t\tthis._SearchButton.Name = \"_SearchButton\";\r\n\t\t\tthis._SearchButton.Size = new System.Drawing.Size(99, 23);\r\n\t\t\tthis._SearchButton.TabIndex = 11;\r\n\t\t\tthis._SearchButton.Text = \"搜索全部(&S)\";\r\n\t\t\tthis._SearchButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._SearchButton.Click += new System.EventHandler(this._SearchButton_Click);\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(12, 15);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"搜索文本：\";\r\n\t\t\t// \r\n\t\t\t// _MatchCaseBox\r\n\t\t\t// \r\n\t\t\tthis._MatchCaseBox.AutoSize = true;\r\n\t\t\tthis._MatchCaseBox.Location = new System.Drawing.Point(83, 38);\r\n\t\t\tthis._MatchCaseBox.Name = \"_MatchCaseBox\";\r\n\t\t\tthis._MatchCaseBox.Size = new System.Drawing.Size(84, 16);\r\n\t\t\tthis._MatchCaseBox.TabIndex = 2;\r\n\t\t\tthis._MatchCaseBox.Text = \"区分大小写\";\r\n\t\t\tthis._MatchCaseBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FullMatchBox\r\n\t\t\t// \r\n\t\t\tthis._FullMatchBox.AutoSize = true;\r\n\t\t\tthis._FullMatchBox.Location = new System.Drawing.Point(183, 38);\r\n\t\t\tthis._FullMatchBox.Name = \"_FullMatchBox\";\r\n\t\t\tthis._FullMatchBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._FullMatchBox.TabIndex = 3;\r\n\t\t\tthis._FullMatchBox.Text = \"匹配整个书签的文本\";\r\n\t\t\tthis._FullMatchBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(12, 85);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label2.TabIndex = 6;\r\n\t\t\tthis.label2.Text = \"替换文本：\";\r\n\t\t\t// \r\n\t\t\t// _ReplaceButton\r\n\t\t\t// \r\n\t\t\tthis._ReplaceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ReplaceButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._ReplaceButton.Location = new System.Drawing.Point(357, 80);\r\n\t\t\tthis._ReplaceButton.Name = \"_ReplaceButton\";\r\n\t\t\tthis._ReplaceButton.Size = new System.Drawing.Size(99, 23);\r\n\t\t\tthis._ReplaceButton.TabIndex = 13;\r\n\t\t\tthis._ReplaceButton.Text = \"替换(&T)\";\r\n\t\t\tthis._ReplaceButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ReplaceButton.Click += new System.EventHandler(this._ReplaceButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ResultLabel\r\n\t\t\t// \r\n\t\t\tthis._ResultLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ResultLabel.Location = new System.Drawing.Point(12, 127);\r\n\t\t\tthis._ResultLabel.Name = \"_ResultLabel\";\r\n\t\t\tthis._ResultLabel.Size = new System.Drawing.Size(443, 33);\r\n\t\t\tthis._ResultLabel.TabIndex = 10;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(12, 61);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label3.TabIndex = 4;\r\n\t\t\tthis.label3.Text = \"搜索模式：\";\r\n\t\t\t// \r\n\t\t\t// _NormalSearchBox\r\n\t\t\t// \r\n\t\t\tthis._NormalSearchBox.AutoSize = true;\r\n\t\t\tthis._NormalSearchBox.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._NormalSearchBox.Name = \"_NormalSearchBox\";\r\n\t\t\tthis._NormalSearchBox.Size = new System.Drawing.Size(47, 16);\r\n\t\t\tthis._NormalSearchBox.TabIndex = 0;\r\n\t\t\tthis._NormalSearchBox.TabStop = true;\r\n\t\t\tthis._NormalSearchBox.Text = \"普通\";\r\n\t\t\tthis._NormalSearchBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._NormalSearchBox.CheckedChanged += new System.EventHandler(this.MatchModeChanged);\r\n\t\t\t// \r\n\t\t\t// _RegexSearchBox\r\n\t\t\t// \r\n\t\t\tthis._RegexSearchBox.AutoSize = true;\r\n\t\t\tthis._RegexSearchBox.Location = new System.Drawing.Point(53, 0);\r\n\t\t\tthis._RegexSearchBox.Name = \"_RegexSearchBox\";\r\n\t\t\tthis._RegexSearchBox.Size = new System.Drawing.Size(83, 16);\r\n\t\t\tthis._RegexSearchBox.TabIndex = 1;\r\n\t\t\tthis._RegexSearchBox.TabStop = true;\r\n\t\t\tthis._RegexSearchBox.Text = \"正则表达式\";\r\n\t\t\tthis._RegexSearchBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._RegexSearchBox.CheckedChanged += new System.EventHandler(this.MatchModeChanged);\r\n\t\t\t// \r\n\t\t\t// _XPathSearchBox\r\n\t\t\t// \r\n\t\t\tthis._XPathSearchBox.AutoSize = true;\r\n\t\t\tthis._XPathSearchBox.Location = new System.Drawing.Point(144, 0);\r\n\t\t\tthis._XPathSearchBox.Name = \"_XPathSearchBox\";\r\n\t\t\tthis._XPathSearchBox.Size = new System.Drawing.Size(53, 16);\r\n\t\t\tthis._XPathSearchBox.TabIndex = 2;\r\n\t\t\tthis._XPathSearchBox.TabStop = true;\r\n\t\t\tthis._XPathSearchBox.Text = \"XPath\";\r\n\t\t\tthis._XPathSearchBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._XPathSearchBox.CheckedChanged += new System.EventHandler(this.MatchModeChanged);\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(12, 110);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label4.TabIndex = 8;\r\n\t\t\tthis.label4.Text = \"替换范围：\";\r\n\t\t\t// \r\n\t\t\t// _ReplaceInSelectionBox\r\n\t\t\t// \r\n\t\t\tthis._ReplaceInSelectionBox.AutoSize = true;\r\n\t\t\tthis._ReplaceInSelectionBox.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._ReplaceInSelectionBox.Name = \"_ReplaceInSelectionBox\";\r\n\t\t\tthis._ReplaceInSelectionBox.Size = new System.Drawing.Size(83, 16);\r\n\t\t\tthis._ReplaceInSelectionBox.TabIndex = 0;\r\n\t\t\tthis._ReplaceInSelectionBox.TabStop = true;\r\n\t\t\tthis._ReplaceInSelectionBox.Text = \"选中的书签\";\r\n\t\t\tthis._ReplaceInSelectionBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ReplaceInSelectionBox.CheckedChanged += new System.EventHandler(this.ReplaceModeChanged);\r\n\t\t\t// \r\n\t\t\t// _ReplaceInAllBox\r\n\t\t\t// \r\n\t\t\tthis._ReplaceInAllBox.AutoSize = true;\r\n\t\t\tthis._ReplaceInAllBox.Location = new System.Drawing.Point(100, 0);\r\n\t\t\tthis._ReplaceInAllBox.Name = \"_ReplaceInAllBox\";\r\n\t\t\tthis._ReplaceInAllBox.Size = new System.Drawing.Size(71, 16);\r\n\t\t\tthis._ReplaceInAllBox.TabIndex = 1;\r\n\t\t\tthis._ReplaceInAllBox.TabStop = true;\r\n\t\t\tthis._ReplaceInAllBox.Text = \"所有书签\";\r\n\t\t\tthis._ReplaceInAllBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ReplaceInAllBox.CheckedChanged += new System.EventHandler(this.ReplaceModeChanged);\r\n\t\t\t// \r\n\t\t\t// panel1\r\n\t\t\t// \r\n\t\t\tthis.panel1.Controls.Add(this._ReplaceInAllBox);\r\n\t\t\tthis.panel1.Controls.Add(this._ReplaceInSelectionBox);\r\n\t\t\tthis.panel1.Location = new System.Drawing.Point(83, 108);\r\n\t\t\tthis.panel1.Name = \"panel1\";\r\n\t\t\tthis.panel1.Size = new System.Drawing.Size(268, 16);\r\n\t\t\tthis.panel1.TabIndex = 9;\r\n\t\t\t// \r\n\t\t\t// panel2\r\n\t\t\t// \r\n\t\t\tthis.panel2.Controls.Add(this._NormalSearchBox);\r\n\t\t\tthis.panel2.Controls.Add(this._XPathSearchBox);\r\n\t\t\tthis.panel2.Controls.Add(this._RegexSearchBox);\r\n\t\t\tthis.panel2.Location = new System.Drawing.Point(83, 60);\r\n\t\t\tthis.panel2.Name = \"panel2\";\r\n\t\t\tthis.panel2.Size = new System.Drawing.Size(268, 16);\r\n\t\t\tthis.panel2.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// _SearchNextButton\r\n\t\t\t// \r\n\t\t\tthis._SearchNextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SearchNextButton.Location = new System.Drawing.Point(357, 39);\r\n\t\t\tthis._SearchNextButton.Name = \"_SearchNextButton\";\r\n\t\t\tthis._SearchNextButton.Size = new System.Drawing.Size(99, 23);\r\n\t\t\tthis._SearchNextButton.TabIndex = 12;\r\n\t\t\tthis._SearchNextButton.Text = \"搜索下一个(&X)\";\r\n\t\t\tthis._SearchNextButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._SearchNextButton.Click += new System.EventHandler(this._SearchButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ReplaceTextBox\r\n\t\t\t// \r\n\t\t\tthis._ReplaceTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ReplaceTextBox.Contents = null;\r\n\t\t\tthis._ReplaceTextBox.FormattingEnabled = true;\r\n\t\t\tthis._ReplaceTextBox.Location = new System.Drawing.Point(83, 82);\r\n\t\t\tthis._ReplaceTextBox.MaxItemCount = 16;\r\n\t\t\tthis._ReplaceTextBox.Name = \"_ReplaceTextBox\";\r\n\t\t\tthis._ReplaceTextBox.Size = new System.Drawing.Size(268, 20);\r\n\t\t\tthis._ReplaceTextBox.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// _SearchTextBox\r\n\t\t\t// \r\n\t\t\tthis._SearchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SearchTextBox.Contents = null;\r\n\t\t\tthis._SearchTextBox.FormattingEnabled = true;\r\n\t\t\tthis._SearchTextBox.Location = new System.Drawing.Point(83, 12);\r\n\t\t\tthis._SearchTextBox.MaxItemCount = 16;\r\n\t\t\tthis._SearchTextBox.Name = \"_SearchTextBox\";\r\n\t\t\tthis._SearchTextBox.Size = new System.Drawing.Size(268, 20);\r\n\t\t\tthis._SearchTextBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _CloseButton\r\n\t\t\t// \r\n\t\t\tthis._CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CloseButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CloseButton.Location = new System.Drawing.Point(357, 105);\r\n\t\t\tthis._CloseButton.Name = \"_CloseButton\";\r\n\t\t\tthis._CloseButton.Size = new System.Drawing.Size(99, 23);\r\n\t\t\tthis._CloseButton.TabIndex = 14;\r\n\t\t\tthis._CloseButton.Text = \"关闭\";\r\n\t\t\tthis._CloseButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CloseButton.Click += new System.EventHandler(this._CloseButton_Click);\r\n\t\t\t// \r\n\t\t\t// SearchBookmarkForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._SearchButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CloseButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(467, 161);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this._ReplaceTextBox);\r\n\t\t\tthis.Controls.Add(this._SearchTextBox);\r\n\t\t\tthis.Controls.Add(this._ResultLabel);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._FullMatchBox);\r\n\t\t\tthis.Controls.Add(this._MatchCaseBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Controls.Add(this._CloseButton);\r\n\t\t\tthis.Controls.Add(this._ReplaceButton);\r\n\t\t\tthis.Controls.Add(this._SearchNextButton);\r\n\t\t\tthis.Controls.Add(this._SearchButton);\r\n\t\t\tthis.Controls.Add(this.panel1);\r\n\t\t\tthis.Controls.Add(this.panel2);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MaximumSize = new System.Drawing.Size(999, 200);\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"SearchBookmarkForm\";\r\n\t\t\tthis.ShowIcon = false;\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"查找、替换书签项\";\r\n\t\t\tthis.Load += new System.EventHandler(this.SearchBookmarkForm_Load);\r\n\t\t\tthis.panel1.ResumeLayout(false);\r\n\t\t\tthis.panel1.PerformLayout();\r\n\t\t\tthis.panel2.ResumeLayout(false);\r\n\t\t\tthis.panel2.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _SearchButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.CheckBox _MatchCaseBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FullMatchBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.Button _ReplaceButton;\r\n\t\tprivate System.Windows.Forms.Label _ResultLabel;\r\n\t\tprivate HistoryComboBox _SearchTextBox;\r\n\t\tprivate HistoryComboBox _ReplaceTextBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.RadioButton _NormalSearchBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _RegexSearchBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _XPathSearchBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.RadioButton _ReplaceInSelectionBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ReplaceInAllBox;\r\n\t\tprivate System.Windows.Forms.Panel panel1;\r\n\t\tprivate System.Windows.Forms.Panel panel2;\r\n\t\tprivate System.Windows.Forms.Button _SearchNextButton;\r\n\t\tprivate System.Windows.Forms.Button _CloseButton;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/Editor/SearchBookmarkForm.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class SearchBookmarkForm : Form\r\n\t{\r\n\t\tstatic BookmarkMatcher.MatcherType _matcherType = BookmarkMatcher.MatcherType.Normal;\r\n\t\tstatic bool _replaceInSelection = true;\r\n\r\n\t\t//static char[] __TrimChars = new char[] { ' ', '\\t', '\\r', '\\n', '　' };\r\n\t\treadonly Editor.Controller _controller;\r\n\t\tinternal SearchBookmarkForm(Editor.Controller controller) {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_controller = controller;\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_SearchTextBox.Select();\r\n\t\t\t_SearchTextBox.Focus();\r\n\t\t}\r\n\r\n\t\tvoid _SearchTextBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\t_ResultLabel.Text = String.Empty;\r\n\t\t}\r\n\r\n\t\tprivate void SearchBookmarkForm_Load(object sender, EventArgs e) {\r\n\t\t\tMinimumSize = Size;\r\n\t\t\tShowInTaskbar = false;\r\n\t\t\t_SearchTextBox.Contents = AppContext.Recent.SearchPatterns;\r\n\t\t\t_ReplaceTextBox.Contents = AppContext.Recent.ReplacePatterns;\r\n\t\t\tvar b = _NormalSearchBox;\r\n\t\t\tswitch (_matcherType) {\r\n\t\t\t\tcase BookmarkMatcher.MatcherType.Normal:\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tcase BookmarkMatcher.MatcherType.Regex:\r\n\t\t\t\t\tb = _RegexSearchBox;\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tcase BookmarkMatcher.MatcherType.XPath:\r\n\t\t\t\t\tb = _XPathSearchBox;\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tb.Checked = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (_replaceInSelection) {\r\n\t\t\t\t_ReplaceInSelectionBox.Checked = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_ReplaceInAllBox.Checked = true;\r\n\t\t\t}\r\n\t\t\t_SearchTextBox.TextChanged += _SearchTextBox_TextChanged;\r\n\t\t}\r\n\r\n\t\tBookmarkMatcher CreateMatcher() {\r\n\t\t\treturn BookmarkMatcher.Create(_SearchTextBox.Text,\r\n\t\t\t\t_RegexSearchBox.Checked ? BookmarkMatcher.MatcherType.Regex\r\n\t\t\t\t: _XPathSearchBox.Checked ? BookmarkMatcher.MatcherType.XPath\r\n\t\t\t\t: BookmarkMatcher.MatcherType.Normal,\r\n\t\t\t\t_MatchCaseBox.Checked,\r\n\t\t\t\t_FullMatchBox.Checked);\r\n\t\t}\r\n\r\n\t\tprivate void _SearchButton_Click(Object sender, EventArgs args) {\r\n\t\t\tif (String.IsNullOrEmpty(_SearchTextBox.Text)) {\r\n\t\t\t\tCommon.FormHelper.InfoBox(\"请先输入查询关键字。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tBookmarkMatcher matcher;\r\n\t\t\ttry {\r\n\t\t\t\tmatcher = CreateMatcher();\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tCommon.FormHelper.ErrorBox(\"搜索表达式有误：\" + ex.Message);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_SearchTextBox.AddHistoryItem();\r\n\t\t\tif (sender == _SearchButton) {\r\n\t\t\t\tvar matches = _controller.View.Bookmark.SearchBookmarks(matcher);\r\n\t\t\t\tif (matches.Count > 0) {\r\n\t\t\t\t\t_ResultLabel.Text = \"找到 \" + matches.Count + \" 个匹配的书签。\";\r\n\t\t\t\t\t_controller.View.Bookmark.FindForm().Activate();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_ResultLabel.Text = \"没有找到任何匹配的书签。\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar m = _controller.View.Bookmark.SearchBookmark(matcher);\r\n\t\t\t\tif (m == null) {\r\n\t\t\t\t\t_ResultLabel.Text = \"没有找到对应的书签。\";\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_ResultLabel.Text = String.Empty;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tprivate void _ReplaceButton_Click(object sender, EventArgs e) {\r\n\t\t\tBookmarkMatcher matcher;\r\n\t\t\ttry {\r\n\t\t\t\tmatcher = CreateMatcher();\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tCommon.FormHelper.ErrorBox(\"搜索表达式有误：\" + ex.Message);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tint i = ReplaceBookmarks(_replaceInSelection, matcher, _ReplaceTextBox.Text);\r\n\t\t\t_ResultLabel.Text = i > 0 ? \"替换了 \" + i + \" 个匹配的书签。\" : \"没有替换任何书签。\";\r\n\t\t\t_SearchTextBox.AddHistoryItem();\r\n\t\t\t_ReplaceTextBox.AddHistoryItem();\r\n\t\t}\r\n\r\n\t\tprivate void _CloseButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tprivate void MatchModeChanged(object sender, EventArgs e) {\r\n\t\t\tif (_NormalSearchBox.Checked) {\r\n\t\t\t\t_matcherType = BookmarkMatcher.MatcherType.Normal;\r\n\t\t\t}\r\n\t\t\telse if (_RegexSearchBox.Checked) {\r\n\t\t\t\t_matcherType = BookmarkMatcher.MatcherType.Regex;\r\n\t\t\t}\r\n\t\t\telse if (_XPathSearchBox.Checked) {\r\n\t\t\t\t_matcherType = BookmarkMatcher.MatcherType.XPath;\r\n\t\t\t}\r\n\t\t\t_MatchCaseBox.Enabled = _FullMatchBox.Enabled = _ReplaceButton.Enabled = _ReplaceTextBox.Enabled = !_XPathSearchBox.Checked;\r\n\t\t}\r\n\r\n\t\tprivate void ReplaceModeChanged(object sender, EventArgs e) {\r\n\t\t\t_replaceInSelection = _ReplaceInSelectionBox.Checked;\r\n\t\t}\r\n\r\n\t\tprivate int ReplaceBookmarks(bool replaceInSelection, BookmarkMatcher matcher, string replacement) {\r\n\t\t\tvar b = _controller.View.Bookmark;\r\n\t\t\tif (b.GetItemCount() == 0) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tvar si = new List<XmlNode>();\r\n\t\t\tvar ol = replaceInSelection ? b.SelectedObjects : (b.GetModelObject(0) as XmlElement).ParentNode.SelectNodes(\".//\" + Constants.Bookmark) as IEnumerable;\r\n\t\t\tforeach (XmlNode item in ol) {\r\n\t\t\t\tsi.Add(item);\r\n\t\t\t}\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tvar p = new ReplaceTitleTextProcessor(matcher, replacement);\r\n\t\t\ttry {\r\n\t\t\t\tXmlElement x;\r\n\t\t\t\tforeach (XmlNode item in si) {\r\n\t\t\t\t\tx = item as XmlElement;\r\n\t\t\t\t\tif (x == null) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tundo.Add(p.Process(x));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tCommon.FormHelper.ErrorBox(\"在替换匹配文本时出现错误：\" + ex.Message);\r\n\t\t\t}\r\n\t\t\tif (undo.Count > 0) {\r\n\t\t\t\t_controller.Model.Undo.AddUndo(p.Name, undo);\r\n\t\t\t\tsi.Clear();\r\n\t\t\t\tsi.AddRange(undo.AffectedElements);\r\n\t\t\t\tb.RefreshObjects(si);\r\n\t\t\t\treturn si.Count;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/SearchBookmarkForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/ShiftPageNumberEntryForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ShiftPageNumberEntryForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._MessageLabel = new System.Windows.Forms.Label();\r\n\t\t\tthis._ShiftNumberBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._TakeFollowingBox = new System.Windows.Forms.CheckBox();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ShiftNumberBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(128, 104);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 0;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(209, 104);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 1;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MessageLabel\r\n\t\t\t// \r\n\t\t\tthis._MessageLabel.AutoSize = true;\r\n\t\t\tthis._MessageLabel.Location = new System.Drawing.Point(12, 27);\r\n\t\t\tthis._MessageLabel.Name = \"_MessageLabel\";\r\n\t\t\tthis._MessageLabel.Size = new System.Drawing.Size(197, 24);\r\n\t\t\tthis._MessageLabel.TabIndex = 2;\r\n\t\t\tthis._MessageLabel.Text = \"在此输入需要增加或减少的页数\\r\\n（正数增加页码，负数减少页码）：\";\r\n\t\t\t// \r\n\t\t\t// _ShiftNumberBox\r\n\t\t\t// \r\n\t\t\tthis._ShiftNumberBox.Location = new System.Drawing.Point(215, 27);\r\n\t\t\tthis._ShiftNumberBox.Name = \"_ShiftNumberBox\";\r\n\t\t\tthis._ShiftNumberBox.Size = new System.Drawing.Size(68, 21);\r\n\t\t\tthis._ShiftNumberBox.TabIndex = 3;\r\n\t\t\tthis._ShiftNumberBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _TakeFollowingBox\r\n\t\t\t// \r\n\t\t\tthis._TakeFollowingBox.Location = new System.Drawing.Point(23, 63);\r\n\t\t\tthis._TakeFollowingBox.Name = \"_TakeFollowingBox\";\r\n\t\t\tthis._TakeFollowingBox.Size = new System.Drawing.Size(260, 35);\r\n\t\t\tthis._TakeFollowingBox.TabIndex = 4;\r\n\t\t\tthis._TakeFollowingBox.Text = \"对于无指向具体页面的书签，以下一个书签的目标页面为基准\";\r\n\t\t\tthis._TakeFollowingBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// ShiftPageNumberEntryForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(296, 139);\r\n\t\t\tthis.Controls.Add(this._TakeFollowingBox);\r\n\t\t\tthis.Controls.Add(this._ShiftNumberBox);\r\n\t\t\tthis.Controls.Add(this._MessageLabel);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"ShiftPageNumberEntryForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r\n\t\t\tthis.Text = \"增加或减少页码\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ShiftNumberBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label _MessageLabel;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _ShiftNumberBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _TakeFollowingBox;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/Editor/ShiftPageNumberEntryForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class ShiftPageNumberEntryForm : Form\r\n\t{\r\n\t\tinternal int ShiftNumber => (int)_ShiftNumberBox.Value;\r\n\t\tinternal bool TakeFollowing {\r\n\t\t\tget => _TakeFollowingBox.Checked;\r\n\t\t\tset => _TakeFollowingBox.Checked = value;\r\n\t\t}\r\n\r\n\t\tpublic ShiftPageNumberEntryForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_ShiftNumberBox.Select();\r\n\t\t\t_ShiftNumberBox.Select(0, 1);\r\n\t\t\t_ShiftNumberBox.Focus();\r\n\t\t\t_ShiftNumberBox.Maximum = 299999;\r\n\t\t\t_ShiftNumberBox.Minimum = -299999;\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/ShiftPageNumberEntryForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/Editor/ViewerControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing CLR;\r\nusing Cyotek.Windows.Forms;\r\nusing Cyotek.Windows.Forms.Demo;\r\nusing MuPDF;\r\nusing MuPDF.Extensions;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Functions.Editor;\r\nusing DrawingPoint = System.Drawing.Point;\r\nusing DrawingRectangle = System.Drawing.Rectangle;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinternal sealed class ViewerControl : ImageBoxEx {\r\n\t\tenum ZoomMode {\r\n\t\t\tCustom, FitPage = -1, FitHorizontal = -2, FitVertical = -3\r\n\t\t}\r\n\r\n\t\tpublic event EventHandler DocumentLoaded;\r\n\t\tpublic new event EventHandler ZoomChanged;\r\n\t\tpublic event EventHandler ContentDirectionChanged;\r\n\t\tpublic event EventHandler PageScrollModeChanged;\r\n\t\tpublic event EventHandler<PageChangedEventArgs> PageChanged;\r\n\t\tpublic event EventHandler<SelectionChangedEventArgs> SelectionChanged;\r\n\r\n\t\tinternal sealed class PageChangedEventArgs(int pageNumber) : EventArgs {\r\n\t\t\tpublic int PageNumber { get; } = pageNumber;\r\n\t\t}\r\n\t\tinternal sealed class SelectionChangedEventArgs(Editor.Selection selection) : EventArgs {\r\n\t\t\tpublic Editor.Selection Selection { get; } = selection;\r\n\t\t}\r\n\r\n\t\treadonly static IComparer<int> __horizontalComparer = ValueHelper.GetReverseComparer<int>();\r\n\r\n\t\tstatic readonly int __pageMargin = (int)(TextRenderer.MeasureText(\"国\", SystemFonts.MessageBoxFont).Height * 1.2d);\r\n\r\n\t\treadonly BackgroundWorker _renderWorker;\r\n\t\treadonly Timer _refreshTimer;\r\n\t\tbool _cancelRendering, _disposed;\r\n\t\tbool _lockDown;\r\n\t\tDocument _mupdf;\r\n\t\tCookie _cookie = new Cookie();\r\n\t\tPageLabelCollection _pageLabels;\r\n\t\treadonly object _syncObj = new object();\r\n\t\treadonly ImageRendererOptions _renderOptions;\r\n\r\n\t\tZoomMode _zoomMode;\r\n\t\tfloat _zoomFactor;\r\n\t\tContentDirection _contentFlow;\r\n\t\t/// <summary>\r\n\t\t/// 页面的尺寸信息。\r\n\t\t/// </summary>\r\n\t\tBox[] _pageBounds;\r\n\t\tSizeF _maxDimension;\r\n\t\t/// <summary>\r\n\t\t/// 页面的滚动位置。\r\n\t\t/// </summary>\r\n\t\tint[] _pageOffsets;\r\n\t\t/// <summary>\r\n\t\t/// 缓存页面渲染结果的缓冲区。\r\n\t\t/// </summary>\r\n\t\tRenderResultCache _cache;\r\n\t\tDictionary<int, List<Model.TextLine>> _ocrResults;\r\n\r\n\t\tModel.PageRange _DisplayRange;\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置显示的焦点页面。\r\n\t\t/// </summary>\r\n\t\t[DefaultValue(0)]\r\n\t\tpublic int CurrentPageNumber {\r\n\t\t\tget => HorizontalFlow ? _DisplayRange.EndValue : _DisplayRange.StartValue;\r\n\t\t\tset {\r\n\t\t\t\tif (value == CurrentPageNumber) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tScrollToPage(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 获取当前可见的第一个页面。\r\n\t\t/// </summary>\r\n\t\t[Browsable(false)]\r\n\t\tpublic int FirstPage => _DisplayRange.StartValue;\r\n\t\t/// <summary>\r\n\t\t/// 获取当前可见的最后一个页面。\r\n\t\t/// </summary>\r\n\t\t[Browsable(false)]\r\n\t\tpublic int LastPage => _DisplayRange.EndValue;\r\n\r\n\t\t[Browsable(false)]\r\n\t\tpublic PageLabelCollection PageLabels { get => _pageLabels; set => _pageLabels = value; }\r\n\r\n\t\treadonly OcrOptions _OcrOptions = new OcrOptions();\r\n\t\t/// <summary>\r\n\t\t/// 获取文本识别选项。\r\n\t\t/// </summary>\r\n\t\t[Browsable(false)]\r\n\t\tpublic OcrOptions OcrOptions => _OcrOptions;\r\n\r\n\t\tstring _LiteralZoom;\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置显示放大比率。\r\n\t\t/// </summary>\r\n\t\t[Browsable(false)]\r\n\t\tpublic string LiteralZoom {\r\n\t\t\tget => _LiteralZoom;\r\n\t\t\tset {\r\n\t\t\t\tif (value != null && ChangeZoom(value)) {\r\n\t\t\t\t\t_LiteralZoom = value;\r\n\t\t\t\t\tZoomChanged?.Invoke(this, EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic new float ZoomFactor => _zoomFactor * 72f / _renderOptions.Dpi;\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置阅读器是否使用右到左的水平滚动模式。\r\n\t\t/// </summary>\r\n\t\t[DefaultValue(Editor.ContentDirection.TopToDown)]\r\n\t\tpublic Editor.ContentDirection ContentDirection {\r\n\t\t\tget => _contentFlow;\r\n\t\t\tset {\r\n\t\t\t\tif (value == _contentFlow) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tEditor.PagePosition pp = _mupdf != null\r\n\t\t\t\t\t? TransposeVirtualImageToPagePosition(HorizontalScroll.Value, VerticalScroll.Value)\r\n\t\t\t\t\t: Editor.PagePosition.Empty;\r\n\t\t\t\tvar s = GetSelection();\r\n\t\t\t\t_contentFlow = value;\r\n\t\t\t\tUpdateDisplay(true);\r\n\t\t\t\tif (s.ImageRegion.IsEmpty == false) {\r\n\t\t\t\t\tvar r = s.ImageRegion;\r\n\t\t\t\t\tvar p = GetVirtualImageOffset(s.Page);\r\n\t\t\t\t\tr = new RectangleF(p.X + r.Left, p.Y + r.Top, r.Width, r.Height);\r\n\t\t\t\t\tSelectionRegion = r;\r\n\t\t\t\t}\r\n\t\t\t\tif (_zoomMode == ZoomMode.FitPage) {\r\n\t\t\t\t\tScrollToPage(pp.Page);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tScrollToPosition(pp);\r\n\t\t\t\t}\r\n\t\t\t\tContentDirectionChanged?.Invoke(this, EventArgs.Empty);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic bool HorizontalFlow => _contentFlow != Editor.ContentDirection.TopToDown;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置阅读器是否将页面渲染为灰度图像。\r\n\t\t/// </summary>\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool GrayScale {\r\n\t\t\tget => _renderOptions.ColorSpace == ColorspaceKind.Gray;\r\n\t\t\tset {\r\n\t\t\t\tvar v = value ? ColorspaceKind.Gray : ColorspaceKind.Rgb;\r\n\t\t\t\tif (_renderOptions.ColorSpace != v) {\r\n\t\t\t\t\t_renderOptions.ColorSpace = v;\r\n\t\t\t\t\tUpdateDisplay();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置阅读器是否将页面渲染为反转颜色的效果。\r\n\t\t/// </summary>\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool InvertColor {\r\n\t\t\tget => _renderOptions.InvertColor;\r\n\t\t\tset {\r\n\t\t\t\tif (_renderOptions.InvertColor == value) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_renderOptions.InvertColor = value;\r\n\t\t\t\tUpdateDisplay();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic Color TintColor {\r\n\t\t\tget => _renderOptions.TintColor;\r\n\t\t\tset {\r\n\t\t\t\tif (_renderOptions.TintColor == value) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_renderOptions.TintColor = value;\r\n\t\t\t\tUpdateDisplay();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool HideAnnotations {\r\n\t\t\tget => _renderOptions.HideAnnotations;\r\n\t\t\tset {\r\n\t\t\t\tif (_renderOptions.HideAnnotations == value) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_renderOptions.HideAnnotations = value;\r\n\t\t\t\tUpdateDisplay();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置阅读器的鼠标操作模式。\r\n\t\t/// </summary>\r\n\t\t[DefaultValue(Editor.MouseMode.Move)]\r\n\t\tpublic Editor.MouseMode MouseMode {\r\n\t\t\tget => SelectionMode != ImageBoxSelectionMode.Rectangle ? Editor.MouseMode.Move : Editor.MouseMode.Selection;\r\n\t\t\tset {\r\n\t\t\t\tif (value == Editor.MouseMode.Move) {\r\n\t\t\t\t\tAllowZoom = false;\r\n\t\t\t\t\tSelectionMode = ImageBoxSelectionMode.None;\r\n\t\t\t\t\tSelectionRegion = RectangleF.Empty;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tAllowZoom = false;\r\n\t\t\t\t\tSelectionMode = ImageBoxSelectionMode.Rectangle;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbool _FullPageScroll;\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool FullPageScroll {\r\n\t\t\tget => _FullPageScroll;\r\n\t\t\tset {\r\n\t\t\t\tif (_FullPageScroll != value) {\r\n\t\t\t\t\t_FullPageScroll = value;\r\n\t\t\t\t\tPageScrollModeChanged?.Invoke(this, EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tDrawingPoint _PinPoint;\r\n\t\t[Description(\"指定鼠标定位点\")]\r\n\t\tpublic DrawingPoint PinPoint {\r\n\t\t\tget => _PinPoint;\r\n\t\t\tset {\r\n\t\t\t\tif (_PinPoint != value) {\r\n\t\t\t\t\t_PinPoint = value;\r\n\t\t\t\t\tif (IsPinPointVisible && DesignMode == false) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tbool _ShowPinPoint;\r\n\t\t[DefaultValue(false)]\r\n\t\t[Description(\"指定是否显示鼠标定位点\")]\r\n\t\tpublic bool ShowPinPoint {\r\n\t\t\tget => _ShowPinPoint;\r\n\t\t\tset {\r\n\t\t\t\tif (_ShowPinPoint != value) {\r\n\t\t\t\t\t_ShowPinPoint = value;\r\n\t\t\t\t\tif (IsPinPointVisible && DesignMode == false) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbool IsPinPointVisible {\r\n\t\t\tget {\r\n\t\t\t\tif (PinPoint != DrawingPoint.Empty) {\r\n\t\t\t\t\tvar op = GetOffsetPoint(0, 0);\r\n\t\t\t\t\tvar vp = GetImageViewPort();\r\n\t\t\t\t\tvar pp = PinPoint;\r\n\t\t\t\t\tpp.Offset(op);\r\n\t\t\t\t\tif (vp.Contains(pp)) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbool _ShowTextBorders;\r\n\t\t[DefaultValue(false)]\r\n\t\t[Description(\"显示文本层的边框\")]\r\n\t\tpublic bool ShowTextBorders {\r\n\t\t\tget => _ShowTextBorders;\r\n\t\t\tset {\r\n\t\t\t\tif (_ShowTextBorders != value) {\r\n\t\t\t\t\t_ShowTextBorders = value;\r\n\t\t\t\t\tif (DesignMode == false) {\r\n\t\t\t\t\t\tInvalidate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DefaultValue(0)]\r\n\t\t[Description(\"指定用于识别文本的语言\")]\r\n\t\tpublic int OcrLanguage {\r\n\t\t\tget => _OcrOptions.OcrLangID;\r\n\t\t\tset {\r\n\t\t\t\tif (_OcrOptions.OcrLangID == value) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_OcrOptions.OcrLangID = value;\r\n\t\t\t\t_ocrResults.Clear();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[Description(\"指定需要显示的 PDF 文档\")]\r\n\t\t[Browsable(false)]\r\n\t\t[DefaultValue(null)]\r\n\t\tpublic Document Document {\r\n\t\t\tget => _mupdf;\r\n\t\t\tset {\r\n\t\t\t\tEnabled = false;\r\n\t\t\t\tInitViewer();\r\n\t\t\t\t_mupdf = value;\r\n\t\t\t\tif (value != null) {\r\n\t\t\t\t\tTracker.DebugMessage(\"Load document.\");\r\n\t\t\t\t\tvar l = _mupdf.PageCount + 1;\r\n\t\t\t\t\t_pageOffsets = new int[l];\r\n\t\t\t\t\t_pageBounds = new Box[l];\r\n\t\t\t\t\tLoadPageBounds();\r\n\t\t\t\t\t_cache = new RenderResultCache(_mupdf);\r\n\t\t\t\t\tTracker.DebugMessage(\"Calculating document virtual size.\");\r\n\t\t\t\t\tCalculateZoomFactor(_LiteralZoom);\r\n\t\t\t\t\tCalculateDocumentVirtualSize();\r\n\t\t\t\t\tScrollToPage(1);\r\n\t\t\t\t\t_refreshTimer.Start();\r\n\t\t\t\t\tif (_renderWorker.IsBusy == false) {\r\n\t\t\t\t\t\t_renderWorker.RunWorkerAsync();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tDocumentLoaded?.Invoke(this, EventArgs.Empty);\r\n\t\t\t\t\tEnabled = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic ViewerControl() {\r\n\t\t\tVirtualMode = true;\r\n\t\t\tVirtualSize = Size.Empty;\r\n\t\t\tAllowUnfocusedMouseWheel = true;\r\n\t\t\t_renderOptions = new ImageRendererOptions();\r\n\t\t\t//_ViewBox.SelectionMode = ImageBoxSelectionMode.Rectangle;\r\n\r\n\t\t\t_refreshTimer = new Timer {\r\n\t\t\t\tInterval = 200\r\n\t\t\t};\r\n\t\t\t_refreshTimer.Tick += (s, args) => {\r\n\t\t\t\tvar r = _DisplayRange;\r\n\t\t\t\tfor (int i = r.StartValue; i <= r.EndValue; i++) {\r\n\t\t\t\t\tbool v;\r\n\t\t\t\t\tlock (_cache.SyncObj) {\r\n\t\t\t\t\t\tv = _cache.GetBitmap(i) != null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (v == false && _disposed == false && _renderWorker.IsBusy == false) {\r\n\t\t\t\t\t\t_renderWorker.RunWorkerAsync();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t_renderWorker = new BackgroundWorker {\r\n\t\t\t\tWorkerSupportsCancellation = true\r\n\t\t\t};\r\n\t\t\t_renderWorker.DoWork += (s, args) => {\r\n\t\t\t\tvar r = _DisplayRange;\r\n\t\t\t\tTracker.DebugMessage(\"started prerender job: \" + r);\r\n\t\t\t\t_refreshTimer.Stop();\r\n\t\t\t\tif (_disposed) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tbool invalidate = false;\r\n\t\t\t\tfor (int i = r.StartValue; i >= r.StartValue && i < r.EndValue + 2; i++) {\r\n\t\t\t\t\tif (i < 1 || i > _mupdf.PageCount) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_cancelRendering\r\n\t\t\t\t\t\t|| _renderWorker.CancellationPending\r\n\t\t\t\t\t\t|| _mupdf.IsDisposed) {\r\n\t\t\t\t\t\t_cancelRendering = false;\r\n\t\t\t\t\t\targs.Cancel = true;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_cache.GetBitmap(i) == null) {\r\n\t\t\t\t\t\tlock (_cache.SyncObj) {\r\n\t\t\t\t\t\t\tvar pb = _pageBounds[i];\r\n\t\t\t\t\t\t\tTracker.DebugMessage(\"load page \" + i);\r\n\t\t\t\t\t\t\tvar z = GetZoomFactorForPage(pb);\r\n\t\t\t\t\t\t\tRenderPage(i, (pb.Width * z).ToInt32(), (pb.Height * z).ToInt32());\r\n\t\t\t\t\t\t\tif (r.Contains(i)) {\r\n\t\t\t\t\t\t\t\tinvalidate = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (invalidate) {\r\n\t\t\t\t\tInvalidate();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_renderWorker.RunWorkerCompleted += (s, args) => {\r\n\t\t\t\tif (_cancelRendering == false && _disposed == false) {\r\n\t\t\t\t\t_refreshTimer.Start();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tprotected override void OnCreateControl() {\r\n\t\t\tbase.OnCreateControl();\r\n\t\t\tusing (var g = CreateGraphics()) {\r\n\t\t\t\t_renderOptions.Dpi = g.DpiX;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnMouseMove(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseMove(e);\r\n\t\t\tif (SelectionRegion.IsEmpty == false && (IsResizing || IsSelecting || IsMoving) && e.Button == MouseButtons.Left) {\r\n\t\t\t\tLimitSelectionInPage(e.Location);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnSelectionRegionChanged(EventArgs e) {\r\n\t\t\tbase.OnSelectionRegionChanged(e);\r\n\t\t\tif (_mupdf == null || MouseMode == Editor.MouseMode.Move || SelectionChanged == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tSelectionChanged(this, new SelectionChangedEventArgs(GetSelection()));\r\n\t\t}\r\n\t\tprotected override void OnClientSizeChanged(EventArgs e) {\r\n\t\t\tbase.OnClientSizeChanged(e);\r\n\t\t\tif (_zoomMode != ZoomMode.Custom && _lockDown == false) {\r\n\t\t\t\tif (ChangeZoom(LiteralZoom) && ZoomChanged != null) {\r\n\t\t\t\t\tZoomChanged(this, EventArgs.Empty);\r\n\t\t\t\t}\r\n\t\t\t\t//CalculateDocumentVirtualSize ();\r\n\t\t\t\tInvalidate();\r\n\t\t\t}\r\n\t\t}\r\n\t\tvoid LimitSelectionInPage(DrawingPoint location) {\r\n\t\t\tvar r = SelectionRegion;\r\n\t\t\tvar pp = TransposeClientToPagePosition(location.X, location.Y);\r\n\t\t\tvar p = GetVirtualImageOffset(pp.Page);\r\n\t\t\tTracker.DebugMessage(pp.Location.ToString());\r\n\t\t\tr.Offset(-p.X, -p.Y);\r\n\t\t\tvar b = _pageBounds[pp.Page];\r\n\t\t\tvar z = GetZoomFactorForPage(b);\r\n\r\n\t\t\tfloat x1 = r.Left, y1 = r.Top, x2 = r.Right, y2 = r.Bottom;\r\n\t\t\tvar c = false;\r\n\t\t\tif (r.Left < 0) {\r\n\t\t\t\tx1 = 0;\r\n\t\t\t\tx2 -= r.Left;\r\n\t\t\t\tc = true;\r\n\t\t\t}\r\n\t\t\tif (r.Top < 0) {\r\n\t\t\t\ty1 = 0;\r\n\t\t\t\ty2 -= r.Top;\r\n\t\t\t\tc = true;\r\n\t\t\t}\r\n\t\t\tif (r.Right > b.Width * z) {\r\n\t\t\t\tx2 = b.Width * z;\r\n\t\t\t\tx1 -= r.Right - b.Width * z;\r\n\t\t\t\tif (x1 < 0) {\r\n\t\t\t\t\tx1 = 0;\r\n\t\t\t\t}\r\n\t\t\t\tc = true;\r\n\t\t\t}\r\n\t\t\tif (r.Bottom > b.Height * z) {\r\n\t\t\t\ty2 = b.Height * z;\r\n\t\t\t\ty1 -= r.Bottom - b.Height * z;\r\n\t\t\t\tif (y1 < 0) {\r\n\t\t\t\t\ty1 = 0;\r\n\t\t\t\t}\r\n\t\t\t\tc = true;\r\n\t\t\t}\r\n\t\t\tif (c) {\r\n\t\t\t\tSelectionRegion = RectangleF.FromLTRB(p.X + x1, p.Y + y1, p.X + x2, p.Y + y2);\r\n\t\t\t}\r\n\t\t}\r\n\t\tprotected override bool ProcessCmdKey(ref Message msg, Keys keyData) {\r\n\t\t\tswitch (keyData) {\r\n\t\t\t\tcase Keys.Space:\r\n\t\t\t\tcase Keys.PageDown:\r\n\t\t\t\t\tif (FullPageScroll) {\r\n\t\t\t\t\t\tExecuteCommand(\"_NextPage\");\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (HorizontalFlow) {\r\n\t\t\t\t\t\tScrollTo(HorizontalScroll.Value - (GetInsideViewPort().Width * 0.95).ToInt32(), VerticalScroll.Value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tScrollTo(HorizontalScroll.Value, VerticalScroll.Value + (GetInsideViewPort().Height * 0.95).ToInt32());\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.PageUp:\r\n\t\t\t\t\tif (FullPageScroll) {\r\n\t\t\t\t\t\tExecuteCommand(\"_PreviousPage\");\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (HorizontalFlow) {\r\n\t\t\t\t\t\tScrollTo(HorizontalScroll.Value + (GetInsideViewPort().Width * 0.95).ToInt32(), VerticalScroll.Value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tScrollTo(HorizontalScroll.Value, VerticalScroll.Value - (GetInsideViewPort().Height * 0.95).ToInt32());\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Home:\r\n\t\t\t\t\tScrollToPage(1);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.End:\r\n\t\t\t\t\tif (_mupdf != null) {\r\n\t\t\t\t\t\tScrollToPage(_mupdf.PageCount);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t}\r\n\r\n\t\tprotected override void OnMouseWheel(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseWheel(e);\r\n\t\t\tif (ModifierKeys == Keys.Control) {\r\n\t\t\t\tvar zoom = _zoomFactor * 100 / _renderOptions.Dpi * 72f;\r\n\t\t\t\tif (e.Delta < 0) {\r\n\t\t\t\t\tif (zoom > 10) {\r\n\t\t\t\t\t\tzoom -= 10;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tzoom += 10;\r\n\t\t\t\t\tif (zoom > 400) {\r\n\t\t\t\t\t\tzoom = 400;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tLiteralZoom = zoom.ToInt32().ToText() + \"%\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (HorizontalFlow) {\r\n\t\t\t\t\tScrollTo(HorizontalScroll.Value + e.Delta, VerticalScroll.Value);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tScrollTo(HorizontalScroll.Value, VerticalScroll.Value - e.Delta);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal void CloseFile() {\r\n\t\t\tif (_mupdf != null) {\r\n\t\t\t\t_cache.Clear();\r\n\t\t\t\t_mupdf.CloseFile();\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal void Reopen() {\r\n\t\t\tif (_mupdf != null && _mupdf.IsDisposed) {\r\n\t\t\t\t_mupdf.Reopen();\r\n\t\t\t\tUpdateDisplay(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnVirtualDraw(PaintEventArgs e) {\r\n\t\t\tbase.OnVirtualDraw(e);\r\n\r\n\t\t\tif (VirtualSize.IsEmpty || Enabled == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_DisplayRange = GetDisplayingPageRange();\r\n\t\t\tvar p = _DisplayRange.StartValue;\r\n\t\t\tPageChanged?.Invoke(this, new PageChangedEventArgs(p));\r\n\t\t\tvar g = e.Graphics;\r\n\t\t\tvar op = GetOffsetPoint(0, 0); // 偏移位置点\r\n\t\t\tvar vp = GetImageViewPort();\r\n\t\t\tif (TintColor == Color.Transparent) {\r\n\t\t\t\tg.FillRectangle(Brushes.FloralWhite, vp);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tusing (var b = new SolidBrush(Processor.Imaging.BitmapHelper.Tint(Color.Gainsboro, TintColor))) {\r\n\t\t\t\t\tg.FillRectangle(b, vp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar r = DrawingRectangle.Empty;\r\n\t\t\tdo {\r\n\t\t\t\tDebug.Assert(p > 0 && p < _mupdf.PageCount + 1, p.ToString());\r\n\t\t\t\tvar pb = _pageBounds[p];\r\n\t\t\t\tvar z = GetZoomFactorForPage(pb);\r\n\t\t\t\tvar ox = HorizontalFlow ? _pageOffsets[p] : 0;\r\n\t\t\t\tvar oy = HorizontalFlow ? 0 : _pageOffsets[p];\r\n\t\t\t\tr = new DrawingRectangle(\r\n\t\t\t\t\tox + op.X + __pageMargin,\r\n\t\t\t\t\toy + op.Y + __pageMargin,\r\n\t\t\t\t\t(pb.Width * z).ToInt32(),\r\n\t\t\t\t\t(pb.Height * z).ToInt32()\r\n\t\t\t\t);\r\n\t\t\t\tvar pl = GetPageLabel(p);\r\n\t\t\t\tTextRenderer.DrawText(e.Graphics,\r\n\t\t\t\t\t$\"{pl}{(pl.Length > 0 ? \" / 第 \" : \"第 \")}{p} 页 ({pb.Width} * {pb.Height})\",\r\n\t\t\t\t\tSystemFonts.MessageBoxFont,\r\n\t\t\t\t\tnew DrawingPoint(ox + op.X + __pageMargin, oy + op.Y),\r\n\t\t\t\t\tColor.Black);\r\n\t\t\t\tvar bmp = _cache.GetBitmap(p);\r\n\t\t\t\tif (bmp == null) {\r\n\t\t\t\t\tg.FillRectangle(Brushes.White, r);\r\n\t\t\t\t\tif (_renderWorker.IsBusy == false) {\r\n\t\t\t\t\t\t_renderWorker.RunWorkerAsync();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tg.DrawImage(bmp, r.Location);\r\n\t\t\t\t}\r\n\t\t\t\tg.DrawRectangle(Pens.Black, r.Left - 1, r.Top - 1, r.Width + 1, r.Height + 1);\r\n\t\t\t\tif (ShowTextBorders) {\r\n\t\t\t\t\tvar textPage = _cache.GetTextPage(p);\r\n\t\t\t\t\tif (textPage != null) {\r\n\t\t\t\t\t\tDrawTextBorders(g, p, op, textPage);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} while ((HorizontalFlow ? (r.Right > 0) : (r.Bottom < vp.Height))\r\n\t\t\t\t&& ++p < _pageOffsets.Length);\r\n\t\t\tif (ShowPinPoint && PinPoint != DrawingPoint.Empty) {\r\n\t\t\t\tvar pp = PinPoint.Transpose(op);\r\n\t\t\t\tif (vp.Contains(pp)) {\r\n\t\t\t\t\tg.DrawImage(Properties.Resources.Pin, pp.X, pp.Y - Properties.Resources.Pin.Height);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_cache.GetBitmap(p + 1) == null && _renderWorker.IsBusy == false) {\r\n\t\t\t\t_renderWorker.RunWorkerAsync();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstring GetPageLabel(int pageNumber) {\r\n\t\t\treturn _mupdf.IsDisposed\r\n\t\t\t\t? String.Empty\r\n\t\t\t\t: (_pageLabels != null\r\n\t\t\t\t\t? _pageLabels\r\n\t\t\t\t\t: (_pageLabels = new PageLabelCollection(_mupdf)))\r\n\t\t\t\t\t.Format(pageNumber);\r\n\t\t}\r\n\r\n\t\tModel.PageRange GetDisplayingPageRange() {\r\n\t\t\tvar b = GetOffsetRectangle(GetImageViewPort());\r\n\t\t\tint start = GetPageNumberFromOffset(-b.Left + b.Width, -b.Y);\r\n\t\t\tint end = GetPageNumberFromOffset(-b.Left, -(b.Y - b.Height));\r\n\t\t\tDebug.Assert(end >= start);\r\n\t\t\tif (end == 0) {\r\n\t\t\t\tend = start;\r\n\t\t\t}\r\n\t\t\treturn new Model.PageRange(start, end);\r\n\t\t}\r\n\r\n\t\tvoid DrawTextBorders(Graphics g, int pageNumber, DrawingPoint offset, TextPage textPage) {\r\n\t\t\tif (_mupdf.IsDisposed) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar p = _cache.LoadPage(pageNumber);\r\n\t\t\tvar b = p.Bound;\r\n\t\t\tvar z = GetZoomFactorForPage(b);\r\n\t\t\tvar o = GetVirtualImageOffset(pageNumber);\r\n\t\t\tusing (var spanPen = new Pen(Color.LightGray, 1))\r\n\t\t\tusing (var blockPen = new Pen(Color.DimGray, 1)) {\r\n\t\t\t\tblockPen.DashStyle\r\n\t\t\t\t\t= spanPen.DashStyle\r\n\t\t\t\t\t= System.Drawing.Drawing2D.DashStyle.Dash;\r\n\t\t\t\tusing (var m = new System.Drawing.Drawing2D.Matrix(z, 0, 0, z, offset.X + o.X, offset.Y + o.Y)) {\r\n\t\t\t\t\tg.MultiplyTransform(m);\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var block in textPage) {\r\n\t\t\t\t\tg.DrawRectangle(blockPen, block.Bound.ToRectangle());\r\n\t\t\t\t\tif (block == null) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var line in block) {\r\n\t\t\t\t\t\tg.DrawRectangle(spanPen, line.Bound.ToRectangle());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tg.ResetTransform();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 返回选定区域。\r\n\t\t/// </summary>\r\n\t\t/// <returns>选定的矩形区域。</returns>\r\n\t\tinternal Editor.Selection GetSelection() {\r\n\t\t\tvar s = GetSelectionPageRegion();\r\n\t\t\tif (s.Page == 0 || _mupdf.IsDisposed) {\r\n\t\t\t\treturn Editor.Selection.Empty;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar vb = _pageBounds[s.Page];\r\n\t\t\t\tvar sr = s.Region;\r\n\t\t\t\tvar pr = new Box(sr.X0 - vb.X0, vb.X1 - sr.Y0, sr.X1 - vb.Y0, vb.Y1 - sr.Y1);\r\n\t\t\t\tvar o = GetVirtualImageOffset(s.Page);\r\n\t\t\t\tvar area = SelectionRegion;\r\n\t\t\t\tarea.Offset(-o.X, -o.Y);\r\n\t\t\t\treturn new Editor.Selection(_cache, s.Page, pr, area);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal Editor.PageRegion GetSelectionPageRegion() {\r\n\t\t\tvar area = SelectionRegion;\r\n\t\t\tif (area.IsEmpty) {\r\n\t\t\t\treturn Editor.PageRegion.Empty;\r\n\t\t\t}\r\n\t\t\t#if DEBUG\r\n\t\t\tvar b = GetOffsetRectangle(GetImageViewPort());\r\n\t\t\t#endif\r\n\t\t\tvar p1 = TransposeVirtualImageToPagePosition(area.Left.ToInt32(), area.Top.ToInt32());\r\n\t\t\tvar p2 = TransposeVirtualImageToPagePosition(area.Right.ToInt32(), area.Bottom.ToInt32());\r\n\t\t\treturn new Editor.PageRegion(p1, p2);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 返回指定位置的文本行以及与该文本行具有相同样式的后续文本行。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"position\">查找文本行的位置。</param>\r\n\t\t/// <returns>返回指定位置的文本行以及与该文本行具有相同样式的后续文本行。</returns>\r\n\t\tinternal Editor.TextInfo FindTextLines(Editor.PagePosition position) {\r\n\t\t\tvar rect = new Box();\r\n\t\t\tvar ti = new Editor.TextInfo();\r\n\t\t\tif (_mupdf.IsDisposed) {\r\n\t\t\t\treturn ti;\r\n\t\t\t}\r\n\t\t\tvar page = _cache.LoadPage(position.Page);\r\n\t\t\tvar point = position.ToPageCoordinate(page);\r\n\t\t\tif (page.Bound.Contains(point) == false\r\n\t\t\t\t|| page.TextPage.Bound.Contains(point) == false) {\r\n\t\t\t\treturn ti;\r\n\t\t\t}\r\n\t\t\tforeach (var block in page.TextPage) {\r\n\t\t\t\tif (block.Type == BlockType.Image || block.Bound.Contains(point) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tHashSet<TextFont> s = null;\r\n\t\t\t\tTextLine l = null;\r\n\t\t\t\tList<TextLine> r = null;\r\n\t\t\t\tforeach (var line in block) {\r\n\t\t\t\t\tif (l == null) {\r\n\t\t\t\t\t\tif (line.Bound.Contains(point) == false) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ts = new HashSet<TextFont>(); // 获取选中文本行的文本样式集合\r\n\t\t\t\t\t\tr = new List<TextLine>();\r\n\t\t\t\t\t\tforeach (var ch in line) {\r\n\t\t\t\t\t\t\ts.Add(ch.Font);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\trect = line.Bound;\r\n\t\t\t\t\t\tl = line;\r\n\t\t\t\t\t\tr.Add(l);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (line.Bound.IsHorizontalNeighbor(rect) == false) {\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// 获取具有相同样式的邻接文本行\r\n\t\t\t\t\t\tforeach (var ch in line) {\r\n\t\t\t\t\t\t\tif (s.Contains(ch.Font)) {\r\n\t\t\t\t\t\t\t\tr.Add(line);\r\n\t\t\t\t\t\t\t\tl = line;\r\n\t\t\t\t\t\t\t\tgoto NEXT;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\trect = rect.Union(line.Bound);\r\n\t\t\t\t\t}\r\n\t\t\t\tNEXT:;\r\n\t\t\t\t}\r\n\t\t\t\tif (l != null) {\r\n\t\t\t\t\tvar spans = new List<Editor.TextSpan>(r.Count * 2);\r\n\t\t\t\t\tforeach (var item in r) {\r\n\t\t\t\t\t\tspans.AddRange(Editor.TextSpan.GetTextSpans(item));\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn new Editor.TextInfo(page, rect, r, spans);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn ti;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 返回指定区域内的文本行。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"region\">选择的区域。</param>\r\n\t\t/// <returns>区域内的文本行。</returns>\r\n\t\tinternal List<TextLine> FindTextLines(Editor.PageRegion region) {\r\n\t\t\tif (_mupdf.IsDisposed) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tList<TextLine> r = null;\r\n\t\t\tvar page = _cache.LoadPage(region.Page);\r\n\t\t\tvar pr = region.ToPageCoordinate(page);\r\n\t\t\tif (pr.Intersect(page.TextPage.Bound).IsEmpty) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tforeach (var block in page.TextPage) {\r\n\t\t\t\tif (block.Type == BlockType.Image || pr.Intersect(block.Bound).IsEmpty) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar s = new HashSet<int>();\r\n\t\t\t\tr ??= new List<TextLine>();\r\n\t\t\t\tforeach (var line in block) {\r\n\t\t\t\t\tif (pr.Intersect(line.Bound).Area > line.Bound.Area * 0.618f) {\r\n\t\t\t\t\t\tr.Add(line);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tfloat GetZoomFactorForPage(Box bound) {\r\n\t\t\treturn _zoomFactor;\r\n\t\t}\r\n\r\n\t\tpublic List<Model.TextLine> OcrPage(int pageNumber, bool cached) {\r\n\t\t\tif (cached && _ocrResults.TryGetValue(pageNumber, out var r)) {\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t\tr = Ocr(pageNumber);\r\n\t\t\treturn _ocrResults[pageNumber] = r;\r\n\t\t}\r\n\t\tpublic string[] CleanUpOcrResult(List<Model.TextLine> result) {\r\n\t\t\treturn result.ConvertAll((t) => Processor.OcrProcessor.CleanUpText(t.Text, _OcrOptions)).ToArray();\r\n\t\t}\r\n\r\n\t\tList<Model.TextLine> Ocr(int pageNumber) {\r\n\t\t\ttry {\r\n\t\t\t\tBitmap bmp = GetPageImage(pageNumber);\r\n\t\t\t\treturn Processor.OcrProcessor.OcrBitmap(bmp, _OcrOptions);\r\n\t\t\t}\r\n\t\t\tcatch (System.Runtime.InteropServices.COMException ex) {\r\n\t\t\t\tswitch (ex.ErrorCode) {\r\n\t\t\t\t\tcase -959971327:\r\n\t\t\t\t\t\tFormHelper.InfoBox(\"识别引擎初始化时遇到错误。\\n请尝试以管理员身份运行程序，或重新安装 Office 2007 的 MODI 组件。\");\r\n\t\t\t\t\t\treturn new List<Model.TextLine>();\r\n\t\t\t\t\tcase -959967087:\r\n\t\t\t\t\t\tFormHelper.ErrorBox(\"识别引擎无法识别本页文本。请尝试调整页面的显示比例，然后再执行识别。\");\r\n\t\t\t\t\t\treturn new List<Model.TextLine>();\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.DebugMessage(\"OCR error: \" + ex.Message);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic Bitmap GetPageImage(int pageNumber) {\r\n\t\t\tvar b = _pageBounds[pageNumber];\r\n\t\t\tvar z = GetZoomFactorForPage(b);\r\n\t\t\treturn RenderPage(pageNumber, (z * b.Width).ToInt32(), (z * b.Height).ToInt32());\r\n\t\t}\r\n\r\n\t\tpublic Page LoadPage(int pageNumber) {\r\n\t\t\treturn _cache.LoadPage(pageNumber);\r\n\t\t}\r\n\t\tpublic Box GetPageBound(int pageNumber) {\r\n\t\t\treturn _pageBounds[pageNumber];\r\n\t\t}\r\n\r\n\t\tBitmap RenderPage(int pageNumber, int width, int height) {\r\n\t\t\tvar bmp = _cache.GetBitmap(pageNumber);\r\n\t\t\tif (bmp != null) {\r\n\t\t\t\treturn bmp;\r\n\t\t\t}\r\n\t\t\tif (_mupdf == null || _mupdf.IsDisposed || Enabled == false) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tlock (_syncObj) {\r\n\t\t\t\tlock (_cache.SyncObj) {\r\n\t\t\t\t\tvar p = _cache.LoadPage(pageNumber);\r\n\t\t\t\t\tif (pageNumber < _DisplayRange.StartValue - 1 || pageNumber > _DisplayRange.EndValue + 1) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.DebugMessage(\"render page \" + pageNumber);\r\n\t\t\t\t\tbmp = p.RenderBitmapPage(width, height, _renderOptions, _cookie);\r\n\t\t\t\t\t_cache.SetBitmap(pageNumber, bmp);\r\n\t\t\t\t\t_cache.SetTextPage(pageNumber, p.TextPage);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn bmp;\r\n\t\t}\r\n\r\n\t\tint GetPageNumberFromOffset(int offsetX, int offsetY) {\r\n\t\t\tvar offsets = _pageOffsets;\r\n\t\t\tif (offsets == null) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tvar p = HorizontalFlow ?\r\n\t\t\t\tArray.BinarySearch(offsets, 1, offsets.Length - 1, offsetX, __horizontalComparer) :\r\n\t\t\t\tArray.BinarySearch(offsets, 1, offsets.Length - 1, offsetY);\r\n\t\t\tif (p < 0) {\r\n\t\t\t\tp = ~p;\r\n\t\t\t\tif (HorizontalFlow == false) {\r\n\t\t\t\t\t--p;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (p >= offsets.Length) {\r\n\t\t\t\treturn offsets.Length - 1;\r\n\t\t\t}\r\n\t\t\telse if (p < 1) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\t}\r\n\r\n\t\tbool ChangeZoom(string zoomMode) {\r\n\t\t\tvar s = GetSelection();\r\n\t\t\tvar pp = Editor.PagePosition.Empty;\r\n\t\t\tfloat z = 0;\r\n\t\t\tif (s.Page > 0) {\r\n\t\t\t\tz = GetZoomFactorForPage(_pageBounds[s.Page]);\r\n\t\t\t}\r\n\t\t\tif (HorizontalScroll.Value != 0 || VerticalScroll.Value != 0) {\r\n\t\t\t\tpp = TransposeVirtualImageToPagePosition(HorizontalScroll.Value, VerticalScroll.Value);\r\n\t\t\t}\r\n\t\t\tif (CalculateZoomFactor(zoomMode) == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (_mupdf == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tUpdateDisplay(true);\r\n\t\t\t// 保持选区尺寸比例\r\n\t\t\tif (z > 0) {\r\n\t\t\t\tvar r = s.ImageRegion;\r\n\t\t\t\tvar p = GetVirtualImageOffset(s.Page);\r\n\t\t\t\tz = _zoomFactor / z;\r\n\t\t\t\tr = new RectangleF(p.X + r.Left * z, p.Y + r.Top * z, r.Width * z, r.Height * z);\r\n\t\t\t\tSelectionRegion = r;\r\n\t\t\t}\r\n\t\t\tif (pp.Page > 0) {\r\n\t\t\t\tif (_zoomMode == ZoomMode.FitPage) {\r\n\t\t\t\t\tScrollToPage(pp.Page);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tScrollToPosition(pp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tbool CalculateZoomFactor(string zoomMode) {\r\n\t\t\tswitch (zoomMode) {\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.Fit:\r\n\t\t\t\t\t_zoomMode = ZoomMode.FitPage;\r\n\t\t\t\t\t_zoomFactor = Math.Min(\r\n\t\t\t\t\t\t\t(GetInsideViewPort().Width - __pageMargin - __pageMargin) / _maxDimension.Width,\r\n\t\t\t\t\t\t\t(GetInsideViewPort().Height - __pageMargin - __pageMargin) / _maxDimension.Height\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitH:\r\n\t\t\t\t\t_zoomMode = ZoomMode.FitHorizontal;\r\n\t\t\t\t\t_zoomFactor = (GetInsideViewPort().Width - __pageMargin - __pageMargin) / _maxDimension.Width;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitV:\r\n\t\t\t\t\t_zoomMode = ZoomMode.FitVertical;\r\n\t\t\t\t\t_zoomFactor = (GetInsideViewPort().Height - __pageMargin - __pageMargin) / _maxDimension.Height;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tint f;\r\n\t\t\t\t\tif (zoomMode == null) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (zoomMode.EndsWith(\"%\", StringComparison.Ordinal) && zoomMode.Length > 2) {\r\n\t\t\t\t\t\tf = zoomMode.Substring(0, zoomMode.Length - 1).ToInt32();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (zoomMode.Length > 1) {\r\n\t\t\t\t\t\tf = zoomMode.ToInt32();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse { return false; }\r\n\t\t\t\t\tif (f == 0) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_zoomMode = ZoomMode.Custom;\r\n\t\t\t\t\t_zoomFactor = (float)f / 100f * _renderOptions.Dpi / 72f;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tvoid UpdateDisplay() { UpdateDisplay(false); }\r\n\t\tvoid UpdateDisplay(bool resized) {\r\n\t\t\tif (DesignMode || _disposed || _mupdf == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_refreshTimer.Stop();\r\n\t\t\t_renderWorker.CancelAsync();\r\n\t\t\t_cancelRendering = true;\r\n\t\t\tif (_cache != null) {\r\n\t\t\t\tlock (_syncObj) {\r\n\t\t\t\t\tlock (_cache.SyncObj) {\r\n\t\t\t\t\t\t_cache.Clear();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_ocrResults.Clear();\r\n\t\t\t_cancelRendering = false;\r\n\t\t\t_refreshTimer.Start();\r\n\t\t\tif (resized) {\r\n\t\t\t\t//var p = FirstPage;\r\n\t\t\t\tCalculateDocumentVirtualSize();\r\n\t\t\t\t//ShowPage (p);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region 坐标转换\r\n\t\tinternal Editor.PagePosition GetCurrentScrollPosition() {\r\n\t\t\treturn TransposeClientToPagePosition(ClientRectangle.Width, 0);\r\n\t\t}\r\n\r\n\t\tinternal bool IsClientPointInSelection(DrawingPoint point) {\r\n\t\t\treturn SelectionRegion.Contains(PointToImage(point));\r\n\t\t}\r\n\r\n\t\tinternal RectangleF MuRectangleToImageRegion(int pageNumber, Box box) {\r\n\t\t\tvar rtl = HorizontalFlow;\r\n\t\t\tvar o = _pageOffsets[pageNumber];\r\n\t\t\tvar b = _pageBounds[pageNumber];\r\n\t\t\tvar z = _zoomFactor;\r\n\t\t\tvar l = box.X0 * z + __pageMargin;\r\n\t\t\tvar t = box.Y0 * z + __pageMargin;\r\n\t\t\tif (rtl) {\r\n\t\t\t\tl += o;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tt += o;\r\n\t\t\t}\r\n\t\t\treturn new RectangleF(l, t, box.Width * z, box.Height * z);\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 将屏幕客户区域的位置转换为页面坐标。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"clientX\">横坐标。</param>\r\n\t\t/// <param name=\"clientY\">纵坐标。</param>\r\n\t\t/// <returns>页面坐标。</returns>\r\n\t\tinternal Editor.PagePosition TransposeClientToPagePosition(int clientX, int clientY) {\r\n\t\t\tif (_DisplayRange.StartValue <= 0 || _pageBounds == null) {\r\n\t\t\t\treturn Editor.PagePosition.Empty;\r\n\t\t\t}\r\n\t\t\tvar p = PointToImage(clientX, clientY);\r\n\t\t\treturn TransposeVirtualImageToPagePosition(p.X, p.Y);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将虚拟画布的坐标点转换为屏幕客户区域的位置。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"imageX\">虚拟画布位置的横坐标。</param>\r\n\t\t/// <param name=\"imageY\">虚拟画布位置的横坐标。</param>\r\n\t\t/// <returns>屏幕客户区域的位置。</returns>\r\n\t\tinternal DrawingPoint TransposeVirtualImageToClient(float imageX, float imageY) {\r\n\t\t\tvar vp = GetImageViewPort();\r\n\t\t\treturn new DrawingPoint(vp.Left + AutoScrollPosition.X + imageX.ToInt32(), vp.Top + AutoScrollPosition.Y + imageY.ToInt32());\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取指定页面在虚拟画布上的绘制坐标点。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pageNumber\">页面编号。</param>\r\n\t\t/// <returns>页面左上角在虚拟画布上的坐标点。</returns>\r\n\t\tinternal DrawingPoint GetVirtualImageOffset(int pageNumber) {\r\n\t\t\tvar rtl = HorizontalFlow;\r\n\t\t\tvar ox = rtl ? _pageOffsets[pageNumber] : 0;\r\n\t\t\tvar oy = rtl ? 0 : _pageOffsets[pageNumber];\r\n\t\t\treturn new DrawingPoint(ox + __pageMargin, oy + __pageMargin);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将虚拟画布的位置转换为页面坐标。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"imageX\">虚拟画布位置的横坐标。</param>\r\n\t\t/// <param name=\"imageY\">虚拟画布位置的纵坐标。</param>\r\n\t\t/// <returns>页面坐标。</returns>\r\n\t\tinternal Editor.PagePosition TransposeVirtualImageToPagePosition(int imageX, int imageY) {\r\n\t\t\tvar n = GetPageNumberFromOffset(imageX, imageY);\r\n\t\t\treturn TransposeVirtualImageToPagePosition(n, imageX, imageY);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将屏幕客户区域的位置转换为渲染页面位置。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"clientX\">屏幕区域的横坐标。</param>\r\n\t\t/// <param name=\"clientY\">屏幕区域的纵坐标。</param>\r\n\t\t/// <returns>渲染页面的位置。</returns>\r\n\t\tinternal Editor.PagePoint TransposeClientToPageImage(int clientX, int clientY) {\r\n\t\t\tif (_DisplayRange.StartValue <= 0 || _pageBounds == null || IsPointInImage(clientX, clientY) == false) {\r\n\t\t\t\treturn Editor.PagePoint.Empty;\r\n\t\t\t}\r\n\t\t\tvar p = PointToImage(clientX, clientY);\r\n\t\t\tvar n = GetPageNumberFromOffset(p.X, p.Y);\r\n\t\t\tvar o = GetVirtualImageOffset(n);\r\n\t\t\treturn new Editor.PagePoint(n, p.X - o.X, p.Y - o.Y);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将虚拟页面的位置转换为PDF页面位置。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pageNumber\">页码。</param>\r\n\t\t/// <param name=\"imageX\">虚拟图片的横坐标。</param>\r\n\t\t/// <param name=\"imageY\">虚拟图片的纵坐标。</param>\r\n\t\t/// <returns>PDF 页面的位置。</returns>\r\n\t\tinternal Editor.PagePosition TransposeVirtualImageToPagePosition(int pageNumber, int imageX, int imageY) {\r\n\t\t\tvar o = GetVirtualImageOffset(pageNumber);\r\n\t\t\tvar b = _pageBounds[pageNumber];\r\n\t\t\tvar z = GetZoomFactorForPage(b);\r\n\t\t\tvar ox = (imageX - o.X) / z;\r\n\t\t\tvar oy = (imageY - o.Y) / z;\r\n\t\t\treturn new Editor.PagePosition(pageNumber,\r\n\t\t\t\tb.X0 + ox, Math.Min(b.Y1, b.Y0 + b.Height - oy),\r\n\t\t\t\timageX - o.X, imageY - o.Y,\r\n\t\t\t\tb.Contains(new MuPDF.Point(ox, oy)));\r\n\t\t}\r\n\r\n\t\tinternal Editor.PagePosition TransposePageImageToPagePosition(int pageNumber, float pageImageX, float pageImageY) {\r\n\t\t\tvar b = _pageBounds[pageNumber];\r\n\t\t\tvar z = _zoomFactor;\r\n\t\t\tvar ox = pageImageX / z;\r\n\t\t\tvar oy = pageImageY / z;\r\n\t\t\treturn new Editor.PagePosition(pageNumber,\r\n\t\t\t\tb.X0 + ox, b.Y0 + b.Height - oy,\r\n\t\t\t\tpageImageX.ToInt32(), pageImageY.ToInt32(),\r\n\t\t\t\tb.Contains(new MuPDF.Point(ox, oy)));\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tint GetPageFullWidth(float pageWidth) {\r\n\t\t\treturn __pageMargin + __pageMargin + (pageWidth * _zoomFactor).ToInt32();\r\n\t\t}\r\n\t\tint GetPageFullHeight(float pageHeight) {\r\n\t\t\treturn __pageMargin + __pageMargin + (pageHeight * _zoomFactor).ToInt32();\r\n\t\t}\r\n\r\n\t\tbool ScrollToPage(int pageNumber) {\r\n\t\t\tif (_mupdf == null || _pageOffsets == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (pageNumber < 0) {\r\n\t\t\t\tpageNumber = _mupdf.PageCount + pageNumber + 1;\r\n\t\t\t}\r\n\t\t\tif (pageNumber <= 0 || pageNumber > _mupdf.PageCount) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t_DisplayRange.StartValue = pageNumber;\r\n\t\t\ttry {\r\n\t\t\t\tif (HorizontalFlow) {\r\n\t\t\t\t\tScrollTo(_pageOffsets[pageNumber], VerticalScroll.Value);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tScrollTo(HorizontalScroll.Value, _pageOffsets[pageNumber]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox($\"显示页面 {pageNumber.ToText()} 时出错\", ex);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tinternal void ScrollToPosition(Editor.PagePosition position) {\r\n\t\t\tif (_mupdf == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar h = HorizontalFlow;\r\n\t\t\tvar op = GetVirtualImageOffset(position.Page);\r\n\t\t\tvar bound = _pageBounds[position.Page];\r\n\t\t\tposition.Location.Deconstruct(out var px, out var py);\r\n\t\t\tif (px != 0) {\r\n\t\t\t\tpx -= bound.X0;\r\n\t\t\t\tif (h && Math.Abs(px) < 0.001f) {\r\n\t\t\t\t\top.X -= __pageMargin;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (py != 0) {\r\n\t\t\t\tpy = bound.Height - (py - bound.Y0);\r\n\t\t\t\tif (h == false && Math.Abs(py) < 0.001f) {\r\n\t\t\t\t\top.Y -= __pageMargin;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar z = GetZoomFactorForPage(bound);\r\n\t\t\tScrollTo(\r\n\t\t\t\t(position.PageX == 0 && h == false) ? HorizontalScroll.Value : (px * z).ToInt32() + op.X,\r\n\t\t\t\t(position.PageY == 0 && h) ? VerticalScroll.Value : (position.Location.Y == 0 ? 0 : (py * z).ToInt32()) + op.Y\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tbool Next(int deltaPageNumber) {\r\n\t\t\tif (_pageOffsets == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn (HorizontalFlow && deltaPageNumber > 0 && HorizontalScroll.Value > _pageOffsets[CurrentPageNumber])\r\n\t\t\t\t? ScrollToPage(CurrentPageNumber + deltaPageNumber - 1)\r\n\t\t\t\t: ScrollToPage(CurrentPageNumber + deltaPageNumber);\r\n\t\t}\r\n\r\n\t\tvoid LoadPageBounds() {\r\n\t\t\tfloat w = 0, h = 0;\r\n\t\t\tfor (int i = _mupdf.PageCount; i > 0; i--) {\r\n\t\t\t\tvar b = _mupdf.BoundPage(i - 1);\r\n\t\t\t\t_pageBounds[i] = b;\r\n\t\t\t\tb.Width.SetMax(ref w);\r\n\t\t\t\tb.Height.SetMax(ref h);\r\n\t\t\t}\r\n\t\t\t_maxDimension = new SizeF(w, h);\r\n\t\t}\r\n\r\n\t\tvoid CalculateDocumentVirtualSize() {\r\n\t\t\tif (_pageOffsets == null || _pageBounds == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tint h = 0, w = 0;\r\n\t\t\tvar l = _mupdf.PageCount + 1;\r\n\t\t\tvar vs = GetInsideViewPort().Size;\r\n\t\t\t_lockDown = true;\r\n\t\t\tif (HorizontalFlow) {\r\n\t\t\t\tlock (_syncObj) {\r\n\t\t\t\t\tfor (int i = l - 1; i >= 0; i--) {\r\n\t\t\t\t\t\tvar b = _pageBounds[i];\r\n\t\t\t\t\t\t_pageOffsets[i] = w;\r\n\t\t\t\t\t\tw += GetPageFullWidth(b.Width);\r\n\t\t\t\t\t\tif (b.Height > h) {\r\n\t\t\t\t\t\t\th = b.Height.ToInt32();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar w1 = GetPageFullWidth(_pageBounds[1].Width);\r\n\t\t\t\t\tif (w1 < vs.Width) {\r\n\t\t\t\t\t\tw += vs.Width - w1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tVirtualSize = new Size(w, h = GetPageFullHeight(h));\r\n\t\t\t\tHorizontalScroll.Visible = HorizontalScroll.Enabled = w > ClientSize.Width;\r\n\t\t\t\tVerticalScroll.Visible = VerticalScroll.Enabled = h > ClientSize.Height;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlock (_syncObj) {\r\n\t\t\t\t\tfor (int i = 1; i < l; i++) {\r\n\t\t\t\t\t\tvar b = _pageBounds[i];\r\n\t\t\t\t\t\t_pageOffsets[i] = h;\r\n\t\t\t\t\t\th += GetPageFullHeight(_pageBounds[i].Height);\r\n\t\t\t\t\t\tif (b.Width > w) {\r\n\t\t\t\t\t\t\tw = b.Width.ToInt32();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar h1 = GetPageFullHeight(_pageBounds[1].Height);\r\n\t\t\t\t\tif (h1 < vs.Height) {\r\n\t\t\t\t\t\th += vs.Height - h1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tVirtualSize = new Size(w = GetPageFullWidth(w), h);\r\n\t\t\t\tVerticalScroll.Visible = VerticalScroll.Enabled = h > ClientSize.Height;\r\n\t\t\t\tHorizontalScroll.Visible = HorizontalScroll.Enabled = w > ClientSize.Width;\r\n\t\t\t}\r\n\t\t\t_lockDown = false;\r\n\t\t}\r\n\r\n\t\tpublic void ExecuteCommand(string cmd) {\r\n\t\t\tswitch (cmd) {\r\n\t\t\t\tcase \"_FirstPage\": ScrollToPage(1); break;\r\n\t\t\t\tcase \"_PreviousPage\": Next(-1); break;\r\n\t\t\t\tcase \"_NextPage\": Next(1); break;\r\n\t\t\t\tcase \"_LastPage\": ScrollToPage(-1); break;\r\n\t\t\t\tcase \"_ScrollVertical\": ContentDirection = Editor.ContentDirection.TopToDown; break;\r\n\t\t\t\tcase \"_ScrollHorizontal\": ContentDirection = Editor.ContentDirection.RightToLeft; break;\r\n\t\t\t\tcase \"_TrueColorSpace\": GrayScale = false; break;\r\n\t\t\t\tcase \"_GrayColorSpace\": GrayScale = true; break;\r\n\t\t\t\tcase \"_InvertColor\": InvertColor = !InvertColor; break;\r\n\t\t\t\tcase \"_Refresh\": UpdateDisplay(); break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void InitViewer() {\r\n\t\t\t_cancelRendering = true;\r\n\t\t\t_refreshTimer.Stop();\r\n\t\t\tSelectionRegion = DrawingRectangle.Empty;\r\n\t\t\t_DisplayRange = new Model.PageRange();\r\n\t\t\tif (_LiteralZoom == null) {\r\n\t\t\t\t_zoomFactor = (float)_renderOptions.Dpi / 72;\r\n\t\t\t\t_zoomMode = ZoomMode.FitHorizontal;\r\n\t\t\t\t_LiteralZoom = Constants.DestinationAttributes.ViewType.FitH;\r\n\t\t\t\tVirtualSize = new Size(1, 1);\r\n\t\t\t}\r\n\t\t\tShowTextBorders = false;\r\n\t\t\t_pageBounds = null;\r\n\t\t\t_pageOffsets = null;\r\n\t\t\tif (_cache != null) {\r\n\t\t\t\tlock (_cache.SyncObj) {\r\n\t\t\t\t\t_cache.Clear();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_contentFlow = Editor.ContentDirection.TopToDown;\r\n\t\t\t_OcrOptions.CompressWhiteSpaces = true;\r\n\t\t\t_ocrResults = new Dictionary<int, List<Model.TextLine>>();\r\n\t\t}\r\n\r\n\t\tprotected override void Dispose(bool disposing) {\r\n\t\t\tbase.Dispose(disposing);\r\n\t\t\tTracker.DebugMessage(\"PDF Viewer control destroyed.\");\r\n\t\t\t_cancelRendering = true;\r\n\t\t\t_disposed = true;\r\n\t\t\tCookie cookie = _cookie;\r\n\t\t\tif (cookie != null) {\r\n\t\t\t\tcookie.Cancel();\r\n\t\t\t\tcookie.Dispose();\r\n\t\t\t\t_cookie = null;\r\n\t\t\t}\r\n\t\t\t_mupdf?.Dispose();\r\n\t\t\t_refreshTimer.Stop();\r\n\t\t\t_renderWorker.CancelAsync();\r\n\t\t\tif (_cache != null) {\r\n\t\t\t\tlock (_cache.SyncObj) {\r\n\t\t\t\t\t_cache.Dispose();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_renderWorker.Dispose();\r\n\t\t\t_refreshTimer.Dispose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/ViewerStructures.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing MuPDF;\r\nusing MuPDF.Extensions;\r\nusing PDFPatcher.Common;\r\nusing DrawingPoint = System.Drawing.Point;\r\nusing MuPoint = MuPDF.Point;\r\nusing MuRectangle = MuPDF.Box;\r\n\r\nnamespace PDFPatcher.Functions.Editor\r\n{\r\n\tpublic enum ContentDirection\r\n\t{\r\n\t\tTopToDown,\r\n\t\tRightToLeft\r\n\t}\r\n\r\n\tpublic enum MouseMode\r\n\t{\r\n\t\tMove, Selection\r\n\t}\r\n\r\n\tpublic readonly struct PagePoint(int pageNumber, float imageX, float imageY) : IEquatable<PagePoint>\r\n\t{\r\n\t\tpublic static readonly PagePoint Empty;\r\n\r\n\t\tpublic readonly int Page = pageNumber;\r\n\t\tpublic readonly float ImageX = imageX, ImageY = imageY;\r\n\r\n\t\tpublic override bool Equals(object obj) {\r\n\t\t\treturn obj is PagePoint point && Equals(point);\r\n\t\t}\r\n\r\n\t\tpublic bool Equals(PagePoint other) {\r\n\t\t\treturn Page == other.Page &&\r\n\t\t\t\t   ImageX == other.ImageX &&\r\n\t\t\t\t   ImageY == other.ImageY;\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\tint hashCode = -1954381243;\r\n\t\t\thashCode = hashCode * -1521134295 + Page.GetHashCode();\r\n\t\t\thashCode = hashCode * -1521134295 + ImageX.GetHashCode();\r\n\t\t\thashCode = hashCode * -1521134295 + ImageY.GetHashCode();\r\n\t\t\treturn hashCode;\r\n\t\t}\r\n\r\n\t\tpublic static bool operator ==(PagePoint left, PagePoint right) {\r\n\t\t\treturn left.Equals(right);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(PagePoint left, PagePoint right) {\r\n\t\t\treturn !(left == right);\r\n\t\t}\r\n\t}\r\n\r\n\treadonly struct PagePosition\r\n\t{\r\n\t\tpublic static readonly PagePosition Empty = default;\r\n\t\t/// <summary>\r\n\t\t/// 所在页码。\r\n\t\t/// </summary>\r\n\t\tpublic readonly int Page;\r\n\t\t/// <summary>\r\n\t\t/// 在 PDF 页面空间上的位置。\r\n\t\t/// </summary>\r\n\t\tpublic readonly float PageX, PageY;\r\n\t\t/// <summary>\r\n\t\t/// 在渲染页面上的位置。\r\n\t\t/// </summary>\r\n\t\tpublic readonly int ImageX, ImageY;\r\n\t\t/// <summary>\r\n\t\t/// 当前点是否在页面上。\r\n\t\t/// </summary>\r\n\t\tpublic readonly bool IsInPage;\r\n\r\n\t\tinternal PagePosition(int page, PointF position, DrawingPoint imagePosition, bool isInPage)\r\n\t\t\t: this(page, position.X, position.Y, imagePosition.X, imagePosition.Y, isInPage) { }\r\n\r\n\t\tinternal PagePosition(int page, float x, float y, int imageX, int imageY, bool isInPage) {\r\n\t\t\tPage = page;\r\n\t\t\tPageX = x;\r\n\t\t\tPageY = y;\r\n\t\t\tImageX = imageX;\r\n\t\t\tImageY = imageY;\r\n\t\t\tIsInPage = isInPage;\r\n\t\t}\r\n\r\n\t\tpublic MuPoint Location => new(PageX, PageY);\r\n\r\n\t\tpublic MuPoint ToPageCoordinate(Page page) {\r\n\t\t\tvar pb = page.Bound;\r\n\t\t\treturn new MuPoint(PageX - pb.Left, pb.Bottom - PageY);\r\n\t\t}\r\n\t}\r\n\r\n\treadonly struct PageRegion\r\n\t{\r\n\t\tpublic static readonly PageRegion Empty = new PageRegion();\r\n\r\n\t\tpublic readonly int Page;\r\n\t\tpublic readonly MuRectangle Region;\r\n\r\n\t\tinternal PageRegion(PagePosition p1, PagePosition p2) {\r\n\t\t\tif (p1.Page != p2.Page) {\r\n\t\t\t\tPage = 0;\r\n\t\t\t\tRegion = new MuRectangle();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tPage = p1.Page;\r\n\t\t\t\tRegion = new MuRectangle(p1.PageX, p1.PageY, p2.PageX, p2.PageY);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic MuRectangle ToPageCoordinate(Page page) {\r\n\t\t\tvar r = Region;\r\n\t\t\tvar pb = page.Bound;\r\n\t\t\treturn new MuRectangle(r.Left,\r\n\t\t\t\tpb.Bottom - r.Top,\r\n\t\t\t\tr.Right,\r\n\t\t\t\tpb.Bottom - r.Bottom);\r\n\t\t}\r\n\t}\r\n\r\n\treadonly struct TextInfo\r\n\t{\r\n\t\tpublic readonly Page Page;\r\n\r\n\t\t/// <summary>获取文本字符的位置边框。</summary>\r\n\t\tpublic readonly MuRectangle TextBBox;\r\n\t\t/// <summary>获取文本位置以下的文本行。</summary>\r\n\t\tpublic readonly List<TextLine> Lines;\r\n\t\tpublic readonly List<TextSpan> Spans;\r\n\r\n\t\tpublic TextInfo(Page page, MuRectangle bbox, List<TextLine> textLines, List<TextSpan> spans) {\r\n\t\t\tPage = page;\r\n\t\t\tTextBBox = bbox;\r\n\t\t\tLines = textLines;\r\n\t\t\tSpans = spans;\r\n\t\t}\r\n\r\n\t\tpublic MuRectangle BBox => TextBBox;\r\n\r\n\t\tpublic IEnumerable<TextFont> GetFonts() {\r\n\t\t\tif (Spans.HasContent() == false) {\r\n\t\t\t\tyield break;\r\n\t\t\t}\r\n\t\t\tvar fonts = new HashSet<TextFont>();\r\n\t\t\tforeach (var span in Spans) {\r\n\t\t\t\tif (fonts.Add(span.Font)) {\r\n\t\t\t\t\tyield return span.Font;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic IEnumerable<string> GetFontNames() {\r\n\t\t\tif (Spans.HasContent() == false) {\r\n\t\t\t\tyield break;\r\n\t\t\t}\r\n\t\t\tHashSet<string> fonts = new HashSet<string>();\r\n\t\t\tforeach (var span in Spans) {\r\n\t\t\t\tvar f = span.Font;\r\n\t\t\t\tif (fonts.Add(f.Name)) {\r\n\t\t\t\t\tyield return f.Name;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\tif (Lines == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar c = Lines.Count;\r\n\t\t\tif (c == 1) {\r\n\t\t\t\treturn Lines[0].GetText();\r\n\t\t\t}\r\n\t\t\tvar sb = StringBuilderCache.Acquire(100);\r\n\t\t\tvar b = Lines[0].Bound;\r\n\t\t\tforeach (var line in Lines) {\r\n\t\t\t\tif (line.Bound.IsHorizontalNeighbor(b)) {\r\n\t\t\t\t\tsb.Append(line.GetText());\r\n\t\t\t\t\tb = b.Union(line.Bound);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tb = line.Bound;\r\n\t\t\t\t\tsb.AppendLine();\r\n\t\t\t\t\tsb.Append(line.GetText());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t}\r\n\t}\r\n\r\n\t[DebuggerDisplay(\"Point={Point}; Font={Font}; Size={Size}; Color={Color}; Text={Text}\")]\r\n\tpublic sealed class TextSpan(TextLine line, MuPoint point, string text, float size, TextFont font, MuRectangle box, int color)\r\n\t{\r\n\t\tpublic TextLine Line { get; } = line;\r\n\t\tpublic MuPoint Point { get; } = point;\r\n\t\tpublic string Text { get; } = text;\r\n\t\tpublic float Size { get; } = size;\r\n\t\tpublic TextFont Font { get; } = font;\r\n\t\tpublic MuRectangle Box { get; } = box;\r\n\t\tpublic int Color { get; } = color;\r\n\r\n\t\tpublic static IEnumerable<TextSpan> GetTextSpans(TextLine line) {\r\n\t\t\tvar r = new List<TextSpan>(2);\r\n\t\t\tvar ch = line.FirstCharacter;\r\n\t\t\tvar start = ch;\r\n\t\t\tvar end = line.LastCharacter;\r\n\t\t\tvar size = ch.Size;\r\n\t\t\tvar font = ch.Font;\r\n\t\t\tvar color = ch.Color;\r\n\t\t\tvar t = StringBuilderCache.Acquire(100);\r\n\t\t\tt.Append((char)ch.Character);\r\n\t\t\tdo {\r\n\t\t\t\tch = ch.Next;\r\n\t\t\t\tif (ch is null) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (start.HasSameStyle(ch)) {\r\n\t\t\t\t\tt.Append((char)ch.Character);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tr.Add(new TextSpan(line, start.Origin, t.ToString(), size, font, start.Quad.Union(ch.Quad).ToBox(), color));\r\n\t\t\t\tt.Length = 0;\r\n\t\t\t\tsize = ch.Size;\r\n\t\t\t\tfont = ch.Font;\r\n\t\t\t\tcolor = ch.Color;\r\n\t\t\t\tstart = ch;\r\n\t\t\t\tt.Append((char)ch.Character);\r\n\t\t\t} while (ch != end);\r\n\t\t\tif (t.Length > 0) {\r\n\t\t\t\tvar s = StringBuilderCache.GetStringAndRelease(t).TrimEnd();\r\n\t\t\t\tif (s.Length > 0) {\r\n\t\t\t\t\tr.Add(new TextSpan(line, start.Origin, s, size, font, start.Quad.Union(end.Quad).ToBox(), color));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tStringBuilderCache.Release(t);\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\t}\r\n\r\n\treadonly struct Selection(RenderResultCache cache, int page, MuRectangle region, RectangleF imageRegion)\r\n\t{\r\n\t\tpublic static readonly Selection Empty = default;\r\n\r\n\t\treadonly RenderResultCache _cache = cache;\r\n\t\t/// <summary>\r\n\t\t/// 获取选中区域的页码。\r\n\t\t/// </summary>\r\n\t\tpublic readonly int Page = page;\r\n\t\t/// <summary>\r\n\t\t/// 获取选中区域在页面上的矩形区域（屏幕左下角点坐标为0，0）。\r\n\t\t/// </summary>\r\n\t\tpublic readonly MuRectangle PageRegion = region;\r\n\t\t/// <summary>\r\n\t\t/// 获取选中区域在显示图片上的矩形区域。\r\n\t\t/// </summary>\r\n\t\tpublic readonly RectangleF ImageRegion = imageRegion;\r\n\r\n\t\tpublic Bitmap GetSelectedBitmap() {\r\n\t\t\t_cache.LoadPage(Page);\r\n\t\t\tvar p = _cache.GetBitmap(Page);\r\n\t\t\treturn p.Clone(new MuRectangle(\r\n\t\t\t\t\tImageRegion.Left < 0 ? 0 : ImageRegion.Left,\r\n\t\t\t\t\tImageRegion.Top < 0 ? 0 : ImageRegion.Top,\r\n\t\t\t\t\tImageRegion.Right > p.Width ? p.Width : ImageRegion.Right,\r\n\t\t\t\t\tImageRegion.Bottom > p.Height ? p.Height : ImageRegion.Bottom\r\n\t\t\t\t).ToRectangleF(), p.PixelFormat);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/ZoomRateEntryForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ZoomRateEntryForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._MessageLabel = new System.Windows.Forms.Label();\r\n\t\t\tthis._ZoomRateBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point(97, 74);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 0;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler(this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(178, 74);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 1;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MessageLabel\r\n\t\t\t// \r\n\t\t\tthis._MessageLabel.AutoSize = true;\r\n\t\t\tthis._MessageLabel.Location = new System.Drawing.Point(12, 33);\r\n\t\t\tthis._MessageLabel.Name = \"_MessageLabel\";\r\n\t\t\tthis._MessageLabel.Size = new System.Drawing.Size(113, 12);\r\n\t\t\tthis._MessageLabel.TabIndex = 2;\r\n\t\t\tthis._MessageLabel.Text = \"在此输入缩放比例：\";\r\n\t\t\t// \r\n\t\t\t// _ZoomRateBox\r\n\t\t\t// \r\n\t\t\tthis._ZoomRateBox.FormattingEnabled = true;\r\n\t\t\tthis._ZoomRateBox.Items.AddRange(new object[] {\r\n            \"1\",\r\n            \"保持不变\",\r\n            \"——————\",\r\n            \"4\",\r\n            \"3\",\r\n            \"2\",\r\n            \"1.5\",\r\n            \"1.3\",\r\n            \"1.2\",\r\n            \"1\",\r\n            \"0.9\",\r\n            \"0.8\",\r\n            \"0.5\",\r\n            \"0.3\",\r\n            \"0.2\"});\r\n\t\t\tthis._ZoomRateBox.Location = new System.Drawing.Point(131, 30);\r\n\t\t\tthis._ZoomRateBox.Name = \"_ZoomRateBox\";\r\n\t\t\tthis._ZoomRateBox.Size = new System.Drawing.Size(121, 20);\r\n\t\t\tthis._ZoomRateBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// ZoomRateEntryForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(265, 109);\r\n\t\t\tthis.Controls.Add(this._ZoomRateBox);\r\n\t\t\tthis.Controls.Add(this._MessageLabel);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._OkButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"ZoomRateEntryForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r\n\t\t\tthis.Text = \"输入缩放比例\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label _MessageLabel;\r\n\t\tprivate System.Windows.Forms.ComboBox _ZoomRateBox;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/Editor/ZoomRateEntryForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed partial class ZoomRateEntryForm : Form\r\n\t{\r\n\t\tinternal string ZoomRate => _ZoomRateBox.Text;\r\n\r\n\t\tpublic ZoomRateEntryForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_ZoomRateBox.Select();\r\n\t\t\t_ZoomRateBox.Focus();\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/Editor/ZoomRateEntryForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/EditorControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class EditorControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _AlterPosition;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ChangeCoordinates;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ClearPositionX;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ClearPositionY;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ClearPositionXY;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ForceInternalLink;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectNone;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InvertSelection;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ShiftPageNumber;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ShiftMultiPageNumber;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _IncrementPageNumber;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _DecrementPageNumber;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MergeBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAll;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator3;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem dummyToolStripMenuItem;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Copy;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Paste;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _DeleteBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _InsertBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _LevelUp;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _LevelDown;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator7;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectItems;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SearchReplace;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _BookmarkAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator8;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem4;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem5;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem6;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem7;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem9;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem10;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem11;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem12;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem13;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem14;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem15;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem16;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem17;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem18;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem19;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator10;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _FirstPage;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _PreviousPage;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _NextPage;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _LastPage;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MoveMode;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectionMode;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ScrollVertical;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ScrollHorizontal;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _FullPageScroll;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator6;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _TrueColorSpace;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _GrayColorSpace;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InvertColor;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _BookmarkHere;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _CopySelection;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator11;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _OcrDisabled;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ShowTextBorders;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _DarkMode;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator12;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _GreenMode;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ShowBookmarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InsertPageLabel;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _AutoBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SetOpenStatusTrue;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SetOpenStatusFalse;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _OcrDetectPunctuation;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _PageProperties;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MarkBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MarkBookmarkRed;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MarkBookmarkYellow;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MarkBookmarkGreen;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MarkBookmarkBlue;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _MarkBookmarkPurple;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator5;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _UnmarkBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ClearBookmarkMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectMarkedBookmarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectRedMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectYellowMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectGreenMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectCyanMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectBlueMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectPurpleMarks;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator14;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator13;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator4;\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditorControl));\r\n\t\t\tthis._SetCurrentCoordinates = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SelectionMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SelectChildren = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ExpandAll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ExpandSelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._CollapseAll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._CollapseSelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._CollapseChildren = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tthis._MarkBookmarkCyan = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ViewerButton = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\tthis._OcrMenu = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._InsertWithOcrOnly = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ShowAnnotations = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._EditMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._ChangeZoomRate = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SetOpenStatus = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ChangeCase = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._QuickSelect = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RecentFileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._AddFilesButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._UndoMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._UndoButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._IncludeDecendantBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._BookmarkBox = new PDFPatcher.Functions.BookmarkEditorView();\r\n\t\t\tthis._MainPanel = new System.Windows.Forms.SplitContainer();\r\n\t\t\tthis._PageInfoBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._ViewerBox = new PDFPatcher.Functions.ViewerControl();\r\n\t\t\tthis._ViewerMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._OcrPage = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SavePageImage = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._BookmarkToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._SavePDF = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._SaveBookmark = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._BookmarkBoldButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._BookmarkItalicButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._BookmarkColorButton = new ColorPicker.ToolStripColorPicker();\r\n\t\t\tthis.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis.toolStripMenuItem21 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ViewerToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._CurrentPageBox = new System.Windows.Forms.ToolStripTextBox();\r\n\t\t\tthis._ZoomBox = new System.Windows.Forms.ToolStripComboBox();\r\n\t\t\t_AlterPosition = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ChangeCoordinates = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ClearPositionX = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ClearPositionY = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ClearPositionXY = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ForceInternalLink = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectNone = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InvertSelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ShiftPageNumber = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ShiftMultiPageNumber = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_IncrementPageNumber = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_DecrementPageNumber = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MergeBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectAll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tdummyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Copy = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_Paste = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_DeleteBookmark = new System.Windows.Forms.ToolStripButton();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_InsertBookmark = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_LevelUp = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_LevelDown = new System.Windows.Forms.ToolStripButton();\r\n\t\t\ttoolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_SelectItems = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SearchReplace = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_BookmarkAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\ttoolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem16 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem19 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_FirstPage = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_PreviousPage = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_NextPage = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_LastPage = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_MoveMode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectionMode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_ScrollVertical = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ScrollHorizontal = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_FullPageScroll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_TrueColorSpace = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_GrayColorSpace = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InvertColor = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_BookmarkHere = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CopySelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_OcrDisabled = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ShowTextBorders = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_DarkMode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_GreenMode = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ShowBookmarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InsertPageLabel = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_AutoBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SetOpenStatusTrue = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SetOpenStatusFalse = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_OcrDetectPunctuation = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_PageProperties = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MarkBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MarkBookmarkRed = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MarkBookmarkYellow = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MarkBookmarkGreen = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MarkBookmarkBlue = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_MarkBookmarkPurple = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_UnmarkBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ClearBookmarkMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectMarkedBookmarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectRedMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectYellowMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectGreenMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectCyanMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectBlueMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectPurpleMarks = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\ttoolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\ttoolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tthis._SelectionMenu.SuspendLayout();\r\n\t\t\tthis._EditMenu.SuspendLayout();\r\n\t\t\tthis._RecentFileMenu.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BookmarkBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MainPanel)).BeginInit();\r\n\t\t\tthis._MainPanel.Panel1.SuspendLayout();\r\n\t\t\tthis._MainPanel.Panel2.SuspendLayout();\r\n\t\t\tthis._MainPanel.SuspendLayout();\r\n\t\t\tthis._ViewerMenu.SuspendLayout();\r\n\t\t\tthis._BookmarkToolbar.SuspendLayout();\r\n\t\t\tthis._ViewerToolbar.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _AlterPosition\r\n\t\t\t// \r\n\t\t\t_AlterPosition.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _ChangeCoordinates,\r\n            this._SetCurrentCoordinates,\r\n            _ClearPositionX,\r\n            _ClearPositionY,\r\n            _ClearPositionXY});\r\n\t\t\t_AlterPosition.Image = global::PDFPatcher.Properties.Resources.ScrollPosition;\r\n\t\t\t_AlterPosition.Name = \"_AlterPosition\";\r\n\t\t\t_AlterPosition.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_AlterPosition.Text = \"更改目标页面坐标(&Z)\";\r\n\t\t\t_AlterPosition.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _ChangeCoordinates\r\n\t\t\t// \r\n\t\t\t_ChangeCoordinates.Image = global::PDFPatcher.Properties.Resources.ScrollPosition;\r\n\t\t\t_ChangeCoordinates.Name = \"_ChangeCoordinates\";\r\n\t\t\t_ChangeCoordinates.Size = new System.Drawing.Size(224, 22);\r\n\t\t\t_ChangeCoordinates.Text = \"更改坐标(&B)...\";\r\n\t\t\t// \r\n\t\t\t// _SetCurrentCoordinates\r\n\t\t\t// \r\n\t\t\tthis._SetCurrentCoordinates.Image = global::PDFPatcher.Properties.Resources.Pin;\r\n\t\t\tthis._SetCurrentCoordinates.Name = \"_SetCurrentCoordinates\";\r\n\t\t\tthis._SetCurrentCoordinates.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W)));\r\n\t\t\tthis._SetCurrentCoordinates.Size = new System.Drawing.Size(224, 22);\r\n\t\t\tthis._SetCurrentCoordinates.Text = \"设为当前页坐标(&S)\";\r\n\t\t\t// \r\n\t\t\t// _ClearPositionX\r\n\t\t\t// \r\n\t\t\t_ClearPositionX.Name = \"_ClearPositionX\";\r\n\t\t\t_ClearPositionX.Size = new System.Drawing.Size(224, 22);\r\n\t\t\t_ClearPositionX.Text = \"清除横坐标(&H)\";\r\n\t\t\t// \r\n\t\t\t// _ClearPositionY\r\n\t\t\t// \r\n\t\t\t_ClearPositionY.Name = \"_ClearPositionY\";\r\n\t\t\t_ClearPositionY.Size = new System.Drawing.Size(224, 22);\r\n\t\t\t_ClearPositionY.Text = \"清除纵坐标(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _ClearPositionXY\r\n\t\t\t// \r\n\t\t\t_ClearPositionXY.Name = \"_ClearPositionXY\";\r\n\t\t\t_ClearPositionXY.Size = new System.Drawing.Size(224, 22);\r\n\t\t\t_ClearPositionXY.Text = \"清除横坐标与纵坐标(&Q)\";\r\n\t\t\t// \r\n\t\t\t// _ForceInternalLink\r\n\t\t\t// \r\n\t\t\t_ForceInternalLink.Name = \"_ForceInternalLink\";\r\n\t\t\t_ForceInternalLink.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_ForceInternalLink.Text = \"强制设置为文件内链接(&N)\";\r\n\t\t\t// \r\n\t\t\t// _SelectNone\r\n\t\t\t// \r\n\t\t\t_SelectNone.Name = \"_SelectNone\";\r\n\t\t\t_SelectNone.Size = new System.Drawing.Size(162, 22);\r\n\t\t\t_SelectNone.Text = \"全部不选(&B)\";\r\n\t\t\t// \r\n\t\t\t// _InvertSelection\r\n\t\t\t// \r\n\t\t\t_InvertSelection.Name = \"_InvertSelection\";\r\n\t\t\t_InvertSelection.Size = new System.Drawing.Size(162, 22);\r\n\t\t\t_InvertSelection.Text = \"反转选择状态(&F)\";\r\n\t\t\t// \r\n\t\t\t// _ShiftPageNumber\r\n\t\t\t// \r\n\t\t\t_ShiftPageNumber.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _ShiftMultiPageNumber,\r\n            _IncrementPageNumber,\r\n            _DecrementPageNumber});\r\n\t\t\t_ShiftPageNumber.Image = global::PDFPatcher.Properties.Resources.PageRange;\r\n\t\t\t_ShiftPageNumber.Name = \"_ShiftPageNumber\";\r\n\t\t\t_ShiftPageNumber.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_ShiftPageNumber.Text = \"更改目标页码(&M)\";\r\n\t\t\t_ShiftPageNumber.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _ShiftMultiPageNumber\r\n\t\t\t// \r\n\t\t\t_ShiftMultiPageNumber.Name = \"_ShiftMultiPageNumber\";\r\n\t\t\t_ShiftMultiPageNumber.ShortcutKeyDisplayString = \"*\";\r\n\t\t\t_ShiftMultiPageNumber.Size = new System.Drawing.Size(185, 22);\r\n\t\t\t_ShiftMultiPageNumber.Text = \"增减指定数值(&S)...\";\r\n\t\t\t// \r\n\t\t\t// _IncrementPageNumber\r\n\t\t\t// \r\n\t\t\t_IncrementPageNumber.Name = \"_IncrementPageNumber\";\r\n\t\t\t_IncrementPageNumber.ShortcutKeyDisplayString = \"+\";\r\n\t\t\t_IncrementPageNumber.Size = new System.Drawing.Size(185, 22);\r\n\t\t\t_IncrementPageNumber.Text = \"增加页码(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _DecrementPageNumber\r\n\t\t\t// \r\n\t\t\t_DecrementPageNumber.Name = \"_DecrementPageNumber\";\r\n\t\t\t_DecrementPageNumber.ShortcutKeyDisplayString = \"-\";\r\n\t\t\t_DecrementPageNumber.Size = new System.Drawing.Size(185, 22);\r\n\t\t\t_DecrementPageNumber.Text = \"减少页码(&J)\";\r\n\t\t\t// \r\n\t\t\t// _MergeBookmark\r\n\t\t\t// \r\n\t\t\t_MergeBookmark.Image = global::PDFPatcher.Properties.Resources.Merge;\r\n\t\t\t_MergeBookmark.Name = \"_MergeBookmark\";\r\n\t\t\t_MergeBookmark.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_MergeBookmark.Text = \"合并书签(&H)\";\r\n\t\t\t// \r\n\t\t\t// _SelectAll\r\n\t\t\t// \r\n\t\t\t_SelectAll.Image = global::PDFPatcher.Properties.Resources.SelectAll;\r\n\t\t\t_SelectAll.Name = \"_SelectAll\";\r\n\t\t\t_SelectAll.Size = new System.Drawing.Size(162, 22);\r\n\t\t\t_SelectAll.Text = \"全部选中\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator3\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator3.Name = \"toolStripSeparator3\";\r\n\t\t\ttoolStripSeparator3.Size = new System.Drawing.Size(159, 6);\r\n\t\t\t// \r\n\t\t\t// dummyToolStripMenuItem\r\n\t\t\t// \r\n\t\t\tdummyToolStripMenuItem.Name = \"dummyToolStripMenuItem\";\r\n\t\t\tdummyToolStripMenuItem.Size = new System.Drawing.Size(94, 22);\r\n\t\t\tdummyToolStripMenuItem.Text = \"dummy\";\r\n\t\t\t// \r\n\t\t\t// _Copy\r\n\t\t\t// \r\n\t\t\t_Copy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_Copy.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\t_Copy.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Copy.Name = \"_Copy\";\r\n\t\t\t_Copy.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_Copy.Text = \"复制书签\";\r\n\t\t\t_Copy.ToolTipText = \"复制书签\\r\\nCtrl+C\";\r\n\t\t\t// \r\n\t\t\t// _Paste\r\n\t\t\t// \r\n\t\t\t_Paste.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_Paste.Image = global::PDFPatcher.Properties.Resources.Paste;\r\n\t\t\t_Paste.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Paste.Name = \"_Paste\";\r\n\t\t\t_Paste.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_Paste.Text = \"粘贴书签\";\r\n\t\t\t_Paste.ToolTipText = \"粘贴书签\\r\\nCtrl+P\";\r\n\t\t\t// \r\n\t\t\t// _DeleteBookmark\r\n\t\t\t// \r\n\t\t\t_DeleteBookmark.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_DeleteBookmark.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\t_DeleteBookmark.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_DeleteBookmark.Name = \"_DeleteBookmark\";\r\n\t\t\t_DeleteBookmark.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_DeleteBookmark.Text = \"删除\";\r\n\t\t\t_DeleteBookmark.ToolTipText = \"删除书签项目\\r\\nDelete\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _InsertBookmark\r\n\t\t\t// \r\n\t\t\t_InsertBookmark.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_InsertBookmark.Image = global::PDFPatcher.Properties.Resources.BookmarkFile;\r\n\t\t\t_InsertBookmark.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_InsertBookmark.Name = \"_InsertBookmark\";\r\n\t\t\t_InsertBookmark.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_InsertBookmark.Text = \"插入(&C)\";\r\n\t\t\t_InsertBookmark.ToolTipText = \"插入书签项\\r\\nCtrl+↓或Insert：插入到后面\\r\\nCtrl+↑或Shift+Insert：插入到前面\\r\\nCtrl+←：插入到上级书签后面\\r\\nCtrl+→：插\" +\r\n    \"入下级书签\";\r\n\t\t\t// \r\n\t\t\t// _LevelUp\r\n\t\t\t// \r\n\t\t\t_LevelUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_LevelUp.Image = global::PDFPatcher.Properties.Resources.MoveLeft;\r\n\t\t\t_LevelUp.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_LevelUp.Name = \"_LevelUp\";\r\n\t\t\t_LevelUp.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_LevelUp.Text = \"设置为父书签\";\r\n\t\t\t_LevelUp.ToolTipText = \"将选中书签向外移一级变成父级书签\\r\\nShift+Tab\";\r\n\t\t\t// \r\n\t\t\t// _LevelDown\r\n\t\t\t// \r\n\t\t\t_LevelDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_LevelDown.Image = global::PDFPatcher.Properties.Resources.MoveRight;\r\n\t\t\t_LevelDown.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_LevelDown.Name = \"_LevelDown\";\r\n\t\t\t_LevelDown.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_LevelDown.Text = \"设置为子书签\";\r\n\t\t\t_LevelDown.ToolTipText = \"设置选中书签为其上一个同级书签的子书签\\r\\nTab\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator7\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator7.Name = \"toolStripSeparator7\";\r\n\t\t\ttoolStripSeparator7.Size = new System.Drawing.Size(242, 6);\r\n\t\t\t// \r\n\t\t\t// _SelectItems\r\n\t\t\t// \r\n\t\t\t_SelectItems.DropDown = this._SelectionMenu;\r\n\t\t\t_SelectItems.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\t_SelectItems.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_SelectItems.Name = \"_SelectItems\";\r\n\t\t\t_SelectItems.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_SelectItems.Text = \"选择书签(&S)\";\r\n\t\t\t// \r\n\t\t\t// _SelectionMenu\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _SelectAll,\r\n            _SelectNone,\r\n            _InvertSelection,\r\n            this._SelectChildren,\r\n            toolStripSeparator3,\r\n            this._ExpandAll,\r\n            this._ExpandSelection,\r\n            this._CollapseAll,\r\n            this._CollapseSelection,\r\n            this._CollapseChildren});\r\n\t\t\tthis._SelectionMenu.Name = \"_SelectionMenu\";\r\n\t\t\tthis._SelectionMenu.OwnerItem = _SelectItems;\r\n\t\t\tthis._SelectionMenu.Size = new System.Drawing.Size(163, 208);\r\n\t\t\tthis._SelectionMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SelectChildren\r\n\t\t\t// \r\n\t\t\tthis._SelectChildren.Name = \"_SelectChildren\";\r\n\t\t\tthis._SelectChildren.Size = new System.Drawing.Size(162, 22);\r\n\t\t\tthis._SelectChildren.Text = \"选择子书签(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _ExpandAll\r\n\t\t\t// \r\n\t\t\tthis._ExpandAll.Name = \"_ExpandAll\";\r\n\t\t\tthis._ExpandAll.Size = new System.Drawing.Size(162, 22);\r\n\t\t\tthis._ExpandAll.Text = \"全部展开(&K)\";\r\n\t\t\t// \r\n\t\t\t// _ExpandSelection\r\n\t\t\t// \r\n\t\t\tthis._ExpandSelection.Name = \"_ExpandSelection\";\r\n\t\t\tthis._ExpandSelection.Size = new System.Drawing.Size(162, 22);\r\n\t\t\tthis._ExpandSelection.Text = \"展开选中项(X)\";\r\n\t\t\t// \r\n\t\t\t// _CollapseAll\r\n\t\t\t// \r\n\t\t\tthis._CollapseAll.Name = \"_CollapseAll\";\r\n\t\t\tthis._CollapseAll.Size = new System.Drawing.Size(162, 22);\r\n\t\t\tthis._CollapseAll.Text = \"全部折叠(&Q)\";\r\n\t\t\t// \r\n\t\t\t// _CollapseSelection\r\n\t\t\t// \r\n\t\t\tthis._CollapseSelection.Name = \"_CollapseSelection\";\r\n\t\t\tthis._CollapseSelection.Size = new System.Drawing.Size(162, 22);\r\n\t\t\tthis._CollapseSelection.Text = \"折叠选中项(D)\";\r\n\t\t\t// \r\n\t\t\t// _CollapseChildren\r\n\t\t\t// \r\n\t\t\tthis._CollapseChildren.Name = \"_CollapseChildren\";\r\n\t\t\tthis._CollapseChildren.Size = new System.Drawing.Size(162, 22);\r\n\t\t\tthis._CollapseChildren.Text = \"折叠子书签(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _SearchReplace\r\n\t\t\t// \r\n\t\t\t_SearchReplace.Image = global::PDFPatcher.Properties.Resources.SearchReplace;\r\n\t\t\t_SearchReplace.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_SearchReplace.Name = \"_SearchReplace\";\r\n\t\t\t_SearchReplace.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));\r\n\t\t\t_SearchReplace.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_SearchReplace.Text = \"查找/替换书签文本(&C)...\";\r\n\t\t\t_SearchReplace.ToolTipText = \"查找或替换书签文本\\r\\nCtrl+F\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkAction\r\n\t\t\t// \r\n\t\t\t_BookmarkAction.Image = global::PDFPatcher.Properties.Resources.EditItem;\r\n\t\t\t_BookmarkAction.Name = \"_BookmarkAction\";\r\n\t\t\t_BookmarkAction.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_BookmarkAction.Text = \"书签动作属性(&D)...\";\r\n\t\t\t_BookmarkAction.ToolTipText = \"修改点击书签后执行的动作\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem1\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem1.Image = global::PDFPatcher.Properties.Resources.SelectAll;\r\n\t\t\ttoolStripMenuItem1.Name = \"toolStripMenuItem1\";\r\n\t\t\ttoolStripMenuItem1.Size = new System.Drawing.Size(158, 22);\r\n\t\t\ttoolStripMenuItem1.Text = \"全部选中\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem2\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem2.Name = \"toolStripMenuItem2\";\r\n\t\t\ttoolStripMenuItem2.Size = new System.Drawing.Size(158, 22);\r\n\t\t\ttoolStripMenuItem2.Text = \"全部不选\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem3\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem3.Name = \"toolStripMenuItem3\";\r\n\t\t\ttoolStripMenuItem3.Size = new System.Drawing.Size(158, 22);\r\n\t\t\ttoolStripMenuItem3.Text = \"反转选择状态\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator8\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator8.Name = \"toolStripSeparator8\";\r\n\t\t\ttoolStripSeparator8.Size = new System.Drawing.Size(155, 6);\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem4\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            toolStripMenuItem5,\r\n            toolStripMenuItem6,\r\n            toolStripMenuItem7,\r\n            this.toolStripMenuItem8,\r\n            toolStripMenuItem9,\r\n            toolStripMenuItem10,\r\n            this.toolStripSeparator9,\r\n            toolStripMenuItem11,\r\n            toolStripMenuItem12});\r\n\t\t\ttoolStripMenuItem4.Image = global::PDFPatcher.Properties.Resources.Mark;\r\n\t\t\ttoolStripMenuItem4.Name = \"toolStripMenuItem4\";\r\n\t\t\ttoolStripMenuItem4.Size = new System.Drawing.Size(158, 22);\r\n\t\t\ttoolStripMenuItem4.Text = \"标记书签\";\r\n\t\t\ttoolStripMenuItem4.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem5\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem5.Name = \"toolStripMenuItem5\";\r\n\t\t\ttoolStripMenuItem5.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem5.Text = \"红色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem6\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem6.Name = \"toolStripMenuItem6\";\r\n\t\t\ttoolStripMenuItem6.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem6.Text = \"黄色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem7\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem7.Name = \"toolStripMenuItem7\";\r\n\t\t\ttoolStripMenuItem7.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem7.Text = \"绿色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem8\r\n\t\t\t// \r\n\t\t\tthis.toolStripMenuItem8.Name = \"toolStripMenuItem8\";\r\n\t\t\tthis.toolStripMenuItem8.Size = new System.Drawing.Size(148, 22);\r\n\t\t\tthis.toolStripMenuItem8.Text = \"青色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem9\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem9.Name = \"toolStripMenuItem9\";\r\n\t\t\ttoolStripMenuItem9.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem9.Text = \"蓝色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem10\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem10.Name = \"toolStripMenuItem10\";\r\n\t\t\ttoolStripMenuItem10.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem10.Text = \"紫色\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator9\r\n\t\t\t// \r\n\t\t\tthis.toolStripSeparator9.Name = \"toolStripSeparator9\";\r\n\t\t\tthis.toolStripSeparator9.Size = new System.Drawing.Size(145, 6);\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem11\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem11.Image = global::PDFPatcher.Properties.Resources.Unmark;\r\n\t\t\ttoolStripMenuItem11.Name = \"toolStripMenuItem11\";\r\n\t\t\ttoolStripMenuItem11.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem11.Text = \"取消标记\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem12\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem12.Name = \"toolStripMenuItem12\";\r\n\t\t\ttoolStripMenuItem12.Size = new System.Drawing.Size(148, 22);\r\n\t\t\ttoolStripMenuItem12.Text = \"清除所有标记\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem13\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem13.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            toolStripMenuItem14,\r\n            toolStripMenuItem15,\r\n            toolStripMenuItem16,\r\n            toolStripMenuItem17,\r\n            toolStripMenuItem18,\r\n            toolStripMenuItem19});\r\n\t\t\ttoolStripMenuItem13.Image = global::PDFPatcher.Properties.Resources.SelectMarks;\r\n\t\t\ttoolStripMenuItem13.Name = \"toolStripMenuItem13\";\r\n\t\t\ttoolStripMenuItem13.Size = new System.Drawing.Size(158, 22);\r\n\t\t\ttoolStripMenuItem13.Text = \"选择已标记书签\";\r\n\t\t\ttoolStripMenuItem13.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem14\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem14.Name = \"toolStripMenuItem14\";\r\n\t\t\ttoolStripMenuItem14.Size = new System.Drawing.Size(100, 22);\r\n\t\t\ttoolStripMenuItem14.Text = \"红色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem15\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem15.Name = \"toolStripMenuItem15\";\r\n\t\t\ttoolStripMenuItem15.Size = new System.Drawing.Size(100, 22);\r\n\t\t\ttoolStripMenuItem15.Text = \"黄色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem16\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem16.Name = \"toolStripMenuItem16\";\r\n\t\t\ttoolStripMenuItem16.Size = new System.Drawing.Size(100, 22);\r\n\t\t\ttoolStripMenuItem16.Text = \"绿色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem17\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem17.Name = \"toolStripMenuItem17\";\r\n\t\t\ttoolStripMenuItem17.Size = new System.Drawing.Size(100, 22);\r\n\t\t\ttoolStripMenuItem17.Text = \"青色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem18\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem18.Name = \"toolStripMenuItem18\";\r\n\t\t\ttoolStripMenuItem18.Size = new System.Drawing.Size(100, 22);\r\n\t\t\ttoolStripMenuItem18.Text = \"蓝色\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem19\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem19.Name = \"toolStripMenuItem19\";\r\n\t\t\ttoolStripMenuItem19.Size = new System.Drawing.Size(100, 22);\r\n\t\t\ttoolStripMenuItem19.Text = \"紫色\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator10\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator10.Name = \"toolStripSeparator10\";\r\n\t\t\ttoolStripSeparator10.Size = new System.Drawing.Size(155, 6);\r\n\t\t\t// \r\n\t\t\t// _FirstPage\r\n\t\t\t// \r\n\t\t\t_FirstPage.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_FirstPage.Image = global::PDFPatcher.Properties.Resources.MoveTop;\r\n\t\t\t_FirstPage.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_FirstPage.Name = \"_FirstPage\";\r\n\t\t\t_FirstPage.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_FirstPage.Text = \"转到文档第一页\";\r\n\t\t\t_FirstPage.ToolTipText = \"转到文档第一页\\r\\nHome 键\";\r\n\t\t\t// \r\n\t\t\t// _PreviousPage\r\n\t\t\t// \r\n\t\t\t_PreviousPage.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_PreviousPage.Image = global::PDFPatcher.Properties.Resources.MoveUp;\r\n\t\t\t_PreviousPage.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_PreviousPage.Name = \"_PreviousPage\";\r\n\t\t\t_PreviousPage.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_PreviousPage.Text = \"转到上一页\";\r\n\t\t\t_PreviousPage.ToolTipText = \"转到上一页\\r\\n[ 键\";\r\n\t\t\t// \r\n\t\t\t// _NextPage\r\n\t\t\t// \r\n\t\t\t_NextPage.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_NextPage.Image = global::PDFPatcher.Properties.Resources.MoveDown;\r\n\t\t\t_NextPage.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_NextPage.Name = \"_NextPage\";\r\n\t\t\t_NextPage.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_NextPage.Text = \"转到下一页\";\r\n\t\t\t_NextPage.ToolTipText = \"转到下一页\\r\\n] 键\";\r\n\t\t\t// \r\n\t\t\t// _LastPage\r\n\t\t\t// \r\n\t\t\t_LastPage.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_LastPage.Image = global::PDFPatcher.Properties.Resources.MoveBottom;\r\n\t\t\t_LastPage.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_LastPage.Name = \"_LastPage\";\r\n\t\t\t_LastPage.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_LastPage.Text = \"转到文档最后一页\";\r\n\t\t\t_LastPage.ToolTipText = \"转到文档最后一页\\r\\nEnd 键\";\r\n\t\t\t// \r\n\t\t\t// _MoveMode\r\n\t\t\t// \r\n\t\t\t_MoveMode.Checked = true;\r\n\t\t\t_MoveMode.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\t_MoveMode.Image = global::PDFPatcher.Properties.Resources.Move;\r\n\t\t\t_MoveMode.Name = \"_MoveMode\";\r\n\t\t\t_MoveMode.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_MoveMode.Text = \"移动页面模式(&Y)\";\r\n\t\t\t_MoveMode.ToolTipText = \"使用鼠标拖动页面\";\r\n\t\t\t// \r\n\t\t\t// _SelectionMode\r\n\t\t\t// \r\n\t\t\t_SelectionMode.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\t_SelectionMode.Name = \"_SelectionMode\";\r\n\t\t\t_SelectionMode.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_SelectionMode.Text = \"框选模式(&K)\";\r\n\t\t\t_SelectionMode.ToolTipText = \"框选文档内容，可复制所选内容、添加书签\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\ttoolStripSeparator1.Size = new System.Drawing.Size(205, 6);\r\n\t\t\t// \r\n\t\t\t// _ScrollVertical\r\n\t\t\t// \r\n\t\t\t_ScrollVertical.Checked = true;\r\n\t\t\t_ScrollVertical.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\t_ScrollVertical.Image = global::PDFPatcher.Properties.Resources.ScrollVertical;\r\n\t\t\t_ScrollVertical.Name = \"_ScrollVertical\";\r\n\t\t\t_ScrollVertical.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_ScrollVertical.Text = \"从上到下阅读(&S)\";\r\n\t\t\t// \r\n\t\t\t// _ScrollHorizontal\r\n\t\t\t// \r\n\t\t\t_ScrollHorizontal.Image = global::PDFPatcher.Properties.Resources.ScrollHorizontal;\r\n\t\t\t_ScrollHorizontal.Name = \"_ScrollHorizontal\";\r\n\t\t\t_ScrollHorizontal.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_ScrollHorizontal.Text = \"从右到左阅读(&Y)\";\r\n\t\t\t// \r\n\t\t\t// _FullPageScroll\r\n\t\t\t// \r\n\t\t\t_FullPageScroll.Name = \"_FullPageScroll\";\r\n\t\t\t_FullPageScroll.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_FullPageScroll.Text = \"整页翻页(&Z)\";\r\n\t\t\t_FullPageScroll.ToolTipText = \"按翻页键翻页时，按整页来翻页而不是按显示窗口翻页\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator6\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator6.Name = \"toolStripSeparator6\";\r\n\t\t\ttoolStripSeparator6.Size = new System.Drawing.Size(205, 6);\r\n\t\t\t// \r\n\t\t\t// _TrueColorSpace\r\n\t\t\t// \r\n\t\t\t_TrueColorSpace.Checked = true;\r\n\t\t\t_TrueColorSpace.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\t_TrueColorSpace.Image = global::PDFPatcher.Properties.Resources.ColorDisplay;\r\n\t\t\t_TrueColorSpace.Name = \"_TrueColorSpace\";\r\n\t\t\t_TrueColorSpace.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_TrueColorSpace.Text = \"彩色显示(&C)\";\r\n\t\t\t// \r\n\t\t\t// _GrayColorSpace\r\n\t\t\t// \r\n\t\t\t_GrayColorSpace.Image = global::PDFPatcher.Properties.Resources.GrayScaleDisplay;\r\n\t\t\t_GrayColorSpace.Name = \"_GrayColorSpace\";\r\n\t\t\t_GrayColorSpace.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_GrayColorSpace.Text = \"黑白显示(&H)\";\r\n\t\t\t// \r\n\t\t\t// _InvertColor\r\n\t\t\t// \r\n\t\t\t_InvertColor.Image = global::PDFPatcher.Properties.Resources.InvertColor;\r\n\t\t\t_InvertColor.Name = \"_InvertColor\";\r\n\t\t\t_InvertColor.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_InvertColor.Text = \"反转颜色(&F)\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkHere\r\n\t\t\t// \r\n\t\t\t_BookmarkHere.Image = global::PDFPatcher.Properties.Resources.BookmarkFile;\r\n\t\t\t_BookmarkHere.Name = \"_BookmarkHere\";\r\n\t\t\t_BookmarkHere.Size = new System.Drawing.Size(225, 22);\r\n\t\t\t_BookmarkHere.Text = \"在此插入书签(&S)...\";\r\n\t\t\t_BookmarkHere.ToolTipText = \"插入书签，指向当前位置\";\r\n\t\t\t// \r\n\t\t\t// _CopySelection\r\n\t\t\t// \r\n\t\t\t_CopySelection.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\t_CopySelection.Name = \"_CopySelection\";\r\n\t\t\t_CopySelection.Size = new System.Drawing.Size(225, 22);\r\n\t\t\t_CopySelection.Text = \"复制选中内容(&F)\";\r\n\t\t\t_CopySelection.ToolTipText = \"复制选中部分的图像\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator11\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator11.Name = \"toolStripSeparator11\";\r\n\t\t\ttoolStripSeparator11.Size = new System.Drawing.Size(205, 6);\r\n\t\t\t// \r\n\t\t\t// _OcrDisabled\r\n\t\t\t// \r\n\t\t\t_OcrDisabled.Name = \"_OcrDisabled\";\r\n\t\t\t_OcrDisabled.Size = new System.Drawing.Size(180, 22);\r\n\t\t\t_OcrDisabled.Text = \"不要识别文本(&B)\";\r\n\t\t\t// \r\n\t\t\t// _ShowTextBorders\r\n\t\t\t// \r\n\t\t\t_ShowTextBorders.Name = \"_ShowTextBorders\";\r\n\t\t\t_ShowTextBorders.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_ShowTextBorders.Text = \"显示文本边框\";\r\n\t\t\t// \r\n\t\t\t// _DarkMode\r\n\t\t\t// \r\n\t\t\t_DarkMode.Image = global::PDFPatcher.Properties.Resources.DarkMode;\r\n\t\t\t_DarkMode.Name = \"_DarkMode\";\r\n\t\t\t_DarkMode.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_DarkMode.Text = \"暗黑阅读模式(&A)\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator12\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator12.Name = \"toolStripSeparator12\";\r\n\t\t\ttoolStripSeparator12.Size = new System.Drawing.Size(205, 6);\r\n\t\t\t// \r\n\t\t\t// _GreenMode\r\n\t\t\t// \r\n\t\t\t_GreenMode.Image = global::PDFPatcher.Properties.Resources.GreenMode;\r\n\t\t\t_GreenMode.Name = \"_GreenMode\";\r\n\t\t\t_GreenMode.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_GreenMode.Text = \"绿色阅读模式(&L)\";\r\n\t\t\t// \r\n\t\t\t// _ShowBookmarks\r\n\t\t\t// \r\n\t\t\t_ShowBookmarks.Name = \"_ShowBookmarks\";\r\n\t\t\t_ShowBookmarks.ShortcutKeys = System.Windows.Forms.Keys.F12;\r\n\t\t\t_ShowBookmarks.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_ShowBookmarks.Text = \"显示书签栏(&Q)\";\r\n\t\t\t// \r\n\t\t\t// _InsertPageLabel\r\n\t\t\t// \r\n\t\t\t_InsertPageLabel.Image = global::PDFPatcher.Properties.Resources.PageRange;\r\n\t\t\t_InsertPageLabel.Name = \"_InsertPageLabel\";\r\n\t\t\t_InsertPageLabel.Size = new System.Drawing.Size(225, 22);\r\n\t\t\t_InsertPageLabel.Text = \"插入页码标签(&Y)...\";\r\n\t\t\t_InsertPageLabel.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _AutoBookmark\r\n\t\t\t// \r\n\t\t\t_AutoBookmark.Enabled = false;\r\n\t\t\t_AutoBookmark.Image = global::PDFPatcher.Properties.Resources.AutoBookmark;\r\n\t\t\t_AutoBookmark.Name = \"_AutoBookmark\";\r\n\t\t\t_AutoBookmark.Size = new System.Drawing.Size(225, 22);\r\n\t\t\t_AutoBookmark.Text = \"设置自动书签标题格式(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _SetOpenStatusTrue\r\n\t\t\t// \r\n\t\t\t_SetOpenStatusTrue.Name = \"_SetOpenStatusTrue\";\r\n\t\t\t_SetOpenStatusTrue.Size = new System.Drawing.Size(117, 22);\r\n\t\t\t_SetOpenStatusTrue.Text = \"打开(&D)\";\r\n\t\t\t// \r\n\t\t\t// _SetOpenStatusFalse\r\n\t\t\t// \r\n\t\t\t_SetOpenStatusFalse.Name = \"_SetOpenStatusFalse\";\r\n\t\t\t_SetOpenStatusFalse.Size = new System.Drawing.Size(117, 22);\r\n\t\t\t_SetOpenStatusFalse.Text = \"关闭(&G)\";\r\n\t\t\t// \r\n\t\t\t// _OcrDetectPunctuation\r\n\t\t\t// \r\n\t\t\t_OcrDetectPunctuation.Name = \"_OcrDetectPunctuation\";\r\n\t\t\t_OcrDetectPunctuation.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_OcrDetectPunctuation.Text = \"增强识别目录页标点\";\r\n\t\t\t// \r\n\t\t\t// _PageProperties\r\n\t\t\t// \r\n\t\t\t_PageProperties.Image = global::PDFPatcher.Properties.Resources.Property;\r\n\t\t\t_PageProperties.Name = \"_PageProperties\";\r\n\t\t\t_PageProperties.Size = new System.Drawing.Size(225, 22);\r\n\t\t\t_PageProperties.Text = \"查看页面属性(&X)...\";\r\n\t\t\t// \r\n\t\t\t// _MarkBookmark\r\n\t\t\t// \r\n\t\t\t_MarkBookmark.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _MarkBookmarkRed,\r\n            _MarkBookmarkYellow,\r\n            _MarkBookmarkGreen,\r\n            this._MarkBookmarkCyan,\r\n            _MarkBookmarkBlue,\r\n            _MarkBookmarkPurple,\r\n            toolStripSeparator5,\r\n            _UnmarkBookmark,\r\n            _ClearBookmarkMarks});\r\n\t\t\t_MarkBookmark.Image = global::PDFPatcher.Properties.Resources.Mark;\r\n\t\t\t_MarkBookmark.Name = \"_MarkBookmark\";\r\n\t\t\t_MarkBookmark.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_MarkBookmark.Text = \"标记书签(&B)\";\r\n\t\t\t_MarkBookmark.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _MarkBookmarkRed\r\n\t\t\t// \r\n\t\t\t_MarkBookmarkRed.Name = \"_MarkBookmarkRed\";\r\n\t\t\t_MarkBookmarkRed.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_MarkBookmarkRed.Text = \"红色\";\r\n\t\t\t// \r\n\t\t\t// _MarkBookmarkYellow\r\n\t\t\t// \r\n\t\t\t_MarkBookmarkYellow.Name = \"_MarkBookmarkYellow\";\r\n\t\t\t_MarkBookmarkYellow.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_MarkBookmarkYellow.Text = \"黄色\";\r\n\t\t\t// \r\n\t\t\t// _MarkBookmarkGreen\r\n\t\t\t// \r\n\t\t\t_MarkBookmarkGreen.Name = \"_MarkBookmarkGreen\";\r\n\t\t\t_MarkBookmarkGreen.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_MarkBookmarkGreen.Text = \"绿色\";\r\n\t\t\t// \r\n\t\t\t// _MarkBookmarkCyan\r\n\t\t\t// \r\n\t\t\tthis._MarkBookmarkCyan.Name = \"_MarkBookmarkCyan\";\r\n\t\t\tthis._MarkBookmarkCyan.Size = new System.Drawing.Size(148, 22);\r\n\t\t\tthis._MarkBookmarkCyan.Text = \"青色\";\r\n\t\t\t// \r\n\t\t\t// _MarkBookmarkBlue\r\n\t\t\t// \r\n\t\t\t_MarkBookmarkBlue.Name = \"_MarkBookmarkBlue\";\r\n\t\t\t_MarkBookmarkBlue.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_MarkBookmarkBlue.Text = \"蓝色\";\r\n\t\t\t// \r\n\t\t\t// _MarkBookmarkPurple\r\n\t\t\t// \r\n\t\t\t_MarkBookmarkPurple.Name = \"_MarkBookmarkPurple\";\r\n\t\t\t_MarkBookmarkPurple.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_MarkBookmarkPurple.Text = \"紫色\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator5\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator5.Name = \"toolStripSeparator5\";\r\n\t\t\ttoolStripSeparator5.Size = new System.Drawing.Size(145, 6);\r\n\t\t\t// \r\n\t\t\t// _UnmarkBookmark\r\n\t\t\t// \r\n\t\t\t_UnmarkBookmark.Image = global::PDFPatcher.Properties.Resources.Unmark;\r\n\t\t\t_UnmarkBookmark.Name = \"_UnmarkBookmark\";\r\n\t\t\t_UnmarkBookmark.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_UnmarkBookmark.Text = \"取消标记\";\r\n\t\t\t// \r\n\t\t\t// _ClearBookmarkMarks\r\n\t\t\t// \r\n\t\t\t_ClearBookmarkMarks.Name = \"_ClearBookmarkMarks\";\r\n\t\t\t_ClearBookmarkMarks.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_ClearBookmarkMarks.Text = \"清除所有标记\";\r\n\t\t\t// \r\n\t\t\t// _SelectMarkedBookmarks\r\n\t\t\t// \r\n\t\t\t_SelectMarkedBookmarks.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _SelectRedMarks,\r\n            _SelectYellowMarks,\r\n            _SelectGreenMarks,\r\n            _SelectCyanMarks,\r\n            _SelectBlueMarks,\r\n            _SelectPurpleMarks});\r\n\t\t\t_SelectMarkedBookmarks.Image = global::PDFPatcher.Properties.Resources.SelectMarks;\r\n\t\t\t_SelectMarkedBookmarks.Name = \"_SelectMarkedBookmarks\";\r\n\t\t\t_SelectMarkedBookmarks.Size = new System.Drawing.Size(245, 22);\r\n\t\t\t_SelectMarkedBookmarks.Text = \"选择已标记书签(&J)\";\r\n\t\t\t_SelectMarkedBookmarks.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SelectRedMarks\r\n\t\t\t// \r\n\t\t\t_SelectRedMarks.Name = \"_SelectRedMarks\";\r\n\t\t\t_SelectRedMarks.Size = new System.Drawing.Size(100, 22);\r\n\t\t\t_SelectRedMarks.Text = \"红色\";\r\n\t\t\t// \r\n\t\t\t// _SelectYellowMarks\r\n\t\t\t// \r\n\t\t\t_SelectYellowMarks.Name = \"_SelectYellowMarks\";\r\n\t\t\t_SelectYellowMarks.Size = new System.Drawing.Size(100, 22);\r\n\t\t\t_SelectYellowMarks.Text = \"黄色\";\r\n\t\t\t// \r\n\t\t\t// _SelectGreenMarks\r\n\t\t\t// \r\n\t\t\t_SelectGreenMarks.Name = \"_SelectGreenMarks\";\r\n\t\t\t_SelectGreenMarks.Size = new System.Drawing.Size(100, 22);\r\n\t\t\t_SelectGreenMarks.Text = \"绿色\";\r\n\t\t\t// \r\n\t\t\t// _SelectCyanMarks\r\n\t\t\t// \r\n\t\t\t_SelectCyanMarks.Name = \"_SelectCyanMarks\";\r\n\t\t\t_SelectCyanMarks.Size = new System.Drawing.Size(100, 22);\r\n\t\t\t_SelectCyanMarks.Text = \"青色\";\r\n\t\t\t// \r\n\t\t\t// _SelectBlueMarks\r\n\t\t\t// \r\n\t\t\t_SelectBlueMarks.Name = \"_SelectBlueMarks\";\r\n\t\t\t_SelectBlueMarks.Size = new System.Drawing.Size(100, 22);\r\n\t\t\t_SelectBlueMarks.Text = \"蓝色\";\r\n\t\t\t// \r\n\t\t\t// _SelectPurpleMarks\r\n\t\t\t// \r\n\t\t\t_SelectPurpleMarks.Name = \"_SelectPurpleMarks\";\r\n\t\t\t_SelectPurpleMarks.Size = new System.Drawing.Size(100, 22);\r\n\t\t\t_SelectPurpleMarks.Text = \"紫色\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator14\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator14.Name = \"toolStripSeparator14\";\r\n\t\t\ttoolStripSeparator14.Size = new System.Drawing.Size(205, 6);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator13\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator13.Name = \"toolStripSeparator13\";\r\n\t\t\ttoolStripSeparator13.Size = new System.Drawing.Size(242, 6);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator4\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator4.Name = \"toolStripSeparator4\";\r\n\t\t\ttoolStripSeparator4.Size = new System.Drawing.Size(242, 6);\r\n\t\t\t// \r\n\t\t\t// _ViewerButton\r\n\t\t\t// \r\n\t\t\tthis._ViewerButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._ViewerButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _MoveMode,\r\n            _SelectionMode,\r\n            toolStripSeparator11,\r\n            this._OcrMenu,\r\n            this._InsertWithOcrOnly,\r\n            _OcrDetectPunctuation,\r\n            toolStripSeparator1,\r\n            _ScrollVertical,\r\n            _ScrollHorizontal,\r\n            _FullPageScroll,\r\n            toolStripSeparator6,\r\n            _TrueColorSpace,\r\n            _GrayColorSpace,\r\n            toolStripSeparator12,\r\n            _InvertColor,\r\n            _DarkMode,\r\n            _GreenMode,\r\n            toolStripSeparator14,\r\n            _ShowBookmarks,\r\n            _ShowTextBorders,\r\n            this._ShowAnnotations});\r\n\t\t\tthis._ViewerButton.Image = global::PDFPatcher.Properties.Resources.CreateDocument;\r\n\t\t\tthis._ViewerButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._ViewerButton.Name = \"_ViewerButton\";\r\n\t\t\tthis._ViewerButton.Size = new System.Drawing.Size(29, 22);\r\n\t\t\tthis._ViewerButton.Text = \"阅读器\";\r\n\t\t\tthis._ViewerButton.ToolTipText = \"设置阅读器的操作方式\";\r\n\t\t\tthis._ViewerButton.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _OcrMenu\r\n\t\t\t// \r\n\t\t\tthis._OcrMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _OcrDisabled});\r\n\t\t\tthis._OcrMenu.Image = global::PDFPatcher.Properties.Resources.Ocr;\r\n\t\t\tthis._OcrMenu.Name = \"_OcrMenu\";\r\n\t\t\tthis._OcrMenu.Size = new System.Drawing.Size(208, 22);\r\n\t\t\tthis._OcrMenu.Text = \"识别文本语言(&W)\";\r\n\t\t\tthis._OcrMenu.ToolTipText = \"设置插入书签、识别页面文本时的识别引擎\";\r\n\t\t\t// \r\n\t\t\t// _InsertWithOcrOnly\r\n\t\t\t// \r\n\t\t\tthis._InsertWithOcrOnly.Name = \"_InsertWithOcrOnly\";\r\n\t\t\tthis._InsertWithOcrOnly.Size = new System.Drawing.Size(208, 22);\r\n\t\t\tthis._InsertWithOcrOnly.Text = \"插入书签仅使用识别引擎\";\r\n\t\t\t// \r\n\t\t\t// _ShowAnnotations\r\n\t\t\t// \r\n\t\t\tthis._ShowAnnotations.Name = \"_ShowAnnotations\";\r\n\t\t\tthis._ShowAnnotations.Size = new System.Drawing.Size(208, 22);\r\n\t\t\tthis._ShowAnnotations.Text = \"显示文档批注(&P)\";\r\n\t\t\t// \r\n\t\t\t// _EditMenu\r\n\t\t\t// \r\n\t\t\tthis._EditMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _BookmarkAction,\r\n            toolStripSeparator13,\r\n            _ShiftPageNumber,\r\n            _AlterPosition,\r\n            this._ChangeZoomRate,\r\n            this._SetOpenStatus,\r\n            _ForceInternalLink,\r\n            toolStripSeparator7,\r\n            _MergeBookmark,\r\n            this._ChangeCase,\r\n            _SearchReplace,\r\n            toolStripSeparator4,\r\n            _SelectItems,\r\n            this._QuickSelect,\r\n            _MarkBookmark,\r\n            _SelectMarkedBookmarks});\r\n\t\t\tthis._EditMenu.Name = \"_EditMenu\";\r\n\t\t\tthis._EditMenu.Size = new System.Drawing.Size(246, 308);\r\n\t\t\tthis._EditMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _ChangeZoomRate\r\n\t\t\t// \r\n\t\t\tthis._ChangeZoomRate.Image = global::PDFPatcher.Properties.Resources.Zoom;\r\n\t\t\tthis._ChangeZoomRate.Name = \"_ChangeZoomRate\";\r\n\t\t\tthis._ChangeZoomRate.Size = new System.Drawing.Size(245, 22);\r\n\t\t\tthis._ChangeZoomRate.Text = \"设置目标显示方式(&X)\";\r\n\t\t\t// \r\n\t\t\t// _SetOpenStatus\r\n\t\t\t// \r\n\t\t\tthis._SetOpenStatus.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _SetOpenStatusTrue,\r\n            _SetOpenStatusFalse});\r\n\t\t\tthis._SetOpenStatus.Image = global::PDFPatcher.Properties.Resources.Open;\r\n\t\t\tthis._SetOpenStatus.Name = \"_SetOpenStatus\";\r\n\t\t\tthis._SetOpenStatus.Size = new System.Drawing.Size(245, 22);\r\n\t\t\tthis._SetOpenStatus.Text = \"设置书签默认打开状态(&T)\";\r\n\t\t\t// \r\n\t\t\t// _ChangeCase\r\n\t\t\t// \r\n\t\t\tthis._ChangeCase.Image = global::PDFPatcher.Properties.Resources.ChangeCase;\r\n\t\t\tthis._ChangeCase.Name = \"_ChangeCase\";\r\n\t\t\tthis._ChangeCase.Size = new System.Drawing.Size(245, 22);\r\n\t\t\tthis._ChangeCase.Text = \"更改书签文本大小写(&W)\";\r\n\t\t\tthis._ChangeCase.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _QuickSelect\r\n\t\t\t// \r\n\t\t\tthis._QuickSelect.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\tthis._QuickSelect.Name = \"_QuickSelect\";\r\n\t\t\tthis._QuickSelect.Size = new System.Drawing.Size(245, 22);\r\n\t\t\tthis._QuickSelect.Text = \"快速选择书签(&K)\";\r\n\t\t\tthis._QuickSelect.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _RecentFileMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFileMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            dummyToolStripMenuItem});\r\n\t\t\tthis._RecentFileMenu.Name = \"_RecentFileMenu\";\r\n\t\t\tthis._RecentFileMenu.OwnerItem = this._AddFilesButton;\r\n\t\t\tthis._RecentFileMenu.ShowImageMargin = false;\r\n\t\t\tthis._RecentFileMenu.Size = new System.Drawing.Size(95, 26);\r\n\t\t\t// \r\n\t\t\t// _AddFilesButton\r\n\t\t\t// \r\n\t\t\tthis._AddFilesButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._AddFilesButton.DropDown = this._RecentFileMenu;\r\n\t\t\tthis._AddFilesButton.Image = global::PDFPatcher.Properties.Resources.OpenFile;\r\n\t\t\tthis._AddFilesButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilesButton.Name = \"_AddFilesButton\";\r\n\t\t\tthis._AddFilesButton.Size = new System.Drawing.Size(32, 22);\r\n\t\t\tthis._AddFilesButton.Text = \"打开\";\r\n\t\t\tthis._AddFilesButton.ToolTipText = \"打开需要编辑的PDF文件\";\r\n\t\t\tthis._AddFilesButton.ButtonClick += new System.EventHandler(this.ButtonClicked);\r\n\t\t\tthis._AddFilesButton.DropDownOpening += new System.EventHandler(this._OpenButton_DropDownOpening);\r\n\t\t\tthis._AddFilesButton.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._OpenButton_DropDownItemClicked);\r\n\t\t\t// \r\n\t\t\t// _UndoMenu\r\n\t\t\t// \r\n\t\t\tthis._UndoMenu.Name = \"_UndoMenu\";\r\n\t\t\tthis._UndoMenu.OwnerItem = this._UndoButton;\r\n\t\t\tthis._UndoMenu.ShowImageMargin = false;\r\n\t\t\tthis._UndoMenu.Size = new System.Drawing.Size(36, 4);\r\n\t\t\t// \r\n\t\t\t// _UndoButton\r\n\t\t\t// \r\n\t\t\tthis._UndoButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._UndoButton.DropDown = this._UndoMenu;\r\n\t\t\tthis._UndoButton.Enabled = false;\r\n\t\t\tthis._UndoButton.Image = global::PDFPatcher.Properties.Resources.Undo;\r\n\t\t\tthis._UndoButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._UndoButton.Name = \"_UndoButton\";\r\n\t\t\tthis._UndoButton.Size = new System.Drawing.Size(32, 22);\r\n\t\t\tthis._UndoButton.Text = \"撤销\";\r\n\t\t\tthis._UndoButton.ToolTipText = \"撤销\\r\\nCtrl+Z\";\r\n\t\t\tthis._UndoButton.ButtonClick += new System.EventHandler(this.ButtonClicked);\r\n\t\t\t// \r\n\t\t\t// _IncludeDecendantBox\r\n\t\t\t// \r\n\t\t\tthis._IncludeDecendantBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._IncludeDecendantBox.AutoSize = true;\r\n\t\t\tthis._IncludeDecendantBox.Location = new System.Drawing.Point(3, 275);\r\n\t\t\tthis._IncludeDecendantBox.Name = \"_IncludeDecendantBox\";\r\n\t\t\tthis._IncludeDecendantBox.Size = new System.Drawing.Size(210, 16);\r\n\t\t\tthis._IncludeDecendantBox.TabIndex = 1;\r\n\t\t\tthis._IncludeDecendantBox.Text = \"修改操作包含未选中的内部书签(&N)\";\r\n\t\t\tthis._IncludeDecendantBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _BookmarkBox\r\n\t\t\t// \r\n\t\t\tthis._BookmarkBox.AllowDrop = true;\r\n\t\t\tthis._BookmarkBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BookmarkBox.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._BookmarkBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._BookmarkBox.ContextMenuStrip = this._EditMenu;\r\n\t\t\tthis._BookmarkBox.CopySelectionOnControlC = false;\r\n\t\t\tthis._BookmarkBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._BookmarkBox.GridLines = true;\r\n\t\t\tthis._BookmarkBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._BookmarkBox.IsSimpleDragSource = true;\r\n\t\t\tthis._BookmarkBox.IsSimpleDropSink = true;\r\n\t\t\tthis._BookmarkBox.LabelEdit = true;\r\n\t\t\tthis._BookmarkBox.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._BookmarkBox.Name = \"_BookmarkBox\";\r\n\t\t\tthis._BookmarkBox.OperationAffectsDescendants = false;\r\n\t\t\tthis._BookmarkBox.RevealAfterExpand = false;\r\n\t\t\tthis._BookmarkBox.SelectedBackColor = System.Drawing.SystemColors.Window;\r\n\t\t\tthis._BookmarkBox.SelectedForeColor = System.Drawing.SystemColors.WindowText;\r\n\t\t\tthis._BookmarkBox.ShowGroups = false;\r\n\t\t\tthis._BookmarkBox.Size = new System.Drawing.Size(261, 266);\r\n\t\t\tthis._BookmarkBox.TabIndex = 0;\r\n\t\t\tthis._BookmarkBox.UnfocusedSelectedBackColor = System.Drawing.SystemColors.Window;\r\n\t\t\tthis._BookmarkBox.UnfocusedSelectedForeColor = System.Drawing.SystemColors.WindowText;\r\n\t\t\tthis._BookmarkBox.UseCellFormatEvents = true;\r\n\t\t\tthis._BookmarkBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._BookmarkBox.UseHyperlinks = true;\r\n\t\t\tthis._BookmarkBox.UseOverlays = false;\r\n\t\t\tthis._BookmarkBox.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._BookmarkBox.VirtualMode = true;\r\n\t\t\tthis._BookmarkBox.DragDrop += new System.Windows.Forms.DragEventHandler(this._BookmarkBox_DragDrop);\r\n\t\t\tthis._BookmarkBox.DragEnter += new System.Windows.Forms.DragEventHandler(this._BookmarkBox_DragEnter);\r\n\t\t\t// \r\n\t\t\t// _MainPanel\r\n\t\t\t// \r\n\t\t\tthis._MainPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._MainPanel.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\r\n\t\t\tthis._MainPanel.Location = new System.Drawing.Point(3, 29);\r\n\t\t\tthis._MainPanel.Name = \"_MainPanel\";\r\n\t\t\t// \r\n\t\t\t// _MainPanel.Panel1\r\n\t\t\t// \r\n\t\t\tthis._MainPanel.Panel1.Controls.Add(this._IncludeDecendantBox);\r\n\t\t\tthis._MainPanel.Panel1.Controls.Add(this._BookmarkBox);\r\n\t\t\t// \r\n\t\t\t// _MainPanel.Panel2\r\n\t\t\t// \r\n\t\t\tthis._MainPanel.Panel2.Controls.Add(this._PageInfoBox);\r\n\t\t\tthis._MainPanel.Panel2.Controls.Add(this._ViewerBox);\r\n\t\t\tthis._MainPanel.Size = new System.Drawing.Size(627, 294);\r\n\t\t\tthis._MainPanel.SplitterDistance = 268;\r\n\t\t\tthis._MainPanel.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _PageInfoBox\r\n\t\t\t// \r\n\t\t\tthis._PageInfoBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageInfoBox.AutoEllipsis = true;\r\n\t\t\tthis._PageInfoBox.Location = new System.Drawing.Point(3, 276);\r\n\t\t\tthis._PageInfoBox.Name = \"_PageInfoBox\";\r\n\t\t\tthis._PageInfoBox.Size = new System.Drawing.Size(349, 15);\r\n\t\t\tthis._PageInfoBox.TabIndex = 1;\r\n\t\t\tthis._PageInfoBox.Text = \"PDF 页面信息\";\r\n\t\t\t// \r\n\t\t\t// _ViewerBox\r\n\t\t\t// \r\n\t\t\tthis._ViewerBox.AllowUnfocusedMouseWheel = true;\r\n\t\t\tthis._ViewerBox.AllowZoom = false;\r\n\t\t\tthis._ViewerBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ViewerBox.BackColor = System.Drawing.Color.DarkGray;\r\n\t\t\tthis._ViewerBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r\n\t\t\tthis._ViewerBox.GridDisplayMode = Cyotek.Windows.Forms.ImageBoxGridDisplayMode.None;\r\n\t\t\tthis._ViewerBox.LiteralZoom = null;\r\n\t\t\tthis._ViewerBox.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._ViewerBox.Name = \"_ViewerBox\";\r\n\t\t\tthis._ViewerBox.OcrLanguage = 2052;\r\n\t\t\tthis._ViewerBox.PinPoint = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._ViewerBox.Size = new System.Drawing.Size(349, 266);\r\n\t\t\tthis._ViewerBox.TabIndex = 0;\r\n\t\t\tthis._ViewerBox.TintColor = System.Drawing.Color.Transparent;\r\n\t\t\tthis._ViewerBox.VirtualMode = true;\r\n\t\t\t// \r\n\t\t\t// _ViewerMenu\r\n\t\t\t// \r\n\t\t\tthis._ViewerMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _BookmarkHere,\r\n            _AutoBookmark,\r\n            _CopySelection,\r\n            this._OcrPage,\r\n            _InsertPageLabel,\r\n            _PageProperties,\r\n            this._SavePageImage});\r\n\t\t\tthis._ViewerMenu.Name = \"_ViewerMenu\";\r\n\t\t\tthis._ViewerMenu.Size = new System.Drawing.Size(226, 158);\r\n\t\t\tthis._ViewerMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _OcrPage\r\n\t\t\t// \r\n\t\t\tthis._OcrPage.Image = global::PDFPatcher.Properties.Resources.Ocr;\r\n\t\t\tthis._OcrPage.Name = \"_OcrPage\";\r\n\t\t\tthis._OcrPage.Size = new System.Drawing.Size(225, 22);\r\n\t\t\tthis._OcrPage.Text = \"复制本页文本识别结果(&W)...\";\r\n\t\t\tthis._OcrPage.ToolTipText = \"调用图像识别引擎识别选中图像内容的文本\";\r\n\t\t\t// \r\n\t\t\t// _SavePageImage\r\n\t\t\t// \r\n\t\t\tthis._SavePageImage.Image = global::PDFPatcher.Properties.Resources.RenderImage;\r\n\t\t\tthis._SavePageImage.Name = \"_SavePageImage\";\r\n\t\t\tthis._SavePageImage.Size = new System.Drawing.Size(225, 22);\r\n\t\t\tthis._SavePageImage.Text = \"保存为图片(&P)...\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkToolbar\r\n\t\t\t// \r\n\t\t\tthis._BookmarkToolbar.Dock = System.Windows.Forms.DockStyle.None;\r\n\t\t\tthis._BookmarkToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AddFilesButton,\r\n            this._SavePDF,\r\n            this._SaveBookmark,\r\n            this._UndoButton,\r\n            _Copy,\r\n            _Paste,\r\n            _DeleteBookmark,\r\n            toolStripSeparator2,\r\n            _InsertBookmark,\r\n            _LevelUp,\r\n            _LevelDown,\r\n            this._BookmarkBoldButton,\r\n            this._BookmarkItalicButton,\r\n            this._BookmarkColorButton});\r\n\t\t\tthis._BookmarkToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._BookmarkToolbar.Name = \"_BookmarkToolbar\";\r\n\t\t\tthis._BookmarkToolbar.Size = new System.Drawing.Size(344, 25);\r\n\t\t\tthis._BookmarkToolbar.TabIndex = 2;\r\n\t\t\tthis._BookmarkToolbar.Text = \"menuStrip1\";\r\n\t\t\tthis._BookmarkToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SavePDF\r\n\t\t\t// \r\n\t\t\tthis._SavePDF.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._SavePDF.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._SavePDF.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._SavePDF.Name = \"_SavePDF\";\r\n\t\t\tthis._SavePDF.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._SavePDF.Text = \"保存PDF文件\";\r\n\t\t\tthis._SavePDF.ToolTipText = \"保存PDF文件\\r\\nCtrl+S\";\r\n\t\t\t// \r\n\t\t\t// _SaveBookmark\r\n\t\t\t// \r\n\t\t\tthis._SaveBookmark.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._SaveBookmark.Image = global::PDFPatcher.Properties.Resources.ExportInfoFile;\r\n\t\t\tthis._SaveBookmark.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._SaveBookmark.Name = \"_SaveBookmark\";\r\n\t\t\tthis._SaveBookmark.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._SaveBookmark.Text = \"保存书签文件\";\r\n\t\t\tthis._SaveBookmark.ToolTipText = \"保存书签文件\\r\\nCtrl+Q\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkBoldButton\r\n\t\t\t// \r\n\t\t\tthis._BookmarkBoldButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._BookmarkBoldButton.Image = global::PDFPatcher.Properties.Resources.Bold;\r\n\t\t\tthis._BookmarkBoldButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._BookmarkBoldButton.Name = \"_BookmarkBoldButton\";\r\n\t\t\tthis._BookmarkBoldButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._BookmarkBoldButton.Text = \"粗体\";\r\n\t\t\tthis._BookmarkBoldButton.ToolTipText = \"切换书签文本的粗体样式\\r\\nCtrl+B\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkItalicButton\r\n\t\t\t// \r\n\t\t\tthis._BookmarkItalicButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._BookmarkItalicButton.Image = global::PDFPatcher.Properties.Resources.Italic;\r\n\t\t\tthis._BookmarkItalicButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._BookmarkItalicButton.Name = \"_BookmarkItalicButton\";\r\n\t\t\tthis._BookmarkItalicButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._BookmarkItalicButton.Text = \"斜体\";\r\n\t\t\tthis._BookmarkItalicButton.ToolTipText = \"切换书签文本的斜体样式\\r\\nCtrl+I\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkColorButton\r\n\t\t\t// \r\n\t\t\tthis._BookmarkColorButton.ButtonDisplayStyle = ColorPicker.ToolStripColorPickerDisplayType.UnderLineAndImage;\r\n\t\t\tthis._BookmarkColorButton.Color = System.Drawing.Color.Black;\r\n\t\t\tthis._BookmarkColorButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._BookmarkColorButton.Image = ((System.Drawing.Image)(resources.GetObject(\"_BookmarkColorButton.Image\")));\r\n\t\t\tthis._BookmarkColorButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._BookmarkColorButton.Name = \"_BookmarkColorButton\";\r\n\t\t\tthis._BookmarkColorButton.Size = new System.Drawing.Size(32, 22);\r\n\t\t\tthis._BookmarkColorButton.Text = \"颜色\";\r\n\t\t\tthis._BookmarkColorButton.ToolTipText = \"设置书签文本的颜色\";\r\n\t\t\tthis._BookmarkColorButton.SelectedColorChanged += new System.EventHandler(this._BookmarkColorButton_SelectedColorChanged);\r\n\t\t\tthis._BookmarkColorButton.ButtonClick += new System.EventHandler(this._BookmarkColorButton_SelectedColorChanged);\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem20\r\n\t\t\t// \r\n\t\t\tthis.toolStripMenuItem20.Name = \"toolStripMenuItem20\";\r\n\t\t\tthis.toolStripMenuItem20.Size = new System.Drawing.Size(158, 22);\r\n\t\t\tthis.toolStripMenuItem20.Text = \"全部折叠\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem21\r\n\t\t\t// \r\n\t\t\tthis.toolStripMenuItem21.Name = \"toolStripMenuItem21\";\r\n\t\t\tthis.toolStripMenuItem21.Size = new System.Drawing.Size(158, 22);\r\n\t\t\tthis.toolStripMenuItem21.Text = \"折叠子书签\";\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem22\r\n\t\t\t// \r\n\t\t\tthis.toolStripMenuItem22.Name = \"toolStripMenuItem22\";\r\n\t\t\tthis.toolStripMenuItem22.Size = new System.Drawing.Size(158, 22);\r\n\t\t\tthis.toolStripMenuItem22.Text = \"全部展开\";\r\n\t\t\t// \r\n\t\t\t// _ViewerToolbar\r\n\t\t\t// \r\n\t\t\tthis._ViewerToolbar.Dock = System.Windows.Forms.DockStyle.None;\r\n\t\t\tthis._ViewerToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _FirstPage,\r\n            _PreviousPage,\r\n            this._CurrentPageBox,\r\n            _NextPage,\r\n            _LastPage,\r\n            this._ZoomBox,\r\n            this._ViewerButton});\r\n\t\t\tthis._ViewerToolbar.Location = new System.Drawing.Point(342, 0);\r\n\t\t\tthis._ViewerToolbar.Name = \"_ViewerToolbar\";\r\n\t\t\tthis._ViewerToolbar.Size = new System.Drawing.Size(293, 25);\r\n\t\t\tthis._ViewerToolbar.TabIndex = 4;\r\n\t\t\tthis._ViewerToolbar.Text = \"toolStrip1\";\r\n\t\t\tthis._ViewerToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _CurrentPageBox\r\n\t\t\t// \r\n\t\t\tthis._CurrentPageBox.Name = \"_CurrentPageBox\";\r\n\t\t\tthis._CurrentPageBox.Size = new System.Drawing.Size(50, 25);\r\n\t\t\tthis._CurrentPageBox.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center;\r\n\t\t\t// \r\n\t\t\t// _ZoomBox\r\n\t\t\t// \r\n\t\t\tthis._ZoomBox.Items.AddRange(new object[] {\r\n            \"适合页面\",\r\n            \"适合页宽\",\r\n            \"适合页高\",\r\n            \"20%\",\r\n            \"30%\",\r\n            \"50%\",\r\n            \"75%\",\r\n            \"100%\",\r\n            \"133%\",\r\n            \"150%\",\r\n            \"200%\",\r\n            \"300%\",\r\n            \"400%\"});\r\n\t\t\tthis._ZoomBox.Name = \"_ZoomBox\";\r\n\t\t\tthis._ZoomBox.Size = new System.Drawing.Size(75, 25);\r\n\t\t\t// \r\n\t\t\t// EditorControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._MainPanel);\r\n\t\t\tthis.Controls.Add(this._ViewerToolbar);\r\n\t\t\tthis.Controls.Add(this._BookmarkToolbar);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"EditorControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(633, 323);\r\n\t\t\tthis._SelectionMenu.ResumeLayout(false);\r\n\t\t\tthis._EditMenu.ResumeLayout(false);\r\n\t\t\tthis._RecentFileMenu.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BookmarkBox)).EndInit();\r\n\t\t\tthis._MainPanel.Panel1.ResumeLayout(false);\r\n\t\t\tthis._MainPanel.Panel1.PerformLayout();\r\n\t\t\tthis._MainPanel.Panel2.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MainPanel)).EndInit();\r\n\t\t\tthis._MainPanel.ResumeLayout(false);\r\n\t\t\tthis._ViewerMenu.ResumeLayout(false);\r\n\t\t\tthis._BookmarkToolbar.ResumeLayout(false);\r\n\t\t\tthis._BookmarkToolbar.PerformLayout();\r\n\t\t\tthis._ViewerToolbar.ResumeLayout(false);\r\n\t\t\tthis._ViewerToolbar.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _EditMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ChangeZoomRate;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SetOpenStatus;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _UndoMenu;\r\n\t\tprivate PDFPatcher.Functions.BookmarkEditorView _BookmarkBox;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SelectionMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _CollapseAll;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ExpandAll;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFileMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _CollapseChildren;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ChangeCase;\r\n\t\tprivate System.Windows.Forms.CheckBox _IncludeDecendantBox;\r\n\t\tprivate System.Windows.Forms.SplitContainer _MainPanel;\r\n\t\tprivate ViewerControl _ViewerBox;\r\n\t\tprivate System.Windows.Forms.Label _PageInfoBox;\r\n\t\tprivate System.Windows.Forms.ToolStrip _BookmarkToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _UndoButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _BookmarkBoldButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _BookmarkItalicButton;\r\n\t\tprivate ColorPicker.ToolStripColorPicker _BookmarkColorButton;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8;\r\n\t\tprivate System.Windows.Forms.ToolStripSeparator toolStripSeparator9;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem toolStripMenuItem20;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem toolStripMenuItem21;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem toolStripMenuItem22;\r\n\t\tprivate System.Windows.Forms.ToolStrip _ViewerToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripTextBox _CurrentPageBox;\r\n\t\tprivate System.Windows.Forms.ToolStripComboBox _ZoomBox;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _AddFilesButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _ViewerMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _OcrPage;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _SavePDF;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _SaveBookmark;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _OcrMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripDropDownButton _ViewerButton;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _QuickSelect;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _MarkBookmarkCyan;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SavePageImage;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ShowAnnotations;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _InsertWithOcrOnly;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SetCurrentCoordinates;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ExpandSelection;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _CollapseSelection;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SelectChildren;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/EditorControl.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Security.Permissions;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing MuPDF.Extensions;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic sealed partial class EditorControl : FunctionControl, IDocumentEditor, Editor.IEditView\r\n\t{\r\n\t\tstatic readonly Color __DarkModeColor = Color.DarkGray;\r\n\t\tstatic readonly Color __GreenModeColor = Color.FromArgb(0xCC, 0xFF, 0xCC);\r\n\r\n\t\tSearchBookmarkForm _searchForm;\r\n\t\tAutoBookmarkForm _autoBookmarkForm;\r\n\t\treadonly Editor.Controller _controller;\r\n\r\n\t\tpublic EditorControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_controller = new Editor.Controller(this);\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tpublic override string FunctionName => \"文档编辑器\";\r\n\r\n\t\tpublic override Bitmap IconImage => Properties.Resources.Editor;\r\n\r\n\t\tpublic string DocumentPath {\r\n\t\t\tget => _controller?.Model.DocumentPath;\r\n\t\t\tset {\r\n\t\t\t\t_controller.Model.DocumentPath = value;\r\n\t\t\t\tDocumentChanged?.Invoke(this, new DocumentChangedEventArgs(value));\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic bool IsBusy => _controller.IsBusy;\r\n\t\tpublic bool IsDirty => _controller.Model.Undo.IsDirty;\r\n\r\n\t\tpublic event EventHandler<DocumentChangedEventArgs> DocumentChanged;\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tnew Editor.Parts.BookmarkInViewSynchronizer(_BookmarkBox, _ViewerBox);\r\n\t\t\tnew Editor.Parts.BookmarkTitleEditHandler(_controller);\r\n\t\t\tListRecentFiles = _OpenButton_DropDownOpening;\r\n\t\t\tRecentFileItemClicked = _OpenButton_DropDownItemClicked;\r\n\t\t\tvar s = this.GetDpiScale();\r\n\t\t\tvar size = new Size((int)(s * 16), (int)(s * 16));\r\n\t\t\t_BookmarkToolbar.ScaleIcons(size);\r\n\t\t\t_ViewerToolbar.ScaleIcons(size);\r\n\t\t\t_EditMenu.ScaleIcons(size);\r\n\t\t\t_RecentFileMenu.ScaleIcons(size);\r\n\t\t\t_SelectionMenu.ScaleIcons(size);\r\n\t\t\t_UndoMenu.ScaleIcons(size);\r\n\t\t\t_ViewerMenu.ScaleIcons(size);\r\n\t\t\t_BookmarkBox.ScaleColumnWidths(s);\r\n\t\t\t_ViewerToolbar.Left = _BookmarkToolbar.Right;\r\n\t\t\t_MainPanel.SplitterDistance = (int)(_MainPanel.SplitterDistance * FormHelper.GetDpiScale(this));\r\n\t\t\t_MainPanel.FixedPanel = FixedPanel.Panel1;\r\n\t\t\t//_MainToolbar.ToggleEnabled (false, _editButtonNames);\r\n\r\n\r\n\t\t\tCreateChangeZoomRateItems();\r\n\r\n\t\t\t_ChangeZoomRate.DropDownItemClicked += _MainToolbar_ItemClicked;\r\n\t\t\t_ChangeCase.DropDownItemClicked += (object s, ToolStripItemClickedEventArgs args) => {\r\n\t\t\t\targs.ClickedItem.HidePopupMenu();\r\n\t\t\t\t_EditMenu.Hide();\r\n\t\t\t\tvar i = Array.IndexOf(SetCaseProcessor.CaseNames, args.ClickedItem.Text);\r\n\t\t\t\tif (i != -1) {\r\n\t\t\t\t\t_controller.ProcessBookmarks(new SetCaseProcessor((SetCaseProcessor.LetterCase)i));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tforeach (int item in Enum.GetValues(typeof(SetCaseProcessor.LetterCase))) {\r\n\t\t\t\t_ChangeCase.DropDownItems.Add(SetCaseProcessor.CaseNames[item]);\r\n\t\t\t}\r\n\t\t\t_SetOpenStatus.DropDownItemClicked += _MainToolbar_ItemClicked;\r\n\r\n\t\t\tAppContext.MainForm.SetTooltip(_IncludeDecendantBox, \"选中此选项后，加粗、斜体等其它修改书签的操作将应用到选中书签的子书签\");\r\n\t\t\t_IncludeDecendantBox.CheckedChanged += (s, args) => _BookmarkBox.OperationAffectsDescendants = _IncludeDecendantBox.Checked;\r\n\r\n\t\t\t_UndoButton.DropDownOpening += (object s, EventArgs args) => {\r\n\t\t\t\tvar mi = _UndoMenu.Items;\r\n\t\t\t\tmi.Clear();\r\n\t\t\t\tforeach (var item in _controller.Model.Undo.GetActionNames(16)) {\r\n\t\t\t\t\tmi.Add(item);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_UndoButton.DropDownItemClicked += (s, args) => _controller.Undo(args.ClickedItem.Owner.Items.IndexOf(args.ClickedItem) + 1);\r\n\t\t\tEditor.QuickSelectCommand.RegisterMenuItems(_QuickSelect.DropDownItems);\r\n\t\t\t_CurrentPageBox.KeyUp += (s, args) => {\r\n\t\t\t\tint d;\r\n\t\t\t\tswitch (args.KeyCode) {\r\n\t\t\t\t\tcase Keys.Enter:\r\n\t\t\t\t\t\td = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Keys.Up:\r\n\t\t\t\t\tcase Keys.OemMinus:\r\n\t\t\t\t\t\td = -1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Keys.Down:\r\n\t\t\t\t\tcase Keys.Add:\r\n\t\t\t\t\t\td = 1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Keys.Home:\r\n\t\t\t\t\t\t_ViewerBox.CurrentPageNumber = 1;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tcase Keys.End:\r\n\t\t\t\t\t\t_ViewerBox.CurrentPageNumber = -1;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (_CurrentPageBox.Text.TryParse(out int p)) {\r\n\t\t\t\t\t_ViewerBox.CurrentPageNumber = p + d;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ViewerButton.DropDownOpening += (s, args) => SetupMenu(_ViewerButton.DropDownItems);\r\n\t\t\t_OcrMenu.DropDownItemClicked += (s, args) => _ViewerBox.OcrLanguage = (int)(args.ClickedItem.Tag ?? 0);\r\n\t\t\t_OcrMenu.DropDownOpening += (s, args) => {\r\n\t\t\t\tvar m = _OcrMenu.DropDownItems;\r\n\t\t\t\tif (m.Count == 1) {\r\n\t\t\t\t\tfor (int i = 0; i < Constants.Ocr.LangIDs.Length; i++) {\r\n\t\t\t\t\t\tvar item = new ToolStripMenuItem(Constants.Ocr.LangNames[i]);\r\n\t\t\t\t\t\tm.Add(item);\r\n\t\t\t\t\t\titem.Tag = Constants.Ocr.LangIDs[i];\r\n\t\t\t\t\t\titem.Enabled = ModiOcr.IsLanguageInstalled(Constants.Ocr.LangIDs[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tforeach (ToolStripMenuItem item in _OcrMenu.DropDownItems) {\r\n\t\t\t\t\titem.Checked = _ViewerBox.OcrLanguage == (int)(item.Tag ?? 0);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ZoomBox.Enabled = false;\r\n\t\t\t_ZoomBox.TextChanged += (s, args) => _ViewerBox.LiteralZoom = _ZoomBox.Text;\r\n\t\t\t_ViewerBox.Enabled = false;\r\n\t\t\t_ViewerBox.DocumentLoaded += _ViewerBoxInitializeAfterDocumentLoad;\r\n\t\t\t_ViewerBox.ZoomChanged += (s, args) => {\r\n\t\t\t\t_ZoomBox.ToolTipText = \"当前显示比例：\" + (_ViewerBox.ZoomFactor * 100).ToInt32() + \"%\";\r\n\t\t\t\tAppContext.Reader.Zoom = _ViewerBox.LiteralZoom;\r\n\t\t\t\t_ZoomBox.Text = _ViewerBox.LiteralZoom;\r\n\t\t\t};\r\n\t\t\t_ViewerBox.PageChanged += (s, args) => _CurrentPageBox.Text = _ViewerBox.CurrentPageNumber.ToText();\r\n\t\t\t_ViewerBox.ContentDirectionChanged += (s, args) => AppContext.Reader.ContentDirection = ((ViewerControl)s).ContentDirection;\r\n\t\t\t_ViewerBox.PageScrollModeChanged += (s, args) => AppContext.Reader.FullPageScroll = ((ViewerControl)s).FullPageScroll;\r\n\t\t\t//_ViewerBox.SelectionChanged += (s, args) =>\r\n\t\t\t//{\r\n\t\t\t//\tvar t = args.Selection.SelectedText;\r\n\t\t\t//\tif (String.IsNullOrEmpty (t) == false) {\r\n\t\t\t//\t\tvar p = _ViewerBox.ViewBox.SelectionRegion;\r\n\t\t\t//        ShowInsertBookmarkDialog (_ViewerBox.ViewBox.PointToClient (MousePosition), _ViewerBox.MapPositionFromImagePoint (p.Left.ToInt32 (), p.Top.ToInt32 ()), t);\r\n\t\t\t//\t}\r\n\t\t\t//};\r\n\t\t\t//_ViewerBox.MouseMode = Editor.MouseMode.Selection;\r\n\t\t\t_ViewerBox.MouseMove += (s, args) => {\r\n\t\t\t\tif (_ViewerBox.FirstPage == 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar l = args.Location;\r\n\t\t\t\tvar p = _ViewerBox.TransposeClientToPagePosition(l.X, l.Y);\r\n\t\t\t\tif (p.Page == 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar ti = _ViewerBox.FindTextLines(p);\r\n\t\t\t\tvar t = ti.ToString();\r\n\t\t\t\t_PageInfoBox.Text = string.Concat(\"页面：\",\r\n\t\t\t\t\tp.Page,\r\n\t\t\t\t\t\"; 位置：\",\r\n\t\t\t\t\tMath.Round(p.PageX, 2),\r\n\t\t\t\t\t\" * \",\r\n\t\t\t\t\tMath.Round(p.PageY, 2),\r\n\t\t\t\t\tti.Spans.HasContent() ? String.Concat(\"; 字体：\", String.Join(\";\", ti.GetFontNames()), \" \", ti.Spans[0].Size) : null,\r\n\t\t\t\t\tt != null ? \"; 文本：\" : null,\r\n\t\t\t\t\tt);\r\n\t\t\t};\r\n\t\t\t_ViewerBox.MouseClick += _ViewBox_MouseClick;\r\n\t\t\t_ViewerToolbar.Enabled = false;\r\n\r\n\t\t\tDisposed += (s, args) => _controller.Destroy();\r\n\t\t}\r\n\r\n\t\tprivate void CreateChangeZoomRateItems() {\r\n\t\t\tvar di = _ChangeZoomRate.DropDownItems;\r\n\t\t\tdi.AddRange(Array.ConvertAll(Constants.DestinationAttributes.ViewType.Names, n => new ToolStripMenuItem { Name = n, Text = n }));\r\n\t\t\tdi.RemoveByKey(Constants.DestinationAttributes.ViewType.FitR);\r\n\t\t\tdi[0].Text += \"...\";\r\n\t\t\tdi.Insert(0, new ToolStripMenuItem { Name = Constants.Coordinates.Unchanged, Text = Constants.Coordinates.Unchanged });\r\n\t\t\tfor (int i = 0; i < di.Count; i++) {\r\n\t\t\t\tdi[i].Text += $\"(&{i})\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ViewerBoxInitializeAfterDocumentLoad(object sender, EventArgs e) {\r\n\t\t\t_ViewerBox.ContentDirection = AppContext.Reader.ContentDirection;\r\n\t\t\t_ViewerBox.FullPageScroll = AppContext.Reader.FullPageScroll;\r\n\t\t\t_CurrentPageBox.ToolTipText = $\"文档共{_ViewerBox.Document.PageCount}页\\nHome：转到第一页\\nEnd：转到最后一页\";\r\n\t\t\t_ZoomBox.Text = _ViewerBox.LiteralZoom = AppContext.Reader.Zoom.SubstituteDefault(Constants.DestinationAttributes.ViewType.FitH);\r\n\t\t\t_ZoomBox.Enabled = true;\r\n\t\t}\r\n\r\n\t\t//protected override void OnClick (EventArgs e) {\r\n\t\t//\tbase.OnClick (e);\r\n\t\t//\t_controller.HideInsertBookmarkForm ();\r\n\t\t//}\r\n\t\tinternal override void OnDeselected() {\r\n\t\t\tbase.OnDeselected();\r\n\t\t\t_searchForm?.Close();\r\n\t\t}\r\n\r\n\t\tvoid _ViewBox_MouseClick(object sender, MouseEventArgs args) {\r\n\t\t\tif (_ViewerBox.FirstPage == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar l = args.Location;\r\n\t\t\tif (args.Button != MouseButtons.Right) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_ViewerBox.PinPoint = _ViewerBox.PointToImage(l);\r\n\t\t\tSetupMenu(_ViewerMenu.Items);\r\n\t\t\t_ViewerMenu.Show(_ViewerBox, l);\r\n\t\t\tif (_ViewerBox.IsClientPointInSelection(l) == false) {\r\n\t\t\t\t_ViewerBox.SelectNone();\r\n\t\t\t}\r\n\t\t\t//_ViewerBox.Invalidate ();\r\n\t\t\t//var sp = _ViewerBox.FindTextSpanAtPoint (p);\r\n\t\t\t//var t = sp != null ? sp.Text : String.Empty;\r\n\t\t\t//_controller.ShowInsertBookmarkDialog (l, p, t);\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\te.ClickedItem.HidePopupMenu();\r\n\t\t\tExecuteCommand(e.ClickedItem.Name);\r\n\t\t}\r\n\r\n\t\tvoid ButtonClicked(object sender, EventArgs e) {\r\n\t\t\tif (sender == _UndoButton) {\r\n\t\t\t\t_controller.Undo(1);\r\n\t\t\t}\r\n\t\t\telse if (sender == _AddFilesButton) {\r\n\t\t\t\tExecuteCommand(Commands.Open);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tvar n = item.Name;\r\n\t\t\tvar l = _controller.Model.DocumentPath != null;\r\n\t\t\tvar m = item as ToolStripMenuItem;\r\n\t\t\tif (_controller.Model.IsLoadingDocument) {\r\n\t\t\t\titem.Enabled = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (n) {\r\n\t\t\t\tcase Commands.Action:\r\n\t\t\t\t\tEnableCommand(item, l, true);\r\n\t\t\t\t\titem.ToolTipText = \"将书签和编辑结果写入到 PDF 文件中\";\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SaveBookmark:\r\n\t\t\t\tcase Commands.SaveAsInfoFile:\r\n\t\t\t\t\tEnableCommand(item, l, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllFolders:\r\n\t\t\t\tcase Commands.SelectAllImages:\r\n\t\t\t\tcase Commands.SelectAllPdf:\r\n\t\t\t\tcase Commands.ItemTypeSeparator:\r\n\t\t\t\t\tEnableCommand(item, false, false);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.ResetOptions:\r\n\t\t\t\t\t// keep disabled\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.DocumentProperties:\r\n\t\t\t\t\titem.Enabled = _ViewerBox.Document != null && _ViewerBox.Document.IsDisposed == false;\r\n\t\t\t\t\titem.Visible = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_ScrollVertical\": m.Checked = _ViewerBox.ContentDirection == Editor.ContentDirection.TopToDown; break;\r\n\t\t\t\tcase \"_ScrollHorizontal\": m.Checked = _ViewerBox.ContentDirection == Editor.ContentDirection.RightToLeft; break;\r\n\t\t\t\tcase \"_TrueColorSpace\": m.Checked = _ViewerBox.GrayScale == false; break;\r\n\t\t\t\tcase \"_GrayColorSpace\": m.Checked = _ViewerBox.GrayScale; break;\r\n\t\t\t\tcase \"_InvertColor\": m.Checked = _ViewerBox.InvertColor; break;\r\n\t\t\t\tcase \"_MoveMode\": m.Checked = _ViewerBox.MouseMode == Editor.MouseMode.Move; break;\r\n\t\t\t\tcase \"_SelectionMode\": m.Checked = _ViewerBox.MouseMode == Editor.MouseMode.Selection; break;\r\n\t\t\t\tcase \"_FullPageScroll\": m.Checked = _ViewerBox.FullPageScroll; break;\r\n\t\t\t\tcase \"_ShowTextBorders\": m.Checked = _ViewerBox.ShowTextBorders; break;\r\n\t\t\t\tcase \"_DarkMode\": m.Checked = _ViewerBox.TintColor == __DarkModeColor; break;\r\n\t\t\t\tcase \"_GreenMode\": m.Checked = _ViewerBox.TintColor == __GreenModeColor; break;\r\n\t\t\t\tcase \"_ShowAnnotations\": m.Checked = _ViewerBox.HideAnnotations == false; break;\r\n\t\t\t\tcase \"_ShowBookmarks\": m.Checked = _MainPanel.Panel1Collapsed == false; break;\r\n\t\t\t\tcase \"_OcrPage\": item.Enabled = ModiOcr.ModiInstalled && _ViewerBox.OcrLanguage != Constants.Ocr.NoLanguage; break;\r\n\t\t\t\tcase \"_OcrDetectPunctuation\":\r\n\t\t\t\t\titem.Enabled = ModiOcr.ModiInstalled && _ViewerBox.OcrLanguage != Constants.Ocr.NoLanguage;\r\n\t\t\t\t\tm.Checked = _ViewerBox.OcrOptions.DetectContentPunctuations;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_InsertWithOcrOnly\":\r\n\t\t\t\t\tm.Checked = _controller.Model.InsertBookmarkWithOcrOnly;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_EnableOcr\":\r\n\t\t\t\t\titem.Enabled = ModiOcr.ModiInstalled;\r\n\t\t\t\t\titem.ToolTipText = item.Enabled ? String.Empty : Messages.ModiNotAvailable;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_OcrDisabled\":\r\n\t\t\t\t\tm.Checked = _ViewerBox.OcrLanguage == Constants.Ocr.NoLanguage;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_CopySelection\":\r\n\t\t\t\t\titem.Enabled = _ViewerBox.SelectionRegion.Contains(_ViewerBox.PinPoint);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_AutoBookmark\":\r\n\t\t\t\t\tif (m.DropDownItems.Count == 0) {\r\n\t\t\t\t\t\tm.DropDownItemClicked += _MainToolbar_ItemClicked;\r\n\t\t\t\t\t\tfor (int i = 1; i < 8; i++) {\r\n\t\t\t\t\t\t\tm.DropDownItems.Add(new ToolStripMenuItem($\"&{i} 级标题\") { Name = \"_AutoBookmarkLevel\" + i });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tEnableCommand(item, true, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string cmd, params string[] parameters) {\r\n\t\t\tswitch (cmd) {\r\n\t\t\t\t#region 书签命令\r\n\t\t\t\tcase \"_InsertBookmark\":\r\n\t\t\t\t\t_controller.InsertBookmark();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_MergeBookmark\":\r\n\t\t\t\t\t_controller.MergeBookmark(_BookmarkBox.GetSelectedElements());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SearchReplace\":\r\n\t\t\t\t\tif (_searchForm == null || _searchForm.IsDisposed) {\r\n\t\t\t\t\t\t_searchForm = new SearchBookmarkForm(_controller);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_searchForm.Visible == false) {\r\n\t\t\t\t\t\t_searchForm.Show(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_searchForm.BringToFront();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\t#region 阅读器工具栏命令\r\n\t\t\t\tcase \"_AutoBookmark\":\r\n\t\t\t\t\t_controller.ShowAutoBookmarkForm();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_CopySelection\":\r\n\t\t\t\t\tvar sel = _ViewerBox.GetSelection();\r\n\t\t\t\t\tif (sel.Page > 0) {\r\n\t\t\t\t\t\tvar r = _ViewerBox.GetSelectionPageRegion();\r\n\t\t\t\t\t\tvar lines = _ViewerBox.FindTextLines(r);\r\n\t\t\t\t\t\tif (lines != null) {\r\n\t\t\t\t\t\t\tClipboard.SetText(String.Join(Environment.NewLine, lines.Select(i => i.GetText())));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tusing (var b = sel.GetSelectedBitmap()) {\r\n\t\t\t\t\t\t\t\tClipboard.SetImage(b);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_InsertWithOcrOnly\":\r\n\t\t\t\t\t_controller.Model.InsertBookmarkWithOcrOnly = !_controller.Model.InsertBookmarkWithOcrOnly;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t#endregion\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tif (cmd.HasPrefix(\"_AutoBookmarkLevel\")) {\r\n\t\t\t\t\t\t_controller.ConfigAutoBookmarkTextStyles(\r\n\t\t\t\t\t\t\tcmd.Substring(\"_AutoBookmarkLevel\".Length).ToInt32(),\r\n\t\t\t\t\t\t\t_ViewerBox.FindTextLines(_ViewerBox.TransposeVirtualImageToPagePosition(_ViewerBox.PinPoint.X, _ViewerBox.PinPoint.Y)));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_controller.ExecuteCommand(cmd, parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void CloseDocument() {\r\n\t\t\t_ViewerBox.CloseFile();\r\n\t\t}\r\n\r\n\t\tpublic void Reopen() {\r\n\t\t\t_ViewerBox.Reopen();\r\n\t\t}\r\n\r\n\t\tvoid _BookmarkColorButton_SelectedColorChanged(object sender, EventArgs e) {\r\n\t\t\tvar c = _BookmarkColorButton.Color;\r\n\t\t\t_controller.ProcessBookmarks(new SetTextColorProcessor(c));\r\n\t\t}\r\n\r\n\t\tvoid _OpenButton_DropDownOpening(object sender, EventArgs e) {\r\n\t\t\tvar m = (sender as ToolStripDropDownItem);\r\n\t\t\tvar l = m.DropDown.Items;\r\n\t\t\tl.ClearDropDownItems();\r\n\t\t\tl.AddSourcePdfFiles();\r\n\t\t\tif (l.Count > 0) {\r\n\t\t\t\tl.Add(new ToolStripSeparator());\r\n\t\t\t}\r\n\t\t\tl.AddInfoFiles();\r\n\t\t}\r\n\r\n\t\tvoid _OpenButton_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\te.ClickedItem.HidePopupMenu();\r\n\t\t\tExecuteCommand(Commands.OpenFile, e.ClickedItem.ToolTipText);\r\n\t\t}\r\n\r\n\t\t[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n\t\tprotected override bool ProcessCmdKey(ref Message msg, Keys keyData) {\r\n\t\t\tif (_BookmarkBox.IsCellEditing || _CurrentPageBox.Focused) {\r\n\t\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t\t}\r\n\t\t\tswitch (keyData ^ Keys.Control) {\r\n\t\t\t\tcase Keys.B:\r\n\t\t\t\t\tExecuteCommand(\"_BookmarkBoldButton\"); return true;\r\n\t\t\t\tcase Keys.I:\r\n\t\t\t\t\tExecuteCommand(\"_BookmarkItalicButton\"); return true;\r\n\t\t\t\tcase Keys.Z: _controller.Undo(1); return true;\r\n\t\t\t\tcase Keys.F:\r\n\t\t\t\t\tExecuteCommand(\"_SearchReplace\"); return true;\r\n\t\t\t\tcase Keys.R:\r\n\t\t\t\t\tExecuteCommand(Commands.ImportBookmark); return true;\r\n\t\t\t\tcase Keys.Q:\r\n\t\t\t\t\tExecuteCommand(Commands.SaveBookmark); return true;\r\n\t\t\t\tcase Keys.S:\r\n\t\t\t\t\tExecuteCommand(Commands.Action); return true;\r\n\t\t\t\tcase Keys.O:\r\n\t\t\t\t\tExecuteCommand(Commands.Open); return true;\r\n\t\t\t\tcase Keys.C:\r\n\t\t\t\t\tExecuteCommand(Commands.Copy); return true;\r\n\t\t\t\tcase Keys.V:\r\n\t\t\t\t\tExecuteCommand(Commands.Paste); return true;\r\n\t\t\t\tcase Keys.W:\r\n\t\t\t\t\tExecuteCommand(Commands.EditorBookmarkSetCurrentCoordinates);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Shift | Keys.W:\r\n\t\t\t\t\tExecuteCommand(Commands.EditorBookmarkSetCurrentCoordinates);\r\n\t\t\t\t\t_controller.View.Bookmark.SelectNextBookmark();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Down:\r\n\t\t\t\t\t_controller.InsertBookmark(InsertBookmarkPositionType.AfterCurrent);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Up:\r\n\t\t\t\t\t_controller.InsertBookmark(InsertBookmarkPositionType.BeforeCurrent);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Right:\r\n\t\t\t\t\t_controller.InsertBookmark(InsertBookmarkPositionType.AsChild);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Left:\r\n\t\t\t\t\t_controller.InsertBookmark(InsertBookmarkPositionType.AfterParent);\r\n\t\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tswitch (keyData ^ Keys.Shift) {\r\n\t\t\t\tcase Keys.Tab:\r\n\t\t\t\t\tExecuteCommand(\"_LevelUp\"); return true;\r\n\t\t\t\tcase Keys.D8:\r\n\t\t\t\t\tExecuteCommand(\"_ShiftMultiPageNumber\"); return true;\r\n\t\t\t\tcase Keys.Up:\r\n\t\t\t\t\t_controller.View.Bookmark.SelectPreviousBookmark(); return true;\r\n\t\t\t\tcase Keys.Down:\r\n\t\t\t\t\t_controller.View.Bookmark.SelectNextBookmark(); return true;\r\n\t\t\t\tcase Keys.Right:\r\n\t\t\t\t\t_controller.View.Bookmark.ExpandSelected(true); return true;\r\n\t\t\t\tcase Keys.Left:\r\n\t\t\t\t\t_controller.View.Bookmark.CollapseSelected(true); return true;\r\n\t\t\t\tcase Keys.Enter:\r\n\t\t\t\t\t_controller.ExecuteCommand(Commands.EditorViewerScrollToBookmark); return true;\r\n\t\t\t}\r\n\t\t\tswitch (keyData) {\r\n\t\t\t\tcase Keys.Insert:\r\n\t\t\t\t\t_controller.InsertBookmark(); return true;\r\n\t\t\t\tcase Keys.Delete:\r\n\t\t\t\t\tExecuteCommand(Commands.Delete); return true;\r\n\t\t\t\tcase Keys.Add:\r\n\t\t\t\tcase Keys.Oemplus:\r\n\t\t\t\t\tExecuteCommand(\"_IncrementPageNumber\"); return true;\r\n\t\t\t\tcase Keys.Subtract:\r\n\t\t\t\tcase Keys.OemMinus:\r\n\t\t\t\t\tExecuteCommand(\"_DecrementPageNumber\"); return true;\r\n\t\t\t\tcase Keys.Multiply:\r\n\t\t\t\t\tExecuteCommand(\"_ShiftMultiPageNumber\"); return true;\r\n\t\t\t\tcase Keys.P:\r\n\t\t\t\t\tif (_BookmarkBox.FocusedItem != null) {\r\n\t\t\t\t\t\t_BookmarkBox.EditSubItem(_BookmarkBox.FocusedItem as BrightIdeasSoftware.OLVListItem, _BookmarkBox.BookmarkPageColumn.Index);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Tab:\r\n\t\t\t\t\tExecuteCommand(\"_LevelDown\"); return true;\r\n\t\t\t\tcase Keys.F2:\r\n\t\t\t\t\tif (_BookmarkBox.FocusedItem != null) {\r\n\t\t\t\t\t\t_BookmarkBox.FocusedItem.BeginEdit();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t_BookmarkBox.SelectedItem?.BeginEdit();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Space:\r\n\t\t\t\t\tif (_BookmarkBox.FocusedItem != null) {\r\n\t\t\t\t\t\t_ViewerBox.CurrentPageNumber = (_BookmarkBox.FocusedObject as BookmarkElement).Page;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.ProcessKey:\r\n\t\t\t\t\tif (msg.Msg == 256) {\r\n\t\t\t\t\t\tswitch ((int)msg.LParam) {\r\n\t\t\t\t\t\t\tcase 0x001A0001:\r\n\t\t\t\t\t\t\t\tExecuteCommand(\"_PreviousPage\");\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\tcase 0x001B0001:\r\n\t\t\t\t\t\t\t\tExecuteCommand(\"_NextPage\");\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t}\r\n\r\n\t\tvoid _BookmarkBox_DragEnter(object sender, DragEventArgs e) {\r\n\t\t\te.FeedbackDragFileOver(Constants.FileExtensions.PdfAndAllBookmarkExtension);\r\n\t\t}\r\n\r\n\t\tvoid _BookmarkBox_DragDrop(object sender, DragEventArgs e) {\r\n\t\t\tif (this.DropFileOver(e, Constants.FileExtensions.PdfAndAllBookmarkExtension)\r\n\t\t\t\t&& (_controller.Model.Undo.IsDirty == false\r\n\t\t\t\t\t|| AppContext.MainForm.ConfirmYesBox(Messages.ConfirmAbandonDocument))) {\r\n\t\t\t\t_controller.LoadDocument(Text, false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region Editor.IEditView\r\n\t\tbool Editor.IEditView.AffectsDescendantBookmarks => _IncludeDecendantBox.Checked || ModifierKeys == Keys.Shift;\r\n\r\n\t\tToolStripSplitButton Editor.IEditView.UndoButton => _UndoButton;\r\n\r\n\t\tAutoBookmarkForm Editor.IEditView.AutoBookmark {\r\n\t\t\tget {\r\n\t\t\t\tif (_autoBookmarkForm == null || _autoBookmarkForm.IsDisposed) {\r\n\t\t\t\t\t_autoBookmarkForm = new AutoBookmarkForm(_controller);\r\n\t\t\t\t}\r\n\t\t\t\treturn _autoBookmarkForm;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tBookmarkEditorView Editor.IEditView.Bookmark => _BookmarkBox;\r\n\r\n\t\tViewerControl Editor.IEditView.Viewer => _ViewerBox;\r\n\r\n\t\tToolStrip Editor.IEditView.ViewerToolbar => _ViewerToolbar;\r\n\r\n\t\tToolStrip Editor.IEditView.BookmarkToolbar => _BookmarkToolbar;\r\n\r\n\t\tSplitContainer Editor.IEditView.MainPanel => _MainPanel;\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/EditorControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_AlterPosition.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ChangeCoordinates.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ClearPositionX.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ClearPositionY.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ClearPositionXY.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ForceInternalLink.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectNone.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InvertSelection.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ShiftPageNumber.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ShiftMultiPageNumber.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_IncrementPageNumber.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_DecrementPageNumber.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MergeBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectAll.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator3.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"dummyToolStripMenuItem.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Copy.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Paste.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_DeleteBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InsertBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_LevelUp.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_LevelDown.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator7.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectItems.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectionMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>244, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_SearchReplace.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_BookmarkAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem3.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator8.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem4.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem5.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem6.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem7.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem9.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem10.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem11.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem12.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem13.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem14.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem15.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem16.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem17.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem18.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem19.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator10.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_FirstPage.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_PreviousPage.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_NextPage.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_LastPage.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MoveMode.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectionMode.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ScrollVertical.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ScrollHorizontal.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_FullPageScroll.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator6.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_TrueColorSpace.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_GrayColorSpace.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InvertColor.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_BookmarkHere.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_CopySelection.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator11.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_OcrDisabled.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ShowTextBorders.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_DarkMode.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator12.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_GreenMode.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ShowBookmarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InsertPageLabel.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_AutoBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SetOpenStatusTrue.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SetOpenStatusFalse.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_OcrDetectPunctuation.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_PageProperties.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MarkBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MarkBookmarkRed.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MarkBookmarkYellow.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MarkBookmarkGreen.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MarkBookmarkBlue.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MarkBookmarkPurple.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator5.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_UnmarkBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ClearBookmarkMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectMarkedBookmarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectRedMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectYellowMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectGreenMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectCyanMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectBlueMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectPurpleMarks.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator14.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator13.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator4.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_EditMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_RecentFileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>382, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_UndoMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>126, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_ViewerMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>815, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_BookmarkToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>526, 17</value>\r\n  </metadata>\r\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\r\n  <data name=\"_BookmarkColorButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALRSURBVDhPzZJrSJNhFMefd+9EISiFMogICaL6IPkhQcWK\r\n        nM3USs0MLxO3hSFIoYRZar6StVfdNHUzxVBWppWXzdm87L4xL02GzAuFdFGbo9SpaWkmymnvXEnQxz70\r\n        gz+Hczj/8xye50H/HB2B6BqO2zEDl5ak59Jz9Gy8RM/B+XoOPd+h6wYuzlSw0A5X+zbNcQjXcOkntWw6\r\n        MZJ8pHs2JgamIyPBRmSu2zqI9Ql5+ldTz2nok58ANbG3VcVxP+iyIqTkon3qFPrNV7cONdjaM95NMJnw\r\n        Iz8f1vLyoN/XFyZab4OhPRBWbXmwMp0L0vrDoGa7kaqraBfqTnH3UXDc+W/rE006XdnmR1k+mPz8wBwU\r\n        BAofHxjOS4RJSS7IxEdB+cIfngr3w4g0FSxFwZ0KNn4edSbjBROPr4zMakqAMlMavcMCqbc3WHISftfM\r\n        TUlQJ9gDpoYEsHYQYG3L+NDFomUjeSJeOtZHbEy/LIDPShLmDWVg1wmAyv8mjVQMN5rG4Zp4FISZsXJU\r\n        F43XvH6WZp3TE2uDotjxxiSvdmMRc2je8ABm1MXOgVS0dRU6lfZoCCp6v0O5cRWi7nYCEpylB/PDsFY+\r\n        E28WhNHSqVwQhmmWB6tBT16YrIjyHNSS5yZntXz4pODBxfs9EM/XQkjWcyDYDK3rHbYgTiGP0jCcL8kO\r\n        GF6x1EFtvJeaqtfGeaoX+4XOTdqeCCEgvR5qCzOnnsXhxU7jL8rDaTmyrONmna56c6G3Aqyqe0vvZTl2\r\n        a3fB0oKxHOYcW1DRbiz91sLdLWm8hAJd1i2qIrAWe3/lmvMiHVrsq4Ql00OgTv8yIALqQw1VXX7TlLhT\r\n        Ko6lJbhs24jCMclAbcrUTA+xumSugbEBYmNKSSxbxKk2eW7QcHW0h0oUgRXXhCNfl+VPeAzkTzIwoUMK\r\n        XijWR4ZgvWQo1sJjYALyDGIVhaIDrtb/BoR+AhgWoMzludfHAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_ViewerToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>680, 17</value>\r\n  </metadata>\r\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>94</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/ExtractImageControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ExtractImageControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExtractImageControl));\r\n\t\t\tthis._ExtractPageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._BrowseTargetPdfButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._SaveImageBox = new System.Windows.Forms.FolderBrowserDialog();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._FileMaskPreviewBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._FileNameMaskBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._MergeImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._VerticalFlipImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._InvertBlackAndWhiteBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis._MinWidthBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label();\r\n\t\t\tthis._MinHeightBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._AllowRedundantImagesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._MonoPngBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._MonoTiffBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._InvertSoftMaskBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExportSoftMaskBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExportAnnotImagesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._MergeJpgToPngBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis.tabPage3 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.textBox1 = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._AutoOutputDirBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._TargetBox = new PDFPatcher.HistoryComboBox();\r\n\t\t\tthis._SourceFileControl = new PDFPatcher.SourceFileControl();\r\n\t\t\tthis._ExtractButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\tthis._ExtractOutOfPageImagesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinWidthBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinHeightBox)).BeginInit();\r\n\t\t\tthis.tabControl1.SuspendLayout();\r\n\t\t\tthis.tabPage1.SuspendLayout();\r\n\t\t\tthis.tabPage2.SuspendLayout();\r\n\t\t\tthis.tabPage3.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _ExtractPageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExtractPageRangeBox.Location = new System.Drawing.Point(93, 6);\r\n\t\t\tthis._ExtractPageRangeBox.Name = \"_ExtractPageRangeBox\";\r\n\t\t\tthis._ExtractPageRangeBox.Size = new System.Drawing.Size(356, 21);\r\n\t\t\tthis._ExtractPageRangeBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(6, 9);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _BrowseTargetPdfButton\r\n\t\t\t// \r\n\t\t\tthis._BrowseTargetPdfButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BrowseTargetPdfButton.Image = global::PDFPatcher.Properties.Resources.ImageFolder;\r\n\t\t\tthis._BrowseTargetPdfButton.Location = new System.Drawing.Point(397, 34);\r\n\t\t\tthis._BrowseTargetPdfButton.Name = \"_BrowseTargetPdfButton\";\r\n\t\t\tthis._BrowseTargetPdfButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._BrowseTargetPdfButton.TabIndex = 4;\r\n\t\t\tthis._BrowseTargetPdfButton.Text = \"浏览...\";\r\n\t\t\tthis._BrowseTargetPdfButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._BrowseTargetPdfButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._BrowseTargetPdfButton.Click += new System.EventHandler(this._BrowseTargetPdfButton_Click);\r\n\t\t\t// \r\n\t\t\t// _SaveImageBox\r\n\t\t\t// \r\n\t\t\tthis._SaveImageBox.Description = \"请选择保存图片的文件夹\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(17, 39);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label4.TabIndex = 2;\r\n\t\t\tthis.label4.Text = \"输出图片位置：\";\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(6, 9);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label2.TabIndex = 0;\r\n\t\t\tthis.label2.Text = \"文件名掩码：\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(8, 95);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label5.TabIndex = 2;\r\n\t\t\tthis.label5.Text = \"文件名示例：\";\r\n\t\t\t// \r\n\t\t\t// _FileMaskPreviewBox\r\n\t\t\t// \r\n\t\t\tthis._FileMaskPreviewBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FileMaskPreviewBox.Location = new System.Drawing.Point(91, 95);\r\n\t\t\tthis._FileMaskPreviewBox.Name = \"_FileMaskPreviewBox\";\r\n\t\t\tthis._FileMaskPreviewBox.Size = new System.Drawing.Size(330, 31);\r\n\t\t\tthis._FileMaskPreviewBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _FileNameMaskBox\r\n\t\t\t// \r\n\t\t\tthis._FileNameMaskBox.FormattingEnabled = true;\r\n\t\t\tthis._FileNameMaskBox.Items.AddRange(new object[] {\r\n            \"0000\",\r\n            \"000\",\r\n            \"0\",\r\n            \"图片0000\"});\r\n\t\t\tthis._FileNameMaskBox.Location = new System.Drawing.Point(93, 6);\r\n\t\t\tthis._FileNameMaskBox.Name = \"_FileNameMaskBox\";\r\n\t\t\tthis._FileNameMaskBox.Size = new System.Drawing.Size(318, 20);\r\n\t\t\tthis._FileNameMaskBox.TabIndex = 1;\r\n\t\t\tthis._FileNameMaskBox.TextChanged += new System.EventHandler(this._FileNameMaskBox_TextChanged);\r\n\t\t\t// \r\n\t\t\t// _MergeImageBox\r\n\t\t\t// \r\n\t\t\tthis._MergeImageBox.AutoSize = true;\r\n\t\t\tthis._MergeImageBox.Location = new System.Drawing.Point(8, 33);\r\n\t\t\tthis._MergeImageBox.Name = \"_MergeImageBox\";\r\n\t\t\tthis._MergeImageBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._MergeImageBox.TabIndex = 3;\r\n\t\t\tthis._MergeImageBox.Text = \"尝试合并相同页面的图片\";\r\n\t\t\tthis._MergeImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _VerticalFlipImageBox\r\n\t\t\t// \r\n\t\t\tthis._VerticalFlipImageBox.AutoSize = true;\r\n\t\t\tthis._VerticalFlipImageBox.Location = new System.Drawing.Point(208, 55);\r\n\t\t\tthis._VerticalFlipImageBox.Name = \"_VerticalFlipImageBox\";\r\n\t\t\tthis._VerticalFlipImageBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._VerticalFlipImageBox.TabIndex = 6;\r\n\t\t\tthis._VerticalFlipImageBox.Text = \"垂直翻转图片\";\r\n\t\t\tthis._VerticalFlipImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _InvertBlackAndWhiteBox\r\n\t\t\t// \r\n\t\t\tthis._InvertBlackAndWhiteBox.AutoSize = true;\r\n\t\t\tthis._InvertBlackAndWhiteBox.Location = new System.Drawing.Point(8, 77);\r\n\t\t\tthis._InvertBlackAndWhiteBox.Name = \"_InvertBlackAndWhiteBox\";\r\n\t\t\tthis._InvertBlackAndWhiteBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._InvertBlackAndWhiteBox.TabIndex = 7;\r\n\t\t\tthis._InvertBlackAndWhiteBox.Text = \"反转黑白图片的颜色\";\r\n\t\t\tthis._InvertBlackAndWhiteBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(6, 124);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label7.TabIndex = 13;\r\n\t\t\tthis.label7.Text = \"忽略宽度小于\";\r\n\t\t\t// \r\n\t\t\t// _MinWidthBox\r\n\t\t\t// \r\n\t\t\tthis._MinWidthBox.Increment = new decimal(new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinWidthBox.Location = new System.Drawing.Point(89, 122);\r\n\t\t\tthis._MinWidthBox.Maximum = new decimal(new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinWidthBox.Name = \"_MinWidthBox\";\r\n\t\t\tthis._MinWidthBox.Size = new System.Drawing.Size(43, 21);\r\n\t\t\tthis._MinWidthBox.TabIndex = 14;\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point(138, 124);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label8.TabIndex = 15;\r\n\t\t\tthis.label8.Text = \"或高度小于\";\r\n\t\t\t// \r\n\t\t\t// _MinHeightBox\r\n\t\t\t// \r\n\t\t\tthis._MinHeightBox.Increment = new decimal(new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinHeightBox.Location = new System.Drawing.Point(209, 122);\r\n\t\t\tthis._MinHeightBox.Maximum = new decimal(new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinHeightBox.Name = \"_MinHeightBox\";\r\n\t\t\tthis._MinHeightBox.Size = new System.Drawing.Size(43, 21);\r\n\t\t\tthis._MinHeightBox.TabIndex = 16;\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(258, 124);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label9.TabIndex = 17;\r\n\t\t\tthis.label9.Text = \"像素的图片\";\r\n\t\t\t// \r\n\t\t\t// tabControl1\r\n\t\t\t// \r\n\t\t\tthis.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage1);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage2);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage3);\r\n\t\t\tthis.tabControl1.Location = new System.Drawing.Point(12, 92);\r\n\t\t\tthis.tabControl1.Name = \"tabControl1\";\r\n\t\t\tthis.tabControl1.SelectedIndex = 0;\r\n\t\t\tthis.tabControl1.Size = new System.Drawing.Size(463, 229);\r\n\t\t\tthis.tabControl1.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add(this._ExtractOutOfPageImagesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._AllowRedundantImagesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MonoPngBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MonoTiffBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label1);\r\n\t\t\tthis.tabPage1.Controls.Add(this._InvertSoftMaskBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._ExportSoftMaskBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._ExportAnnotImagesBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MergeJpgToPngBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label3);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label9);\r\n\t\t\tthis.tabPage1.Controls.Add(this._InvertBlackAndWhiteBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label7);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label8);\r\n\t\t\tthis.tabPage1.Controls.Add(this._VerticalFlipImageBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._ExtractPageRangeBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MinWidthBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MergeImageBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._MinHeightBox);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"选项\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _SkipRedundantImagesBox\r\n\t\t\t// \r\n\t\t\tthis._AllowRedundantImagesBox.AutoSize = true;\r\n\t\t\tthis._AllowRedundantImagesBox.Location = new System.Drawing.Point(8, 146);\r\n\t\t\tthis._AllowRedundantImagesBox.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\r\n\t\t\tthis._AllowRedundantImagesBox.Name = \"_SkipRedundantImagesBox\";\r\n\t\t\tthis._AllowRedundantImagesBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._AllowRedundantImagesBox.TabIndex = 18;\r\n\t\t\tthis._AllowRedundantImagesBox.Text = \"允许导出相同的图片\";\r\n\t\t\tthis._AllowRedundantImagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _MonoPngBox\r\n\t\t\t// \r\n\t\t\tthis._MonoPngBox.AutoSize = true;\r\n\t\t\tthis._MonoPngBox.Location = new System.Drawing.Point(208, 99);\r\n\t\t\tthis._MonoPngBox.Name = \"_MonoPngBox\";\r\n\t\t\tthis._MonoPngBox.Size = new System.Drawing.Size(71, 16);\r\n\t\t\tthis._MonoPngBox.TabIndex = 12;\r\n\t\t\tthis._MonoPngBox.TabStop = true;\r\n\t\t\tthis._MonoPngBox.Text = \"PNG 文件\";\r\n\t\t\tthis._MonoPngBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _MonoTiffBox\r\n\t\t\t// \r\n\t\t\tthis._MonoTiffBox.AutoSize = true;\r\n\t\t\tthis._MonoTiffBox.Location = new System.Drawing.Point(125, 99);\r\n\t\t\tthis._MonoTiffBox.Name = \"_MonoTiffBox\";\r\n\t\t\tthis._MonoTiffBox.Size = new System.Drawing.Size(77, 16);\r\n\t\t\tthis._MonoTiffBox.TabIndex = 11;\r\n\t\t\tthis._MonoTiffBox.TabStop = true;\r\n\t\t\tthis._MonoTiffBox.Text = \"TIFF 文件\";\r\n\t\t\tthis._MonoTiffBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(6, 101);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(113, 12);\r\n\t\t\tthis.label1.TabIndex = 10;\r\n\t\t\tthis.label1.Text = \"将黑白图片保存为：\";\r\n\t\t\t// \r\n\t\t\t// _InvertSoftMaskBox\r\n\t\t\t// \r\n\t\t\tthis._InvertSoftMaskBox.AutoSize = true;\r\n\t\t\tthis._InvertSoftMaskBox.Location = new System.Drawing.Point(310, 77);\r\n\t\t\tthis._InvertSoftMaskBox.Name = \"_InvertSoftMaskBox\";\r\n\t\t\tthis._InvertSoftMaskBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._InvertSoftMaskBox.TabIndex = 9;\r\n\t\t\tthis._InvertSoftMaskBox.Text = \"反转掩模颜色\";\r\n\t\t\tthis._InvertSoftMaskBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportSoftMaskBox\r\n\t\t\t// \r\n\t\t\tthis._ExportSoftMaskBox.AutoSize = true;\r\n\t\t\tthis._ExportSoftMaskBox.Location = new System.Drawing.Point(208, 77);\r\n\t\t\tthis._ExportSoftMaskBox.Name = \"_ExportSoftMaskBox\";\r\n\t\t\tthis._ExportSoftMaskBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._ExportSoftMaskBox.TabIndex = 8;\r\n\t\t\tthis._ExportSoftMaskBox.Text = \"导出图像掩模\";\r\n\t\t\tthis._ExportSoftMaskBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportAnnotImagesBox\r\n\t\t\t// \r\n\t\t\tthis._ExportAnnotImagesBox.AutoSize = true;\r\n\t\t\tthis._ExportAnnotImagesBox.Location = new System.Drawing.Point(8, 55);\r\n\t\t\tthis._ExportAnnotImagesBox.Name = \"_ExportAnnotImagesBox\";\r\n\t\t\tthis._ExportAnnotImagesBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._ExportAnnotImagesBox.TabIndex = 5;\r\n\t\t\tthis._ExportAnnotImagesBox.Text = \"导出批注内的图片\";\r\n\t\t\tthis._ExportAnnotImagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _MergeJpgToPngBox\r\n\t\t\t// \r\n\t\t\tthis._MergeJpgToPngBox.AutoSize = true;\r\n\t\t\tthis._MergeJpgToPngBox.Location = new System.Drawing.Point(208, 33);\r\n\t\t\tthis._MergeJpgToPngBox.Name = \"_MergeJpgToPngBox\";\r\n\t\t\tthis._MergeJpgToPngBox.Size = new System.Drawing.Size(192, 16);\r\n\t\t\tthis._MergeJpgToPngBox.TabIndex = 4;\r\n\t\t\tthis._MergeJpgToPngBox.Text = \"JPEG 图片无损合并为 PNG 图片\";\r\n\t\t\tthis._MergeJpgToPngBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// tabPage2\r\n\t\t\t// \r\n\t\t\tthis.tabPage2.Controls.Add(this.label6);\r\n\t\t\tthis.tabPage2.Controls.Add(this._FileNameMaskBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label2);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label5);\r\n\t\t\tthis.tabPage2.Controls.Add(this._FileMaskPreviewBox);\r\n\t\t\tthis.tabPage2.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage2.Name = \"tabPage2\";\r\n\t\t\tthis.tabPage2.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage2.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage2.TabIndex = 1;\r\n\t\t\tthis.tabPage2.Text = \"文件命名\";\r\n\t\t\tthis.tabPage2.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.Location = new System.Drawing.Point(91, 30);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(330, 65);\r\n\t\t\tthis.label6.TabIndex = 4;\r\n\t\t\tthis.label6.Text = \"文件名掩码说明：\\r\\n“0000”：不足四位用0补足四位。\\r\\n“0”：文件名按实际页码，不用0补位。\\r\\n可用英文双引号将文本括起来（如“\\\"相约2046\\\"0”，前面的\" +\r\n    \"“2046”不会被解释为占位符）。\";\r\n\t\t\t// \r\n\t\t\t// tabPage3\r\n\t\t\t// \r\n\t\t\tthis.tabPage3.Controls.Add(this.textBox1);\r\n\t\t\tthis.tabPage3.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage3.Name = \"tabPage3\";\r\n\t\t\tthis.tabPage3.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage3.Size = new System.Drawing.Size(455, 203);\r\n\t\t\tthis.tabPage3.TabIndex = 2;\r\n\t\t\tthis.tabPage3.Text = \"页码范围说明\";\r\n\t\t\tthis.tabPage3.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// textBox1\r\n\t\t\t// \r\n\t\t\tthis.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.textBox1.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis.textBox1.Multiline = true;\r\n\t\t\tthis.textBox1.Name = \"textBox1\";\r\n\t\t\tthis.textBox1.ReadOnly = true;\r\n\t\t\tthis.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\r\n\t\t\tthis.textBox1.Size = new System.Drawing.Size(437, 180);\r\n\t\t\tthis.textBox1.TabIndex = 2;\r\n\t\t\tthis.textBox1.Text = resources.GetString(\"textBox1.Text\");\r\n\t\t\t// \r\n\t\t\t// _AutoOutputDirBox\r\n\t\t\t// \r\n\t\t\tthis._AutoOutputDirBox.AutoSize = true;\r\n\t\t\tthis._AutoOutputDirBox.Location = new System.Drawing.Point(19, 67);\r\n\t\t\tthis._AutoOutputDirBox.Name = \"_AutoOutputDirBox\";\r\n\t\t\tthis._AutoOutputDirBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._AutoOutputDirBox.TabIndex = 5;\r\n\t\t\tthis._AutoOutputDirBox.Text = \"自动指定输出图片的位置\";\r\n\t\t\tthis._AutoOutputDirBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _TargetBox\r\n\t\t\t// \r\n\t\t\tthis._TargetBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetBox.Contents = null;\r\n\t\t\tthis._TargetBox.FormattingEnabled = true;\r\n\t\t\tthis._TargetBox.Location = new System.Drawing.Point(112, 36);\r\n\t\t\tthis._TargetBox.MaxItemCount = 16;\r\n\t\t\tthis._TargetBox.Name = \"_TargetBox\";\r\n\t\t\tthis._TargetBox.Size = new System.Drawing.Size(279, 20);\r\n\t\t\tthis._TargetBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _SourceFileControl\r\n\t\t\t// \r\n\t\t\tthis._SourceFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SourceFileControl.Location = new System.Drawing.Point(12, 3);\r\n\t\t\tthis._SourceFileControl.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._SourceFileControl.Name = \"_SourceFileControl\";\r\n\t\t\tthis._SourceFileControl.Size = new System.Drawing.Size(463, 29);\r\n\t\t\tthis._SourceFileControl.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _ExtractButton\r\n\t\t\t// \r\n\t\t\tthis._ExtractButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExtractButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExtractButton.AnimateGlow = true;\r\n\t\t\tthis._ExtractButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExtractButton.CornerRadius = 3;\r\n\t\t\tthis._ExtractButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ExtractButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ExtractButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ExtractButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ExtractButton.Location = new System.Drawing.Point(349, 63);\r\n\t\t\tthis._ExtractButton.Name = \"_ExtractButton\";\r\n\t\t\tthis._ExtractButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ExtractButton.ShowFocusBorder = true;\r\n\t\t\tthis._ExtractButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ExtractButton.TabIndex = 13;\r\n\t\t\tthis._ExtractButton.Text = \" 提取图片(&T)\";\r\n\t\t\tthis._ExtractButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ExtractButton.Click += new System.EventHandler(this._ExtractButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ExtractOnlyInPageBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractOutOfPageImagesBox.AutoSize = true;\r\n\t\t\tthis._ExtractOutOfPageImagesBox.Location = new System.Drawing.Point(8, 167);\r\n\t\t\tthis._ExtractOutOfPageImagesBox.Name = \"_ExtractOnlyInPageBox\";\r\n\t\t\tthis._ExtractOutOfPageImagesBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._ExtractOutOfPageImagesBox.TabIndex = 19;\r\n\t\t\tthis._ExtractOutOfPageImagesBox.Text = \"允许导出隐藏图片\";\r\n\t\t\tthis._ExtractOutOfPageImagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// ExtractImageControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._ExtractButton);\r\n\t\t\tthis.Controls.Add(this._AutoOutputDirBox);\r\n\t\t\tthis.Controls.Add(this.tabControl1);\r\n\t\t\tthis.Controls.Add(this._TargetBox);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this._SourceFileControl);\r\n\t\t\tthis.Controls.Add(this._BrowseTargetPdfButton);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"ExtractImageControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(487, 333);\r\n\t\t\tthis.Load += new System.EventHandler(this.Control_Show);\r\n\t\t\tthis.VisibleChanged += new System.EventHandler(this.Control_Show);\r\n\t\t\tthis.Click += new System.EventHandler(this._ExtractButton_Click);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinWidthBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinHeightBox)).EndInit();\r\n\t\t\tthis.tabControl1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.PerformLayout();\r\n\t\t\tthis.tabPage2.ResumeLayout(false);\r\n\t\t\tthis.tabPage2.PerformLayout();\r\n\t\t\tthis.tabPage3.ResumeLayout(false);\r\n\t\t\tthis.tabPage3.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.TextBox _ExtractPageRangeBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Button _BrowseTargetPdfButton;\r\n\t\tprivate SourceFileControl _SourceFileControl;\r\n\t\tprivate System.Windows.Forms.FolderBrowserDialog _SaveImageBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.Label _FileMaskPreviewBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _FileNameMaskBox;\r\n\t\tprivate HistoryComboBox _TargetBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeImageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _VerticalFlipImageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _InvertBlackAndWhiteBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinHeightBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinWidthBox;\r\n\t\tprivate System.Windows.Forms.TabControl tabControl1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage2;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoOutputDirBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeJpgToPngBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportAnnotImagesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportSoftMaskBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _InvertSoftMaskBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _MonoTiffBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.RadioButton _MonoPngBox;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ExtractButton;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage3;\r\n\t\tprivate System.Windows.Forms.TextBox textBox1;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.CheckBox _AllowRedundantImagesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractOutOfPageImagesBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ExtractImageControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class ExtractImageControl : FunctionControl, IResettableControl, IDocumentSource\r\n\t{\r\n\t\tpublic override string FunctionName => \"提取图片\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.ExtractImage;\r\n\r\n\t\tpublic ExtractImageControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tpublic string DocumentPath => _SourceFileControl.Text;\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_SourceFileControl.BrowseSelectedFiles += (object sender, EventArgs e) => {\r\n\t\t\t\tif (_AutoOutputDirBox.Checked == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar sourceFile = _SourceFileControl.FirstFile;\r\n\t\t\t\tif (sourceFile.Length > 0) {\r\n\t\t\t\t\t_TargetBox.Text = FileHelper.CombinePath(Path.GetDirectoryName(sourceFile), Path.GetFileNameWithoutExtension(sourceFile));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_AutoOutputDirBox.CheckedChanged += (object sender, EventArgs e) => AppContext.ImageExtracter.AutoOutputFolder = _AutoOutputDirBox.Checked;\r\n\t\t\tShowFileMaskPreview();\r\n\t\t\tAppContext.MainForm.SetTooltip(_SourceFileControl.FileList, \"包含图片的 PDF 文件路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetBox, \"放置输出图片的文件夹路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractPageRangeBox, \"在此指定需提取图片的页码范围，不指定页码范围时提取所有页面的图片\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_FileNameMaskBox, \"提取的图片文件名按其所在页码数字命名，可在此修改命名规则\\n“0000”：不足四位用0补足四位\\n“0”：文件名按实际页码，不用0补位\\n可用英文双引号将文本括起来（如“\\\"相约2000\\\"0”，前面的“2000”不会被解释为占位符）\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_MergeImageBox, \"尝试将相同页面下的图片合并为同一个文件\\n①合并图片的格式必须相同\\n②宽度必须相同\\n③仅限 PNG 和 TIFF 格式\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_VerticalFlipImageBox, \"某些 PDF 文件导出的图片上下颠倒，可用此选项将其还原\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_InvertBlackAndWhiteBox, \"翻转 PNG 和 TIFF 黑白图片的颜色\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_MinHeightBox, \"忽略高度小于此处指定值的图片\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_MinWidthBox, \"忽略宽度小于此处指定值的图片\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_MergeJpgToPngBox, \"在合并图片时，将使用有损压缩的 JPEG 图片合并为无损压缩的 PNG 图片\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractButton, \"点击此按钮，将 PDF 文件的图片提取到指定的目录\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_AllowRedundantImagesBox, \"允许重复导出 PDF 内部引用值一致的图片\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractOutOfPageImagesBox, \"导出页面渲染指令未引用过的隐藏图片\");\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\t_SourceFileControl.BrowseFile();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tAppContext.ImageExtracter = new ImageExtracterOptions();\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\tvar o = AppContext.ImageExtracter;\r\n\t\t\t_AutoOutputDirBox.Checked = o.AutoOutputFolder;\r\n\t\t\t_FileNameMaskBox.Text = o.FileMask;\r\n\t\t\t_InvertBlackAndWhiteBox.Checked = o.InvertBlackAndWhiteImages;\r\n\t\t\t_MonoTiffBox.Checked = !o.MonoPng;\r\n\t\t\t_MergeImageBox.Checked = o.MergeImages;\r\n\t\t\t_MergeJpgToPngBox.Checked = o.MergeJpgToPng;\r\n\t\t\t_ExportAnnotImagesBox.Checked = o.ExtractAnnotationImages;\r\n\t\t\t_MinHeightBox.SetValue(o.MinHeight);\r\n\t\t\t_MinWidthBox.SetValue(o.MinWidth);\r\n\t\t\t_VerticalFlipImageBox.Checked = o.VerticalFlipImages;\r\n\t\t\t_ExportSoftMaskBox.Checked = o.ExtractSoftMask;\r\n\t\t\t_InvertSoftMaskBox.Checked = o.InvertSoftMask;\r\n\t\t\t_MonoPngBox.Checked = o.MonoPng;\r\n\t\t\t_AllowRedundantImagesBox.Checked = o.AllowRedundantImages;\r\n\t\t\t_ExtractOutOfPageImagesBox.Checked = o.ExtractOutOfPageImages;\r\n\t\t}\r\n\r\n\t\tvoid _BrowseTargetPdfButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar sourceFile = _SourceFileControl.Text;\r\n\t\t\tif (_TargetBox.Text.Length > 0) {\r\n\t\t\t\t_SaveImageBox.SelectedPath = Path.GetDirectoryName(_TargetBox.Text);\r\n\t\t\t}\r\n\t\t\telse if (sourceFile.Length > 0) {\r\n\t\t\t\t_SaveImageBox.SelectedPath = Path.GetDirectoryName(sourceFile);\r\n\t\t\t}\r\n\t\t\tif (_SaveImageBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t_TargetBox.Text = _SaveImageBox.SelectedPath;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ExtractButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (File.Exists(_SourceFileControl.FirstFile) == false) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_TargetBox.Text.IsNullOrWhiteSpace()) {\r\n\t\t\t\t_BrowseTargetPdfButton_Click(_BrowseTargetPdfButton, e);\r\n\t\t\t\tif (_TargetBox.Text.IsNullOrWhiteSpace()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.SourceFiles = _SourceFileControl.Files;\r\n\t\t\tif (_SourceFileControl.Files.Length == 1) {\r\n\t\t\t\t_SourceFileControl.FileList.AddHistoryItem();\r\n\t\t\t\t_TargetBox.AddHistoryItem();\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar a = arg.Argument as object[];\r\n\t\t\t\tvar files = a[0] as string[];\r\n\t\t\t\tvar options = a[1] as ImageExtracterOptions;\r\n\t\t\t\toptions.OutputPath = new FilePath(options.OutputPath).Normalize();\r\n\t\t\t\tif (files.Length > 1) {\r\n\t\t\t\t\tvar ep = options.OutputPath;\r\n\t\t\t\t\tTracker.SetTotalProgressGoal(files.Length);\r\n\t\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\t\toptions.OutputPath = new FilePath(ep).Combine(new FilePath(file).FileNameWithoutExtension).Normalize();\r\n\t\t\t\t\t\tProcessor.Worker.ExtractImages(file, options);\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tProcessor.Worker.ExtractImages(files[0], options);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerCompleted += (dummy, arg) => AppContext.ImageExtracter.OutputPath = _ExtractPageRangeBox.Text;\r\n\t\t\tvar option = AppContext.ImageExtracter;\r\n\t\t\toption.ExtractAnnotationImages = _ExportAnnotImagesBox.Checked;\r\n\t\t\toption.PageRange = _ExtractPageRangeBox.Text;\r\n\t\t\toption.OutputPath = _TargetBox.Text;\r\n\t\t\toption.FileMask = _FileNameMaskBox.Text;\r\n\t\t\toption.MergeImages = _MergeImageBox.Checked;\r\n\t\t\toption.MergeJpgToPng = _MergeJpgToPngBox.Checked;\r\n\t\t\toption.VerticalFlipImages = _VerticalFlipImageBox.Checked;\r\n\t\t\toption.InvertBlackAndWhiteImages = _InvertBlackAndWhiteBox.Checked;\r\n\t\t\toption.MonoPng = _MonoPngBox.Checked;\r\n\t\t\toption.MinHeight = (int)_MinHeightBox.Value;\r\n\t\t\toption.MinWidth = (int)_MinWidthBox.Value;\r\n\t\t\toption.ExtractSoftMask = _ExportSoftMaskBox.Checked;\r\n\t\t\toption.InvertSoftMask = _InvertSoftMaskBox.Checked;\r\n\t\t\toption.AllowRedundantImages = _AllowRedundantImagesBox.Checked;\r\n\t\t\toption.ExtractOutOfPageImages = _ExtractOutOfPageImagesBox.Checked;\r\n\t\t\tworker.RunWorkerAsync(\r\n\t\t\t\tnew object[] {\r\n\t\t\t\tAppContext.SourceFiles, option\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t#region IDefaultButtonControl 成员\r\n\r\n\t\tpublic override Button DefaultButton => _ExtractButton;\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid _FileNameMaskBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\tShowFileMaskPreview();\r\n\t\t}\r\n\r\n\t\tvoid ShowFileMaskPreview() {\r\n\t\t\ttry {\r\n\t\t\t\tvar previews = new string[7];\r\n\t\t\t\tvar f = _FileNameMaskBox.Text;\r\n\t\t\t\tpreviews[0] = 1.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[1] = 2.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[2] = 3.ToString(f) + \".jpg ...\";\r\n\t\t\t\tpreviews[3] = \"\\n\" + 11.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[4] = 12.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[5] = 13.ToString(f) + \".jpg ...\";\r\n\t\t\t\tpreviews[6] = 100.ToString(f) + \".jpg\";\r\n\t\t\t\t_FileMaskPreviewBox.Text = String.Join(\" \", previews);\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\t_FileMaskPreviewBox.Text = \"文件名掩码无效。\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid Control_Show(object sender, EventArgs e) {\r\n\t\t\tif (Visible && AppContext.MainForm != null) {\r\n\t\t\t\t_TargetBox.Contents = AppContext.Recent.Folders;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ExtractImageControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_SaveImageBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <data name=\"textBox1.Text\" xml:space=\"preserve\">\r\n    <value>页码范围说明：\r\n　　页码范围表示需处理的原始 PDF 文档页面。\r\n　　不指定页码范围时，提取源文件所有页面的内容。\r\n　　如有多个页码，可用“,”或“ ”（空格）隔开。\r\n　　用“-”表示起止页码。例如：“1;4-15;2 56”，表示依次提取第1页、第4至15页、第2页和第56页的内容。\r\n　　如“-”之前的数字大于“-”之后的数字，表示逆序处理。例如：“300-1”表示提取第300、299、298……3、2、1页的内容。\r\n　　负数表示文档倒数页数，例如“-1”表示倒数第1页，“1--2”表示从第1页到倒数第2页。</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "App/Functions/ExtractPageControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ExtractPageControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExtractPageControl));\r\n\t\t\tthis._ExtractPageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._KeepBookmarkBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveOrphanBoomarksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._KeepDocInfoPropertyBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._SourceFileControl = new PDFPatcher.SourceFileControl();\r\n\t\t\tthis._TargetFileControl = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._RemoveRestrictionBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ExcludePageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SeparatingModeBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._NumberFileNamesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SeperateByPageNumberBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.textBox1 = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._ExtractButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\tthis._EnableFullCompression = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabControl1.SuspendLayout();\r\n\t\t\tthis.tabPage1.SuspendLayout();\r\n\t\t\tthis.groupBox2.SuspendLayout();\r\n\t\t\tthis.groupBox1.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._SeperateByPageNumberBox)).BeginInit();\r\n\t\t\tthis.tabPage2.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _ExtractPageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExtractPageRangeBox.Location = new System.Drawing.Point(112, 65);\r\n\t\t\tthis._ExtractPageRangeBox.Name = \"_ExtractPageRangeBox\";\r\n\t\t\tthis._ExtractPageRangeBox.Size = new System.Drawing.Size(454, 21);\r\n\t\t\tthis._ExtractPageRangeBox.TabIndex = 3;\r\n\t\t\tthis._ExtractPageRangeBox.TextChanged += new System.EventHandler(this._ExtractPageRangeBox_TextChanged);\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(17, 68);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label3.TabIndex = 2;\r\n\t\t\tthis.label3.Text = \"页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _KeepBookmarkBox\r\n\t\t\t// \r\n\t\t\tthis._KeepBookmarkBox.AutoSize = true;\r\n\t\t\tthis._KeepBookmarkBox.Location = new System.Drawing.Point(6, 41);\r\n\t\t\tthis._KeepBookmarkBox.Name = \"_KeepBookmarkBox\";\r\n\t\t\tthis._KeepBookmarkBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._KeepBookmarkBox.TabIndex = 1;\r\n\t\t\tthis._KeepBookmarkBox.Text = \"保留原文档的书签\";\r\n\t\t\tthis._KeepBookmarkBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveOrphanBoomarksBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveOrphanBoomarksBox.AutoSize = true;\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Location = new System.Drawing.Point(6, 85);\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Name = \"_RemoveOrphanBoomarksBox\";\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Size = new System.Drawing.Size(168, 16);\r\n\t\t\tthis._RemoveOrphanBoomarksBox.TabIndex = 3;\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Text = \"删除连接到无效页面的书签\";\r\n\t\t\tthis._RemoveOrphanBoomarksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _KeepDocInfoPropertyBox\r\n\t\t\t// \r\n\t\t\tthis._KeepDocInfoPropertyBox.AutoSize = true;\r\n\t\t\tthis._KeepDocInfoPropertyBox.Location = new System.Drawing.Point(6, 19);\r\n\t\t\tthis._KeepDocInfoPropertyBox.Name = \"_KeepDocInfoPropertyBox\";\r\n\t\t\tthis._KeepDocInfoPropertyBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._KeepDocInfoPropertyBox.TabIndex = 0;\r\n\t\t\tthis._KeepDocInfoPropertyBox.Text = \"保留原文档的属性\";\r\n\t\t\tthis._KeepDocInfoPropertyBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _SourceFileControl\r\n\t\t\t// \r\n\t\t\tthis._SourceFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SourceFileControl.Location = new System.Drawing.Point(12, 3);\r\n\t\t\tthis._SourceFileControl.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._SourceFileControl.Name = \"_SourceFileControl\";\r\n\t\t\tthis._SourceFileControl.Size = new System.Drawing.Size(559, 29);\r\n\t\t\tthis._SourceFileControl.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _TargetFileControl\r\n\t\t\t// \r\n\t\t\tthis._TargetFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetFileControl.Location = new System.Drawing.Point(12, 33);\r\n\t\t\tthis._TargetFileControl.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TargetFileControl.Name = \"_TargetFileControl\";\r\n\t\t\tthis._TargetFileControl.Size = new System.Drawing.Size(559, 29);\r\n\t\t\tthis._TargetFileControl.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _RemoveRestrictionBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveRestrictionBox.AutoSize = true;\r\n\t\t\tthis._RemoveRestrictionBox.Location = new System.Drawing.Point(6, 63);\r\n\t\t\tthis._RemoveRestrictionBox.Name = \"_RemoveRestrictionBox\";\r\n\t\t\tthis._RemoveRestrictionBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._RemoveRestrictionBox.TabIndex = 2;\r\n\t\t\tthis._RemoveRestrictionBox.Text = \"解除原文档的限制\";\r\n\t\t\tthis._RemoveRestrictionBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(17, 97);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label2.TabIndex = 5;\r\n\t\t\tthis.label2.Text = \"排除页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _ExcludePageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._ExcludePageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExcludePageRangeBox.Location = new System.Drawing.Point(112, 94);\r\n\t\t\tthis._ExcludePageRangeBox.Name = \"_ExcludePageRangeBox\";\r\n\t\t\tthis._ExcludePageRangeBox.Size = new System.Drawing.Size(325, 21);\r\n\t\t\tthis._ExcludePageRangeBox.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(6, 23);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"拆分方式：\";\r\n\t\t\t// \r\n\t\t\t// _SeparatingModeBox\r\n\t\t\t// \r\n\t\t\tthis._SeparatingModeBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._SeparatingModeBox.FormattingEnabled = true;\r\n\t\t\tthis._SeparatingModeBox.Items.AddRange(new object[] {\r\n            \"按页码范围的分号标记拆分\",\r\n            \"按顶层书签拆分\",\r\n            \"按页数拆分\"});\r\n\t\t\tthis._SeparatingModeBox.Location = new System.Drawing.Point(89, 20);\r\n\t\t\tthis._SeparatingModeBox.Name = \"_SeparatingModeBox\";\r\n\t\t\tthis._SeparatingModeBox.Size = new System.Drawing.Size(217, 20);\r\n\t\t\tthis._SeparatingModeBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// tabControl1\r\n\t\t\t// \r\n\t\t\tthis.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage1);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage2);\r\n\t\t\tthis.tabControl1.Location = new System.Drawing.Point(12, 121);\r\n\t\t\tthis.tabControl1.Name = \"tabControl1\";\r\n\t\t\tthis.tabControl1.SelectedIndex = 0;\r\n\t\t\tthis.tabControl1.Size = new System.Drawing.Size(559, 197);\r\n\t\t\tthis.tabControl1.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add(this.groupBox2);\r\n\t\t\tthis.tabPage1.Controls.Add(this.groupBox1);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size(551, 171);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"选项\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Controls.Add(this._KeepDocInfoPropertyBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._EnableFullCompression);\r\n\t\t\tthis.groupBox2.Controls.Add(this._RemoveOrphanBoomarksBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._RemoveRestrictionBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._KeepBookmarkBox);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size(200, 135);\r\n\t\t\tthis.groupBox2.TabIndex = 0;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"文档\";\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Controls.Add(this._NumberFileNamesBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this.label5);\r\n\t\t\tthis.groupBox1.Controls.Add(this._SeperateByPageNumberBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this.label4);\r\n\t\t\tthis.groupBox1.Controls.Add(this.label1);\r\n\t\t\tthis.groupBox1.Controls.Add(this._SeparatingModeBox);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point(212, 6);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size(317, 111);\r\n\t\t\tthis.groupBox1.TabIndex = 1;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"拆分文档\";\r\n\t\t\t// \r\n\t\t\t// _NumberFileNamesBox\r\n\t\t\t// \r\n\t\t\tthis._NumberFileNamesBox.AutoSize = true;\r\n\t\t\tthis._NumberFileNamesBox.Location = new System.Drawing.Point(24, 70);\r\n\t\t\tthis._NumberFileNamesBox.Name = \"_NumberFileNamesBox\";\r\n\t\t\tthis._NumberFileNamesBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._NumberFileNamesBox.TabIndex = 6;\r\n\t\t\tthis._NumberFileNamesBox.Text = \"在文件名前面添加编号\";\r\n\t\t\tthis._NumberFileNamesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(234, 48);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(17, 12);\r\n\t\t\tthis.label5.TabIndex = 4;\r\n\t\t\tthis.label5.Text = \"页\";\r\n\t\t\t// \r\n\t\t\t// _SeperateByPageNumberBox\r\n\t\t\t// \r\n\t\t\tthis._SeperateByPageNumberBox.Location = new System.Drawing.Point(153, 46);\r\n\t\t\tthis._SeperateByPageNumberBox.Maximum = new decimal(new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._SeperateByPageNumberBox.Minimum = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._SeperateByPageNumberBox.Name = \"_SeperateByPageNumberBox\";\r\n\t\t\tthis._SeperateByPageNumberBox.Size = new System.Drawing.Size(75, 21);\r\n\t\t\tthis._SeperateByPageNumberBox.TabIndex = 3;\r\n\t\t\tthis._SeperateByPageNumberBox.Value = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(22, 48);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(125, 12);\r\n\t\t\tthis.label4.TabIndex = 2;\r\n\t\t\tthis.label4.Text = \"按页数拆分：每个文档\";\r\n\t\t\t// \r\n\t\t\t// tabPage2\r\n\t\t\t// \r\n\t\t\tthis.tabPage2.Controls.Add(this.textBox1);\r\n\t\t\tthis.tabPage2.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage2.Name = \"tabPage2\";\r\n\t\t\tthis.tabPage2.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);\r\n\t\t\tthis.tabPage2.Size = new System.Drawing.Size(551, 171);\r\n\t\t\tthis.tabPage2.TabIndex = 1;\r\n\t\t\tthis.tabPage2.Text = \"关于页码范围的说明\";\r\n\t\t\tthis.tabPage2.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// textBox1\r\n\t\t\t// \r\n\t\t\tthis.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.textBox1.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis.textBox1.Multiline = true;\r\n\t\t\tthis.textBox1.Name = \"textBox1\";\r\n\t\t\tthis.textBox1.ReadOnly = true;\r\n\t\t\tthis.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\r\n\t\t\tthis.textBox1.Size = new System.Drawing.Size(532, 159);\r\n\t\t\tthis.textBox1.TabIndex = 1;\r\n\t\t\tthis.textBox1.Text = resources.GetString(\"textBox1.Text\");\r\n\t\t\t// \r\n\t\t\t// _ExtractButton\r\n\t\t\t// \r\n\t\t\tthis._ExtractButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExtractButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExtractButton.AnimateGlow = true;\r\n\t\t\tthis._ExtractButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExtractButton.CornerRadius = 3;\r\n\t\t\tthis._ExtractButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ExtractButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ExtractButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ExtractButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ExtractButton.Location = new System.Drawing.Point(443, 92);\r\n\t\t\tthis._ExtractButton.Name = \"_ExtractButton\";\r\n\t\t\tthis._ExtractButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ExtractButton.ShowFocusBorder = true;\r\n\t\t\tthis._ExtractButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ExtractButton.TabIndex = 14;\r\n\t\t\tthis._ExtractButton.Text = \" 提取页面(&T)\";\r\n\t\t\tthis._ExtractButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ExtractButton.Click += new System.EventHandler(this._ExtractButton_Click);\r\n\t\t\t// \r\n\t\t\t// _EnableFullCompression\r\n\t\t\t// \r\n\t\t\tthis._EnableFullCompression.AutoSize = true;\r\n\t\t\tthis._EnableFullCompression.Location = new System.Drawing.Point(6, 107);\r\n\t\t\tthis._EnableFullCompression.Name = \"_EnableFullCompression\";\r\n\t\t\tthis._EnableFullCompression.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._EnableFullCompression.TabIndex = 3;\r\n\t\t\tthis._EnableFullCompression.Text = \"清理并压缩输出文档\";\r\n\t\t\tthis._EnableFullCompression.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// ExtractPageControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._ExtractButton);\r\n\t\t\tthis.Controls.Add(this.tabControl1);\r\n\t\t\tthis.Controls.Add(this._ExcludePageRangeBox);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._SourceFileControl);\r\n\t\t\tthis.Controls.Add(this._ExtractPageRangeBox);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this._TargetFileControl);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"ExtractPageControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(583, 333);\r\n\t\t\tthis.tabControl1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.PerformLayout();\r\n\t\t\tthis.groupBox1.ResumeLayout(false);\r\n\t\t\tthis.groupBox1.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._SeperateByPageNumberBox)).EndInit();\r\n\t\t\tthis.tabPage2.ResumeLayout(false);\r\n\t\t\tthis.tabPage2.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.TextBox _ExtractPageRangeBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate SourceFileControl _SourceFileControl;\r\n\t\tprivate TargetFileControl _TargetFileControl;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepBookmarkBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveOrphanBoomarksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepDocInfoPropertyBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveRestrictionBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _ExcludePageRangeBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.ComboBox _SeparatingModeBox;\r\n\t\tprivate System.Windows.Forms.TabControl tabControl1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage2;\r\n\t\tprivate System.Windows.Forms.TextBox textBox1;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _SeperateByPageNumberBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.CheckBox _NumberFileNamesBox;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ExtractButton;\r\n\t\tprivate System.Windows.Forms.CheckBox _EnableFullCompression;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ExtractPageControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tsealed partial class ExtractPageControl : FunctionControl, IResettableControl, IDocumentSource\r\n\t{\r\n\t\tpublic override string FunctionName => \"提取页面\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.ExtractPages;\r\n\r\n\t\tpublic ExtractPageControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tpublic string DocumentPath => _SourceFileControl.Text;\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tAppContext.MainForm.SetTooltip(_SourceFileControl.FileList, \"需要提取页面的 PDF 文件路径，可选择多个文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractPageRangeBox, \"提取页面的页码范围，不指定页码范围时提取源文件的所有页\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetFileControl.FileList, \"输出 PDF 文件的路径，右键点击插入文件名替代符\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractButton, \"点击此按钮，提取源 PDF 文件指定范围的页面，生成新的文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_SeparatingModeBox, \"选择拆分源 PDF 文档的方式\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_SeperateByPageNumberBox, \"将源 PDF 文档按页数拆分\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_NumberFileNamesBox, \"按书签拆分：在拆分所得的文件名前面添加“1 - ”、“2 - ”等顺序编号；其它拆分：第 1 个文件名也添加编号\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExcludePageRangeBox, \"不提取此范围内的页面\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_EnableFullCompression, \"去除文档中未被使用的对象，尽可能压缩输出文档\");\r\n\r\n\t\t\t_TargetFileControl.FileMacroMenu.LoadStandardInfoMacros();\r\n\t\t\t_TargetFileControl.FileMacroMenu.LoadStandardSourceFileMacros();\r\n\t\t\t_SeparatingModeBox.SelectedIndexChanged += (s, args) => {\r\n\t\t\t\t_NumberFileNamesBox.Text = _SeparatingModeBox.SelectedIndex == 1 ? \"在文件名前面添加编号\" : \"第一个文件名也添加编号\";\r\n\t\t\t\t_SeperateByPageNumberBox.Enabled = _SeparatingModeBox.SelectedIndex == 2;\r\n\t\t\t};\r\n\t\t\t((IResettableControl)this).Reload();\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\t_SourceFileControl.BrowseFile();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ExtractButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (File.Exists(_SourceFileControl.FirstFile) == false) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_TargetFileControl.Text.IsNullOrWhiteSpace()) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tAppContext.SourceFiles = _SourceFileControl.Files;\r\n\t\t\tif (AppContext.SourceFiles.Length == 1) {\r\n\t\t\t\t_SourceFileControl.FileList.AddHistoryItem();\r\n\t\t\t\t_TargetFileControl.FileList.AddHistoryItem();\r\n\t\t\t}\r\n\t\t\tvar o = AppContext.ExtractPage;\r\n\t\t\to.EnableFullCompression = _EnableFullCompression.Checked;\r\n\t\t\to.KeepBookmarks = _KeepBookmarkBox.Checked;\r\n\t\t\to.KeepDocumentProperties = _KeepDocInfoPropertyBox.Checked;\r\n\t\t\to.RemoveOrphanBookmarks = _RemoveOrphanBoomarksBox.Checked;\r\n\t\t\to.PageRanges = _ExtractPageRangeBox.Text;\r\n\t\t\to.RemoveDocumentRestrictions = _RemoveRestrictionBox.Checked;\r\n\t\t\to.ExcludePageRanges = _ExcludePageRangeBox.Text;\r\n\t\t\to.SeparatingMode = _SeparatingModeBox.SelectedIndex;\r\n\t\t\to.SeparateByPage = (int)_SeperateByPageNumberBox.Value;\r\n\t\t\to.NumberFileNames = _NumberFileNamesBox.Checked;\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar a = arg.Argument as object[];\r\n\t\t\t\tvar files = a[0] as string[];\r\n\t\t\t\tvar t = a[1] as string;\r\n\t\t\t\tvar options = a[2] as ExtractPageOptions;\r\n\t\t\t\tif (files.Length > 1) {\r\n\t\t\t\t\tvar m = FileHelper.HasFileNameMacro(t); // 包含替换符\r\n\t\t\t\t\tvar p = m ? null : Path.GetDirectoryName(t);\r\n\t\t\t\t\tTracker.SetTotalProgressGoal(files.Length);\r\n\t\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\t\tProcessor.Worker.ExtractPages(options,\r\n\t\t\t\t\t\t\tfile,\r\n\t\t\t\t\t\t\tm ? t : FileHelper.CombinePath(p, Path.GetFileNameWithoutExtension(file) + Constants.FileExtensions.Pdf));\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tProcessor.Worker.ExtractPages(options, files[0], t);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerAsync(new object[] {\r\n\t\t\t\tAppContext.SourceFiles,\r\n\t\t\t\t_TargetFileControl.Text,\r\n\t\t\t\tAppContext.ExtractPage\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvoid _ExtractPageRangeBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\tAppContext.Exporter.ExtractPageRange = _ExtractPageRangeBox.Text;\r\n\t\t}\r\n\r\n\t\t#region IDefaultButtonControl 成员\r\n\r\n\t\tpublic override Button DefaultButton => _ExtractButton;\r\n\r\n\t\t#endregion\r\n\r\n\r\n\t\t#region IResettableControl 成员\r\n\r\n\t\tvoid IResettableControl.Reset() {\r\n\t\t\tAppContext.ExtractPage = new ExtractPageOptions();\r\n\t\t\t((IResettableControl)this).Reload();\r\n\t\t}\r\n\r\n\t\tvoid IResettableControl.Reload() {\r\n\t\t\tvar options = AppContext.ExtractPage;\r\n\t\t\t_EnableFullCompression.Checked = options.EnableFullCompression;\r\n\t\t\t_KeepBookmarkBox.Checked = options.KeepBookmarks;\r\n\t\t\t_KeepDocInfoPropertyBox.Checked = options.KeepDocumentProperties;\r\n\t\t\t_RemoveRestrictionBox.Checked = options.RemoveDocumentRestrictions;\r\n\t\t\t_RemoveOrphanBoomarksBox.Checked = options.RemoveOrphanBookmarks;\r\n\t\t\t_SeparatingModeBox.Select(options.SeparatingMode);\r\n\t\t\t_NumberFileNamesBox.Checked = options.NumberFileNames;\r\n\t\t\t_SeperateByPageNumberBox.SetValue(options.SeparateByPage);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ExtractPageControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <data name=\"textBox1.Text\" xml:space=\"preserve\">\r\n    <value>页码范围说明；\r\n　　页码范围表示需处理的原始 PDF 文档页面。\r\n　　不指定页码范围时，提取源文件所有页面的内容。\r\n　　如有多个页码，可用“,”或“ ”（空格）隔开。\r\n　　用“-”表示起止页码。例如：“1;4-15;2 56”，表示依次提取第1页、第4至15页、第2页和第56页的内容。\r\n　　如“-”之前的数字大于“-”之后的数字，表示逆序处理。例如：“300-1”表示提取第300、299、298……3、2、1页的内容。\r\n　　负数表示文档倒数页数，例如“-1”表示倒数第1页，“1--2”表示从第1页到倒数第2页。\r\n　　分号“;”表示拆分成多个文件，例如“1-5;1,6-10”表示拆分成两个文件，其中第1至5页为一个文件，第1页和6到10页为第二个文件。</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "App/Functions/FileListHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed class FileListHelper\r\n\t{\r\n\t\tpublic delegate void AddFilesCallback(string[] files, bool alertInvalidFiles);\r\n\r\n\t\treadonly ObjectListView _fileList;\r\n\t\tpublic FileListHelper(ObjectListView fileList) {\r\n\t\t\t_fileList = fileList;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设置 PDF 文件列表的拖放操作。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"addFilesCallback\">添加文件的回调函数。</param>\r\n\t\tpublic void SetupDragAndDrop(AddFilesCallback addFilesCallback) {\r\n\t\t\t_fileList.DragSource = new SimpleDragSource(true);\r\n\t\t\tvar ds = new RearrangingDropSink(false);\r\n\t\t\t_fileList.DropSink = ds;\r\n\r\n\t\t\tds.CanDrop += (s, args) => {\r\n\t\t\t\tvar files = FormHelper.DropFileOver(args.DragEventArgs, Constants.FileExtensions.Pdf);\r\n\t\t\t\tif (files.Length > 0) {\r\n\t\t\t\t\targs.Effect = DragDropEffects.Link;\r\n\t\t\t\t\targs.InfoMessage = \"添加 \" + files.Length.ToString() + \" 个文件\";\r\n\t\t\t\t\targs.Handled = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tds.Dropped += (s, args) => {\r\n\t\t\t\tvar files = FormHelper.DropFileOver(args.DragEventArgs, Constants.FileExtensions.Pdf);\r\n\t\t\t\tif (files.Length > 0) {\r\n\t\t\t\t\t_fileList.SelectedIndex\r\n\t\t\t\t\t\t= args.DropTargetLocation == DropTargetLocation.Background\r\n\t\t\t\t\t\t? _fileList.GetItemCount() - 1\r\n\t\t\t\t\t\t: args.DropTargetIndex + (args.DropTargetLocation == DropTargetLocation.AboveItem ? -1 : 0);\r\n\t\t\t\t\taddFilesCallback(files, false);\r\n\t\t\t\t\targs.Handled = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 打开 PDF 文件的 <see cref=\"ToolStripSplitButton\"/> 显示下拉文件列表的事件处理函数。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sender\"></param>\r\n\t\t/// <param name=\"e\"></param>\r\n\t\tpublic static void OpenPdfButtonDropDownOpeningHandler(object sender, EventArgs e) {\r\n\t\t\tvar b = sender as ToolStripSplitButton;\r\n\t\t\tvar l = b.DropDown.Items;\r\n\t\t\tl.ClearDropDownItems();\r\n\t\t\tforeach (var item in AppContext.Recent.SourcePdfFiles) {\r\n\t\t\t\tl.Add(FileHelper.GetEllipticPath(item, 50)).ToolTipText = item;\r\n\t\t\t}\r\n\t\t\tif (l.Count == 0) {\r\n\t\t\t\tb.PerformButtonClick();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 以指定编码刷新文件列表的选定项目。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"encoding\">用于读取文档元数据的 <see cref=\"Enocding\"/>。</param>\r\n\t\tpublic void RefreshInfo(Encoding encoding) {\r\n\t\t\tvar ol = _fileList.SelectedObjects;\r\n\t\t\tif (ol.Count == 0) {\r\n\t\t\t\t_fileList.SelectAll();\r\n\t\t\t\tol = _fileList.SelectedObjects;\r\n\t\t\t}\r\n\t\t\tforeach (SourceItem.Pdf item in ol) {\r\n\t\t\t\titem.Refresh(encoding);\r\n\t\t\t}\r\n\t\t\t_fileList.RefreshObjects(ol);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 为 <see cref=\"OLVColumn\"/> 设置读写处理函数。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"columns\">需要设置的列。</param>\r\n\t\tpublic static void SetupCommonPdfColumns(params OLVColumn[] columns) {\r\n\t\t\tforeach (var item in columns) {\r\n\t\t\t\tswitch (item.Text) {\r\n\t\t\t\t\tcase \"源文件名\": SetupFileNameColumn(item); break;\r\n\t\t\t\t\tcase \"文件夹\": SetupFolderNameColumn(item); break;\r\n\t\t\t\t\tcase \"标题\": SetupTitleColumn(item); break;\r\n\t\t\t\t\tcase \"作者\": SetupAuthorColumn(item); break;\r\n\t\t\t\t\tcase \"主题\": SetupSubjectColumn(item); break;\r\n\t\t\t\t\tcase \"关键词\": SetupKeywordsColumn(item); break;\r\n\t\t\t\t\tcase \"页数\": SetupPageCountColumn(item); break;\r\n\t\t\t\t\tcase \"修改时间\": SetupFileTimeColumn(item); break;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tstatic void SetupAuthorColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem.Pdf>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.DocInfo.Author;\r\n\t\t\t\tc.AspectPutter = (o, value) => o.DocInfo.Author = value as string;\r\n\t\t\t});\r\n\t\t}\r\n\t\tstatic void SetupKeywordsColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem.Pdf>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.DocInfo.Keywords;\r\n\t\t\t\tc.AspectPutter = (o, value) => o.DocInfo.Keywords = value as string;\r\n\t\t\t});\r\n\t\t}\r\n\t\tstatic void SetupSubjectColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem.Pdf>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.DocInfo.Subject;\r\n\t\t\t\tc.AspectPutter = (o, value) => o.DocInfo.Subject = value as string;\r\n\t\t\t});\r\n\t\t}\r\n\t\tstatic void SetupTitleColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem.Pdf>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.DocInfo.Title;\r\n\t\t\t\tc.AspectPutter = (o, value) => o.DocInfo.Title = value as string;\r\n\t\t\t});\r\n\t\t}\r\n\t\tstatic void SetupPageCountColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem.Pdf>(c => c.AspectGetter = o => o.PageCount.ToText());\r\n\t\t}\r\n\t\tstatic void SetupFileNameColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem.Pdf>(c => {\r\n\t\t\t\tc.AspectGetter = o => o.Type == SourceItem.ItemType.Empty ? \"<空白页面>\" : o.FileName;\r\n\t\t\t\tc.ImageGetter = o => 0;\r\n\t\t\t});\r\n\t\t}\r\n\t\tstatic void SetupFolderNameColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem>(c => c.AspectGetter = o => o.Type != SourceItem.ItemType.Empty ? o.FolderName : String.Empty);\r\n\t\t}\r\n\t\tstatic void SetupFileTimeColumn(OLVColumn column) {\r\n\t\t\tcolumn.AsTyped<SourceItem>(c => c.AspectGetter = o => o.FileTime);\r\n\t\t\tcolumn.AspectToStringConverter = o => ((DateTime)o).ToText();\r\n\t\t}\r\n\r\n\t\tpublic void SetupHotkeys() {\r\n\t\t\t_fileList.KeyUp += (s, args) => {\r\n\t\t\t\tswitch (args.KeyCode) {\r\n\t\t\t\t\tcase Keys.Delete:\r\n\t\t\t\t\t\tif (_fileList.IsCellEditing || _fileList.Focused == false) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tProcessCommonMenuCommand(Commands.Delete);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic bool ProcessCommonMenuCommand(string commandID) {\r\n\t\t\tswitch (commandID) {\r\n\t\t\t\tcase Commands.Delete:\r\n\t\t\t\t\tif (_fileList.GetItemCount() == 0) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar l = _fileList.SelectedObjects;\r\n\t\t\t\t\tif (l.Count == 0) {\r\n\t\t\t\t\t\tif (FormHelper.YesNoBox(\"是否清空文件列表？\") == DialogResult.Yes) {\r\n\t\t\t\t\t\t\t_fileList.ClearObjects();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t_fileList.RemoveObjects(_fileList.SelectedObjects);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_Copy\":\r\n\t\t\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\t\t\tforeach (SourceItem.Pdf item in GetSourceItems<SourceItem>(true)) {\r\n\t\t\t\t\t\tsb.AppendLine(String.Join(\"\\t\", new string[] {\r\n\t\t\t\t\t\t\titem.FilePath.ToString(),\r\n\t\t\t\t\t\t\titem.PageCount.ToText (),\r\n\t\t\t\t\t\t\titem.DocInfo.Title,\r\n\t\t\t\t\t\t\titem.DocInfo.Author,\r\n\t\t\t\t\t\t\titem.DocInfo.Subject,\r\n\t\t\t\t\t\t\titem.DocInfo.Keywords\r\n\t\t\t\t\t\t}));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (sb.Length > 0) {\r\n\t\t\t\t\t\tClipboard.SetText(StringBuilderCache.GetStringAndRelease(sb));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tStringBuilderCache.Release(sb);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllItems:\r\n\t\t\t\t\t_fileList.SelectAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.InvertSelection:\r\n\t\t\t\t\tforeach (ListViewItem item in _fileList.Items) {\r\n\t\t\t\t\t\titem.Selected = !item.Selected;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectNone:\r\n\t\t\t\t\t_fileList.SelectObjects(null);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic List<T> GetSourceItems<T>(bool selectedOnly) where T : SourceItem {\r\n\t\t\tif (_fileList.GetItemCount() == 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar l = (selectedOnly ? _fileList.SelectedObjects : _fileList.Objects);\r\n\t\t\tvar items = new List<T>(selectedOnly ? 10 : _fileList.GetItemCount());\r\n\t\t\tforeach (T item in l) {\r\n\t\t\t\tif (item == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\titems.Add(item);\r\n\t\t\t}\r\n\t\t\treturn items;\r\n\t\t}\r\n\r\n\t\tpublic void PrepareSourceFiles() {\r\n\t\t\tvar c = _fileList.GetItemCount();\r\n\t\t\tif (c == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar f = new string[c];\r\n\t\t\tvar i = 0;\r\n\t\t\tforeach (SourceItem item in _fileList.Objects) {\r\n\t\t\t\tif (item.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\tf[i++] = item.FilePath.ToString();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tArray.Resize(ref f, i);\r\n\t\t\tAppContext.SourceFiles = f;\r\n\t\t}\r\n\r\n\t\tpublic void ResizeItemListColumns() {\r\n\t\t\tvar c = _fileList.Columns[0];\r\n\t\t\t_fileList.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);\r\n\t\t\tif (c.Width < 100) {\r\n\t\t\t\tc.Width = 100;\r\n\t\t\t}\r\n\t\t\tfor (int i = 1; i < _fileList.Columns.Count; i++) {\r\n\t\t\t\tc = _fileList.Columns[i];\r\n\t\t\t\tif (c.Width < 50) {\r\n\t\t\t\t\tc.Width = 50;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/FormState.cs",
    "content": "﻿using System.Drawing;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t/// <summary>\r\n\t/// 用于保存窗体状态的类。\r\n\t/// </summary>\r\n\tpublic sealed class FormState\r\n\t{\r\n\t\tFormBorderStyle _borderStyle;\r\n\t\tbool _topMost;\r\n\t\tRectangle _bounds;\r\n\r\n\t\tbool _isMaximized;\r\n\r\n\t\tpublic void Maximize(Form targetForm) {\r\n\t\t\tif (_isMaximized) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_isMaximized = true;\r\n\t\t\tif (targetForm.WindowState == FormWindowState.Maximized) {\r\n\t\t\t\ttargetForm.WindowState = FormWindowState.Normal;\r\n\t\t\t}\r\n\t\t\tSave(targetForm);\r\n\t\t\ttargetForm.FormBorderStyle = FormBorderStyle.None;\r\n\t\t\ttargetForm.TopMost = true;\r\n\t\t\ttargetForm.Bounds = Screen.FromControl(targetForm).Bounds;\r\n\t\t}\r\n\r\n\t\tvoid Save(Form targetForm) {\r\n\t\t\t_borderStyle = targetForm.FormBorderStyle;\r\n\t\t\t_topMost = targetForm.TopMost;\r\n\t\t\t_bounds = targetForm.Bounds;\r\n\t\t}\r\n\r\n\t\tpublic void Restore(Form targetForm) {\r\n\t\t\ttargetForm.FormBorderStyle = _borderStyle;\r\n\t\t\ttargetForm.TopMost = _topMost;\r\n\t\t\ttargetForm.Bounds = _bounds;\r\n\t\t\t_isMaximized = false;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/FrontPage.html",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n<html>\r\n\t<head>\r\n\t\t<title>$appName</title>\r\n\t\t<style>\r\nbody {\r\n\tmargin: 0;\r\n\tpadding: 5pt;\r\n}\r\nh1 {\r\n\tfont-size: 15pt;\r\n\tcolor: #6666cc;\r\n\tborder-bottom: 1px dashed #9900ff;\r\n\tmargin: 5pt 0;\r\n}\r\np {\r\n\tpadding: 3pt 10pt;\r\n\tmargin: 0pt;\r\n\tfont-size: 11pt;\r\n\tcolor: #999999;\r\n}\r\nh2 {\r\n\tfont-size: 12pt;\r\n\tpadding: 3pt 0;\r\n\tmargin: 0;\r\n\tcolor: #6666cc;\r\n}\r\ntd {\r\n\tvertical-align: top;\r\n}\r\n\t\t</style>\r\n\t</head>\r\n\t<body>\r\n\t\t<h1><a href=\"func:About\">$appName</a></h1>\r\n\t\t<table>\r\n\t\t\t<tr>\r\n\t\t\t\t<td style=\"border-right: 1px solid blue; padding-right: 5pt; width: $sideBarWidth;\">\r\n\t\t\t\t\t<h2>处理 PDF 文档</h2>\r\n\t\t\t\t\t<div>Editor;Editor;修改 PDF 文件;创建或修改 PDF 文档的书签，修改 PDF 文档的设置</div>\r\n\t\t\t\t\t<div>DocumentProcessor;Patcher;批量修改 PDF 文件;根据配置批量处理 PDF 文档，生成新的文档</div>\r\n\t\t\t\t\t<div>Merger;Merger;合并文件;将多个图片和 PDF 文档合并为新的 PDF 文档</div>\r\n\t\t\t\t\t<div>Ocr;Ocr;识别图像文本;识别扫描 PDF 文档的文字（需微软 Office 2003或2007的光学字符识别<i>（OCR）</i>引擎支持）</div>\r\n\t\t\t\t\t<div>AutoBookmark;BookmarkGenerator;自动生成书签;根据 PDF 的文本样式生成书签文件</div>\r\n\t\t\t\t\t<div>Rename;Rename;批量重命名文件;根据 PDF 的文本属性更改文件名</div>\r\n\t\t\t\t\t<h2>提取文档内容</h2>\r\n\t\t\t\t\t<div>ExtractPages;ExtractPages;提取页面或拆分文档;提取 PDF 文档的页面或重排页面</div>\r\n\t\t\t\t\t<div>ExtractImage;ExtractImages;提取图片;无损提取 PDF 文档中的图片</div>\r\n\t\t\t\t\t<div>RenderDocument;RenderPages;转换页面为图片;将 PDF 文档的页面转换为图片</div>\r\n\t\t\t\t\t<h2>高手工具</h2>\r\n\t\t\t\t\t<div>DocumentInspector;Inspector;文档结构探查器;探查 PDF 文档的内部结构</div>\r\n\t\t\t\t\t<div>ExportInfoFile;InfoExchanger;导出或导入信息文件;导出书签、文档元数据、阅读器设定等信息到信息文件</div>\r\n\t\t\t\t\t<div>AppOptions;Options;程序配置;修改 PDF 补丁丁的程序配置</div>\r\n\t\t\t\t\t<h2>支持作者</h2>\r\n\t\t\t\t\t<div>About;About;关于本软件;支持软件发展</div>\r\n\t\t\t\t</td>\r\n\t\t\t\t<td style=\"padding-left: 5pt;\">\r\n\t\t\t\t\t<div>请点击左边的功能，或<a href=\"exec:_Open\">打开需要修改的文件</a>。</div>\r\n\t\t\t\t\t<ol style=\"margin-top: 5pt;\">\r\n\t\t\t\t\t\t<li></li>\r\n\t\t\t\t\t</ol>\r\n\t\t\t\t\t<div>点击此处 <a href=\"exec:_CleanUpInexistentFiles\">清理不存在的文件记录</a>。</div>\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t</table>\r\n        <div style=\"font-size: 9pt\">著作权所有：WMJordan；主页：<a href=\"$appHomePage\">$appHomePage</a>；电邮：wmjordan@163.com</div>\r\n\t</body>\r\n</html>"
  },
  {
    "path": "App/Functions/FrontPageControl.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class FrontPageControl\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._FrontPageBox = new TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _FrontPageBox\r\n\t\t\t// \r\n\t\t\tthis._FrontPageBox.AutoScroll = true;\r\n\t\t\tthis._FrontPageBox.BackColor = System.Drawing.SystemColors.Window;\r\n\t\t\tthis._FrontPageBox.BaseStylesheet = \"\";\r\n\t\t\tthis._FrontPageBox.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis._FrontPageBox.IsContextMenuEnabled = false;\r\n\t\t\tthis._FrontPageBox.IsSelectionEnabled = false;\r\n\t\t\tthis._FrontPageBox.Location = new System.Drawing.Point(9, 8);\r\n\t\t\tthis._FrontPageBox.Name = \"_FrontPageBox\";\r\n\t\t\tthis._FrontPageBox.Size = new System.Drawing.Size(433, 328);\r\n\t\t\tthis._FrontPageBox.TabIndex = 0;\r\n\t\t\tthis._FrontPageBox.Text = null;\r\n\t\t\tthis._FrontPageBox.LinkClicked += new System.EventHandler<TheArtOfDev.HtmlRenderer.Core.Entities.HtmlLinkClickedEventArgs>(this._FrontPageBox_LinkClicked);\r\n\t\t\tthis._FrontPageBox.ImageLoad += new System.EventHandler<TheArtOfDev.HtmlRenderer.Core.Entities.HtmlImageLoadEventArgs>(this._FrontPageBox_ImageLoad);\r\n\t\t\t// \r\n\t\t\t// FrontPageControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._FrontPageBox);\r\n\t\t\tthis.Name = \"FrontPageControl\";\r\n\t\t\tthis.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8);\r\n\t\t\tthis.Size = new System.Drawing.Size(451, 344);\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel _FrontPageBox;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/FrontPageControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Text.RegularExpressions;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing TheArtOfDev.HtmlRenderer.Core.Entities;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\t[ToolboxItem(false)]\r\n\tsealed partial class FrontPageControl : Functions.HtmlPageControl, ITabContent\r\n\t{\r\n\t\treadonly Regex __FrontPagePattern = new Regex(\"<div>(.+);(.+);(.+);(.+)</div>\", RegexOptions.CultureInvariant);\r\n\r\n\t\tpublic override string FunctionName => \"主页\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.HomePage;\r\n\r\n\t\tbool ITabContent.CanClose => false;\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open: \r\n\t\t\t\t\tvar n = AppContext.MainForm.ShowPdfFileDialog();\r\n\t\t\t\t\tif (n != null) {\r\n\t\t\t\t\t\tAppContext.MainForm.OpenFileWithEditor(n);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\tcase Commands.CleanUpInexistentFiles:\r\n\t\t\t\t\tAppContext.CleanUpInexistentFiles(AppContext.Recent.SourcePdfFiles);\r\n\t\t\t\t\tAppContext.CleanUpInexistentFiles(AppContext.Recent.InfoDocuments);\r\n\t\t\t\t\tAppContext.CleanUpInexistentFolders(AppContext.Recent.Folders);\r\n\t\t\t\t\tRefreshContent();\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t}\r\n\r\n\t\tpublic FrontPageControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tText = \"主页\";\r\n\t\t\tRefreshContent();\r\n\t\t\tRecentFileItemClicked = (s, args) => AppContext.MainForm.OpenFileWithEditor(args.ClickedItem.ToolTipText);\r\n\t\t\tAllowDrop = true;\r\n\t\t}\r\n\r\n\t\tprotected override void OnDragEnter(DragEventArgs drgevent) {\r\n\t\t\tbase.OnDragEnter(drgevent);\r\n\t\t\tdrgevent.FeedbackDragFileOver(Constants.FileExtensions.PdfAndAllBookmarkExtension);\r\n\t\t}\r\n\t\tprotected override void OnDragDrop(DragEventArgs drgevent) {\r\n\t\t\tbase.OnDragDrop(drgevent);\r\n\t\t\tforeach (var item in drgevent.DropFileOver(Constants.FileExtensions.PdfAndAllBookmarkExtension)) {\r\n\t\t\t\tAppContext.MainForm.OpenFileWithEditor(item);\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal override void OnSelected() {\r\n\t\t\tbase.OnSelected();\r\n\t\t\tRefreshContent();\r\n\t\t}\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tswitch (item.Name) {\r\n\t\t\t\tcase Commands.Close:\r\n\t\t\t\tcase Commands.Action:\r\n\t\t\t\t\tEnableCommand(item, false, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tvoid RefreshContent() {\r\n\t\t\tvar s = FormHelper.GetDpiScale(this);\r\n\t\t\t_FrontPageBox.Text = __FrontPagePattern\r\n\t\t\t\t\t\t .Replace(Properties.Resources.FrontPage, $@\"<div><a href=\"\"func:$2\"\"><img src=\"\"res:$1\"\" width=\"\"{s * 16}px\"\" />$3</a></div>\")\r\n\t\t\t\t\t\t .Replace(\"$sideBarWidth\", (s * 180).ToText() + \"px\")\r\n\t\t\t\t\t\t .Replace(\"$appName\", Constants.AppName)\r\n\t\t\t\t\t\t .Replace(\"$appHomePage\", Constants.AppHomePage)\r\n\t\t\t\t\t\t .Replace(\"<li></li>\", GetLastFileList());\r\n\t\t}\r\n\r\n\t\tstring GetLastFileList() {\r\n\t\t\tvar i = 0;\r\n\t\t\treturn String.Concat(AppContext.Recent.SourcePdfFiles.ConvertAll((s) => FileHelper.IsPathValid(s) && new FilePath(s).ExistsFile\r\n\t\t\t\t  ? $\"<li><a href=\\\"recent:{i++}\\\">{s.SubstringAfter('\\\\')}</a></li>\"\r\n\t\t\t\t  : $\"<li id=\\\"{i++}\\\">{s.SubstringAfter('\\\\')}</li>\"));\r\n\t\t}\r\n\r\n\t\tvoid _FrontPageBox_LinkClicked(object sender, HtmlLinkClickedEventArgs e) {\r\n\t\t\tHandleLinkClicked(e.Link);\r\n\t\t\te.Handled = true;\r\n\t\t}\r\n\r\n\t\tvoid _FrontPageBox_ImageLoad(object sender, HtmlImageLoadEventArgs e) {\r\n\t\t\tLoadResourceImage(e);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/FrontPageControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/FunctionControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic class FunctionControl : UserControl\r\n\t{\r\n\t\t[Browsable(false)]\r\n\t\tpublic virtual string FunctionName => null;\r\n\t\t[Browsable(false)]\r\n\t\tpublic virtual System.Drawing.Bitmap IconImage => null;\r\n\t\t[Browsable(false)]\r\n\t\tpublic virtual Button DefaultButton => null;\r\n\r\n\t\tpublic EventHandler ListRecentFiles;\r\n\r\n\t\tpublic EventHandler<ToolStripItemClickedEventArgs> RecentFileItemClicked;\r\n\r\n\t\tpublic void ExecuteCommand(ToolStripItem item) {\r\n\t\t\titem.HidePopupMenu();\r\n\t\t\tExecuteCommand(item.Name);\r\n\t\t}\r\n\r\n\t\tpublic virtual void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tif (Commands.OpenFile != commandName) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// 将第一个文本框设置为文件路径\r\n\t\t\tif (parameters.Length > 0 && String.IsNullOrEmpty(parameters[0]) == false\r\n\t\t\t&& FileHelper.HasExtension(parameters[0], Constants.FileExtensions.Pdf)\r\n\t\t\t) {\r\n\t\t\t\tforeach (Control c in Controls) {\r\n\t\t\t\t\tif (c is SourceFileControl i) {\r\n\t\t\t\t\t\ti.Text = parameters[0];\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic virtual void SetupCommand(ToolStripItem item) { }\r\n\t\tinternal virtual void OnSelected() { }\r\n\t\tinternal virtual void OnDeselected() { }\r\n\r\n\t\tprotected FunctionControl() {\r\n\t\t\tListRecentFiles = (s, args) => {\r\n\t\t\t\tvar l = ((ToolStripDropDownItem)s).DropDown.Items;\r\n\t\t\t\tl.ClearDropDownItems();\r\n\t\t\t\tl.AddSourcePdfFiles();\r\n\t\t\t};\r\n\t\t\tRecentFileItemClicked = (s, args) => ExecuteCommand(Commands.OpenFile, args.ClickedItem.ToolTipText);\r\n\t\t}\r\n\r\n\t\tinternal void SetupMenu(ToolStripMenuItem menu) {\r\n\t\t\tSetupMenu(menu.DropDownItems);\r\n\t\t}\r\n\t\tinternal void SetupMenu(ToolStripItemCollection items) {\r\n\t\t\tvar pvs = false; // 前一个可见项目是否为分隔符\r\n\t\t\tforeach (ToolStripItem item in items) {\r\n\t\t\t\tswitch (item.Name) {\r\n\t\t\t\t\tcase Commands.Action:\r\n\t\t\t\t\t\tif (DefaultButton != null) {\r\n\t\t\t\t\t\t\tvar b = DefaultButton;\r\n\t\t\t\t\t\t\titem.Image = b.Image;\r\n\t\t\t\t\t\t\titem.Text = b.Text.Trim();\r\n\t\t\t\t\t\t\titem.ToolTipText = b.Tag as string;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tEnableCommand(item, true, true);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Commands.SaveBookmark:\r\n\t\t\t\t\t\titem.Text = \"保存书签文件(&Q)\";\r\n\t\t\t\t\t\titem.ToolTipText = \"将书签保存为 XML 格式的信息文件，可用于迁移书签\";\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase Commands.ResetOptions:\r\n\t\t\t\t\t\tEnableCommand(item, this is IResettableControl, true);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Commands.ShowGeneralToolbar:\r\n\t\t\t\t\t\tvar m = item as ToolStripMenuItem;\r\n\t\t\t\t\t\tm.Checked = AppContext.Toolbar.ShowGeneralToolbar;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tEnableCommand(item,\r\n\t\t\t\t\t\t\tCommands.DefaultDisabledItems.Contains(item.Name) == false,\r\n\t\t\t\t\t\t\tCommands.DefaultHiddenItems.Contains(item.Name) == false\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tSetupCommand(item);\r\n\t\t\t\tif (item.Visible) {\r\n\t\t\t\t\tif (item is ToolStripSeparator) {\r\n\t\t\t\t\t\titem.Visible = pvs == false;\r\n\t\t\t\t\t\tpvs = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tpvs = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void EnableCommand(ToolStripItem item, bool enabled, bool visible) {\r\n\t\t\tif (item == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\titem.Enabled = enabled;\r\n\t\t\titem.Visible = visible;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/FunctionTabContainer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tsealed class FunctionTabContainer : CustomTabControl\r\n\t{\r\n\t\tbool _MiddleClickCloseTab, _DoubleClickCloseTab;\r\n\r\n\t\tpublic Control FirstControlInActiveTab {\r\n\t\t\tget {\r\n\t\t\t\tvar t = SelectedTab;\r\n\t\t\t\treturn t == null || t.HasChildren == false ? null : t.Controls[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic bool MiddleClickCloseTab { get => _MiddleClickCloseTab; set => _MiddleClickCloseTab = value; }\r\n\t\tpublic bool DoubleClickCloseTab { get => _DoubleClickCloseTab; set => _DoubleClickCloseTab = value; }\r\n\r\n\t\tpublic bool SafeCloseTab(TabPage tabPage = null) {\r\n\t\t\tvar t = tabPage ?? SelectedTab;\r\n\t\t\tif (t is null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tControl c;\r\n\t\t\tif (t.HasChildren == false\r\n\t\t\t\t|| (c = t.Controls[0]) is ITabContent tc && tc.CanClose == false\r\n\t\t\t\t|| (c is IDocumentEditor editor\r\n\t\t\t\t\t&& editor.IsDirty\r\n\t\t\t\t\t&& AppContext.MainForm.ConfirmYesBox(Messages.ConfirmCloseDirtyDocument) == false)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar i = TabPages.IndexOf(tabPage);\r\n\t\t\tvar n = TabCount;\r\n\t\t\tif (i == 0 && n > 1) {\r\n\t\t\t\tSelectedIndex = 1;\r\n\t\t\t}\r\n\t\t\telse if (i < n) {\r\n\t\t\t\tSelectedIndex = i - 1;\r\n\t\t\t}\r\n\t\t\tTabPages.RemoveAt(i);\r\n\t\t\tt.Dispose();\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic IEnumerable<TObject> GetPrimaryControlsInTabs<TObject>() {\r\n\t\t\tforeach (TabPage item in TabPages) {\r\n\t\t\t\tif (item.Controls.Count != 0 && item.Controls[0] is TObject obj) {\r\n\t\t\t\t\tyield return obj;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnMouseClick(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseClick(e);\r\n\t\t\tif (e.Button == MouseButtons.Middle && _MiddleClickCloseTab) {\r\n\t\t\t\tCloseTabOnMouseEvent(e);\r\n\t\t\t}\r\n\t\t}\r\n\t\tprotected override void OnMouseDoubleClick(MouseEventArgs e) {\r\n\t\t\tbase.OnMouseDoubleClick(e);\r\n\t\t\tif (_DoubleClickCloseTab) {\r\n\t\t\t\tCloseTabOnMouseEvent(e);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid CloseTabOnMouseEvent(MouseEventArgs args) {\r\n\t\t\tfor (int i = TabCount - 1; i >= 0; i--) {\r\n\t\t\t\tif (GetTabRect(i).Contains(args.Location) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tSafeCloseTab(TabPages[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/HistoryComboBox.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class HistoryComboBox : ComboBox\r\n\t{\r\n\t\tpublic int MaxItemCount { get; set; }\r\n\t\tpublic IList<string> Contents { get; set; }\r\n\r\n\t\tpublic HistoryComboBox() {\r\n\t\t\tMaxItemCount = 16;\r\n\t\t\tDropDown += (s, args) => {\r\n\t\t\t\tItems.Clear();\r\n\t\t\t\tif (Contents == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tItems.AddRange(Contents.ToArray());\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal void AddHistoryItem() {\r\n\t\t\tAddHistoryItem(Text);\r\n\t\t}\r\n\r\n\t\tinternal void AddHistoryItem(string text) {\r\n\t\t\tif (text.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar i = IndexOf(text);\r\n\t\t\tif (i == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (i != -1) {\r\n\t\t\t\tRemoveAt(i);\r\n\t\t\t}\r\n\t\t\tInsert(0, text);\r\n\t\t\twhile (Contents.Count > MaxItemCount) {\r\n\t\t\t\tRemoveAt(Contents.Count - 1);\r\n\t\t\t}\r\n\t\t\tText = text;\r\n\t\t}\r\n\r\n\t\tint IndexOf(string o) {\r\n\t\t\tvar l = Contents;\r\n\t\t\tif (l != null) {\r\n\t\t\t\treturn l.IndexOf(o);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn Items.IndexOf(o);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid RemoveAt(int i) {\r\n\t\t\tvar l = Contents;\r\n\t\t\tif (l != null) {\r\n\t\t\t\tl.RemoveAt(i);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tItems.RemoveAt(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid Insert(int i, string o) {\r\n\t\t\tvar l = Contents;\r\n\t\t\tif (l != null) {\r\n\t\t\t\tl.Insert(i, o);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tItems.Insert(i, o);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/HtmlPageControl.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tclass HtmlPageControl : FunctionControl\r\n\t{\r\n\t\tprotected void HandleLinkClicked(string link) {\r\n\t\t\tvar i = link.IndexOf(':');\r\n\t\t\tif (i == -1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (link.Substring(0, i)) {\r\n\t\t\t\tcase \"func\":\r\n\t\t\t\t\tvar func = (Function)Enum.Parse(typeof(Function), link.Substring(i + 1));\r\n\t\t\t\t\tAppContext.MainForm.SelectFunctionList(func);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"recent\":\r\n\t\t\t\t\tAppContext.MainForm.OpenFileWithEditor(AppContext.Recent.SourcePdfFiles[link.Substring(i + 1).ToInt32()]);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"exec\":\r\n\t\t\t\t\tExecuteCommand(link.Substring(i + 1));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"http\":\r\n\t\t\t\tcase \"https\":\r\n\t\t\t\t\tSystem.Diagnostics.Process.Start(link);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected void LoadResourceImage(TheArtOfDev.HtmlRenderer.Core.Entities.HtmlImageLoadEventArgs e) {\r\n\t\t\te.Callback(Properties.Resources.ResourceManager.GetObject(e.Src.Substring(\"res:\".Length)) as System.Drawing.Image);\r\n\t\t\te.Handled = true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/IDocumentEditor.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinterface IDocumentSource\r\n\t{\r\n\t\tstring DocumentPath { get; }\r\n\t}\r\n\r\n\tinterface IDocumentEditor : IDocumentSource\r\n\t{\r\n\t\tbool IsBusy { get; }\r\n\t\tbool IsDirty { get; }\r\n\t\tevent EventHandler<DocumentChangedEventArgs> DocumentChanged;\r\n\t\tvoid CloseDocument();\r\n\t\tvoid Reopen();\r\n\t}\r\n\r\n\tpublic sealed class DocumentChangedEventArgs : EventArgs\r\n\t{\r\n\t\tpublic string Path { get; private set; }\r\n\t\tinternal DocumentChangedEventArgs(string path) {\r\n\t\t\tPath = path;\r\n\t\t}\r\n\t}\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "App/Functions/IResettableControl.cs",
    "content": "﻿using System;\r\n\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinterface IResettableControl\r\n\t{\r\n\t\tvoid Reset();\r\n\t\tvoid Reload();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ITextInfoFilterEditor.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinterface IFilterConditionEditor\r\n\t{\r\n\t\tPDFPatcher.Model.AutoBookmarkCondition Filter { get; set; }\r\n\t\tSystem.Windows.Forms.UserControl EditorControl { get; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/InfoExchangerControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class InfoExchangerControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton _Actions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _DocumentActions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RemoveUsageRightsAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ModifyMetaDataAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _PageActions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ImageRecompressionAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RemoveAnnotationAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RemoveThumbnailAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RemoveTextAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RemoveImageAction;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RemoveActions;\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton _Sort;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Delete;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAllItem;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InvertSelectItem;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectNoneItem;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Copy;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RefreshInfo;\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._AddFilesButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RecentFileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SortMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SortByNaturalNumberItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortByAlphaItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RefreshInfoButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RefreshInfoMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SelectionMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SelectionMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ItemList = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageCountColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._TitleColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._AuthorColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._SubjectColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._KeywordsColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FolderColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FileTimeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItemListMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._FileTypeList = new System.Windows.Forms.ImageList(this.components);\r\n\t\t\tthis._OpenPdfBox = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis._AutoClearListBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._AddDocumentWorker = new System.ComponentModel.BackgroundWorker();\r\n\t\t\tthis._BookmarkControl = new PDFPatcher.BookmarkControl();\r\n\t\t\tthis._TargetPdfFile = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._ActionsBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._ActionNameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItemActionsContainerBox = new System.Windows.Forms.SplitContainer();\r\n\t\t\tthis._ExportBookmarkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ImportButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\tthis._ConfigButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._InfoConfigButton = new System.Windows.Forms.Button();\r\n\t\t\t_Actions = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\t_DocumentActions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RemoveUsageRightsAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ModifyMetaDataAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_PageActions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ImageRecompressionAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RemoveAnnotationAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RemoveThumbnailAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RemoveTextAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RemoveImageAction = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RemoveActions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Sort = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\t_Delete = new System.Windows.Forms.ToolStripButton();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_SelectAllItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InvertSelectItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectNoneItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Copy = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RefreshInfo = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._MainToolbar.SuspendLayout();\r\n\t\t\tthis._SortMenu.SuspendLayout();\r\n\t\t\tthis._SelectionMenu.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).BeginInit();\r\n\t\t\tthis._ItemListMenu.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ActionsBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemActionsContainerBox)).BeginInit();\r\n\t\t\tthis._ItemActionsContainerBox.Panel1.SuspendLayout();\r\n\t\t\tthis._ItemActionsContainerBox.Panel2.SuspendLayout();\r\n\t\t\tthis._ItemActionsContainerBox.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.Dock = System.Windows.Forms.DockStyle.None;\r\n\t\t\tthis._MainToolbar.GripMargin = new System.Windows.Forms.Padding(0);\r\n\t\t\tthis._MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AddFilesButton,\r\n            _Actions,\r\n            _Sort,\r\n            _Delete,\r\n            toolStripSeparator2,\r\n            this._RefreshInfoButton});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Padding = new System.Windows.Forms.Padding(0, 0, 2, 0);\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size(483, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 0;\r\n\t\t\tthis._MainToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _AddFilesButton\r\n\t\t\t// \r\n\t\t\tthis._AddFilesButton.DropDown = this._RecentFileMenu;\r\n\t\t\tthis._AddFilesButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddFilesButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilesButton.Name = \"_AddFilesButton\";\r\n\t\t\tthis._AddFilesButton.Size = new System.Drawing.Size(103, 22);\r\n\t\t\tthis._AddFilesButton.Text = \"添加文件(&T)\";\r\n\t\t\tthis._AddFilesButton.ToolTipText = \"添加文件\";\r\n\t\t\tthis._AddFilesButton.ButtonClick += new System.EventHandler(this._MainToolbar_ButtonClick);\r\n\t\t\t// \r\n\t\t\t// _RecentFileMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFileMenu.ImageScalingSize = new System.Drawing.Size(24, 24);\r\n\t\t\tthis._RecentFileMenu.Name = \"_RecentFileMenu\";\r\n\t\t\tthis._RecentFileMenu.OwnerItem = this._AddFilesButton;\r\n\t\t\tthis._RecentFileMenu.ShowImageMargin = false;\r\n\t\t\tthis._RecentFileMenu.Size = new System.Drawing.Size(36, 4);\r\n\t\t\t// \r\n\t\t\t// _Actions\r\n\t\t\t// \r\n\t\t\t_Actions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _DocumentActions,\r\n            _PageActions,\r\n            _RemoveActions});\r\n\t\t\t_Actions.Image = global::PDFPatcher.Properties.Resources.Actions;\r\n\t\t\t_Actions.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Actions.Name = \"_Actions\";\r\n\t\t\t_Actions.Size = new System.Drawing.Size(85, 22);\r\n\t\t\t_Actions.Text = \"补丁操作\";\r\n\t\t\t_Actions.Visible = false;\r\n\t\t\t_Actions.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _DocumentActions\r\n\t\t\t// \r\n\t\t\t_DocumentActions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _RemoveUsageRightsAction,\r\n            _ModifyMetaDataAction});\r\n\t\t\t_DocumentActions.Image = global::PDFPatcher.Properties.Resources.DocumentProcessor;\r\n\t\t\t_DocumentActions.Name = \"_DocumentActions\";\r\n\t\t\t_DocumentActions.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_DocumentActions.Text = \"添加文档处理操作\";\r\n\t\t\t_DocumentActions.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _RemoveUsageRightsAction\r\n\t\t\t// \r\n\t\t\t_RemoveUsageRightsAction.Name = \"_RemoveUsageRightsAction\";\r\n\t\t\t_RemoveUsageRightsAction.Size = new System.Drawing.Size(184, 22);\r\n\t\t\t_RemoveUsageRightsAction.Text = \"移除复制、打印限制\";\r\n\t\t\t// \r\n\t\t\t// _ModifyMetaDataAction\r\n\t\t\t// \r\n\t\t\t_ModifyMetaDataAction.Name = \"_ModifyMetaDataAction\";\r\n\t\t\t_ModifyMetaDataAction.Size = new System.Drawing.Size(184, 22);\r\n\t\t\t_ModifyMetaDataAction.Text = \"修改元数据\";\r\n\t\t\t// \r\n\t\t\t// _PageActions\r\n\t\t\t// \r\n\t\t\t_PageActions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _ImageRecompressionAction,\r\n            _RemoveAnnotationAction,\r\n            _RemoveThumbnailAction,\r\n            _RemoveTextAction,\r\n            _RemoveImageAction});\r\n\t\t\t_PageActions.Image = global::PDFPatcher.Properties.Resources.PageProcessor;\r\n\t\t\t_PageActions.Name = \"_PageActions\";\r\n\t\t\t_PageActions.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_PageActions.Text = \"添加页面内容处理操作\";\r\n\t\t\t_PageActions.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _ImageRecompressionAction\r\n\t\t\t// \r\n\t\t\t_ImageRecompressionAction.Name = \"_ImageRecompressionAction\";\r\n\t\t\t_ImageRecompressionAction.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_ImageRecompressionAction.Text = \"优化纯黑白图像压缩率\";\r\n\t\t\t// \r\n\t\t\t// _RemoveAnnotationAction\r\n\t\t\t// \r\n\t\t\t_RemoveAnnotationAction.Name = \"_RemoveAnnotationAction\";\r\n\t\t\t_RemoveAnnotationAction.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_RemoveAnnotationAction.Text = \"删除批注\";\r\n\t\t\t// \r\n\t\t\t// _RemoveThumbnailAction\r\n\t\t\t// \r\n\t\t\t_RemoveThumbnailAction.Name = \"_RemoveThumbnailAction\";\r\n\t\t\t_RemoveThumbnailAction.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_RemoveThumbnailAction.Text = \"删除缩略图\";\r\n\t\t\t// \r\n\t\t\t// _RemoveTextAction\r\n\t\t\t// \r\n\t\t\t_RemoveTextAction.Name = \"_RemoveTextAction\";\r\n\t\t\t_RemoveTextAction.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_RemoveTextAction.Text = \"删除文本内容\";\r\n\t\t\t// \r\n\t\t\t// _RemoveImageAction\r\n\t\t\t// \r\n\t\t\t_RemoveImageAction.Name = \"_RemoveImageAction\";\r\n\t\t\t_RemoveImageAction.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_RemoveImageAction.Text = \"删除图片\";\r\n\t\t\t// \r\n\t\t\t// _RemoveActions\r\n\t\t\t// \r\n\t\t\t_RemoveActions.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\t_RemoveActions.Name = \"_RemoveActions\";\r\n\t\t\t_RemoveActions.Size = new System.Drawing.Size(196, 22);\r\n\t\t\t_RemoveActions.Text = \"删除选中的操作\";\r\n\t\t\t// \r\n\t\t\t// _Sort\r\n\t\t\t// \r\n\t\t\t_Sort.DropDown = this._SortMenu;\r\n\t\t\t_Sort.Image = global::PDFPatcher.Properties.Resources.Sort;\r\n\t\t\t_Sort.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Sort.Name = \"_Sort\";\r\n\t\t\t_Sort.Size = new System.Drawing.Size(61, 22);\r\n\t\t\t_Sort.Text = \"排序\";\r\n\t\t\t_Sort.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortMenu\r\n\t\t\t// \r\n\t\t\tthis._SortMenu.ImageScalingSize = new System.Drawing.Size(24, 24);\r\n\t\t\tthis._SortMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._SortByNaturalNumberItem,\r\n            this._SortByAlphaItem});\r\n\t\t\tthis._SortMenu.Name = \"_SortMenu\";\r\n\t\t\tthis._SortMenu.OwnerItem = _Sort;\r\n\t\t\tthis._SortMenu.Size = new System.Drawing.Size(225, 64);\r\n\t\t\tthis._SortMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortByNaturalNumberItem\r\n\t\t\t// \r\n\t\t\tthis._SortByNaturalNumberItem.Image = global::PDFPatcher.Properties.Resources.NaturalSort;\r\n\t\t\tthis._SortByNaturalNumberItem.Name = \"_SortByNaturalNumberItem\";\r\n\t\t\tthis._SortByNaturalNumberItem.Size = new System.Drawing.Size(224, 30);\r\n\t\t\tthis._SortByNaturalNumberItem.Text = \"按数值和字母顺序排序(&M)\";\r\n\t\t\t// \r\n\t\t\t// _SortByAlphaItem\r\n\t\t\t// \r\n\t\t\tthis._SortByAlphaItem.Image = global::PDFPatcher.Properties.Resources.AlphabeticSort;\r\n\t\t\tthis._SortByAlphaItem.Name = \"_SortByAlphaItem\";\r\n\t\t\tthis._SortByAlphaItem.Size = new System.Drawing.Size(224, 30);\r\n\t\t\tthis._SortByAlphaItem.Text = \"按字母顺序排序(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _Delete\r\n\t\t\t// \r\n\t\t\t_Delete.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\t_Delete.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Delete.Name = \"_Delete\";\r\n\t\t\t_Delete.Size = new System.Drawing.Size(76, 22);\r\n\t\t\t_Delete.Text = \"删除文件\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _RefreshInfoButton\r\n\t\t\t// \r\n\t\t\tthis._RefreshInfoButton.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\tthis._RefreshInfoButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._RefreshInfoButton.Name = \"_RefreshInfoButton\";\r\n\t\t\tthis._RefreshInfoButton.Size = new System.Drawing.Size(112, 22);\r\n\t\t\tthis._RefreshInfoButton.Text = \"刷新文档属性\";\r\n\t\t\t// \r\n\t\t\t// _SelectAllItem\r\n\t\t\t// \r\n\t\t\t_SelectAllItem.Image = global::PDFPatcher.Properties.Resources.SelectAll;\r\n\t\t\t_SelectAllItem.Name = \"_SelectAllItem\";\r\n\t\t\t_SelectAllItem.Size = new System.Drawing.Size(132, 30);\r\n\t\t\t_SelectAllItem.Text = \"全部选中\";\r\n\t\t\t// \r\n\t\t\t// _InvertSelectItem\r\n\t\t\t// \r\n\t\t\t_InvertSelectItem.Name = \"_InvertSelectItem\";\r\n\t\t\t_InvertSelectItem.Size = new System.Drawing.Size(132, 30);\r\n\t\t\t_InvertSelectItem.Text = \"反转选择\";\r\n\t\t\t// \r\n\t\t\t// _SelectNoneItem\r\n\t\t\t// \r\n\t\t\t_SelectNoneItem.Name = \"_SelectNoneItem\";\r\n\t\t\t_SelectNoneItem.Size = new System.Drawing.Size(132, 30);\r\n\t\t\t_SelectNoneItem.Text = \"取消选择\";\r\n\t\t\t// \r\n\t\t\t// _Copy\r\n\t\t\t// \r\n\t\t\t_Copy.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\t_Copy.Name = \"_Copy\";\r\n\t\t\t_Copy.Size = new System.Drawing.Size(156, 30);\r\n\t\t\t_Copy.Text = \"复制列表内容\";\r\n\t\t\t// \r\n\t\t\t// _RefreshInfo\r\n\t\t\t// \r\n\t\t\t_RefreshInfo.DropDown = this._RefreshInfoMenu;\r\n\t\t\t_RefreshInfo.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\t_RefreshInfo.Name = \"_RefreshInfo\";\r\n\t\t\t_RefreshInfo.Size = new System.Drawing.Size(156, 30);\r\n\t\t\t_RefreshInfo.Text = \"刷新文档属性\";\r\n\t\t\t// \r\n\t\t\t// _RefreshInfoMenu\r\n\t\t\t// \r\n\t\t\tthis._RefreshInfoMenu.ImageScalingSize = new System.Drawing.Size(24, 24);\r\n\t\t\tthis._RefreshInfoMenu.Name = \"_RefreshInfoMenu\";\r\n\t\t\tthis._RefreshInfoMenu.OwnerItem = _RefreshInfo;\r\n\t\t\tthis._RefreshInfoMenu.Size = new System.Drawing.Size(61, 4);\r\n\t\t\t// \r\n\t\t\t// _SelectionMenu\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenu.ImageScalingSize = new System.Drawing.Size(24, 24);\r\n\t\t\tthis._SelectionMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _SelectAllItem,\r\n            _InvertSelectItem,\r\n            _SelectNoneItem});\r\n\t\t\tthis._SelectionMenu.Name = \"_SelectionMenu\";\r\n\t\t\tthis._SelectionMenu.OwnerItem = this._SelectionMenuItem;\r\n\t\t\tthis._SelectionMenu.Size = new System.Drawing.Size(133, 94);\r\n\t\t\tthis._SelectionMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SelectionMenuItem\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenuItem.DropDown = this._SelectionMenu;\r\n\t\t\tthis._SelectionMenuItem.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\tthis._SelectionMenuItem.Name = \"_SelectionMenuItem\";\r\n\t\t\tthis._SelectionMenuItem.Size = new System.Drawing.Size(156, 30);\r\n\t\t\tthis._SelectionMenuItem.Text = \"选择文件\";\r\n\t\t\t// \r\n\t\t\t// _ItemList\r\n\t\t\t// \r\n\t\t\tthis._ItemList.AllColumns.Add(this._NameColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._PageCountColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._TitleColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._AuthorColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._SubjectColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._KeywordsColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FolderColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FileTimeColumn);\r\n\t\t\tthis._ItemList.AllowDrop = true;\r\n\t\t\tthis._ItemList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ItemList.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._ItemList.CellEditUseWholeCell = false;\r\n\t\t\tthis._ItemList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._PageCountColumn,\r\n            this._TitleColumn,\r\n            this._AuthorColumn,\r\n            this._SubjectColumn,\r\n            this._KeywordsColumn,\r\n            this._FolderColumn,\r\n            this._FileTimeColumn});\r\n\t\t\tthis._ItemList.ContextMenuStrip = this._ItemListMenu;\r\n\t\t\tthis._ItemList.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._ItemList.GridLines = true;\r\n\t\t\tthis._ItemList.HideSelection = false;\r\n\t\t\tthis._ItemList.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._ItemList.Name = \"_ItemList\";\r\n\t\t\tthis._ItemList.ShowGroups = false;\r\n\t\t\tthis._ItemList.Size = new System.Drawing.Size(544, 199);\r\n\t\t\tthis._ItemList.SmallImageList = this._FileTypeList;\r\n\t\t\tthis._ItemList.TabIndex = 0;\r\n\t\t\tthis._ItemList.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ItemList.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._ItemList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this._ImageList_ColumnClick);\r\n\t\t\t// \r\n\t\t\t// _NameColumn\r\n\t\t\t// \r\n\t\t\tthis._NameColumn.Text = \"源文件名\";\r\n\t\t\tthis._NameColumn.Width = 149;\r\n\t\t\t// \r\n\t\t\t// _PageCountColumn\r\n\t\t\t// \r\n\t\t\tthis._PageCountColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._PageCountColumn.IsEditable = false;\r\n\t\t\tthis._PageCountColumn.Text = \"页数\";\r\n\t\t\tthis._PageCountColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._PageCountColumn.Width = 50;\r\n\t\t\t// \r\n\t\t\t// _TitleColumn\r\n\t\t\t// \r\n\t\t\tthis._TitleColumn.Text = \"标题\";\r\n\t\t\t// \r\n\t\t\t// _AuthorColumn\r\n\t\t\t// \r\n\t\t\tthis._AuthorColumn.Text = \"作者\";\r\n\t\t\t// \r\n\t\t\t// _SubjectColumn\r\n\t\t\t// \r\n\t\t\tthis._SubjectColumn.Text = \"主题\";\r\n\t\t\t// \r\n\t\t\t// _KeywordsColumn\r\n\t\t\t// \r\n\t\t\tthis._KeywordsColumn.Text = \"关键词\";\r\n\t\t\tthis._KeywordsColumn.Width = 73;\r\n\t\t\t// \r\n\t\t\t// _FolderColumn\r\n\t\t\t// \r\n\t\t\tthis._FolderColumn.IsEditable = false;\r\n\t\t\tthis._FolderColumn.Text = \"文件夹\";\r\n\t\t\tthis._FolderColumn.Width = 96;\r\n\t\t\t// \r\n\t\t\t// _FileTimeColumn\r\n\t\t\t// \r\n\t\t\tthis._FileTimeColumn.IsEditable = false;\r\n\t\t\tthis._FileTimeColumn.Text = \"修改时间\";\r\n\t\t\tthis._FileTimeColumn.Width = 145;\r\n\t\t\t// \r\n\t\t\t// _ItemListMenu\r\n\t\t\t// \r\n\t\t\tthis._ItemListMenu.ImageScalingSize = new System.Drawing.Size(24, 24);\r\n\t\t\tthis._ItemListMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Copy,\r\n            _RefreshInfo,\r\n            this._SelectionMenuItem});\r\n\t\t\tthis._ItemListMenu.Name = \"_ItemListMenu\";\r\n\t\t\tthis._ItemListMenu.Size = new System.Drawing.Size(157, 94);\r\n\t\t\tthis._ItemListMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _FileTypeList\r\n\t\t\t// \r\n\t\t\tthis._FileTypeList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;\r\n\t\t\tthis._FileTypeList.ImageSize = new System.Drawing.Size(16, 16);\r\n\t\t\tthis._FileTypeList.TransparentColor = System.Drawing.Color.Transparent;\r\n\t\t\t// \r\n\t\t\t// _OpenPdfBox\r\n\t\t\t// \r\n\t\t\tthis._OpenPdfBox.DefaultExt = \"pdf\";\r\n\t\t\tthis._OpenPdfBox.Filter = \"PDF 文件（*.pdf）|*.pdf\";\r\n\t\t\tthis._OpenPdfBox.Multiselect = true;\r\n\t\t\tthis._OpenPdfBox.Title = \"选择需要处理的 PDF 文件\";\r\n\t\t\t// \r\n\t\t\t// _AutoClearListBox\r\n\t\t\t// \r\n\t\t\tthis._AutoClearListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AutoClearListBox.AutoSize = true;\r\n\t\t\tthis._AutoClearListBox.Checked = true;\r\n\t\t\tthis._AutoClearListBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._AutoClearListBox.Location = new System.Drawing.Point(434, 9);\r\n\t\t\tthis._AutoClearListBox.Name = \"_AutoClearListBox\";\r\n\t\t\tthis._AutoClearListBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._AutoClearListBox.TabIndex = 4;\r\n\t\t\tthis._AutoClearListBox.Text = \"添加文件前清空列表\";\r\n\t\t\tthis._AutoClearListBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AddDocumentWorker\r\n\t\t\t// \r\n\t\t\tthis._AddDocumentWorker.WorkerReportsProgress = true;\r\n\t\t\tthis._AddDocumentWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this._AddDocumentWorker_DoWork);\r\n\t\t\tthis._AddDocumentWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this._AddDocumentWorker_ProgressChanged);\r\n\t\t\tthis._AddDocumentWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this._AddDocumentWorker_RunWorkerCompleted);\r\n\t\t\t// \r\n\t\t\t// _BookmarkControl\r\n\t\t\t// \r\n\t\t\tthis._BookmarkControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BookmarkControl.LabelText = \"P&DF 信息文件：\";\r\n\t\t\tthis._BookmarkControl.Location = new System.Drawing.Point(13, 235);\r\n\t\t\tthis._BookmarkControl.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._BookmarkControl.Name = \"_BookmarkControl\";\r\n\t\t\tthis._BookmarkControl.Size = new System.Drawing.Size(553, 24);\r\n\t\t\tthis._BookmarkControl.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// _TargetPdfFile\r\n\t\t\t// \r\n\t\t\tthis._TargetPdfFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetPdfFile.Location = new System.Drawing.Point(13, 265);\r\n\t\t\tthis._TargetPdfFile.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._TargetPdfFile.Name = \"_TargetPdfFile\";\r\n\t\t\tthis._TargetPdfFile.Size = new System.Drawing.Size(553, 26);\r\n\t\t\tthis._TargetPdfFile.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// _ActionsBox\r\n\t\t\t// \r\n\t\t\tthis._ActionsBox.AllColumns.Add(this._ActionNameColumn);\r\n\t\t\tthis._ActionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ActionsBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._ActionsBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._ActionNameColumn});\r\n\t\t\tthis._ActionsBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._ActionsBox.FullRowSelect = true;\r\n\t\t\tthis._ActionsBox.GridLines = true;\r\n\t\t\tthis._ActionsBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._ActionsBox.HideSelection = false;\r\n\t\t\tthis._ActionsBox.Location = new System.Drawing.Point(5, 3);\r\n\t\t\tthis._ActionsBox.Name = \"_ActionsBox\";\r\n\t\t\tthis._ActionsBox.RowHeight = 18;\r\n\t\t\tthis._ActionsBox.ShowGroups = false;\r\n\t\t\tthis._ActionsBox.Size = new System.Drawing.Size(126, 176);\r\n\t\t\tthis._ActionsBox.TabIndex = 18;\r\n\t\t\tthis._ActionsBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ActionsBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _ActionNameColumn\r\n\t\t\t// \r\n\t\t\tthis._ActionNameColumn.Text = \"补丁操作\";\r\n\t\t\tthis._ActionNameColumn.Width = 120;\r\n\t\t\t// \r\n\t\t\t// _ItemActionsContainerBox\r\n\t\t\t// \r\n\t\t\tthis._ItemActionsContainerBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ItemActionsContainerBox.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\r\n\t\t\tthis._ItemActionsContainerBox.Location = new System.Drawing.Point(13, 28);\r\n\t\t\tthis._ItemActionsContainerBox.Name = \"_ItemActionsContainerBox\";\r\n\t\t\t// \r\n\t\t\t// _ItemActionsContainerBox.Panel1\r\n\t\t\t// \r\n\t\t\tthis._ItemActionsContainerBox.Panel1.Controls.Add(this._ItemList);\r\n\t\t\t// \r\n\t\t\t// _ItemActionsContainerBox.Panel2\r\n\t\t\t// \r\n\t\t\tthis._ItemActionsContainerBox.Panel2.Controls.Add(this._ActionsBox);\r\n\t\t\tthis._ItemActionsContainerBox.Panel2Collapsed = true;\r\n\t\t\tthis._ItemActionsContainerBox.Size = new System.Drawing.Size(550, 205);\r\n\t\t\tthis._ItemActionsContainerBox.SplitterDistance = 412;\r\n\t\t\tthis._ItemActionsContainerBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// _ExportBookmarkButton\r\n\t\t\t// \r\n\t\t\tthis._ExportBookmarkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._ExportBookmarkButton.Image = global::PDFPatcher.Properties.Resources.ExportInfoFile;\r\n\t\t\tthis._ExportBookmarkButton.Location = new System.Drawing.Point(18, 297);\r\n\t\t\tthis._ExportBookmarkButton.Name = \"_ExportBookmarkButton\";\r\n\t\t\tthis._ExportBookmarkButton.Size = new System.Drawing.Size(120, 23);\r\n\t\t\tthis._ExportBookmarkButton.TabIndex = 8;\r\n\t\t\tthis._ExportBookmarkButton.Text = \"导出信息文件(&C)\";\r\n\t\t\tthis._ExportBookmarkButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ExportBookmarkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ExportBookmarkButton.Click += new System.EventHandler(this._ExportBookmarkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ImportButton\r\n\t\t\t// \r\n\t\t\tthis._ImportButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ImportButton.AnimateGlow = true;\r\n\t\t\tthis._ImportButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportButton.CornerRadius = 3;\r\n\t\t\tthis._ImportButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ImportButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ImportButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ImportButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ImportButton.Location = new System.Drawing.Point(440, 297);\r\n\t\t\tthis._ImportButton.Name = \"_ImportButton\";\r\n\t\t\tthis._ImportButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ImportButton.ShowFocusBorder = true;\r\n\t\t\tthis._ImportButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ImportButton.TabIndex = 13;\r\n\t\t\tthis._ImportButton.Text = \"生成目标文件(&S)\";\r\n\t\t\tthis._ImportButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ImportButton.Click += new System.EventHandler(this._ImportButton_Click);\r\n\t\t\t// \r\n\t\t\t// _ConfigButton\r\n\t\t\t// \r\n\t\t\tthis._ConfigButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ConfigButton.Image = global::PDFPatcher.Properties.Resources.PdfOptions;\r\n\t\t\tthis._ConfigButton.Location = new System.Drawing.Point(253, 297);\r\n\t\t\tthis._ConfigButton.Name = \"_ConfigButton\";\r\n\t\t\tthis._ConfigButton.Size = new System.Drawing.Size(181, 23);\r\n\t\t\tthis._ConfigButton.TabIndex = 14;\r\n\t\t\tthis._ConfigButton.Text = \"设置 P&DF 文件的修改方式\";\r\n\t\t\tthis._ConfigButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ConfigButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _InfoConfigButton\r\n\t\t\t// \r\n\t\t\tthis._InfoConfigButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._InfoConfigButton.Image = global::PDFPatcher.Properties.Resources.InfoFileOptions;\r\n\t\t\tthis._InfoConfigButton.Location = new System.Drawing.Point(144, 297);\r\n\t\t\tthis._InfoConfigButton.Name = \"_InfoConfigButton\";\r\n\t\t\tthis._InfoConfigButton.Size = new System.Drawing.Size(103, 23);\r\n\t\t\tthis._InfoConfigButton.TabIndex = 14;\r\n\t\t\tthis._InfoConfigButton.Text = \"信息文件配置\";\r\n\t\t\tthis._InfoConfigButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._InfoConfigButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._InfoConfigButton.Click += new System.EventHandler(this._MainToolbar_ButtonClick);\r\n\t\t\t// \r\n\t\t\t// InfoExchangerControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._InfoConfigButton);\r\n\t\t\tthis.Controls.Add(this._ConfigButton);\r\n\t\t\tthis.Controls.Add(this._ImportButton);\r\n\t\t\tthis.Controls.Add(this._MainToolbar);\r\n\t\t\tthis.Controls.Add(this._TargetPdfFile);\r\n\t\t\tthis.Controls.Add(this._ExportBookmarkButton);\r\n\t\t\tthis.Controls.Add(this._ItemActionsContainerBox);\r\n\t\t\tthis.Controls.Add(this._AutoClearListBox);\r\n\t\t\tthis.Controls.Add(this._BookmarkControl);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"InfoExchangerControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(575, 342);\r\n\t\t\tthis._MainToolbar.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.PerformLayout();\r\n\t\t\tthis._SortMenu.ResumeLayout(false);\r\n\t\t\tthis._SelectionMenu.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).EndInit();\r\n\t\t\tthis._ItemListMenu.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ActionsBox)).EndInit();\r\n\t\t\tthis._ItemActionsContainerBox.Panel1.ResumeLayout(false);\r\n\t\t\tthis._ItemActionsContainerBox.Panel2.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemActionsContainerBox)).EndInit();\r\n\t\t\tthis._ItemActionsContainerBox.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _ItemList;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FolderColumn;\r\n\t\tprivate TargetFileControl _TargetPdfFile;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SortMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByNaturalNumberItem;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByAlphaItem;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SelectionMenu;\r\n\t\tprivate BookmarkControl _BookmarkControl;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageCountColumn;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SelectionMenuItem;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _ItemListMenu;\r\n\t\tprivate System.Windows.Forms.Button _ExportBookmarkButton;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _AddFilesButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFileMenu;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenPdfBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoClearListBox;\r\n\t\tprivate System.ComponentModel.BackgroundWorker _AddDocumentWorker;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _TitleColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AuthorColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SubjectColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _KeywordsColumn;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _ActionsBox;\r\n\t\tprivate System.Windows.Forms.SplitContainer _ItemActionsContainerBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ActionNameColumn;\r\n\t\tprivate System.Windows.Forms.ImageList _FileTypeList;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _RefreshInfoButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RefreshInfoMenu;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ImportButton;\r\n\t\tprivate System.Windows.Forms.Button _ConfigButton;\r\n\t\tprivate System.Windows.Forms.Button _InfoConfigButton;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FileTimeColumn;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/InfoExchangerControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class InfoExchangerControl : FunctionControl\r\n\t{\r\n\t\tFileListHelper _listHelper;\r\n\r\n\t\tpublic override string FunctionName => \"导出导入信息文件\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.ExportInfoFile;\r\n\r\n\t\tpublic InfoExchangerControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_MainToolbar.ScaleIcons(16);\r\n\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0);\r\n\r\n\t\t\tAppContext.MainForm.SetTooltip(_BookmarkControl.FileList, \"需要导出或导入的信息文件路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ActionsBox, \"双击项目编辑操作选项；右键点击项目弹出上下文菜单\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ItemList, \"在此添加需要导出或导入信息文件的 PDF 文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ImportButton, \"点击此按钮执行补丁生成新的 PDF 文件，该文件具有信息文件的设定\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetPdfFile.FileList, \"在此指定导入信息文件后生成的目标 PDF 文件路径（鼠标右键点击列表可插入文件名替代符）\");\r\n\t\t\t_ItemList.EmptyListMsg = \"请使用“添加文件”按钮添加需要处理的 PDF 文件，或从资源管理器拖放文件到本列表框\";\r\n\r\n\t\t\t_ConfigButton.Click += (s, args) => AppContext.MainForm.SelectFunctionList(Function.PatcherOptions);\r\n\t\t\t_InfoConfigButton.Click += (s, args) => AppContext.MainForm.SelectFunctionList(Function.InfoFileOptions);\r\n\r\n\t\t\tnew TypedColumn<Processor.IProcessor>(_ActionNameColumn) {\r\n\t\t\t\tAspectGetter = (o) => o.Name,\r\n\t\t\t\tImageGetter = (o) => {\r\n\t\t\t\t\tif (o is Processor.IPageProcessor) {\r\n\t\t\t\t\t\treturn Properties.Resources.PageProcessor;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treturn Properties.Resources.DocumentProcessor;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_TargetPdfFile.FileMacroMenu.LoadStandardInfoMacros();\r\n\t\t\t_TargetPdfFile.FileMacroMenu.LoadStandardSourceFileMacros();\r\n\t\t\t_BookmarkControl.FileDialog.CheckFileExists = false;\r\n\t\t\t_BookmarkControl.BrowseForFile += FileControl_BrowseForFile;\r\n\t\t\t_TargetPdfFile.BrowseForFile += FileControl_BrowseForFile;\r\n\t\t\t_TargetPdfFile.TargetFileChangedByBrowseButton += (s, args) => {\r\n\t\t\t\tint i;\r\n\t\t\t\tvar f = _TargetPdfFile.FileDialog.FileName;\r\n\t\t\t\tif (_ItemList.Items.Count > 1 && (i = f.LastIndexOf(Path.DirectorySeparatorChar)) != -1) {\r\n\t\t\t\t\t_TargetPdfFile.Text = string.Concat(f.Substring(0, i), Path.DirectorySeparatorChar, Constants.FileNameMacros.FileName, Path.GetExtension(f));\r\n\t\t\t\t\targs.Cancel = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tvar fi = _FileTypeList.Images;\r\n\t\t\tfi.AddRange([Properties.Resources.OriginalPdfFile]);\r\n\t\t\t_ItemList.FixEditControlWidth();\r\n\t\t\t_ItemList.ScaleColumnWidths();\r\n\t\t\t_listHelper = new FileListHelper(_ItemList);\r\n\t\t\t_listHelper.SetupDragAndDrop(AddFiles);\r\n\t\t\tFileListHelper.SetupCommonPdfColumns(_AuthorColumn, _KeywordsColumn, _SubjectColumn, _TitleColumn, _PageCountColumn, _NameColumn, _FolderColumn, _FileTimeColumn);\r\n\t\t\t_RefreshInfoButton.ButtonClick += (s, args) => _listHelper.RefreshInfo(AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t_RefreshInfoButton.DropDown = _RefreshInfoMenu;\r\n\t\t\tforeach (var item in Constants.Encoding.EncodingNames) {\r\n\t\t\t\t_RefreshInfoMenu.Items.Add(item);\r\n\t\t\t}\r\n\t\t\t_RefreshInfoMenu.ItemClicked += (s, args) => _listHelper.RefreshInfo(ValueHelper.MapValue(args.ClickedItem.Text, Constants.Encoding.EncodingNames, Constants.Encoding.Encodings));\r\n\t\t\t_AddFilesButton.DropDownOpening += FileListHelper.OpenPdfButtonDropDownOpeningHandler;\r\n\t\t\t_AddFilesButton.DropDownItemClicked += (s, args) => {\r\n\t\t\t\targs.ClickedItem.Owner.Hide();\r\n\t\t\t\tAddFiles(new string[] { args.ClickedItem.ToolTipText }, true);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tif (commandName == Commands.Open) {\r\n\t\t\t\tvar b = _OpenPdfBox;\r\n\t\t\t\tif (b.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tAddFiles(b.FileNames, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.OpenFile) {\r\n\t\t\t\tAddFiles(parameters, true);\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.SaveBookmark) {\r\n\t\t\t\t_ExportBookmarkButton.PerformClick();\r\n\t\t\t}\r\n\t\t\telse if (_listHelper.ProcessCommonMenuCommand(commandName) == false) {\r\n\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tvar n = item.Name;\r\n\t\t\tif (Commands.CommonSelectionCommands.Contains(n)\r\n\t\t\t\t|| n == Commands.Delete\r\n\t\t\t\t|| n == Commands.Action) {\r\n\t\t\t\titem.Enabled = _ItemList.GetItemCount() > 0;\r\n\t\t\t}\r\n\t\t\telse if (n == Commands.SaveBookmark) {\r\n\t\t\t\titem.Enabled = _ItemList.GetItemCount() > 0;\r\n\t\t\t\titem.Text = \"导出书签文件(&Q)\";\r\n\t\t\t\titem.Visible = true;\r\n\t\t\t}\r\n\t\t\telse if (n == Commands.Options) {\r\n\t\t\t\titem.Text = \"修改文档设置(&S)...\";\r\n\t\t\t\titem.ToolTipText = \"设置修改后的 PDF 文档\";\r\n\t\t\t\tEnableCommand(item, true, true);\r\n\t\t\t\titem.Tag = nameof(Function.PatcherOptions);\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tvoid FileControl_BrowseForFile(object sender, EventArgs e) {\r\n\t\t\t_listHelper.PrepareSourceFiles();\r\n\t\t}\r\n\r\n\t\tvoid AddFiles(string[] files, bool alertInvalidFiles) {\r\n\t\t\tif (files == null || files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ((ModifierKeys & Keys.Control) != Keys.None || _AutoClearListBox.Checked) {\r\n\t\t\t\t_ItemList.ClearObjects();\r\n\t\t\t}\r\n\t\t\tif (files.Length > 3) {\r\n\t\t\t\tAppContext.MainForm.Enabled = false;\r\n\t\t\t}\r\n\t\t\tif (files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_AddDocumentWorker.RunWorkerAsync(files);\r\n\t\t}\r\n\r\n\t\tvoid _ImportButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar infoFile = _BookmarkControl.Text.Trim();\r\n\t\t\tvar targetPdfFile = _TargetPdfFile.Text.Trim();\r\n\t\t\tif (string.IsNullOrEmpty(targetPdfFile) && string.IsNullOrEmpty(targetPdfFile = _TargetPdfFile.BrowseTargetFile())) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tif (l == 0) {\r\n\t\t\t\tFormHelper.InfoBox(\"请添加需要处理的 PDF 文件。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar files = GetSourceItemList();\r\n\t\t\t_BookmarkControl.FileList.AddHistoryItem();\r\n\t\t\t_TargetPdfFile.FileList.AddHistoryItem();\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar a = arg.Argument as object[];\r\n\t\t\t\tvar t = a[0] as string;\r\n\t\t\t\tif (files.Count > 1) {\r\n\t\t\t\t\tTracker.SetTotalProgressGoal(files.Count);\r\n\t\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\t\tif (file.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\t\tProcessor.Worker.PatchDocument(file as SourceItem.Pdf,\r\n\t\t\t\t\t\t\t\tfile.GetTargetPdfFileName(t),\r\n\t\t\t\t\t\t\t\tfile.GetInfoFileName(),\r\n\t\t\t\t\t\t\t\tAppContext.Importer,\r\n\t\t\t\t\t\t\t\tAppContext.Patcher);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(\"输入文件不是 PDF 文件。\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (files[0].Type != SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"输入文件不是 PDF 文件。\");\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tProcessor.Worker.PatchDocument(files[0] as SourceItem.Pdf,\r\n\t\t\t\t\t\tt,\r\n\t\t\t\t\t\ta[1] as string,\r\n\t\t\t\t\t\tAppContext.Importer,\r\n\t\t\t\t\t\tAppContext.Patcher);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerAsync(new object[] { targetPdfFile, infoFile });\r\n\t\t}\r\n\r\n\t\tvoid _ExportBookmarkButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (string.IsNullOrEmpty(_BookmarkControl.Text)) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.InfoDocNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar files = GetSourceItemList();\r\n\r\n\t\t\tif (files.Count == 0) {\r\n\t\t\t\tFormHelper.InfoBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_BookmarkControl.FileList.AddHistoryItem();\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar w = AppContext.MainForm.GetWorker();\r\n\t\t\tw.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar b = AppContext.BookmarkFile;\r\n\t\t\t\tvar fs = arg.Argument as List<SourceItem>;\r\n\t\t\t\tif (fs.Count > 1) {\r\n\t\t\t\t\tvar p = b.Contains(Path.DirectorySeparatorChar) || b.Contains(Path.AltDirectorySeparatorChar) ? Path.GetDirectoryName(b) : Path.GetFileNameWithoutExtension(b);\r\n\t\t\t\t\tvar ext = Path.GetExtension(b);\r\n\t\t\t\t\tTracker.SetTotalProgressGoal(fs.Count);\r\n\t\t\t\t\tforeach (var file in fs) {\r\n\t\t\t\t\t\tProcessor.Worker.ExportInfo(file.FilePath, file.FilePath.Directory.Combine(p).Combine(file.FilePath.ChangeExtension(ext).FileName));\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (fs[0].Type != SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"输入文件不是 PDF 文件。\");\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tProcessor.Worker.ExportInfo(fs[0].FilePath, b);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tw.RunWorkerAsync(files);\r\n\t\t}\r\n\r\n\t\tList<SourceItem> GetSourceItemList() {\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tvar files = new List<SourceItem>(l);\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tvar item = _ItemList.GetModelObject(_ItemList.GetNthItemInDisplayOrder(i).Index) as SourceItem;\r\n\t\t\t\tif (item.Type == SourceItem.ItemType.Pdf\r\n\t\t\t\t\t&& FileHelper.HasExtension(item.FilePath, Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, item.FilePath.ToString());\r\n\t\t\t\t}\r\n\t\t\t\tfiles.Add(item);\r\n\t\t\t}\r\n\t\t\treturn files;\r\n\t\t}\r\n\r\n\t\tvoid _SortMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tswitch (e.ClickedItem.Name) {\r\n\t\t\t\tcase \"_SortByAlphaItem\":\r\n\t\t\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0, false);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SortByNaturalNumberItem\":\r\n\t\t\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ImageList_ColumnClick(object sender, ColumnClickEventArgs e) {\r\n\t\t\tvar c = e.Column;\r\n\t\t\tvar ss = c == 0 || c == _PageCountColumn.Index;\r\n\t\t\tvar o = _ItemList.PrimarySortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;\r\n\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(e.Column, ss, o);\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ButtonClick(object sender, EventArgs e) {\r\n\t\t\tif (sender == _AddFilesButton) {\r\n\t\t\t\tvar b = _OpenPdfBox;\r\n\t\t\t\t_AddFilesButton.DropDown.Items.ClearDropDownItems();\r\n\t\t\t\tif (b.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tAddFiles(b.FileNames, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\t_listHelper.ProcessCommonMenuCommand(e.ClickedItem.Name);\r\n\t\t}\r\n\r\n\t\t#region AddDocumentWorker\r\n\t\tvoid _AddDocumentWorker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar files = e.Argument as string[];\r\n\t\t\tArray.ForEach(files, f => ((BackgroundWorker)sender).ReportProgress(0, f));\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\tAppContext.MainForm.Enabled = true;\r\n\t\t\t_listHelper.ResizeItemListColumns();\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {\r\n\t\t\tvar item = e.UserState as string;\r\n\t\t\tAddItem(SourceItem.Create(item));\r\n\t\t}\r\n\r\n\t\tvoid AddItem(SourceItem item) {\r\n\t\t\tif (item == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tAddItems(new SourceItem[] { item });\r\n\t\t}\r\n\r\n\t\tvoid AddItems(System.Collections.ICollection items) {\r\n\t\t\tvar i = _ItemList.GetLastSelectedIndex();\r\n\t\t\t_ItemList.InsertObjects(++i, items);\r\n\t\t\t_ItemList.SelectedIndex = --i + items.Count;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region IDefaultButtonControl 成员\r\n\r\n\t\tpublic override Button DefaultButton => _ImportButton;\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/InfoExchangerControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>495, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_RecentFileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>614, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_Actions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_DocumentActions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RemoveUsageRightsAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ModifyMetaDataAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_PageActions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ImageRecompressionAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RemoveAnnotationAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RemoveThumbnailAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RemoveTextAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RemoveImageAction.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RemoveActions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Sort.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SortMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>135, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_Delete.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectAllItem.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InvertSelectItem.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectNoneItem.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Copy.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshInfo.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshInfoMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>137, 56</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectionMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>240, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_ItemListMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>370, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_FileTypeList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 56</value>\r\n  </metadata>\r\n  <metadata name=\"_OpenPdfBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_AddDocumentWorker.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>750, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/InfoFileOptionControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class InfoFileOptionControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._EncodingBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ExtractPageLinksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExportViewerPreferencesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExportBookmarksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExportOptionsTab = new System.Windows.Forms.TabControl();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._UnitBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._ExportDocPropertiesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExtractPageSettingsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ConsolidateNamedDestBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._ExportCatalogBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ExtractPageContentBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._PageContentBox = new System.Windows.Forms.Panel();\r\n\t\t\tthis._ExportContentOperatorsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExtractPageDictionaryBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExtractPageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ExportBinaryStreamBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExtractImagesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExtractPageTextContentBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabPage3 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._ImportPageSettingsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ImportDocumentInfoBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.panel1 = new System.Windows.Forms.Panel();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis._RemoveOriginalPageLinksBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._KeepOriginalPageLinksBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ImportBookmarksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ImportPageLinksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ImportViewerPreferencesBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ExportOptionsTab.SuspendLayout();\r\n\t\t\tthis.tabPage1.SuspendLayout();\r\n\t\t\tthis.groupBox1.SuspendLayout();\r\n\t\t\tthis.tabPage2.SuspendLayout();\r\n\t\t\tthis._PageContentBox.SuspendLayout();\r\n\t\t\tthis.tabPage3.SuspendLayout();\r\n\t\t\tthis.groupBox2.SuspendLayout();\r\n\t\t\tthis.panel1.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _EncodingBox\r\n\t\t\t// \r\n\t\t\tthis._EncodingBox.FormattingEnabled = true;\r\n\t\t\tthis._EncodingBox.Items.AddRange(new object[] {\r\n            \"系统默认\",\r\n            \"GB18030\",\r\n            \"UTF-8\",\r\n            \"UTF-16\",\r\n            \"Big5\"});\r\n\t\t\tthis._EncodingBox.Location = new System.Drawing.Point(77, 6);\r\n\t\t\tthis._EncodingBox.Name = \"_EncodingBox\";\r\n\t\t\tthis._EncodingBox.Size = new System.Drawing.Size(121, 20);\r\n\t\t\tthis._EncodingBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(6, 9);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"字符编码：\";\r\n\t\t\t// \r\n\t\t\t// _ExtractPageLinksBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageLinksBox.AutoSize = true;\r\n\t\t\tthis._ExtractPageLinksBox.Location = new System.Drawing.Point(114, 42);\r\n\t\t\tthis._ExtractPageLinksBox.Name = \"_ExtractPageLinksBox\";\r\n\t\t\tthis._ExtractPageLinksBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._ExtractPageLinksBox.TabIndex = 4;\r\n\t\t\tthis._ExtractPageLinksBox.Text = \"页面内的链接\";\r\n\t\t\tthis._ExtractPageLinksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportViewerPreferencesBox\r\n\t\t\t// \r\n\t\t\tthis._ExportViewerPreferencesBox.AutoSize = true;\r\n\t\t\tthis._ExportViewerPreferencesBox.Location = new System.Drawing.Point(6, 86);\r\n\t\t\tthis._ExportViewerPreferencesBox.Name = \"_ExportViewerPreferencesBox\";\r\n\t\t\tthis._ExportViewerPreferencesBox.Size = new System.Drawing.Size(240, 16);\r\n\t\t\tthis._ExportViewerPreferencesBox.TabIndex = 6;\r\n\t\t\tthis._ExportViewerPreferencesBox.Text = \"阅读器设置（如排版布局、页码样式等）\";\r\n\t\t\tthis._ExportViewerPreferencesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportBookmarksBox\r\n\t\t\t// \r\n\t\t\tthis._ExportBookmarksBox.AutoSize = true;\r\n\t\t\tthis._ExportBookmarksBox.Location = new System.Drawing.Point(6, 42);\r\n\t\t\tthis._ExportBookmarksBox.Name = \"_ExportBookmarksBox\";\r\n\t\t\tthis._ExportBookmarksBox.Size = new System.Drawing.Size(72, 16);\r\n\t\t\tthis._ExportBookmarksBox.TabIndex = 3;\r\n\t\t\tthis._ExportBookmarksBox.Text = \"文档书签\";\r\n\t\t\tthis._ExportBookmarksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportOptionsTab\r\n\t\t\t// \r\n\t\t\tthis._ExportOptionsTab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExportOptionsTab.Controls.Add(this.tabPage1);\r\n\t\t\tthis._ExportOptionsTab.Controls.Add(this.tabPage2);\r\n\t\t\tthis._ExportOptionsTab.Controls.Add(this.tabPage3);\r\n\t\t\tthis._ExportOptionsTab.Location = new System.Drawing.Point(12, 12);\r\n\t\t\tthis._ExportOptionsTab.Name = \"_ExportOptionsTab\";\r\n\t\t\tthis._ExportOptionsTab.SelectedIndex = 0;\r\n\t\t\tthis._ExportOptionsTab.Size = new System.Drawing.Size(424, 245);\r\n\t\t\tthis._ExportOptionsTab.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add(this._UnitBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label7);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label1);\r\n\t\t\tthis.tabPage1.Controls.Add(this._EncodingBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.groupBox1);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size(416, 219);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"常规导出选项\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _UnitBox\r\n\t\t\t// \r\n\t\t\tthis._UnitBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._UnitBox.FormattingEnabled = true;\r\n\t\t\tthis._UnitBox.Location = new System.Drawing.Point(299, 6);\r\n\t\t\tthis._UnitBox.Name = \"_UnitBox\";\r\n\t\t\tthis._UnitBox.Size = new System.Drawing.Size(54, 20);\r\n\t\t\tthis._UnitBox.TabIndex = 9;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(204, 9);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label7.TabIndex = 8;\r\n\t\t\tthis.label7.Text = \"尺寸度量单位：\";\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.groupBox1.Controls.Add(this._ExportDocPropertiesBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ExportBookmarksBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ExtractPageSettingsBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ConsolidateNamedDestBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ExtractPageLinksBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ExportViewerPreferencesBox);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point(6, 32);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size(404, 185);\r\n\t\t\tthis.groupBox1.TabIndex = 10;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"导出如下内容到信息文件\";\r\n\t\t\t// \r\n\t\t\t// _ExportDocPropertiesBox\r\n\t\t\t// \r\n\t\t\tthis._ExportDocPropertiesBox.AutoSize = true;\r\n\t\t\tthis._ExportDocPropertiesBox.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._ExportDocPropertiesBox.Name = \"_ExportDocPropertiesBox\";\r\n\t\t\tthis._ExportDocPropertiesBox.Size = new System.Drawing.Size(228, 16);\r\n\t\t\tthis._ExportDocPropertiesBox.TabIndex = 2;\r\n\t\t\tthis._ExportDocPropertiesBox.Text = \"文档属性（如标题、作者、关键字等）\";\r\n\t\t\tthis._ExportDocPropertiesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExtractPageSettingsBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageSettingsBox.AutoSize = true;\r\n\t\t\tthis._ExtractPageSettingsBox.Location = new System.Drawing.Point(6, 108);\r\n\t\t\tthis._ExtractPageSettingsBox.Name = \"_ExtractPageSettingsBox\";\r\n\t\t\tthis._ExtractPageSettingsBox.Size = new System.Drawing.Size(264, 16);\r\n\t\t\tthis._ExtractPageSettingsBox.TabIndex = 7;\r\n\t\t\tthis._ExtractPageSettingsBox.Text = \"页面设置（如页面尺寸、裁剪、旋转角度等）\";\r\n\t\t\tthis._ExtractPageSettingsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ConsolidateNamedDestBox\r\n\t\t\t// \r\n\t\t\tthis._ConsolidateNamedDestBox.AutoSize = true;\r\n\t\t\tthis._ConsolidateNamedDestBox.Location = new System.Drawing.Point(18, 64);\r\n\t\t\tthis._ConsolidateNamedDestBox.Name = \"_ConsolidateNamedDestBox\";\r\n\t\t\tthis._ConsolidateNamedDestBox.Size = new System.Drawing.Size(192, 16);\r\n\t\t\tthis._ConsolidateNamedDestBox.TabIndex = 5;\r\n\t\t\tthis._ConsolidateNamedDestBox.Text = \"解析书签和页面链接的命名位置\";\r\n\t\t\tthis._ConsolidateNamedDestBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// tabPage2\r\n\t\t\t// \r\n\t\t\tthis.tabPage2.Controls.Add(this._ExportCatalogBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label2);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label5);\r\n\t\t\tthis.tabPage2.Controls.Add(this._ExtractPageContentBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this._PageContentBox);\r\n\t\t\tthis.tabPage2.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage2.Name = \"tabPage2\";\r\n\t\t\tthis.tabPage2.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis.tabPage2.Size = new System.Drawing.Size(416, 219);\r\n\t\t\tthis.tabPage2.TabIndex = 1;\r\n\t\t\tthis.tabPage2.Text = \"高级导出选项\";\r\n\t\t\tthis.tabPage2.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportCatalogBox\r\n\t\t\t// \r\n\t\t\tthis._ExportCatalogBox.AutoSize = true;\r\n\t\t\tthis._ExportCatalogBox.Location = new System.Drawing.Point(6, 38);\r\n\t\t\tthis._ExportCatalogBox.Name = \"_ExportCatalogBox\";\r\n\t\t\tthis._ExportCatalogBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._ExportCatalogBox.TabIndex = 1;\r\n\t\t\tthis._ExportCatalogBox.Text = \"导出编录信息\";\r\n\t\t\tthis._ExportCatalogBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(4, 3);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(432, 31);\r\n\t\t\tthis.label2.TabIndex = 0;\r\n\t\t\tthis.label2.Text = \"说明：高级导出选项导出的内容仅供研究 PDF 文件结构之用，导入信息文件时不会导入这些内容。\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(107, 61);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(307, 28);\r\n\t\t\tthis.label5.TabIndex = 3;\r\n\t\t\tthis.label5.Text = \"此选项将生成很大的信息文件，包含页面大部分内容（如字体、图片信息等）。\";\r\n\t\t\t// \r\n\t\t\t// _ExtractPageContentBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageContentBox.AutoSize = true;\r\n\t\t\tthis._ExtractPageContentBox.Location = new System.Drawing.Point(6, 60);\r\n\t\t\tthis._ExtractPageContentBox.Name = \"_ExtractPageContentBox\";\r\n\t\t\tthis._ExtractPageContentBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._ExtractPageContentBox.TabIndex = 2;\r\n\t\t\tthis._ExtractPageContentBox.Text = \"导出页面内容\";\r\n\t\t\tthis._ExtractPageContentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _PageContentBox\r\n\t\t\t// \r\n\t\t\tthis._PageContentBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageContentBox.Controls.Add(this._ExportContentOperatorsBox);\r\n\t\t\tthis._PageContentBox.Controls.Add(this._ExtractPageDictionaryBox);\r\n\t\t\tthis._PageContentBox.Controls.Add(this._ExtractPageRangeBox);\r\n\t\t\tthis._PageContentBox.Controls.Add(this.label3);\r\n\t\t\tthis._PageContentBox.Controls.Add(this._ExportBinaryStreamBox);\r\n\t\t\tthis._PageContentBox.Controls.Add(this._ExtractImagesBox);\r\n\t\t\tthis._PageContentBox.Controls.Add(this._ExtractPageTextContentBox);\r\n\t\t\tthis._PageContentBox.Enabled = false;\r\n\t\t\tthis._PageContentBox.Location = new System.Drawing.Point(17, 92);\r\n\t\t\tthis._PageContentBox.Name = \"_PageContentBox\";\r\n\t\t\tthis._PageContentBox.Size = new System.Drawing.Size(393, 121);\r\n\t\t\tthis._PageContentBox.TabIndex = 4;\r\n\t\t\t// \r\n\t\t\t// _ExportContentOperatorsBox\r\n\t\t\t// \r\n\t\t\tthis._ExportContentOperatorsBox.AutoSize = true;\r\n\t\t\tthis._ExportContentOperatorsBox.Location = new System.Drawing.Point(224, 36);\r\n\t\t\tthis._ExportContentOperatorsBox.Name = \"_ExportContentOperatorsBox\";\r\n\t\t\tthis._ExportContentOperatorsBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._ExportContentOperatorsBox.TabIndex = 3;\r\n\t\t\tthis._ExportContentOperatorsBox.Text = \"导出绘制页面命令\";\r\n\t\t\tthis._ExportContentOperatorsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExtractPageDictionaryBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageDictionaryBox.AutoSize = true;\r\n\t\t\tthis._ExtractPageDictionaryBox.Location = new System.Drawing.Point(10, 36);\r\n\t\t\tthis._ExtractPageDictionaryBox.Name = \"_ExtractPageDictionaryBox\";\r\n\t\t\tthis._ExtractPageDictionaryBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._ExtractPageDictionaryBox.TabIndex = 2;\r\n\t\t\tthis._ExtractPageDictionaryBox.Text = \"导出页面字典信息\";\r\n\t\t\tthis._ExtractPageDictionaryBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExtractPageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageRangeBox.Location = new System.Drawing.Point(98, 3);\r\n\t\t\tthis._ExtractPageRangeBox.Name = \"_ExtractPageRangeBox\";\r\n\t\t\tthis._ExtractPageRangeBox.Size = new System.Drawing.Size(231, 21);\r\n\t\t\tthis._ExtractPageRangeBox.TabIndex = 1;\r\n\t\t\tthis._ExtractPageRangeBox.LostFocus += new System.EventHandler(this._ExtractPageRangeBox_Leave);\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(3, 6);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"导出页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _ExportBinaryStreamBox\r\n\t\t\t// \r\n\t\t\tthis._ExportBinaryStreamBox.AutoSize = true;\r\n\t\t\tthis._ExportBinaryStreamBox.Location = new System.Drawing.Point(10, 80);\r\n\t\t\tthis._ExportBinaryStreamBox.Name = \"_ExportBinaryStreamBox\";\r\n\t\t\tthis._ExportBinaryStreamBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._ExportBinaryStreamBox.TabIndex = 6;\r\n\t\t\tthis._ExportBinaryStreamBox.Text = \"导出二进制流\";\r\n\t\t\t// \r\n\t\t\t// _ExtractImagesBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractImagesBox.AutoSize = true;\r\n\t\t\tthis._ExtractImagesBox.Location = new System.Drawing.Point(10, 58);\r\n\t\t\tthis._ExtractImagesBox.Name = \"_ExtractImagesBox\";\r\n\t\t\tthis._ExtractImagesBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._ExtractImagesBox.TabIndex = 4;\r\n\t\t\tthis._ExtractImagesBox.Text = \"将图片导出为独立文件\";\r\n\t\t\tthis._ExtractImagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExtractPageTextContentBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageTextContentBox.AutoSize = true;\r\n\t\t\tthis._ExtractPageTextContentBox.Location = new System.Drawing.Point(224, 58);\r\n\t\t\tthis._ExtractPageTextContentBox.Name = \"_ExtractPageTextContentBox\";\r\n\t\t\tthis._ExtractPageTextContentBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._ExtractPageTextContentBox.TabIndex = 5;\r\n\t\t\tthis._ExtractPageTextContentBox.Text = \"解码导出页面内的文本\";\r\n\t\t\tthis._ExtractPageTextContentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// tabPage3\r\n\t\t\t// \r\n\t\t\tthis.tabPage3.Controls.Add(this.groupBox2);\r\n\t\t\tthis.tabPage3.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage3.Name = \"tabPage3\";\r\n\t\t\tthis.tabPage3.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis.tabPage3.Size = new System.Drawing.Size(416, 219);\r\n\t\t\tthis.tabPage3.TabIndex = 2;\r\n\t\t\tthis.tabPage3.Text = \"导入选项\";\r\n\t\t\tthis.tabPage3.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.groupBox2.Controls.Add(this._ImportPageSettingsBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ImportDocumentInfoBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.panel1);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ImportBookmarksBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ImportPageLinksBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ImportViewerPreferencesBox);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size(407, 207);\r\n\t\t\tthis.groupBox2.TabIndex = 0;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"导入信息文件如下项目\";\r\n\t\t\t// \r\n\t\t\t// _ImportPageSettingsBox\r\n\t\t\t// \r\n\t\t\tthis._ImportPageSettingsBox.AutoSize = true;\r\n\t\t\tthis._ImportPageSettingsBox.Location = new System.Drawing.Point(6, 108);\r\n\t\t\tthis._ImportPageSettingsBox.Name = \"_ImportPageSettingsBox\";\r\n\t\t\tthis._ImportPageSettingsBox.Size = new System.Drawing.Size(264, 16);\r\n\t\t\tthis._ImportPageSettingsBox.TabIndex = 4;\r\n\t\t\tthis._ImportPageSettingsBox.Text = \"页面设置（如页面尺寸、裁剪、旋转角度等）\";\r\n\t\t\tthis._ImportPageSettingsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImportDocumentInfoBox\r\n\t\t\t// \r\n\t\t\tthis._ImportDocumentInfoBox.AutoSize = true;\r\n\t\t\tthis._ImportDocumentInfoBox.Checked = true;\r\n\t\t\tthis._ImportDocumentInfoBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._ImportDocumentInfoBox.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._ImportDocumentInfoBox.Name = \"_ImportDocumentInfoBox\";\r\n\t\t\tthis._ImportDocumentInfoBox.Size = new System.Drawing.Size(252, 16);\r\n\t\t\tthis._ImportDocumentInfoBox.TabIndex = 0;\r\n\t\t\tthis._ImportDocumentInfoBox.Text = \"文档属性信息（如作者、主题、关键字等）\";\r\n\t\t\tthis._ImportDocumentInfoBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// panel1\r\n\t\t\t// \r\n\t\t\tthis.panel1.Controls.Add(this.label10);\r\n\t\t\tthis.panel1.Controls.Add(this._RemoveOriginalPageLinksBox);\r\n\t\t\tthis.panel1.Controls.Add(this._KeepOriginalPageLinksBox);\r\n\t\t\tthis.panel1.Location = new System.Drawing.Point(213, 64);\r\n\t\t\tthis.panel1.Margin = new System.Windows.Forms.Padding(0);\r\n\t\t\tthis.panel1.Name = \"panel1\";\r\n\t\t\tthis.panel1.Size = new System.Drawing.Size(191, 16);\r\n\t\t\tthis.panel1.TabIndex = 10;\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(3, 1);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label10.TabIndex = 0;\r\n\t\t\tthis.label10.Text = \"原页面链接：\";\r\n\t\t\t// \r\n\t\t\t// _RemoveOriginalPageLinksBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveOriginalPageLinksBox.AutoSize = true;\r\n\t\t\tthis._RemoveOriginalPageLinksBox.Checked = true;\r\n\t\t\tthis._RemoveOriginalPageLinksBox.Location = new System.Drawing.Point(86, -1);\r\n\t\t\tthis._RemoveOriginalPageLinksBox.Name = \"_RemoveOriginalPageLinksBox\";\r\n\t\t\tthis._RemoveOriginalPageLinksBox.Size = new System.Drawing.Size(47, 16);\r\n\t\t\tthis._RemoveOriginalPageLinksBox.TabIndex = 1;\r\n\t\t\tthis._RemoveOriginalPageLinksBox.TabStop = true;\r\n\t\t\tthis._RemoveOriginalPageLinksBox.Text = \"替换\";\r\n\t\t\tthis._RemoveOriginalPageLinksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _KeepOriginalPageLinksBox\r\n\t\t\t// \r\n\t\t\tthis._KeepOriginalPageLinksBox.AutoSize = true;\r\n\t\t\tthis._KeepOriginalPageLinksBox.Location = new System.Drawing.Point(139, -1);\r\n\t\t\tthis._KeepOriginalPageLinksBox.Name = \"_KeepOriginalPageLinksBox\";\r\n\t\t\tthis._KeepOriginalPageLinksBox.Size = new System.Drawing.Size(47, 16);\r\n\t\t\tthis._KeepOriginalPageLinksBox.TabIndex = 2;\r\n\t\t\tthis._KeepOriginalPageLinksBox.Text = \"保留\";\r\n\t\t\tthis._KeepOriginalPageLinksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImportBookmarksBox\r\n\t\t\t// \r\n\t\t\tthis._ImportBookmarksBox.AutoSize = true;\r\n\t\t\tthis._ImportBookmarksBox.Checked = true;\r\n\t\t\tthis._ImportBookmarksBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._ImportBookmarksBox.Location = new System.Drawing.Point(6, 42);\r\n\t\t\tthis._ImportBookmarksBox.Name = \"_ImportBookmarksBox\";\r\n\t\t\tthis._ImportBookmarksBox.Size = new System.Drawing.Size(72, 16);\r\n\t\t\tthis._ImportBookmarksBox.TabIndex = 1;\r\n\t\t\tthis._ImportBookmarksBox.Text = \"文档书签\";\r\n\t\t\tthis._ImportBookmarksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImportPageLinksBox\r\n\t\t\t// \r\n\t\t\tthis._ImportPageLinksBox.AutoSize = true;\r\n\t\t\tthis._ImportPageLinksBox.Checked = true;\r\n\t\t\tthis._ImportPageLinksBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._ImportPageLinksBox.Location = new System.Drawing.Point(6, 64);\r\n\t\t\tthis._ImportPageLinksBox.Name = \"_ImportPageLinksBox\";\r\n\t\t\tthis._ImportPageLinksBox.Size = new System.Drawing.Size(204, 16);\r\n\t\t\tthis._ImportPageLinksBox.TabIndex = 2;\r\n\t\t\tthis._ImportPageLinksBox.Text = \"页面内的链接（合并模式下无效）\";\r\n\t\t\tthis._ImportPageLinksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImportViewerPreferencesBox\r\n\t\t\t// \r\n\t\t\tthis._ImportViewerPreferencesBox.AutoSize = true;\r\n\t\t\tthis._ImportViewerPreferencesBox.Checked = true;\r\n\t\t\tthis._ImportViewerPreferencesBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._ImportViewerPreferencesBox.Location = new System.Drawing.Point(6, 86);\r\n\t\t\tthis._ImportViewerPreferencesBox.Name = \"_ImportViewerPreferencesBox\";\r\n\t\t\tthis._ImportViewerPreferencesBox.Size = new System.Drawing.Size(240, 16);\r\n\t\t\tthis._ImportViewerPreferencesBox.TabIndex = 3;\r\n\t\t\tthis._ImportViewerPreferencesBox.Text = \"阅读器设置（如排版布局、页码样式等）\";\r\n\t\t\tthis._ImportViewerPreferencesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// InfoFileOptionControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(448, 269);\r\n\t\t\tthis.Controls.Add(this._ExportOptionsTab);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"InfoFileOptionControl\";\r\n\t\t\tthis.Text = \"信息文件选项\";\r\n\t\t\tthis.VisibleChanged += new System.EventHandler(this.ExportOptionControl_VisibleChanged);\r\n\t\t\tthis._ExportOptionsTab.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.PerformLayout();\r\n\t\t\tthis.groupBox1.ResumeLayout(false);\r\n\t\t\tthis.groupBox1.PerformLayout();\r\n\t\t\tthis.tabPage2.ResumeLayout(false);\r\n\t\t\tthis.tabPage2.PerformLayout();\r\n\t\t\tthis._PageContentBox.ResumeLayout(false);\r\n\t\t\tthis._PageContentBox.PerformLayout();\r\n\t\t\tthis.tabPage3.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.PerformLayout();\r\n\t\t\tthis.panel1.ResumeLayout(false);\r\n\t\t\tthis.panel1.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractPageLinksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportViewerPreferencesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportBookmarksBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _EncodingBox;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TabControl _ExportOptionsTab;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage2;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _ExtractPageRangeBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractPageContentBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractPageSettingsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractImagesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ConsolidateNamedDestBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportDocPropertiesBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _UnitBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportBinaryStreamBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportCatalogBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractPageTextContentBox;\r\n\t\tprivate System.Windows.Forms.Panel _PageContentBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtractPageDictionaryBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExportContentOperatorsBox;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage3;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.CheckBox _ImportDocumentInfoBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ImportPageLinksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ImportViewerPreferencesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ImportBookmarksBox;\r\n\t\tprivate System.Windows.Forms.Panel panel1;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.RadioButton _RemoveOriginalPageLinksBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _KeepOriginalPageLinksBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.CheckBox _ImportPageSettingsBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/InfoFileOptionControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class InfoFileOptionControl : Form, IResettableControl\r\n\t{\r\n\t\tExporterOptions _expOptions;\r\n\t\tImporterOptions _impOptions;\r\n\t\tbool locked;\r\n\r\n\t\tpublic InfoFileOptionControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tthis.SetIcon(Properties.Resources.InfoFileOptions);\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractPageRangeBox, Messages.PageRanges);\r\n\r\n\t\t\t_UnitBox.Items.AddRange(Constants.Units.Names);\r\n\r\n\t\t\tReload();\r\n\r\n\t\t\t_ConsolidateNamedDestBox.CheckedChanged += OptionChanged;\r\n\t\t\t_EncodingBox.Leave += _EncodingBox_Leave;\r\n\t\t\t_ExportBinaryStreamBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExportBookmarksBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExportCatalogBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExportDocPropertiesBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExtractImagesBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExtractPageContentBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExtractPageDictionaryBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExtractPageLinksBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExtractPageRangeBox.Leave += OptionChanged;\r\n\t\t\t_ExtractPageSettingsBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExtractPageTextContentBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExportViewerPreferencesBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ExportContentOperatorsBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ImportBookmarksBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ImportDocumentInfoBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ImportPageLinksBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ImportPageSettingsBox.CheckedChanged += OptionChanged;\r\n\t\t\t_ImportViewerPreferencesBox.CheckedChanged += OptionChanged;\r\n\t\t\t_KeepOriginalPageLinksBox.CheckedChanged += OptionChanged;\r\n\t\t\t_RemoveOriginalPageLinksBox.CheckedChanged += OptionChanged;\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tlocked = true;\r\n\t\t\tAppContext.Exporter = new ExporterOptions();\r\n\t\t\tAppContext.Importer = new ImporterOptions();\r\n\t\t\tReload();\r\n\t\t\tlocked = false;\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\t_expOptions = AppContext.Exporter;\r\n\t\t\t_impOptions = AppContext.Importer;\r\n\r\n\t\t\t_ConsolidateNamedDestBox.Checked = _expOptions.ConsolidateNamedDestinations;\r\n\t\t\t_EncodingBox.Text = _expOptions.Encoding;\r\n\t\t\t_ExportBinaryStreamBox.Checked = _expOptions.ExportBinaryStream;\r\n\t\t\t_ExportBookmarksBox.Checked = _expOptions.ExportBookmarks;\r\n\t\t\t_ExportCatalogBox.Checked = _expOptions.ExportCatalog;\r\n\t\t\t_ExportContentOperatorsBox.Checked = _expOptions.ExportContentOperators;\r\n\t\t\t_ExportDocPropertiesBox.Checked = _expOptions.ExportDocProperties;\r\n\t\t\t_ExtractImagesBox.Checked = _expOptions.ExtractImages;\r\n\t\t\t_ExtractPageContentBox.Checked = _expOptions.ExtractPageContent;\r\n\t\t\t_ExtractPageDictionaryBox.Checked = _expOptions.ExtractPageDictionary;\r\n\t\t\t_ExtractPageLinksBox.Checked = _expOptions.ExtractPageLinks;\r\n\t\t\t_ExtractPageRangeBox.Text = _expOptions.ExtractPageRange;\r\n\t\t\t_ExtractPageSettingsBox.Checked = _expOptions.ExtractPageSettings;\r\n\t\t\t_ExtractPageTextContentBox.Checked = _expOptions.ExportDecodedText;\r\n\t\t\t_ExportViewerPreferencesBox.Checked = _expOptions.ExportViewerPreferences;\r\n\t\t\t_PageContentBox.Enabled = _ExtractPageContentBox.Checked = _expOptions.ExtractPageContent;\r\n\r\n\t\t\t_ImportDocumentInfoBox.Checked = _impOptions.ImportDocProperties;\r\n\t\t\t_ImportBookmarksBox.Checked = _impOptions.ImportBookmarks;\r\n\t\t\t_ImportPageLinksBox.Checked = _impOptions.ImportPageLinks;\r\n\t\t\t_ImportPageSettingsBox.Checked = _impOptions.ImportPageSettings;\r\n\t\t\t_ImportViewerPreferencesBox.Checked = _impOptions.ImportViewerPreferences;\r\n\t\t\t_KeepOriginalPageLinksBox.Checked = _impOptions.KeepPageLinks;\r\n\r\n\t\t\tvar i = _UnitBox.Items.IndexOf(_expOptions.UnitConverter.Unit);\r\n\t\t\t_UnitBox.SelectedIndex = (i != -1) ? i : 0;\r\n\t\t}\r\n\r\n\t\tvoid OptionChanged(object sender, EventArgs e) {\r\n\t\t\tif (locked) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (sender == _ExtractPageDictionaryBox) {\r\n\t\t\t\t_expOptions.ExtractPageDictionary = _ExtractPageDictionaryBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExtractPageTextContentBox) {\r\n\t\t\t\t_expOptions.ExportDecodedText = _ExtractPageTextContentBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExportDocPropertiesBox) {\r\n\t\t\t\t_expOptions.ExportDocProperties = _ExportDocPropertiesBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ConsolidateNamedDestBox) {\r\n\t\t\t\t_expOptions.ConsolidateNamedDestinations = _ConsolidateNamedDestBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExtractImagesBox) {\r\n\t\t\t\t_expOptions.ExtractImages = _ExtractImagesBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExtractPageSettingsBox) {\r\n\t\t\t\t_expOptions.ExtractPageSettings = _ExtractPageSettingsBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExportBookmarksBox) {\r\n\t\t\t\t_expOptions.ExportBookmarks = _ExportBookmarksBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExtractPageLinksBox) {\r\n\t\t\t\t_expOptions.ExtractPageLinks = _ExtractPageLinksBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExportViewerPreferencesBox) {\r\n\t\t\t\t_expOptions.ExportViewerPreferences = _ExportViewerPreferencesBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExtractPageContentBox) {\r\n\t\t\t\t_expOptions.ExtractPageContent = _PageContentBox.Enabled = _ExtractPageContentBox.Checked;\r\n\t\t\t\t_ExtractPageRangeBox.Focus();\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExportContentOperatorsBox) {\r\n\t\t\t\t_expOptions.ExportContentOperators = _ExportContentOperatorsBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExportBinaryStreamBox) {\r\n\t\t\t\tAppContext.Exporter.ExportBinaryStream = _ExportBinaryStreamBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ExportCatalogBox) {\r\n\t\t\t\tAppContext.Exporter.ExportCatalog = _ExportCatalogBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ImportDocumentInfoBox) {\r\n\t\t\t\t_impOptions.ImportDocProperties = _ImportDocumentInfoBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _KeepOriginalPageLinksBox) {\r\n\t\t\t\t_impOptions.KeepPageLinks = _KeepOriginalPageLinksBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ImportBookmarksBox) {\r\n\t\t\t\t_impOptions.ImportBookmarks = _ImportBookmarksBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ImportPageLinksBox) {\r\n\t\t\t\t_impOptions.ImportPageLinks = _ImportPageLinksBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ImportPageSettingsBox) {\r\n\t\t\t\t_impOptions.ImportPageSettings = _ImportPageSettingsBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ImportViewerPreferencesBox) {\r\n\t\t\t\t_impOptions.ImportViewerPreferences = _ImportViewerPreferencesBox.Checked;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _EncodingBox_Leave(object sender, EventArgs e) {\r\n\t\t\ttry {\r\n\t\t\t\t_expOptions.Encoding = _EncodingBox.Text;\r\n\t\t\t\t_EncodingBox.Text = _expOptions.Encoding;\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\tFormHelper.ErrorBox(\"输入的编码无效。\");\r\n\t\t\t\t_EncodingBox.Text = Constants.Encoding.SystemDefault;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ExtractPageRangeBox_Leave(object sender, EventArgs e) {\r\n\t\t\t_expOptions.ExtractPageRange = _ExtractPageRangeBox.Text.Trim();\r\n\t\t}\r\n\r\n\t\tprivate void ExportOptionControl_VisibleChanged(object sender, EventArgs e) {\r\n\t\t\tif (Visible) {\r\n\t\t\t\t_ExtractPageRangeBox.Text = AppContext.Exporter.ExtractPageRange;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tAppContext.Exporter.UnitConverter.Unit = _UnitBox.SelectedItem.ToString();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/InfoFileOptionControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/ListViewItemComparer.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tsealed class ListViewItemComparer : System.Collections.IComparer\r\n\t{\r\n\t\t///<summary>获取或指定排序列的值。</summary>\r\n\t\tpublic int Col { get; }\r\n\t\t///<summary>获取或指定是否使用智能排序。</summary>\r\n\t\tpublic bool UseSmartSort { get; }\r\n\t\t///<summary>获取或指定列表排序的方式。</summary>\r\n\t\tpublic SortOrder SortOrder { get; }\r\n\r\n\t\tpublic ListViewItemComparer() {\r\n\t\t\tCol = 0;\r\n\t\t}\r\n\t\tpublic ListViewItemComparer(int column) {\r\n\t\t\tCol = column;\r\n\t\t}\r\n\t\tpublic ListViewItemComparer(int column, bool useSmartSort) {\r\n\t\t\tCol = column;\r\n\t\t\tUseSmartSort = useSmartSort;\r\n\t\t\tSortOrder = SortOrder.Ascending;\r\n\t\t}\r\n\t\tpublic ListViewItemComparer(int column, bool useSmartSort, SortOrder sortOrder) {\r\n\t\t\tCol = column;\r\n\t\t\tUseSmartSort = useSmartSort;\r\n\t\t\tSortOrder = sortOrder;\r\n\t\t}\r\n\r\n\t\t#region IComparer 成员\r\n\r\n\t\tint System.Collections.IComparer.Compare(object x, object y) {\r\n\t\t\tif (SortOrder == SortOrder.None) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tvar a = ((ListViewItem)x).SubItems[Col].Text;\r\n\t\t\tvar b = ((ListViewItem)y).SubItems[Col].Text;\r\n\t\t\tint r = UseSmartSort ? FileHelper.NumericAwareComparePath(a, b) : String.Compare(a, b);\r\n\t\t\treturn (SortOrder == SortOrder.Ascending) ? r : -r;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n\r\n\tsealed class OlvColumnSmartComparer(BrightIdeasSoftware.OLVColumn column, SortOrder sortOrder) : System.Collections.IComparer\r\n\t{\r\n\t\t///<summary>获取排序列。</summary>\r\n\t\tpublic BrightIdeasSoftware.OLVColumn Column { get; } = column;\r\n\t\t///<summary>获取列表排序的方式。</summary>\r\n\t\tpublic SortOrder SortOrder { get; } = sortOrder;\r\n\r\n\t\t#region IComparer 成员\r\n\r\n\t\tint System.Collections.IComparer.Compare(object x, object y) {\r\n\t\t\tif (SortOrder == SortOrder.None) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tvar a = Column.GetStringValue(x);\r\n\t\t\tvar b = Column.GetStringValue(y);\r\n\t\t\tint r = FileHelper.NumericAwareComparePath(a, b);\r\n\t\t\treturn (SortOrder == SortOrder.Ascending) ? r : -r;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/MacroMenu.cs",
    "content": "﻿using System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinternal sealed class MacroMenu : ContextMenuStrip\r\n\t{\r\n\t\treadonly TextBox __editOperationWrapper = new TextBox();\r\n\r\n\t\tinternal const string InsertText = \"插入\";\r\n\r\n\t\tpublic MacroMenu() : base() { }\r\n\t\tpublic MacroMenu(System.ComponentModel.IContainer container) : base(container) { }\r\n\r\n\t\tinternal void AddInsertMacroMenuItem(string text) {\r\n\t\t\tItems.Add(InsertText + text);\r\n\t\t}\r\n\r\n\t\tinternal void LoadStandardSourceFileMacros() {\r\n\t\t\tItems.AddRange(new ToolStripItem[] {\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.PathName),\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.FileName),\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.FolderName)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tinternal void LoadStandardInfoMacros() {\r\n\t\t\tItems.AddRange(new ToolStripItem[] {\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.TitleProperty),\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.AuthorProperty),\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.SubjectProperty),\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.KeywordsProperty),\r\n\t\t\t\tnew ToolStripMenuItem (InsertText + Constants.FileNameMacros.PageCount),\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tinternal void ProcessInsertMacroCommand(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tvar t = e.ClickedItem.Text;\r\n\t\t\tif (!t.StartsWith(InsertText)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tt = t.Substring(InsertText.Length);\r\n\t\t\tif (SourceControl is TextBoxBase c) {\r\n\t\t\t\tc.SelectedText = t;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (SourceControl is ComboBox cb) {\r\n\t\t\t\tcb.SelectedText = t;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/MergerControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class MergerControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton _File;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator4;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _LoadList;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SaveList;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _EditItemProperty;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Refresh;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SetPdfOptions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SetCroppingOptions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Copy;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RefreshFolder;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ClearBookmarkTitle;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SetBookmarkTitle;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _PasteBookmarkText;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _CopyBookmarkText;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _CopyFileName;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Delete;\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MergerControl));\r\n\t\t\tthis._FileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SortByNaturalNumberItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortByAlphaItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortByCaj = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortByFileTime = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ReverseSort = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._AddFilesButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RecentFileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._AddFolderButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RecentFolderMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._InsertEmptyPage = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._BoldStyleButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._ItalicStyleButton = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._BookmarkColorButton = new ColorPicker.ToolStripColorPicker();\r\n\t\t\tthis._BookmarkTextMenu = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\tthis._ItemList = new BrightIdeasSoftware.TreeListView();\r\n\t\t\tthis._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._BookmarkColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageRangeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FolderColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FileTimeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItemListMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tthis._FileTypeList = new System.Windows.Forms.ImageList(this.components);\r\n\t\t\tthis._OpenImageBox = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis._OpenPdfBox = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis._AddDocumentWorker = new System.ComponentModel.BackgroundWorker();\r\n\t\t\tthis._BookmarkControl = new PDFPatcher.BookmarkControl();\r\n\t\t\tthis._TargetPdfFile = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._ImportButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\tthis._IndividualMergerModeBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ConfigButton = new System.Windows.Forms.Button();\r\n\t\t\t_File = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\ttoolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_LoadList = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SaveList = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_EditItemProperty = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_Refresh = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_SetPdfOptions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SetCroppingOptions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Copy = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RefreshFolder = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ClearBookmarkTitle = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SetBookmarkTitle = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_PasteBookmarkText = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CopyBookmarkText = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CopyFileName = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Delete = new System.Windows.Forms.ToolStripButton();\r\n\t\t\tthis._FileMenu.SuspendLayout();\r\n\t\t\tthis._MainToolbar.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).BeginInit();\r\n\t\t\tthis._ItemListMenu.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _File\r\n\t\t\t// \r\n\t\t\t_File.AutoToolTip = false;\r\n\t\t\t_File.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r\n\t\t\t_File.DropDown = this._FileMenu;\r\n\t\t\t_File.Image = global::PDFPatcher.Properties.Resources.Sort;\r\n\t\t\t_File.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_File.Name = \"_File\";\r\n\t\t\t_File.Size = new System.Drawing.Size(58, 22);\r\n\t\t\t_File.Text = \"文件(&J)\";\r\n\t\t\t_File.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _FileMenu\r\n\t\t\t// \r\n\t\t\tthis._FileMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._SortByNaturalNumberItem,\r\n            this._SortByAlphaItem,\r\n            this._SortByCaj,\r\n            this._SortByFileTime,\r\n            this._ReverseSort,\r\n            toolStripSeparator4,\r\n            _LoadList,\r\n            _SaveList});\r\n\t\t\tthis._FileMenu.Name = \"_SortMenu\";\r\n\t\t\tthis._FileMenu.OwnerItem = _File;\r\n\t\t\tthis._FileMenu.Size = new System.Drawing.Size(212, 164);\r\n\t\t\tthis._FileMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortByNaturalNumberItem\r\n\t\t\t// \r\n\t\t\tthis._SortByNaturalNumberItem.Image = global::PDFPatcher.Properties.Resources.NaturalSort;\r\n\t\t\tthis._SortByNaturalNumberItem.Name = \"_SortByNaturalNumberItem\";\r\n\t\t\tthis._SortByNaturalNumberItem.Size = new System.Drawing.Size(211, 22);\r\n\t\t\tthis._SortByNaturalNumberItem.Text = \"按数值和字母顺序排序(&S)\";\r\n\t\t\t// \r\n\t\t\t// _SortByAlphaItem\r\n\t\t\t// \r\n\t\t\tthis._SortByAlphaItem.Image = global::PDFPatcher.Properties.Resources.AlphabeticSort;\r\n\t\t\tthis._SortByAlphaItem.Name = \"_SortByAlphaItem\";\r\n\t\t\tthis._SortByAlphaItem.Size = new System.Drawing.Size(211, 22);\r\n\t\t\tthis._SortByAlphaItem.Text = \"按字母顺序排序(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _SortByCaj\r\n\t\t\t// \r\n\t\t\tthis._SortByCaj.Name = \"_SortByCaj\";\r\n\t\t\tthis._SortByCaj.Size = new System.Drawing.Size(211, 22);\r\n\t\t\tthis._SortByCaj.Text = \"按CAJ文件命名规则排序\";\r\n\t\t\t// \r\n\t\t\t// _SortByFileTime\r\n\t\t\t// \r\n\t\t\tthis._SortByFileTime.Image = global::PDFPatcher.Properties.Resources.Time;\r\n\t\t\tthis._SortByFileTime.Name = \"_SortByFileTime\";\r\n\t\t\tthis._SortByFileTime.Size = new System.Drawing.Size(211, 22);\r\n\t\t\tthis._SortByFileTime.Text = \"按修改时间先后排序\";\r\n\t\t\t// \r\n\t\t\t// _ReverseSort\r\n\t\t\t// \r\n\t\t\tthis._ReverseSort.Image = global::PDFPatcher.Properties.Resources.SortReverse;\r\n\t\t\tthis._ReverseSort.Name = \"_ReverseSort\";\r\n\t\t\tthis._ReverseSort.Size = new System.Drawing.Size(211, 22);\r\n\t\t\tthis._ReverseSort.Text = \"反转排序\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator4\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator4.Name = \"toolStripSeparator4\";\r\n\t\t\ttoolStripSeparator4.Size = new System.Drawing.Size(208, 6);\r\n\t\t\t// \r\n\t\t\t// _LoadList\r\n\t\t\t// \r\n\t\t\t_LoadList.Image = global::PDFPatcher.Properties.Resources.Open;\r\n\t\t\t_LoadList.Name = \"_LoadList\";\r\n\t\t\t_LoadList.Size = new System.Drawing.Size(211, 22);\r\n\t\t\t_LoadList.Text = \"加载文件列表(&J)...\";\r\n\t\t\t_LoadList.ToolTipText = \"加载上次保存的文件列表，供继续编辑\";\r\n\t\t\t// \r\n\t\t\t// _SaveList\r\n\t\t\t// \r\n\t\t\t_SaveList.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\t_SaveList.Name = \"_SaveList\";\r\n\t\t\t_SaveList.Size = new System.Drawing.Size(211, 22);\r\n\t\t\t_SaveList.Text = \"保存文件列表(&B)...\";\r\n\t\t\t_SaveList.ToolTipText = \"保存文件列表到文件，供以后处理\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\ttoolStripSeparator1.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _EditItemProperty\r\n\t\t\t// \r\n\t\t\t_EditItemProperty.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_EditItemProperty.Image = global::PDFPatcher.Properties.Resources.PdfPageRange;\r\n\t\t\t_EditItemProperty.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_EditItemProperty.Name = \"_EditItemProperty\";\r\n\t\t\t_EditItemProperty.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_EditItemProperty.Text = \"编辑源文件的处理方式\";\r\n\t\t\t// \r\n\t\t\t// _Refresh\r\n\t\t\t// \r\n\t\t\t_Refresh.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_Refresh.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\t_Refresh.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Refresh.Name = \"_Refresh\";\r\n\t\t\t_Refresh.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_Refresh.Text = \"toolStripButton1\";\r\n\t\t\t_Refresh.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _SetPdfOptions\r\n\t\t\t// \r\n\t\t\t_SetPdfOptions.Name = \"_SetPdfOptions\";\r\n\t\t\t_SetPdfOptions.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_SetPdfOptions.Text = \"设置源 &PDF 文件处理方式...\";\r\n\t\t\t_SetPdfOptions.ToolTipText = \"更改源 PDF 文件的页码范围\";\r\n\t\t\t// \r\n\t\t\t// _SetCroppingOptions\r\n\t\t\t// \r\n\t\t\t_SetCroppingOptions.Name = \"_SetCroppingOptions\";\r\n\t\t\t_SetCroppingOptions.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_SetCroppingOptions.Text = \"设置裁剪图片选项(&C)...\";\r\n\t\t\t// \r\n\t\t\t// _Copy\r\n\t\t\t// \r\n\t\t\t_Copy.Name = \"_Copy\";\r\n\t\t\t_Copy.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Copy.Text = \"复制列表内容(&F)\";\r\n\t\t\t// \r\n\t\t\t// _RefreshFolder\r\n\t\t\t// \r\n\t\t\t_RefreshFolder.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\t_RefreshFolder.Name = \"_RefreshFolder\";\r\n\t\t\t_RefreshFolder.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_RefreshFolder.Text = \"刷新文件夹(&W)\";\r\n\t\t\t_RefreshFolder.ToolTipText = \"刷新文件夹的内容\";\r\n\t\t\t// \r\n\t\t\t// _ClearBookmarkTitle\r\n\t\t\t// \r\n\t\t\t_ClearBookmarkTitle.Name = \"_ClearBookmarkTitle\";\r\n\t\t\t_ClearBookmarkTitle.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_ClearBookmarkTitle.Text = \"清空书签文本\";\r\n\t\t\t_ClearBookmarkTitle.ToolTipText = \"清空选中项目对应的书签文本及书签设置\";\r\n\t\t\t// \r\n\t\t\t// _SetBookmarkTitle\r\n\t\t\t// \r\n\t\t\t_SetBookmarkTitle.Name = \"_SetBookmarkTitle\";\r\n\t\t\t_SetBookmarkTitle.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_SetBookmarkTitle.Text = \"设置书签文本为源文件名\";\r\n\t\t\t_SetBookmarkTitle.ToolTipText = \"将选中项目对应的书签文本设置为文件名\";\r\n\t\t\t// \r\n\t\t\t// _PasteBookmarkText\r\n\t\t\t// \r\n\t\t\t_PasteBookmarkText.Image = global::PDFPatcher.Properties.Resources.Paste;\r\n\t\t\t_PasteBookmarkText.Name = \"_PasteBookmarkText\";\r\n\t\t\t_PasteBookmarkText.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_PasteBookmarkText.Text = \"粘贴书签文本(Z)\";\r\n\t\t\t// \r\n\t\t\t// _CopyBookmarkText\r\n\t\t\t// \r\n\t\t\t_CopyBookmarkText.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\t_CopyBookmarkText.Name = \"_CopyBookmarkText\";\r\n\t\t\t_CopyBookmarkText.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_CopyBookmarkText.Text = \"复制书签文本(&S)\";\r\n\t\t\t// \r\n\t\t\t// _CopyFileName\r\n\t\t\t// \r\n\t\t\t_CopyFileName.Name = \"_CopyFileName\";\r\n\t\t\t_CopyFileName.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_CopyFileName.Text = \"复制文件名(M)\";\r\n\t\t\t// \r\n\t\t\t// _Delete\r\n\t\t\t// \r\n\t\t\t_Delete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_Delete.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\t_Delete.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Delete.Name = \"_Delete\";\r\n\t\t\t_Delete.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_Delete.Text = \"删除选中项\";\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.AutoSize = false;\r\n\t\t\tthis._MainToolbar.GripMargin = new System.Windows.Forms.Padding(0);\r\n\t\t\tthis._MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _File,\r\n            this._AddFilesButton,\r\n            this._AddFolderButton,\r\n            this._InsertEmptyPage,\r\n            _Delete,\r\n            toolStripSeparator1,\r\n            this._BoldStyleButton,\r\n            this._ItalicStyleButton,\r\n            this._BookmarkColorButton,\r\n            this._BookmarkTextMenu,\r\n            toolStripSeparator2,\r\n            _EditItemProperty,\r\n            _Refresh});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size(575, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 6;\r\n\t\t\tthis._MainToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _AddFilesButton\r\n\t\t\t// \r\n\t\t\tthis._AddFilesButton.DropDown = this._RecentFileMenu;\r\n\t\t\tthis._AddFilesButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddFilesButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilesButton.Name = \"_AddFilesButton\";\r\n\t\t\tthis._AddFilesButton.Size = new System.Drawing.Size(103, 22);\r\n\t\t\tthis._AddFilesButton.Text = \"添加文件(&T)\";\r\n\t\t\tthis._AddFilesButton.ToolTipText = \"添加需要合并的文件到处理列表\";\r\n\t\t\tthis._AddFilesButton.ButtonClick += new System.EventHandler(this._MainToolbar_ButtonClick);\r\n\t\t\t// \r\n\t\t\t// _RecentFileMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFileMenu.Name = \"_RecentFileMenu\";\r\n\t\t\tthis._RecentFileMenu.OwnerItem = this._AddFilesButton;\r\n\t\t\tthis._RecentFileMenu.ShowImageMargin = false;\r\n\t\t\tthis._RecentFileMenu.Size = new System.Drawing.Size(36, 4);\r\n\t\t\t// \r\n\t\t\t// _AddFolderButton\r\n\t\t\t// \r\n\t\t\tthis._AddFolderButton.DropDown = this._RecentFolderMenu;\r\n\t\t\tthis._AddFolderButton.Image = global::PDFPatcher.Properties.Resources.ImageFolder;\r\n\t\t\tthis._AddFolderButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFolderButton.Name = \"_AddFolderButton\";\r\n\t\t\tthis._AddFolderButton.Size = new System.Drawing.Size(100, 22);\r\n\t\t\tthis._AddFolderButton.Text = \"添加文件夹\";\r\n\t\t\tthis._AddFolderButton.ToolTipText = \"添加文件夹及其包含的文件到处理列表\";\r\n\t\t\tthis._AddFolderButton.ButtonClick += new System.EventHandler(this._MainToolbar_ButtonClick);\r\n\t\t\tthis._AddFolderButton.DropDownOpening += new System.EventHandler(this._AddFolder_DropDownOpening);\r\n\t\t\tthis._AddFolderButton.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._AddFolderButton_DropDownItemClicked);\r\n\t\t\t// \r\n\t\t\t// _RecentFolderMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFolderMenu.Name = \"_RecentFolderMenu\";\r\n\t\t\tthis._RecentFolderMenu.OwnerItem = this._AddFolderButton;\r\n\t\t\tthis._RecentFolderMenu.ShowImageMargin = false;\r\n\t\t\tthis._RecentFolderMenu.Size = new System.Drawing.Size(36, 4);\r\n\t\t\t// \r\n\t\t\t// _InsertEmptyPage\r\n\t\t\t// \r\n\t\t\tthis._InsertEmptyPage.Image = global::PDFPatcher.Properties.Resources.EmptyPage;\r\n\t\t\tthis._InsertEmptyPage.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._InsertEmptyPage.Name = \"_InsertEmptyPage\";\r\n\t\t\tthis._InsertEmptyPage.Size = new System.Drawing.Size(88, 22);\r\n\t\t\tthis._InsertEmptyPage.Text = \"插入空白页\";\r\n\t\t\t// \r\n\t\t\t// _BoldStyleButton\r\n\t\t\t// \r\n\t\t\tthis._BoldStyleButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._BoldStyleButton.Image = global::PDFPatcher.Properties.Resources.Bold;\r\n\t\t\tthis._BoldStyleButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._BoldStyleButton.Name = \"_BoldStyleButton\";\r\n\t\t\tthis._BoldStyleButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._BoldStyleButton.Text = \"切换书签文本的粗体样式\";\r\n\t\t\t// \r\n\t\t\t// _ItalicStyleButton\r\n\t\t\t// \r\n\t\t\tthis._ItalicStyleButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._ItalicStyleButton.Image = global::PDFPatcher.Properties.Resources.Italic;\r\n\t\t\tthis._ItalicStyleButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._ItalicStyleButton.Name = \"_ItalicStyleButton\";\r\n\t\t\tthis._ItalicStyleButton.Size = new System.Drawing.Size(23, 22);\r\n\t\t\tthis._ItalicStyleButton.Text = \"切换书签文本的斜体样式\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkColorButton\r\n\t\t\t// \r\n\t\t\tthis._BookmarkColorButton.ButtonDisplayStyle = ColorPicker.ToolStripColorPickerDisplayType.UnderLineAndImage;\r\n\t\t\tthis._BookmarkColorButton.Color = System.Drawing.Color.Black;\r\n\t\t\tthis._BookmarkColorButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._BookmarkColorButton.Image = ((System.Drawing.Image)(resources.GetObject(\"_BookmarkColorButton.Image\")));\r\n\t\t\tthis._BookmarkColorButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._BookmarkColorButton.Name = \"_BookmarkColorButton\";\r\n\t\t\tthis._BookmarkColorButton.Size = new System.Drawing.Size(32, 22);\r\n\t\t\tthis._BookmarkColorButton.Text = \"颜色\";\r\n\t\t\tthis._BookmarkColorButton.ToolTipText = \"设置书签文本的颜色\";\r\n\t\t\t// \r\n\t\t\t// _BookmarkTextMenu\r\n\t\t\t// \r\n\t\t\tthis._BookmarkTextMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\tthis._BookmarkTextMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _ClearBookmarkTitle,\r\n            _SetBookmarkTitle});\r\n\t\t\tthis._BookmarkTextMenu.Image = global::PDFPatcher.Properties.Resources.Mark;\r\n\t\t\tthis._BookmarkTextMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._BookmarkTextMenu.Name = \"_BookmarkTextMenu\";\r\n\t\t\tthis._BookmarkTextMenu.Size = new System.Drawing.Size(29, 22);\r\n\t\t\tthis._BookmarkTextMenu.Text = \"设置选中项目的书签文本\";\r\n\t\t\tthis._BookmarkTextMenu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _ItemList\r\n\t\t\t// \r\n\t\t\tthis._ItemList.AllColumns.Add(this._NameColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._BookmarkColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._PageRangeColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FolderColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FileTimeColumn);\r\n\t\t\tthis._ItemList.AllowDrop = true;\r\n\t\t\tthis._ItemList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ItemList.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._ItemList.CellEditUseWholeCell = false;\r\n\t\t\tthis._ItemList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._BookmarkColumn,\r\n            this._PageRangeColumn,\r\n            this._FolderColumn,\r\n            this._FileTimeColumn});\r\n\t\t\tthis._ItemList.ContextMenuStrip = this._ItemListMenu;\r\n\t\t\tthis._ItemList.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._ItemList.GridLines = true;\r\n\t\t\tthis._ItemList.HideSelection = false;\r\n\t\t\tthis._ItemList.IsSimpleDragSource = true;\r\n\t\t\tthis._ItemList.IsSimpleDropSink = true;\r\n\t\t\tthis._ItemList.Location = new System.Drawing.Point(13, 28);\r\n\t\t\tthis._ItemList.Name = \"_ItemList\";\r\n\t\t\tthis._ItemList.ShowGroups = false;\r\n\t\t\tthis._ItemList.Size = new System.Drawing.Size(550, 197);\r\n\t\t\tthis._ItemList.SmallImageList = this._FileTypeList;\r\n\t\t\tthis._ItemList.TabIndex = 0;\r\n\t\t\tthis._ItemList.UseCellFormatEvents = true;\r\n\t\t\tthis._ItemList.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ItemList.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._ItemList.VirtualMode = true;\r\n\t\t\tthis._ItemList.FormatRow += new System.EventHandler<BrightIdeasSoftware.FormatRowEventArgs>(this._ItemList_FormatRow);\r\n\t\t\tthis._ItemList.ItemActivate += new System.EventHandler(this._ItemList_ItemActivate);\r\n\t\t\t// \r\n\t\t\t// _NameColumn\r\n\t\t\t// \r\n\t\t\tthis._NameColumn.IsEditable = false;\r\n\t\t\tthis._NameColumn.Text = \"源文件名\";\r\n\t\t\tthis._NameColumn.Width = 145;\r\n\t\t\t// \r\n\t\t\t// _BookmarkColumn\r\n\t\t\t// \r\n\t\t\tthis._BookmarkColumn.Text = \"书签文本\";\r\n\t\t\tthis._BookmarkColumn.Width = 119;\r\n\t\t\t// \r\n\t\t\t// _PageRangeColumn\r\n\t\t\t// \r\n\t\t\tthis._PageRangeColumn.AutoCompleteEditorMode = System.Windows.Forms.AutoCompleteMode.Suggest;\r\n\t\t\tthis._PageRangeColumn.Text = \"页码范围\";\r\n\t\t\tthis._PageRangeColumn.Width = 63;\r\n\t\t\t// \r\n\t\t\t// _FolderColumn\r\n\t\t\t// \r\n\t\t\tthis._FolderColumn.IsEditable = true;\r\n\t\t\tthis._FolderColumn.Text = \"文件夹\";\r\n\t\t\tthis._FolderColumn.Width = 104;\r\n\t\t\t// \r\n\t\t\t// _FileTimeColumn\r\n\t\t\t// \r\n\t\t\tthis._FileTimeColumn.IsEditable = false;\r\n\t\t\tthis._FileTimeColumn.Text = \"修改时间\";\r\n\t\t\tthis._FileTimeColumn.Width = 98;\r\n\t\t\t// \r\n\t\t\t// _ItemListMenu\r\n\t\t\t// \r\n\t\t\tthis._ItemListMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _CopyBookmarkText,\r\n            _PasteBookmarkText,\r\n            _CopyFileName,\r\n            _Copy,\r\n            this.toolStripSeparator3,\r\n            _SetCroppingOptions,\r\n            _SetPdfOptions,\r\n            _RefreshFolder});\r\n\t\t\tthis._ItemListMenu.Name = \"_ItemListMenu\";\r\n\t\t\tthis._ItemListMenu.Size = new System.Drawing.Size(224, 164);\r\n\t\t\tthis._ItemListMenu.Opening += new System.ComponentModel.CancelEventHandler(this._ItemListMenu_Opening);\r\n\t\t\tthis._ItemListMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator3\r\n\t\t\t// \r\n\t\t\tthis.toolStripSeparator3.Name = \"toolStripSeparator3\";\r\n\t\t\tthis.toolStripSeparator3.Size = new System.Drawing.Size(220, 6);\r\n\t\t\t// \r\n\t\t\t// _FileTypeList\r\n\t\t\t// \r\n\t\t\tthis._FileTypeList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;\r\n\t\t\tthis._FileTypeList.ImageSize = new System.Drawing.Size(16, 16);\r\n\t\t\tthis._FileTypeList.TransparentColor = System.Drawing.Color.Transparent;\r\n\t\t\t// \r\n\t\t\t// _OpenImageBox\r\n\t\t\t// \r\n\t\t\tthis._OpenImageBox.Filter = resources.GetString(\"_OpenImageBox.Filter\");\r\n\t\t\tthis._OpenImageBox.Multiselect = true;\r\n\t\t\tthis._OpenImageBox.Title = \"选择需要导入的图片文件或PDF文件\";\r\n\t\t\t// \r\n\t\t\t// _OpenPdfBox\r\n\t\t\t// \r\n\t\t\tthis._OpenPdfBox.DefaultExt = \"pdf\";\r\n\t\t\tthis._OpenPdfBox.Filter = \"PDF 文件（*.pdf）|*.pdf\";\r\n\t\t\tthis._OpenPdfBox.Multiselect = true;\r\n\t\t\tthis._OpenPdfBox.Title = \"选择需要处理的 PDF 文件\";\r\n\t\t\t// \r\n\t\t\t// _AddDocumentWorker\r\n\t\t\t// \r\n\t\t\tthis._AddDocumentWorker.WorkerReportsProgress = true;\r\n\t\t\tthis._AddDocumentWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this._AddDocumentWorker_DoWork);\r\n\t\t\tthis._AddDocumentWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this._AddDocumentWorker_ProgressChanged);\r\n\t\t\tthis._AddDocumentWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this._AddDocumentWorker_RunWorkerCompleted);\r\n\t\t\t// \r\n\t\t\t// _BookmarkControl\r\n\t\t\t// \r\n\t\t\tthis._BookmarkControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BookmarkControl.LabelText = \"P&DF 信息文件：\";\r\n\t\t\tthis._BookmarkControl.Location = new System.Drawing.Point(13, 235);\r\n\t\t\tthis._BookmarkControl.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._BookmarkControl.Name = \"_BookmarkControl\";\r\n\t\t\tthis._BookmarkControl.Size = new System.Drawing.Size(553, 24);\r\n\t\t\tthis._BookmarkControl.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _TargetPdfFile\r\n\t\t\t// \r\n\t\t\tthis._TargetPdfFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetPdfFile.Location = new System.Drawing.Point(13, 265);\r\n\t\t\tthis._TargetPdfFile.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._TargetPdfFile.Name = \"_TargetPdfFile\";\r\n\t\t\tthis._TargetPdfFile.Size = new System.Drawing.Size(553, 25);\r\n\t\t\tthis._TargetPdfFile.TabIndex = 2;\r\n\t\t\t// \r\n\t\t\t// _ImportButton\r\n\t\t\t// \r\n\t\t\tthis._ImportButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ImportButton.AnimateGlow = true;\r\n\t\t\tthis._ImportButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportButton.CornerRadius = 3;\r\n\t\t\tthis._ImportButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ImportButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ImportButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ImportButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ImportButton.Location = new System.Drawing.Point(440, 297);\r\n\t\t\tthis._ImportButton.Name = \"_ImportButton\";\r\n\t\t\tthis._ImportButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ImportButton.ShowFocusBorder = true;\r\n\t\t\tthis._ImportButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ImportButton.TabIndex = 4;\r\n\t\t\tthis._ImportButton.Text = \"生成合并文件(&S)\";\r\n\t\t\tthis._ImportButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ImportButton.Click += new System.EventHandler(this._ImportButton_Click);\r\n\t\t\t// \r\n\t\t\t// _IndividualMergerModeBox\r\n\t\t\t// \r\n\t\t\tthis._IndividualMergerModeBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis._IndividualMergerModeBox.AutoSize = true;\r\n\t\t\tthis._IndividualMergerModeBox.Location = new System.Drawing.Point(13, 301);\r\n\t\t\tthis._IndividualMergerModeBox.Name = \"_IndividualMergerModeBox\";\r\n\t\t\tthis._IndividualMergerModeBox.Size = new System.Drawing.Size(186, 16);\r\n\t\t\tthis._IndividualMergerModeBox.TabIndex = 3;\r\n\t\t\tthis._IndividualMergerModeBox.Text = \"顶层项目合并为单独的PDF文件\";\r\n\t\t\tthis._IndividualMergerModeBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ConfigButton\r\n\t\t\t// \r\n\t\t\tthis._ConfigButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ConfigButton.Image = global::PDFPatcher.Properties.Resources.PdfOptions;\r\n\t\t\tthis._ConfigButton.Location = new System.Drawing.Point(347, 297);\r\n\t\t\tthis._ConfigButton.Name = \"_ConfigButton\";\r\n\t\t\tthis._ConfigButton.Size = new System.Drawing.Size(86, 23);\r\n\t\t\tthis._ConfigButton.TabIndex = 5;\r\n\t\t\tthis._ConfigButton.Text = \"功能选项\";\r\n\t\t\tthis._ConfigButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ConfigButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ConfigButton.Click += new System.EventHandler(this._MainToolbar_ButtonClick);\r\n\t\t\t// \r\n\t\t\t// MergerControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._ConfigButton);\r\n\t\t\tthis.Controls.Add(this._IndividualMergerModeBox);\r\n\t\t\tthis.Controls.Add(this._MainToolbar);\r\n\t\t\tthis.Controls.Add(this._TargetPdfFile);\r\n\t\t\tthis.Controls.Add(this._ImportButton);\r\n\t\t\tthis.Controls.Add(this._BookmarkControl);\r\n\t\t\tthis.Controls.Add(this._ItemList);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"MergerControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(575, 343);\r\n\t\t\tthis._FileMenu.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).EndInit();\r\n\t\t\tthis._ItemListMenu.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate BrightIdeasSoftware.TreeListView _ItemList;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ImportButton;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenImageBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FolderColumn;\r\n\t\tprivate TargetFileControl _TargetPdfFile;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _FileMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByAlphaItem;\r\n\t\tprivate BookmarkControl _BookmarkControl;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _ItemListMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _AddFilesButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFileMenu;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenPdfBox;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _InsertEmptyPage;\r\n\t\tprivate System.ComponentModel.BackgroundWorker _AddDocumentWorker;\r\n\t\tprivate System.Windows.Forms.ImageList _FileTypeList;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _BookmarkColumn;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _BoldStyleButton;\r\n\t\tprivate System.Windows.Forms.ToolStripButton _ItalicStyleButton;\r\n\t\tprivate ColorPicker.ToolStripColorPicker _BookmarkColorButton;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _AddFolderButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFolderMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripDropDownButton _BookmarkTextMenu;\r\n\t\tprivate System.Windows.Forms.CheckBox _IndividualMergerModeBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageRangeColumn;\r\n\t\tprivate System.Windows.Forms.Button _ConfigButton;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByNaturalNumberItem;\r\n\t\tprivate System.Windows.Forms.ToolStripSeparator toolStripSeparator3;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FileTimeColumn;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByCaj;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByFileTime;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ReverseSort;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/MergerControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Security.Permissions;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class MergerControl : FunctionControl\r\n\t{\r\n\t\tFileListHelper _listHelper;\r\n\t\treadonly SourceItem _itemsContainer = new SourceItem.Empty();\r\n\t\treadonly string[] _bookmarkStyleButtonNames;\r\n\r\n\t\tpublic override string FunctionName => \"合并文档\";\r\n\r\n\t\tpublic override Bitmap IconImage => Properties.Resources.Merger;\r\n\r\n\t\tpublic MergerControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\t_bookmarkStyleButtonNames = [\"_BoldStyleButton\", \"_BookmarkColorButton\", \"_ItalicStyleButton\"];\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_MainToolbar.ScaleIcons(16);\r\n\t\t\t_FileMenu.ScaleIcons(16);\r\n\t\t\t_ItemListMenu.ScaleIcons(16);\r\n\t\t\t_RecentFileMenu.ScaleIcons(16);\r\n\t\t\t_RecentFolderMenu.ScaleIcons(16);\r\n\t\t\t_ItemList.ScaleColumnWidths();\r\n\r\n\t\t\t_BookmarkColorButton.SelectedColorChanged += (s, e) => RefreshBookmarkColor();\r\n\r\n\t\t\tAppContext.MainForm.SetTooltip(_BookmarkControl.FileList, \"为目标 PDF 文件添加书签的信息文件（可选）\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ItemList, \"在此添加需要合并的 PDF 文件、图片文件或包含上述类型文件的文件夹\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ImportButton, \"点击此按钮将列表的文件合并为一个 PDF 文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetPdfFile.FileList, \"生成的目标 PDF 文件路径\");\r\n\t\t\t_ItemList.EmptyListMsg = \"请使用“添加文件”按钮添加需要合并的文件，或从资源管理器拖放文件到本列表框\";\r\n\r\n\t\t\tvar fi = _FileTypeList.Images;\r\n\t\t\tfi.AddRange([\r\n\t\t\t\tProperties.Resources.EmptyPage,\r\n\t\t\t\tProperties.Resources.OriginalPdfFile,\r\n\t\t\t\tProperties.Resources.Image,\r\n\t\t\t\tProperties.Resources.ImageFolder\r\n\t\t\t]);\r\n\r\n\t\t\t_BookmarkControl.FileDialog.CheckFileExists = false;\r\n\t\t\t_BookmarkControl.BrowseForFile += FileControl_BrowseForFile;\r\n\t\t\t_TargetPdfFile.BrowseForFile += FileControl_BrowseForFile;\r\n\t\t\t_IndividualMergerModeBox.CheckedChanged += (s, e) => _BookmarkControl.Enabled = !_IndividualMergerModeBox.Checked;\r\n\t\t\t_listHelper = new FileListHelper(_ItemList);\r\n\t\t\t_ItemList.FixEditControlWidth();\r\n\t\t\t_ItemList.BeforeSorting += (s, e) => e.Canceled = true;\r\n\t\t\t_ItemList.CanExpandGetter = (x) => ((SourceItem)x).HasSubItems;\r\n\t\t\t_ItemList.ChildrenGetter = (x) => ((SourceItem)x).Items;\r\n\t\t\t_ItemList.SelectedIndexChanged += (s, e) => {\r\n\t\t\t\tvar i = _ItemList.GetFirstSelectedIndex();\r\n\t\t\t\tvar en = false;\r\n\t\t\t\tif (i != -1) {\r\n\t\t\t\t\tvar b = (_ItemList.GetModelObject(i) as SourceItem).Bookmark;\r\n\t\t\t\t\tif (b != null && String.IsNullOrEmpty(b.Title) == false) {\r\n\t\t\t\t\t\ten = true;\r\n\t\t\t\t\t\t_BoldStyleButton.Checked = b.IsBold;\r\n\t\t\t\t\t\t_ItalicStyleButton.Checked = b.IsItalic;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t_MainToolbar.ToggleEnabled(en, _bookmarkStyleButtonNames);\r\n\t\t\t};\r\n\t\t\t_ItemList.CellEditStarting += (s, e) => {\r\n\t\t\t\t_MainToolbar.Enabled = false;\r\n\t\t\t\tif (e.Column == _BookmarkColumn) {\r\n\t\t\t\t\te.Control = new AutoResizingTextBox(e.CellBounds, ((SourceItem)e.RowObject).Bookmark?.Title, (Control)s);\r\n\t\t\t\t}\r\n\t\t\t\telse if (e.Column == _FolderColumn) {\r\n\t\t\t\t\tif (e.RowObject is SourceItem i && i.FolderName != null) {\r\n\t\t\t\t\t\te.Control = new AutoResizingTextBox(e.CellBounds, i.FolderName, (Control)s) { ReadOnly = true };\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\te.Cancel = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ItemList.CellEditFinishing += (s, e) => _MainToolbar.Enabled = true;\r\n\t\t\t_ItemList.CanDrop += ItemList_CanDropFile;\r\n\t\t\t_ItemList.Dropped += ItemList_FileDropped;\r\n\t\t\t_ItemList.ModelCanDrop += ItemList_CanDropModel;\r\n\t\t\t_ItemList.ModelDropped += ItemList_Dropped;\r\n\t\t\t_ItemListMenu.Opening += (s, e) => {\r\n\t\t\t\tforeach (ToolStripItem item in _ItemListMenu.Items) {\r\n\t\t\t\t\tSetupCommand(item);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ItemList.AsTyped<SourceItem>()\r\n\t\t\t\t.ConfigColumn(_NameColumn, c => {\r\n\t\t\t\t\tc.AspectGetter = o => o.FileName ?? \"<空白页>\";\r\n\t\t\t\t\tc.ImageGetter = o => (int)o.Type;\r\n\t\t\t\t})\r\n\t\t\t\t.ConfigColumn(_BookmarkColumn, c => {\r\n\t\t\t\t\tc.AspectGetter = (o) => o.Bookmark?.Title;\r\n\t\t\t\t\tc.AspectPutter = (o, v) => {\r\n\t\t\t\t\t\tvar s = v as string;\r\n\t\t\t\t\t\tif (String.IsNullOrEmpty(s)) {\r\n\t\t\t\t\t\t\to.Bookmark = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (o.Bookmark == null) {\r\n\t\t\t\t\t\t\to.Bookmark = new BookmarkSettings(s);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\to.Bookmark.Title = s;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t})\r\n\t\t\t\t.ConfigColumn(_PageRangeColumn, c => {\r\n\t\t\t\t\tc.AspectGetter = (o) => (o as SourceItem.Pdf)?.PageRanges;\r\n\t\t\t\t\tc.AspectPutter = (o, v) => {\r\n\t\t\t\t\t\tif (o is SourceItem.Pdf p) {\r\n\t\t\t\t\t\t\tp.PageRanges = v as string;\r\n\t\t\t\t\t\t\tif (String.IsNullOrEmpty(p.PageRanges)) {\r\n\t\t\t\t\t\t\t\tp.PageRanges = \"1-\" + p.PageCount.ToText();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t})\r\n\t\t\t\t.ConfigColumn(_FolderColumn, c => c.AspectGetter = (o) => o.FolderName);\r\n\t\t\tFileListHelper.SetupCommonPdfColumns(_FileTimeColumn);\r\n\t\t\t_AddFilesButton.DropDownOpening += FileListHelper.OpenPdfButtonDropDownOpeningHandler;\r\n\t\t\t_AddFilesButton.DropDownItemClicked += (s, e) => {\r\n\t\t\t\t_RecentFileMenu.Hide();\r\n\t\t\t\tFilePath file = e.ClickedItem.ToolTipText;\r\n\t\t\t\tif (file.ExistsFile) {\r\n\t\t\t\t\tExecuteCommand(Commands.OpenFile, file);\r\n\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, file);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"找不到文件：\" + file);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r\n\t\tprotected override bool ProcessCmdKey(ref Message msg, Keys keyData) {\r\n\t\t\tif (_ItemList.IsCellEditing || _ItemList.Focused == false) {\r\n\t\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t\t}\r\n\t\t\tswitch (keyData) {\r\n\t\t\t\tcase Keys.Delete:\r\n\t\t\t\t\tExecuteCommand(Commands.Delete);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Control | Keys.B:\r\n\t\t\t\t\t_BoldStyleButton.PerformClick();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase Keys.Control | Keys.I:\r\n\t\t\t\t\t_ItalicStyleButton.PerformClick();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn base.ProcessCmdKey(ref msg, keyData);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region 拖放操作\r\n\t\tvoid ItemList_CanDropFile(object sender, OlvDropEventArgs e) {\r\n\t\t\tif (e.DataObject is not DataObject o) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar f = o.GetFileDropList();\r\n\t\t\tvar d = e.DropTargetItem;\r\n\t\t\tvar child = d != null && e.MouseLocation.X > d.Position.X + d.GetBounds(ItemBoundsPortion.ItemOnly).Width / 2;\r\n\t\t\tvar after = d == null || e.MouseLocation.Y > d.Position.Y + d.Bounds.Height / 2;\r\n\t\t\tforeach (var item in f) {\r\n\t\t\t\tif (System.IO.Directory.Exists(item)) {\r\n\t\t\t\t\te.Handled = true;\r\n\t\t\t\t\te.Effect = DragDropEffects.Copy;\r\n\t\t\t\t\te.InfoMessage = $\"添加目录{item}到{(child ? \"所有子项\" : String.Empty)}{(after ? \"后面\" : \"前面\")}\";\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar ext = System.IO.Path.GetExtension(item).ToLowerInvariant();\r\n\t\t\t\tif (ext == Constants.FileExtensions.Pdf || Constants.FileExtensions.AllSupportedImageExtension.Contains(ext)) {\r\n\t\t\t\t\te.Handled = true;\r\n\t\t\t\t\te.Effect = DragDropEffects.Copy;\r\n\t\t\t\t\te.InfoMessage = $\"添加文件{item}到{(child ? \"所有子项\" : String.Empty)}{(after ? \"后面\" : \"前面\")}\";\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ItemList_FileDropped(object sender, OlvDropEventArgs e) {\r\n\t\t\tif (e.DataObject is not DataObject o) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar f = o.GetFileDropList();\r\n\t\t\tvar fl = new string[f.Count];\r\n\t\t\tf.CopyTo(fl, 0);\r\n\t\t\tSourceItem.SortFileList(fl);\r\n\t\t\tvar sl = new List<SourceItem>(fl.Length);\r\n\t\t\tforeach (var item in fl) {\r\n\t\t\t\tvar si = SourceItem.Create(item);\r\n\t\t\t\tif (si == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tsl.Add(si);\r\n\t\t\t}\r\n\t\t\tvar ti = e.ListView.GetModelObject(e.DropTargetIndex) as SourceItem;\r\n\t\t\tvar d = e.DropTargetItem;\r\n\t\t\tvar child = d != null && e.MouseLocation.X > d.Position.X + d.GetBounds(ItemBoundsPortion.ItemOnly).Width / 2;\r\n\t\t\tvar after = d != null && e.MouseLocation.Y > d.Position.Y + d.Bounds.Height / 2;\r\n\t\t\tCopyOrMoveElement(sl, ti, child, after, false);\r\n\t\t}\r\n\r\n\t\tvoid ItemList_CanDropModel(object sender, ModelDropEventArgs e) {\r\n\t\t\tvar si = e.SourceModels;\r\n\t\t\tvar ti = e.TargetModel as SourceItem;\r\n\t\t\tif (si == null || si.Count == 0 || e.TargetModel == null) {\r\n\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar copy = (ModifierKeys & Keys.Control) != Keys.None;\r\n\t\t\tif (copy == false) {\r\n\t\t\t\tif (e.DropTargetItem.Selected) {\r\n\t\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar al = _ItemList.GetAncestorsOrSelf(ti);\r\n\t\t\t\tforeach (SourceItem item in si) {\r\n\t\t\t\t\tif (al.IndexOf(item) != -1) {\r\n\t\t\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\t\t\te.InfoMessage = \"目标项不能是源项目的子项。\";\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar d = e.DropTargetItem;\r\n\t\t\tvar ml = e.MouseLocation;\r\n\t\t\tvar child = ml.X > d.Position.X + d.GetBounds(ItemBoundsPortion.ItemOnly).Width / 2;\r\n\t\t\tvar append = ml.Y > d.Position.Y + d.Bounds.Height / 2;\r\n\t\t\tif (child == false && copy == false) {\r\n\t\t\t\tvar xi = e.DropTargetIndex + (append ? 1 : -1);\r\n\t\t\t\tif (xi > -1 && xi < e.ListView.GetItemCount()\r\n\t\t\t\t\t&& e.ListView.Items[xi].Selected\r\n\t\t\t\t\t&& GetParentSourceItem(ti) == GetParentSourceItem(_ItemList.GetModelObject(xi) as SourceItem)) {\r\n\t\t\t\t\te.Effect = DragDropEffects.None;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\te.Effect = copy ? DragDropEffects.Copy : DragDropEffects.Move;\r\n\t\t\te.InfoMessage = $\"{(copy ? \"复制\" : \"移动\")}到{(child ? \"所有子项\" : String.Empty)}{(append ? \"后面\" : \"前面\")}\";\r\n\t\t}\r\n\r\n\t\tvoid ItemList_Dropped(object sender, ModelDropEventArgs e) {\r\n\t\t\tvar t = e.TargetModel as SourceItem;\r\n\t\t\tvar si = (e.SourceListView as TreeListView).GetSelectedModels<SourceItem>();\r\n\t\t\tif (si == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar ti = e.TargetModel as SourceItem;\r\n\t\t\tvar d = e.DropTargetItem;\r\n\t\t\tvar child = e.MouseLocation.X > d.Position.X + d.GetBounds(ItemBoundsPortion.ItemOnly).Width / 2;\r\n\t\t\tvar after = e.MouseLocation.Y > d.Position.Y + d.Bounds.Height / 2;\r\n\t\t\tvar copy = (ModifierKeys & Keys.Control) != Keys.None;\r\n\t\t\tvar deepCopy = copy && ((ModifierKeys & Keys.Shift) != Keys.None);\r\n\t\t\tvar tii = _ItemList.TopItemIndex;\r\n\t\t\tCopyOrMoveElement(si, ti, child, after, copy);\r\n\t\t\te.RefreshObjects();\r\n\t\t\t_ItemList.TopItemIndex = tii;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tvar n = item.Name;\r\n\t\t\tif (item.OwnerItem != null && item.OwnerItem.Name == Commands.Selection) {\r\n\t\t\t\tEnableCommand(item, _ItemList.GetItemCount() > 0 && _ItemList.Focused, true);\r\n\t\t\t}\r\n\t\t\telse if (n.HasPrefix(Commands.Copy) || n.HasPrefix(Commands.Paste) || n == Commands.Delete) {\r\n\t\t\t\tEnableCommand(item, _ItemList.GetItemCount() > 0 && _ItemList.GetFirstSelectedIndex() > -1, true);\r\n\t\t\t}\r\n\t\t\telse if (n == Commands.Options) {\r\n\t\t\t\titem.Text = \"合并文档设置(&S)...\";\r\n\t\t\t\titem.ToolTipText = \"设置合并后的 PDF 文档\";\r\n\t\t\t\tEnableCommand(item, true, true);\r\n\t\t\t\titem.Tag = nameof(Function.MergerOptions);\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tvoid FileControl_BrowseForFile(object sender, EventArgs e) {\r\n\t\t\t_listHelper.PrepareSourceFiles();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 复制或移动书签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"source\">需要复制或移动的源书签。</param>\r\n\t\t/// <param name=\"target\">目标书签。</param>\r\n\t\t/// <param name=\"child\">是否复制为子节点。</param>\r\n\t\t/// <param name=\"after\">是否复制到后面。</param>\r\n\t\t/// <param name=\"copy\">是否复制书签。</param>\r\n\t\tinternal void CopyOrMoveElement(List<SourceItem> source, SourceItem target, bool child, bool after, bool copy) {\r\n\t\t\tif (copy) {\r\n\t\t\t\tvar clones = new List<SourceItem>(source.Count);\r\n\t\t\t\tforeach (SourceItem item in source) {\r\n\t\t\t\t\tclones.Add(item.Clone());\r\n\t\t\t\t}\r\n\t\t\t\tsource = clones;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tforeach (var item in source) {\r\n\t\t\t\t\tGetParentSourceItem(item).Items.Remove(item);\r\n\t\t\t\t}\r\n\t\t\t\t_ItemList.RemoveObjects(source);\r\n\t\t\t}\r\n\t\t\tif (child && target != null) {\r\n\t\t\t\tif (after) {\r\n\t\t\t\t\ttarget.Items.AddRange(source);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar a = target.Items.ToArray();\r\n\t\t\t\t\ttarget.Items.Clear();\r\n\t\t\t\t\ttarget.Items.AddRange(source);\r\n\t\t\t\t\ttarget.Items.AddRange(a);\r\n\t\t\t\t}\r\n\t\t\t\tif (target == _itemsContainer) {\r\n\t\t\t\t\t_ItemList.SetObjects(target.Items);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_ItemList.Expand(target);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar p = GetParentSourceItem(target);\r\n\t\t\t\tif (after) {\r\n\t\t\t\t\tp.Items.InsertRange(target != null ? p.Items.IndexOf(target) + 1 : p.Items.Count, source);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tp.Items.InsertRange(target != null ? p.Items.IndexOf(target) : p.Items.Count, source);\r\n\t\t\t\t}\r\n\t\t\t\tif (p == _itemsContainer) {\r\n\t\t\t\t\t_ItemList.SetObjects(_itemsContainer.Items);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_ItemList.SelectedObjects = source;\r\n\t\t}\r\n\r\n\t\tSourceItem GetParentSourceItem(SourceItem item) {\r\n\t\t\tvar p = _ItemList.GetParentModel(item);\r\n\t\t\tp ??= _itemsContainer;\r\n\t\t\treturn p;\r\n\t\t}\r\n\r\n\t\tvoid AddFiles(string[] files) {\r\n\t\t\tif (files == null || files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ((ModifierKeys & Keys.Control) != Keys.None) {\r\n\t\t\t\t_ItemList.ClearObjects();\r\n\t\t\t}\r\n\t\t\tif (files.Length > 3) {\r\n\t\t\t\tAppContext.MainForm.Enabled = false;\r\n\t\t\t}\r\n\t\t\tSourceItem.SortFileList(files);\r\n\t\t\t_AddDocumentWorker.RunWorkerAsync(files);\r\n\t\t}\r\n\r\n\t\tvoid _AddFolder_DropDownOpening(object sender, EventArgs e) {\r\n\t\t\tvar l = _AddFolderButton.DropDown.Items;\r\n\t\t\tl.ClearDropDownItems();\r\n\t\t\tforeach (var item in AppContext.Recent.Folders) {\r\n\t\t\t\tif (FileHelper.IsPathValid(item) && String.IsNullOrEmpty(System.IO.Path.GetFileName(item)) == false) {\r\n\t\t\t\t\tl.Add(FileHelper.GetEllipticPath(item, 50)).ToolTipText = item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _AddFolderButton_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\t_RecentFolderMenu.Hide();\r\n\t\t\tvar f = e.ClickedItem.ToolTipText;\r\n\t\t\tif (System.IO.Directory.Exists(f) == false) {\r\n\t\t\t\tFormHelper.ErrorBox(\"找不到文件夹：\" + f);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tExecuteCommand(Commands.OpenFile, f);\r\n\t\t}\r\n\r\n\t\tvoid _ImportButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar infoFile = _BookmarkControl.Text.Trim();\r\n\t\t\tvar targetPdfFile = _TargetPdfFile.Text.Trim();\r\n\t\t\tif (String.IsNullOrEmpty(targetPdfFile) && String.IsNullOrEmpty(targetPdfFile = _TargetPdfFile.BrowseTargetFile())) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.IsPathValid(targetPdfFile) == false) {\r\n\t\t\t\tFormHelper.ErrorBox($\"输出文件名无效。{(FileHelper.HasFileNameMacro(targetPdfFile) ? \"\\n合并 PDF 文件功能不支持替代符。\" : String.Empty)}\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tif (l == 0) {\r\n\t\t\t\tFormHelper.InfoBox(\"请添加用于生成 PDF 文件的图片或 PDF 源文件。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_BookmarkControl.FileList.AddHistoryItem();\r\n\t\t\t_TargetPdfFile.FileList.AddHistoryItem();\r\n\t\t\tvar fm = _IndividualMergerModeBox.Checked;\r\n\t\t\tvar fl = fm ? new List<SourceItem>(_itemsContainer.Items.Count) : _itemsContainer.Items;\r\n\r\n\t\t\tif (fm) {\r\n\t\t\t\tforeach (var item in _itemsContainer.Items) {\r\n\t\t\t\t\tif (item.HasContent) {\r\n\t\t\t\t\t\tfl.Add(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (fl.Count == 0) {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"合并文件列表没有包含文件的首层项目。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar args = arg.Argument as object[];\r\n\t\t\t\tvar items = args[0] as ICollection<SourceItem>;\r\n\t\t\t\tvar target = args[1] as string;\r\n\t\t\t\tif ((bool)args[3]) {\r\n\t\t\t\t\tTracker.SetTotalProgressGoal(items.Count);\r\n\t\t\t\t\tforeach (var item in items) {\r\n\t\t\t\t\t\tvar tn = FileHelper.CombinePath(System.IO.Path.GetDirectoryName(target), item.FileName + Constants.FileExtensions.Pdf);\r\n\t\t\t\t\t\tswitch (item.Type) {\r\n\t\t\t\t\t\t\tcase SourceItem.ItemType.Empty:\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"首层项目不能为空白页。\");\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase SourceItem.ItemType.Pdf:\r\n\t\t\t\t\t\t\tcase SourceItem.ItemType.Image:\r\n\t\t\t\t\t\t\t\tProcessor.Worker.MergeDocuments([item], tn, null);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase SourceItem.ItemType.Folder:\r\n\t\t\t\t\t\t\t\tProcessor.Worker.MergeDocuments(item.Items, tn, null);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tProcessor.Worker.MergeDocuments(items, args[1] as string, args[2] as string);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerAsync(new object[] { fl, targetPdfFile, infoFile, fm });\r\n\t\t}\r\n\r\n\t\tvoid _SortMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tSourceItem.SortType sortOptions;\r\n\t\t\tbool recursive = ModifierKeys != Keys.Control;\r\n\t\t\tswitch (e.ClickedItem.Name) {\r\n\t\t\t\tcase \"_SortByAlphaItem\":\r\n\t\t\t\t\tsortOptions = SourceItem.SortType.Literal;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SortByNaturalNumberItem\":\r\n\t\t\t\t\tsortOptions = SourceItem.SortType.NumericAwareSort;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SortByCaj\":\r\n\t\t\t\t\tsortOptions = SourceItem.SortType.CajSort;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SortByFileTime\":\r\n\t\t\t\t\tsortOptions = SourceItem.SortType.FileTime;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_ReverseSort\":\r\n\t\t\t\t\tsortOptions = SourceItem.SortType.Reverse;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_itemsContainer.SortItems(sortOptions, recursive);\r\n\t\t\t_ItemList.Objects = _itemsContainer.Items;\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ButtonClick(object sender, EventArgs e) {\r\n\t\t\tif (sender == _AddFilesButton) {\r\n\t\t\t\tExecuteCommand(Commands.Open);\r\n\t\t\t}\r\n\t\t\telse if (sender == _ConfigButton) {\r\n\t\t\t\tAppContext.MainForm.SelectFunctionList(Function.MergerOptions);\r\n\t\t\t}\r\n\t\t\telse if (sender == _AddFolderButton) {\r\n\t\t\t\tusing (var f = new OpenFileDialog() {\r\n\t\t\t\t\tFileName = \"【选择目录】\",\r\n\t\t\t\t\tFilter = _OpenImageBox.Filter,\r\n\t\t\t\t\tCheckFileExists = false,\r\n\t\t\t\t\tTitle = \"选择包含图片或 PDF 的文件夹，点击“打开”按钮\"\r\n\t\t\t\t}) {\r\n\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\tvar p = System.IO.Path.GetDirectoryName(f.FileName);\r\n\t\t\t\t\t\tif (String.IsNullOrEmpty(System.IO.Path.GetFileName(p))) {\r\n\t\t\t\t\t\t\tFormHelper.ErrorBox(\"选择的文件夹无效，不允许选择根目录。\");\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tExecuteCommand(Commands.OpenFile, p);\r\n\t\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.Folders, p);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tExecuteCommand(e.ClickedItem);\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\tif (_OpenImageBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\tExecuteCommand(Commands.OpenFile, _OpenImageBox.FileNames);\r\n\t\t\t\t\t\tforeach (FilePath item in _OpenImageBox.FileNames) {\r\n\t\t\t\t\t\t\tif (item.HasExtension(Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, item);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.OpenFile:\r\n\t\t\t\t\tAddFiles(parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.LoadList:\r\n\t\t\t\t\tusing (var f = new OpenFileDialog() {\r\n\t\t\t\t\t\tTitle = \"请选择需要打开的文件列表\",\r\n\t\t\t\t\t\tFilter = Constants.FileExtensions.XmlFilter,\r\n\t\t\t\t\t\tDefaultExt = Constants.FileExtensions.Xml\r\n\t\t\t\t\t}) {\r\n\t\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\t\t_ItemList.DeselectAll();\r\n\t\t\t\t\t\t\t_ItemList.ClearObjects();\r\n\t\t\t\t\t\t\t_itemsContainer.Items.Clear();\r\n\t\t\t\t\t\t\t_itemsContainer.Items.AddRange(Processor.SourceItemSerializer.Deserialize(f.FileName));\r\n\t\t\t\t\t\t\t_ItemList.Objects = _itemsContainer.Items;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SaveList:\r\n\t\t\t\t\tusing (var f = new SaveFileDialog() {\r\n\t\t\t\t\t\tTitle = \"请输入需要保存文件列表的文件名\",\r\n\t\t\t\t\t\tFilter = Constants.FileExtensions.XmlFilter,\r\n\t\t\t\t\t\tDefaultExt = Constants.FileExtensions.Xml\r\n\t\t\t\t\t}) {\r\n\t\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\t\tProcessor.SourceItemSerializer.Serialize(_itemsContainer.Items, f.FileName);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.Delete:\r\n\t\t\t\t\tif (_ItemList.GetItemCount() == 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar l = _ItemList.SelectedObjects;\r\n\t\t\t\t\tif (l.Count == 0) {\r\n\t\t\t\t\t\tif (FormHelper.YesNoBox(\"是否清空文件列表？\") == DialogResult.Yes) {\r\n\t\t\t\t\t\t\t_ItemList.ClearObjects();\r\n\t\t\t\t\t\t\t_itemsContainer.Items.Clear();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\t\t\t\tGetParentSourceItem(item).Items.Remove(item);\r\n\t\t\t\t\t\t\t_ItemList.RemoveObject(item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.Copy:\r\n\t\t\t\t\tvar sb = StringBuilderCache.Acquire(200);\r\n\t\t\t\t\tvar sl = GetSourceItems<SourceItem>(true);\r\n\t\t\t\t\tif (sl.HasContent() == false) {\r\n\t\t\t\t\t\tsl = GetSourceItems<SourceItem>(false);\r\n\t\t\t\t\t\tif (sl.HasContent() == false) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var item in sl) {\r\n\t\t\t\t\t\tif (item.Type == SourceItem.ItemType.Empty) {\r\n\t\t\t\t\t\t\tif (String.IsNullOrEmpty(item.Bookmark?.Title) == false) {\r\n\t\t\t\t\t\t\t\tsb.Append('\\t').Append(item.Bookmark.Title).Append('\\t').Append('-').AppendLine();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (item.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\t\tvar pi = item as SourceItem.Pdf;\r\n\t\t\t\t\t\t\tsb.AppendLine(String.Join(\"\\t\", [\r\n\t\t\t\t\t\t\t\tpi.FilePath.ToString(),\r\n\t\t\t\t\t\t\t\titem.Bookmark != null ? item.Bookmark.Title : String.Empty,\r\n\t\t\t\t\t\t\t\tpi.PageRanges,\r\n\t\t\t\t\t\t\t\tpi.PageCount.ToText ()\r\n\t\t\t\t\t\t\t]));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (item.Type == SourceItem.ItemType.Image) {\r\n\t\t\t\t\t\t\tvar im = item as SourceItem.Image;\r\n\t\t\t\t\t\t\tsb.AppendLine(String.Join(\"\\t\", [\r\n\t\t\t\t\t\t\t\tim.FilePath.ToString(),\r\n\t\t\t\t\t\t\t\titem.Bookmark != null ? item.Bookmark.Title : String.Empty,\r\n\t\t\t\t\t\t\t\t\"-\"/*im.PageRanges*/,\r\n\t\t\t\t\t\t\t\tim.PageCount.ToText () ]));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (item.Type == SourceItem.ItemType.Folder) {\r\n\t\t\t\t\t\t\tsb.AppendLine(item.FilePath.ToString());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (sb.Length > 0) {\r\n\t\t\t\t\t\tClipboard.SetText(sb.ToString());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tStringBuilderCache.Release(sb);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_InsertEmptyPage\":\r\n\t\t\t\t\tAddItem(new SourceItem.Empty());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllItems:\r\n\t\t\t\t\t_ItemList.SelectAll();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectNone:\r\n\t\t\t\t\t_ItemList.SelectObjects(null);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.InvertSelection:\r\n\t\t\t\t\t_ItemList.InvertSelect();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllImages:\r\n\t\t\t\t\tSelectItemsByType(SourceItem.ItemType.Image);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllPdf:\r\n\t\t\t\t\tSelectItemsByType(SourceItem.ItemType.Pdf);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.SelectAllFolders:\r\n\t\t\t\t\tSelectItemsByType(SourceItem.ItemType.Folder);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_EditItemProperty\":\r\n\t\t\t\tcase \"_SetPdfOptions\":\r\n\t\t\t\t\t_ItemList_ItemActivate(null, null);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SetCroppingOptions\":\r\n\t\t\t\t\tSetImageCropping();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_RefreshFolder\":\r\n\t\t\t\t\tforeach (SourceItem.Folder item in _ItemList.SelectedObjects) {\r\n\t\t\t\t\t\titem?.Reload();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_ItemList.RefreshObjects(_ItemList.SelectedObjects);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_PdfOptions\":\r\n\t\t\t\t\tAppContext.MainForm.SelectFunctionList(Function.PatcherOptions);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_BoldStyleButton\":\r\n\t\t\t\t\tvar cb = !_BoldStyleButton.Checked;\r\n\t\t\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\t\t\tif (item?.Bookmark != null) {\r\n\t\t\t\t\t\t\titem.Bookmark.IsBold = cb;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgoto case \"__Refresh\";\r\n\t\t\t\tcase \"_ItalicStyleButton\":\r\n\t\t\t\t\tvar ci = !_ItalicStyleButton.Checked;\r\n\t\t\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\t\t\tif (item?.Bookmark != null) {\r\n\t\t\t\t\t\t\titem.Bookmark.IsItalic = ci;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgoto case \"__Refresh\";\r\n\t\t\t\tcase \"_BookmarkColorButton\":\r\n\t\t\t\t\tRefreshBookmarkColor();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_CopyFileName\":\r\n\t\t\t\t\tCopySelectedItems(item => item.FilePath.FileNameWithoutExtension);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_CopyBookmarkText\":\r\n\t\t\t\t\tCopySelectedItems(item => item != null && item.Bookmark != null ? item.Bookmark.Title : String.Empty);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_PasteBookmarkText\":\r\n\t\t\t\t\tvar ct = Clipboard.GetText(TextDataFormat.UnicodeText);\r\n\t\t\t\t\tif (String.IsNullOrEmpty(ct) || _ItemList.GetItemCount() == 0) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar li = _ItemList.GetLastItemInDisplayOrder().Index;\r\n\t\t\t\t\tusing (var sr = new System.IO.StringReader(ct)) {\r\n\t\t\t\t\t\tvar i = _ItemList.GetFirstSelectedIndex();\r\n\t\t\t\t\t\tif (i == -1) {\r\n\t\t\t\t\t\t\ti = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twhile (i <= li && sr.Peek() != -1) {\r\n\t\t\t\t\t\t\tif (_ItemList.GetModelObject(i) is SourceItem b) {\r\n\t\t\t\t\t\t\t\tif (b.Bookmark == null) {\r\n\t\t\t\t\t\t\t\t\tb.Bookmark = new BookmarkSettings(sr.ReadLine());\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\tb.Bookmark.Title = sr.ReadLine();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tvar di = _ItemList.GetDisplayOrderOfItemIndex(i);\r\n\t\t\t\t\t\t\t++di;\r\n\t\t\t\t\t\t\tvar ni = _ItemList.GetNthItemInDisplayOrder(di);\r\n\t\t\t\t\t\t\tif (ni == null) {\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ti = ni.Index;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_ClearBookmarkTitle\":\r\n\t\t\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\t\t\tif (item?.Bookmark != null) {\r\n\t\t\t\t\t\t\titem.Bookmark = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgoto case \"__Refresh\";\r\n\t\t\t\tcase \"_SetBookmarkTitle\":\r\n\t\t\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\t\t\tif (item != null) {\r\n\t\t\t\t\t\t\tBookmarkSettings b;\r\n\t\t\t\t\t\t\tvar t = System.IO.Path.GetFileNameWithoutExtension(item.FileName);\r\n\t\t\t\t\t\t\tif ((b = item.Bookmark) == null) {\r\n\t\t\t\t\t\t\t\tb = item.Bookmark = new BookmarkSettings(t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\titem.Bookmark.Title = t;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgoto case \"__Refresh\";\r\n\t\t\t\tcase \"__Refresh\":\r\n\t\t\t\t\t_ItemList.RefreshObjects(_ItemList.SelectedObjects);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid CopySelectedItems(Converter<SourceItem, string> converter) {\r\n\t\t\tvar bt = StringBuilderCache.Acquire(200);\r\n\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\tbt.AppendLine(converter(item));\r\n\t\t\t}\r\n\t\t\tif (bt.Length > 0) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tClipboard.SetDataObject(bt.ToString(), true, 10, 50);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (System.Runtime.InteropServices.ExternalException) {\r\n\t\t\t\t\t// ignore\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tStringBuilderCache.Release(bt);\r\n\t\t}\r\n\r\n\t\tvoid RefreshBookmarkColor() {\r\n\t\t\tvar sc = _BookmarkColorButton.Color == Color.White\r\n\t\t\t\t\t\t\t   ? Color.Transparent\r\n\t\t\t\t\t\t\t   : _BookmarkColorButton.Color;\r\n\t\t\tforeach (SourceItem item in _ItemList.SelectedObjects) {\r\n\t\t\t\tif (item?.Bookmark != null) {\r\n\t\t\t\t\titem.Bookmark.ForeColor = sc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_ItemList.RefreshObjects(_ItemList.SelectedObjects);\r\n\t\t}\r\n\r\n\t\tvoid SelectItemsByType(SourceItem.ItemType type) {\r\n\t\t\tvar r = new List<SourceItem>();\r\n\t\t\tSelectItemsByType(type, r, _itemsContainer);\r\n\t\t\t_ItemList.SelectedObjects = r.Count > 0 ? r : null;\r\n\t\t}\r\n\r\n\t\tvoid SelectItemsByType(SourceItem.ItemType type, List<SourceItem> result, SourceItem container) {\r\n\t\t\tforeach (var item in container.Items) {\r\n\t\t\t\tif (item.Type == type) {\r\n\t\t\t\t\t_ItemList.Reveal(item, false);\r\n\t\t\t\t\tresult.Add(item);\r\n\t\t\t\t}\r\n\t\t\t\tif (item.HasSubItems) {\r\n\t\t\t\t\tSelectItemsByType(type, result, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ItemList_ItemActivate(object sender, EventArgs e) {\r\n\t\t\tvar vi = GetFocusedPdfItem();\r\n\t\t\tif (vi != null) {\r\n\t\t\t\tvar pdfItem = _ItemList.GetModelObject(vi.Index) as SourceItem.Pdf;\r\n\t\t\t\tusing (SourcePdfOptionForm f = new SourcePdfOptionForm(pdfItem)) {\r\n\t\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\t_ItemList.RefreshObject(pdfItem);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tSetImageCropping();\r\n\t\t}\r\n\r\n\t\tvoid SetImageCropping() {\r\n\t\t\tvar items = _ItemList.SelectedObjects;\r\n\t\t\tif (items.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar s = items[0] as SourceItem.Image;\r\n\t\t\tint c = 1;\r\n\t\t\tfor (int i = 1; i < items.Count; i++) {\r\n\t\t\t\tif (items[i] is not SourceItem.Image image || image.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (s == null) {\r\n\t\t\t\t\ts = image;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tc++;\r\n\t\t\t\tif (s.Cropping.Equals(image.Cropping) == false) {\r\n\t\t\t\t\tif (FormHelper.YesNoBox(\"选择的图片具有不同的设置，是否重置为统一的值？\") == DialogResult.No) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (s == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar o = new SourceItem.Image(c > 1 ? (FilePath)(c + \" 个文件\") : s.FilePath) {\r\n\t\t\t\tCropping = s.Cropping.Clone()\r\n\t\t\t};\r\n\t\t\tusing (var f = new SourceImageOptionForm(o)) {\r\n\t\t\t\tif (f.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tforeach (SourceItem.Image image in items) {\r\n\t\t\t\t\t\tif (image == null || image.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\timage.Cropping = o.Cropping.Clone();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tListViewItem GetFocusedPdfItem() {\r\n\t\t\tvar vi = _ItemList.FocusedItem;\r\n\t\t\tif (vi == null\r\n\t\t\t\t|| vi.Text.EndsWith(Constants.FileExtensions.Pdf, StringComparison.OrdinalIgnoreCase) == false) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn vi;\r\n\t\t}\r\n\r\n\t\tvoid _ItemListMenu_Opening(object sender, CancelEventArgs e) {\r\n\t\t\tvar vi = _ItemList.FocusedItem;\r\n\t\t\tif (vi == null) {\r\n\t\t\t\t_ItemListMenu.ToggleEnabled(false, \"_SetPdfOptions\", \"_RefreshFolder\", \"_SetCroppingOptions\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar s = _ItemList.GetModelObject(vi.Index) as SourceItem;\r\n\t\t\t_ItemListMenu.Items[\"_SetPdfOptions\"].Enabled = s.Type == SourceItem.ItemType.Pdf;\r\n\t\t\t_ItemListMenu.Items[\"_SetCroppingOptions\"].Enabled = s.Type == SourceItem.ItemType.Image;\r\n\t\t\t_ItemListMenu.Items[\"_RefreshFolder\"].Enabled = s.Type == SourceItem.ItemType.Folder;\r\n\t\t}\r\n\r\n\t\tList<T> GetSourceItems<T>(bool selectedOnly) where T : SourceItem {\r\n\t\t\tif (_ItemList.GetItemCount() == 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar l = selectedOnly ? _ItemList.SelectedObjects : _ItemList.Objects;\r\n\t\t\tvar items = new List<T>(selectedOnly ? 10 : _ItemList.GetItemCount());\r\n\t\t\tSelectItems(l, items);\r\n\t\t\treturn items;\r\n\t\t}\r\n\r\n\t\tstatic void SelectItems<T>(System.Collections.IEnumerable list, List<T> results) where T : SourceItem {\r\n\t\t\tforeach (T item in list) {\r\n\t\t\t\tif (item == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tresults.Add(item);\r\n\t\t\t\tif (item.HasSubItems) {\r\n\t\t\t\t\tSelectItems(item.Items, results);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region AddDocumentWorker\r\n\t\tvoid _AddDocumentWorker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar files = e.Argument as string[];\r\n\t\t\tArray.ForEach(files, f => ((BackgroundWorker)sender).ReportProgress(0, f));\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\tAppContext.MainForm.Enabled = true;\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {\r\n\t\t\tAddItem(SourceItem.Create(e.UserState as string));\r\n\t\t}\r\n\r\n\t\tvoid AddItem(SourceItem item) {\r\n\t\t\tif (item == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_ItemList.Focus();\r\n\t\t\tAddItems([item]);\r\n\t\t}\r\n\r\n\t\tvoid AddItems(SourceItem[] items) {\r\n\t\t\tint i = _ItemList.GetLastSelectedIndex();\r\n\t\t\tif (i == -1) {\r\n\t\t\t\ti = _ItemList.FocusedItem?.Index ?? -1;\r\n\t\t\t}\r\n\t\t\tif (i == -1) {\r\n\t\t\t\t_itemsContainer.Items.AddRange(items);\r\n\t\t\t\t_ItemList.Objects = _itemsContainer.Items;\r\n\t\t\t\tgoto SELECT;\r\n\t\t\t}\r\n\t\t\tvar m = _ItemList.GetModelObject(i) as SourceItem;\r\n\t\t\tvar p = _ItemList.GetParentModel(m);\r\n\t\t\tif (p == null) {\r\n\t\t\t\ti = _itemsContainer.Items.IndexOf(m);\r\n\t\t\t\t_itemsContainer.Items.InsertRange(++i, items);\r\n\t\t\t\t_ItemList.Objects = _itemsContainer.Items;\r\n\t\t\t\t_ItemList.RebuildAll(true);\r\n\t\t\t\tgoto SELECT;\r\n\t\t\t}\r\n\t\t\ti = p.Items.IndexOf(m);\r\n\t\t\tp.Items.InsertRange(++i, items);\r\n\t\t\t_ItemList.RefreshObject(p);\r\n\t\t\tSELECT:\r\n\t\t\t_ItemList.SelectedObjects = items;\r\n\t\t\t_ItemList.FocusedObject = items[0];\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region IDefaultButtonControl 成员\r\n\r\n\t\tpublic override Button DefaultButton => _ImportButton;\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid _ItemList_FormatRow(object sender, FormatRowEventArgs e) {\r\n\t\t\tvar si = e.Model as SourceItem;\r\n\t\t\tvar bs = si.Bookmark;\r\n\t\t\tif (bs == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\te.Item.UseItemStyleForSubItems = false;\r\n\t\t\te.UseCellFormatEvents = false;\r\n\t\t\tvar c = e.Item.SubItems[1];\r\n\t\t\tc.ForeColor = bs.ForeColor.IsEmptyOrTransparent() ? Color.Black : bs.ForeColor;\r\n\t\t\tif (bs.IsBold || bs.IsItalic) {\r\n\t\t\t\tc.Font = new Font(c.Font, (bs.IsBold ? FontStyle.Bold : FontStyle.Regular) | (bs.IsItalic ? FontStyle.Italic : FontStyle.Regular));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/MergerControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_File.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_FileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>269, 17</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator4.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_LoadList.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SaveList.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_EditItemProperty.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Refresh.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SetPdfOptions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SetCroppingOptions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Copy.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshFolder.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ClearBookmarkTitle.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SetBookmarkTitle.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_PasteBookmarkText.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_CopyBookmarkText.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_CopyFileName.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Delete.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>508, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_RecentFileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>634, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_RecentFolderMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>149, 55</value>\r\n  </metadata>\r\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\r\n  <data name=\"_BookmarkColorButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALRSURBVDhPzZJrSJNhFMefd+9EISiFMogICaL6IPkhQcWK\r\n        nM3USs0MLxO3hSFIoYRZar6StVfdNHUzxVBWppWXzdm87L4xL02GzAuFdFGbo9SpaWkmymnvXEnQxz70\r\n        gz+Hczj/8xye50H/HB2B6BqO2zEDl5ak59Jz9Gy8RM/B+XoOPd+h6wYuzlSw0A5X+zbNcQjXcOkntWw6\r\n        MZJ8pHs2JgamIyPBRmSu2zqI9Ql5+ldTz2nok58ANbG3VcVxP+iyIqTkon3qFPrNV7cONdjaM95NMJnw\r\n        Iz8f1vLyoN/XFyZab4OhPRBWbXmwMp0L0vrDoGa7kaqraBfqTnH3UXDc+W/rE006XdnmR1k+mPz8wBwU\r\n        BAofHxjOS4RJSS7IxEdB+cIfngr3w4g0FSxFwZ0KNn4edSbjBROPr4zMakqAMlMavcMCqbc3WHISftfM\r\n        TUlQJ9gDpoYEsHYQYG3L+NDFomUjeSJeOtZHbEy/LIDPShLmDWVg1wmAyv8mjVQMN5rG4Zp4FISZsXJU\r\n        F43XvH6WZp3TE2uDotjxxiSvdmMRc2je8ABm1MXOgVS0dRU6lfZoCCp6v0O5cRWi7nYCEpylB/PDsFY+\r\n        E28WhNHSqVwQhmmWB6tBT16YrIjyHNSS5yZntXz4pODBxfs9EM/XQkjWcyDYDK3rHbYgTiGP0jCcL8kO\r\n        GF6x1EFtvJeaqtfGeaoX+4XOTdqeCCEgvR5qCzOnnsXhxU7jL8rDaTmyrONmna56c6G3Aqyqe0vvZTl2\r\n        a3fB0oKxHOYcW1DRbiz91sLdLWm8hAJd1i2qIrAWe3/lmvMiHVrsq4Ql00OgTv8yIALqQw1VXX7TlLhT\r\n        Ko6lJbhs24jCMclAbcrUTA+xumSugbEBYmNKSSxbxKk2eW7QcHW0h0oUgRXXhCNfl+VPeAzkTzIwoUMK\r\n        XijWR4ZgvWQo1sJjYALyDGIVhaIDrtb/BoR+AhgWoMzludfHAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_ItemListMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>376, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_FileTypeList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 55</value>\r\n  </metadata>\r\n  <metadata name=\"_OpenImageBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <data name=\"_OpenImageBox.Filter\" xml:space=\"preserve\">\r\n    <value>支持的文件（*.pdf,*.jpg,*.png,*.gif,*.bmp,*.tif,*.jp2）|*.pdf;*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tif;*.tiff;*.jp2;*.j2k|PDF文件（*.pdf）|*.pdf|图片文件（,*.jpg,*.jpeg,*.png,*.gif,*.bmp,*.tif）|*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tif;*.tiff;;*.jp2;*.j2k</value>\r\n  </data>\r\n  <metadata name=\"_OpenPdfBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>149, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_AddDocumentWorker.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>778, 17</value>\r\n  </metadata>\r\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>123</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/MergerOptionForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class MergerOptionForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._MainTab = new System.Windows.Forms.TabControl();\r\n\t\t\tthis._FilePage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox3 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._DeduplicateBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._KeepSourcePdfBookmarkBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveOrphanBoomarksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._SubFolderWithFilesBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ExcludeSubFoldersBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis._AutoBookmarkTitleBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._CajSortBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._IgnoreLeadingNumbersBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._NumericAwareSortBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._SubFoldersBeforeFilesBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._LayoutPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._DpiYBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._DpiXBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label();\r\n\t\t\tthis._RecompressImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label();\r\n\t\t\tthis._AutoMaskBWImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ImageGroupBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._AutoScaleDownBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._AutoScaleUpBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._LayoutGroupBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._RotationBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._SourceOrientationBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._UnifyOrientationBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._HeightBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._WidthBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._ImageVAlignBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._ImageHAlignBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PageSizeBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._AutoRotateBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._MarginGroupBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._SyncMarginsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RightMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._LeftMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._BottomMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._TopMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PdfGroupBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._ResizePdfPagesBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ScalePdfPagesBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ViewerSettingsPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._ViewerSettingsEditor = new PDFPatcher.Functions.ViewerPreferenceEditor();\r\n\t\t\tthis._DocumentInfoPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._FullCompressionBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._DocumentInfoEditor = new PDFPatcher.Functions.DocumentInfoEditor();\r\n\t\t\tthis._PageLabelsPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._PageLabelEditor = new PDFPatcher.Functions.PageLabelEditor();\r\n\t\t\tthis._ExtraEmptyPageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._MainTab.SuspendLayout();\r\n\t\t\tthis._FilePage.SuspendLayout();\r\n\t\t\tthis.groupBox3.SuspendLayout();\r\n\t\t\tthis.groupBox1.SuspendLayout();\r\n\t\t\tthis._LayoutPage.SuspendLayout();\r\n\t\t\tthis.groupBox2.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._DpiYBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._DpiXBox)).BeginInit();\r\n\t\t\tthis._ImageGroupBox.SuspendLayout();\r\n\t\t\tthis._LayoutGroupBox.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._HeightBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._WidthBox)).BeginInit();\r\n\t\t\tthis._MarginGroupBox.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).BeginInit();\r\n\t\t\tthis._PdfGroupBox.SuspendLayout();\r\n\t\t\tthis._ViewerSettingsPage.SuspendLayout();\r\n\t\t\tthis._DocumentInfoPage.SuspendLayout();\r\n\t\t\tthis._PageLabelsPage.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _MainTab\r\n\t\t\t// \r\n\t\t\tthis._MainTab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._MainTab.Controls.Add(this._FilePage);\r\n\t\t\tthis._MainTab.Controls.Add(this._LayoutPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._ViewerSettingsPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._DocumentInfoPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._PageLabelsPage);\r\n\t\t\tthis._MainTab.Location = new System.Drawing.Point(12, 12);\r\n\t\t\tthis._MainTab.Name = \"_MainTab\";\r\n\t\t\tthis._MainTab.SelectedIndex = 0;\r\n\t\t\tthis._MainTab.Size = new System.Drawing.Size(448, 319);\r\n\t\t\tthis._MainTab.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _FilePage\r\n\t\t\t// \r\n\t\t\tthis._FilePage.Controls.Add(this.groupBox3);\r\n\t\t\tthis._FilePage.Controls.Add(this.groupBox1);\r\n\t\t\tthis._FilePage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._FilePage.Name = \"_FilePage\";\r\n\t\t\tthis._FilePage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._FilePage.Size = new System.Drawing.Size(440, 293);\r\n\t\t\tthis._FilePage.TabIndex = 1;\r\n\t\t\tthis._FilePage.Text = \"文件\";\r\n\t\t\tthis._FilePage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox3\r\n\t\t\t// \r\n\t\t\tthis.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.groupBox3.Controls.Add(this._ExtraEmptyPageBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._DeduplicateBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._KeepSourcePdfBookmarkBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._RemoveOrphanBoomarksBox);\r\n\t\t\tthis.groupBox3.Location = new System.Drawing.Point(6, 141);\r\n\t\t\tthis.groupBox3.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis.groupBox3.Name = \"groupBox3\";\r\n\t\t\tthis.groupBox3.Padding = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis.groupBox3.Size = new System.Drawing.Size(431, 133);\r\n\t\t\tthis.groupBox3.TabIndex = 1;\r\n\t\t\tthis.groupBox3.TabStop = false;\r\n\t\t\tthis.groupBox3.Text = \"合并文件行为\";\r\n\t\t\t// \r\n\t\t\t// _DeduplicateBox\r\n\t\t\t// \r\n\t\t\tthis._DeduplicateBox.AutoSize = true;\r\n\t\t\tthis._DeduplicateBox.Location = new System.Drawing.Point(10, 73);\r\n\t\t\tthis._DeduplicateBox.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._DeduplicateBox.Name = \"_DeduplicateBox\";\r\n\t\t\tthis._DeduplicateBox.Size = new System.Drawing.Size(258, 16);\r\n\t\t\tthis._DeduplicateBox.TabIndex = 2;\r\n\t\t\tthis._DeduplicateBox.Text = \"尝试合并 PDF 文档重复数据以缩小结果文件\";\r\n\t\t\tthis._DeduplicateBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _KeepSourcePdfBookmarkBox\r\n\t\t\t// \r\n\t\t\tthis._KeepSourcePdfBookmarkBox.AutoSize = true;\r\n\t\t\tthis._KeepSourcePdfBookmarkBox.Location = new System.Drawing.Point(10, 19);\r\n\t\t\tthis._KeepSourcePdfBookmarkBox.Name = \"_KeepSourcePdfBookmarkBox\";\r\n\t\t\tthis._KeepSourcePdfBookmarkBox.Size = new System.Drawing.Size(150, 16);\r\n\t\t\tthis._KeepSourcePdfBookmarkBox.TabIndex = 0;\r\n\t\t\tthis._KeepSourcePdfBookmarkBox.Text = \"保留源 PDF 文档的书签\";\r\n\t\t\tthis._KeepSourcePdfBookmarkBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveOrphanBoomarksBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveOrphanBoomarksBox.AutoSize = true;\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Location = new System.Drawing.Point(33, 41);\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Name = \"_RemoveOrphanBoomarksBox\";\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Size = new System.Drawing.Size(168, 16);\r\n\t\t\tthis._RemoveOrphanBoomarksBox.TabIndex = 1;\r\n\t\t\tthis._RemoveOrphanBoomarksBox.Text = \"删除连接到无效页面的书签\";\r\n\t\t\tthis._RemoveOrphanBoomarksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.groupBox1.Controls.Add(this._SubFolderWithFilesBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ExcludeSubFoldersBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this.label9);\r\n\t\t\tthis.groupBox1.Controls.Add(this._AutoBookmarkTitleBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._CajSortBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._IgnoreLeadingNumbersBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._NumericAwareSortBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._SubFoldersBeforeFilesBox);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size(431, 131);\r\n\t\t\tthis.groupBox1.TabIndex = 0;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"向文件列表添加项目时的行为\";\r\n\t\t\t// \r\n\t\t\t// _SubFolderWithFilesBox\r\n\t\t\t// \r\n\t\t\tthis._SubFolderWithFilesBox.AutoSize = true;\r\n\t\t\tthis._SubFolderWithFilesBox.Location = new System.Drawing.Point(177, 63);\r\n\t\t\tthis._SubFolderWithFilesBox.Name = \"_SubFolderWithFilesBox\";\r\n\t\t\tthis._SubFolderWithFilesBox.Size = new System.Drawing.Size(107, 16);\r\n\t\t\tthis._SubFolderWithFilesBox.TabIndex = 4;\r\n\t\t\tthis._SubFolderWithFilesBox.TabStop = true;\r\n\t\t\tthis._SubFolderWithFilesBox.Text = \"和文件一起排序\";\r\n\t\t\tthis._SubFolderWithFilesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExcludeSubFoldersBox\r\n\t\t\t// \r\n\t\t\tthis._ExcludeSubFoldersBox.AutoSize = true;\r\n\t\t\tthis._ExcludeSubFoldersBox.Location = new System.Drawing.Point(290, 63);\r\n\t\t\tthis._ExcludeSubFoldersBox.Name = \"_ExcludeSubFoldersBox\";\r\n\t\t\tthis._ExcludeSubFoldersBox.Size = new System.Drawing.Size(71, 16);\r\n\t\t\tthis._ExcludeSubFoldersBox.TabIndex = 5;\r\n\t\t\tthis._ExcludeSubFoldersBox.TabStop = true;\r\n\t\t\tthis._ExcludeSubFoldersBox.Text = \"不要导入\";\r\n\t\t\tthis._ExcludeSubFoldersBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(8, 65);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label9.TabIndex = 2;\r\n\t\t\tthis.label9.Text = \"子文件夹：\";\r\n\t\t\t// \r\n\t\t\t// _AutoBookmarkTitleBox\r\n\t\t\t// \r\n\t\t\tthis._AutoBookmarkTitleBox.AutoSize = true;\r\n\t\t\tthis._AutoBookmarkTitleBox.Location = new System.Drawing.Point(10, 19);\r\n\t\t\tthis._AutoBookmarkTitleBox.Name = \"_AutoBookmarkTitleBox\";\r\n\t\t\tthis._AutoBookmarkTitleBox.Size = new System.Drawing.Size(168, 16);\r\n\t\t\tthis._AutoBookmarkTitleBox.TabIndex = 0;\r\n\t\t\tthis._AutoBookmarkTitleBox.Text = \"添加项时自动生成书签文本\";\r\n\t\t\tthis._AutoBookmarkTitleBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CajSortBox\r\n\t\t\t// \r\n\t\t\tthis._CajSortBox.AutoSize = true;\r\n\t\t\tthis._CajSortBox.Location = new System.Drawing.Point(10, 107);\r\n\t\t\tthis._CajSortBox.Name = \"_CajSortBox\";\r\n\t\t\tthis._CajSortBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._CajSortBox.TabIndex = 7;\r\n\t\t\tthis._CajSortBox.Text = \"使用超星命名规则排序\";\r\n\t\t\tthis._CajSortBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _IgnoreLeadingNumbersBox\r\n\t\t\t// \r\n\t\t\tthis._IgnoreLeadingNumbersBox.AutoSize = true;\r\n\t\t\tthis._IgnoreLeadingNumbersBox.Location = new System.Drawing.Point(33, 41);\r\n\t\t\tthis._IgnoreLeadingNumbersBox.Name = \"_IgnoreLeadingNumbersBox\";\r\n\t\t\tthis._IgnoreLeadingNumbersBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._IgnoreLeadingNumbersBox.TabIndex = 1;\r\n\t\t\tthis._IgnoreLeadingNumbersBox.Text = \"删除书签文本的前导数字\";\r\n\t\t\tthis._IgnoreLeadingNumbersBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _NumericAwareSortBox\r\n\t\t\t// \r\n\t\t\tthis._NumericAwareSortBox.AutoSize = true;\r\n\t\t\tthis._NumericAwareSortBox.Location = new System.Drawing.Point(10, 85);\r\n\t\t\tthis._NumericAwareSortBox.Name = \"_NumericAwareSortBox\";\r\n\t\t\tthis._NumericAwareSortBox.Size = new System.Drawing.Size(180, 16);\r\n\t\t\tthis._NumericAwareSortBox.TabIndex = 6;\r\n\t\t\tthis._NumericAwareSortBox.Text = \"文件名分别按数值和文本排序\";\r\n\t\t\tthis._NumericAwareSortBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _SubFoldersBeforeFilesBox\r\n\t\t\t// \r\n\t\t\tthis._SubFoldersBeforeFilesBox.AutoSize = true;\r\n\t\t\tthis._SubFoldersBeforeFilesBox.Location = new System.Drawing.Point(76, 63);\r\n\t\t\tthis._SubFoldersBeforeFilesBox.Name = \"_SubFoldersBeforeFilesBox\";\r\n\t\t\tthis._SubFoldersBeforeFilesBox.Size = new System.Drawing.Size(95, 16);\r\n\t\t\tthis._SubFoldersBeforeFilesBox.TabIndex = 3;\r\n\t\t\tthis._SubFoldersBeforeFilesBox.Text = \"排在文件前面\";\r\n\t\t\tthis._SubFoldersBeforeFilesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _LayoutPage\r\n\t\t\t// \r\n\t\t\tthis._LayoutPage.Controls.Add(this.groupBox2);\r\n\t\t\tthis._LayoutPage.Controls.Add(this._ImageGroupBox);\r\n\t\t\tthis._LayoutPage.Controls.Add(this._LayoutGroupBox);\r\n\t\t\tthis._LayoutPage.Controls.Add(this._MarginGroupBox);\r\n\t\t\tthis._LayoutPage.Controls.Add(this._PdfGroupBox);\r\n\t\t\tthis._LayoutPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._LayoutPage.Name = \"_LayoutPage\";\r\n\t\t\tthis._LayoutPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._LayoutPage.Size = new System.Drawing.Size(440, 293);\r\n\t\t\tthis._LayoutPage.TabIndex = 0;\r\n\t\t\tthis._LayoutPage.Text = \"页面布局\";\r\n\t\t\tthis._LayoutPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Controls.Add(this._DpiYBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._DpiXBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label10);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label11);\r\n\t\t\tthis.groupBox2.Controls.Add(this._RecompressImageBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label12);\r\n\t\t\tthis.groupBox2.Controls.Add(this._AutoMaskBWImageBox);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point(237, 139);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size(195, 138);\r\n\t\t\tthis.groupBox2.TabIndex = 4;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"图片\";\r\n\t\t\t// \r\n\t\t\t// _DpiYBox\r\n\t\t\t// \r\n\t\t\tthis._DpiYBox.Location = new System.Drawing.Point(55, 111);\r\n\t\t\tthis._DpiYBox.Maximum = new decimal(new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._DpiYBox.Name = \"_DpiYBox\";\r\n\t\t\tthis._DpiYBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._DpiYBox.TabIndex = 6;\r\n\t\t\tthis._DpiYBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _DpiXBox\r\n\t\t\t// \r\n\t\t\tthis._DpiXBox.Location = new System.Drawing.Point(55, 84);\r\n\t\t\tthis._DpiXBox.Maximum = new decimal(new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._DpiXBox.Name = \"_DpiXBox\";\r\n\t\t\tthis._DpiXBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._DpiXBox.TabIndex = 4;\r\n\t\t\tthis._DpiXBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(6, 66);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(179, 12);\r\n\t\t\tthis.label10.TabIndex = 2;\r\n\t\t\tthis.label10.Text = \"指定导入分辨率（0：保持原图）\";\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point(8, 113);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label11.TabIndex = 5;\r\n\t\t\tthis.label11.Text = \"垂直：\";\r\n\t\t\t// \r\n\t\t\t// _RecompressImageBox\r\n\t\t\t// \r\n\t\t\tthis._RecompressImageBox.AutoSize = true;\r\n\t\t\tthis._RecompressImageBox.Location = new System.Drawing.Point(7, 43);\r\n\t\t\tthis._RecompressImageBox.Name = \"_RecompressImageBox\";\r\n\t\t\tthis._RecompressImageBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._RecompressImageBox.TabIndex = 1;\r\n\t\t\tthis._RecompressImageBox.Text = \"优化压缩黑白图片\";\r\n\t\t\tthis._RecompressImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.AutoSize = true;\r\n\t\t\tthis.label12.Location = new System.Drawing.Point(8, 87);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label12.TabIndex = 3;\r\n\t\t\tthis.label12.Text = \"水平：\";\r\n\t\t\t// \r\n\t\t\t// _AutoMaskBWImageBox\r\n\t\t\t// \r\n\t\t\tthis._AutoMaskBWImageBox.AutoSize = true;\r\n\t\t\tthis._AutoMaskBWImageBox.Location = new System.Drawing.Point(7, 21);\r\n\t\t\tthis._AutoMaskBWImageBox.Name = \"_AutoMaskBWImageBox\";\r\n\t\t\tthis._AutoMaskBWImageBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._AutoMaskBWImageBox.TabIndex = 0;\r\n\t\t\tthis._AutoMaskBWImageBox.Text = \"黑白图片设为透明\";\r\n\t\t\tthis._AutoMaskBWImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImageGroupBox\r\n\t\t\t// \r\n\t\t\tthis._ImageGroupBox.Controls.Add(this._AutoScaleDownBox);\r\n\t\t\tthis._ImageGroupBox.Controls.Add(this._AutoScaleUpBox);\r\n\t\t\tthis._ImageGroupBox.Location = new System.Drawing.Point(237, 6);\r\n\t\t\tthis._ImageGroupBox.Name = \"_ImageGroupBox\";\r\n\t\t\tthis._ImageGroupBox.Size = new System.Drawing.Size(195, 48);\r\n\t\t\tthis._ImageGroupBox.TabIndex = 2;\r\n\t\t\tthis._ImageGroupBox.TabStop = false;\r\n\t\t\tthis._ImageGroupBox.Text = \"缩放原始内容适应页面\";\r\n\t\t\t// \r\n\t\t\t// _AutoScaleDownBox\r\n\t\t\t// \r\n\t\t\tthis._AutoScaleDownBox.AutoSize = true;\r\n\t\t\tthis._AutoScaleDownBox.Checked = true;\r\n\t\t\tthis._AutoScaleDownBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._AutoScaleDownBox.Location = new System.Drawing.Point(7, 20);\r\n\t\t\tthis._AutoScaleDownBox.Name = \"_AutoScaleDownBox\";\r\n\t\t\tthis._AutoScaleDownBox.Size = new System.Drawing.Size(72, 16);\r\n\t\t\tthis._AutoScaleDownBox.TabIndex = 0;\r\n\t\t\tthis._AutoScaleDownBox.Text = \"无损缩小\";\r\n\t\t\tthis._AutoScaleDownBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AutoScaleUpBox\r\n\t\t\t// \r\n\t\t\tthis._AutoScaleUpBox.AutoSize = true;\r\n\t\t\tthis._AutoScaleUpBox.Location = new System.Drawing.Point(94, 20);\r\n\t\t\tthis._AutoScaleUpBox.Name = \"_AutoScaleUpBox\";\r\n\t\t\tthis._AutoScaleUpBox.Size = new System.Drawing.Size(72, 16);\r\n\t\t\tthis._AutoScaleUpBox.TabIndex = 1;\r\n\t\t\tthis._AutoScaleUpBox.Text = \"无损放大\";\r\n\t\t\tthis._AutoScaleUpBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _LayoutGroupBox\r\n\t\t\t// \r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._RotationBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._SourceOrientationBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._UnifyOrientationBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._HeightBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._WidthBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._ImageVAlignBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._ImageHAlignBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label2);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label8);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._PageSizeBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._AutoRotateBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label5);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label4);\r\n\t\t\tthis._LayoutGroupBox.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis._LayoutGroupBox.Name = \"_LayoutGroupBox\";\r\n\t\t\tthis._LayoutGroupBox.Size = new System.Drawing.Size(225, 171);\r\n\t\t\tthis._LayoutGroupBox.TabIndex = 0;\r\n\t\t\tthis._LayoutGroupBox.TabStop = false;\r\n\t\t\tthis._LayoutGroupBox.Text = \"默认页面布局及尺寸（单位：厘米）\";\r\n\t\t\t// \r\n\t\t\t// _RotationBox\r\n\t\t\t// \r\n\t\t\tthis._RotationBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._RotationBox.FormattingEnabled = true;\r\n\t\t\tthis._RotationBox.Items.AddRange(new object[] {\r\n            \"顺时针旋转90度\",\r\n            \"逆时针旋转90度\"});\r\n\t\t\tthis._RotationBox.Location = new System.Drawing.Point(103, 140);\r\n\t\t\tthis._RotationBox.Name = \"_RotationBox\";\r\n\t\t\tthis._RotationBox.Size = new System.Drawing.Size(112, 20);\r\n\t\t\tthis._RotationBox.TabIndex = 12;\r\n\t\t\t// \r\n\t\t\t// _SourceOrientationBox\r\n\t\t\t// \r\n\t\t\tthis._SourceOrientationBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._SourceOrientationBox.FormattingEnabled = true;\r\n\t\t\tthis._SourceOrientationBox.Items.AddRange(new object[] {\r\n            \"横向页面\",\r\n            \"纵向页面\"});\r\n\t\t\tthis._SourceOrientationBox.Location = new System.Drawing.Point(20, 140);\r\n\t\t\tthis._SourceOrientationBox.Name = \"_SourceOrientationBox\";\r\n\t\t\tthis._SourceOrientationBox.Size = new System.Drawing.Size(77, 20);\r\n\t\t\tthis._SourceOrientationBox.TabIndex = 11;\r\n\t\t\t// \r\n\t\t\t// _UnifyOrientationBox\r\n\t\t\t// \r\n\t\t\tthis._UnifyOrientationBox.AutoSize = true;\r\n\t\t\tthis._UnifyOrientationBox.Location = new System.Drawing.Point(8, 118);\r\n\t\t\tthis._UnifyOrientationBox.Name = \"_UnifyOrientationBox\";\r\n\t\t\tthis._UnifyOrientationBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._UnifyOrientationBox.TabIndex = 10;\r\n\t\t\tthis._UnifyOrientationBox.Text = \"修改所有页面的纵横方向\";\r\n\t\t\tthis._UnifyOrientationBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _HeightBox\r\n\t\t\t// \r\n\t\t\tthis._HeightBox.DecimalPlaces = 2;\r\n\t\t\tthis._HeightBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            131072});\r\n\t\t\tthis._HeightBox.Location = new System.Drawing.Point(154, 45);\r\n\t\t\tthis._HeightBox.Maximum = new decimal(new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._HeightBox.Name = \"_HeightBox\";\r\n\t\t\tthis._HeightBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._HeightBox.TabIndex = 5;\r\n\t\t\tthis._HeightBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _WidthBox\r\n\t\t\t// \r\n\t\t\tthis._WidthBox.DecimalPlaces = 2;\r\n\t\t\tthis._WidthBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            131072});\r\n\t\t\tthis._WidthBox.Location = new System.Drawing.Point(53, 44);\r\n\t\t\tthis._WidthBox.Maximum = new decimal(new int[] {\r\n            9999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._WidthBox.Name = \"_WidthBox\";\r\n\t\t\tthis._WidthBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._WidthBox.TabIndex = 3;\r\n\t\t\tthis._WidthBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _ImageVAlignBox\r\n\t\t\t// \r\n\t\t\tthis._ImageVAlignBox.DisplayMember = \"Key\";\r\n\t\t\tthis._ImageVAlignBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ImageVAlignBox.Location = new System.Drawing.Point(139, 93);\r\n\t\t\tthis._ImageVAlignBox.Name = \"_ImageVAlignBox\";\r\n\t\t\tthis._ImageVAlignBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._ImageVAlignBox.TabIndex = 9;\r\n\t\t\tthis._ImageVAlignBox.ValueMember = \"Value\";\r\n\t\t\t// \r\n\t\t\t// _ImageHAlignBox\r\n\t\t\t// \r\n\t\t\tthis._ImageHAlignBox.DisplayMember = \"Key\";\r\n\t\t\tthis._ImageHAlignBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ImageHAlignBox.Location = new System.Drawing.Point(53, 93);\r\n\t\t\tthis._ImageHAlignBox.Name = \"_ImageHAlignBox\";\r\n\t\t\tthis._ImageHAlignBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._ImageHAlignBox.TabIndex = 8;\r\n\t\t\tthis._ImageHAlignBox.ValueMember = \"Value\";\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(6, 23);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label2.TabIndex = 0;\r\n\t\t\tthis.label2.Text = \"尺寸：\";\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point(6, 96);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label8.TabIndex = 7;\r\n\t\t\tthis.label8.Text = \"位置：\";\r\n\t\t\t// \r\n\t\t\t// _PageSizeBox\r\n\t\t\t// \r\n\t\t\tthis._PageSizeBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._PageSizeBox.Location = new System.Drawing.Point(53, 18);\r\n\t\t\tthis._PageSizeBox.Name = \"_PageSizeBox\";\r\n\t\t\tthis._PageSizeBox.Size = new System.Drawing.Size(162, 20);\r\n\t\t\tthis._PageSizeBox.TabIndex = 1;\r\n\t\t\tthis._PageSizeBox.SelectedIndexChanged += new System.EventHandler(this._PageSizeBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// _AutoRotateBox\r\n\t\t\t// \r\n\t\t\tthis._AutoRotateBox.AutoSize = true;\r\n\t\t\tthis._AutoRotateBox.Checked = true;\r\n\t\t\tthis._AutoRotateBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._AutoRotateBox.Location = new System.Drawing.Point(20, 72);\r\n\t\t\tthis._AutoRotateBox.Name = \"_AutoRotateBox\";\r\n\t\t\tthis._AutoRotateBox.Size = new System.Drawing.Size(192, 16);\r\n\t\t\tthis._AutoRotateBox.TabIndex = 6;\r\n\t\t\tthis._AutoRotateBox.Text = \"旋转页面适应原始内容纵横方向\";\r\n\t\t\tthis._AutoRotateBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(120, 47);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label5.TabIndex = 4;\r\n\t\t\tthis.label5.Text = \"高：\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(18, 47);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label4.TabIndex = 2;\r\n\t\t\tthis.label4.Text = \"宽：\";\r\n\t\t\t// \r\n\t\t\t// _MarginGroupBox\r\n\t\t\t// \r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._SyncMarginsBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._RightMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._LeftMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._BottomMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._TopMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label7);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label3);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label6);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label1);\r\n\t\t\tthis._MarginGroupBox.Location = new System.Drawing.Point(6, 183);\r\n\t\t\tthis._MarginGroupBox.Name = \"_MarginGroupBox\";\r\n\t\t\tthis._MarginGroupBox.Size = new System.Drawing.Size(225, 94);\r\n\t\t\tthis._MarginGroupBox.TabIndex = 1;\r\n\t\t\tthis._MarginGroupBox.TabStop = false;\r\n\t\t\tthis._MarginGroupBox.Text = \"页边留白（单位：厘米）\";\r\n\t\t\t// \r\n\t\t\t// _SyncMarginsBox\r\n\t\t\t// \r\n\t\t\tthis._SyncMarginsBox.AutoSize = true;\r\n\t\t\tthis._SyncMarginsBox.Checked = true;\r\n\t\t\tthis._SyncMarginsBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._SyncMarginsBox.Location = new System.Drawing.Point(53, 74);\r\n\t\t\tthis._SyncMarginsBox.Name = \"_SyncMarginsBox\";\r\n\t\t\tthis._SyncMarginsBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._SyncMarginsBox.TabIndex = 9;\r\n\t\t\tthis._SyncMarginsBox.Text = \"同步调整四边留白\";\r\n\t\t\tthis._SyncMarginsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RightMarginBox\r\n\t\t\t// \r\n\t\t\tthis._RightMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._RightMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            131072});\r\n\t\t\tthis._RightMarginBox.Location = new System.Drawing.Point(154, 47);\r\n\t\t\tthis._RightMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._RightMarginBox.Name = \"_RightMarginBox\";\r\n\t\t\tthis._RightMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._RightMarginBox.TabIndex = 8;\r\n\t\t\tthis._RightMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._RightMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _LeftMarginBox\r\n\t\t\t// \r\n\t\t\tthis._LeftMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._LeftMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            131072});\r\n\t\t\tthis._LeftMarginBox.Location = new System.Drawing.Point(53, 47);\r\n\t\t\tthis._LeftMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftMarginBox.Name = \"_LeftMarginBox\";\r\n\t\t\tthis._LeftMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._LeftMarginBox.TabIndex = 6;\r\n\t\t\tthis._LeftMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._LeftMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _BottomMarginBox\r\n\t\t\t// \r\n\t\t\tthis._BottomMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._BottomMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            131072});\r\n\t\t\tthis._BottomMarginBox.Location = new System.Drawing.Point(154, 20);\r\n\t\t\tthis._BottomMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BottomMarginBox.Name = \"_BottomMarginBox\";\r\n\t\t\tthis._BottomMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._BottomMarginBox.TabIndex = 4;\r\n\t\t\tthis._BottomMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._BottomMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _TopMarginBox\r\n\t\t\t// \r\n\t\t\tthis._TopMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._TopMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            131072});\r\n\t\t\tthis._TopMarginBox.Location = new System.Drawing.Point(53, 20);\r\n\t\t\tthis._TopMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopMarginBox.Name = \"_TopMarginBox\";\r\n\t\t\tthis._TopMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._TopMarginBox.TabIndex = 1;\r\n\t\t\tthis._TopMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._TopMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(119, 50);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label7.TabIndex = 7;\r\n\t\t\tthis.label7.Text = \"右：\";\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(119, 22);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label3.TabIndex = 3;\r\n\t\t\tthis.label3.Text = \"下：\";\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(18, 50);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label6.TabIndex = 5;\r\n\t\t\tthis.label6.Text = \"左：\";\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(18, 23);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"上：\";\r\n\t\t\t// \r\n\t\t\t// _PdfGroupBox\r\n\t\t\t// \r\n\t\t\tthis._PdfGroupBox.Controls.Add(this._ResizePdfPagesBox);\r\n\t\t\tthis._PdfGroupBox.Controls.Add(this._ScalePdfPagesBox);\r\n\t\t\tthis._PdfGroupBox.Location = new System.Drawing.Point(237, 60);\r\n\t\t\tthis._PdfGroupBox.Name = \"_PdfGroupBox\";\r\n\t\t\tthis._PdfGroupBox.Size = new System.Drawing.Size(195, 73);\r\n\t\t\tthis._PdfGroupBox.TabIndex = 3;\r\n\t\t\tthis._PdfGroupBox.TabStop = false;\r\n\t\t\tthis._PdfGroupBox.Text = \"源 PDF 页面尺寸\";\r\n\t\t\t// \r\n\t\t\t// _ResizePdfPagesBox\r\n\t\t\t// \r\n\t\t\tthis._ResizePdfPagesBox.AutoSize = true;\r\n\t\t\tthis._ResizePdfPagesBox.Location = new System.Drawing.Point(7, 20);\r\n\t\t\tthis._ResizePdfPagesBox.Name = \"_ResizePdfPagesBox\";\r\n\t\t\tthis._ResizePdfPagesBox.Size = new System.Drawing.Size(107, 16);\r\n\t\t\tthis._ResizePdfPagesBox.TabIndex = 1;\r\n\t\t\tthis._ResizePdfPagesBox.Text = \"调整为页面尺寸\";\r\n\t\t\tthis._ResizePdfPagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ScalePdfPagesBox\r\n\t\t\t// \r\n\t\t\tthis._ScalePdfPagesBox.AutoSize = true;\r\n\t\t\tthis._ScalePdfPagesBox.CheckAlign = System.Drawing.ContentAlignment.TopLeft;\r\n\t\t\tthis._ScalePdfPagesBox.Location = new System.Drawing.Point(7, 42);\r\n\t\t\tthis._ScalePdfPagesBox.Name = \"_ScalePdfPagesBox\";\r\n\t\t\tthis._ScalePdfPagesBox.Size = new System.Drawing.Size(119, 16);\r\n\t\t\tthis._ScalePdfPagesBox.TabIndex = 2;\r\n\t\t\tthis._ScalePdfPagesBox.TabStop = true;\r\n\t\t\tthis._ScalePdfPagesBox.Text = \"缩放内容适应页面\";\r\n\t\t\tthis._ScalePdfPagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ViewerSettingsPage\r\n\t\t\t// \r\n\t\t\tthis._ViewerSettingsPage.Controls.Add(this._ViewerSettingsEditor);\r\n\t\t\tthis._ViewerSettingsPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._ViewerSettingsPage.Name = \"_ViewerSettingsPage\";\r\n\t\t\tthis._ViewerSettingsPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._ViewerSettingsPage.Size = new System.Drawing.Size(440, 293);\r\n\t\t\tthis._ViewerSettingsPage.TabIndex = 2;\r\n\t\t\tthis._ViewerSettingsPage.Text = \"阅读方式\";\r\n\t\t\tthis._ViewerSettingsPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ViewerSettingsEditor\r\n\t\t\t// \r\n\t\t\tthis._ViewerSettingsEditor.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._ViewerSettingsEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._ViewerSettingsEditor.Name = \"_ViewerSettingsEditor\";\r\n\t\t\tthis._ViewerSettingsEditor.Size = new System.Drawing.Size(438, 279);\r\n\t\t\tthis._ViewerSettingsEditor.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _DocumentInfoPage\r\n\t\t\t// \r\n\t\t\tthis._DocumentInfoPage.Controls.Add(this._FullCompressionBox);\r\n\t\t\tthis._DocumentInfoPage.Controls.Add(this._DocumentInfoEditor);\r\n\t\t\tthis._DocumentInfoPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._DocumentInfoPage.Name = \"_DocumentInfoPage\";\r\n\t\t\tthis._DocumentInfoPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._DocumentInfoPage.Size = new System.Drawing.Size(440, 293);\r\n\t\t\tthis._DocumentInfoPage.TabIndex = 3;\r\n\t\t\tthis._DocumentInfoPage.Text = \"文档杂项\";\r\n\t\t\tthis._DocumentInfoPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FullCompressionBox\r\n\t\t\t// \r\n\t\t\tthis._FullCompressionBox.AutoSize = true;\r\n\t\t\tthis._FullCompressionBox.Location = new System.Drawing.Point(15, 260);\r\n\t\t\tthis._FullCompressionBox.Name = \"_FullCompressionBox\";\r\n\t\t\tthis._FullCompressionBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._FullCompressionBox.TabIndex = 2;\r\n\t\t\tthis._FullCompressionBox.Text = \"压缩索引表和书签\";\r\n\t\t\tthis._FullCompressionBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DocumentInfoEditor\r\n\t\t\t// \r\n\t\t\tthis._DocumentInfoEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._DocumentInfoEditor.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._DocumentInfoEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._DocumentInfoEditor.Name = \"_DocumentInfoEditor\";\r\n\t\t\tthis._DocumentInfoEditor.Size = new System.Drawing.Size(439, 294);\r\n\t\t\tthis._DocumentInfoEditor.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _PageLabelsPage\r\n\t\t\t// \r\n\t\t\tthis._PageLabelsPage.Controls.Add(this._PageLabelEditor);\r\n\t\t\tthis._PageLabelsPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._PageLabelsPage.Name = \"_PageLabelsPage\";\r\n\t\t\tthis._PageLabelsPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._PageLabelsPage.Size = new System.Drawing.Size(440, 293);\r\n\t\t\tthis._PageLabelsPage.TabIndex = 4;\r\n\t\t\tthis._PageLabelsPage.Text = \"页码标签\";\r\n\t\t\tthis._PageLabelsPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _PageLabelEditor\r\n\t\t\t// \r\n\t\t\tthis._PageLabelEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageLabelEditor.Labels = null;\r\n\t\t\tthis._PageLabelEditor.Location = new System.Drawing.Point(-2, 0);\r\n\t\t\tthis._PageLabelEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._PageLabelEditor.Name = \"_PageLabelEditor\";\r\n\t\t\tthis._PageLabelEditor.Size = new System.Drawing.Size(439, 282);\r\n\t\t\tthis._PageLabelEditor.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _ExtraEmptyPageBox\r\n\t\t\t// \r\n\t\t\tthis._ExtraEmptyPageBox.AutoSize = true;\r\n\t\t\tthis._ExtraEmptyPageBox.Location = new System.Drawing.Point(10, 93);\r\n\t\t\tthis._ExtraEmptyPageBox.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._ExtraEmptyPageBox.Name = \"_ExtraEmptyPageBox\";\r\n\t\t\tthis._ExtraEmptyPageBox.Size = new System.Drawing.Size(222, 16);\r\n\t\t\tthis._ExtraEmptyPageBox.TabIndex = 3;\r\n\t\t\tthis._ExtraEmptyPageBox.Text = \"在单数页的 PDF 文档后附加一空白页\";\r\n\t\t\tthis._ExtraEmptyPageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// MergerOptionForm\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(474, 343);\r\n\t\t\tthis.Controls.Add(this._MainTab);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"MergerOptionForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.Text = \"合并 PDF 文档选项\";\r\n\t\t\tthis._MainTab.ResumeLayout(false);\r\n\t\t\tthis._FilePage.ResumeLayout(false);\r\n\t\t\tthis.groupBox3.ResumeLayout(false);\r\n\t\t\tthis.groupBox3.PerformLayout();\r\n\t\t\tthis.groupBox1.ResumeLayout(false);\r\n\t\t\tthis.groupBox1.PerformLayout();\r\n\t\t\tthis._LayoutPage.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._DpiYBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._DpiXBox)).EndInit();\r\n\t\t\tthis._ImageGroupBox.ResumeLayout(false);\r\n\t\t\tthis._ImageGroupBox.PerformLayout();\r\n\t\t\tthis._LayoutGroupBox.ResumeLayout(false);\r\n\t\t\tthis._LayoutGroupBox.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._HeightBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._WidthBox)).EndInit();\r\n\t\t\tthis._MarginGroupBox.ResumeLayout(false);\r\n\t\t\tthis._MarginGroupBox.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).EndInit();\r\n\t\t\tthis._PdfGroupBox.ResumeLayout(false);\r\n\t\t\tthis._PdfGroupBox.PerformLayout();\r\n\t\t\tthis._ViewerSettingsPage.ResumeLayout(false);\r\n\t\t\tthis._DocumentInfoPage.ResumeLayout(false);\r\n\t\t\tthis._DocumentInfoPage.PerformLayout();\r\n\t\t\tthis._PageLabelsPage.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.TabControl _MainTab;\r\n\t\tprivate System.Windows.Forms.TabPage _LayoutPage;\r\n\t\tprivate System.Windows.Forms.TabPage _FilePage;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoMaskBWImageBox;\r\n\t\tprivate System.Windows.Forms.GroupBox _ImageGroupBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoScaleDownBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoScaleUpBox;\r\n\t\tprivate System.Windows.Forms.GroupBox _LayoutGroupBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _HeightBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _WidthBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _ImageVAlignBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _ImageHAlignBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.ComboBox _PageSizeBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoRotateBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.GroupBox _MarginGroupBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _SyncMarginsBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _RightMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _LeftMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _BottomMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _TopMarginBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.GroupBox _PdfGroupBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ResizePdfPagesBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ScalePdfPagesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _IgnoreLeadingNumbersBox;\r\n\t\tprivate System.Windows.Forms.TabPage _ViewerSettingsPage;\r\n\t\tprivate ViewerPreferenceEditor _ViewerSettingsEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _DocumentInfoPage;\r\n\t\tprivate DocumentInfoEditor _DocumentInfoEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _PageLabelsPage;\r\n\t\tprivate PageLabelEditor _PageLabelEditor;\r\n\t\tprivate System.Windows.Forms.CheckBox _RecompressImageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FullCompressionBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoBookmarkTitleBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _SubFoldersBeforeFilesBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _NumericAwareSortBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveOrphanBoomarksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepSourcePdfBookmarkBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _CajSortBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _UnifyOrientationBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _RotationBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _SourceOrientationBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _DeduplicateBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox3;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.RadioButton _ExcludeSubFoldersBox;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.RadioButton _SubFolderWithFilesBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _DpiYBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _DpiXBox;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t\tprivate System.Windows.Forms.CheckBox _ExtraEmptyPageBox;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/MergerOptionForm.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class MergerOptionForm : Form, IResettableControl\r\n\t{\r\n\t\tstring paperName;\r\n\t\tbool _uiLockDown;\r\n\r\n\t\tpublic MergerOptionForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tthis.SetIcon(Properties.Resources.PdfOptions);\r\n\t\t\tMinimumSize = Size;\r\n\r\n\t\t\t_AutoBookmarkTitleBox.CheckedChanged += CheckBoxChanged;\r\n\t\t\t_KeepSourcePdfBookmarkBox.CheckedChanged += CheckBoxChanged;\r\n\t\t\t_UnifyOrientationBox.CheckedChanged += CheckBoxChanged;\r\n\t\t\t_SubFoldersBeforeFilesBox.Checked = true;\r\n\t\t\t_PageSizeBox.Items.AddRange(Array.FindAll(Processor.PdfDocumentCreator.PaperSizes, i => i.SpecialSize < SpecialPaperSize.AsSpecificPage));\r\n\t\t\t_ImageHAlignBox.Items.Add(\"水平居中\");\r\n\t\t\t_ImageHAlignBox.Items.Add(\"左对齐\");\r\n\t\t\t_ImageHAlignBox.Items.Add(\"右对齐\");\r\n\t\t\t_ImageVAlignBox.Items.Add(\"垂直居中\");\r\n\t\t\t_ImageVAlignBox.Items.Add(\"置顶\");\r\n\t\t\t_ImageVAlignBox.Items.Add(\"置底\");\r\n\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tAppContext.Merger = new MergerOptions();\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\t_uiLockDown = true;\r\n\t\t\tvar options = AppContext.Merger;\r\n\t\t\tvar ps = options.PageSettings;\r\n\t\t\t_AutoBookmarkTitleBox.Checked = options.AutoBookmarkTitle;\r\n\t\t\t_AutoMaskBWImageBox.Checked = options.AutoMaskBWImages;\r\n\t\t\t_AutoRotateBox.Checked = ps.AutoRotation;\r\n\t\t\t_AutoScaleDownBox.Checked = options.AutoScaleDown;\r\n\t\t\t_AutoScaleUpBox.Checked = options.AutoScaleUp;\r\n\t\t\t_BottomMarginBox.SetValue(ps.Margins.Bottom / Constants.Units.CmToPoint);\r\n\t\t\t_CajSortBox.Checked = options.CajSort;\r\n\t\t\t_HeightBox.SetValue(ps.PaperSize.Height / Constants.Units.CmToPoint);\r\n\t\t\t_IgnoreLeadingNumbersBox.Checked = options.IgnoreLeadingNumbers;\r\n\t\t\t_ImageHAlignBox.SelectedIndex = (int)ps.HorizontalAlign;\r\n\t\t\t_ImageVAlignBox.SelectedIndex = (int)ps.VerticalAlign;\r\n\t\t\t_KeepSourcePdfBookmarkBox.Checked = options.KeepBookmarks;\r\n\t\t\t_LeftMarginBox.SetValue(ps.Margins.Left / Constants.Units.CmToPoint);\r\n\t\t\tfor (int i = 0; i < _PageSizeBox.Items.Count; i++) {\r\n\t\t\t\tvar p = _PageSizeBox.Items[i] as PaperSize;\r\n\t\t\t\tif (p.PaperName == ps.PaperSize.PaperName) {\r\n\t\t\t\t\t_PageSizeBox.SelectedIndex = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_PageSizeBox.SelectedIndex == -1) {\r\n\t\t\t\t_PageSizeBox.SelectedIndex = 0;\r\n\t\t\t}\r\n\t\t\t_NumericAwareSortBox.Checked = options.NumericAwareSort;\r\n\t\t\t_RemoveOrphanBoomarksBox.Checked = options.RemoveOrphanBookmarks;\r\n\t\t\t_ResizePdfPagesBox.Checked = ps.ScaleContent == false;\r\n\t\t\t_ExtraEmptyPageBox.Checked = options.ExtraEmptyPageForOddPdf;\r\n\t\t\t_RightMarginBox.SetValue(ps.Margins.Right / Constants.Units.CmToPoint);\r\n\t\t\tswitch (options.SubFolder) {\r\n\t\t\t\tcase MergerOptions.SubFolderPosition.BeforeFiles:\r\n\t\t\t\t\t_SubFoldersBeforeFilesBox.Checked = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase MergerOptions.SubFolderPosition.WithFiles:\r\n\t\t\t\t\t_SubFolderWithFilesBox.Checked = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase MergerOptions.SubFolderPosition.Exclude:\r\n\t\t\t\t\t_ExcludeSubFoldersBox.Checked = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t_ScalePdfPagesBox.Checked = ps.ScaleContent;\r\n\t\t\t_TopMarginBox.SetValue(ps.Margins.Top / Constants.Units.CmToPoint);\r\n\t\t\t_WidthBox.SetValue(ps.PaperSize.Width / Constants.Units.CmToPoint);\r\n\t\t\tif (_PageSizeBox.SelectedIndex == 0) {\r\n\t\t\t\t_HeightBox.Value = 26.01M;\r\n\t\t\t\t_WidthBox.Value = 18M;\r\n\t\t\t}\r\n\r\n\t\t\t_SourceOrientationBox.SelectedIndex = options.RotateVerticalPages ? 1 : 0;\r\n\t\t\t_RotationBox.SelectedIndex = options.RotateAntiClockwise ? 1 : 0;\r\n\t\t\t_UnifyOrientationBox.Checked = options.UnifyPageOrientation;\r\n\t\t\t_DeduplicateBox.Checked = options.Deduplicate;\r\n\t\t\t_RecompressImageBox.Checked = options.RecompressWithJbig2;\r\n\t\t\t_FullCompressionBox.Checked = options.FullCompression;\r\n\t\t\t_DpiXBox.SetValue(options.DpiX);\r\n\t\t\t_DpiYBox.SetValue(options.DpiY);\r\n\t\t\t_DocumentInfoEditor.Options = options.MetaData;\r\n\t\t\t_ViewerSettingsEditor.Options = options.ViewerPreferences;\r\n\t\t\t_PageLabelEditor.Labels = options.PageLabels;\r\n\r\n\t\t\t_uiLockDown = false;\r\n\t\t}\r\n\r\n\t\tprotected override void OnClosed(EventArgs e) {\r\n\t\t\tvar option = AppContext.Merger;\r\n\t\t\tvar ps = option.PageSettings;\r\n\t\t\toption.AutoBookmarkTitle = _AutoBookmarkTitleBox.Checked;\r\n\t\t\toption.AutoMaskBWImages = _AutoMaskBWImageBox.Checked;\r\n\t\t\tps.AutoRotation = _AutoRotateBox.Checked;\r\n\t\t\toption.AutoScaleDown = _AutoScaleDownBox.Checked;\r\n\t\t\toption.AutoScaleUp = _AutoScaleUpBox.Checked;\r\n\t\t\toption.CajSort = _CajSortBox.Checked;\r\n\t\t\tps.Margins.Top = CmToPoint(_TopMarginBox);\r\n\t\t\tps.Margins.Bottom = CmToPoint(_BottomMarginBox);\r\n\t\t\tps.Margins.Left = CmToPoint(_LeftMarginBox);\r\n\t\t\tps.Margins.Right = CmToPoint(_RightMarginBox);\r\n\t\t\toption.NumericAwareSort = _NumericAwareSortBox.Checked;\r\n\t\t\tps.PaperSize.PaperName = paperName;\r\n\t\t\tps.PaperSize.Width = CmToPoint(_WidthBox);\r\n\t\t\tps.PaperSize.Height = CmToPoint(_HeightBox);\r\n\t\t\tps.HorizontalAlign = (Model.HorizontalAlignment)_ImageHAlignBox.SelectedIndex;\r\n\t\t\tps.VerticalAlign = (VerticalAlignment)_ImageVAlignBox.SelectedIndex;\r\n\t\t\tps.ScaleContent = _ScalePdfPagesBox.Checked;\r\n\t\t\toption.SubFolder = _SubFoldersBeforeFilesBox.Checked ? MergerOptions.SubFolderPosition.BeforeFiles\r\n\t\t\t\t: _SubFolderWithFilesBox.Checked ? MergerOptions.SubFolderPosition.WithFiles\r\n\t\t\t\t: MergerOptions.SubFolderPosition.Exclude;\r\n\r\n\t\t\toption.UnifyPageOrientation = _UnifyOrientationBox.Checked;\r\n\t\t\toption.RotateVerticalPages = _SourceOrientationBox.SelectedIndex == 1;\r\n\t\t\toption.RotateAntiClockwise = _RotationBox.SelectedIndex == 1;\r\n\t\t\toption.IgnoreLeadingNumbers = _IgnoreLeadingNumbersBox.Checked;\r\n\t\t\toption.KeepBookmarks = _KeepSourcePdfBookmarkBox.Checked;\r\n\t\t\toption.RemoveOrphanBookmarks = _RemoveOrphanBoomarksBox.Checked;\r\n\t\t\toption.ExtraEmptyPageForOddPdf = _ExtraEmptyPageBox.Checked;\r\n\r\n\t\t\toption.RecompressWithJbig2 = _RecompressImageBox.Checked;\r\n\t\t\toption.FullCompression = _FullCompressionBox.Checked;\r\n\t\t\toption.DpiX = (int)_DpiXBox.Value;\r\n\t\t\toption.DpiY = (int)_DpiYBox.Value;\r\n\t\t\toption.Deduplicate = _DeduplicateBox.Checked;\r\n\t\t}\r\n\r\n\t\tfloat CmToPoint(NumericUpDown box) {\r\n\t\t\treturn (float)box.Value * Constants.Units.CmToPoint;\r\n\t\t}\r\n\r\n\t\tvoid _PageSizeBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\tif (_PageSizeBox.SelectedIndex == -1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar p = _PageSizeBox.SelectedItem as PaperSize;\r\n\t\t\tif (p.Width > 0 && p.Height > 0) {\r\n\t\t\t\t_WidthBox.SetValue((decimal)p.Width / (decimal)100);\r\n\t\t\t\t_HeightBox.SetValue((decimal)p.Height / (decimal)100);\r\n\t\t\t}\r\n\t\t\tpaperName = p.PaperName;\r\n\t\t\tswitch (paperName) {\r\n\t\t\t\tcase PaperSize.FixedWidthAutoHeight:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\tfalse;\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_PdfGroupBox.Enabled =\r\n\t\t\t\t\t_ImageGroupBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PaperSize.AsPageSize:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_PdfGroupBox.Enabled =\r\n\t\t\t\t\t_ImageGroupBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_PdfGroupBox.Enabled =\r\n\t\t\t\t\t_ImageGroupBox.Enabled =\r\n\t\t\t\t\ttrue;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid MarginBox_ValueChanged(object sender, EventArgs e) {\r\n\t\t\tif (_SyncMarginsBox.Checked == false || _uiLockDown) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar c = sender as NumericUpDown;\r\n\t\t\tvar d = c.Value;\r\n\t\t\t_TopMarginBox.Value = _BottomMarginBox.Value = _LeftMarginBox.Value = _RightMarginBox.Value = d;\r\n\t\t}\r\n\r\n\t\tvoid CheckBoxChanged(object sender, EventArgs e) {\r\n\t\t\t_IgnoreLeadingNumbersBox.Enabled = _AutoBookmarkTitleBox.Checked;\r\n\t\t\t_RemoveOrphanBoomarksBox.Enabled = _KeepSourcePdfBookmarkBox.Checked;\r\n\t\t\t_SourceOrientationBox.Enabled = _RotationBox.Enabled = _UnifyOrientationBox.Checked;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/MergerOptionForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/OcrControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class OcrControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._PrintOcrResultBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._OutputOriginalOcrResultBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ConvertToMonoColorBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._SaveOcredImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._CompressWhiteSpaceBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._DetectContentPunctuationsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._DetectColumnsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._StretchBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._OrientBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._OcrLangBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label13 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._WritingDirectionBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label14 = new System.Windows.Forms.Label();\r\n\t\t\tthis._QuantitiveFactorBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._SourceFileControl = new PDFPatcher.SourceFileControl();\r\n\t\t\tthis._BookmarkControl = new PDFPatcher.BookmarkControl();\r\n\t\t\tthis._TargetFileControl = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._ExportBookmarkButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ImportOcrResultButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\tthis.tabControl1.SuspendLayout();\r\n\t\t\tthis.tabPage1.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._QuantitiveFactorBox)).BeginInit();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(3, 12);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"识别页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _PageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._PageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._PageRangeBox.Location = new System.Drawing.Point(98, 9);\r\n\t\t\tthis._PageRangeBox.Name = \"_PageRangeBox\";\r\n\t\t\tthis._PageRangeBox.Size = new System.Drawing.Size(335, 21);\r\n\t\t\tthis._PageRangeBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// tabControl1\r\n\t\t\t// \r\n\t\t\tthis.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage1);\r\n\t\t\tthis.tabControl1.Location = new System.Drawing.Point(13, 124);\r\n\t\t\tthis.tabControl1.Name = \"tabControl1\";\r\n\t\t\tthis.tabControl1.SelectedIndex = 0;\r\n\t\t\tthis.tabControl1.Size = new System.Drawing.Size(447, 194);\r\n\t\t\tthis.tabControl1.TabIndex = 4;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add(this._PrintOcrResultBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._OutputOriginalOcrResultBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._ConvertToMonoColorBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._RemoveSpaceBetweenChineseBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._SaveOcredImageBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._CompressWhiteSpaceBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._DetectContentPunctuationsBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._DetectColumnsBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._StretchBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._OrientBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._OcrLangBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label13);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label5);\r\n\t\t\tthis.tabPage1.Controls.Add(this._WritingDirectionBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label3);\r\n\t\t\tthis.tabPage1.Controls.Add(this._PageRangeBox);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size(439, 168);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"识别选项\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _PrintOcrResultBox\r\n\t\t\t// \r\n\t\t\tthis._PrintOcrResultBox.AutoSize = true;\r\n\t\t\tthis._PrintOcrResultBox.Location = new System.Drawing.Point(6, 150);\r\n\t\t\tthis._PrintOcrResultBox.Name = \"_PrintOcrResultBox\";\r\n\t\t\tthis._PrintOcrResultBox.Size = new System.Drawing.Size(180, 16);\r\n\t\t\tthis._PrintOcrResultBox.TabIndex = 17;\r\n\t\t\tthis._PrintOcrResultBox.Text = \"在日志窗口输出识别后的文本\";\r\n\t\t\tthis._PrintOcrResultBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _OutputOriginalOcrResultBox\r\n\t\t\t// \r\n\t\t\tthis._OutputOriginalOcrResultBox.AutoSize = true;\r\n\t\t\tthis._OutputOriginalOcrResultBox.Location = new System.Drawing.Point(202, 128);\r\n\t\t\tthis._OutputOriginalOcrResultBox.Name = \"_OutputOriginalOcrResultBox\";\r\n\t\t\tthis._OutputOriginalOcrResultBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._OutputOriginalOcrResultBox.TabIndex = 16;\r\n\t\t\tthis._OutputOriginalOcrResultBox.Text = \"保存原始的识别结果\";\r\n\t\t\tthis._OutputOriginalOcrResultBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OutputOriginalOcrResultBox.CheckedChanged += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// _ConvertToMonoColorBox\r\n\t\t\t// \r\n\t\t\tthis._ConvertToMonoColorBox.AutoSize = true;\r\n\t\t\tthis._ConvertToMonoColorBox.Location = new System.Drawing.Point(6, 128);\r\n\t\t\tthis._ConvertToMonoColorBox.Name = \"_ConvertToMonoColorBox\";\r\n\t\t\tthis._ConvertToMonoColorBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._ConvertToMonoColorBox.TabIndex = 12;\r\n\t\t\tthis._ConvertToMonoColorBox.Text = \"转换为黑白图片再识别\";\r\n\t\t\tthis._ConvertToMonoColorBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveSpaceBetweenChineseBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.AutoSize = true;\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.Location = new System.Drawing.Point(202, 106);\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.Name = \"_RemoveSpaceBetweenChineseBox\";\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.TabIndex = 11;\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.Text = \"删除汉字间的空格\";\r\n\t\t\tthis._RemoveSpaceBetweenChineseBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _SaveOcredImageBox\r\n\t\t\t// \r\n\t\t\tthis._SaveOcredImageBox.AutoSize = true;\r\n\t\t\tthis._SaveOcredImageBox.Location = new System.Drawing.Point(202, 150);\r\n\t\t\tthis._SaveOcredImageBox.Name = \"_SaveOcredImageBox\";\r\n\t\t\tthis._SaveOcredImageBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._SaveOcredImageBox.TabIndex = 13;\r\n\t\t\tthis._SaveOcredImageBox.Text = \"保存识别引擎处理的图片\";\r\n\t\t\tthis._SaveOcredImageBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._SaveOcredImageBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _CompressWhiteSpaceBox\r\n\t\t\t// \r\n\t\t\tthis._CompressWhiteSpaceBox.AutoSize = true;\r\n\t\t\tthis._CompressWhiteSpaceBox.Location = new System.Drawing.Point(6, 106);\r\n\t\t\tthis._CompressWhiteSpaceBox.Name = \"_CompressWhiteSpaceBox\";\r\n\t\t\tthis._CompressWhiteSpaceBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._CompressWhiteSpaceBox.TabIndex = 10;\r\n\t\t\tthis._CompressWhiteSpaceBox.Text = \"压缩连续出现的空格\";\r\n\t\t\tthis._CompressWhiteSpaceBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DetectContentPunctuationsBox\r\n\t\t\t// \r\n\t\t\tthis._DetectContentPunctuationsBox.AutoSize = true;\r\n\t\t\tthis._DetectContentPunctuationsBox.Location = new System.Drawing.Point(202, 84);\r\n\t\t\tthis._DetectContentPunctuationsBox.Name = \"_DetectContentPunctuationsBox\";\r\n\t\t\tthis._DetectContentPunctuationsBox.Size = new System.Drawing.Size(192, 16);\r\n\t\t\tthis._DetectContentPunctuationsBox.TabIndex = 9;\r\n\t\t\tthis._DetectContentPunctuationsBox.Text = \"识别目录页的点（……）分隔符\";\r\n\t\t\tthis._DetectContentPunctuationsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DetectColumnsBox\r\n\t\t\t// \r\n\t\t\tthis._DetectColumnsBox.AutoSize = true;\r\n\t\t\tthis._DetectColumnsBox.Location = new System.Drawing.Point(6, 84);\r\n\t\t\tthis._DetectColumnsBox.Name = \"_DetectColumnsBox\";\r\n\t\t\tthis._DetectColumnsBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._DetectColumnsBox.TabIndex = 8;\r\n\t\t\tthis._DetectColumnsBox.Text = \"识别分栏排版\";\r\n\t\t\tthis._DetectColumnsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _StretchBox\r\n\t\t\t// \r\n\t\t\tthis._StretchBox.AutoSize = true;\r\n\t\t\tthis._StretchBox.Location = new System.Drawing.Point(202, 62);\r\n\t\t\tthis._StretchBox.Name = \"_StretchBox\";\r\n\t\t\tthis._StretchBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._StretchBox.TabIndex = 7;\r\n\t\t\tthis._StretchBox.Text = \"纠正倾斜页面\";\r\n\t\t\tthis._StretchBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _OrientBox\r\n\t\t\t// \r\n\t\t\tthis._OrientBox.AutoSize = true;\r\n\t\t\tthis._OrientBox.Location = new System.Drawing.Point(6, 62);\r\n\t\t\tthis._OrientBox.Name = \"_OrientBox\";\r\n\t\t\tthis._OrientBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._OrientBox.TabIndex = 6;\r\n\t\t\tthis._OrientBox.Text = \"检测页面方向\";\r\n\t\t\tthis._OrientBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _OcrLangBox\r\n\t\t\t// \r\n\t\t\tthis._OcrLangBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._OcrLangBox.FormattingEnabled = true;\r\n\t\t\tthis._OcrLangBox.Location = new System.Drawing.Point(295, 36);\r\n\t\t\tthis._OcrLangBox.Name = \"_OcrLangBox\";\r\n\t\t\tthis._OcrLangBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._OcrLangBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// label13\r\n\t\t\t// \r\n\t\t\tthis.label13.AutoSize = true;\r\n\t\t\tthis.label13.Location = new System.Drawing.Point(200, 39);\r\n\t\t\tthis.label13.Name = \"label13\";\r\n\t\t\tthis.label13.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label13.TabIndex = 4;\r\n\t\t\tthis.label13.Text = \"文字识别语言：\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(3, 39);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label5.TabIndex = 2;\r\n\t\t\tthis.label5.Text = \"文字排版方向：\";\r\n\t\t\t// \r\n\t\t\t// _WritingDirectionBox\r\n\t\t\t// \r\n\t\t\tthis._WritingDirectionBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._WritingDirectionBox.FormattingEnabled = true;\r\n\t\t\tthis._WritingDirectionBox.Items.AddRange(new object[] {\r\n            \"自动检测\",\r\n            \"横向\",\r\n            \"纵向\"});\r\n\t\t\tthis._WritingDirectionBox.Location = new System.Drawing.Point(98, 36);\r\n\t\t\tthis._WritingDirectionBox.Name = \"_WritingDirectionBox\";\r\n\t\t\tthis._WritingDirectionBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._WritingDirectionBox.TabIndex = 3;\r\n\t\t\tthis._WritingDirectionBox.SelectedIndexChanged += new System.EventHandler(this.ControlEvent);\r\n\t\t\t// \r\n\t\t\t// label14\r\n\t\t\t// \r\n\t\t\tthis.label14.AutoSize = true;\r\n\t\t\tthis.label14.Location = new System.Drawing.Point(20, 96);\r\n\t\t\tthis.label14.Name = \"label14\";\r\n\t\t\tthis.label14.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label14.TabIndex = 14;\r\n\t\t\tthis.label14.Text = \"尺寸量化因数：\";\r\n\t\t\tthis.label14.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _QuantitiveFactorBox\r\n\t\t\t// \r\n\t\t\tthis._QuantitiveFactorBox.DecimalPlaces = 2;\r\n\t\t\tthis._QuantitiveFactorBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._QuantitiveFactorBox.Location = new System.Drawing.Point(102, 94);\r\n\t\t\tthis._QuantitiveFactorBox.Maximum = new decimal(new int[] {\r\n            2,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._QuantitiveFactorBox.Name = \"_QuantitiveFactorBox\";\r\n\t\t\tthis._QuantitiveFactorBox.Size = new System.Drawing.Size(53, 21);\r\n\t\t\tthis._QuantitiveFactorBox.TabIndex = 15;\r\n\t\t\tthis._QuantitiveFactorBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._QuantitiveFactorBox.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _SourceFileControl\r\n\t\t\t// \r\n\t\t\tthis._SourceFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SourceFileControl.Location = new System.Drawing.Point(9, 3);\r\n\t\t\tthis._SourceFileControl.Name = \"_SourceFileControl\";\r\n\t\t\tthis._SourceFileControl.Size = new System.Drawing.Size(454, 24);\r\n\t\t\tthis._SourceFileControl.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _BookmarkControl\r\n\t\t\t// \r\n\t\t\tthis._BookmarkControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BookmarkControl.LabelText = \"识别结果文件：\";\r\n\t\t\tthis._BookmarkControl.Location = new System.Drawing.Point(9, 33);\r\n\t\t\tthis._BookmarkControl.Name = \"_BookmarkControl\";\r\n\t\t\tthis._BookmarkControl.Size = new System.Drawing.Size(454, 25);\r\n\t\t\tthis._BookmarkControl.TabIndex = 2;\r\n\t\t\tthis._BookmarkControl.UseForBookmarkExport = true;\r\n\t\t\t// \r\n\t\t\t// _TargetFileControl\r\n\t\t\t// \r\n\t\t\tthis._TargetFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetFileControl.Location = new System.Drawing.Point(9, 64);\r\n\t\t\tthis._TargetFileControl.Name = \"_TargetFileControl\";\r\n\t\t\tthis._TargetFileControl.Size = new System.Drawing.Size(454, 25);\r\n\t\t\tthis._TargetFileControl.TabIndex = 16;\r\n\t\t\t// \r\n\t\t\t// _ExportBookmarkButton\r\n\t\t\t// \r\n\t\t\tthis._ExportBookmarkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExportBookmarkButton.Image = global::PDFPatcher.Properties.Resources.Ocr;\r\n\t\t\tthis._ExportBookmarkButton.Location = new System.Drawing.Point(211, 96);\r\n\t\t\tthis._ExportBookmarkButton.Name = \"_ExportBookmarkButton\";\r\n\t\t\tthis._ExportBookmarkButton.Size = new System.Drawing.Size(120, 23);\r\n\t\t\tthis._ExportBookmarkButton.TabIndex = 3;\r\n\t\t\tthis._ExportBookmarkButton.Text = \"识别图像文本(&S)\";\r\n\t\t\tthis._ExportBookmarkButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ExportBookmarkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ExportBookmarkButton.Click += new System.EventHandler(this.Button_Click);\r\n\t\t\t// \r\n\t\t\t// _ImportOcrResultButton\r\n\t\t\t// \r\n\t\t\tthis._ImportOcrResultButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportOcrResultButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ImportOcrResultButton.AnimateGlow = true;\r\n\t\t\tthis._ImportOcrResultButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportOcrResultButton.CornerRadius = 3;\r\n\t\t\tthis._ImportOcrResultButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ImportOcrResultButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ImportOcrResultButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ImportOcrResultButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ImportOcrResultButton.Location = new System.Drawing.Point(337, 95);\r\n\t\t\tthis._ImportOcrResultButton.Name = \"_ImportOcrResultButton\";\r\n\t\t\tthis._ImportOcrResultButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ImportOcrResultButton.ShowFocusBorder = true;\r\n\t\t\tthis._ImportOcrResultButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ImportOcrResultButton.TabIndex = 17;\r\n\t\t\tthis._ImportOcrResultButton.Text = \"写入PDF文档(&X)\";\r\n\t\t\tthis._ImportOcrResultButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ImportOcrResultButton.Click += new System.EventHandler(this.Button_Click);\r\n\t\t\t// \r\n\t\t\t// OcrControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._TargetFileControl);\r\n\t\t\tthis.Controls.Add(this._ExportBookmarkButton);\r\n\t\t\tthis.Controls.Add(this.tabControl1);\r\n\t\t\tthis.Controls.Add(this._SourceFileControl);\r\n\t\t\tthis.Controls.Add(this.label14);\r\n\t\t\tthis.Controls.Add(this._BookmarkControl);\r\n\t\t\tthis.Controls.Add(this._QuantitiveFactorBox);\r\n\t\t\tthis.Controls.Add(this._ImportOcrResultButton);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"OcrControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(475, 333);\r\n\t\t\tthis.tabControl1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._QuantitiveFactorBox)).EndInit();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate SourceFileControl _SourceFileControl;\r\n\t\tprivate BookmarkControl _BookmarkControl;\r\n\t\tprivate System.Windows.Forms.Button _ExportBookmarkButton;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.TextBox _PageRangeBox;\r\n\t\tprivate System.Windows.Forms.TabControl tabControl1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.ComboBox _WritingDirectionBox;\r\n\t\tprivate System.Windows.Forms.Label label14;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _QuantitiveFactorBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _StretchBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _OrientBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _OcrLangBox;\r\n\t\tprivate System.Windows.Forms.Label label13;\r\n\t\tprivate System.Windows.Forms.CheckBox _DetectColumnsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _DetectContentPunctuationsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _CompressWhiteSpaceBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveSpaceBetweenChineseBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _SaveOcredImageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ConvertToMonoColorBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _OutputOriginalOcrResultBox;\r\n\t\tprivate TargetFileControl _TargetFileControl;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ImportOcrResultButton;\r\n\t\tprivate System.Windows.Forms.CheckBox _PrintOcrResultBox;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/OcrControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class OcrControl : FunctionControl, IResettableControl\r\n\t{\r\n\t\tOcrOptions _options;\r\n\r\n\t\tpublic override string FunctionName => \"识别图像文本\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.Ocr;\r\n\r\n\t\tpublic override Button DefaultButton => _ExportBookmarkButton;\r\n\r\n\t\tpublic OcrControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_BookmarkControl.FileDialog.Filter = Constants.FileExtensions.XmlFilter + \"|\" + Constants.FileExtensions.TxtFilter + \"|\" + Constants.FileExtensions.XmlOrTxtFilter;\r\n\r\n\t\t\tAppContext.MainForm.SetTooltip(_SourceFileControl.FileList, \"需要识别文本的 PDF 源文件路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_BookmarkControl.FileList, \"指定识别文本后生成的信息文件或文本文件路径，如路径为空则不输出文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExportBookmarkButton, \"点击此按钮导出识别后的文本到文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ImportOcrResultButton, \"点击此按钮，将识别后的文本内容写入到目标 PDF 文件。\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_PageRangeBox, Messages.PageRanges);\r\n\t\t\tAppContext.MainForm.SetTooltip(_DetectColumnsBox, \"允许将距离较远的文本合并为同一行文本\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_DetectContentPunctuationsBox, \"将三个以上的连续标点替换成“ .... ”\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_CompressWhiteSpaceBox, \"将三个以上连续出现的空格压缩成两个空格\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_OrientBox, \"自动检测页面横竖置放方向\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_StretchBox, \"自动纠直倾斜的页面\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_OutputOriginalOcrResultBox, \"保存原始的未经过优化合并的识别结果（可用于写入 PDF 文档）\");\r\n\r\n\t\t\tvar lb = _OcrLangBox.Items;\r\n\t\t\tif (Processor.ModiOcr.ModiInstalled) {\r\n\t\t\t\tforeach (var item in Constants.Ocr.LangIDs) {\r\n\t\t\t\t\tif (Processor.ModiOcr.IsLanguageInstalled(item)) {\r\n\t\t\t\t\t\tlb.Add(ValueHelper.MapValue(item, Constants.Ocr.LangIDs, Constants.Ocr.LangNames));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (lb.Count == 0) {\r\n\t\t\t\tlb.Add(\"无\");\r\n\t\t\t}\r\n\t\t\t_ExportBookmarkButton.Enabled = Processor.ModiOcr.ModiInstalled;\r\n\t\t\tif (_ExportBookmarkButton.Enabled == false) {\r\n\t\t\t\tAppContext.MainForm.SetTooltip(_OcrLangBox, \"当前系统尚未安装识别引擎，请先安装微软 Office 文字识别引擎，再重新启动程序。\");\r\n\t\t\t}\r\n\t\t\tReload();\r\n\r\n\t\t\tvar d = _BookmarkControl.FileDialog;\r\n\t\t\td.CheckFileExists = false;\r\n\t\t\td.CheckPathExists = false;\r\n\r\n\t\t\tif (d is SaveFileDialog sd) {\r\n\t\t\t\tsd.OverwritePrompt = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tswitch (item.Name) {\r\n\t\t\t\tcase Commands.SaveBookmark:\r\n\t\t\t\t\titem.Text = \"写入PDF文件(&Q)\";\r\n\t\t\t\t\titem.ToolTipText = \"将识别结果写入 PDF 文件\";\r\n\t\t\t\t\tEnableCommand(item, true, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.SaveBookmark:\r\n\t\t\t\t\t_ImportOcrResultButton.PerformClick();\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tAppContext.Ocr = new OcrOptions();\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\t_options = AppContext.Ocr;\r\n\t\t\t_CompressWhiteSpaceBox.Checked = _options.CompressWhiteSpaces;\r\n\t\t\t_ConvertToMonoColorBox.Checked = !_options.PreserveColor;\r\n\t\t\t_DetectColumnsBox.Checked = _options.DetectColumns;\r\n\t\t\t_DetectContentPunctuationsBox.Checked = _options.DetectContentPunctuations;\r\n\t\t\tvar i = Array.IndexOf(Constants.Ocr.LangIDs, _options.OcrLangID);\r\n\t\t\t_OcrLangBox.Select(i > 0 ? i : 0);\r\n\t\t\t_OrientBox.Checked = _options.OrientPage;\r\n\t\t\t_RemoveSpaceBetweenChineseBox.Checked = _options.RemoveWhiteSpacesBetweenChineseCharacters;\r\n\t\t\t_SaveOcredImageBox.Checked = !String.IsNullOrEmpty(_options.SaveOcredImagePath);\r\n\t\t\t_StretchBox.Checked = _options.StretchPage;\r\n\t\t\t_OutputOriginalOcrResultBox.Checked = _options.OutputOriginalOcrResult;\r\n\t\t\t_PrintOcrResultBox.Checked = _options.PrintOcrResult;\r\n\r\n\t\t\t_WritingDirectionBox.Select((int)_options.WritingDirection);\r\n\t\t\t_QuantitiveFactorBox.SetValue(_options.QuantitativeFactor);\r\n\t\t}\r\n\r\n\t\tvoid Button_Click(object sender, EventArgs e) {\r\n\t\t\tif (File.Exists(_SourceFileControl.FirstFile) == false) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (sender == _ImportOcrResultButton) {\r\n\t\t\t\tif (FileHelper.IsPathValid(_TargetFileControl.Text) == false) {\r\n\t\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNameInvalid);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (_BookmarkControl.Text.Length == 0) {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"请指定识别结果文件。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.SourceFiles = _SourceFileControl.Files;\r\n\t\t\tAppContext.BookmarkFile = _BookmarkControl.Text;\r\n\t\t\tAppContext.TargetFile = _TargetFileControl.Text;\r\n\t\t\tif (_SourceFileControl.Files.Length == 1) {\r\n\t\t\t\t_SourceFileControl.FileList.AddHistoryItem();\r\n\t\t\t\tif (_BookmarkControl.Text.Length > 0) {\r\n\t\t\t\t\t_BookmarkControl.FileList.AddHistoryItem();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (sender == _ImportOcrResultButton) {\r\n\t\t\t\t_TargetFileControl.FileList.AddHistoryItem();\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\r\n\t\t\tSyncOptions();\r\n\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tif (sender != _ImportOcrResultButton) {\r\n\t\t\t\tworker.DoWork += OcrExport;\r\n\t\t\t\tworker.RunWorkerAsync(new object[] {\r\n\t\t\t\t\tAppContext.SourceFiles,\r\n\t\t\t\t\tAppContext.BookmarkFile,\r\n\t\t\t\t\t_options\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tworker.DoWork += ImportOcr;\r\n\t\t\t\tworker.RunWorkerAsync(new object[] {\r\n\t\t\t\t\tAppContext.SourceFiles,\r\n\t\t\t\t\tAppContext.BookmarkFile,\r\n\t\t\t\t\tAppContext.TargetFile\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tworker.RunWorkerCompleted += Worker_Completed;\r\n\t\t}\r\n\r\n\t\tvoid Worker_Completed(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\tvar worker = (BackgroundWorker)sender;\r\n\t\t\tworker.RunWorkerCompleted -= Worker_Completed;\r\n\t\t\tworker.DoWork -= OcrExport;\r\n\t\t\tworker.DoWork -= ImportOcr;\r\n\t\t}\r\n\r\n\t\tvoid SyncOptions() {\r\n\t\t\t_options.CompressWhiteSpaces = _CompressWhiteSpaceBox.Checked;\r\n\t\t\t_options.PreserveColor = !_ConvertToMonoColorBox.Checked;\r\n\t\t\t_options.DetectColumns = _DetectColumnsBox.Checked;\r\n\t\t\t_options.DetectContentPunctuations = _DetectContentPunctuationsBox.Checked;\r\n\t\t\t_options.PageRanges = _PageRangeBox.Text;\r\n\t\t\t_options.OcrLangID = ValueHelper.MapValue(_OcrLangBox.Text, Constants.Ocr.LangNames, Constants.Ocr.LangIDs, -1);\r\n\t\t\t_options.OrientPage = _OrientBox.Checked;\r\n\t\t\t_options.OutputOriginalOcrResult = _OutputOriginalOcrResultBox.Checked;\r\n\t\t\t_options.QuantitativeFactor = (float)_QuantitiveFactorBox.Value;\r\n\t\t\t_options.PrintOcrResult = _PrintOcrResultBox.Checked;\r\n\t\t\t_options.RemoveWhiteSpacesBetweenChineseCharacters = _RemoveSpaceBetweenChineseBox.Checked;\r\n\t\t\t_options.StretchPage = _StretchBox.Checked;\r\n\t\t\t// _options.SaveOcredImagePath = String.IsNullOrEmpty (this._BookmarkControl.Text) ? null : Common.FileHelper.CombinePath (Path.GetDirectoryName (this._BookmarkControl.Text), Path.GetFileNameWithoutExtension (_BookmarkControl.Text) + Constants.FileExtensions.Tif);\r\n\t\t\t_options.WritingDirection = (WritingDirection)_WritingDirectionBox.SelectedIndex;\r\n\t\t}\r\n\r\n\t\tvoid OcrExport(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar a = e.Argument as object[];\r\n\t\t\tvar files = a[0] as string[];\r\n\t\t\tvar b = a[1] as string;\r\n\t\t\tvar options = a[2] as OcrOptions;\r\n\t\t\tif (files.Length > 1) {\r\n\t\t\t\tvar p = Path.GetDirectoryName(b);\r\n\t\t\t\tvar ext = Path.GetExtension(b);\r\n\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\tProcessor.Worker.Ocr(file, FileHelper.CombinePath(p, Path.GetFileNameWithoutExtension(file) + ext), options);\r\n\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tProcessor.Worker.Ocr(files[0], b, options);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ImportOcr(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar a = e.Argument as object[];\r\n\t\t\tvar files = a[0] as string[];\r\n\t\t\tvar b = a[1] as string;\r\n\t\t\tvar target = a[2] as string;\r\n\t\t\tif (files.Length > 1) {\r\n\t\t\t\tvar p = Path.GetDirectoryName(b);\r\n\t\t\t\tvar ext = Path.GetExtension(b);\r\n\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\tProcessor.Worker.ImportOcr(file, FileHelper.CombinePath(p, Path.GetFileNameWithoutExtension(file) + ext), target);\r\n\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tProcessor.Worker.ImportOcr(files[0], b, target);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ImportLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {\r\n\t\t\tAppContext.MainForm.SelectFunctionList(Function.Patcher);\r\n\t\t}\r\n\r\n\t\tvoid ControlEvent(object sender, EventArgs e) {\r\n\t\t\tif (sender == _WritingDirectionBox) {\r\n\t\t\t\t_DetectColumnsBox.Enabled = _WritingDirectionBox.SelectedIndex != 0;\r\n\t\t\t}\r\n\t\t\telse if (sender == _OutputOriginalOcrResultBox) {\r\n\t\t\t\t_DetectColumnsBox.Enabled\r\n\t\t\t\t\t= _DetectContentPunctuationsBox.Enabled\r\n\t\t\t\t\t= _CompressWhiteSpaceBox.Enabled\r\n\t\t\t\t\t= _RemoveSpaceBetweenChineseBox.Enabled\r\n\t\t\t\t\t= !_OutputOriginalOcrResultBox.Checked;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/OcrControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/PasswordEntryForm.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class PasswordEntryForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._PasswordBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._MessageLabel = new System.Windows.Forms.Label ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (12, 46);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (191, 12);\r\n\t\t\tthis.label1.TabIndex = 0;\r\n\t\t\tthis.label1.Text = \"请输入 PDF 文件的编辑权限密码：\";\r\n\t\t\t// \r\n\t\t\t// _PasswordBox\r\n\t\t\t// \r\n\t\t\tthis._PasswordBox.Location = new System.Drawing.Point (14, 61);\r\n\t\t\tthis._PasswordBox.Name = \"_PasswordBox\";\r\n\t\t\tthis._PasswordBox.PasswordChar = '★';\r\n\t\t\tthis._PasswordBox.Size = new System.Drawing.Size (274, 21);\r\n\t\t\tthis._PasswordBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point (132, 88);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 2;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler (this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point (213, 88);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 3;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler (this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MessageLabel\r\n\t\t\t// \r\n\t\t\tthis._MessageLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._MessageLabel.Location = new System.Drawing.Point (12, 9);\r\n\t\t\tthis._MessageLabel.Name = \"_MessageLabel\";\r\n\t\t\tthis._MessageLabel.Size = new System.Drawing.Size (275, 37);\r\n\t\t\tthis._MessageLabel.TabIndex = 4;\r\n\t\t\tthis._MessageLabel.Text = \"PDF 文件已被加密，需要编辑权限密码才能打开。\";\r\n\t\t\t// \r\n\t\t\t// PasswordEntryForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (300, 123);\r\n\t\t\tthis.Controls.Add (this._MessageLabel);\r\n\t\t\tthis.Controls.Add (this._CancelButton);\r\n\t\t\tthis.Controls.Add (this._OkButton);\r\n\t\t\tthis.Controls.Add (this._PasswordBox);\r\n\t\t\tthis.Controls.Add (this.label1);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"PasswordEntryForm\";\r\n\t\t\tthis.ShowIcon = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"输入密码\";\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.TextBox _PasswordBox;\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label _MessageLabel;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/PasswordEntryForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic partial class PasswordEntryForm : Form\r\n\t{\r\n\t\tpublic PasswordEntryForm(string sourceFile) {\r\n\t\t\tInitializeComponent();\r\n\r\n\t\t\tsourceFile = System.IO.Path.GetFileName(sourceFile);\r\n\t\t\tText += \"：\" + sourceFile;\r\n\t\t\t_MessageLabel.Text = _MessageLabel.Text.Replace(\"PDF 文件\", $\"PDF 文件 {sourceFile} \");\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取密码框的文本。\r\n\t\t/// </summary>\r\n\t\tpublic string Password => _PasswordBox.Text;\r\n\r\n\t\tprivate void _OkButton_Click(object sender, EventArgs e) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tprivate void _CancelButton_Click(object sender, EventArgs e) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PasswordEntryForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/PatcherControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class PatcherControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton _Sort;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Delete;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAll;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InvertSelection;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectNone;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Copy;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RefreshInfo;\r\n\t\t\tthis._SortMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SortByNaturalNumberItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortByAlphaItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RefreshInfoMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._AddFilesButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RecentFileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._RefreshInfoButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._SelectionMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SelectionMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ItemList = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageCountColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._TitleColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._AuthorColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._SubjectColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._KeywordsColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FolderColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FileTimeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItemListMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._FileTypeList = new System.Windows.Forms.ImageList(this.components);\r\n\t\t\tthis._OpenPdfBox = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis._AutoClearListBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._AddDocumentWorker = new System.ComponentModel.BackgroundWorker();\r\n\t\t\tthis._TargetPdfFile = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._ActionsBox = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._ActionNameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItemActionsContainerBox = new System.Windows.Forms.SplitContainer();\r\n\t\t\tthis._ConfigButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ImportButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\t_Sort = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\t_Delete = new System.Windows.Forms.ToolStripButton();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_SelectAll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InvertSelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectNone = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Copy = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RefreshInfo = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortMenu.SuspendLayout();\r\n\t\t\tthis._MainToolbar.SuspendLayout();\r\n\t\t\tthis._SelectionMenu.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).BeginInit();\r\n\t\t\tthis._ItemListMenu.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ActionsBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemActionsContainerBox)).BeginInit();\r\n\t\t\tthis._ItemActionsContainerBox.Panel1.SuspendLayout();\r\n\t\t\tthis._ItemActionsContainerBox.Panel2.SuspendLayout();\r\n\t\t\tthis._ItemActionsContainerBox.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _Sort\r\n\t\t\t// \r\n\t\t\t_Sort.DropDown = this._SortMenu;\r\n\t\t\t_Sort.Image = global::PDFPatcher.Properties.Resources.Sort;\r\n\t\t\t_Sort.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Sort.Name = \"_Sort\";\r\n\t\t\t_Sort.Size = new System.Drawing.Size(61, 22);\r\n\t\t\t_Sort.Text = \"排序\";\r\n\t\t\t_Sort.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortMenu\r\n\t\t\t// \r\n\t\t\tthis._SortMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._SortByNaturalNumberItem,\r\n            this._SortByAlphaItem});\r\n\t\t\tthis._SortMenu.Name = \"_SortMenu\";\r\n\t\t\tthis._SortMenu.Size = new System.Drawing.Size(217, 48);\r\n\t\t\tthis._SortMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortByNaturalNumberItem\r\n\t\t\t// \r\n\t\t\tthis._SortByNaturalNumberItem.Image = global::PDFPatcher.Properties.Resources.NaturalSort;\r\n\t\t\tthis._SortByNaturalNumberItem.Name = \"_SortByNaturalNumberItem\";\r\n\t\t\tthis._SortByNaturalNumberItem.Size = new System.Drawing.Size(216, 22);\r\n\t\t\tthis._SortByNaturalNumberItem.Text = \"按数值和字母顺序排序(&M)\";\r\n\t\t\t// \r\n\t\t\t// _SortByAlphaItem\r\n\t\t\t// \r\n\t\t\tthis._SortByAlphaItem.Image = global::PDFPatcher.Properties.Resources.AlphabeticSort;\r\n\t\t\tthis._SortByAlphaItem.Name = \"_SortByAlphaItem\";\r\n\t\t\tthis._SortByAlphaItem.Size = new System.Drawing.Size(216, 22);\r\n\t\t\tthis._SortByAlphaItem.Text = \"按字母顺序排序(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _Delete\r\n\t\t\t// \r\n\t\t\t_Delete.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\t_Delete.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Delete.Name = \"_Delete\";\r\n\t\t\t_Delete.Size = new System.Drawing.Size(76, 22);\r\n\t\t\t_Delete.Text = \"删除文件\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _SelectAll\r\n\t\t\t// \r\n\t\t\t_SelectAll.Image = global::PDFPatcher.Properties.Resources.SelectAll;\r\n\t\t\t_SelectAll.Name = \"_SelectAll\";\r\n\t\t\t_SelectAll.Size = new System.Drawing.Size(124, 22);\r\n\t\t\t_SelectAll.Text = \"全部选中\";\r\n\t\t\t// \r\n\t\t\t// _InvertSelection\r\n\t\t\t// \r\n\t\t\t_InvertSelection.Name = \"_InvertSelection\";\r\n\t\t\t_InvertSelection.Size = new System.Drawing.Size(124, 22);\r\n\t\t\t_InvertSelection.Text = \"反转选择\";\r\n\t\t\t// \r\n\t\t\t// _SelectNone\r\n\t\t\t// \r\n\t\t\t_SelectNone.Name = \"_SelectNone\";\r\n\t\t\t_SelectNone.Size = new System.Drawing.Size(124, 22);\r\n\t\t\t_SelectNone.Text = \"取消选择\";\r\n\t\t\t// \r\n\t\t\t// _Copy\r\n\t\t\t// \r\n\t\t\t_Copy.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\t_Copy.Name = \"_Copy\";\r\n\t\t\t_Copy.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_Copy.Text = \"复制列表内容\";\r\n\t\t\t// \r\n\t\t\t// _RefreshInfo\r\n\t\t\t// \r\n\t\t\t_RefreshInfo.DropDown = this._RefreshInfoMenu;\r\n\t\t\t_RefreshInfo.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\t_RefreshInfo.Name = \"_RefreshInfo\";\r\n\t\t\t_RefreshInfo.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_RefreshInfo.Text = \"刷新文档属性\";\r\n\t\t\t// \r\n\t\t\t// _RefreshInfoMenu\r\n\t\t\t// \r\n\t\t\tthis._RefreshInfoMenu.Name = \"_RefreshInfoMenu\";\r\n\t\t\tthis._RefreshInfoMenu.Size = new System.Drawing.Size(181, 26);\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.Dock = System.Windows.Forms.DockStyle.None;\r\n\t\t\tthis._MainToolbar.GripMargin = new System.Windows.Forms.Padding(0);\r\n\t\t\tthis._MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AddFilesButton,\r\n            _Sort,\r\n            _Delete,\r\n            toolStripSeparator2,\r\n            this._RefreshInfoButton});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Padding = new System.Windows.Forms.Padding(0, 0, 2, 0);\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size(367, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 0;\r\n\t\t\tthis._MainToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _AddFilesButton\r\n\t\t\t// \r\n\t\t\tthis._AddFilesButton.DropDown = this._RecentFileMenu;\r\n\t\t\tthis._AddFilesButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddFilesButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilesButton.Name = \"_AddFilesButton\";\r\n\t\t\tthis._AddFilesButton.Size = new System.Drawing.Size(103, 22);\r\n\t\t\tthis._AddFilesButton.Text = \"添加文件(&T)\";\r\n\t\t\tthis._AddFilesButton.ToolTipText = \"添加需要合并的文件到处理列表\";\r\n\t\t\t// \r\n\t\t\t// _RecentFileMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFileMenu.Name = \"_RecentFileMenu\";\r\n\t\t\tthis._RecentFileMenu.ShowImageMargin = false;\r\n\t\t\tthis._RecentFileMenu.Size = new System.Drawing.Size(36, 4);\r\n\t\t\t// \r\n\t\t\t// _RefreshInfoButton\r\n\t\t\t// \r\n\t\t\tthis._RefreshInfoButton.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\tthis._RefreshInfoButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._RefreshInfoButton.Name = \"_RefreshInfoButton\";\r\n\t\t\tthis._RefreshInfoButton.Size = new System.Drawing.Size(112, 22);\r\n\t\t\tthis._RefreshInfoButton.Text = \"刷新文档属性\";\r\n\t\t\t// \r\n\t\t\t// _SelectionMenu\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _SelectAll,\r\n            _InvertSelection,\r\n            _SelectNone});\r\n\t\t\tthis._SelectionMenu.Name = \"_SelectionMenu\";\r\n\t\t\tthis._SelectionMenu.Size = new System.Drawing.Size(125, 70);\r\n\t\t\tthis._SelectionMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SelectionMenuItem\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenuItem.DropDown = this._SelectionMenu;\r\n\t\t\tthis._SelectionMenuItem.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\tthis._SelectionMenuItem.Name = \"_SelectionMenuItem\";\r\n\t\t\tthis._SelectionMenuItem.Size = new System.Drawing.Size(148, 22);\r\n\t\t\tthis._SelectionMenuItem.Text = \"选择文件\";\r\n\t\t\t// \r\n\t\t\t// _ItemList\r\n\t\t\t// \r\n\t\t\tthis._ItemList.AllColumns.Add(this._NameColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._PageCountColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._TitleColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._AuthorColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._SubjectColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._KeywordsColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FolderColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FileTimeColumn);\r\n\t\t\tthis._ItemList.AllowDrop = true;\r\n\t\t\tthis._ItemList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ItemList.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._ItemList.CellEditUseWholeCell = false;\r\n\t\t\tthis._ItemList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._PageCountColumn,\r\n            this._TitleColumn,\r\n            this._AuthorColumn,\r\n            this._SubjectColumn,\r\n            this._KeywordsColumn,\r\n            this._FolderColumn,\r\n            this._FileTimeColumn});\r\n\t\t\tthis._ItemList.ContextMenuStrip = this._ItemListMenu;\r\n\t\t\tthis._ItemList.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._ItemList.GridLines = true;\r\n\t\t\tthis._ItemList.HideSelection = false;\r\n\t\t\tthis._ItemList.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._ItemList.Name = \"_ItemList\";\r\n\t\t\tthis._ItemList.ShowGroups = false;\r\n\t\t\tthis._ItemList.Size = new System.Drawing.Size(544, 225);\r\n\t\t\tthis._ItemList.SmallImageList = this._FileTypeList;\r\n\t\t\tthis._ItemList.TabIndex = 0;\r\n\t\t\tthis._ItemList.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ItemList.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._ItemList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this._ImageList_ColumnClick);\r\n\t\t\t// \r\n\t\t\t// _NameColumn\r\n\t\t\t// \r\n\t\t\tthis._NameColumn.Text = \"源文件名\";\r\n\t\t\tthis._NameColumn.Width = 149;\r\n\t\t\t// \r\n\t\t\t// _PageCountColumn\r\n\t\t\t// \r\n\t\t\tthis._PageCountColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._PageCountColumn.IsEditable = false;\r\n\t\t\tthis._PageCountColumn.Text = \"页数\";\r\n\t\t\tthis._PageCountColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._PageCountColumn.Width = 50;\r\n\t\t\t// \r\n\t\t\t// _TitleColumn\r\n\t\t\t// \r\n\t\t\tthis._TitleColumn.Text = \"标题\";\r\n\t\t\t// \r\n\t\t\t// _AuthorColumn\r\n\t\t\t// \r\n\t\t\tthis._AuthorColumn.Text = \"作者\";\r\n\t\t\t// \r\n\t\t\t// _SubjectColumn\r\n\t\t\t// \r\n\t\t\tthis._SubjectColumn.Text = \"主题\";\r\n\t\t\t// \r\n\t\t\t// _KeywordsColumn\r\n\t\t\t// \r\n\t\t\tthis._KeywordsColumn.Text = \"关键词\";\r\n\t\t\tthis._KeywordsColumn.Width = 73;\r\n\t\t\t// \r\n\t\t\t// _FolderColumn\r\n\t\t\t// \r\n\t\t\tthis._FolderColumn.IsEditable = false;\r\n\t\t\tthis._FolderColumn.Text = \"文件夹\";\r\n\t\t\tthis._FolderColumn.Width = 96;\r\n\t\t\t// \r\n\t\t\t// _FileTimeColumn\r\n\t\t\t// \r\n\t\t\tthis._FileTimeColumn.IsEditable = false;\r\n\t\t\tthis._FileTimeColumn.Text = \"修改时间\";\r\n\t\t\tthis._FileTimeColumn.Width = 145;\r\n\t\t\t// \r\n\t\t\t// _ItemListMenu\r\n\t\t\t// \r\n\t\t\tthis._ItemListMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Copy,\r\n            _RefreshInfo,\r\n            this._SelectionMenuItem});\r\n\t\t\tthis._ItemListMenu.Name = \"_ItemListMenu\";\r\n\t\t\tthis._ItemListMenu.Size = new System.Drawing.Size(149, 70);\r\n\t\t\tthis._ItemListMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _FileTypeList\r\n\t\t\t// \r\n\t\t\tthis._FileTypeList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;\r\n\t\t\tthis._FileTypeList.ImageSize = new System.Drawing.Size(16, 16);\r\n\t\t\tthis._FileTypeList.TransparentColor = System.Drawing.Color.Transparent;\r\n\t\t\t// \r\n\t\t\t// _OpenPdfBox\r\n\t\t\t// \r\n\t\t\tthis._OpenPdfBox.DefaultExt = \"pdf\";\r\n\t\t\tthis._OpenPdfBox.Filter = \"PDF 文件（*.pdf）|*.pdf\";\r\n\t\t\tthis._OpenPdfBox.Multiselect = true;\r\n\t\t\tthis._OpenPdfBox.Title = \"选择需要处理的 PDF 文件\";\r\n\t\t\t// \r\n\t\t\t// _AutoClearListBox\r\n\t\t\t// \r\n\t\t\tthis._AutoClearListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._AutoClearListBox.AutoSize = true;\r\n\t\t\tthis._AutoClearListBox.Checked = true;\r\n\t\t\tthis._AutoClearListBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._AutoClearListBox.Location = new System.Drawing.Point(434, 9);\r\n\t\t\tthis._AutoClearListBox.Name = \"_AutoClearListBox\";\r\n\t\t\tthis._AutoClearListBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._AutoClearListBox.TabIndex = 4;\r\n\t\t\tthis._AutoClearListBox.Text = \"添加文件前清空列表\";\r\n\t\t\tthis._AutoClearListBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AddDocumentWorker\r\n\t\t\t// \r\n\t\t\tthis._AddDocumentWorker.WorkerReportsProgress = true;\r\n\t\t\tthis._AddDocumentWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this._AddDocumentWorker_DoWork);\r\n\t\t\tthis._AddDocumentWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this._AddDocumentWorker_ProgressChanged);\r\n\t\t\tthis._AddDocumentWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this._AddDocumentWorker_RunWorkerCompleted);\r\n\t\t\t// \r\n\t\t\t// _TargetPdfFile\r\n\t\t\t// \r\n\t\t\tthis._TargetPdfFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetPdfFile.Location = new System.Drawing.Point(13, 265);\r\n\t\t\tthis._TargetPdfFile.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._TargetPdfFile.Name = \"_TargetPdfFile\";\r\n\t\t\tthis._TargetPdfFile.Size = new System.Drawing.Size(553, 26);\r\n\t\t\tthis._TargetPdfFile.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// _ActionsBox\r\n\t\t\t// \r\n\t\t\tthis._ActionsBox.AllColumns.Add(this._ActionNameColumn);\r\n\t\t\tthis._ActionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ActionsBox.CellEditUseWholeCell = false;\r\n\t\t\tthis._ActionsBox.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._ActionNameColumn});\r\n\t\t\tthis._ActionsBox.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._ActionsBox.FullRowSelect = true;\r\n\t\t\tthis._ActionsBox.GridLines = true;\r\n\t\t\tthis._ActionsBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._ActionsBox.HideSelection = false;\r\n\t\t\tthis._ActionsBox.Location = new System.Drawing.Point(5, 3);\r\n\t\t\tthis._ActionsBox.Name = \"_ActionsBox\";\r\n\t\t\tthis._ActionsBox.RowHeight = 18;\r\n\t\t\tthis._ActionsBox.ShowGroups = false;\r\n\t\t\tthis._ActionsBox.Size = new System.Drawing.Size(126, 176);\r\n\t\t\tthis._ActionsBox.TabIndex = 18;\r\n\t\t\tthis._ActionsBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ActionsBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _ActionNameColumn\r\n\t\t\t// \r\n\t\t\tthis._ActionNameColumn.Text = \"补丁操作\";\r\n\t\t\tthis._ActionNameColumn.Width = 120;\r\n\t\t\t// \r\n\t\t\t// _ItemActionsContainerBox\r\n\t\t\t// \r\n\t\t\tthis._ItemActionsContainerBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ItemActionsContainerBox.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\r\n\t\t\tthis._ItemActionsContainerBox.Location = new System.Drawing.Point(13, 28);\r\n\t\t\tthis._ItemActionsContainerBox.Name = \"_ItemActionsContainerBox\";\r\n\t\t\t// \r\n\t\t\t// _ItemActionsContainerBox.Panel1\r\n\t\t\t// \r\n\t\t\tthis._ItemActionsContainerBox.Panel1.Controls.Add(this._ItemList);\r\n\t\t\t// \r\n\t\t\t// _ItemActionsContainerBox.Panel2\r\n\t\t\t// \r\n\t\t\tthis._ItemActionsContainerBox.Panel2.Controls.Add(this._ActionsBox);\r\n\t\t\tthis._ItemActionsContainerBox.Panel2Collapsed = true;\r\n\t\t\tthis._ItemActionsContainerBox.Size = new System.Drawing.Size(550, 231);\r\n\t\t\tthis._ItemActionsContainerBox.SplitterDistance = 412;\r\n\t\t\tthis._ItemActionsContainerBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// _ConfigButton\r\n\t\t\t// \r\n\t\t\tthis._ConfigButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ConfigButton.Image = global::PDFPatcher.Properties.Resources.PdfOptions;\r\n\t\t\tthis._ConfigButton.Location = new System.Drawing.Point(253, 297);\r\n\t\t\tthis._ConfigButton.Name = \"_ConfigButton\";\r\n\t\t\tthis._ConfigButton.Size = new System.Drawing.Size(181, 23);\r\n\t\t\tthis._ConfigButton.TabIndex = 11;\r\n\t\t\tthis._ConfigButton.Text = \"设置 P&DF 文件的修改方式\";\r\n\t\t\tthis._ConfigButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ConfigButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImportButton\r\n\t\t\t// \r\n\t\t\tthis._ImportButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ImportButton.AnimateGlow = true;\r\n\t\t\tthis._ImportButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ImportButton.CornerRadius = 3;\r\n\t\t\tthis._ImportButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ImportButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ImportButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ImportButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ImportButton.Location = new System.Drawing.Point(440, 297);\r\n\t\t\tthis._ImportButton.Name = \"_ImportButton\";\r\n\t\t\tthis._ImportButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ImportButton.ShowFocusBorder = true;\r\n\t\t\tthis._ImportButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ImportButton.TabIndex = 12;\r\n\t\t\tthis._ImportButton.Text = \"生成目标文件(&S)\";\r\n\t\t\tthis._ImportButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ImportButton.Click += new System.EventHandler(this._ImportButton_Click);\r\n\t\t\t// \r\n\t\t\t// PatcherControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._ImportButton);\r\n\t\t\tthis.Controls.Add(this._ConfigButton);\r\n\t\t\tthis.Controls.Add(this._MainToolbar);\r\n\t\t\tthis.Controls.Add(this._TargetPdfFile);\r\n\t\t\tthis.Controls.Add(this._ItemActionsContainerBox);\r\n\t\t\tthis.Controls.Add(this._AutoClearListBox);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"PatcherControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(575, 342);\r\n\t\t\tthis._SortMenu.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.PerformLayout();\r\n\t\t\tthis._SelectionMenu.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).EndInit();\r\n\t\t\tthis._ItemListMenu.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ActionsBox)).EndInit();\r\n\t\t\tthis._ItemActionsContainerBox.Panel1.ResumeLayout(false);\r\n\t\t\tthis._ItemActionsContainerBox.Panel2.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemActionsContainerBox)).EndInit();\r\n\t\t\tthis._ItemActionsContainerBox.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _ItemList;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FolderColumn;\r\n\t\tprivate TargetFileControl _TargetPdfFile;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SortMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByNaturalNumberItem;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByAlphaItem;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SelectionMenu;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageCountColumn;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SelectionMenuItem;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _ItemListMenu;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFileMenu;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenPdfBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoClearListBox;\r\n\t\tprivate System.ComponentModel.BackgroundWorker _AddDocumentWorker;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _TitleColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AuthorColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SubjectColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _KeywordsColumn;\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _ActionsBox;\r\n\t\tprivate System.Windows.Forms.SplitContainer _ItemActionsContainerBox;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _ActionNameColumn;\r\n\t\tprivate System.Windows.Forms.ImageList _FileTypeList;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _RefreshInfoButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RefreshInfoMenu;\r\n\t\tprivate System.Windows.Forms.Button _ConfigButton;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ImportButton;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _AddFilesButton;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FileTimeColumn;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PatcherControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class PatcherControl : FunctionControl\r\n\t{\r\n\t\tFileListHelper _listHelper;\r\n\r\n\t\tpublic override string FunctionName => \"批量修改文档\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.DocumentProcessor;\r\n\r\n\t\tpublic override Button DefaultButton => _ImportButton;\r\n\r\n\t\tpublic PatcherControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_MainToolbar.ScaleIcons(16);\r\n\t\t\t_ItemListMenu.ScaleIcons(16);\r\n\t\t\t_RecentFileMenu.ScaleIcons(16);\r\n\t\t\t_RefreshInfoMenu.ScaleIcons(16);\r\n\t\t\t_SelectionMenu.ScaleIcons(16);\r\n\t\t\t_SortMenu.ScaleIcons(16);\r\n\r\n\t\t\tAppContext.MainForm.SetTooltip(_ConfigButton, \"点击此处设置 PDF 文件的修改方式选项\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ActionsBox, \"双击项目编辑操作选项；右键点击项目弹出上下文菜单\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ItemList, \"在此添加需要补丁修改的 PDF 文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ImportButton, \"点击此按钮执行补丁生成新的 PDF 文件，该文件具有信息文件和 PDF 选项中的设定\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetPdfFile.FileList, \"生成的目标 PDF 文件路径（鼠标右键点击列表可插入文件名替代符）\");\r\n\t\t\t_ItemList.EmptyListMsg = \"请使用“添加文件”按钮添加需要处理的 PDF 文件，或从资源管理器拖放文件到本列表框\";\r\n\r\n\t\t\t_ConfigButton.Click += (s, args) => AppContext.MainForm.SelectFunctionList(Function.PatcherOptions);\r\n\r\n\t\t\t_AddFilesButton.ButtonClick += (s, args) => { ExecuteCommand(Commands.Open); };\r\n\t\t\t_AddFilesButton.DropDownOpening += FileListHelper.OpenPdfButtonDropDownOpeningHandler;\r\n\t\t\t_AddFilesButton.DropDownItemClicked += (s, args) => {\r\n\t\t\t\t_RecentFileMenu.Hide();\r\n\t\t\t\tExecuteCommand(Commands.OpenFile, args.ClickedItem.ToolTipText);\r\n\t\t\t};\r\n\r\n\t\t\t_TargetPdfFile.FileMacroMenu.LoadStandardInfoMacros();\r\n\t\t\t_TargetPdfFile.FileMacroMenu.LoadStandardSourceFileMacros();\r\n\t\t\t_TargetPdfFile.BrowseForFile += FileControl_BrowseForFile;\r\n\t\t\t_TargetPdfFile.TargetFileChangedByBrowseButton += (s, args) => {\r\n\t\t\t\tint i;\r\n\t\t\t\tvar f = _TargetPdfFile.FileDialog.FileName;\r\n\t\t\t\tif (_ItemList.Items.Count > 1 && (i = f.LastIndexOf(Path.DirectorySeparatorChar)) != -1) {\r\n\t\t\t\t\t_TargetPdfFile.Text = String.Concat(f.Substring(0, i), Path.DirectorySeparatorChar, Constants.FileNameMacros.FileName, Path.GetExtension(f));\r\n\t\t\t\t\targs.Cancel = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tvar fi = _FileTypeList.Images;\r\n\t\t\tfi.AddRange(new System.Drawing.Image[] {\r\n\t\t\t\tProperties.Resources.OriginalPdfFile\r\n\t\t\t});\r\n\r\n\t\t\t_ItemList.FixEditControlWidth();\r\n\t\t\t_ItemList.ScaleColumnWidths();\r\n\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0);\r\n\t\t\t_listHelper = new FileListHelper(_ItemList);\r\n\t\t\t_listHelper.SetupHotkeys();\r\n\t\t\t_listHelper.SetupDragAndDrop(AddFiles);\r\n\t\t\tFileListHelper.SetupCommonPdfColumns(_AuthorColumn, _KeywordsColumn, _SubjectColumn, _TitleColumn, _PageCountColumn, _NameColumn, _FolderColumn, _FileTimeColumn);\r\n\t\t\t_RefreshInfoButton.ButtonClick += (s, args) => _listHelper.RefreshInfo(AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t_RefreshInfoButton.DropDown = _RefreshInfoMenu;\r\n\t\t\tforeach (var item in Constants.Encoding.EncodingNames) {\r\n\t\t\t\t_RefreshInfoMenu.Items.Add(item);\r\n\t\t\t}\r\n\t\t\t_RefreshInfoMenu.ItemClicked += (s, args) => {\r\n\t\t\t\t_listHelper.RefreshInfo(ValueHelper.MapValue(args.ClickedItem.Text, Constants.Encoding.EncodingNames, Constants.Encoding.Encodings));\r\n\t\t\t};\r\n\r\n\t\t\tRecentFileItemClicked = (s, args) => {\r\n\t\t\t\targs.ClickedItem.Owner.Hide();\r\n\t\t\t\tAddFiles(new string[] { args.ClickedItem.ToolTipText }, true);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tif (commandName == Commands.Open) {\r\n\t\t\t\tvar b = _OpenPdfBox;\r\n\t\t\t\tif (b.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\tAddFiles(b.FileNames, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.OpenFile) {\r\n\t\t\t\tAddFiles(parameters, true);\r\n\t\t\t}\r\n\t\t\telse if (_listHelper.ProcessCommonMenuCommand(commandName) == false) {\r\n\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tvar n = item.Name;\r\n\t\t\tif (Commands.CommonSelectionCommands.Contains(n) || n == Commands.Delete) {\r\n\t\t\t\titem.Enabled = _ItemList.GetItemCount() > 0 && _ItemList.Focused;\r\n\t\t\t}\r\n\t\t\telse if (n == Commands.Options) {\r\n\t\t\t\titem.Text = \"修改文档设置(&S)...\";\r\n\t\t\t\titem.ToolTipText = \"设置修改后的 PDF 文档\";\r\n\t\t\t\tEnableCommand(item, true, true);\r\n\t\t\t\titem.Tag = nameof(Function.PatcherOptions);\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tvoid FileControl_BrowseForFile(object sender, EventArgs e) {\r\n\t\t\t_listHelper.PrepareSourceFiles();\r\n\t\t}\r\n\r\n\t\tvoid AddFiles(string[] files, bool alertInvalidFiles) {\r\n\t\t\tif (files == null || files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ((ModifierKeys & Keys.Control) != Keys.None || _AutoClearListBox.Checked) {\r\n\t\t\t\t_ItemList.ClearObjects();\r\n\t\t\t}\r\n\t\t\tif (files.Length > 3) {\r\n\t\t\t\tAppContext.MainForm.Enabled = false;\r\n\t\t\t}\r\n\t\t\tif (files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_AddDocumentWorker.RunWorkerAsync(files);\r\n\t\t}\r\n\r\n\t\tvoid _ImportButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar targetPdfFile = _TargetPdfFile.Text.Trim();\r\n\t\t\tif (String.IsNullOrEmpty(targetPdfFile) && String.IsNullOrEmpty(targetPdfFile = _TargetPdfFile.BrowseTargetFile())) {\r\n\t\t\t\tCommon.FormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tif (l == 0) {\r\n\t\t\t\tCommon.FormHelper.InfoBox(\"请添加需要处理的 PDF 文件。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar files = GetSourceItemList();\r\n\t\t\t_TargetPdfFile.FileList.AddHistoryItem();\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar a = arg.Argument as object[];\r\n\t\t\t\tvar t = a[0] as string;\r\n\t\t\t\tif (files.Count > 1) {\r\n\t\t\t\t\tstring targetFolder = null;\r\n\t\t\t\t\tvar m = FileHelper.HasFileNameMacro(t); // 包含替换符\r\n\t\t\t\t\tif (m == false) {\r\n\t\t\t\t\t\ttargetFolder = Path.GetDirectoryName(t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.SetTotalProgressGoal(files.Count);\r\n\t\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\t\tif (file.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\t\t// 确定信息文件名\r\n\t\t\t\t\t\t\t// 优先采用与输入文件同名的 XML 信息文件\r\n\t\t\t\t\t\t\tvar f = new FilePath(FileHelper.CombinePath(file.FolderName, Path.ChangeExtension(file.FileName, Constants.FileExtensions.Xml)));\r\n\t\t\t\t\t\t\tif (f.ExistsFile == false) {\r\n\t\t\t\t\t\t\t\t// 次之采用与输入文件同名的 TXT 信息文件\r\n\t\t\t\t\t\t\t\tf = f.ChangeExtension(Constants.FileExtensions.Txt);\r\n\t\t\t\t\t\t\t\tif (f.ExistsFile == false) {\r\n\t\t\t\t\t\t\t\t\t// 次之采用同一个信息文件\r\n\t\t\t\t\t\t\t\t\tf = file.FilePath.ChangeExtension(Constants.FileExtensions.Xml);\r\n\t\t\t\t\t\t\t\t\tif (f.ExistsFile == false) {\r\n\t\t\t\t\t\t\t\t\t\tf = FilePath.Empty;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tProcessor.Worker.PatchDocument(file as SourceItem.Pdf,\r\n\t\t\t\t\t\t\t\tm ? t : FileHelper.CombinePath(targetFolder, file.FilePath.FileName),\r\n\t\t\t\t\t\t\t\tf.ToString(),\r\n\t\t\t\t\t\t\t\tAppContext.Importer,\r\n\t\t\t\t\t\t\t\tAppContext.Patcher);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(\"输入文件不是 PDF 文件。\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (files[0].Type != SourceItem.ItemType.Pdf) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"输入文件不是 PDF 文件。\");\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tProcessor.Worker.PatchDocument(files[0] as SourceItem.Pdf,\r\n\t\t\t\t\t\tt,\r\n\t\t\t\t\t\ta[1] as string,\r\n\t\t\t\t\t\tAppContext.Importer,\r\n\t\t\t\t\t\tAppContext.Patcher);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerAsync(new object[] { targetPdfFile, null });\r\n\t\t}\r\n\r\n\t\tList<SourceItem> GetSourceItemList() {\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tvar files = new List<SourceItem>(l);\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tvar item = _ItemList.GetModelObject(_ItemList.GetNthItemInDisplayOrder(i).Index) as SourceItem;\r\n\t\t\t\tif (item.Type == SourceItem.ItemType.Pdf\r\n\t\t\t\t\t&& FileHelper.HasExtension(item.FilePath, Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, item.FilePath.ToString());\r\n\t\t\t\t}\r\n\t\t\t\tfiles.Add(item);\r\n\t\t\t}\r\n\t\t\treturn files;\r\n\t\t}\r\n\r\n\t\tvoid _SortMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tswitch (e.ClickedItem.Name) {\r\n\t\t\t\tcase \"_SortByAlphaItem\":\r\n\t\t\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0, false);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SortByNaturalNumberItem\":\r\n\t\t\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ImageList_ColumnClick(object sender, ColumnClickEventArgs e) {\r\n\t\t\tvar c = e.Column;\r\n\t\t\tvar ss = c == 0 || c == _PageCountColumn.Index;\r\n\t\t\tvar o = _ItemList.PrimarySortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;\r\n\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(e.Column, ss, o);\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\t_listHelper.ProcessCommonMenuCommand(e.ClickedItem.Name);\r\n\t\t}\r\n\r\n\t\t#region AddDocumentWorker\r\n\t\tvoid _AddDocumentWorker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar files = e.Argument as string[];\r\n\t\t\tArray.ForEach(files, f => {\r\n\t\t\t\t((BackgroundWorker)sender).ReportProgress(0, f);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\tAppContext.MainForm.Enabled = true;\r\n\t\t\t_listHelper.ResizeItemListColumns();\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {\r\n\t\t\tvar item = e.UserState as string;\r\n\t\t\tAddItem(SourceItem.Create(item));\r\n\t\t}\r\n\r\n\t\tvoid AddItem(SourceItem item) {\r\n\t\t\tif (item is SourceItem.Pdf) {\r\n\t\t\t\tAddItems(new SourceItem[] { item });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid AddItems(System.Collections.ICollection items) {\r\n\t\t\tvar i = _ItemList.GetLastSelectedIndex();\r\n\t\t\t_ItemList.InsertObjects(++i, items);\r\n\t\t\t_ItemList.SelectedIndex = --i + items.Count;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PatcherControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_Sort.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SortMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>135, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_Delete.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectAll.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InvertSelection.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectNone.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Copy.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshInfo.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshInfoMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>137, 56</value>\r\n  </metadata>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>495, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_RecentFileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>614, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectionMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>240, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_ItemListMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>370, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_FileTypeList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 56</value>\r\n  </metadata>\r\n  <metadata name=\"_OpenPdfBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_AddDocumentWorker.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>750, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/PatcherOptionForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class PatcherOptionForm\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OptionsBox = new PDFPatcher.Functions.PatcherOptionsControl();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _OptionsBox\r\n\t\t\t// \r\n\t\t\tthis._OptionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OptionsBox.ForEditor = false;\r\n\t\t\tthis._OptionsBox.Location = new System.Drawing.Point(12, 15);\r\n\t\t\tthis._OptionsBox.Name = \"_OptionsBox\";\r\n\t\t\tthis._OptionsBox.Options = null;\r\n\t\t\tthis._OptionsBox.Size = new System.Drawing.Size(452, 321);\r\n\t\t\tthis._OptionsBox.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// PatcherOptionForm\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(476, 348);\r\n\t\t\tthis.Controls.Add(this._OptionsBox);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.MinimumSize = new System.Drawing.Size(482, 374);\r\n\t\t\tthis.Name = \"PatcherOptionForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.Text = \"PDF 文档选项\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate PatcherOptionsControl _OptionsBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PatcherOptionForm.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class PatcherOptionForm : Form, IResettableControl\r\n\t{\r\n\t\tpublic PatcherOptionForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tthis.SetIcon(Properties.Resources.PdfOptions);\r\n\t\t\t_OptionsBox.Options = AppContext.Patcher;\r\n\t\t\t_OptionsBox.ForEditor = false;\r\n\t\t\t_OptionsBox.OnLoad();\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\t_OptionsBox.Reload();\r\n\t\t}\r\n\r\n\t\tprotected override void OnClosing(CancelEventArgs e) {\r\n\t\t\tbase.OnClosing(e);\r\n\t\t\t_OptionsBox.Apply();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PatcherOptionForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/PatcherOptionsControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class PatcherOptionsControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\r\n\t\tprotected override void Dispose(bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose();\r\n\t\t\t}\r\n\t\t\tbase.Dispose(disposing);\r\n\t\t}\r\n\r\n\t\t#region Component Designer generated code\r\n\r\n\t\t/// <summary> \r\n\t\t/// Required method for Designer support - do not modify \r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent() {\r\n\t\t\tthis._MainTab = new System.Windows.Forms.TabControl();\r\n\t\t\tthis._PageLayoutPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._MarginGroupBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._MarginUnitBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label13 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SyncMarginsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RightMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._LeftMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._BottomMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._TopMarginBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._LayoutGroupBox = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._ImageHAlignBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ImageVAlignBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._ScalePdfPagesBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._ResizePdfPagesBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._HeightBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._WidthBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._PageSizeBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._AutoRotateBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ViewerSettingsPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._CleanerPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox4 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label();\r\n\t\t\tthis._RemoveTrailingCommandCountBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._RemoveLeadingCommandCountBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis._RemovePageFormsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemovePageThumbnailsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemovePageTextBlocksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemovePageLinksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveAnnotationsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemovePageAutoActionsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemovePageMetaDataBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.groupBox3 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._RemoveAttachmentsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveBookmarksBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._FixContentBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveXmlMetaDataBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveDocAutoActionsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._RemoveUsageRightsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._CompressionPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._BinaryThresholdBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._RecompressToBinaryImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._RecompressWithJbig2Box = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._FullCompressionBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._DocumentInfoPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._PageLabelsPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._PageSettingsPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._FontSubstitutionsPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._ConfigPage = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._ResetButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ImportButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._ExportButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.panel1 = new System.Windows.Forms.Panel();\r\n\t\t\tthis._ViewerSettingsEditor = new PDFPatcher.Functions.ViewerPreferenceEditor();\r\n\t\t\tthis._DocumentInfoEditor = new PDFPatcher.Functions.DocumentInfoEditor();\r\n\t\t\tthis._PageLabelEditor = new PDFPatcher.Functions.PageLabelEditor();\r\n\t\t\tthis._PageSettingsEditor = new PDFPatcher.Functions.PageSettingsEditor();\r\n\t\t\tthis._FontSubstitutionsEditor = new PDFPatcher.Functions.FontSubstitutionsEditor();\r\n\t\t\tthis._ThresholdBinaryBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._DitherBinaryBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._MainTab.SuspendLayout();\r\n\t\t\tthis._PageLayoutPage.SuspendLayout();\r\n\t\t\tthis._MarginGroupBox.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).BeginInit();\r\n\t\t\tthis._LayoutGroupBox.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._HeightBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._WidthBox)).BeginInit();\r\n\t\t\tthis._ViewerSettingsPage.SuspendLayout();\r\n\t\t\tthis._CleanerPage.SuspendLayout();\r\n\t\t\tthis.groupBox4.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RemoveTrailingCommandCountBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RemoveLeadingCommandCountBox)).BeginInit();\r\n\t\t\tthis.groupBox3.SuspendLayout();\r\n\t\t\tthis._CompressionPage.SuspendLayout();\r\n\t\t\tthis.groupBox2.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BinaryThresholdBox)).BeginInit();\r\n\t\t\tthis.groupBox1.SuspendLayout();\r\n\t\t\tthis._DocumentInfoPage.SuspendLayout();\r\n\t\t\tthis._PageLabelsPage.SuspendLayout();\r\n\t\t\tthis._PageSettingsPage.SuspendLayout();\r\n\t\t\tthis._FontSubstitutionsPage.SuspendLayout();\r\n\t\t\tthis._ConfigPage.SuspendLayout();\r\n\t\t\tthis.panel1.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _MainTab\r\n\t\t\t// \r\n\t\t\tthis._MainTab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._MainTab.Controls.Add(this._PageLayoutPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._ViewerSettingsPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._CleanerPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._CompressionPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._DocumentInfoPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._PageLabelsPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._PageSettingsPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._FontSubstitutionsPage);\r\n\t\t\tthis._MainTab.Controls.Add(this._ConfigPage);\r\n\t\t\tthis._MainTab.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._MainTab.Name = \"_MainTab\";\r\n\t\t\tthis._MainTab.SelectedIndex = 0;\r\n\t\t\tthis._MainTab.Size = new System.Drawing.Size(446, 315);\r\n\t\t\tthis._MainTab.TabIndex = 2;\r\n\t\t\t// \r\n\t\t\t// _PageLayoutPage\r\n\t\t\t// \r\n\t\t\tthis._PageLayoutPage.Controls.Add(this._MarginGroupBox);\r\n\t\t\tthis._PageLayoutPage.Controls.Add(this._LayoutGroupBox);\r\n\t\t\tthis._PageLayoutPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._PageLayoutPage.Name = \"_PageLayoutPage\";\r\n\t\t\tthis._PageLayoutPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._PageLayoutPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._PageLayoutPage.TabIndex = 8;\r\n\t\t\tthis._PageLayoutPage.Text = \"页面尺寸\";\r\n\t\t\tthis._PageLayoutPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _MarginGroupBox\r\n\t\t\t// \r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._MarginUnitBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label13);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._SyncMarginsBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._RightMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._LeftMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._BottomMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this._TopMarginBox);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label7);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label3);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label6);\r\n\t\t\tthis._MarginGroupBox.Controls.Add(this.label1);\r\n\t\t\tthis._MarginGroupBox.Location = new System.Drawing.Point(6, 137);\r\n\t\t\tthis._MarginGroupBox.Name = \"_MarginGroupBox\";\r\n\t\t\tthis._MarginGroupBox.Size = new System.Drawing.Size(432, 72);\r\n\t\t\tthis._MarginGroupBox.TabIndex = 7;\r\n\t\t\tthis._MarginGroupBox.TabStop = false;\r\n\t\t\tthis._MarginGroupBox.Text = \"调整页边留白\";\r\n\t\t\t// \r\n\t\t\t// _MarginUnitBox\r\n\t\t\t// \r\n\t\t\tthis._MarginUnitBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._MarginUnitBox.FormattingEnabled = true;\r\n\t\t\tthis._MarginUnitBox.Items.AddRange(new object[] {\r\n            \"厘米\",\r\n            \"相对原页面尺寸比例\"});\r\n\t\t\tthis._MarginUnitBox.Location = new System.Drawing.Point(53, 46);\r\n\t\t\tthis._MarginUnitBox.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._MarginUnitBox.Name = \"_MarginUnitBox\";\r\n\t\t\tthis._MarginUnitBox.Size = new System.Drawing.Size(162, 20);\r\n\t\t\tthis._MarginUnitBox.TabIndex = 12;\r\n\t\t\t// \r\n\t\t\t// label13\r\n\t\t\t// \r\n\t\t\tthis.label13.AutoSize = true;\r\n\t\t\tthis.label13.Location = new System.Drawing.Point(7, 48);\r\n\t\t\tthis.label13.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label13.Name = \"label13\";\r\n\t\t\tthis.label13.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label13.TabIndex = 11;\r\n\t\t\tthis.label13.Text = \"单位：\";\r\n\t\t\t// \r\n\t\t\t// _SyncMarginsBox\r\n\t\t\t// \r\n\t\t\tthis._SyncMarginsBox.AutoSize = true;\r\n\t\t\tthis._SyncMarginsBox.Location = new System.Drawing.Point(227, 47);\r\n\t\t\tthis._SyncMarginsBox.Name = \"_SyncMarginsBox\";\r\n\t\t\tthis._SyncMarginsBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._SyncMarginsBox.TabIndex = 9;\r\n\t\t\tthis._SyncMarginsBox.Text = \"同步调整四边留白\";\r\n\t\t\tthis._SyncMarginsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RightMarginBox\r\n\t\t\t// \r\n\t\t\tthis._RightMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._RightMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._RightMarginBox.Location = new System.Drawing.Point(361, 20);\r\n\t\t\tthis._RightMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._RightMarginBox.Minimum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._RightMarginBox.Name = \"_RightMarginBox\";\r\n\t\t\tthis._RightMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._RightMarginBox.TabIndex = 8;\r\n\t\t\tthis._RightMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _LeftMarginBox\r\n\t\t\t// \r\n\t\t\tthis._LeftMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._LeftMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._LeftMarginBox.Location = new System.Drawing.Point(260, 20);\r\n\t\t\tthis._LeftMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftMarginBox.Minimum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._LeftMarginBox.Name = \"_LeftMarginBox\";\r\n\t\t\tthis._LeftMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._LeftMarginBox.TabIndex = 6;\r\n\t\t\tthis._LeftMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _BottomMarginBox\r\n\t\t\t// \r\n\t\t\tthis._BottomMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._BottomMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._BottomMarginBox.Location = new System.Drawing.Point(154, 20);\r\n\t\t\tthis._BottomMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BottomMarginBox.Minimum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._BottomMarginBox.Name = \"_BottomMarginBox\";\r\n\t\t\tthis._BottomMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._BottomMarginBox.TabIndex = 4;\r\n\t\t\tthis._BottomMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// _TopMarginBox\r\n\t\t\t// \r\n\t\t\tthis._TopMarginBox.DecimalPlaces = 2;\r\n\t\t\tthis._TopMarginBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._TopMarginBox.Location = new System.Drawing.Point(53, 20);\r\n\t\t\tthis._TopMarginBox.Maximum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopMarginBox.Minimum = new decimal(new int[] {\r\n            99,\r\n            0,\r\n            0,\r\n            -2147483648});\r\n\t\t\tthis._TopMarginBox.Name = \"_TopMarginBox\";\r\n\t\t\tthis._TopMarginBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._TopMarginBox.TabIndex = 2;\r\n\t\t\tthis._TopMarginBox.ValueChanged += new System.EventHandler(this.MarginBox_ValueChanged);\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(326, 23);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label7.TabIndex = 7;\r\n\t\t\tthis.label7.Text = \"右：\";\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(119, 22);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label3.TabIndex = 3;\r\n\t\t\tthis.label3.Text = \"下：\";\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(225, 23);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label6.TabIndex = 5;\r\n\t\t\tthis.label6.Text = \"左：\";\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(18, 23);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label1.TabIndex = 1;\r\n\t\t\tthis.label1.Text = \"上：\";\r\n\t\t\t// \r\n\t\t\t// _LayoutGroupBox\r\n\t\t\t// \r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._ImageHAlignBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label8);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._ImageVAlignBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._ScalePdfPagesBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._ResizePdfPagesBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._HeightBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._WidthBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label9);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label2);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._PageSizeBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this._AutoRotateBox);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label5);\r\n\t\t\tthis._LayoutGroupBox.Controls.Add(this.label4);\r\n\t\t\tthis._LayoutGroupBox.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis._LayoutGroupBox.Name = \"_LayoutGroupBox\";\r\n\t\t\tthis._LayoutGroupBox.Size = new System.Drawing.Size(432, 125);\r\n\t\t\tthis._LayoutGroupBox.TabIndex = 6;\r\n\t\t\tthis._LayoutGroupBox.TabStop = false;\r\n\t\t\tthis._LayoutGroupBox.Text = \"指定页面布局及尺寸（单位：厘米）\";\r\n\t\t\t// \r\n\t\t\t// _ImageHAlignBox\r\n\t\t\t// \r\n\t\t\tthis._ImageHAlignBox.DisplayMember = \"Key\";\r\n\t\t\tthis._ImageHAlignBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ImageHAlignBox.Location = new System.Drawing.Point(53, 93);\r\n\t\t\tthis._ImageHAlignBox.Name = \"_ImageHAlignBox\";\r\n\t\t\tthis._ImageHAlignBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._ImageHAlignBox.TabIndex = 13;\r\n\t\t\tthis._ImageHAlignBox.ValueMember = \"Value\";\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point(6, 96);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label8.TabIndex = 12;\r\n\t\t\tthis.label8.Text = \"方位：\";\r\n\t\t\t// \r\n\t\t\t// _ImageVAlignBox\r\n\t\t\t// \r\n\t\t\tthis._ImageVAlignBox.DisplayMember = \"Key\";\r\n\t\t\tthis._ImageVAlignBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ImageVAlignBox.Location = new System.Drawing.Point(139, 93);\r\n\t\t\tthis._ImageVAlignBox.Name = \"_ImageVAlignBox\";\r\n\t\t\tthis._ImageVAlignBox.Size = new System.Drawing.Size(76, 20);\r\n\t\t\tthis._ImageVAlignBox.TabIndex = 14;\r\n\t\t\tthis._ImageVAlignBox.ValueMember = \"Value\";\r\n\t\t\t// \r\n\t\t\t// _ScalePdfPagesBox\r\n\t\t\t// \r\n\t\t\tthis._ScalePdfPagesBox.AutoSize = true;\r\n\t\t\tthis._ScalePdfPagesBox.CheckAlign = System.Drawing.ContentAlignment.TopLeft;\r\n\t\t\tthis._ScalePdfPagesBox.Location = new System.Drawing.Point(139, 71);\r\n\t\t\tthis._ScalePdfPagesBox.Name = \"_ScalePdfPagesBox\";\r\n\t\t\tthis._ScalePdfPagesBox.Size = new System.Drawing.Size(143, 16);\r\n\t\t\tthis._ScalePdfPagesBox.TabIndex = 11;\r\n\t\t\tthis._ScalePdfPagesBox.TabStop = true;\r\n\t\t\tthis._ScalePdfPagesBox.Text = \"按比例缩放至页面边缘\";\r\n\t\t\tthis._ScalePdfPagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ResizePdfPagesBox\r\n\t\t\t// \r\n\t\t\tthis._ResizePdfPagesBox.AutoSize = true;\r\n\t\t\tthis._ResizePdfPagesBox.Location = new System.Drawing.Point(53, 71);\r\n\t\t\tthis._ResizePdfPagesBox.Name = \"_ResizePdfPagesBox\";\r\n\t\t\tthis._ResizePdfPagesBox.Size = new System.Drawing.Size(71, 16);\r\n\t\t\tthis._ResizePdfPagesBox.TabIndex = 10;\r\n\t\t\tthis._ResizePdfPagesBox.Text = \"保持不变\";\r\n\t\t\tthis._ResizePdfPagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _HeightBox\r\n\t\t\t// \r\n\t\t\tthis._HeightBox.DecimalPlaces = 2;\r\n\t\t\tthis._HeightBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._HeightBox.Location = new System.Drawing.Point(361, 17);\r\n\t\t\tthis._HeightBox.Maximum = new decimal(new int[] {\r\n            999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._HeightBox.Name = \"_HeightBox\";\r\n\t\t\tthis._HeightBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._HeightBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// _WidthBox\r\n\t\t\t// \r\n\t\t\tthis._WidthBox.DecimalPlaces = 2;\r\n\t\t\tthis._WidthBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._WidthBox.Location = new System.Drawing.Point(260, 17);\r\n\t\t\tthis._WidthBox.Maximum = new decimal(new int[] {\r\n            999,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._WidthBox.Name = \"_WidthBox\";\r\n\t\t\tthis._WidthBox.Size = new System.Drawing.Size(61, 21);\r\n\t\t\tthis._WidthBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(6, 73);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label9.TabIndex = 0;\r\n\t\t\tthis.label9.Text = \"内容：\";\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(6, 21);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label2.TabIndex = 0;\r\n\t\t\tthis.label2.Text = \"尺寸：\";\r\n\t\t\t// \r\n\t\t\t// _PageSizeBox\r\n\t\t\t// \r\n\t\t\tthis._PageSizeBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._PageSizeBox.Location = new System.Drawing.Point(53, 18);\r\n\t\t\tthis._PageSizeBox.Name = \"_PageSizeBox\";\r\n\t\t\tthis._PageSizeBox.Size = new System.Drawing.Size(162, 20);\r\n\t\t\tthis._PageSizeBox.TabIndex = 1;\r\n\t\t\tthis._PageSizeBox.SelectedIndexChanged += new System.EventHandler(this._PageSizeBox_SelectedIndexChanged);\r\n\t\t\t// \r\n\t\t\t// _AutoRotateBox\r\n\t\t\t// \r\n\t\t\tthis._AutoRotateBox.AutoSize = true;\r\n\t\t\tthis._AutoRotateBox.Checked = true;\r\n\t\t\tthis._AutoRotateBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._AutoRotateBox.Location = new System.Drawing.Point(53, 44);\r\n\t\t\tthis._AutoRotateBox.Name = \"_AutoRotateBox\";\r\n\t\t\tthis._AutoRotateBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._AutoRotateBox.TabIndex = 6;\r\n\t\t\tthis._AutoRotateBox.Text = \"适应原始内容纵横方向\";\r\n\t\t\tthis._AutoRotateBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(327, 21);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label5.TabIndex = 4;\r\n\t\t\tthis.label5.Text = \"高：\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(225, 21);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label4.TabIndex = 2;\r\n\t\t\tthis.label4.Text = \"宽：\";\r\n\t\t\t// \r\n\t\t\t// _ViewerSettingsPage\r\n\t\t\t// \r\n\t\t\tthis._ViewerSettingsPage.Controls.Add(this._ViewerSettingsEditor);\r\n\t\t\tthis._ViewerSettingsPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._ViewerSettingsPage.Name = \"_ViewerSettingsPage\";\r\n\t\t\tthis._ViewerSettingsPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._ViewerSettingsPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._ViewerSettingsPage.TabIndex = 4;\r\n\t\t\tthis._ViewerSettingsPage.Text = \"阅读方式\";\r\n\t\t\tthis._ViewerSettingsPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CleanerPage\r\n\t\t\t// \r\n\t\t\tthis._CleanerPage.Controls.Add(this.groupBox4);\r\n\t\t\tthis._CleanerPage.Controls.Add(this.groupBox3);\r\n\t\t\tthis._CleanerPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._CleanerPage.Name = \"_CleanerPage\";\r\n\t\t\tthis._CleanerPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._CleanerPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._CleanerPage.TabIndex = 5;\r\n\t\t\tthis._CleanerPage.Text = \"清理\";\r\n\t\t\tthis._CleanerPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox4\r\n\t\t\t// \r\n\t\t\tthis.groupBox4.Controls.Add(this.label12);\r\n\t\t\tthis.groupBox4.Controls.Add(this.label11);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemoveTrailingCommandCountBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemoveLeadingCommandCountBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this.label10);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemovePageFormsBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemovePageThumbnailsBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemovePageTextBlocksBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemovePageLinksBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemoveAnnotationsBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemovePageAutoActionsBox);\r\n\t\t\tthis.groupBox4.Controls.Add(this._RemovePageMetaDataBox);\r\n\t\t\tthis.groupBox4.Location = new System.Drawing.Point(6, 102);\r\n\t\t\tthis.groupBox4.Name = \"groupBox4\";\r\n\t\t\tthis.groupBox4.Size = new System.Drawing.Size(426, 136);\r\n\t\t\tthis.groupBox4.TabIndex = 1;\r\n\t\t\tthis.groupBox4.TabStop = false;\r\n\t\t\tthis.groupBox4.Text = \"源文档页面\";\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.AutoSize = true;\r\n\t\t\tthis.label12.Location = new System.Drawing.Point(222, 111);\r\n\t\t\tthis.label12.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label12.TabIndex = 10;\r\n\t\t\tthis.label12.Text = \"条指令\";\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point(142, 111);\r\n\t\t\tthis.label11.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label11.TabIndex = 9;\r\n\t\t\tthis.label11.Text = \"结尾\";\r\n\t\t\t// \r\n\t\t\t// _RemoveTrailingCommandCountBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveTrailingCommandCountBox.Location = new System.Drawing.Point(175, 110);\r\n\t\t\tthis._RemoveTrailingCommandCountBox.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._RemoveTrailingCommandCountBox.Name = \"_RemoveTrailingCommandCountBox\";\r\n\t\t\tthis._RemoveTrailingCommandCountBox.Size = new System.Drawing.Size(38, 21);\r\n\t\t\tthis._RemoveTrailingCommandCountBox.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// _RemoveLeadingCommandCountBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveLeadingCommandCountBox.Location = new System.Drawing.Point(88, 110);\r\n\t\t\tthis._RemoveLeadingCommandCountBox.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._RemoveLeadingCommandCountBox.Name = \"_RemoveLeadingCommandCountBox\";\r\n\t\t\tthis._RemoveLeadingCommandCountBox.Size = new System.Drawing.Size(38, 21);\r\n\t\t\tthis._RemoveLeadingCommandCountBox.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(5, 111);\r\n\t\t\tthis.label10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(83, 12);\r\n\t\t\tthis.label10.TabIndex = 7;\r\n\t\t\tthis.label10.Text = \"清除页面开头 \";\r\n\t\t\t// \r\n\t\t\t// _RemovePageFormsBox\r\n\t\t\t// \r\n\t\t\tthis._RemovePageFormsBox.AutoSize = true;\r\n\t\t\tthis._RemovePageFormsBox.Location = new System.Drawing.Point(224, 42);\r\n\t\t\tthis._RemovePageFormsBox.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._RemovePageFormsBox.Name = \"_RemovePageFormsBox\";\r\n\t\t\tthis._RemovePageFormsBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._RemovePageFormsBox.TabIndex = 3;\r\n\t\t\tthis._RemovePageFormsBox.Text = \"清除页面所有表单\";\r\n\t\t\tthis._RemovePageFormsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemovePageThumbnailsBox\r\n\t\t\t// \r\n\t\t\tthis._RemovePageThumbnailsBox.AutoSize = true;\r\n\t\t\tthis._RemovePageThumbnailsBox.Location = new System.Drawing.Point(6, 42);\r\n\t\t\tthis._RemovePageThumbnailsBox.Name = \"_RemovePageThumbnailsBox\";\r\n\t\t\tthis._RemovePageThumbnailsBox.Size = new System.Drawing.Size(108, 16);\r\n\t\t\tthis._RemovePageThumbnailsBox.TabIndex = 2;\r\n\t\t\tthis._RemovePageThumbnailsBox.Text = \"清除页面缩略图\";\r\n\t\t\tthis._RemovePageThumbnailsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemovePageTextBlocksBox\r\n\t\t\t// \r\n\t\t\tthis._RemovePageTextBlocksBox.AutoSize = true;\r\n\t\t\tthis._RemovePageTextBlocksBox.Location = new System.Drawing.Point(6, 86);\r\n\t\t\tthis._RemovePageTextBlocksBox.Name = \"_RemovePageTextBlocksBox\";\r\n\t\t\tthis._RemovePageTextBlocksBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._RemovePageTextBlocksBox.TabIndex = 6;\r\n\t\t\tthis._RemovePageTextBlocksBox.Text = \"清除页面所有文本\";\r\n\t\t\tthis._RemovePageTextBlocksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemovePageLinksBox\r\n\t\t\t// \r\n\t\t\tthis._RemovePageLinksBox.AutoSize = true;\r\n\t\t\tthis._RemovePageLinksBox.Location = new System.Drawing.Point(224, 63);\r\n\t\t\tthis._RemovePageLinksBox.Name = \"_RemovePageLinksBox\";\r\n\t\t\tthis._RemovePageLinksBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._RemovePageLinksBox.TabIndex = 5;\r\n\t\t\tthis._RemovePageLinksBox.Text = \"清除页面所有链接批注\";\r\n\t\t\tthis._RemovePageLinksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveAnnotationsBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveAnnotationsBox.AutoSize = true;\r\n\t\t\tthis._RemoveAnnotationsBox.Location = new System.Drawing.Point(6, 64);\r\n\t\t\tthis._RemoveAnnotationsBox.Name = \"_RemoveAnnotationsBox\";\r\n\t\t\tthis._RemoveAnnotationsBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._RemoveAnnotationsBox.TabIndex = 4;\r\n\t\t\tthis._RemoveAnnotationsBox.Text = \"清除页面所有批注\";\r\n\t\t\tthis._RemoveAnnotationsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemovePageAutoActionsBox\r\n\t\t\t// \r\n\t\t\tthis._RemovePageAutoActionsBox.AutoSize = true;\r\n\t\t\tthis._RemovePageAutoActionsBox.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._RemovePageAutoActionsBox.Name = \"_RemovePageAutoActionsBox\";\r\n\t\t\tthis._RemovePageAutoActionsBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._RemovePageAutoActionsBox.TabIndex = 0;\r\n\t\t\tthis._RemovePageAutoActionsBox.Text = \"禁止页面自动执行动作\";\r\n\t\t\tthis._RemovePageAutoActionsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemovePageMetaDataBox\r\n\t\t\t// \r\n\t\t\tthis._RemovePageMetaDataBox.AutoSize = true;\r\n\t\t\tthis._RemovePageMetaDataBox.Location = new System.Drawing.Point(224, 20);\r\n\t\t\tthis._RemovePageMetaDataBox.Name = \"_RemovePageMetaDataBox\";\r\n\t\t\tthis._RemovePageMetaDataBox.Size = new System.Drawing.Size(198, 16);\r\n\t\t\tthis._RemovePageMetaDataBox.TabIndex = 1;\r\n\t\t\tthis._RemovePageMetaDataBox.Text = \"删除页面扩展标记（XML）元数据\";\r\n\t\t\tthis._RemovePageMetaDataBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox3\r\n\t\t\t// \r\n\t\t\tthis.groupBox3.Controls.Add(this._RemoveAttachmentsBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._RemoveBookmarksBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._FixContentBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._RemoveXmlMetaDataBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._RemoveDocAutoActionsBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._RemoveUsageRightsBox);\r\n\t\t\tthis.groupBox3.Location = new System.Drawing.Point(6, 6);\r\n\t\t\tthis.groupBox3.Name = \"groupBox3\";\r\n\t\t\tthis.groupBox3.Size = new System.Drawing.Size(426, 90);\r\n\t\t\tthis.groupBox3.TabIndex = 0;\r\n\t\t\tthis.groupBox3.TabStop = false;\r\n\t\t\tthis.groupBox3.Text = \"源文档\";\r\n\t\t\t// \r\n\t\t\t// _RemoveAttachmentsBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveAttachmentsBox.AutoSize = true;\r\n\t\t\tthis._RemoveAttachmentsBox.Location = new System.Drawing.Point(224, 64);\r\n\t\t\tthis._RemoveAttachmentsBox.Name = \"_RemoveAttachmentsBox\";\r\n\t\t\tthis._RemoveAttachmentsBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._RemoveAttachmentsBox.TabIndex = 5;\r\n\t\t\tthis._RemoveAttachmentsBox.Text = \"清除所有附件\";\r\n\t\t\tthis._RemoveAttachmentsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveBookmarksBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveBookmarksBox.AutoSize = true;\r\n\t\t\tthis._RemoveBookmarksBox.Location = new System.Drawing.Point(6, 64);\r\n\t\t\tthis._RemoveBookmarksBox.Name = \"_RemoveBookmarksBox\";\r\n\t\t\tthis._RemoveBookmarksBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._RemoveBookmarksBox.TabIndex = 4;\r\n\t\t\tthis._RemoveBookmarksBox.Text = \"删除导航书签\";\r\n\t\t\tthis._RemoveBookmarksBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FixContentBox\r\n\t\t\t// \r\n\t\t\tthis._FixContentBox.AutoSize = true;\r\n\t\t\tthis._FixContentBox.Location = new System.Drawing.Point(224, 42);\r\n\t\t\tthis._FixContentBox.Name = \"_FixContentBox\";\r\n\t\t\tthis._FixContentBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._FixContentBox.TabIndex = 3;\r\n\t\t\tthis._FixContentBox.Text = \"尝试修复文档错误\";\r\n\t\t\tthis._FixContentBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveXmlMetaDataBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveXmlMetaDataBox.AutoSize = true;\r\n\t\t\tthis._RemoveXmlMetaDataBox.Location = new System.Drawing.Point(224, 20);\r\n\t\t\tthis._RemoveXmlMetaDataBox.Name = \"_RemoveXmlMetaDataBox\";\r\n\t\t\tthis._RemoveXmlMetaDataBox.Size = new System.Drawing.Size(198, 16);\r\n\t\t\tthis._RemoveXmlMetaDataBox.TabIndex = 1;\r\n\t\t\tthis._RemoveXmlMetaDataBox.Text = \"删除扩展标记（XML）元数据属性\";\r\n\t\t\tthis._RemoveXmlMetaDataBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveDocAutoActionsBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveDocAutoActionsBox.AutoSize = true;\r\n\t\t\tthis._RemoveDocAutoActionsBox.Location = new System.Drawing.Point(6, 42);\r\n\t\t\tthis._RemoveDocAutoActionsBox.Name = \"_RemoveDocAutoActionsBox\";\r\n\t\t\tthis._RemoveDocAutoActionsBox.Size = new System.Drawing.Size(180, 16);\r\n\t\t\tthis._RemoveDocAutoActionsBox.TabIndex = 2;\r\n\t\t\tthis._RemoveDocAutoActionsBox.Text = \"禁止打开文档时自动执行动作\";\r\n\t\t\tthis._RemoveDocAutoActionsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _RemoveUsageRightsBox\r\n\t\t\t// \r\n\t\t\tthis._RemoveUsageRightsBox.AutoSize = true;\r\n\t\t\tthis._RemoveUsageRightsBox.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._RemoveUsageRightsBox.Name = \"_RemoveUsageRightsBox\";\r\n\t\t\tthis._RemoveUsageRightsBox.Size = new System.Drawing.Size(144, 16);\r\n\t\t\tthis._RemoveUsageRightsBox.TabIndex = 0;\r\n\t\t\tthis._RemoveUsageRightsBox.Text = \"清除复制、打印等限制\";\r\n\t\t\tthis._RemoveUsageRightsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CompressionPage\r\n\t\t\t// \r\n\t\t\tthis._CompressionPage.Controls.Add(this.groupBox2);\r\n\t\t\tthis._CompressionPage.Controls.Add(this.groupBox1);\r\n\t\t\tthis._CompressionPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._CompressionPage.Name = \"_CompressionPage\";\r\n\t\t\tthis._CompressionPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._CompressionPage.TabIndex = 10;\r\n\t\t\tthis._CompressionPage.Text = \"压缩\";\r\n\t\t\tthis._CompressionPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Controls.Add(this._DitherBinaryBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ThresholdBinaryBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._BinaryThresholdBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._RecompressToBinaryImageBox);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point(3, 52);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size(432, 86);\r\n\t\t\tthis.groupBox2.TabIndex = 1;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"有损压缩\";\r\n\t\t\t// \r\n\t\t\t// _BinaryThresholdBox\r\n\t\t\t// \r\n\t\t\tthis._BinaryThresholdBox.Location = new System.Drawing.Point(267, 42);\r\n\t\t\tthis._BinaryThresholdBox.Maximum = new decimal(new int[] {\r\n            255,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BinaryThresholdBox.Minimum = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BinaryThresholdBox.Name = \"_BinaryThresholdBox\";\r\n\t\t\tthis._BinaryThresholdBox.Size = new System.Drawing.Size(52, 21);\r\n\t\t\tthis._BinaryThresholdBox.TabIndex = 2;\r\n\t\t\tthis._BinaryThresholdBox.Value = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\t// \r\n\t\t\t// _RecompressToBinaryImageBox\r\n\t\t\t// \r\n\t\t\tthis._RecompressToBinaryImageBox.AutoSize = true;\r\n\t\t\tthis._RecompressToBinaryImageBox.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._RecompressToBinaryImageBox.Name = \"_RecompressToBinaryImageBox\";\r\n\t\t\tthis._RecompressToBinaryImageBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._RecompressToBinaryImageBox.TabIndex = 0;\r\n\t\t\tthis._RecompressToBinaryImageBox.Text = \"尽量将图片转成黑白\";\r\n\t\t\tthis._RecompressToBinaryImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Controls.Add(this._RecompressWithJbig2Box);\r\n\t\t\tthis.groupBox1.Controls.Add(this._FullCompressionBox);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size(432, 43);\r\n\t\t\tthis.groupBox1.TabIndex = 0;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"无损压缩\";\r\n\t\t\t// \r\n\t\t\t// _RecompressWithJbig2Box\r\n\t\t\t// \r\n\t\t\tthis._RecompressWithJbig2Box.AutoSize = true;\r\n\t\t\tthis._RecompressWithJbig2Box.Location = new System.Drawing.Point(224, 20);\r\n\t\t\tthis._RecompressWithJbig2Box.Name = \"_RecompressWithJbig2Box\";\r\n\t\t\tthis._RecompressWithJbig2Box.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._RecompressWithJbig2Box.TabIndex = 1;\r\n\t\t\tthis._RecompressWithJbig2Box.Text = \"优化黑白图片压缩率\";\r\n\t\t\tthis._RecompressWithJbig2Box.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FullCompressionBox\r\n\t\t\t// \r\n\t\t\tthis._FullCompressionBox.AutoSize = true;\r\n\t\t\tthis._FullCompressionBox.Location = new System.Drawing.Point(6, 20);\r\n\t\t\tthis._FullCompressionBox.Name = \"_FullCompressionBox\";\r\n\t\t\tthis._FullCompressionBox.Size = new System.Drawing.Size(120, 16);\r\n\t\t\tthis._FullCompressionBox.TabIndex = 0;\r\n\t\t\tthis._FullCompressionBox.Text = \"压缩索引表和书签\";\r\n\t\t\tthis._FullCompressionBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DocumentInfoPage\r\n\t\t\t// \r\n\t\t\tthis._DocumentInfoPage.Controls.Add(this._DocumentInfoEditor);\r\n\t\t\tthis._DocumentInfoPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._DocumentInfoPage.Name = \"_DocumentInfoPage\";\r\n\t\t\tthis._DocumentInfoPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._DocumentInfoPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._DocumentInfoPage.TabIndex = 2;\r\n\t\t\tthis._DocumentInfoPage.Text = \"文档属性\";\r\n\t\t\tthis._DocumentInfoPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _PageLabelsPage\r\n\t\t\t// \r\n\t\t\tthis._PageLabelsPage.Controls.Add(this._PageLabelEditor);\r\n\t\t\tthis._PageLabelsPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._PageLabelsPage.Name = \"_PageLabelsPage\";\r\n\t\t\tthis._PageLabelsPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._PageLabelsPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._PageLabelsPage.TabIndex = 3;\r\n\t\t\tthis._PageLabelsPage.Text = \"页码标签\";\r\n\t\t\tthis._PageLabelsPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _PageSettingsPage\r\n\t\t\t// \r\n\t\t\tthis._PageSettingsPage.Controls.Add(this._PageSettingsEditor);\r\n\t\t\tthis._PageSettingsPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._PageSettingsPage.Name = \"_PageSettingsPage\";\r\n\t\t\tthis._PageSettingsPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._PageSettingsPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._PageSettingsPage.TabIndex = 6;\r\n\t\t\tthis._PageSettingsPage.Text = \"页面设置\";\r\n\t\t\tthis._PageSettingsPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _FontSubstitutionsPage\r\n\t\t\t// \r\n\t\t\tthis._FontSubstitutionsPage.Controls.Add(this._FontSubstitutionsEditor);\r\n\t\t\tthis._FontSubstitutionsPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._FontSubstitutionsPage.Name = \"_FontSubstitutionsPage\";\r\n\t\t\tthis._FontSubstitutionsPage.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis._FontSubstitutionsPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._FontSubstitutionsPage.TabIndex = 7;\r\n\t\t\tthis._FontSubstitutionsPage.Text = \"替换字体\";\r\n\t\t\tthis._FontSubstitutionsPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ConfigPage\r\n\t\t\t// \r\n\t\t\tthis._ConfigPage.Controls.Add(this._ResetButton);\r\n\t\t\tthis._ConfigPage.Controls.Add(this._ImportButton);\r\n\t\t\tthis._ConfigPage.Controls.Add(this._ExportButton);\r\n\t\t\tthis._ConfigPage.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis._ConfigPage.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._ConfigPage.Name = \"_ConfigPage\";\r\n\t\t\tthis._ConfigPage.Padding = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._ConfigPage.Size = new System.Drawing.Size(438, 289);\r\n\t\t\tthis._ConfigPage.TabIndex = 9;\r\n\t\t\tthis._ConfigPage.Text = \"其它\";\r\n\t\t\tthis._ConfigPage.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ResetButton\r\n\t\t\t// \r\n\t\t\tthis._ResetButton.Location = new System.Drawing.Point(22, 64);\r\n\t\t\tthis._ResetButton.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._ResetButton.Name = \"_ResetButton\";\r\n\t\t\tthis._ResetButton.Size = new System.Drawing.Size(139, 18);\r\n\t\t\tthis._ResetButton.TabIndex = 0;\r\n\t\t\tthis._ResetButton.Text = \"还原选项为默认值\";\r\n\t\t\tthis._ResetButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ImportButton\r\n\t\t\t// \r\n\t\t\tthis._ImportButton.Location = new System.Drawing.Point(22, 41);\r\n\t\t\tthis._ImportButton.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._ImportButton.Name = \"_ImportButton\";\r\n\t\t\tthis._ImportButton.Size = new System.Drawing.Size(139, 18);\r\n\t\t\tthis._ImportButton.TabIndex = 0;\r\n\t\t\tthis._ImportButton.Text = \"导入选项配置文件...\";\r\n\t\t\tthis._ImportButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ExportButton\r\n\t\t\t// \r\n\t\t\tthis._ExportButton.Location = new System.Drawing.Point(22, 18);\r\n\t\t\tthis._ExportButton.Margin = new System.Windows.Forms.Padding(2);\r\n\t\t\tthis._ExportButton.Name = \"_ExportButton\";\r\n\t\t\tthis._ExportButton.Size = new System.Drawing.Size(139, 18);\r\n\t\t\tthis._ExportButton.TabIndex = 0;\r\n\t\t\tthis._ExportButton.Text = \"导出选项配置文件...\";\r\n\t\t\tthis._ExportButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// panel1\r\n\t\t\t// \r\n\t\t\tthis.panel1.Controls.Add(this._MainTab);\r\n\t\t\tthis.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis.panel1.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis.panel1.Name = \"panel1\";\r\n\t\t\tthis.panel1.Size = new System.Drawing.Size(452, 321);\r\n\t\t\tthis.panel1.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _ViewerSettingsEditor\r\n\t\t\t// \r\n\t\t\tthis._ViewerSettingsEditor.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._ViewerSettingsEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._ViewerSettingsEditor.Name = \"_ViewerSettingsEditor\";\r\n\t\t\tthis._ViewerSettingsEditor.Size = new System.Drawing.Size(438, 279);\r\n\t\t\tthis._ViewerSettingsEditor.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _DocumentInfoEditor\r\n\t\t\t// \r\n\t\t\tthis._DocumentInfoEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._DocumentInfoEditor.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._DocumentInfoEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._DocumentInfoEditor.Name = \"_DocumentInfoEditor\";\r\n\t\t\tthis._DocumentInfoEditor.Size = new System.Drawing.Size(439, 294);\r\n\t\t\tthis._DocumentInfoEditor.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _PageLabelEditor\r\n\t\t\t// \r\n\t\t\tthis._PageLabelEditor.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis._PageLabelEditor.Labels = null;\r\n\t\t\tthis._PageLabelEditor.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._PageLabelEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._PageLabelEditor.Name = \"_PageLabelEditor\";\r\n\t\t\tthis._PageLabelEditor.Size = new System.Drawing.Size(432, 283);\r\n\t\t\tthis._PageLabelEditor.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _PageSettingsEditor\r\n\t\t\t// \r\n\t\t\tthis._PageSettingsEditor.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis._PageSettingsEditor.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._PageSettingsEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._PageSettingsEditor.Name = \"_PageSettingsEditor\";\r\n\t\t\tthis._PageSettingsEditor.Settings = null;\r\n\t\t\tthis._PageSettingsEditor.Size = new System.Drawing.Size(432, 283);\r\n\t\t\tthis._PageSettingsEditor.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _FontSubstitutionsEditor\r\n\t\t\t// \r\n\t\t\tthis._FontSubstitutionsEditor.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis._FontSubstitutionsEditor.Location = new System.Drawing.Point(3, 3);\r\n\t\t\tthis._FontSubstitutionsEditor.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._FontSubstitutionsEditor.Name = \"_FontSubstitutionsEditor\";\r\n\t\t\tthis._FontSubstitutionsEditor.Options = null;\r\n\t\t\tthis._FontSubstitutionsEditor.Size = new System.Drawing.Size(432, 283);\r\n\t\t\tthis._FontSubstitutionsEditor.Substitutions = null;\r\n\t\t\tthis._FontSubstitutionsEditor.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _ThresholdBinaryBox\r\n\t\t\t// \r\n\t\t\tthis._ThresholdBinaryBox.AutoSize = true;\r\n\t\t\tthis._ThresholdBinaryBox.Location = new System.Drawing.Point(22, 42);\r\n\t\t\tthis._ThresholdBinaryBox.Name = \"_ThresholdBinaryBox\";\r\n\t\t\tthis._ThresholdBinaryBox.Size = new System.Drawing.Size(239, 16);\r\n\t\t\tthis._ThresholdBinaryBox.TabIndex = 1;\r\n\t\t\tthis._ThresholdBinaryBox.TabStop = true;\r\n\t\t\tthis._ThresholdBinaryBox.Text = \"门限值约束（值越大，图片笔画越粗）：\";\r\n\t\t\tthis._ThresholdBinaryBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DitherBinaryBox\r\n\t\t\t// \r\n\t\t\tthis._DitherBinaryBox.AutoSize = true;\r\n\t\t\tthis._DitherBinaryBox.Location = new System.Drawing.Point(22, 64);\r\n\t\t\tthis._DitherBinaryBox.Name = \"_DitherBinaryBox\";\r\n\t\t\tthis._DitherBinaryBox.Size = new System.Drawing.Size(179, 16);\r\n\t\t\tthis._DitherBinaryBox.TabIndex = 3;\r\n\t\t\tthis._DitherBinaryBox.TabStop = true;\r\n\t\t\tthis._DitherBinaryBox.Text = \"抖动图像（用斑点模拟灰度）\";\r\n\t\t\tthis._DitherBinaryBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// PatcherOptionsControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this.panel1);\r\n\t\t\tthis.Name = \"PatcherOptionsControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(452, 321);\r\n\t\t\tthis._MainTab.ResumeLayout(false);\r\n\t\t\tthis._PageLayoutPage.ResumeLayout(false);\r\n\t\t\tthis._MarginGroupBox.ResumeLayout(false);\r\n\t\t\tthis._MarginGroupBox.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).EndInit();\r\n\t\t\tthis._LayoutGroupBox.ResumeLayout(false);\r\n\t\t\tthis._LayoutGroupBox.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._HeightBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._WidthBox)).EndInit();\r\n\t\t\tthis._ViewerSettingsPage.ResumeLayout(false);\r\n\t\t\tthis._CleanerPage.ResumeLayout(false);\r\n\t\t\tthis.groupBox4.ResumeLayout(false);\r\n\t\t\tthis.groupBox4.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RemoveTrailingCommandCountBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RemoveLeadingCommandCountBox)).EndInit();\r\n\t\t\tthis.groupBox3.ResumeLayout(false);\r\n\t\t\tthis.groupBox3.PerformLayout();\r\n\t\t\tthis._CompressionPage.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BinaryThresholdBox)).EndInit();\r\n\t\t\tthis.groupBox1.ResumeLayout(false);\r\n\t\t\tthis.groupBox1.PerformLayout();\r\n\t\t\tthis._DocumentInfoPage.ResumeLayout(false);\r\n\t\t\tthis._PageLabelsPage.ResumeLayout(false);\r\n\t\t\tthis._PageSettingsPage.ResumeLayout(false);\r\n\t\t\tthis._FontSubstitutionsPage.ResumeLayout(false);\r\n\t\t\tthis._ConfigPage.ResumeLayout(false);\r\n\t\t\tthis.panel1.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.TabControl _MainTab;\r\n\t\tprivate System.Windows.Forms.TabPage _PageLayoutPage;\r\n\t\tprivate System.Windows.Forms.GroupBox _MarginGroupBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _MarginUnitBox;\r\n\t\tprivate System.Windows.Forms.Label label13;\r\n\t\tprivate System.Windows.Forms.CheckBox _SyncMarginsBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _RightMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _LeftMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _BottomMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _TopMarginBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.GroupBox _LayoutGroupBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _ImageHAlignBox;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.ComboBox _ImageVAlignBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ScalePdfPagesBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ResizePdfPagesBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _HeightBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _WidthBox;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.ComboBox _PageSizeBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoRotateBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.TabPage _ViewerSettingsPage;\r\n\t\tprivate ViewerPreferenceEditor _ViewerSettingsEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _CleanerPage;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox4;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _RemoveTrailingCommandCountBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _RemoveLeadingCommandCountBox;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemovePageFormsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemovePageThumbnailsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemovePageTextBlocksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemovePageLinksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveAnnotationsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemovePageAutoActionsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemovePageMetaDataBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox3;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveBookmarksBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FixContentBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveXmlMetaDataBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveDocAutoActionsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveUsageRightsBox;\r\n\t\tprivate System.Windows.Forms.TabPage _DocumentInfoPage;\r\n\t\tprivate DocumentInfoEditor _DocumentInfoEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _PageLabelsPage;\r\n\t\tprivate PageLabelEditor _PageLabelEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _PageSettingsPage;\r\n\t\tprivate PageSettingsEditor _PageSettingsEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _FontSubstitutionsPage;\r\n\t\tprivate FontSubstitutionsEditor _FontSubstitutionsEditor;\r\n\t\tprivate System.Windows.Forms.TabPage _ConfigPage;\r\n\t\tprivate System.Windows.Forms.Button _ResetButton;\r\n\t\tprivate System.Windows.Forms.Button _ImportButton;\r\n\t\tprivate System.Windows.Forms.Button _ExportButton;\r\n\t\tprivate System.Windows.Forms.Panel panel1;\r\n\t\tprivate System.Windows.Forms.CheckBox _RemoveAttachmentsBox;\r\n\t\tprivate System.Windows.Forms.TabPage _CompressionPage;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.CheckBox _RecompressToBinaryImageBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.CheckBox _RecompressWithJbig2Box;\r\n\t\tprivate System.Windows.Forms.CheckBox _FullCompressionBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _BinaryThresholdBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _DitherBinaryBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ThresholdBinaryBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PatcherOptionsControl.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic partial class PatcherOptionsControl : UserControl\r\n\t{\r\n\t\tstring paperName;\r\n\t\tbool _uiLockDown;\r\n\r\n\t\tpublic PatcherOptionsControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\tpublic bool ForEditor { get; set; }\r\n\t\tpublic PatcherOptions Options { get; set; }\r\n\r\n\t\tpublic PatcherOptions Apply() {\r\n\t\t\tvar settings = Options;\r\n\t\t\tvar ps = settings.UnifiedPageSettings;\r\n\t\t\tps.AutoRotation = _AutoRotateBox.Checked;\r\n\t\t\tps.Margins.IsRelative = _MarginUnitBox.SelectedIndex == 1;\r\n\t\t\tvar marginScale = ps.Margins.IsRelative ? 1 : Constants.Units.CmToPoint;\r\n\t\t\tps.Margins.Top = (float)_TopMarginBox.Value * marginScale;\r\n\t\t\tps.Margins.Bottom = (float)_BottomMarginBox.Value * marginScale;\r\n\t\t\tps.Margins.Left = (float)_LeftMarginBox.Value * marginScale;\r\n\t\t\tps.Margins.Right = (float)_RightMarginBox.Value * marginScale;\r\n\t\t\tps.PaperSize.PaperName = paperName;\r\n\t\t\tps.PaperSize.Width = CmToPoint(_WidthBox);\r\n\t\t\tps.PaperSize.Height = CmToPoint(_HeightBox);\r\n\t\t\tps.HorizontalAlign = (Model.HorizontalAlignment)_ImageHAlignBox.SelectedIndex;\r\n\t\t\tps.VerticalAlign = (Model.VerticalAlignment)_ImageVAlignBox.SelectedIndex;\r\n\t\t\tps.ScaleContent = _ScalePdfPagesBox.Checked;\r\n\t\t\tsettings.RecompressWithJbig2 = _RecompressWithJbig2Box.Checked;\r\n\t\t\tsettings.RemoveAnnotations = _RemoveAnnotationsBox.Checked;\r\n\t\t\tsettings.RemoveAttachments = _RemoveAttachmentsBox.Checked;\r\n\t\t\tsettings.RemoveBookmarks = _RemoveBookmarksBox.Checked;\r\n\t\t\tsettings.RemoveLeadingCommandCount = (int)_RemoveLeadingCommandCountBox.Value;\r\n\t\t\tsettings.RemoveUsageRights = _RemoveUsageRightsBox.Checked;\r\n\t\t\tsettings.RemoveXmlMetadata = _RemoveXmlMetaDataBox.Checked;\r\n\t\t\tsettings.RemoveDocAutoActions = _RemoveDocAutoActionsBox.Checked;\r\n\t\t\tsettings.RemovePageAutoActions = _RemovePageAutoActionsBox.Checked;\r\n\t\t\tsettings.RemovePageForms = _RemovePageFormsBox.Checked;\r\n\t\t\tsettings.RemovePageLinks = _RemovePageLinksBox.Checked;\r\n\t\t\tsettings.RemovePageMetaData = _RemovePageMetaDataBox.Checked;\r\n\t\t\tsettings.RemovePageTextBlocks = _RemovePageTextBlocksBox.Checked;\r\n\t\t\tsettings.RemovePageThumbnails = _RemovePageThumbnailsBox.Checked;\r\n\t\t\tsettings.RemoveTrailingCommandCount = (int)_RemoveTrailingCommandCountBox.Value;\r\n\t\t\tsettings.RecompressImageToBinary = _RecompressToBinaryImageBox.Checked;\r\n\t\t\tsettings.BinaryImageThreshold = (byte)_BinaryThresholdBox.Value;\r\n\t\t\tsettings.UseThresholdAlgorithm = _ThresholdBinaryBox.Checked;\r\n\t\t\tsettings.FixContents = _FixContentBox.Checked;\r\n\t\t\tsettings.FullCompression = _FullCompressionBox.Checked;\r\n\t\t\treturn Options;\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tif (ForEditor) {\r\n\t\t\t\tOptions = AppContext.Editor = new PatcherOptions();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOptions = AppContext.Patcher = new PatcherOptions();\r\n\t\t\t}\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\t_uiLockDown = true;\r\n\t\t\tvar settings = Options;\r\n\t\t\t_DocumentInfoEditor.Options = settings.MetaData;\r\n\t\t\t_FontSubstitutionsEditor.Options = settings;\r\n\t\t\t_FontSubstitutionsEditor.Substitutions = settings.FontSubstitutions;\r\n\t\t\t_ViewerSettingsEditor.Options = settings.ViewerPreferences;\r\n\t\t\t_PageLabelEditor.Labels = settings.PageLabels;\r\n\t\t\t_PageSettingsEditor.Settings = settings.PageSettings;\r\n\r\n\t\t\t_FixContentBox.Checked = settings.FixContents;\r\n\t\t\t_RecompressWithJbig2Box.Checked = settings.RecompressWithJbig2;\r\n\t\t\t_RemoveAnnotationsBox.Checked = settings.RemoveAnnotations;\r\n\t\t\t_RemoveAttachmentsBox.Checked = settings.RemoveAttachments;\r\n\t\t\t_RemoveBookmarksBox.Checked = settings.RemoveBookmarks;\r\n\t\t\t_RemoveDocAutoActionsBox.Checked = settings.RemoveDocAutoActions;\r\n\t\t\t_RemoveLeadingCommandCountBox.SetValue(settings.RemoveLeadingCommandCount);\r\n\t\t\t_RemovePageAutoActionsBox.Checked = settings.RemovePageAutoActions;\r\n\t\t\t_RemovePageFormsBox.Checked = settings.RemovePageForms;\r\n\t\t\t_RemovePageLinksBox.Checked = settings.RemovePageLinks;\r\n\t\t\t_RemovePageMetaDataBox.Checked = settings.RemovePageMetaData;\r\n\t\t\t_RemovePageTextBlocksBox.Checked = settings.RemovePageTextBlocks;\r\n\t\t\t_RemovePageThumbnailsBox.Checked = settings.RemovePageThumbnails;\r\n\t\t\t_RemoveTrailingCommandCountBox.SetValue(settings.RemoveTrailingCommandCount);\r\n\t\t\t_RemoveUsageRightsBox.Checked = settings.RemoveUsageRights;\r\n\t\t\t_RemoveXmlMetaDataBox.Checked = settings.RemoveXmlMetadata;\r\n\t\t\t_FullCompressionBox.Checked = settings.FullCompression;\r\n\t\t\t_RecompressToBinaryImageBox.Checked = settings.RecompressImageToBinary;\r\n\t\t\t_BinaryThresholdBox.SetValue(settings.BinaryImageThreshold);\r\n\t\t\t_ThresholdBinaryBox.Checked = settings.UseThresholdAlgorithm;\r\n\t\t\t_DitherBinaryBox.Checked = !settings.UseThresholdAlgorithm;\r\n\r\n\t\t\tvar ps = settings.UnifiedPageSettings;\r\n\t\t\t_AutoRotateBox.Checked = ps.AutoRotation;\r\n\t\t\t_MarginUnitBox.SelectedIndex = ps.Margins.IsRelative ? 1 : 0;\r\n\t\t\tvar marginScale = ps.Margins.IsRelative ? 1 : Constants.Units.CmToPoint;\r\n\t\t\t_BottomMarginBox.SetValue(ps.Margins.Bottom / marginScale);\r\n\t\t\t_LeftMarginBox.SetValue(ps.Margins.Left / marginScale);\r\n\t\t\t_RightMarginBox.SetValue(ps.Margins.Right / marginScale);\r\n\t\t\t_TopMarginBox.SetValue(ps.Margins.Top / marginScale);\r\n\t\t\t_HeightBox.SetValue(ps.PaperSize.Height / Constants.Units.CmToPoint);\r\n\t\t\t_WidthBox.SetValue(ps.PaperSize.Width / Constants.Units.CmToPoint);\r\n\t\t\t_ImageHAlignBox.SelectedIndex = (int)ps.HorizontalAlign;\r\n\t\t\t_ImageVAlignBox.SelectedIndex = (int)ps.VerticalAlign;\r\n\t\t\tfor (int i = 0; i < _PageSizeBox.Items.Count; i++) {\r\n\t\t\t\tvar p = _PageSizeBox.Items[i] as Model.PaperSize;\r\n\t\t\t\tif (p.PaperName == ps.PaperSize.PaperName) {\r\n\t\t\t\t\t_PageSizeBox.SelectedIndex = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_PageSizeBox.SelectedIndex == -1) {\r\n\t\t\t\t_PageSizeBox.SelectedIndex = 0;\r\n\t\t\t}\r\n\t\t\t_ResizePdfPagesBox.Checked = ps.ScaleContent == false;\r\n\t\t\t_ScalePdfPagesBox.Checked = ps.ScaleContent;\r\n\t\t\tif (_PageSizeBox.SelectedIndex == 0) {\r\n\t\t\t\t_HeightBox.Value = 26.01M;\r\n\t\t\t\t_WidthBox.Value = 18M;\r\n\t\t\t}\r\n\t\t\t_uiLockDown = false;\r\n\t\t}\r\n\r\n\t\tinternal void OnLoad() {\r\n\t\t\t_PageSizeBox.Items.AddRange(Processor.PdfDocumentCreator.PaperSizes);\r\n\t\t\t_ImageHAlignBox.Items.Add(\"水平居中\");\r\n\t\t\t_ImageHAlignBox.Items.Add(\"左对齐\");\r\n\t\t\t_ImageHAlignBox.Items.Add(\"右对齐\");\r\n\t\t\t_ImageVAlignBox.Items.Add(\"垂直居中\");\r\n\t\t\t_ImageVAlignBox.Items.Add(\"置顶\");\r\n\t\t\t_ImageVAlignBox.Items.Add(\"置底\");\r\n\t\t\t_ResetButton.Click += (s, args) => {\r\n\t\t\t\tif (this.ConfirmYesBox(\"是否将选项配置还原为默认值？\")) {\r\n\t\t\t\t\tReset();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_RecompressWithJbig2Box.CheckStateChanged += _RecompressWithJbig2Box_CheckStateChanged;\r\n\t\t\t_RecompressToBinaryImageBox.CheckStateChanged += _RecompressToBinaryImageBox_CheckStateChanged;\r\n\t\t\t_ThresholdBinaryBox.CheckedChanged += _ThresholdBinaryBox_CheckedChanged;\r\n\t\t\t_RecompressToBinaryImageBox.Enabled\r\n\t\t\t\t= _BinaryThresholdBox.Enabled\r\n\t\t\t\t= _ThresholdBinaryBox.Enabled\r\n\t\t\t\t= _DitherBinaryBox.Enabled\r\n\t\t\t\t= false;\r\n\t\t\tReload();\r\n\t\t\tif (ForEditor) {\r\n\t\t\t\t_MainTab.TabPages.Remove(_DocumentInfoPage);\r\n\t\t\t\tOptions.MetaData.SpecifyMetaData = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ThresholdBinaryBox_CheckedChanged(object sender, EventArgs e) {\r\n\t\t\t_BinaryThresholdBox.Enabled = _ThresholdBinaryBox.Checked;\r\n\t\t}\r\n\r\n\t\tvoid _RecompressToBinaryImageBox_CheckStateChanged(object sender, EventArgs e) {\r\n\t\t\tvar b = _ThresholdBinaryBox.Enabled\r\n\t\t\t\t= _DitherBinaryBox.Enabled\r\n\t\t\t\t= _RecompressToBinaryImageBox.Checked && _RecompressWithJbig2Box.Checked;\r\n\t\t\t_BinaryThresholdBox.Enabled = b && _ThresholdBinaryBox.Checked;\r\n\t\t}\r\n\r\n\t\tvoid _RecompressWithJbig2Box_CheckStateChanged(object sender, EventArgs e) {\r\n\t\t\tvar b = _RecompressToBinaryImageBox.Enabled = _RecompressWithJbig2Box.Checked;\r\n\t\t\tb = _DitherBinaryBox.Enabled\r\n\t\t\t\t= _ThresholdBinaryBox.Enabled\r\n\t\t\t\t= b && _RecompressToBinaryImageBox.Checked;\r\n\t\t\t_BinaryThresholdBox.Enabled = b && _ThresholdBinaryBox.Checked;\r\n\t\t}\r\n\r\n\t\tstatic float CmToPoint(NumericUpDown box) {\r\n\t\t\treturn (float)box.Value * Constants.Units.CmToPoint;\r\n\t\t}\r\n\r\n\t\tvoid _PageSizeBox_SelectedIndexChanged(object sender, EventArgs e) {\r\n\t\t\tif (_PageSizeBox.SelectedIndex == -1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar p = _PageSizeBox.SelectedItem as PaperSize;\r\n\t\t\tif (p.Width > 0 && p.Height > 0) {\r\n\t\t\t\t_WidthBox.SetValue((decimal)p.Width / 100);\r\n\t\t\t\t_HeightBox.SetValue((decimal)p.Height / 100);\r\n\t\t\t}\r\n\t\t\tpaperName = p.PaperName;\r\n\t\t\tswitch (paperName) {\r\n\t\t\t\tcase PaperSize.FixedWidthAutoHeight:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\tfalse;\r\n\t\t\t\t\t_ScalePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ResizePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PaperSize.AsNarrowestPage:\r\n\t\t\t\tcase PaperSize.AsWidestPage:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\tfalse;\r\n\t\t\t\t\t_ScalePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ResizePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PaperSize.AsPageSize:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_ScalePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ResizePdfPagesBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PaperSize.AsFirstPage:\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\tfalse;\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_ScalePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ResizePdfPagesBox.Enabled = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PaperSize.AsLargestPage:\r\n\t\t\t\tcase PaperSize.AsSmallestPage:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\tfalse;\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_ScalePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ResizePdfPagesBox.Enabled = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t_AutoRotateBox.Enabled =\r\n\t\t\t\t\t_WidthBox.Enabled =\r\n\t\t\t\t\t_HeightBox.Enabled =\r\n\t\t\t\t\t_ImageHAlignBox.Enabled =\r\n\t\t\t\t\t_ImageVAlignBox.Enabled =\r\n\t\t\t\t\t_ScalePdfPagesBox.Enabled =\r\n\t\t\t\t\t_ResizePdfPagesBox.Enabled =\r\n\t\t\t\t\ttrue;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid MarginBox_ValueChanged(object sender, EventArgs e) {\r\n\t\t\tif (_SyncMarginsBox.Checked == false || _uiLockDown) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar d = (sender as NumericUpDown).Value;\r\n\t\t\t_TopMarginBox.Value = _BottomMarginBox.Value = _LeftMarginBox.Value = _RightMarginBox.Value = d;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/PatcherOptionsControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/RecentFileMenuHelper.cs",
    "content": "﻿using System.IO;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tstatic class RecentFileMenuHelper\r\n\t{\r\n\t\tpublic static void AddRecentHistoryFile(string path) {\r\n\t\t\tswitch (Path.GetExtension(path).ToLowerInvariant()) {\r\n\t\t\t\tcase Constants.FileExtensions.Pdf:\r\n\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, path);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.FileExtensions.Xml:\r\n\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.InfoDocuments, path);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tpublic static void AddSourcePdfFiles(this ToolStripItemCollection list) {\r\n\t\t\tforeach (var item in AppContext.Recent.SourcePdfFiles) {\r\n\t\t\t\tvar i = list.Add(FileHelper.GetEllipticPath(item, 50));\r\n\t\t\t\ti.ToolTipText = item;\r\n\t\t\t\tif (File.Exists(item) == false) {\r\n\t\t\t\t\ti.Enabled = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void AddInfoFiles(this ToolStripItemCollection list) {\r\n\t\t\tforeach (var item in AppContext.Recent.InfoDocuments) {\r\n\t\t\t\tif (FileHelper.IsPathValid(item) && Path.IsPathRooted(item)) {\r\n\t\t\t\t\tvar i = list.Add(FileHelper.GetEllipticPath(item, 50));\r\n\t\t\t\t\ti.ToolTipText = item;\r\n\t\t\t\t\tif (File.Exists(item) == false) {\r\n\t\t\t\t\t\ti.Enabled = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/RenameControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class RenameControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\t\tSystem.Windows.Forms.ToolStripDropDownButton _Sort;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _Delete;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAll;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InvertSelection;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectNone;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Copy;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RefreshInfo;\r\n\t\t\tthis._MainToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._AddFilesButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RecentFileMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SortMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SortByNaturalNumberItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._SortByAlphaItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RefreshInfoButton = new System.Windows.Forms.ToolStripSplitButton();\r\n\t\t\tthis._RefreshInfoMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SelectionMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._SelectionMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ItemList = new BrightIdeasSoftware.ObjectListView();\r\n\t\t\tthis._NameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._PageCountColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._TitleColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._AuthorColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._SubjectColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._KeywordsColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FolderColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._FileTimeColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));\r\n\t\t\tthis._ItemListMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r\n\t\t\tthis._FileTypeList = new System.Windows.Forms.ImageList(this.components);\r\n\t\t\tthis._OpenPdfBox = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis._AutoClearListBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._AddDocumentWorker = new System.ComponentModel.BackgroundWorker();\r\n\t\t\tthis._KeepSourceFileBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._TestRenameButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._TargetPdfFile = new PDFPatcher.TargetFileControl();\r\n\t\t\tthis._RenameButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\ttoolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_Sort = new System.Windows.Forms.ToolStripDropDownButton();\r\n\t\t\t_Delete = new System.Windows.Forms.ToolStripButton();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_SelectAll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InvertSelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectNone = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Copy = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RefreshInfo = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._MainToolbar.SuspendLayout();\r\n\t\t\tthis._SortMenu.SuspendLayout();\r\n\t\t\tthis._SelectionMenu.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).BeginInit();\r\n\t\t\tthis._ItemListMenu.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _MainToolbar\r\n\t\t\t// \r\n\t\t\tthis._MainToolbar.GripMargin = new System.Windows.Forms.Padding(0);\r\n\t\t\tthis._MainToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._AddFilesButton,\r\n            toolStripSeparator1,\r\n            _Sort,\r\n            _Delete,\r\n            toolStripSeparator2,\r\n            this._RefreshInfoButton});\r\n\t\t\tthis._MainToolbar.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainToolbar.Name = \"_MainToolbar\";\r\n\t\t\tthis._MainToolbar.Padding = new System.Windows.Forms.Padding(0, 0, 2, 0);\r\n\t\t\tthis._MainToolbar.Size = new System.Drawing.Size(575, 25);\r\n\t\t\tthis._MainToolbar.TabIndex = 0;\r\n\t\t\tthis._MainToolbar.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _AddFilesButton\r\n\t\t\t// \r\n\t\t\tthis._AddFilesButton.DropDown = this._RecentFileMenu;\r\n\t\t\tthis._AddFilesButton.Image = global::PDFPatcher.Properties.Resources.Add;\r\n\t\t\tthis._AddFilesButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._AddFilesButton.Name = \"_AddFilesButton\";\r\n\t\t\tthis._AddFilesButton.Size = new System.Drawing.Size(103, 22);\r\n\t\t\tthis._AddFilesButton.Text = \"添加文件(&T)\";\r\n\t\t\tthis._AddFilesButton.ToolTipText = \"添加文件\";\r\n\t\t\tthis._AddFilesButton.ButtonClick += new System.EventHandler(this._MainToolbar_ButtonClick);\r\n\t\t\t// \r\n\t\t\t// _RecentFileMenu\r\n\t\t\t// \r\n\t\t\tthis._RecentFileMenu.Name = \"_RecentFileMenu\";\r\n\t\t\tthis._RecentFileMenu.ShowImageMargin = false;\r\n\t\t\tthis._RecentFileMenu.Size = new System.Drawing.Size(36, 4);\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\ttoolStripSeparator1.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _Sort\r\n\t\t\t// \r\n\t\t\t_Sort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_Sort.DropDown = this._SortMenu;\r\n\t\t\t_Sort.Image = global::PDFPatcher.Properties.Resources.Sort;\r\n\t\t\t_Sort.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Sort.Name = \"_Sort\";\r\n\t\t\t_Sort.Size = new System.Drawing.Size(29, 22);\r\n\t\t\t_Sort.Text = \"排序\";\r\n\t\t\t_Sort.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortMenu\r\n\t\t\t// \r\n\t\t\tthis._SortMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._SortByNaturalNumberItem,\r\n            this._SortByAlphaItem});\r\n\t\t\tthis._SortMenu.Name = \"_SortMenu\";\r\n\t\t\tthis._SortMenu.Size = new System.Drawing.Size(217, 48);\r\n\t\t\tthis._SortMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._SortMenu_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SortByNaturalNumberItem\r\n\t\t\t// \r\n\t\t\tthis._SortByNaturalNumberItem.Image = global::PDFPatcher.Properties.Resources.NaturalSort;\r\n\t\t\tthis._SortByNaturalNumberItem.Name = \"_SortByNaturalNumberItem\";\r\n\t\t\tthis._SortByNaturalNumberItem.Size = new System.Drawing.Size(216, 22);\r\n\t\t\tthis._SortByNaturalNumberItem.Text = \"按数值和字母顺序排序(&M)\";\r\n\t\t\t// \r\n\t\t\t// _SortByAlphaItem\r\n\t\t\t// \r\n\t\t\tthis._SortByAlphaItem.Image = global::PDFPatcher.Properties.Resources.AlphabeticSort;\r\n\t\t\tthis._SortByAlphaItem.Name = \"_SortByAlphaItem\";\r\n\t\t\tthis._SortByAlphaItem.Size = new System.Drawing.Size(216, 22);\r\n\t\t\tthis._SortByAlphaItem.Text = \"按字母顺序排序(&Z)\";\r\n\t\t\t// \r\n\t\t\t// _Delete\r\n\t\t\t// \r\n\t\t\t_Delete.Image = global::PDFPatcher.Properties.Resources.Delete;\r\n\t\t\t_Delete.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Delete.Name = \"_Delete\";\r\n\t\t\t_Delete.Size = new System.Drawing.Size(76, 22);\r\n\t\t\t_Delete.Text = \"删除文件\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(6, 25);\r\n\t\t\t// \r\n\t\t\t// _RefreshInfoButton\r\n\t\t\t// \r\n\t\t\tthis._RefreshInfoButton.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\tthis._RefreshInfoButton.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._RefreshInfoButton.Name = \"_RefreshInfoButton\";\r\n\t\t\tthis._RefreshInfoButton.Size = new System.Drawing.Size(112, 22);\r\n\t\t\tthis._RefreshInfoButton.Text = \"刷新文档属性\";\r\n\t\t\t// \r\n\t\t\t// _SelectAll\r\n\t\t\t// \r\n\t\t\t_SelectAll.Image = global::PDFPatcher.Properties.Resources.SelectAll;\r\n\t\t\t_SelectAll.Name = \"_SelectAll\";\r\n\t\t\t_SelectAll.Size = new System.Drawing.Size(124, 22);\r\n\t\t\t_SelectAll.Text = \"全部选中\";\r\n\t\t\t// \r\n\t\t\t// _InvertSelect\r\n\t\t\t// \r\n\t\t\t_InvertSelection.Name = \"_InvertSelection\";\r\n\t\t\t_InvertSelection.Size = new System.Drawing.Size(124, 22);\r\n\t\t\t_InvertSelection.Text = \"反转选择\";\r\n\t\t\t// \r\n\t\t\t// _SelectNone\r\n\t\t\t// \r\n\t\t\t_SelectNone.Name = \"_SelectNone\";\r\n\t\t\t_SelectNone.Size = new System.Drawing.Size(124, 22);\r\n\t\t\t_SelectNone.Text = \"取消选择\";\r\n\t\t\t// \r\n\t\t\t// _Copy\r\n\t\t\t// \r\n\t\t\t_Copy.Image = global::PDFPatcher.Properties.Resources.Copy;\r\n\t\t\t_Copy.Name = \"_Copy\";\r\n\t\t\t_Copy.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_Copy.Text = \"复制列表内容\";\r\n\t\t\t// \r\n\t\t\t// _RefreshInfo\r\n\t\t\t// \r\n\t\t\t_RefreshInfo.DropDown = this._RefreshInfoMenu;\r\n\t\t\t_RefreshInfo.Image = global::PDFPatcher.Properties.Resources.Refresh;\r\n\t\t\t_RefreshInfo.Name = \"_RefreshInfo\";\r\n\t\t\t_RefreshInfo.Size = new System.Drawing.Size(148, 22);\r\n\t\t\t_RefreshInfo.Text = \"刷新文档属性\";\r\n\t\t\t// \r\n\t\t\t// _RefreshInfoMenu\r\n\t\t\t// \r\n\t\t\tthis._RefreshInfoMenu.Name = \"_RefreshInfoMenu\";\r\n\t\t\tthis._RefreshInfoMenu.Size = new System.Drawing.Size(61, 4);\r\n\t\t\t// \r\n\t\t\t// _SelectionMenu\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _SelectAll,\r\n            _InvertSelection,\r\n            _SelectNone});\r\n\t\t\tthis._SelectionMenu.Name = \"_SelectionMenu\";\r\n\t\t\tthis._SelectionMenu.Size = new System.Drawing.Size(125, 70);\r\n\t\t\tthis._SelectionMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _SelectionMenuItem\r\n\t\t\t// \r\n\t\t\tthis._SelectionMenuItem.DropDown = this._SelectionMenu;\r\n\t\t\tthis._SelectionMenuItem.Image = global::PDFPatcher.Properties.Resources.SelectItem;\r\n\t\t\tthis._SelectionMenuItem.Name = \"_SelectionMenuItem\";\r\n\t\t\tthis._SelectionMenuItem.Size = new System.Drawing.Size(148, 22);\r\n\t\t\tthis._SelectionMenuItem.Text = \"选择文件\";\r\n\t\t\t// \r\n\t\t\t// _ItemList\r\n\t\t\t// \r\n\t\t\tthis._ItemList.AllColumns.Add(this._NameColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._PageCountColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._TitleColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._AuthorColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._SubjectColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._KeywordsColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FolderColumn);\r\n\t\t\tthis._ItemList.AllColumns.Add(this._FileTimeColumn);\r\n\t\t\tthis._ItemList.AllowDrop = true;\r\n\t\t\tthis._ItemList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ItemList.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.SingleClick;\r\n\t\t\tthis._ItemList.CellEditUseWholeCell = false;\r\n\t\t\tthis._ItemList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r\n            this._NameColumn,\r\n            this._PageCountColumn,\r\n            this._TitleColumn,\r\n            this._AuthorColumn,\r\n            this._SubjectColumn,\r\n            this._KeywordsColumn,\r\n            this._FolderColumn,\r\n            this._FileTimeColumn});\r\n\t\t\tthis._ItemList.ContextMenuStrip = this._ItemListMenu;\r\n\t\t\tthis._ItemList.Cursor = System.Windows.Forms.Cursors.Default;\r\n\t\t\tthis._ItemList.GridLines = true;\r\n\t\t\tthis._ItemList.HideSelection = false;\r\n\t\t\tthis._ItemList.Location = new System.Drawing.Point(16, 57);\r\n\t\t\tthis._ItemList.Name = \"_ItemList\";\r\n\t\t\tthis._ItemList.ShowGroups = false;\r\n\t\t\tthis._ItemList.Size = new System.Drawing.Size(544, 202);\r\n\t\t\tthis._ItemList.SmallImageList = this._FileTypeList;\r\n\t\t\tthis._ItemList.TabIndex = 0;\r\n\t\t\tthis._ItemList.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._ItemList.View = System.Windows.Forms.View.Details;\r\n\t\t\tthis._ItemList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this._ImageList_ColumnClick);\r\n\t\t\t// \r\n\t\t\t// _NameColumn\r\n\t\t\t// \r\n\t\t\tthis._NameColumn.Text = \"源文件名\";\r\n\t\t\tthis._NameColumn.Width = 149;\r\n\t\t\t// \r\n\t\t\t// _PageCountColumn\r\n\t\t\t// \r\n\t\t\tthis._PageCountColumn.HeaderTextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._PageCountColumn.IsEditable = false;\r\n\t\t\tthis._PageCountColumn.Text = \"页数\";\r\n\t\t\tthis._PageCountColumn.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\tthis._PageCountColumn.Width = 50;\r\n\t\t\t// \r\n\t\t\t// _TitleColumn\r\n\t\t\t// \r\n\t\t\tthis._TitleColumn.Text = \"标题\";\r\n\t\t\tthis._TitleColumn.Width = 58;\r\n\t\t\t// \r\n\t\t\t// _AuthorColumn\r\n\t\t\t// \r\n\t\t\tthis._AuthorColumn.Text = \"作者\";\r\n\t\t\t// \r\n\t\t\t// _SubjectColumn\r\n\t\t\t// \r\n\t\t\tthis._SubjectColumn.Text = \"主题\";\r\n\t\t\t// \r\n\t\t\t// _KeywordsColumn\r\n\t\t\t// \r\n\t\t\tthis._KeywordsColumn.Text = \"关键词\";\r\n\t\t\tthis._KeywordsColumn.Width = 73;\r\n\t\t\t// \r\n\t\t\t// _FolderColumn\r\n\t\t\t// \r\n\t\t\tthis._FolderColumn.IsEditable = false;\r\n\t\t\tthis._FolderColumn.Text = \"文件夹\";\r\n\t\t\tthis._FolderColumn.Width = 96;\r\n\t\t\t// \r\n\t\t\t// _FileTimeColumn\r\n\t\t\t// \r\n\t\t\tthis._FileTimeColumn.IsEditable = false;\r\n\t\t\tthis._FileTimeColumn.Text = \"修改时间\";\r\n\t\t\tthis._FileTimeColumn.Width = 145;\r\n\t\t\t// \r\n\t\t\t// _ItemListMenu\r\n\t\t\t// \r\n\t\t\tthis._ItemListMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Copy,\r\n            _RefreshInfo,\r\n            this._SelectionMenuItem});\r\n\t\t\tthis._ItemListMenu.Name = \"_ItemListMenu\";\r\n\t\t\tthis._ItemListMenu.Size = new System.Drawing.Size(149, 70);\r\n\t\t\tthis._ItemListMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this._MainToolbar_ItemClicked);\r\n\t\t\t// \r\n\t\t\t// _FileTypeList\r\n\t\t\t// \r\n\t\t\tthis._FileTypeList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;\r\n\t\t\tthis._FileTypeList.ImageSize = new System.Drawing.Size(16, 16);\r\n\t\t\tthis._FileTypeList.TransparentColor = System.Drawing.Color.Transparent;\r\n\t\t\t// \r\n\t\t\t// _OpenPdfBox\r\n\t\t\t// \r\n\t\t\tthis._OpenPdfBox.DefaultExt = \"pdf\";\r\n\t\t\tthis._OpenPdfBox.Filter = \"PDF 文件（*.pdf）|*.pdf\";\r\n\t\t\tthis._OpenPdfBox.Multiselect = true;\r\n\t\t\tthis._OpenPdfBox.Title = \"选择需要处理的 PDF 文件\";\r\n\t\t\t// \r\n\t\t\t// _AutoClearListBox\r\n\t\t\t// \r\n\t\t\tthis._AutoClearListBox.AutoSize = true;\r\n\t\t\tthis._AutoClearListBox.Checked = true;\r\n\t\t\tthis._AutoClearListBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._AutoClearListBox.Location = new System.Drawing.Point(16, 29);\r\n\t\t\tthis._AutoClearListBox.Name = \"_AutoClearListBox\";\r\n\t\t\tthis._AutoClearListBox.Size = new System.Drawing.Size(132, 16);\r\n\t\t\tthis._AutoClearListBox.TabIndex = 4;\r\n\t\t\tthis._AutoClearListBox.Text = \"添加文件前清空列表\";\r\n\t\t\tthis._AutoClearListBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AddDocumentWorker\r\n\t\t\t// \r\n\t\t\tthis._AddDocumentWorker.WorkerReportsProgress = true;\r\n\t\t\tthis._AddDocumentWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this._AddDocumentWorker_DoWork);\r\n\t\t\tthis._AddDocumentWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this._AddDocumentWorker_ProgressChanged);\r\n\t\t\tthis._AddDocumentWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this._AddDocumentWorker_RunWorkerCompleted);\r\n\t\t\t// \r\n\t\t\t// _KeepSourceFileBox\r\n\t\t\t// \r\n\t\t\tthis._KeepSourceFileBox.AutoSize = true;\r\n\t\t\tthis._KeepSourceFileBox.Checked = true;\r\n\t\t\tthis._KeepSourceFileBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._KeepSourceFileBox.Location = new System.Drawing.Point(166, 29);\r\n\t\t\tthis._KeepSourceFileBox.Name = \"_KeepSourceFileBox\";\r\n\t\t\tthis._KeepSourceFileBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._KeepSourceFileBox.TabIndex = 12;\r\n\t\t\tthis._KeepSourceFileBox.Text = \"保留原始文件\";\r\n\t\t\tthis._KeepSourceFileBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _TestRenameButton\r\n\t\t\t// \r\n\t\t\tthis._TestRenameButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TestRenameButton.Location = new System.Drawing.Point(312, 297);\r\n\t\t\tthis._TestRenameButton.Name = \"_TestRenameButton\";\r\n\t\t\tthis._TestRenameButton.Size = new System.Drawing.Size(119, 23);\r\n\t\t\tthis._TestRenameButton.TabIndex = 11;\r\n\t\t\tthis._TestRenameButton.Text = \"测试命名模板(&C)\";\r\n\t\t\tthis._TestRenameButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._TestRenameButton.Click += new System.EventHandler(this._TestRenameButton_Click);\r\n\t\t\t// \r\n\t\t\t// _TargetPdfFile\r\n\t\t\t// \r\n\t\t\tthis._TargetPdfFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetPdfFile.Label = \"重命名模板(&M)：\";\r\n\t\t\tthis._TargetPdfFile.Location = new System.Drawing.Point(13, 265);\r\n\t\t\tthis._TargetPdfFile.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TargetPdfFile.Name = \"_TargetPdfFile\";\r\n\t\t\tthis._TargetPdfFile.Size = new System.Drawing.Size(553, 26);\r\n\t\t\tthis._TargetPdfFile.TabIndex = 7;\r\n\t\t\t// \r\n\t\t\t// _RenameButton\r\n\t\t\t// \r\n\t\t\tthis._RenameButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._RenameButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._RenameButton.AnimateGlow = true;\r\n\t\t\tthis._RenameButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._RenameButton.CornerRadius = 3;\r\n\t\t\tthis._RenameButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._RenameButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._RenameButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._RenameButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._RenameButton.Location = new System.Drawing.Point(440, 297);\r\n\t\t\tthis._RenameButton.Name = \"_RenameButton\";\r\n\t\t\tthis._RenameButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._RenameButton.ShowFocusBorder = true;\r\n\t\t\tthis._RenameButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._RenameButton.TabIndex = 13;\r\n\t\t\tthis._RenameButton.Text = \"重命名文件(&C)\";\r\n\t\t\tthis._RenameButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._RenameButton.Click += new System.EventHandler(this._RenameButton_Click);\r\n\t\t\t// \r\n\t\t\t// RenameControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._RenameButton);\r\n\t\t\tthis.Controls.Add(this._ItemList);\r\n\t\t\tthis.Controls.Add(this._MainToolbar);\r\n\t\t\tthis.Controls.Add(this._TargetPdfFile);\r\n\t\t\tthis.Controls.Add(this._AutoClearListBox);\r\n\t\t\tthis.Controls.Add(this._TestRenameButton);\r\n\t\t\tthis.Controls.Add(this._KeepSourceFileBox);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"RenameControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(575, 342);\r\n\t\t\tthis._MainToolbar.ResumeLayout(false);\r\n\t\t\tthis._MainToolbar.PerformLayout();\r\n\t\t\tthis._SortMenu.ResumeLayout(false);\r\n\t\t\tthis._SelectionMenu.ResumeLayout(false);\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ItemList)).EndInit();\r\n\t\t\tthis._ItemListMenu.ResumeLayout(false);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate BrightIdeasSoftware.ObjectListView _ItemList;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _NameColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FolderColumn;\r\n\t\tprivate TargetFileControl _TargetPdfFile;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SortMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByNaturalNumberItem;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SortByAlphaItem;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _SelectionMenu;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _PageCountColumn;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _SelectionMenuItem;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _ItemListMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _AddFilesButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RecentFileMenu;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenPdfBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoClearListBox;\r\n\t\tprivate System.ComponentModel.BackgroundWorker _AddDocumentWorker;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _TitleColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _AuthorColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _SubjectColumn;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _KeywordsColumn;\r\n\t\tprivate System.Windows.Forms.CheckBox _KeepSourceFileBox;\r\n\t\tprivate System.Windows.Forms.Button _TestRenameButton;\r\n\t\tprivate System.Windows.Forms.ImageList _FileTypeList;\r\n\t\tprivate System.Windows.Forms.ToolStripSplitButton _RefreshInfoButton;\r\n\t\tprivate System.Windows.Forms.ContextMenuStrip _RefreshInfoMenu;\r\n\t\tprivate EnhancedGlassButton.GlassButton _RenameButton;\r\n\t\tprivate BrightIdeasSoftware.OLVColumn _FileTimeColumn;\r\n\t\tprivate System.Windows.Forms.ToolStrip _MainToolbar;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/RenameControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Windows.Forms;\r\nusing BrightIdeasSoftware;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class RenameControl : FunctionControl\r\n\t{\r\n\t\tFileListHelper _listHelper;\r\n\t\tstatic readonly string[] __EnabledCommands = { Commands.Copy, Commands.Delete };\r\n\r\n\t\tpublic override string FunctionName => \"重命名文件\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.Rename;\r\n\r\n\t\tpublic RenameControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tvar s = (int)(this.GetDpiScale() * 16);\r\n\t\t\tvar size = new System.Drawing.Size(s, s);\r\n\t\t\t_MainToolbar.ScaleIcons(size);\r\n\t\t\t_SortMenu.ScaleIcons(size);\r\n\t\t\t_ItemListMenu.ScaleIcons(size);\r\n\t\t\t_RecentFileMenu.ScaleIcons(size);\r\n\t\t\t_RefreshInfoMenu.ScaleIcons(size);\r\n\r\n\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0);\r\n\r\n\t\t\tAppContext.MainForm.SetTooltip(_ItemList, \"在此添加需要重命名的 PDF 文件\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_RenameButton, \"点击此按钮根据文件属性和输出文件名将 PDF 文件重命名\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetPdfFile.FileList, \"生成的目标 PDF 文件路径（鼠标右键点击列表可插入文件名替代符）\");\r\n\t\t\t_ItemList.EmptyListMsg = \"请使用“添加文件”按钮添加需要处理的 PDF 文件，或从资源管理器拖放文件到本列表框\";\r\n\r\n\t\t\t_TargetPdfFile.FileMacroMenu.LoadStandardInfoMacros();\r\n\t\t\t_TargetPdfFile.FileMacroMenu.LoadStandardSourceFileMacros();\r\n\t\t\t_TargetPdfFile.BrowseForFile += FileControl_BrowseForFile;\r\n\t\t\t_TargetPdfFile.TargetFileChangedByBrowseButton += (s, args) => {\r\n\t\t\t\tint i;\r\n\t\t\t\tvar f = _TargetPdfFile.FileDialog.FileName;\r\n\t\t\t\tif (_ItemList.Items.Count > 1 && (i = f.LastIndexOf(Path.DirectorySeparatorChar)) != -1) {\r\n\t\t\t\t\t_TargetPdfFile.Text = String.Concat(f.Substring(0, i), Path.DirectorySeparatorChar, Constants.FileNameMacros.FileName, Path.GetExtension(f));\r\n\t\t\t\t\targs.Cancel = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tvar fi = _FileTypeList.Images;\r\n\t\t\tfi.AddRange(new System.Drawing.Image[] {\r\n\t\t\t\tProperties.Resources.OriginalPdfFile\r\n\t\t\t});\r\n\t\t\t_ItemList.FixEditControlWidth();\r\n\t\t\t_ItemList.ScaleColumnWidths();\r\n\t\t\t_listHelper = new FileListHelper(_ItemList);\r\n\t\t\t_listHelper.SetupDragAndDrop(AddFiles);\r\n\t\t\t_listHelper.SetupHotkeys();\r\n\t\t\tFileListHelper.SetupCommonPdfColumns(_AuthorColumn, _KeywordsColumn, _SubjectColumn, _TitleColumn, _PageCountColumn, _NameColumn, _FolderColumn, _FileTimeColumn);\r\n\t\t\t_RefreshInfoButton.ButtonClick += (s, args) => _listHelper.RefreshInfo(AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t_RefreshInfoButton.DropDown = _RefreshInfoMenu;\r\n\t\t\tforeach (var item in Constants.Encoding.EncodingNames) {\r\n\t\t\t\t_RefreshInfoMenu.Items.Add(item);\r\n\t\t\t}\r\n\t\t\t_RefreshInfoMenu.ItemClicked += (s, args) => _listHelper.RefreshInfo(ValueHelper.MapValue(args.ClickedItem.Text, Constants.Encoding.EncodingNames, Constants.Encoding.Encodings));\r\n\t\t\t_AddFilesButton.DropDownOpening += FileListHelper.OpenPdfButtonDropDownOpeningHandler;\r\n\t\t\t_AddFilesButton.DropDownItemClicked += (s, args) => {\r\n\t\t\t\targs.ClickedItem.Owner.Hide();\r\n\t\t\t\tExecuteCommand(Commands.OpenFile, args.ClickedItem.ToolTipText);\r\n\t\t\t};\r\n\t\t\tRecentFileItemClicked += (s, args) => ExecuteCommand(Commands.OpenFile, args.ClickedItem.ToolTipText);\r\n\t\t}\r\n\r\n\t\tpublic override void SetupCommand(ToolStripItem item) {\r\n\t\t\tif (__EnabledCommands.Contains(item.Name)\r\n\t\t\t\t|| Commands.CommonSelectionCommands.Contains(item.Name)) {\r\n\t\t\t\tEnableCommand(item, _ItemList.GetItemCount() > 0 && _ItemList.Focused, true);\r\n\t\t\t}\r\n\t\t\tbase.SetupCommand(item);\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tif (_listHelper.ProcessCommonMenuCommand(commandName)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\tvar b = _OpenPdfBox;\r\n\t\t\t\t\t_AddFilesButton.DropDown.Items.ClearDropDownItems();\r\n\t\t\t\t\tif (b.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t\t\tAddFiles(b.FileNames, true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Commands.OpenFile:\r\n\t\t\t\t\tAddFiles(parameters, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t}\r\n\r\n\t\tvoid FileControl_BrowseForFile(object sender, EventArgs e) {\r\n\t\t\t_listHelper.PrepareSourceFiles();\r\n\t\t}\r\n\r\n\t\tvoid _RenameButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar targetPdfFile = _TargetPdfFile.Text.Trim();\r\n\t\t\tif (String.IsNullOrEmpty(targetPdfFile) && String.IsNullOrEmpty(targetPdfFile = _TargetPdfFile.BrowseTargetFile())) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tif (l == 0) {\r\n\t\t\t\tFormHelper.InfoBox(\"请添加需要重命名的 PDF 文件。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar files = GetSourceItemList();\r\n\t\t\t_TargetPdfFile.FileList.AddHistoryItem();\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar items = _listHelper.GetSourceItems<SourceItem.Pdf>(false);\r\n\t\t\t\tProcessor.Worker.RenameFiles(items, targetPdfFile, _KeepSourceFileBox.Checked);\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerAsync();\r\n\t\t}\r\n\r\n\t\tvoid AddFiles(string[] files, bool alertInvalidFiles) {\r\n\t\t\tif (files == null || files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ((ModifierKeys & Keys.Control) != Keys.None || _AutoClearListBox.Checked) {\r\n\t\t\t\t_ItemList.ClearObjects();\r\n\t\t\t}\r\n\t\t\tif (files.Length > 3) {\r\n\t\t\t\tAppContext.MainForm.Enabled = false;\r\n\t\t\t}\r\n\t\t\tif (files.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_AddDocumentWorker.RunWorkerAsync(files);\r\n\t\t}\r\n\r\n\t\tList<SourceItem> GetSourceItemList() {\r\n\t\t\tvar l = _ItemList.GetItemCount();\r\n\t\t\tvar files = new List<SourceItem>(l);\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tvar item = _ItemList.GetModelObject(_ItemList.GetNthItemInDisplayOrder(i).Index) as SourceItem;\r\n\t\t\t\tif (item.Type == SourceItem.ItemType.Pdf\r\n\t\t\t\t\t&& FileHelper.HasExtension(item.FilePath, Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\tAppContext.RecentItems.AddHistoryItem(AppContext.Recent.SourcePdfFiles, item.FilePath.ToString());\r\n\t\t\t\t}\r\n\t\t\t\tfiles.Add(item);\r\n\t\t\t}\r\n\t\t\treturn files;\r\n\t\t}\r\n\r\n\t\tvoid _SortMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tswitch (e.ClickedItem.Name) {\r\n\t\t\t\tcase \"_SortByAlphaItem\":\r\n\t\t\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0, false);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"_SortByNaturalNumberItem\":\r\n\t\t\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(0, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ImageList_ColumnClick(object sender, ColumnClickEventArgs e) {\r\n\t\t\tvar c = e.Column;\r\n\t\t\tvar ss = c == 0 || c == _PageCountColumn.Index;\r\n\t\t\tvar o = _ItemList.PrimarySortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;\r\n\t\t\t_ItemList.ListViewItemSorter = new ListViewItemComparer(e.Column, ss, o);\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ButtonClick(object sender, EventArgs e) {\r\n\t\t\tif (sender == _AddFilesButton) {\r\n\t\t\t\tExecuteCommand(Commands.Open);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _MainToolbar_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tExecuteCommand(e.ClickedItem.Name);\r\n\t\t}\r\n\r\n\t\tvoid _TestRenameButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (String.IsNullOrEmpty(_TargetPdfFile.Text)) {\r\n\t\t\t\tFormHelper.ErrorBox(Messages.TargetFileNotSpecified);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar pdfs = _listHelper.GetSourceItems<SourceItem.Pdf>(false);\r\n\t\t\tif (pdfs.Count == 0) {\r\n\t\t\t\tFormHelper.InfoBox(\"请添加需要重命名的 PDF 文件。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tPreviewRename(pdfs, _TargetPdfFile.Text);\r\n\t\t}\r\n\r\n\t\tvoid PreviewRename(List<SourceItem.Pdf> items, string template) {\r\n\t\t\tvar i = 0;\r\n\t\t\tvar result = new string[items.Count];\r\n\t\t\tvar source = new string[items.Count];\r\n\t\t\tFilePath s;\r\n\t\t\tstring t;\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\ts = item.FilePath;\r\n\t\t\t\t\tif (s.ExistsFile == false) {\r\n\t\t\t\t\t\tt = $\"(找不到 PDF 文件：{s})\";\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tt = Processor.Worker.GetExpandedFileName(item, template);\r\n\t\t\t\t\t\tif (t.Length == 0) {\r\n\t\t\t\t\t\t\tt = \"<输出文件名无效>\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (Path.GetFileName(t).Length == 0) {\r\n\t\t\t\t\t\t\tt = \"<输出文件名为空>\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsource[i] = s.ToString();\r\n\t\t\t\t\tresult[i] = t;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tFormHelper.ErrorBox(ex.Message);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tusing (var f = new Functions.RenamePreviewForm(source, result)) {\r\n\t\t\t\tf.ShowDialog();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region AddDocumentWorker\r\n\t\tvoid _AddDocumentWorker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\tvar files = e.Argument as string[];\r\n\t\t\tArray.ForEach(files, f => ((BackgroundWorker)sender).ReportProgress(0, f));\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\tAppContext.MainForm.Enabled = true;\r\n\t\t}\r\n\r\n\t\tvoid _AddDocumentWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {\r\n\t\t\tvar item = e.UserState as string;\r\n\t\t\tAddItem(SourceItem.Create(item));\r\n\t\t}\r\n\r\n\t\tvoid AddItem(SourceItem item) {\r\n\t\t\tif (item == null || item.Type != SourceItem.ItemType.Pdf) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tAddItems(new SourceItem[] { item });\r\n\t\t}\r\n\r\n\t\tvoid AddItems(System.Collections.ICollection items) {\r\n\t\t\tvar i = _ItemList.GetLastSelectedIndex();\r\n\t\t\t_ItemList.InsertObjects(++i, items);\r\n\t\t\t_ItemList.SelectedIndex = --i + items.Count;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region IDefaultButtonControl 成员\r\n\r\n\t\tpublic override Button DefaultButton => _RenameButton;\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/RenameControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_MainToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>495, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_RecentFileMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>614, 17</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Sort.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SortMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>135, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_Delete.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectAll.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InvertSelection.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectNone.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Copy.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshInfo.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_RefreshInfoMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>149, 54</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectionMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>240, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_ItemListMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>370, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_FileTypeList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 54</value>\r\n  </metadata>\r\n  <metadata name=\"_OpenPdfBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_AddDocumentWorker.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>750, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/RenamePreviewForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class RenamePreviewForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._RenamePreviewBox = new System.Windows.Forms.ListView ();\r\n\t\t\tthis._OriginalNameColumn = new System.Windows.Forms.ColumnHeader ();\r\n\t\t\tthis._OutputNameColumn = new System.Windows.Forms.ColumnHeader ();\r\n\t\t\tthis._OriginalFolderColumn = new System.Windows.Forms.ColumnHeader ();\r\n\t\t\tthis._OutputFolderColumn = new System.Windows.Forms.ColumnHeader ();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._OKButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _RenamePreviewBox\r\n\t\t\t// \r\n\t\t\tthis._RenamePreviewBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Left)\r\n\t\t\t\t\t\t| System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._RenamePreviewBox.Columns.AddRange (new System.Windows.Forms.ColumnHeader[] {\r\n            this._OriginalNameColumn,\r\n            this._OutputNameColumn,\r\n            this._OriginalFolderColumn,\r\n            this._OutputFolderColumn});\r\n\t\t\tthis._RenamePreviewBox.GridLines = true;\r\n\t\t\tthis._RenamePreviewBox.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r\n\t\t\tthis._RenamePreviewBox.Location = new System.Drawing.Point (12, 24);\r\n\t\t\tthis._RenamePreviewBox.Name = \"_RenamePreviewBox\";\r\n\t\t\tthis._RenamePreviewBox.Size = new System.Drawing.Size (456, 197);\r\n\t\t\tthis._RenamePreviewBox.TabIndex = 0;\r\n\t\t\tthis._RenamePreviewBox.UseCompatibleStateImageBehavior = false;\r\n\t\t\tthis._RenamePreviewBox.View = System.Windows.Forms.View.Details;\r\n\t\t\t// \r\n\t\t\t// _OriginalNameColumn\r\n\t\t\t// \r\n\t\t\tthis._OriginalNameColumn.Text = \"原始文件名\";\r\n\t\t\tthis._OriginalNameColumn.Width = 84;\r\n\t\t\t// \r\n\t\t\t// _OutputNameColumn\r\n\t\t\t// \r\n\t\t\tthis._OutputNameColumn.Text = \"输出文件名\";\r\n\t\t\tthis._OutputNameColumn.Width = 83;\r\n\t\t\t// \r\n\t\t\t// _OriginalFolderColumn\r\n\t\t\t// \r\n\t\t\tthis._OriginalFolderColumn.Text = \"原始文件夹\";\r\n\t\t\tthis._OriginalFolderColumn.Width = 85;\r\n\t\t\t// \r\n\t\t\t// _OutputFolderColumn\r\n\t\t\t// \r\n\t\t\tthis._OutputFolderColumn.Text = \"输出文件夹\";\r\n\t\t\tthis._OutputFolderColumn.Width = 88;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point (12, 9);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size (149, 12);\r\n\t\t\tthis.label1.TabIndex = 1;\r\n\t\t\tthis.label1.Text = \"PDF 文件重命名结果预览：\";\r\n\t\t\t// \r\n\t\t\t// _OKButton\r\n\t\t\t// \r\n\t\t\tthis._OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OKButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._OKButton.Location = new System.Drawing.Point (393, 232);\r\n\t\t\tthis._OKButton.Name = \"_OKButton\";\r\n\t\t\tthis._OKButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._OKButton.TabIndex = 2;\r\n\t\t\tthis._OKButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OKButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OKButton.Click += new System.EventHandler (this._OKButton_Click);\r\n\t\t\t// \r\n\t\t\t// RenamePreviewForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OKButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._OKButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (480, 267);\r\n\t\t\tthis.Controls.Add (this._OKButton);\r\n\t\t\tthis.Controls.Add (this.label1);\r\n\t\t\tthis.Controls.Add (this._RenamePreviewBox);\r\n\t\t\tthis.MinimumSize = new System.Drawing.Size (300, 200);\r\n\t\t\tthis.Name = \"RenamePreviewForm\";\r\n\t\t\tthis.Text = \"重命名结果预览\";\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.ListView _RenamePreviewBox;\r\n\t\tprivate System.Windows.Forms.ColumnHeader _OriginalNameColumn;\r\n\t\tprivate System.Windows.Forms.ColumnHeader _OutputNameColumn;\r\n\t\tprivate System.Windows.Forms.ColumnHeader _OriginalFolderColumn;\r\n\t\tprivate System.Windows.Forms.ColumnHeader _OutputFolderColumn;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.Button _OKButton;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/RenamePreviewForm.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic partial class RenamePreviewForm : Form\r\n\t{\r\n\t\tpublic RenamePreviewForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\t\tpublic RenamePreviewForm(string[] sourceFiles, string[] targetFiles) : this() {\r\n\t\t\tvar l = sourceFiles.Length;\r\n\t\t\tvar c = _RenamePreviewBox.Items;\r\n\t\t\tFilePath s, t;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\ts = sourceFiles[i];\r\n\t\t\t\tt = targetFiles[i];\r\n\t\t\t\tif (t.IsEmpty) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (t.ToString().IndexOf('<') == -1) {\r\n\t\t\t\t\tc.Add(new ListViewItem(new string[]{\r\n\t\t\t\t\t\ts.FileName,\r\n\t\t\t\t\t\tt.FileName,\r\n\t\t\t\t\t\ts.Directory,\r\n\t\t\t\t\t\tt.Directory\r\n\t\t\t\t\t}));\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar item = c.Add(new ListViewItem(new string[]{\r\n\t\t\t\t\t\ts.FileName,\r\n\t\t\t\t\t\tt,\r\n\t\t\t\t\t\ts.Directory,\r\n\t\t\t\t\t\tString.Empty\r\n\t\t\t\t\t}));\r\n\t\t\t\t\titem.UseItemStyleForSubItems = false;\r\n\t\t\t\t\titem.SubItems[1].BackColor = Color.LightYellow;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tforeach (ColumnHeader item in _RenamePreviewBox.Columns) {\r\n\t\t\t\titem.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void _OKButton_Click(object sender, EventArgs e) {\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/RenamePreviewForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/RenderImageControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class RenderImageControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._ExtractPageRangeBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SaveImageBox = new System.Windows.Forms.FolderBrowserDialog();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._FileMaskPreviewBox = new System.Windows.Forms.Label();\r\n\t\t\tthis._FileNameMaskBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis._InvertColorBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl();\r\n\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis.groupBox3 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._RotationBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label();\r\n\t\t\tthis._HorizontalFlipImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._HideAnnotationsBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._VerticalFlipImageBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._ResolutionBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label();\r\n\t\t\tthis._ExtractPageImageWidthBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis._ExtractPageRatioBox = new System.Windows.Forms.NumericUpDown();\r\n\t\t\tthis.label13 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label();\r\n\t\t\tthis._SpecificRatioBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis._SpecificWidthBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox();\r\n\t\t\tthis._ColorSpaceRgbBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label();\r\n\t\t\tthis._QuantizeBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._ColorSpaceGrayBox = new System.Windows.Forms.RadioButton();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label();\r\n\t\t\tthis._JpegQualityBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis._ImageFormatBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage();\r\n\t\t\tthis._AutoOutputDirBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis._BrowseTargetPdfButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._TargetBox = new PDFPatcher.HistoryComboBox();\r\n\t\t\tthis._SourceFileControl = new PDFPatcher.SourceFileControl();\r\n\t\t\tthis._ExtractButton = new EnhancedGlassButton.GlassButton();\r\n\t\t\tthis._RenderToPdfBox = new System.Windows.Forms.CheckBox();\r\n\t\t\tthis.tabControl1.SuspendLayout();\r\n\t\t\tthis.tabPage1.SuspendLayout();\r\n\t\t\tthis.groupBox3.SuspendLayout();\r\n\t\t\tthis.groupBox2.SuspendLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ExtractPageImageWidthBox)).BeginInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ExtractPageRatioBox)).BeginInit();\r\n\t\t\tthis.groupBox1.SuspendLayout();\r\n\t\t\tthis.tabPage2.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _ExtractPageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageRangeBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExtractPageRangeBox.Location = new System.Drawing.Point(93, 6);\r\n\t\t\tthis._ExtractPageRangeBox.Name = \"_ExtractPageRangeBox\";\r\n\t\t\tthis._ExtractPageRangeBox.Size = new System.Drawing.Size(478, 21);\r\n\t\t\tthis._ExtractPageRangeBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(6, 9);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _SaveImageBox\r\n\t\t\t// \r\n\t\t\tthis._SaveImageBox.Description = \"请选择保存图片的文件夹\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(17, 39);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label4.TabIndex = 1;\r\n\t\t\tthis.label4.Text = \"输出图片位置：\";\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(6, 9);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label2.TabIndex = 0;\r\n\t\t\tthis.label2.Text = \"文件名掩码：\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(10, 30);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(77, 12);\r\n\t\t\tthis.label5.TabIndex = 2;\r\n\t\t\tthis.label5.Text = \"文件名示例：\";\r\n\t\t\t// \r\n\t\t\t// _FileMaskPreviewBox\r\n\t\t\t// \r\n\t\t\tthis._FileMaskPreviewBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FileMaskPreviewBox.Location = new System.Drawing.Point(93, 30);\r\n\t\t\tthis._FileMaskPreviewBox.Name = \"_FileMaskPreviewBox\";\r\n\t\t\tthis._FileMaskPreviewBox.Size = new System.Drawing.Size(330, 31);\r\n\t\t\tthis._FileMaskPreviewBox.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _FileNameMaskBox\r\n\t\t\t// \r\n\t\t\tthis._FileNameMaskBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._FileNameMaskBox.FormattingEnabled = true;\r\n\t\t\tthis._FileNameMaskBox.Items.AddRange(new object[] {\r\n            \"0000\",\r\n            \"000\",\r\n            \"0\",\r\n            \"图片0000\"});\r\n\t\t\tthis._FileNameMaskBox.Location = new System.Drawing.Point(93, 6);\r\n\t\t\tthis._FileNameMaskBox.Name = \"_FileNameMaskBox\";\r\n\t\t\tthis._FileNameMaskBox.Size = new System.Drawing.Size(244, 20);\r\n\t\t\tthis._FileNameMaskBox.TabIndex = 1;\r\n\t\t\tthis._FileNameMaskBox.TextChanged += new System.EventHandler(this._FileNameMaskBox_TextChanged);\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.Location = new System.Drawing.Point(46, 30);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(522, 38);\r\n\t\t\tthis.label6.TabIndex = 2;\r\n\t\t\tthis.label6.Text = \"用“-”表示起止页码。多个页码可用“;”、“,”或“ ”（空格）隔开，如“1;4-15;2 56”，表示依次提取第1页、第4至15页、第2页和第56页的内容。不指\" +\r\n    \"定页码时提取源文件所有页面的内容。\";\r\n\t\t\t// \r\n\t\t\t// _InvertColorBox\r\n\t\t\t// \r\n\t\t\tthis._InvertColorBox.AutoSize = true;\r\n\t\t\tthis._InvertColorBox.Location = new System.Drawing.Point(10, 48);\r\n\t\t\tthis._InvertColorBox.Name = \"_InvertColorBox\";\r\n\t\t\tthis._InvertColorBox.Size = new System.Drawing.Size(108, 16);\r\n\t\t\tthis._InvertColorBox.TabIndex = 3;\r\n\t\t\tthis._InvertColorBox.Text = \"反转图片的颜色\";\r\n\t\t\tthis._InvertColorBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// tabControl1\r\n\t\t\t// \r\n\t\t\tthis.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage1);\r\n\t\t\tthis.tabControl1.Controls.Add(this.tabPage2);\r\n\t\t\tthis.tabControl1.Location = new System.Drawing.Point(12, 92);\r\n\t\t\tthis.tabControl1.Name = \"tabControl1\";\r\n\t\t\tthis.tabControl1.SelectedIndex = 0;\r\n\t\t\tthis.tabControl1.Size = new System.Drawing.Size(585, 229);\r\n\t\t\tthis.tabControl1.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// tabPage1\r\n\t\t\t// \r\n\t\t\tthis.tabPage1.Controls.Add(this.groupBox3);\r\n\t\t\tthis.tabPage1.Controls.Add(this.groupBox2);\r\n\t\t\tthis.tabPage1.Controls.Add(this.groupBox1);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label11);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label7);\r\n\t\t\tthis.tabPage1.Controls.Add(this._JpegQualityBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this._ImageFormatBox);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label3);\r\n\t\t\tthis.tabPage1.Controls.Add(this.label6);\r\n\t\t\tthis.tabPage1.Controls.Add(this._ExtractPageRangeBox);\r\n\t\t\tthis.tabPage1.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage1.Name = \"tabPage1\";\r\n\t\t\tthis.tabPage1.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis.tabPage1.Size = new System.Drawing.Size(577, 203);\r\n\t\t\tthis.tabPage1.TabIndex = 0;\r\n\t\t\tthis.tabPage1.Text = \"选项\";\r\n\t\t\tthis.tabPage1.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox3\r\n\t\t\t// \r\n\t\t\tthis.groupBox3.Controls.Add(this._RotationBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this.label9);\r\n\t\t\tthis.groupBox3.Controls.Add(this._HorizontalFlipImageBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._HideAnnotationsBox);\r\n\t\t\tthis.groupBox3.Controls.Add(this._VerticalFlipImageBox);\r\n\t\t\tthis.groupBox3.Location = new System.Drawing.Point(378, 97);\r\n\t\t\tthis.groupBox3.Name = \"groupBox3\";\r\n\t\t\tthis.groupBox3.Size = new System.Drawing.Size(179, 100);\r\n\t\t\tthis.groupBox3.TabIndex = 10;\r\n\t\t\tthis.groupBox3.TabStop = false;\r\n\t\t\tthis.groupBox3.Text = \"其它\";\r\n\t\t\t// \r\n\t\t\t// _RotationBox\r\n\t\t\t// \r\n\t\t\tthis._RotationBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._RotationBox.FormattingEnabled = true;\r\n\t\t\tthis._RotationBox.Items.AddRange(new object[] {\r\n            \"不旋转\",\r\n            \"顺时针90度\",\r\n            \"180度\",\r\n            \"逆时针90度\"});\r\n\t\t\tthis._RotationBox.Location = new System.Drawing.Point(76, 20);\r\n\t\t\tthis._RotationBox.Name = \"_RotationBox\";\r\n\t\t\tthis._RotationBox.Size = new System.Drawing.Size(86, 20);\r\n\t\t\tthis._RotationBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point(5, 24);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size(65, 12);\r\n\t\t\tthis.label9.TabIndex = 0;\r\n\t\t\tthis.label9.Text = \"旋转角度：\";\r\n\t\t\t// \r\n\t\t\t// _HorizontalFlipImageBox\r\n\t\t\t// \r\n\t\t\tthis._HorizontalFlipImageBox.AutoSize = true;\r\n\t\t\tthis._HorizontalFlipImageBox.Location = new System.Drawing.Point(7, 48);\r\n\t\t\tthis._HorizontalFlipImageBox.Name = \"_HorizontalFlipImageBox\";\r\n\t\t\tthis._HorizontalFlipImageBox.Size = new System.Drawing.Size(72, 16);\r\n\t\t\tthis._HorizontalFlipImageBox.TabIndex = 2;\r\n\t\t\tthis._HorizontalFlipImageBox.Text = \"水平翻转\";\r\n\t\t\tthis._HorizontalFlipImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _HideAnnotationsBox\r\n\t\t\t// \r\n\t\t\tthis._HideAnnotationsBox.AutoSize = true;\r\n\t\t\tthis._HideAnnotationsBox.Location = new System.Drawing.Point(7, 70);\r\n\t\t\tthis._HideAnnotationsBox.Name = \"_HideAnnotationsBox\";\r\n\t\t\tthis._HideAnnotationsBox.Size = new System.Drawing.Size(96, 16);\r\n\t\t\tthis._HideAnnotationsBox.TabIndex = 4;\r\n\t\t\tthis._HideAnnotationsBox.Text = \"隐藏批注内容\";\r\n\t\t\tthis._HideAnnotationsBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _VerticalFlipImageBox\r\n\t\t\t// \r\n\t\t\tthis._VerticalFlipImageBox.AutoSize = true;\r\n\t\t\tthis._VerticalFlipImageBox.Location = new System.Drawing.Point(85, 48);\r\n\t\t\tthis._VerticalFlipImageBox.Name = \"_VerticalFlipImageBox\";\r\n\t\t\tthis._VerticalFlipImageBox.Size = new System.Drawing.Size(72, 16);\r\n\t\t\tthis._VerticalFlipImageBox.TabIndex = 3;\r\n\t\t\tthis._VerticalFlipImageBox.Text = \"垂直翻转\";\r\n\t\t\tthis._VerticalFlipImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Controls.Add(this._ResolutionBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label1);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label12);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ExtractPageImageWidthBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._ExtractPageRatioBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label13);\r\n\t\t\tthis.groupBox2.Controls.Add(this.label10);\r\n\t\t\tthis.groupBox2.Controls.Add(this._SpecificRatioBox);\r\n\t\t\tthis.groupBox2.Controls.Add(this._SpecificWidthBox);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point(193, 97);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size(179, 100);\r\n\t\t\tthis.groupBox2.TabIndex = 9;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"输出图片尺寸\";\r\n\t\t\t// \r\n\t\t\t// _ResolutionBox\r\n\t\t\t// \r\n\t\t\tthis._ResolutionBox.FormattingEnabled = true;\r\n\t\t\tthis._ResolutionBox.Items.AddRange(new object[] {\r\n            \"72\",\r\n            \"96\",\r\n            \"100\",\r\n            \"150\",\r\n            \"200\",\r\n            \"300\",\r\n            \"400\",\r\n            \"600\",\r\n            \"1200\",\r\n            \"2400\"});\r\n\t\t\tthis._ResolutionBox.Location = new System.Drawing.Point(86, 74);\r\n\t\t\tthis._ResolutionBox.Name = \"_ResolutionBox\";\r\n\t\t\tthis._ResolutionBox.Size = new System.Drawing.Size(55, 20);\r\n\t\t\tthis._ResolutionBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(7, 77);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(53, 12);\r\n\t\t\tthis.label1.TabIndex = 6;\r\n\t\t\tthis.label1.Text = \"分辨率：\";\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.AutoSize = true;\r\n\t\t\tthis.label12.Location = new System.Drawing.Point(147, 23);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size(17, 12);\r\n\t\t\tthis.label12.TabIndex = 5;\r\n\t\t\tthis.label12.Text = \"倍\";\r\n\t\t\t// \r\n\t\t\t// _ExtractPageImageWidthBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageImageWidthBox.Increment = new decimal(new int[] {\r\n            100,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._ExtractPageImageWidthBox.Location = new System.Drawing.Point(86, 48);\r\n\t\t\tthis._ExtractPageImageWidthBox.Maximum = new decimal(new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._ExtractPageImageWidthBox.Name = \"_ExtractPageImageWidthBox\";\r\n\t\t\tthis._ExtractPageImageWidthBox.Size = new System.Drawing.Size(55, 21);\r\n\t\t\tthis._ExtractPageImageWidthBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _ExtractPageRatioBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractPageRatioBox.DecimalPlaces = 1;\r\n\t\t\tthis._ExtractPageRatioBox.Increment = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._ExtractPageRatioBox.Location = new System.Drawing.Point(86, 21);\r\n\t\t\tthis._ExtractPageRatioBox.Maximum = new decimal(new int[] {\r\n            20,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._ExtractPageRatioBox.Minimum = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            65536});\r\n\t\t\tthis._ExtractPageRatioBox.Name = \"_ExtractPageRatioBox\";\r\n\t\t\tthis._ExtractPageRatioBox.Size = new System.Drawing.Size(55, 21);\r\n\t\t\tthis._ExtractPageRatioBox.TabIndex = 4;\r\n\t\t\tthis._ExtractPageRatioBox.Value = new decimal(new int[] {\r\n            1,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\t// \r\n\t\t\t// label13\r\n\t\t\t// \r\n\t\t\tthis.label13.AutoSize = true;\r\n\t\t\tthis.label13.Location = new System.Drawing.Point(147, 77);\r\n\t\t\tthis.label13.Name = \"label13\";\r\n\t\t\tthis.label13.Size = new System.Drawing.Size(23, 12);\r\n\t\t\tthis.label13.TabIndex = 2;\r\n\t\t\tthis.label13.Text = \"DPI\";\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point(147, 50);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size(29, 12);\r\n\t\t\tthis.label10.TabIndex = 2;\r\n\t\t\tthis.label10.Text = \"像素\";\r\n\t\t\t// \r\n\t\t\t// _SpecificRatioBox\r\n\t\t\t// \r\n\t\t\tthis._SpecificRatioBox.AutoSize = true;\r\n\t\t\tthis._SpecificRatioBox.Location = new System.Drawing.Point(9, 21);\r\n\t\t\tthis._SpecificRatioBox.Name = \"_SpecificRatioBox\";\r\n\t\t\tthis._SpecificRatioBox.Size = new System.Drawing.Size(71, 16);\r\n\t\t\tthis._SpecificRatioBox.TabIndex = 3;\r\n\t\t\tthis._SpecificRatioBox.TabStop = true;\r\n\t\t\tthis._SpecificRatioBox.Text = \"指定比例\";\r\n\t\t\tthis._SpecificRatioBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _SpecificWidthBox\r\n\t\t\t// \r\n\t\t\tthis._SpecificWidthBox.AutoSize = true;\r\n\t\t\tthis._SpecificWidthBox.Location = new System.Drawing.Point(9, 49);\r\n\t\t\tthis._SpecificWidthBox.Name = \"_SpecificWidthBox\";\r\n\t\t\tthis._SpecificWidthBox.Size = new System.Drawing.Size(71, 16);\r\n\t\t\tthis._SpecificWidthBox.TabIndex = 0;\r\n\t\t\tthis._SpecificWidthBox.TabStop = true;\r\n\t\t\tthis._SpecificWidthBox.Text = \"指定宽度\";\r\n\t\t\tthis._SpecificWidthBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Controls.Add(this._ColorSpaceRgbBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this.label8);\r\n\t\t\tthis.groupBox1.Controls.Add(this._QuantizeBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._ColorSpaceGrayBox);\r\n\t\t\tthis.groupBox1.Controls.Add(this._InvertColorBox);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point(8, 97);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size(179, 100);\r\n\t\t\tthis.groupBox1.TabIndex = 8;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"颜色\";\r\n\t\t\t// \r\n\t\t\t// _ColorSpaceRgbBox\r\n\t\t\t// \r\n\t\t\tthis._ColorSpaceRgbBox.AutoSize = true;\r\n\t\t\tthis._ColorSpaceRgbBox.Location = new System.Drawing.Point(55, 22);\r\n\t\t\tthis._ColorSpaceRgbBox.Name = \"_ColorSpaceRgbBox\";\r\n\t\t\tthis._ColorSpaceRgbBox.Size = new System.Drawing.Size(47, 16);\r\n\t\t\tthis._ColorSpaceRgbBox.TabIndex = 1;\r\n\t\t\tthis._ColorSpaceRgbBox.TabStop = true;\r\n\t\t\tthis._ColorSpaceRgbBox.Text = \"彩色\";\r\n\t\t\tthis._ColorSpaceRgbBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point(8, 23);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size(41, 12);\r\n\t\t\tthis.label8.TabIndex = 0;\r\n\t\t\tthis.label8.Text = \"颜色：\";\r\n\t\t\t// \r\n\t\t\t// _QuantizeBox\r\n\t\t\t// \r\n\t\t\tthis._QuantizeBox.AutoSize = true;\r\n\t\t\tthis._QuantizeBox.Location = new System.Drawing.Point(10, 70);\r\n\t\t\tthis._QuantizeBox.Name = \"_QuantizeBox\";\r\n\t\t\tthis._QuantizeBox.Size = new System.Drawing.Size(108, 16);\r\n\t\t\tthis._QuantizeBox.TabIndex = 4;\r\n\t\t\tthis._QuantizeBox.Text = \"减少图片的颜色\";\r\n\t\t\tthis._QuantizeBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _ColorSpaceGrayBox\r\n\t\t\t// \r\n\t\t\tthis._ColorSpaceGrayBox.AutoSize = true;\r\n\t\t\tthis._ColorSpaceGrayBox.Location = new System.Drawing.Point(108, 22);\r\n\t\t\tthis._ColorSpaceGrayBox.Name = \"_ColorSpaceGrayBox\";\r\n\t\t\tthis._ColorSpaceGrayBox.Size = new System.Drawing.Size(47, 16);\r\n\t\t\tthis._ColorSpaceGrayBox.TabIndex = 2;\r\n\t\t\tthis._ColorSpaceGrayBox.TabStop = true;\r\n\t\t\tthis._ColorSpaceGrayBox.Text = \"灰度\";\r\n\t\t\tthis._ColorSpaceGrayBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point(193, 74);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label11.TabIndex = 5;\r\n\t\t\tthis.label11.Text = \"JPEG图片质量：\";\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point(6, 74);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size(89, 12);\r\n\t\t\tthis.label7.TabIndex = 3;\r\n\t\t\tthis.label7.Text = \"输出图片格式：\";\r\n\t\t\t// \r\n\t\t\t// _JpegQualityBox\r\n\t\t\t// \r\n\t\t\tthis._JpegQualityBox.FormattingEnabled = true;\r\n\t\t\tthis._JpegQualityBox.Items.AddRange(new object[] {\r\n            \"95\",\r\n            \"85\",\r\n            \"75\",\r\n            \"50\",\r\n            \"30\"});\r\n\t\t\tthis._JpegQualityBox.Location = new System.Drawing.Point(288, 71);\r\n\t\t\tthis._JpegQualityBox.Name = \"_JpegQualityBox\";\r\n\t\t\tthis._JpegQualityBox.Size = new System.Drawing.Size(86, 20);\r\n\t\t\tthis._JpegQualityBox.TabIndex = 6;\r\n\t\t\t// \r\n\t\t\t// _ImageFormatBox\r\n\t\t\t// \r\n\t\t\tthis._ImageFormatBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ImageFormatBox.FormattingEnabled = true;\r\n\t\t\tthis._ImageFormatBox.Items.AddRange(new object[] {\r\n            \"PNG\",\r\n            \"JPEG\",\r\n            \"黑白TIFF\"});\r\n\t\t\tthis._ImageFormatBox.Location = new System.Drawing.Point(101, 71);\r\n\t\t\tthis._ImageFormatBox.Name = \"_ImageFormatBox\";\r\n\t\t\tthis._ImageFormatBox.Size = new System.Drawing.Size(78, 20);\r\n\t\t\tthis._ImageFormatBox.TabIndex = 4;\r\n\t\t\t// \r\n\t\t\t// tabPage2\r\n\t\t\t// \r\n\t\t\tthis.tabPage2.Controls.Add(this._FileNameMaskBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label2);\r\n\t\t\tthis.tabPage2.Controls.Add(this._AutoOutputDirBox);\r\n\t\t\tthis.tabPage2.Controls.Add(this.label5);\r\n\t\t\tthis.tabPage2.Controls.Add(this._FileMaskPreviewBox);\r\n\t\t\tthis.tabPage2.Location = new System.Drawing.Point(4, 22);\r\n\t\t\tthis.tabPage2.Name = \"tabPage2\";\r\n\t\t\tthis.tabPage2.Padding = new System.Windows.Forms.Padding(3);\r\n\t\t\tthis.tabPage2.Size = new System.Drawing.Size(577, 203);\r\n\t\t\tthis.tabPage2.TabIndex = 1;\r\n\t\t\tthis.tabPage2.Text = \"文件命名\";\r\n\t\t\tthis.tabPage2.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _AutoOutputDirBox\r\n\t\t\t// \r\n\t\t\tthis._AutoOutputDirBox.AutoSize = true;\r\n\t\t\tthis._AutoOutputDirBox.Location = new System.Drawing.Point(344, 8);\r\n\t\t\tthis._AutoOutputDirBox.Name = \"_AutoOutputDirBox\";\r\n\t\t\tthis._AutoOutputDirBox.Size = new System.Drawing.Size(156, 16);\r\n\t\t\tthis._AutoOutputDirBox.TabIndex = 5;\r\n\t\t\tthis._AutoOutputDirBox.Text = \"自动指定输出图片的位置\";\r\n\t\t\tthis._AutoOutputDirBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _BrowseTargetPdfButton\r\n\t\t\t// \r\n\t\t\tthis._BrowseTargetPdfButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._BrowseTargetPdfButton.Image = global::PDFPatcher.Properties.Resources.ImageFolder;\r\n\t\t\tthis._BrowseTargetPdfButton.Location = new System.Drawing.Point(522, 34);\r\n\t\t\tthis._BrowseTargetPdfButton.Name = \"_BrowseTargetPdfButton\";\r\n\t\t\tthis._BrowseTargetPdfButton.Size = new System.Drawing.Size(75, 23);\r\n\t\t\tthis._BrowseTargetPdfButton.TabIndex = 3;\r\n\t\t\tthis._BrowseTargetPdfButton.Text = \"浏览...\";\r\n\t\t\tthis._BrowseTargetPdfButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._BrowseTargetPdfButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._BrowseTargetPdfButton.Click += new System.EventHandler(this._BrowseTargetPdfButton_Click);\r\n\t\t\t// \r\n\t\t\t// _TargetBox\r\n\t\t\t// \r\n\t\t\tthis._TargetBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TargetBox.Contents = null;\r\n\t\t\tthis._TargetBox.FormattingEnabled = true;\r\n\t\t\tthis._TargetBox.Location = new System.Drawing.Point(112, 36);\r\n\t\t\tthis._TargetBox.MaxItemCount = 16;\r\n\t\t\tthis._TargetBox.Name = \"_TargetBox\";\r\n\t\t\tthis._TargetBox.Size = new System.Drawing.Size(404, 20);\r\n\t\t\tthis._TargetBox.TabIndex = 2;\r\n\t\t\t// \r\n\t\t\t// _SourceFileControl\r\n\t\t\t// \r\n\t\t\tthis._SourceFileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._SourceFileControl.Location = new System.Drawing.Point(12, 3);\r\n\t\t\tthis._SourceFileControl.Name = \"_SourceFileControl\";\r\n\t\t\tthis._SourceFileControl.Size = new System.Drawing.Size(588, 29);\r\n\t\t\tthis._SourceFileControl.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _ExtractButton\r\n\t\t\t// \r\n\t\t\tthis._ExtractButton.AlternativeFocusBorderColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExtractButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ExtractButton.AnimateGlow = true;\r\n\t\t\tthis._ExtractButton.BackColor = System.Drawing.SystemColors.Highlight;\r\n\t\t\tthis._ExtractButton.CornerRadius = 3;\r\n\t\t\tthis._ExtractButton.ForeColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._ExtractButton.GlowColor = System.Drawing.Color.White;\r\n\t\t\tthis._ExtractButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._ExtractButton.InnerBorderColor = System.Drawing.SystemColors.ControlDarkDark;\r\n\t\t\tthis._ExtractButton.Location = new System.Drawing.Point(474, 63);\r\n\t\t\tthis._ExtractButton.Name = \"_ExtractButton\";\r\n\t\t\tthis._ExtractButton.OuterBorderColor = System.Drawing.SystemColors.ControlLightLight;\r\n\t\t\tthis._ExtractButton.ShowFocusBorder = true;\r\n\t\t\tthis._ExtractButton.Size = new System.Drawing.Size(123, 29);\r\n\t\t\tthis._ExtractButton.TabIndex = 6;\r\n\t\t\tthis._ExtractButton.Text = \" 转换图片(&T)\";\r\n\t\t\tthis._ExtractButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._ExtractButton.Click += new System.EventHandler(this._ExtractButton_Click);\r\n\t\t\t// \r\n\t\t\t// _RenderToPdfBox\r\n\t\t\t// \r\n\t\t\tthis._RenderToPdfBox.AutoSize = true;\r\n\t\t\tthis._RenderToPdfBox.Location = new System.Drawing.Point(19, 70);\r\n\t\t\tthis._RenderToPdfBox.Name = \"_RenderToPdfBox\";\r\n\t\t\tthis._RenderToPdfBox.Size = new System.Drawing.Size(162, 16);\r\n\t\t\tthis._RenderToPdfBox.TabIndex = 4;\r\n\t\t\tthis._RenderToPdfBox.Text = \"合并输出到图片 PDF 文件\";\r\n\t\t\tthis._RenderToPdfBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// RenderImageControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._RenderToPdfBox);\r\n\t\t\tthis.Controls.Add(this._ExtractButton);\r\n\t\t\tthis.Controls.Add(this.tabControl1);\r\n\t\t\tthis.Controls.Add(this._TargetBox);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this._SourceFileControl);\r\n\t\t\tthis.Controls.Add(this._BrowseTargetPdfButton);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"SimSun\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Name = \"RenderImageControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(612, 333);\r\n\t\t\tthis.Load += new System.EventHandler(this.Control_Show);\r\n\t\t\tthis.VisibleChanged += new System.EventHandler(this.Control_Show);\r\n\t\t\tthis.tabControl1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.ResumeLayout(false);\r\n\t\t\tthis.tabPage1.PerformLayout();\r\n\t\t\tthis.groupBox3.ResumeLayout(false);\r\n\t\t\tthis.groupBox3.PerformLayout();\r\n\t\t\tthis.groupBox2.ResumeLayout(false);\r\n\t\t\tthis.groupBox2.PerformLayout();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ExtractPageImageWidthBox)).EndInit();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._ExtractPageRatioBox)).EndInit();\r\n\t\t\tthis.groupBox1.ResumeLayout(false);\r\n\t\t\tthis.groupBox1.PerformLayout();\r\n\t\t\tthis.tabPage2.ResumeLayout(false);\r\n\t\t\tthis.tabPage2.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.TextBox _ExtractPageRangeBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Button _BrowseTargetPdfButton;\r\n\t\tprivate SourceFileControl _SourceFileControl;\r\n\t\tprivate System.Windows.Forms.FolderBrowserDialog _SaveImageBox;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.Label _FileMaskPreviewBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _FileNameMaskBox;\r\n\t\tprivate HistoryComboBox _TargetBox;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.CheckBox _InvertColorBox;\r\n\t\tprivate System.Windows.Forms.TabControl tabControl1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage1;\r\n\t\tprivate System.Windows.Forms.TabPage tabPage2;\r\n\t\tprivate System.Windows.Forms.CheckBox _AutoOutputDirBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _ExtractPageImageWidthBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ColorSpaceGrayBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _ColorSpaceRgbBox;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.ComboBox _ImageFormatBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _VerticalFlipImageBox;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.ComboBox _RotationBox;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.ComboBox _JpegQualityBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _HorizontalFlipImageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _HideAnnotationsBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _QuantizeBox;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _ExtractPageRatioBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _SpecificRatioBox;\r\n\t\tprivate System.Windows.Forms.RadioButton _SpecificWidthBox;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox3;\r\n\t\tprivate EnhancedGlassButton.GlassButton _ExtractButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.Label label13;\r\n\t\tprivate System.Windows.Forms.ComboBox _ResolutionBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _RenderToPdfBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/RenderImageControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing iTextSharp.text.pdf;\r\nusing MuPDF;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\t[ToolboxItem(false)]\r\n\tpublic partial class RenderImageControl : FunctionControl, IResettableControl, IDocumentSource\r\n\t{\r\n\t\tpublic override string FunctionName => \"转换页面为图片\";\r\n\r\n\t\tpublic override System.Drawing.Bitmap IconImage => Properties.Resources.RenderDocument;\r\n\r\n\t\tpublic RenderImageControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tpublic string DocumentPath => _SourceFileControl.Text;\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\t_SourceFileControl.BrowseSelectedFiles += (object sender, EventArgs e) => {\r\n\t\t\t\tif (_AutoOutputDirBox.Checked == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar sourceFile = _SourceFileControl.FirstFile;\r\n\t\t\t\tif (sourceFile.Length > 0) {\r\n\t\t\t\t\t_TargetBox.Text = FileHelper.CombinePath(Path.GetDirectoryName(sourceFile), Path.GetFileNameWithoutExtension(sourceFile));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_AutoOutputDirBox.CheckedChanged += (object sender, EventArgs e) => { AppContext.ImageRenderer.AutoOutputFolder = _AutoOutputDirBox.Checked; };\r\n\t\t\t_ResolutionBox.TextChanged += (s, args) => {\r\n\t\t\t\tvar v = _ResolutionBox.Text.ToSingle();\r\n\t\t\t\tif (v <= 0) {\r\n\t\t\t\t\t_ResolutionBox.Text = \"72\";\r\n\t\t\t\t}\r\n\t\t\t\telse if (v > 3000) {\r\n\t\t\t\t\t_ResolutionBox.Text = \"3000\";\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_ExtractPageImageWidthBox.GotFocus += (s, args) => { _SpecificWidthBox.Checked = true; };\r\n\t\t\t_ExtractPageRatioBox.GotFocus += (s, args) => { _SpecificRatioBox.Checked = true; };\r\n\r\n\t\t\tShowFileMaskPreview();\r\n\t\t\tAppContext.MainForm.SetTooltip(_SourceFileControl.FileList, \"包含图片的 PDF 文件路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_TargetBox, \"放置输出图片的文件夹路径\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractPageRangeBox, \"需要提取图片的页码范围，不指定页码范围时提取所有页面的图片\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_FileNameMaskBox, \"提取的图片文件名按其所在页码数字命名，可在此修改命名规则\\n“0000”：不足四位用0补足四位\\n“0”：文件名按实际页码，不用0补位\\n可用英文双引号将文本括起来（如“\\\"相约2000\\\"0”，前面的“2000”不会被解释为占位符）\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_VerticalFlipImageBox, \"某些 PDF 文件导出的图片上下颠倒，可用此选项将其还原\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_InvertColorBox, \"翻转 PNG 和 TIFF 黑白图片的颜色\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_QuantizeBox, \"尽量减少导出图片所用的颜色，从而减小图片占用的磁盘空间\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_SpecificWidthBox, \"指定输出图片的宽度（单位为像素，图片的高度将按比例缩放）\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_SpecificRatioBox, \"指定输出图片的放大倍数\");\r\n\t\t\tAppContext.MainForm.SetTooltip(_ExtractPageImageWidthBox, \"指定输出图片的宽度（单位为像素，图片的高度将按比例缩放），宽度为 0 时相当于按 1：1 比例输出\");\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic override void ExecuteCommand(string commandName, params string[] parameters) {\r\n\t\t\tswitch (commandName) {\r\n\t\t\t\tcase Commands.Open:\r\n\t\t\t\t\t_SourceFileControl.BrowseFile();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbase.ExecuteCommand(commandName, parameters);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tAppContext.ImageRenderer = new ImageRendererOptions();\r\n\t\t\tReload();\r\n\t\t}\r\n\r\n\t\tpublic void Reload() {\r\n\t\t\tvar o = AppContext.ImageRenderer;\r\n\t\t\t_AutoOutputDirBox.Checked = o.AutoOutputFolder;\r\n\t\t\t_ColorSpaceRgbBox.Checked = !(_ColorSpaceGrayBox.Checked = o.ColorSpace == ColorspaceKind.Gray);\r\n\t\t\t_FileNameMaskBox.Text = o.FileMask;\r\n\t\t\t_HorizontalFlipImageBox.Checked = o.HorizontalFlipImages;\r\n\t\t\t_HideAnnotationsBox.Checked = o.HideAnnotations;\r\n\t\t\t_ImageFormatBox.SelectedIndex = ValueHelper.MapValue(o.FileFormat, new ImageFormat[] { ImageFormat.Png, ImageFormat.Jpeg, ImageFormat.Tiff }, new int[] { 0, 1, 2 }, 0);\r\n\t\t\t_InvertColorBox.Checked = o.InvertColor;\r\n\t\t\tif (o.JpegQuality > 0 && o.JpegQuality <= 100) {\r\n\t\t\t\t_JpegQualityBox.Text = o.JpegQuality.ToText();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\to.JpegQuality = 75;\r\n\t\t\t\t_JpegQualityBox.Text = \"75\";\r\n\t\t\t}\r\n\t\t\t_QuantizeBox.Checked = o.Quantize;\r\n\t\t\t_ResolutionBox.Text = o.Dpi.ToText();\r\n\t\t\t_RotationBox.SelectedIndex = ValueHelper.MapValue(o.Rotation, new int[] { 0, 90, 180, 270 }, new int[] { 0, 1, 2, 3 }, 0);\r\n\t\t\t_SpecificRatioBox.Checked = !o.UseSpecificWidth;\r\n\t\t\t_SpecificWidthBox.Checked = o.UseSpecificWidth;\r\n\t\t\t_VerticalFlipImageBox.Checked = o.VerticalFlipImages;\r\n\t\t\t_ExtractPageImageWidthBox.SetValue(o.ImageWidth);\r\n\t\t\t_ExtractPageRatioBox.SetValue(o.ScaleRatio);\r\n\t\t}\r\n\r\n\t\tvoid _BrowseTargetPdfButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar sourceFile = _SourceFileControl.Text;\r\n\t\t\tif (_TargetBox.Text.Length > 0) {\r\n\t\t\t\t_SaveImageBox.SelectedPath = Path.GetDirectoryName(_TargetBox.Text);\r\n\t\t\t}\r\n\t\t\telse if (sourceFile.Length > 0) {\r\n\t\t\t\t_SaveImageBox.SelectedPath = Path.GetDirectoryName(sourceFile);\r\n\t\t\t}\r\n\t\t\tif (_SaveImageBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\t_TargetBox.Text = _SaveImageBox.SelectedPath;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _ExtractButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (File.Exists(_SourceFileControl.FirstFile) == false) {\r\n\t\t\t\tCommon.FormHelper.ErrorBox(Messages.SourceFileNotFound);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_TargetBox.Text.IsNullOrWhiteSpace()) {\r\n\t\t\t\t_BrowseTargetPdfButton_Click(_BrowseTargetPdfButton, e);\r\n\t\t\t\tif (_TargetBox.Text.IsNullOrWhiteSpace()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.SourceFiles = _SourceFileControl.Files;\r\n\t\t\tif (_SourceFileControl.Files.Length == 1) {\r\n\t\t\t\t_SourceFileControl.FileList.AddHistoryItem();\r\n\t\t\t\t_TargetBox.AddHistoryItem();\r\n\t\t\t}\r\n\r\n\t\t\tAppContext.MainForm.ResetWorker();\r\n\t\t\tvar worker = AppContext.MainForm.GetWorker();\r\n\t\t\tworker.DoWork += (dummy, arg) => {\r\n\t\t\t\tvar a = arg.Argument as object[];\r\n\t\t\t\tvar files = a[0] as string[];\r\n\t\t\t\tvar options = a[1] as ImageRendererOptions;\r\n\t\t\t\tFilePath target = new FilePath(options.ExtractImagePath).Normalize();\r\n\t\t\t\toptions.ExtractImagePath = target;\r\n\t\t\t\tif (target.HasExtension(Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\tusing (var f = target.OpenFileWriter(true)) {\r\n\t\t\t\t\t\tvar doc = new iTextSharp.text.Document();\r\n\t\t\t\t\t\tusing (var w = PdfWriter.GetInstance(doc, f)) {\r\n\t\t\t\t\t\t\tdoc.Open();\r\n\t\t\t\t\t\t\tdoc.AddCreator(Application.ProductName + \" \" + Application.ProductVersion);\r\n\t\t\t\t\t\t\tdoc.SetMargins(0, 0, 0, 0);\r\n\t\t\t\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\t\t\t\tProcessor.Worker.RenderPagesToPdf(file, options, doc);\r\n\t\t\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdoc.Close();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (files.Length > 1) {\r\n\t\t\t\t\tvar ep = options.ExtractImagePath;\r\n\t\t\t\t\tforeach (var file in files) {\r\n\t\t\t\t\t\toptions.ExtractImagePath = new FilePath(ep).Combine(new FilePath(file).FileNameWithoutExtension).Normalize();\r\n\t\t\t\t\t\tProcessor.Worker.RenderPages(file, options);\r\n\t\t\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t\t\t\tif (AppContext.Abort) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tProcessor.Worker.RenderPages(files[0], options);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tworker.RunWorkerCompleted += (dummy, arg) => { AppContext.ImageExtracter.OutputPath = _ExtractPageRangeBox.Text; };\r\n\t\t\tvar option = AppContext.ImageRenderer;\r\n\t\t\toption.ColorSpace = _ColorSpaceRgbBox.Checked ? ColorspaceKind.Rgb : ColorspaceKind.Gray;\r\n\t\t\toption.ExtractPageRange = _ExtractPageRangeBox.Text;\r\n\t\t\toption.ExtractImagePath = _RenderToPdfBox.Checked\r\n\t\t\t\t? GetRenderedPdfFileName(_TargetBox.Text)\r\n\t\t\t\t: _TargetBox.Text;\r\n\t\t\toption.FileMask = _FileNameMaskBox.Text;\r\n\t\t\toption.HideAnnotations = _HideAnnotationsBox.Checked;\r\n\t\t\toption.HorizontalFlipImages = _HorizontalFlipImageBox.Checked;\r\n\t\t\toption.InvertColor = _InvertColorBox.Checked;\r\n\t\t\toption.FileFormat = ValueHelper.MapValue(_ImageFormatBox.SelectedIndex, new int[] { 0, 1, 2 }, new ImageFormat[] { ImageFormat.Png, ImageFormat.Jpeg, ImageFormat.Tiff }, ImageFormat.Png);\r\n\t\t\toption.ImageWidth = (int)_ExtractPageImageWidthBox.Value;\r\n\t\t\toption.JpegQuality = _JpegQualityBox.Text.TryParse(out int j)\r\n\t\t\t\t? j > 0 && j <= 100 ? j : 75\r\n\t\t\t\t: 75;\r\n\t\t\toption.Quantize = _QuantizeBox.Checked;\r\n\t\t\toption.Dpi = _ResolutionBox.Text.ToSingle();\r\n\t\t\toption.Rotation = _RotationBox.SelectedIndex * 90;\r\n\t\t\toption.ScaleRatio = (float)_ExtractPageRatioBox.Value;\r\n\t\t\toption.UseSpecificWidth = _SpecificWidthBox.Checked;\r\n\t\t\toption.VerticalFlipImages = _VerticalFlipImageBox.Checked;\r\n\t\t\tworker.RunWorkerAsync(\r\n\t\t\t\tnew object[] {\r\n\t\t\t\tAppContext.SourceFiles, option\r\n\t\t\t});\r\n\t\t\toption = null;\r\n\r\n\t\t}\r\n\r\n\t\tstatic string GetRenderedPdfFileName(string target) {\r\n\t\t\tvar p = new FilePath(target).Normalize();\r\n\t\t\tif (p.HasExtension(Constants.FileExtensions.Pdf) == false) {\r\n\t\t\t\ttarget = p.Combine(new FilePath(AppContext.SourceFiles[0]).FileName);\r\n\t\t\t}\r\n\t\t\tforeach (var f in AppContext.SourceFiles) {\r\n\t\t\t\tif (new FilePath(f).Equals(target)) {\r\n\t\t\t\t\treturn FileHelper.GetNewFileNameFromSourceFile(target, Constants.FileExtensions.Pdf);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t}\r\n\r\n\t\t#region IDefaultButtonControl 成员\r\n\r\n\t\tpublic override Button DefaultButton => _ExtractButton;\r\n\r\n\t\t#endregion\r\n\r\n\t\tvoid _GoToImportImageLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {\r\n\t\t\tAppContext.MainForm.SelectFunctionList(Function.Patcher);\r\n\t\t}\r\n\r\n\t\tvoid _FileNameMaskBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\tShowFileMaskPreview();\r\n\t\t}\r\n\r\n\t\tvoid ShowFileMaskPreview() {\r\n\t\t\ttry {\r\n\t\t\t\tvar previews = new string[7];\r\n\t\t\t\tvar f = _FileNameMaskBox.Text;\r\n\t\t\t\tpreviews[0] = 1.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[1] = 2.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[2] = 3.ToString(f) + \".jpg ...\";\r\n\t\t\t\tpreviews[3] = \"\\n\" + 11.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[4] = 12.ToString(f) + \".jpg\";\r\n\t\t\t\tpreviews[5] = 13.ToString(f) + \".jpg ...\";\r\n\t\t\t\tpreviews[6] = 100.ToString(f) + \".jpg\";\r\n\t\t\t\t_FileMaskPreviewBox.Text = String.Join(\" \", previews);\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\t_FileMaskPreviewBox.Text = \"文件名掩码无效。\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid Control_Show(object sender, EventArgs e) {\r\n\t\t\tif (Visible && AppContext.MainForm != null) {\r\n\t\t\t\t_TargetBox.Contents = AppContext.Recent.Folders;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/RenderImageControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_SaveImageBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/ReportControl.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ReportControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._ProgressBar = new System.Windows.Forms.ProgressBar();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label();\r\n\t\t\tthis._InputFileBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._OutputFileBox = new System.Windows.Forms.TextBox();\r\n\t\t\tthis._TotalProgressBar = new System.Windows.Forms.ProgressBar();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label();\r\n\t\t\tthis._LogBox = new RichTextBoxLinks.RichTextBoxEx();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _ProgressBar\r\n\t\t\t// \r\n\t\t\tthis._ProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._ProgressBar.Location = new System.Drawing.Point(111, 302);\r\n\t\t\tthis._ProgressBar.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._ProgressBar.Name = \"_ProgressBar\";\r\n\t\t\tthis._ProgressBar.Size = new System.Drawing.Size(447, 21);\r\n\t\t\tthis._ProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;\r\n\t\t\tthis._ProgressBar.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point(15, 65);\r\n\t\t\tthis.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size(82, 15);\r\n\t\t\tthis.label2.TabIndex = 5;\r\n\t\t\tthis.label2.Text = \"日志内容：\";\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.Image = global::PDFPatcher.Properties.Resources.Return;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(565, 302);\r\n\t\t\tthis._CancelButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(100, 42);\r\n\t\t\tthis._CancelButton.TabIndex = 9;\r\n\t\t\tthis._CancelButton.Text = \"返回(&F)\";\r\n\t\t\tthis._CancelButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler(this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point(16, 302);\r\n\t\t\tthis.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size(82, 15);\r\n\t\t\tthis.label3.TabIndex = 7;\r\n\t\t\tthis.label3.Text = \"执行进度：\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point(16, 15);\r\n\t\t\tthis.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size(82, 15);\r\n\t\t\tthis.label4.TabIndex = 1;\r\n\t\t\tthis.label4.Text = \"输入文件：\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point(16, 42);\r\n\t\t\tthis.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size(82, 15);\r\n\t\t\tthis.label5.TabIndex = 3;\r\n\t\t\tthis.label5.Text = \"输出文件：\";\r\n\t\t\t// \r\n\t\t\t// _InputFileBox\r\n\t\t\t// \r\n\t\t\tthis._InputFileBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._InputFileBox.BackColor = System.Drawing.SystemColors.Control;\r\n\t\t\tthis._InputFileBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\r\n\t\t\tthis._InputFileBox.Location = new System.Drawing.Point(111, 13);\r\n\t\t\tthis._InputFileBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._InputFileBox.Name = \"_InputFileBox\";\r\n\t\t\tthis._InputFileBox.ReadOnly = true;\r\n\t\t\tthis._InputFileBox.Size = new System.Drawing.Size(551, 18);\r\n\t\t\tthis._InputFileBox.TabIndex = 2;\r\n\t\t\t// \r\n\t\t\t// _OutputFileBox\r\n\t\t\t// \r\n\t\t\tthis._OutputFileBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OutputFileBox.BackColor = System.Drawing.SystemColors.Control;\r\n\t\t\tthis._OutputFileBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\r\n\t\t\tthis._OutputFileBox.Location = new System.Drawing.Point(111, 40);\r\n\t\t\tthis._OutputFileBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._OutputFileBox.Name = \"_OutputFileBox\";\r\n\t\t\tthis._OutputFileBox.ReadOnly = true;\r\n\t\t\tthis._OutputFileBox.Size = new System.Drawing.Size(551, 18);\r\n\t\t\tthis._OutputFileBox.TabIndex = 4;\r\n\t\t\t// \r\n\t\t\t// _TotalProgressBar\r\n\t\t\t// \r\n\t\t\tthis._TotalProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._TotalProgressBar.Location = new System.Drawing.Point(111, 324);\r\n\t\t\tthis._TotalProgressBar.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis._TotalProgressBar.Name = \"_TotalProgressBar\";\r\n\t\t\tthis._TotalProgressBar.Size = new System.Drawing.Size(447, 21);\r\n\t\t\tthis._TotalProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;\r\n\t\t\tthis._TotalProgressBar.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point(16, 324);\r\n\t\t\tthis.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size(82, 15);\r\n\t\t\tthis.label6.TabIndex = 7;\r\n\t\t\tthis.label6.Text = \"总体进度：\";\r\n\t\t\t// \r\n\t\t\t// _LogBox\r\n\t\t\t// \r\n\t\t\tthis._LogBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._LogBox.BackColor = System.Drawing.SystemColors.Window;\r\n\t\t\tthis._LogBox.Location = new System.Drawing.Point(17, 84);\r\n\t\t\tthis._LogBox.Margin = new System.Windows.Forms.Padding(4);\r\n\t\t\tthis._LogBox.Name = \"_LogBox\";\r\n\t\t\tthis._LogBox.ReadOnly = true;\r\n\t\t\tthis._LogBox.Size = new System.Drawing.Size(645, 210);\r\n\t\t\tthis._LogBox.TabIndex = 6;\r\n\t\t\tthis._LogBox.Text = \"\";\r\n\t\t\tthis._LogBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this._LogBox_LinkClicked);\r\n\t\t\t// \r\n\t\t\t// ReportControl\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add(this._OutputFileBox);\r\n\t\t\tthis.Controls.Add(this._InputFileBox);\r\n\t\t\tthis.Controls.Add(this.label5);\r\n\t\t\tthis.Controls.Add(this.label4);\r\n\t\t\tthis.Controls.Add(this.label6);\r\n\t\t\tthis.Controls.Add(this.label3);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this.label2);\r\n\t\t\tthis.Controls.Add(this._TotalProgressBar);\r\n\t\t\tthis.Controls.Add(this._ProgressBar);\r\n\t\t\tthis.Controls.Add(this._LogBox);\r\n\t\t\tthis.Font = new System.Drawing.Font(\"宋体\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));\r\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\r\n\t\t\tthis.Name = \"ReportControl\";\r\n\t\t\tthis.Size = new System.Drawing.Size(680, 359);\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tinternal System.Windows.Forms.ProgressBar _ProgressBar;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tinternal RichTextBoxLinks.RichTextBoxEx _LogBox;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tinternal System.Windows.Forms.TextBox _InputFileBox;\r\n\t\tinternal System.Windows.Forms.TextBox _OutputFileBox;\r\n\t\tinternal System.Windows.Forms.ProgressBar _TotalProgressBar;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ReportControl.cs",
    "content": "﻿using System;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic partial class ReportControl : UserControl\r\n\t{\r\n\t\tpublic ReportControl() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\r\n\t\tprotected override void OnVisibleChanged(EventArgs e) {\r\n\t\t\tbase.OnVisibleChanged(e);\r\n\t\t\tif (Visible) {\r\n\t\t\t\tFindForm().AcceptButton = _CancelButton;\r\n\t\t\t\t_CancelButton.Focus();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(object sender, EventArgs e) {\r\n\t\t\tif (AppContext.MainForm.IsWorkerBusy == false) {\r\n\t\t\t\tHide();\r\n\t\t\t}\r\n\t\t\telse if (Common.FormHelper.YesNoBox(\"程序正在工作，是否终止执行？\") == DialogResult.Yes) {\r\n\t\t\t\tAppContext.MainForm.GetWorker().CancelAsync();\r\n\t\t\t\tAppContext.Abort = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void SetGoal(int goalValue) {\r\n\t\t\t_ProgressBar.Value = 0;\r\n\t\t\t_ProgressBar.Maximum = goalValue;\r\n\t\t}\r\n\t\tinternal void SetTotalGoal(int goalValue) {\r\n\t\t\t_TotalProgressBar.Value = 0;\r\n\t\t\t_TotalProgressBar.Maximum = goalValue;\r\n\t\t}\r\n\t\tinternal void SetProgress(int p) {\r\n\t\t\t_ProgressBar.Value = p > _ProgressBar.Maximum ? _ProgressBar.Maximum : p;\r\n\t\t}\r\n\t\tinternal void IncrementProgress(int progress) {\r\n\t\t\t_ProgressBar.Increment(progress);\r\n\t\t}\r\n\t\tinternal void IncrementTotalProgress() {\r\n\t\t\ttry {\r\n\t\t\t\t_TotalProgressBar.Value++;\r\n\t\t\t}\r\n\t\t\tcatch (ArgumentException) {\r\n\t\t\t\tSystem.Diagnostics.Debug.WriteLine(\"Total Progress too big: \" + _TotalProgressBar.Value);\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal void PrintMessage(string text, Tracker.Category category) {\r\n\t\t\tswitch (category) {\r\n\t\t\t\tcase Tracker.Category.Message:\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tcase Tracker.Category.ImportantMessage:\r\n\t\t\t\t\t_LogBox.SelectionColor = System.Drawing.Color.DarkBlue;\r\n\t\t\t\t\tCommon.FormHelper.InsertLinkedText(_LogBox, text);\r\n\t\t\t\t\t_LogBox.AppendText(Environment.NewLine);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Tracker.Category.Alert:\r\n\t\t\t\t\t_LogBox.SelectionFont = new System.Drawing.Font(_LogBox.Font, System.Drawing.FontStyle.Bold);\r\n\t\t\t\t\t_LogBox.SelectionColor = System.Drawing.Color.Blue;\r\n\t\t\t\t\tCommon.FormHelper.InsertLinkedText(_LogBox, text);\r\n\t\t\t\t\t_LogBox.AppendText(Environment.NewLine);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Tracker.Category.Error:\r\n\t\t\t\t\t_LogBox.SelectionFont = new System.Drawing.Font(_LogBox.Font, System.Drawing.FontStyle.Bold);\r\n\t\t\t\t\t_LogBox.SelectionColor = System.Drawing.Color.Red;\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tcase Tracker.Category.Notice:\r\n\t\t\t\t\t_LogBox.SelectionColor = System.Drawing.Color.DarkMagenta;\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tcase Tracker.Category.InputFile:\r\n\t\t\t\t\t_InputFileBox.Text = text;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Tracker.Category.OutputFile:\r\n\t\t\t\t\t_OutputFileBox.Text = text;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t_LogBox.AppendText(text);\r\n\t\t\t\t\t_LogBox.AppendText(Environment.NewLine);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal void Reset() {\r\n\t\t\t_LogBox.Clear();\r\n\t\t\t_ProgressBar.Value = 0;\r\n\t\t\t_TotalProgressBar.Value = 0;\r\n\t\t\t_InputFileBox.Text = String.Empty;\r\n\t\t\t_OutputFileBox.Text = String.Empty;\r\n\t\t\t_CancelButton.Text = \"取消\";\r\n\t\t\t_CancelButton.Image = Properties.Resources.Reset;\r\n\t\t}\r\n\t\tinternal void Complete() {\r\n\t\t\t_ProgressBar.Value = _ProgressBar.Maximum;\r\n\t\t\t_TotalProgressBar.Value = _TotalProgressBar.Maximum;\r\n\t\t\t_CancelButton.Text = \"返回\";\r\n\t\t\t_CancelButton.Image = Properties.Resources.Return;\r\n\t\t}\r\n\r\n\t\tvoid _LogBox_LinkClicked(object sender, LinkClickedEventArgs e) {\r\n\t\t\tvar f = e.LinkText;\r\n\t\t\tif (File.Exists(f) || Directory.Exists(f)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tSystem.Diagnostics.Process.Start(f);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\tCommon.FormHelper.ErrorBox(\"无法打开文件：\" + f);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ReportControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/RichTextBoxEx.cs",
    "content": "using System;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows.Forms;\r\n\r\nnamespace RichTextBoxLinks\r\n{\r\n\tpublic class RichTextBoxEx : RichTextBox\r\n\t{\r\n\t\t#region Interop-Definitions\r\n\t\t[StructLayout(LayoutKind.Sequential)]\r\n\t\tstruct CHARFORMAT2_STRUCT\r\n\t\t{\r\n\t\t\tpublic UInt32 cbSize;\r\n\t\t\tpublic UInt32 dwMask;\r\n\t\t\tpublic UInt32 dwEffects;\r\n\t\t\tpublic Int32 yHeight;\r\n\t\t\tpublic Int32 yOffset;\r\n\t\t\tpublic Int32 crTextColor;\r\n\t\t\tpublic byte bCharSet;\r\n\t\t\tpublic byte bPitchAndFamily;\r\n\t\t\t[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]\r\n\t\t\tpublic char[] szFaceName;\r\n\t\t\tpublic UInt16 wWeight;\r\n\t\t\tpublic UInt16 sSpacing;\r\n\t\t\tpublic int crBackColor; // Color.ToArgb() -> int\r\n\t\t\tpublic int lcid;\r\n\t\t\tpublic int dwReserved;\r\n\t\t\tpublic Int16 sStyle;\r\n\t\t\tpublic Int16 wKerning;\r\n\t\t\tpublic byte bUnderlineType;\r\n\t\t\tpublic byte bAnimation;\r\n\t\t\tpublic byte bRevAuthor;\r\n\t\t\tpublic byte bReserved1;\r\n\t\t}\r\n\r\n\t\t[DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\r\n\t\tstatic extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);\r\n\r\n\t\tconst int WM_USER = 0x0400;\r\n\t\tconst int EM_GETCHARFORMAT = WM_USER + 58;\r\n\t\tconst int EM_SETCHARFORMAT = WM_USER + 68;\r\n\r\n\t\tconst int SCF_SELECTION = 0x0001;\r\n\t\tconst int SCF_WORD = 0x0002;\r\n\t\tconst int SCF_ALL = 0x0004;\r\n\r\n\t\t#region CHARFORMAT2 Flags\r\n\t\tconst UInt32 CFE_BOLD = 0x0001;\r\n\t\tconst UInt32 CFE_ITALIC = 0x0002;\r\n\t\tconst UInt32 CFE_UNDERLINE = 0x0004;\r\n\t\tconst UInt32 CFE_STRIKEOUT = 0x0008;\r\n\t\tconst UInt32 CFE_PROTECTED = 0x0010;\r\n\t\tconst UInt32 CFE_LINK = 0x0020;\r\n\t\tconst UInt32 CFE_AUTOCOLOR = 0x40000000;\r\n\t\tconst UInt32 CFE_SUBSCRIPT = 0x00010000;        /* Superscript and subscript are */\r\n\t\tconst UInt32 CFE_SUPERSCRIPT = 0x00020000;      /*  mutually exclusive\t\t\t */\r\n\r\n\t\tconst int CFM_SMALLCAPS = 0x0040;           /* (*)\t*/\r\n\t\tconst int CFM_ALLCAPS = 0x0080;         /* Displayed by 3.0\t*/\r\n\t\tconst int CFM_HIDDEN = 0x0100;          /* Hidden by 3.0 */\r\n\t\tconst int CFM_OUTLINE = 0x0200;         /* (*)\t*/\r\n\t\tconst int CFM_SHADOW = 0x0400;          /* (*)\t*/\r\n\t\tconst int CFM_EMBOSS = 0x0800;          /* (*)\t*/\r\n\t\tconst int CFM_IMPRINT = 0x1000;         /* (*)\t*/\r\n\t\tconst int CFM_DISABLED = 0x2000;\r\n\t\tconst int CFM_REVISED = 0x4000;\r\n\r\n\t\tconst int CFM_BACKCOLOR = 0x04000000;\r\n\t\tconst int CFM_LCID = 0x02000000;\r\n\t\tconst int CFM_UNDERLINETYPE = 0x00800000;       /* Many displayed by 3.0 */\r\n\t\tconst int CFM_WEIGHT = 0x00400000;\r\n\t\tconst int CFM_SPACING = 0x00200000;     /* Displayed by 3.0\t*/\r\n\t\tconst int CFM_KERNING = 0x00100000;     /* (*)\t*/\r\n\t\tconst int CFM_STYLE = 0x00080000;       /* (*)\t*/\r\n\t\tconst int CFM_ANIMATION = 0x00040000;       /* (*)\t*/\r\n\t\tconst int CFM_REVAUTHOR = 0x00008000;\r\n\r\n\r\n\t\tconst UInt32 CFM_BOLD = 0x00000001;\r\n\t\tconst UInt32 CFM_ITALIC = 0x00000002;\r\n\t\tconst UInt32 CFM_UNDERLINE = 0x00000004;\r\n\t\tconst UInt32 CFM_STRIKEOUT = 0x00000008;\r\n\t\tconst UInt32 CFM_PROTECTED = 0x00000010;\r\n\t\tconst UInt32 CFM_LINK = 0x00000020;\r\n\t\tconst UInt32 CFM_SIZE = 0x80000000;\r\n\t\tconst UInt32 CFM_COLOR = 0x40000000;\r\n\t\tconst UInt32 CFM_FACE = 0x20000000;\r\n\t\tconst UInt32 CFM_OFFSET = 0x10000000;\r\n\t\tconst UInt32 CFM_CHARSET = 0x08000000;\r\n\t\tconst UInt32 CFM_SUBSCRIPT = CFE_SUBSCRIPT | CFE_SUPERSCRIPT;\r\n\t\tconst UInt32 CFM_SUPERSCRIPT = CFM_SUBSCRIPT;\r\n\r\n\t\tconst byte CFU_UNDERLINENONE = 0x00000000;\r\n\t\tconst byte CFU_UNDERLINE = 0x00000001;\r\n\t\tconst byte CFU_UNDERLINEWORD = 0x00000002; /* (*) displayed as ordinary underline\t*/\r\n\t\tconst byte CFU_UNDERLINEDOUBLE = 0x00000003; /* (*) displayed as ordinary underline\t*/\r\n\t\tconst byte CFU_UNDERLINEDOTTED = 0x00000004;\r\n\t\tconst byte CFU_UNDERLINEDASH = 0x00000005;\r\n\t\tconst byte CFU_UNDERLINEDASHDOT = 0x00000006;\r\n\t\tconst byte CFU_UNDERLINEDASHDOTDOT = 0x00000007;\r\n\t\tconst byte CFU_UNDERLINEWAVE = 0x00000008;\r\n\t\tconst byte CFU_UNDERLINETHICK = 0x00000009;\r\n\t\tconst byte CFU_UNDERLINEHAIRLINE = 0x0000000A; /* (*) displayed as ordinary underline\t*/\r\n\r\n\t\t#endregion\r\n\r\n\t\t#endregion\r\n\r\n\t\tpublic RichTextBoxEx() {\r\n\t\t\t// Otherwise, non-standard links get lost when user starts typing\r\n\t\t\t// next to a non-standard link\r\n\t\t\tDetectUrls = false;\r\n\t\t}\r\n\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic new bool DetectUrls {\r\n\t\t\tget => base.DetectUrls;\r\n\t\t\tset => base.DetectUrls = value;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Insert a given text as a link into the RichTextBox at the current insert position.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"text\">Text to be inserted</param>\r\n\t\tpublic void InsertLink(string text) {\r\n\t\t\tInsertLink(text, SelectionStart);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Insert a given text at a given position as a link. \r\n\t\t/// </summary>\r\n\t\t/// <param name=\"text\">Text to be inserted</param>\r\n\t\t/// <param name=\"position\">Insert position</param>\r\n\t\tpublic void InsertLink(string text, int position) {\r\n\t\t\tif (position < 0 || position > Text.Length)\r\n\t\t\t\tthrow new ArgumentOutOfRangeException(\"position\");\r\n\r\n\t\t\tSelectionStart = position;\r\n\t\t\tSelectedText = text;\r\n\t\t\tSelect(position, text.Length);\r\n\t\t\tSetSelectionLink(true);\r\n\t\t\tSelect(position + text.Length, 0);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Insert a given text at at the current input position as a link.\r\n\t\t/// The link text is followed by a hash (#) and the given hyperlink text, both of\r\n\t\t/// them invisible.\r\n\t\t/// When clicked on, the whole link text and hyperlink string are given in the\r\n\t\t/// LinkClickedEventArgs.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"text\">Text to be inserted</param>\r\n\t\t/// <param name=\"hyperlink\">Invisible hyperlink string to be inserted</param>\r\n\t\tpublic void InsertLink(string text, string hyperlink) {\r\n\t\t\tInsertLink(text, hyperlink, SelectionStart);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Insert a given text at a given position as a link. The link text is followed by\r\n\t\t/// a hash (#) and the given hyperlink text, both of them invisible.\r\n\t\t/// When clicked on, the whole link text and hyperlink string are given in the\r\n\t\t/// LinkClickedEventArgs.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"text\">Text to be inserted</param>\r\n\t\t/// <param name=\"hyperlink\">Invisible hyperlink string to be inserted</param>\r\n\t\t/// <param name=\"position\">Insert position</param>\r\n\t\tpublic void InsertLink(string text, string hyperlink, int position) {\r\n\t\t\tif (position < 0 || position > Text.Length)\r\n\t\t\t\tthrow new ArgumentOutOfRangeException(\"position\");\r\n\r\n\t\t\tSelectionStart = position;\r\n\t\t\tSelectedRtf = @\"{\\rtf1\\ansi \" + text + @\"\\v #\" + hyperlink + @\"\\v0}\";\r\n\t\t\tSelect(position, text.Length + hyperlink.Length + 1);\r\n\t\t\tSetSelectionLink(true);\r\n\t\t\tSelect(position + text.Length + hyperlink.Length + 1, 0);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Set the current selection's link style\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"link\">true: set link style, false: clear link style</param>\r\n\t\tpublic void SetSelectionLink(bool link) {\r\n\t\t\tSetSelectionStyle(CFM_LINK, link ? CFE_LINK : 0);\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// Get the link style for the current selection\r\n\t\t/// </summary>\r\n\t\t/// <returns>0: link style not set, 1: link style set, -1: mixed</returns>\r\n\t\tpublic int GetSelectionLink() {\r\n\t\t\treturn GetSelectionStyle(CFM_LINK, CFE_LINK);\r\n\t\t}\r\n\r\n\t\tpublic void SetSelectionFontSize(float size) {\r\n\t\t\tvar cf = new CHARFORMAT2_STRUCT {\r\n\t\t\t\tdwMask = CFM_SIZE\r\n\t\t\t};\r\n\t\t\tcf.cbSize = (UInt32)Marshal.SizeOf(cf);\r\n\t\t\tcf.yHeight = (int)(size * 20f);\r\n\r\n\t\t\tIntPtr wpar = new IntPtr(SCF_SELECTION);\r\n\t\t\tIntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));\r\n\t\t\tMarshal.StructureToPtr(cf, lpar, false);\r\n\t\t\tIntPtr res = SendMessage(Handle, EM_SETCHARFORMAT, wpar, lpar);\r\n\t\t\tMarshal.FreeCoTaskMem(lpar);\r\n\t\t}\r\n\r\n\t\tpublic void SetSelectionBold(bool bold) {\r\n\t\t\tSetSelectionStyle(CFM_BOLD, bold ? CFE_BOLD : 0);\r\n\t\t}\r\n\t\tpublic void SetSelectionUnderline(bool underline) {\r\n\t\t\tSetSelectionStyle(CFM_UNDERLINE, underline ? CFE_UNDERLINE : 0);\r\n\t\t}\r\n\r\n\t\tvoid SetSelectionStyle(UInt32 mask, UInt32 effect) {\r\n\t\t\tvar cf = new CHARFORMAT2_STRUCT();\r\n\t\t\tcf.cbSize = (UInt32)Marshal.SizeOf(cf);\r\n\t\t\tcf.dwMask = mask;\r\n\t\t\tcf.dwEffects = effect;\r\n\r\n\t\t\tIntPtr wpar = new IntPtr(SCF_SELECTION);\r\n\t\t\tIntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));\r\n\t\t\tMarshal.StructureToPtr(cf, lpar, false);\r\n\r\n\t\t\tIntPtr res = SendMessage(Handle, EM_SETCHARFORMAT, wpar, lpar);\r\n\r\n\t\t\tMarshal.FreeCoTaskMem(lpar);\r\n\t\t}\r\n\r\n\t\tint GetSelectionStyle(UInt32 mask, UInt32 effect) {\r\n\t\t\tvar cf = new CHARFORMAT2_STRUCT();\r\n\t\t\tcf.cbSize = (UInt32)Marshal.SizeOf(cf);\r\n\t\t\tcf.szFaceName = new char[32];\r\n\r\n\t\t\tIntPtr wpar = new IntPtr(SCF_SELECTION);\r\n\t\t\tIntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));\r\n\t\t\tMarshal.StructureToPtr(cf, lpar, false);\r\n\r\n\t\t\tIntPtr res = SendMessage(Handle, EM_GETCHARFORMAT, wpar, lpar);\r\n\r\n\t\t\tcf = (CHARFORMAT2_STRUCT)Marshal.PtrToStructure(lpar, typeof(CHARFORMAT2_STRUCT));\r\n\r\n\t\t\tint state;\r\n\t\t\t// dwMask holds the information which properties are consistent throughout the selection:\r\n\t\t\tif ((cf.dwMask & mask) == mask) {\r\n\t\t\t\tif ((cf.dwEffects & effect) == effect)\r\n\t\t\t\t\tstate = 1;\r\n\t\t\t\telse\r\n\t\t\t\t\tstate = 0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tstate = -1;\r\n\t\t\t}\r\n\r\n\t\t\tMarshal.FreeCoTaskMem(lpar);\r\n\t\t\treturn state;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/SourceFileControl.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class SourceFileControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n            this.label1 = new System.Windows.Forms.Label();\r\n            this._BrowseSourcePdfButton = new System.Windows.Forms.Button();\r\n            this._OpenPdfBox = new System.Windows.Forms.OpenFileDialog();\r\n            this.panel1 = new System.Windows.Forms.Panel();\r\n            this._SourcePdfBox = new PDFPatcher.HistoryComboBox();\r\n            this.panel1.SuspendLayout();\r\n            this.SuspendLayout();\r\n            // \r\n            // label1\r\n            // \r\n            this.label1.AutoSize = true;\r\n            this.label1.Location = new System.Drawing.Point(3, 6);\r\n            this.label1.Name = \"label1\";\r\n            this.label1.Size = new System.Drawing.Size(95, 12);\r\n            this.label1.TabIndex = 0;\r\n            this.label1.Text = \"原始 &PDF 文件：\";\r\n            // \r\n            // _BrowseSourcePdfButton\r\n            // \r\n            this._BrowseSourcePdfButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._BrowseSourcePdfButton.Image = global::PDFPatcher.Properties.Resources.OriginalPdfFile;\r\n            this._BrowseSourcePdfButton.Location = new System.Drawing.Point(391, 1);\r\n            this._BrowseSourcePdfButton.Name = \"_BrowseSourcePdfButton\";\r\n            this._BrowseSourcePdfButton.Size = new System.Drawing.Size(75, 23);\r\n            this._BrowseSourcePdfButton.TabIndex = 2;\r\n            this._BrowseSourcePdfButton.Text = \"浏览(&L)\";\r\n            this._BrowseSourcePdfButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n            this._BrowseSourcePdfButton.UseVisualStyleBackColor = true;\r\n            this._BrowseSourcePdfButton.Click += new System.EventHandler(this._BrowseSourcePdfButton_Click);\r\n            // \r\n            // _OpenPdfBox\r\n            // \r\n            this._OpenPdfBox.DefaultExt = \"pdf\";\r\n            this._OpenPdfBox.Filter = \"PDF 文件(*.pdf)|*.pdf\";\r\n            this._OpenPdfBox.Multiselect = true;\r\n            this._OpenPdfBox.Title = \"打开 PDF 源文件\";\r\n            // \r\n            // panel1\r\n            // \r\n            this.panel1.Controls.Add(this._SourcePdfBox);\r\n            this.panel1.Controls.Add(this.label1);\r\n            this.panel1.Controls.Add(this._BrowseSourcePdfButton);\r\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n            this.panel1.Location = new System.Drawing.Point(0, 0);\r\n            this.panel1.Name = \"panel1\";\r\n            this.panel1.Size = new System.Drawing.Size(469, 26);\r\n            this.panel1.TabIndex = 4;\r\n            // \r\n            // _SourcePdfBox\r\n            // \r\n            this._SourcePdfBox.AllowDrop = true;\r\n            this._SourcePdfBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n                        | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._SourcePdfBox.Contents = null;\r\n            this._SourcePdfBox.FormattingEnabled = true;\r\n            this._SourcePdfBox.Location = new System.Drawing.Point(104, 3);\r\n            this._SourcePdfBox.MaxItemCount = 16;\r\n            this._SourcePdfBox.Name = \"_SourcePdfBox\";\r\n            this._SourcePdfBox.Size = new System.Drawing.Size(281, 20);\r\n            this._SourcePdfBox.TabIndex = 3;\r\n            this._SourcePdfBox.DragDrop += new System.Windows.Forms.DragEventHandler(this._SourcePdfBox_DragDrop);\r\n            this._SourcePdfBox.DragEnter += new System.Windows.Forms.DragEventHandler(this._SourcePdfBox_DragEnter);\r\n            this._SourcePdfBox.TextChanged += new System.EventHandler(this._SourcePdfBox_TextChanged);\r\n            // \r\n            // SourceFileControl\r\n            // \r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r\n            this.Controls.Add(this.panel1);\r\n            this.Name = \"SourceFileControl\";\r\n            this.Size = new System.Drawing.Size(469, 26);\r\n            this.Load += new System.EventHandler(this.SourceFileControl_Show);\r\n            this.VisibleChanged += new System.EventHandler(this.SourceFileControl_Show);\r\n            this.panel1.ResumeLayout(false);\r\n            this.panel1.PerformLayout();\r\n            this.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.Button _BrowseSourcePdfButton;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenPdfBox;\r\n\t\tprivate HistoryComboBox _SourcePdfBox;\r\n        private System.Windows.Forms.Panel panel1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/SourceFileControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic partial class SourceFileControl : UserControl\r\n\t{\r\n\t\tbool _controlLockDown;\r\n\t\tpublic SourceFileControl() {\r\n\t\t\t_controlLockDown = true;\r\n\t\t\tInitializeComponent();\r\n\t\t\t_controlLockDown = false;\r\n\t\t\tFiles = new string[] { };\r\n\t\t}\r\n\r\n\t\t///<summary>获取文件下拉列表框。</summary>\r\n\t\tinternal HistoryComboBox FileList => _SourcePdfBox;\r\n\r\n\t\t///<summary>点击浏览按钮更改选中文件后触发的事件。</summary>\r\n\t\tpublic event EventHandler BrowseSelectedFiles;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取选定的 PDF 文件列表。\r\n\t\t/// </summary>\r\n\t\tinternal string[] Files { get; set; }\r\n\t\t/// <summary>\r\n\t\t/// 获取选定的 PDF 文件列表的第一项。\r\n\t\t/// </summary>\r\n\t\tinternal string FirstFile => Files != null && Files.Length > 0 ? Files[0] : String.Empty;\r\n\r\n\t\t[DefaultValue(null)]\r\n\t\tpublic override string Text {\r\n\t\t\tget => _SourcePdfBox.Text;\r\n\t\t\tset => _SourcePdfBox.Text = value;\r\n\t\t}\r\n\r\n\t\tpublic void BrowseFile() {\r\n\t\t\t_BrowseSourcePdfButton.PerformClick();\r\n\t\t}\r\n\r\n\t\tvoid _BrowseSourcePdfButton_Click(object sender, EventArgs e) {\r\n\t\t\tvar t = _SourcePdfBox.Text;\r\n\t\t\tif (t.Length > 0\r\n\t\t\t\t&& FileHelper.IsPathValid(t)\r\n\t\t\t\t&& System.IO.Path.GetFileName(t).Length > 0) {\r\n\t\t\t\t_OpenPdfBox.FileName = t;\r\n\t\t\t}\r\n\t\t\tif (_OpenPdfBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\tSelectFiles(_OpenPdfBox.FileNames);\r\n\t\t\t\tif (BrowseSelectedFiles != null) {\r\n\t\t\t\t\tBrowseSelectedFiles(sender, e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SelectFiles(string[] files) {\r\n\t\t\tvar t = _SourcePdfBox.Text;\r\n\t\t\tif (files.Length > 1) {\r\n\t\t\t\tText = String.Concat(\"<选定了 \", files.Length, \" 个文件>\", System.IO.Path.GetDirectoryName(files[0]));\r\n\t\t\t}\r\n\t\t\telse if (files[0] != t) {\r\n\t\t\t\tText = files[0];\r\n\t\t\t}\r\n\t\t\tFiles = files;\r\n\t\t}\r\n\r\n\t\tvoid _SourcePdfBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\tif (_controlLockDown) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.HasFileNameMacro(_SourcePdfBox.Text) == false) {\r\n\t\t\t\tSelectFiles(new string[] { _SourcePdfBox.Text });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _SourcePdfBox_DragEnter(object sender, DragEventArgs e) {\r\n\t\t\tFormHelper.FeedbackDragFileOver(e, Constants.FileExtensions.Pdf);\r\n\t\t}\r\n\r\n\t\tvoid _SourcePdfBox_DragDrop(object sender, DragEventArgs e) {\r\n\t\t\tvar files = FormHelper.DropFileOver(e, Constants.FileExtensions.Pdf);\r\n\t\t\tSelectFiles(files);\r\n\t\t}\r\n\r\n\t\tvoid SourceFileControl_Show(object sender, EventArgs e) {\r\n\t\t\t_controlLockDown = true;\r\n\t\t\tvar t = Text;\r\n\t\t\tif (Visible && AppContext.MainForm != null) {\r\n\t\t\t\t_SourcePdfBox.Contents = AppContext.Recent.SourcePdfFiles;\r\n\t\t\t}\r\n\t\t\telse if (Visible == false) {\r\n\t\t\t\t_SourcePdfBox.Contents = null;\r\n\t\t\t}\r\n\t\t\tText = t;\r\n\t\t\t_controlLockDown = false;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/SourceFileControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_OpenPdfBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/SourceImageOptionForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class SourceImageOptionForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._SourceFileBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._MinCropWidthBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._MinCropHeightBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._RightMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._LeftMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._BottomMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._TopMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropWidthBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropHeightBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point (226, 137);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 5;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler (this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point (307, 137);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 6;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler (this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point (12, 9);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size (53, 12);\r\n\t\t\tthis.label2.TabIndex = 7;\r\n\t\t\tthis.label2.Text = \"文件名：\";\r\n\t\t\t// \r\n\t\t\t// _SourceFileBox\r\n\t\t\t// \r\n\t\t\tthis._SourceFileBox.Enabled = false;\r\n\t\t\tthis._SourceFileBox.Location = new System.Drawing.Point (14, 24);\r\n\t\t\tthis._SourceFileBox.Name = \"_SourceFileBox\";\r\n\t\t\tthis._SourceFileBox.Size = new System.Drawing.Size (368, 21);\r\n\t\t\tthis._SourceFileBox.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.AutoSize = true;\r\n\t\t\tthis.label12.Location = new System.Drawing.Point (223, 71);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label12.TabIndex = 18;\r\n\t\t\tthis.label12.Text = \"宽度不小于\";\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point (211, 48);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size (149, 12);\r\n\t\t\tthis.label11.TabIndex = 17;\r\n\t\t\tthis.label11.Text = \"裁剪条件（单位：像素）：\";\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point (224, 98);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label9.TabIndex = 20;\r\n\t\t\tthis.label9.Text = \"高度不小于\";\r\n\t\t\t// \r\n\t\t\t// _MinCropWidthBox\r\n\t\t\t// \r\n\t\t\tthis._MinCropWidthBox.Increment = new decimal (new int[] {\r\n            100,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropWidthBox.Location = new System.Drawing.Point (299, 69);\r\n\t\t\tthis._MinCropWidthBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropWidthBox.Name = \"_MinCropWidthBox\";\r\n\t\t\tthis._MinCropWidthBox.Size = new System.Drawing.Size (53, 21);\r\n\t\t\tthis._MinCropWidthBox.TabIndex = 19;\r\n\t\t\tthis._MinCropWidthBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _MinCropHeightBox\r\n\t\t\t// \r\n\t\t\tthis._MinCropHeightBox.Increment = new decimal (new int[] {\r\n            100,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropHeightBox.Location = new System.Drawing.Point (299, 96);\r\n\t\t\tthis._MinCropHeightBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropHeightBox.Name = \"_MinCropHeightBox\";\r\n\t\t\tthis._MinCropHeightBox.Size = new System.Drawing.Size (53, 21);\r\n\t\t\tthis._MinCropHeightBox.TabIndex = 21;\r\n\t\t\tthis._MinCropHeightBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point (12, 48);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size (149, 12);\r\n\t\t\tthis.label5.TabIndex = 8;\r\n\t\t\tthis.label5.Text = \"裁剪图片（单位：像素）：\";\r\n\t\t\t// \r\n\t\t\t// _RightMarginBox\r\n\t\t\t// \r\n\t\t\tthis._RightMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._RightMarginBox.Location = new System.Drawing.Point (143, 96);\r\n\t\t\tthis._RightMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._RightMarginBox.Name = \"_RightMarginBox\";\r\n\t\t\tthis._RightMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._RightMarginBox.TabIndex = 16;\r\n\t\t\tthis._RightMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _LeftMarginBox\r\n\t\t\t// \r\n\t\t\tthis._LeftMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftMarginBox.Location = new System.Drawing.Point (53, 96);\r\n\t\t\tthis._LeftMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftMarginBox.Name = \"_LeftMarginBox\";\r\n\t\t\tthis._LeftMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._LeftMarginBox.TabIndex = 14;\r\n\t\t\tthis._LeftMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _BottomMarginBox\r\n\t\t\t// \r\n\t\t\tthis._BottomMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BottomMarginBox.Location = new System.Drawing.Point (143, 69);\r\n\t\t\tthis._BottomMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BottomMarginBox.Name = \"_BottomMarginBox\";\r\n\t\t\tthis._BottomMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._BottomMarginBox.TabIndex = 12;\r\n\t\t\tthis._BottomMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _TopMarginBox\r\n\t\t\t// \r\n\t\t\tthis._TopMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopMarginBox.Location = new System.Drawing.Point (53, 69);\r\n\t\t\tthis._TopMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopMarginBox.Name = \"_TopMarginBox\";\r\n\t\t\tthis._TopMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._TopMarginBox.TabIndex = 10;\r\n\t\t\tthis._TopMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point (108, 99);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label7.TabIndex = 15;\r\n\t\t\tthis.label7.Text = \"右：\";\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point (108, 71);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label3.TabIndex = 11;\r\n\t\t\tthis.label3.Text = \"下：\";\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point (18, 99);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label6.TabIndex = 13;\r\n\t\t\tthis.label6.Text = \"左：\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point (18, 72);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label4.TabIndex = 9;\r\n\t\t\tthis.label4.Text = \"上：\";\r\n\t\t\t// \r\n\t\t\t// SourceImageOptionForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (394, 172);\r\n\t\t\tthis.Controls.Add (this.label12);\r\n\t\t\tthis.Controls.Add (this.label11);\r\n\t\t\tthis.Controls.Add (this._SourceFileBox);\r\n\t\t\tthis.Controls.Add (this.label9);\r\n\t\t\tthis.Controls.Add (this.label2);\r\n\t\t\tthis.Controls.Add (this._MinCropWidthBox);\r\n\t\t\tthis.Controls.Add (this._CancelButton);\r\n\t\t\tthis.Controls.Add (this._MinCropHeightBox);\r\n\t\t\tthis.Controls.Add (this._OkButton);\r\n\t\t\tthis.Controls.Add (this.label5);\r\n\t\t\tthis.Controls.Add (this._RightMarginBox);\r\n\t\t\tthis.Controls.Add (this.label4);\r\n\t\t\tthis.Controls.Add (this._LeftMarginBox);\r\n\t\t\tthis.Controls.Add (this.label6);\r\n\t\t\tthis.Controls.Add (this._BottomMarginBox);\r\n\t\t\tthis.Controls.Add (this.label3);\r\n\t\t\tthis.Controls.Add (this._TopMarginBox);\r\n\t\t\tthis.Controls.Add (this.label7);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"SourceImageOptionForm\";\r\n\t\t\tthis.ShowInTaskbar = false;\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"源图片处理选项\";\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropWidthBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropHeightBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _SourceFileBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _RightMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _LeftMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _BottomMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _TopMarginBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinCropWidthBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinCropHeightBox;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/SourceImageOptionForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinternal sealed partial class SourceImageOptionForm : Form\r\n\t{\r\n\t\treadonly SourceItem.Image _image;\r\n\r\n\t\tSourceImageOptionForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\t\tinternal SourceImageOptionForm(SourceItem.Image image) : this() {\r\n\t\t\t_SourceFileBox.Text = image.FilePath.ToString();\r\n\r\n\t\t\t_TopMarginBox.Value = image.Cropping.Top;\r\n\t\t\t_LeftMarginBox.Value = image.Cropping.Left;\r\n\t\t\t_BottomMarginBox.Value = image.Cropping.Bottom;\r\n\t\t\t_RightMarginBox.Value = image.Cropping.Right;\r\n\t\t\t_MinCropHeightBox.Value = image.Cropping.MinHeight;\r\n\t\t\t_MinCropWidthBox.Value = image.Cropping.MinWidth;\r\n\r\n\t\t\t_image = image;\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\t_image.Cropping.Top = (int)_TopMarginBox.Value;\r\n\t\t\t_image.Cropping.Left = (int)_LeftMarginBox.Value;\r\n\t\t\t_image.Cropping.Right = (int)_RightMarginBox.Value;\r\n\t\t\t_image.Cropping.Bottom = (int)_BottomMarginBox.Value;\r\n\t\t\t_image.Cropping.MinHeight = (int)_MinCropHeightBox.Value;\r\n\t\t\t_image.Cropping.MinWidth = (int)_MinCropWidthBox.Value;\r\n\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/SourceImageOptionForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/SourcePdfOptionForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class SourcePdfOptionForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._OkButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button ();\r\n\t\t\tthis._MessageLabel = new System.Windows.Forms.Label ();\r\n\t\t\tthis._PageRangeBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._SourceFileBox = new System.Windows.Forms.TextBox ();\r\n\t\t\tthis._ImportImagesOnlyBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._ExtractImageOptionBox = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis.label13 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label12 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label11 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label9 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label10 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._MinCropWidthBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._MinCropHeightBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._MinWidthBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._MinHeightBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._VerticalFlipImagesBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._InvertBlackAndWhiteImageBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._MergeImagesBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._RightMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._LeftMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._BottomMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis._TopMarginBox = new System.Windows.Forms.NumericUpDown ();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label6 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label4 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._ExtractImageOptionBox.SuspendLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropWidthBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropHeightBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinWidthBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinHeightBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).BeginInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).BeginInit ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// _OkButton\r\n\t\t\t// \r\n\t\t\tthis._OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._OkButton.Location = new System.Drawing.Point (288, 335);\r\n\t\t\tthis._OkButton.Name = \"_OkButton\";\r\n\t\t\tthis._OkButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._OkButton.TabIndex = 5;\r\n\t\t\tthis._OkButton.Text = \"确定(&Q)\";\r\n\t\t\tthis._OkButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OkButton.Click += new System.EventHandler (this._OkButton_Click);\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point (369, 335);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size (75, 23);\r\n\t\t\tthis._CancelButton.TabIndex = 6;\r\n\t\t\tthis._CancelButton.Text = \"取消(&X)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CancelButton.Click += new System.EventHandler (this._CancelButton_Click);\r\n\t\t\t// \r\n\t\t\t// _MessageLabel\r\n\t\t\t// \r\n\t\t\tthis._MessageLabel.AutoSize = true;\r\n\t\t\tthis._MessageLabel.Location = new System.Drawing.Point (12, 54);\r\n\t\t\tthis._MessageLabel.Name = \"_MessageLabel\";\r\n\t\t\tthis._MessageLabel.Size = new System.Drawing.Size (89, 12);\r\n\t\t\tthis._MessageLabel.TabIndex = 0;\r\n\t\t\tthis._MessageLabel.Text = \"导入页码范围：\";\r\n\t\t\t// \r\n\t\t\t// _PageRangeBox\r\n\t\t\t// \r\n\t\t\tthis._PageRangeBox.Location = new System.Drawing.Point (107, 51);\r\n\t\t\tthis._PageRangeBox.Name = \"_PageRangeBox\";\r\n\t\t\tthis._PageRangeBox.Size = new System.Drawing.Size (337, 21);\r\n\t\t\tthis._PageRangeBox.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point (10, 15);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size (53, 12);\r\n\t\t\tthis.label2.TabIndex = 7;\r\n\t\t\tthis.label2.Text = \"文件名：\";\r\n\t\t\t// \r\n\t\t\t// _SourceFileBox\r\n\t\t\t// \r\n\t\t\tthis._SourceFileBox.Location = new System.Drawing.Point (71, 12);\r\n\t\t\tthis._SourceFileBox.Name = \"_SourceFileBox\";\r\n\t\t\tthis._SourceFileBox.ReadOnly = true;\r\n\t\t\tthis._SourceFileBox.Size = new System.Drawing.Size (373, 21);\r\n\t\t\tthis._SourceFileBox.TabIndex = 8;\r\n\t\t\t// \r\n\t\t\t// _ImportImagesOnlyBox\r\n\t\t\t// \r\n\t\t\tthis._ImportImagesOnlyBox.AutoSize = true;\r\n\t\t\tthis._ImportImagesOnlyBox.Location = new System.Drawing.Point (14, 78);\r\n\t\t\tthis._ImportImagesOnlyBox.Name = \"_ImportImagesOnlyBox\";\r\n\t\t\tthis._ImportImagesOnlyBox.Size = new System.Drawing.Size (162, 16);\r\n\t\t\tthis._ImportImagesOnlyBox.TabIndex = 3;\r\n\t\t\tthis._ImportImagesOnlyBox.Text = \"仅导入源 PDF 文件的图片\";\r\n\t\t\tthis._ImportImagesOnlyBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ImportImagesOnlyBox.CheckedChanged += new System.EventHandler (this._ImportImagesOnlyBox_CheckedChanged);\r\n\t\t\t// \r\n\t\t\t// _ExtractImageOptionBox\r\n\t\t\t// \r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label13);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label12);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label11);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label8);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label9);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label10);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._MinCropWidthBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._MinCropHeightBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._MinWidthBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._MinHeightBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._VerticalFlipImagesBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._InvertBlackAndWhiteImageBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._MergeImagesBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label5);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._RightMarginBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._LeftMarginBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._BottomMarginBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this._TopMarginBox);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label7);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label3);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label6);\r\n\t\t\tthis._ExtractImageOptionBox.Controls.Add (this.label4);\r\n\t\t\tthis._ExtractImageOptionBox.Enabled = false;\r\n\t\t\tthis._ExtractImageOptionBox.Location = new System.Drawing.Point (14, 100);\r\n\t\t\tthis._ExtractImageOptionBox.Name = \"_ExtractImageOptionBox\";\r\n\t\t\tthis._ExtractImageOptionBox.Size = new System.Drawing.Size (430, 175);\r\n\t\t\tthis._ExtractImageOptionBox.TabIndex = 4;\r\n\t\t\tthis._ExtractImageOptionBox.TabStop = false;\r\n\t\t\tthis._ExtractImageOptionBox.Text = \"导入及处理源 PDF 文件图片的方式（尺寸单位：像素）\";\r\n\t\t\t// \r\n\t\t\t// label13\r\n\t\t\t// \r\n\t\t\tthis.label13.AutoSize = true;\r\n\t\t\tthis.label13.Location = new System.Drawing.Point (220, 21);\r\n\t\t\tthis.label13.Name = \"label13\";\r\n\t\t\tthis.label13.Size = new System.Drawing.Size (89, 12);\r\n\t\t\tthis.label13.TabIndex = 3;\r\n\t\t\tthis.label13.Text = \"导入图片条件：\";\r\n\t\t\t// \r\n\t\t\t// label12\r\n\t\t\t// \r\n\t\t\tthis.label12.AutoSize = true;\r\n\t\t\tthis.label12.Location = new System.Drawing.Point (232, 116);\r\n\t\t\tthis.label12.Name = \"label12\";\r\n\t\t\tthis.label12.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label12.TabIndex = 18;\r\n\t\t\tthis.label12.Text = \"宽度不小于\";\r\n\t\t\t// \r\n\t\t\t// label11\r\n\t\t\t// \r\n\t\t\tthis.label11.AutoSize = true;\r\n\t\t\tthis.label11.Location = new System.Drawing.Point (220, 92);\r\n\t\t\tthis.label11.Name = \"label11\";\r\n\t\t\tthis.label11.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label11.TabIndex = 17;\r\n\t\t\tthis.label11.Text = \"裁剪条件：\";\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point (232, 38);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label8.TabIndex = 4;\r\n\t\t\tthis.label8.Text = \"宽度不小于\";\r\n\t\t\t// \r\n\t\t\t// label9\r\n\t\t\t// \r\n\t\t\tthis.label9.AutoSize = true;\r\n\t\t\tthis.label9.Location = new System.Drawing.Point (232, 143);\r\n\t\t\tthis.label9.Name = \"label9\";\r\n\t\t\tthis.label9.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label9.TabIndex = 20;\r\n\t\t\tthis.label9.Text = \"高度不小于\";\r\n\t\t\t// \r\n\t\t\t// label10\r\n\t\t\t// \r\n\t\t\tthis.label10.AutoSize = true;\r\n\t\t\tthis.label10.Location = new System.Drawing.Point (232, 65);\r\n\t\t\tthis.label10.Name = \"label10\";\r\n\t\t\tthis.label10.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label10.TabIndex = 6;\r\n\t\t\tthis.label10.Text = \"高度不小于\";\r\n\t\t\t// \r\n\t\t\t// _MinCropWidthBox\r\n\t\t\t// \r\n\t\t\tthis._MinCropWidthBox.Increment = new decimal (new int[] {\r\n            100,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropWidthBox.Location = new System.Drawing.Point (308, 113);\r\n\t\t\tthis._MinCropWidthBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropWidthBox.Name = \"_MinCropWidthBox\";\r\n\t\t\tthis._MinCropWidthBox.Size = new System.Drawing.Size (53, 21);\r\n\t\t\tthis._MinCropWidthBox.TabIndex = 19;\r\n\t\t\tthis._MinCropWidthBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _MinCropHeightBox\r\n\t\t\t// \r\n\t\t\tthis._MinCropHeightBox.Increment = new decimal (new int[] {\r\n            100,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropHeightBox.Location = new System.Drawing.Point (308, 140);\r\n\t\t\tthis._MinCropHeightBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinCropHeightBox.Name = \"_MinCropHeightBox\";\r\n\t\t\tthis._MinCropHeightBox.Size = new System.Drawing.Size (53, 21);\r\n\t\t\tthis._MinCropHeightBox.TabIndex = 21;\r\n\t\t\tthis._MinCropHeightBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _MinWidthBox\r\n\t\t\t// \r\n\t\t\tthis._MinWidthBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinWidthBox.Location = new System.Drawing.Point (308, 36);\r\n\t\t\tthis._MinWidthBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinWidthBox.Name = \"_MinWidthBox\";\r\n\t\t\tthis._MinWidthBox.Size = new System.Drawing.Size (53, 21);\r\n\t\t\tthis._MinWidthBox.TabIndex = 5;\r\n\t\t\tthis._MinWidthBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _MinHeightBox\r\n\t\t\t// \r\n\t\t\tthis._MinHeightBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinHeightBox.Location = new System.Drawing.Point (308, 63);\r\n\t\t\tthis._MinHeightBox.Maximum = new decimal (new int[] {\r\n            10000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._MinHeightBox.Name = \"_MinHeightBox\";\r\n\t\t\tthis._MinHeightBox.Size = new System.Drawing.Size (53, 21);\r\n\t\t\tthis._MinHeightBox.TabIndex = 7;\r\n\t\t\tthis._MinHeightBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _VerticalFlipImagesBox\r\n\t\t\t// \r\n\t\t\tthis._VerticalFlipImagesBox.AutoSize = true;\r\n\t\t\tthis._VerticalFlipImagesBox.Location = new System.Drawing.Point (6, 42);\r\n\t\t\tthis._VerticalFlipImagesBox.Name = \"_VerticalFlipImagesBox\";\r\n\t\t\tthis._VerticalFlipImagesBox.Size = new System.Drawing.Size (96, 16);\r\n\t\t\tthis._VerticalFlipImagesBox.TabIndex = 1;\r\n\t\t\tthis._VerticalFlipImagesBox.Text = \"垂直翻转图片\";\r\n\t\t\tthis._VerticalFlipImagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _InvertBlackAndWhiteImageBox\r\n\t\t\t// \r\n\t\t\tthis._InvertBlackAndWhiteImageBox.AutoSize = true;\r\n\t\t\tthis._InvertBlackAndWhiteImageBox.Location = new System.Drawing.Point (6, 64);\r\n\t\t\tthis._InvertBlackAndWhiteImageBox.Name = \"_InvertBlackAndWhiteImageBox\";\r\n\t\t\tthis._InvertBlackAndWhiteImageBox.Size = new System.Drawing.Size (132, 16);\r\n\t\t\tthis._InvertBlackAndWhiteImageBox.TabIndex = 2;\r\n\t\t\tthis._InvertBlackAndWhiteImageBox.Text = \"反转黑白图片的颜色\";\r\n\t\t\tthis._InvertBlackAndWhiteImageBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _MergeImagesBox\r\n\t\t\t// \r\n\t\t\tthis._MergeImagesBox.AutoSize = true;\r\n\t\t\tthis._MergeImagesBox.Checked = true;\r\n\t\t\tthis._MergeImagesBox.CheckState = System.Windows.Forms.CheckState.Checked;\r\n\t\t\tthis._MergeImagesBox.Location = new System.Drawing.Point (6, 20);\r\n\t\t\tthis._MergeImagesBox.Name = \"_MergeImagesBox\";\r\n\t\t\tthis._MergeImagesBox.Size = new System.Drawing.Size (120, 16);\r\n\t\t\tthis._MergeImagesBox.TabIndex = 0;\r\n\t\t\tthis._MergeImagesBox.Text = \"尝试合并同页图片\";\r\n\t\t\tthis._MergeImagesBox.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point (6, 91);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label5.TabIndex = 8;\r\n\t\t\tthis.label5.Text = \"裁剪图片：\";\r\n\t\t\t// \r\n\t\t\t// _RightMarginBox\r\n\t\t\t// \r\n\t\t\tthis._RightMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._RightMarginBox.Location = new System.Drawing.Point (137, 139);\r\n\t\t\tthis._RightMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._RightMarginBox.Name = \"_RightMarginBox\";\r\n\t\t\tthis._RightMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._RightMarginBox.TabIndex = 16;\r\n\t\t\tthis._RightMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _LeftMarginBox\r\n\t\t\t// \r\n\t\t\tthis._LeftMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftMarginBox.Location = new System.Drawing.Point (47, 139);\r\n\t\t\tthis._LeftMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._LeftMarginBox.Name = \"_LeftMarginBox\";\r\n\t\t\tthis._LeftMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._LeftMarginBox.TabIndex = 14;\r\n\t\t\tthis._LeftMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _BottomMarginBox\r\n\t\t\t// \r\n\t\t\tthis._BottomMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BottomMarginBox.Location = new System.Drawing.Point (137, 112);\r\n\t\t\tthis._BottomMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._BottomMarginBox.Name = \"_BottomMarginBox\";\r\n\t\t\tthis._BottomMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._BottomMarginBox.TabIndex = 12;\r\n\t\t\tthis._BottomMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// _TopMarginBox\r\n\t\t\t// \r\n\t\t\tthis._TopMarginBox.Increment = new decimal (new int[] {\r\n            10,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopMarginBox.Location = new System.Drawing.Point (47, 112);\r\n\t\t\tthis._TopMarginBox.Maximum = new decimal (new int[] {\r\n            1000,\r\n            0,\r\n            0,\r\n            0});\r\n\t\t\tthis._TopMarginBox.Name = \"_TopMarginBox\";\r\n\t\t\tthis._TopMarginBox.Size = new System.Drawing.Size (49, 21);\r\n\t\t\tthis._TopMarginBox.TabIndex = 10;\r\n\t\t\tthis._TopMarginBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point (102, 142);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label7.TabIndex = 15;\r\n\t\t\tthis.label7.Text = \"右：\";\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point (102, 114);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label3.TabIndex = 11;\r\n\t\t\tthis.label3.Text = \"下：\";\r\n\t\t\t// \r\n\t\t\t// label6\r\n\t\t\t// \r\n\t\t\tthis.label6.AutoSize = true;\r\n\t\t\tthis.label6.Location = new System.Drawing.Point (12, 142);\r\n\t\t\tthis.label6.Name = \"label6\";\r\n\t\t\tthis.label6.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label6.TabIndex = 13;\r\n\t\t\tthis.label6.Text = \"左：\";\r\n\t\t\t// \r\n\t\t\t// label4\r\n\t\t\t// \r\n\t\t\tthis.label4.AutoSize = true;\r\n\t\t\tthis.label4.Location = new System.Drawing.Point (12, 115);\r\n\t\t\tthis.label4.Name = \"label4\";\r\n\t\t\tthis.label4.Size = new System.Drawing.Size (29, 12);\r\n\t\t\tthis.label4.TabIndex = 9;\r\n\t\t\tthis.label4.Text = \"上：\";\r\n\t\t\t// \r\n\t\t\t// SourcePdfOptionForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._OkButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size (456, 370);\r\n\t\t\tthis.Controls.Add (this._PageRangeBox);\r\n\t\t\tthis.Controls.Add (this._ImportImagesOnlyBox);\r\n\t\t\tthis.Controls.Add (this._MessageLabel);\r\n\t\t\tthis.Controls.Add (this._ExtractImageOptionBox);\r\n\t\t\tthis.Controls.Add (this._SourceFileBox);\r\n\t\t\tthis.Controls.Add (this.label2);\r\n\t\t\tthis.Controls.Add (this._CancelButton);\r\n\t\t\tthis.Controls.Add (this._OkButton);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"SourcePdfOptionForm\";\r\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r\n\t\t\tthis.Text = \"源 PDF 文件选项\";\r\n\t\t\tthis._ExtractImageOptionBox.ResumeLayout (false);\r\n\t\t\tthis._ExtractImageOptionBox.PerformLayout ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropWidthBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinCropHeightBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinWidthBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._MinHeightBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._RightMarginBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._LeftMarginBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._BottomMarginBox)).EndInit ();\r\n\t\t\t((System.ComponentModel.ISupportInitialize)(this._TopMarginBox)).EndInit ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Button _OkButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Label _MessageLabel;\r\n\t\tprivate System.Windows.Forms.TextBox _PageRangeBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.TextBox _SourceFileBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ImportImagesOnlyBox;\r\n\t\tprivate System.Windows.Forms.GroupBox _ExtractImageOptionBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _RightMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _LeftMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _BottomMarginBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _TopMarginBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label6;\r\n\t\tprivate System.Windows.Forms.Label label4;\r\n\t\tprivate System.Windows.Forms.CheckBox _MergeImagesBox;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.CheckBox _InvertBlackAndWhiteImageBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _VerticalFlipImagesBox;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.Label label10;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinWidthBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinHeightBox;\r\n\t\tprivate System.Windows.Forms.Label label11;\r\n\t\tprivate System.Windows.Forms.Label label9;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinCropWidthBox;\r\n\t\tprivate System.Windows.Forms.NumericUpDown _MinCropHeightBox;\r\n\t\tprivate System.Windows.Forms.Label label13;\r\n\t\tprivate System.Windows.Forms.Label label12;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/Functions/SourcePdfOptionForm.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tinternal sealed partial class SourcePdfOptionForm : Form\r\n\t{\r\n\t\treadonly SourceItem.Pdf _pdf;\r\n\r\n\t\tSourcePdfOptionForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t}\r\n\t\tinternal SourcePdfOptionForm(SourceItem.Pdf pdf) : this() {\r\n\t\t\t_SourceFileBox.Text = pdf.FilePath.ToString();\r\n\t\t\t_PageRangeBox.Text = pdf.PageRanges;\r\n\t\t\t_ImportImagesOnlyBox.Checked = pdf.ImportImagesOnly;\r\n\r\n\t\t\t_MergeImagesBox.Checked = pdf.ExtractImageOptions.MergeImages;\r\n\t\t\t_InvertBlackAndWhiteImageBox.Checked = pdf.ExtractImageOptions.InvertBlackAndWhiteImages;\r\n\t\t\t_VerticalFlipImagesBox.Checked = pdf.ExtractImageOptions.VerticalFlipImages;\r\n\t\t\t_MinHeightBox.Value = pdf.ExtractImageOptions.MinHeight;\r\n\t\t\t_MinWidthBox.Value = pdf.ExtractImageOptions.MinWidth;\r\n\t\t\t_pdf = pdf;\r\n\t\t}\r\n\r\n\t\tvoid _OkButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.OK;\r\n\t\t\t_pdf.PageRanges = PageRangeCollection.Parse(_PageRangeBox.Text, 1, _pdf.PageCount, true).ToString();\r\n\t\t\t_pdf.ImportImagesOnly = _ImportImagesOnlyBox.Checked;\r\n\t\t\t_pdf.ExtractImageOptions.MergeImages = _MergeImagesBox.Checked;\r\n\t\t\t_pdf.ExtractImageOptions.InvertBlackAndWhiteImages = _InvertBlackAndWhiteImageBox.Checked;\r\n\t\t\t_pdf.ExtractImageOptions.VerticalFlipImages = _VerticalFlipImagesBox.Checked;\r\n\t\t\t_pdf.ExtractImageOptions.MinHeight = (int)_MinHeightBox.Value;\r\n\t\t\t_pdf.ExtractImageOptions.MinWidth = (int)_MinWidthBox.Value;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _CancelButton_Click(Object source, EventArgs args) {\r\n\t\t\tDialogResult = DialogResult.Cancel;\r\n\t\t\tClose();\r\n\t\t}\r\n\r\n\t\tvoid _ImportImagesOnlyBox_CheckedChanged(object sender, EventArgs e) {\r\n\t\t\t_ExtractImageOptionBox.Enabled = _ImportImagesOnlyBox.Checked;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/SourcePdfOptionForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/TargetFileControl.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class TargetFileControl\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n            this.components = new System.ComponentModel.Container();\r\n            this.label1 = new System.Windows.Forms.Label();\r\n            this._SavePdfBox = new System.Windows.Forms.SaveFileDialog();\r\n            this._BrowseTargetPdfButton = new System.Windows.Forms.Button();\r\n            this.panel1 = new System.Windows.Forms.Panel();\r\n            this._TargetPdfBox = new PDFPatcher.HistoryComboBox();\r\n            this._FileMacroMenu = new PDFPatcher.Functions.MacroMenu(this.components);\r\n            this.panel1.SuspendLayout();\r\n            this.SuspendLayout();\r\n            // \r\n            // label1\r\n            // \r\n            this.label1.AutoSize = true;\r\n            this.label1.Location = new System.Drawing.Point(3, 6);\r\n            this.label1.Name = \"label1\";\r\n            this.label1.Size = new System.Drawing.Size(95, 12);\r\n            this.label1.TabIndex = 0;\r\n            this.label1.Text = \"输出 PD&F 文件：\";\r\n            // \r\n            // _SavePdfBox\r\n            // \r\n            this._SavePdfBox.DefaultExt = \"pdf\";\r\n            this._SavePdfBox.Filter = \"PDF 文件 (*.pdf)|*.pdf\";\r\n            this._SavePdfBox.OverwritePrompt = false;\r\n            this._SavePdfBox.Title = \"指定输出的 PDF 文件路径\";\r\n            // \r\n            // _BrowseTargetPdfButton\r\n            // \r\n            this._BrowseTargetPdfButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._BrowseTargetPdfButton.Image = global::PDFPatcher.Properties.Resources.NewPdfFile;\r\n            this._BrowseTargetPdfButton.Location = new System.Drawing.Point(391, 1);\r\n            this._BrowseTargetPdfButton.Name = \"_BrowseTargetPdfButton\";\r\n            this._BrowseTargetPdfButton.Size = new System.Drawing.Size(75, 23);\r\n            this._BrowseTargetPdfButton.TabIndex = 2;\r\n            this._BrowseTargetPdfButton.Text = \"浏览...\";\r\n            this._BrowseTargetPdfButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n            this._BrowseTargetPdfButton.UseVisualStyleBackColor = true;\r\n            this._BrowseTargetPdfButton.Click += new System.EventHandler(this._BrowseTargetPdfButton_Click);\r\n            // \r\n            // panel1\r\n            // \r\n            this.panel1.Controls.Add(this._BrowseTargetPdfButton);\r\n            this.panel1.Controls.Add(this._TargetPdfBox);\r\n            this.panel1.Controls.Add(this.label1);\r\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r\n            this.panel1.Location = new System.Drawing.Point(0, 0);\r\n            this.panel1.Name = \"panel1\";\r\n            this.panel1.Size = new System.Drawing.Size(469, 25);\r\n            this.panel1.TabIndex = 3;\r\n            // \r\n            // _TargetPdfBox\r\n            // \r\n            this._TargetPdfBox.AllowDrop = true;\r\n            this._TargetPdfBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r\n                        | System.Windows.Forms.AnchorStyles.Right)));\r\n            this._TargetPdfBox.Contents = null;\r\n            this._TargetPdfBox.ContextMenuStrip = this._FileMacroMenu;\r\n            this._TargetPdfBox.FormattingEnabled = true;\r\n            this._TargetPdfBox.Location = new System.Drawing.Point(104, 3);\r\n            this._TargetPdfBox.MaxItemCount = 16;\r\n            this._TargetPdfBox.Name = \"_TargetPdfBox\";\r\n            this._TargetPdfBox.Size = new System.Drawing.Size(281, 20);\r\n            this._TargetPdfBox.TabIndex = 1;\r\n            this._TargetPdfBox.DragDrop += new System.Windows.Forms.DragEventHandler(this._TargetPdfBox_DragDrop);\r\n            this._TargetPdfBox.DragEnter += new System.Windows.Forms.DragEventHandler(this._TargetPdfBox_DragEnter);\r\n            this._TargetPdfBox.TextChanged += new System.EventHandler(this._TargetPdfBox_TextChanged);\r\n            // \r\n            // _FileMacroMenu\r\n            // \r\n            this._FileMacroMenu.Name = \"_FileMacroMenu\";\r\n            this._FileMacroMenu.Size = new System.Drawing.Size(61, 4);\r\n            // \r\n            // TargetFileControl\r\n            // \r\n            this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);\r\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r\n            this.Controls.Add(this.panel1);\r\n            this.Name = \"TargetFileControl\";\r\n            this.Size = new System.Drawing.Size(469, 25);\r\n            this.Load += new System.EventHandler(this.TargetFileControl_Show);\r\n            this.VisibleChanged += new System.EventHandler(this.TargetFileControl_Show);\r\n            this.panel1.ResumeLayout(false);\r\n            this.panel1.PerformLayout();\r\n            this.ResumeLayout(false);\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.Button _BrowseTargetPdfButton;\r\n\t\tprivate System.Windows.Forms.SaveFileDialog _SavePdfBox;\r\n\t\tprivate HistoryComboBox _TargetPdfBox;\r\n\t\tprivate Functions.MacroMenu _FileMacroMenu;\r\n        private System.Windows.Forms.Panel panel1;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/TargetFileControl.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic partial class TargetFileControl : UserControl\r\n\t{\r\n\t\tinternal event CancelEventHandler TargetFileChangedByBrowseButton;\r\n\t\tinternal event EventHandler<EventArgs> BrowseForFile;\r\n\r\n\t\tpublic TargetFileControl() {\r\n\t\t\tInitializeComponent();\r\n\r\n\t\t\t_FileMacroMenu.ItemClicked += _FileMacroMenu.ProcessInsertMacroCommand;\r\n\t\t}\r\n\r\n\t\t///<summary>获取或指定书签文件路径的值。</summary>\r\n\t\tinternal HistoryComboBox FileList => _TargetPdfBox;\r\n\t\tinternal FileDialog FileDialog => _SavePdfBox;\r\n\t\tinternal Functions.MacroMenu FileMacroMenu => _FileMacroMenu;\r\n\r\n\t\tpublic string BrowseTargetFile() {\r\n\t\t\t_BrowseTargetPdfButton_Click(_BrowseTargetPdfButton, null);\r\n\t\t\treturn _TargetPdfBox.Text;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置文件下拉框的文本。\r\n\t\t/// </summary>\r\n\t\tpublic override string Text {\r\n\t\t\tget => _TargetPdfBox.Text;\r\n\t\t\tset => _TargetPdfBox.Text = value;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置文件下拉框前的标签文本。\r\n\t\t/// </summary>\r\n\t\t[DefaultValue(\"输出 PD&F 文件：\")]\r\n\t\tpublic string Label {\r\n\t\t\tget => label1.Text;\r\n\t\t\tset => label1.Text = value;\r\n\t\t}\r\n\r\n\t\tvoid _BrowseTargetPdfButton_Click(object sender, EventArgs e) {\r\n\t\t\tBrowseForFile?.Invoke(sender, e);\r\n\t\t\tFilePath sourceFile = (AppContext.SourceFiles != null && AppContext.SourceFiles.Length > 0) ? AppContext.SourceFiles[0] : String.Empty;\r\n\t\t\tvar t = _TargetPdfBox.Text;\r\n\t\t\tif (t.Length > 0 && FileHelper.IsPathValid(t) && Path.GetFileName(t).Length > 0) {\r\n\t\t\t\t_SavePdfBox.SetLocation(t);\r\n\t\t\t}\r\n\t\t\telse if (sourceFile.FileName.Length > 0) {\r\n\t\t\t\tt = FileHelper.GetNewFileNameFromSourceFile(sourceFile, Constants.FileExtensions.Pdf);\r\n\t\t\t\t_SavePdfBox.SetLocation(t);\r\n\t\t\t}\r\n\t\t\tif (_SavePdfBox.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\tif (TargetFileChangedByBrowseButton != null) {\r\n\t\t\t\t\tvar a = new CancelEventArgs();\r\n\t\t\t\t\tTargetFileChangedByBrowseButton(this, a);\r\n\t\t\t\t\tif (a.Cancel) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tText = _SavePdfBox.FileName;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid _TargetPdfBox_TextChanged(object sender, EventArgs e) {\r\n\t\t\tAppContext.TargetFile = _TargetPdfBox.Text;\r\n\t\t}\r\n\r\n\t\tvoid _TargetPdfBox_DragEnter(object sender, DragEventArgs e) {\r\n\t\t\tFormHelper.FeedbackDragFileOver(e, Constants.FileExtensions.Pdf);\r\n\t\t}\r\n\r\n\t\tvoid _TargetPdfBox_DragDrop(object sender, DragEventArgs e) {\r\n\t\t\tFormHelper.DropFileOver((Control)sender, e, Constants.FileExtensions.Pdf);\r\n\t\t}\r\n\r\n\t\tvoid TargetFileControl_Show(object sender, EventArgs e) {\r\n\t\t\tvar t = Text;\r\n\t\t\tif (Visible && AppContext.MainForm != null) {\r\n\t\t\t\t_TargetPdfBox.Contents = AppContext.Recent.TargetPdfFiles;\r\n\t\t\t}\r\n\t\t\telse if (Visible == false) {\r\n\t\t\t\t_TargetPdfBox.Contents = null;\r\n\t\t\t}\r\n\t\t\tText = t;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/TargetFileControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_SavePdfBox.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_FileMacroMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>143, 17</value>\r\n  </metadata>\r\n</root>"
  },
  {
    "path": "App/Functions/UpdateForm.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class UpdateForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis._InfoBox = new System.Windows.Forms.RichTextBox();\r\n\t\t\tthis._HomePageButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._CancelButton = new System.Windows.Forms.Button();\r\n\t\t\tthis._DownloadButton = new System.Windows.Forms.Button();\r\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\r\n\t\t\tthis._CheckUpdateIntervalBox = new System.Windows.Forms.ComboBox();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _InfoBox\r\n\t\t\t// \r\n\t\t\tthis._InfoBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \r\n            | System.Windows.Forms.AnchorStyles.Left) \r\n            | System.Windows.Forms.AnchorStyles.Right)));\r\n\t\t\tthis._InfoBox.Location = new System.Drawing.Point(21, 18);\r\n\t\t\tthis._InfoBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\r\n\t\t\tthis._InfoBox.Name = \"_InfoBox\";\r\n\t\t\tthis._InfoBox.ReadOnly = true;\r\n\t\t\tthis._InfoBox.Size = new System.Drawing.Size(777, 446);\r\n\t\t\tthis._InfoBox.TabIndex = 0;\r\n\t\t\tthis._InfoBox.Text = \"\";\r\n\t\t\t// \r\n\t\t\t// _HomePageButton\r\n\t\t\t// \r\n\t\t\tthis._HomePageButton.Image = global::PDFPatcher.Properties.Resources.HomePage;\r\n\t\t\tthis._HomePageButton.Location = new System.Drawing.Point(199, 474);\r\n\t\t\tthis._HomePageButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\r\n\t\t\tthis._HomePageButton.Name = \"_HomePageButton\";\r\n\t\t\tthis._HomePageButton.Size = new System.Drawing.Size(162, 35);\r\n\t\t\tthis._HomePageButton.TabIndex = 2;\r\n\t\t\tthis._HomePageButton.Text = \"转到主页(&Z)\";\r\n\t\t\tthis._HomePageButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._HomePageButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _CancelButton\r\n\t\t\t// \r\n\t\t\tthis._CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r\n\t\t\tthis._CancelButton.Location = new System.Drawing.Point(370, 474);\r\n\t\t\tthis._CancelButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\r\n\t\t\tthis._CancelButton.Name = \"_CancelButton\";\r\n\t\t\tthis._CancelButton.Size = new System.Drawing.Size(112, 35);\r\n\t\t\tthis._CancelButton.TabIndex = 3;\r\n\t\t\tthis._CancelButton.Text = \"取消(&Q)\";\r\n\t\t\tthis._CancelButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// _DownloadButton\r\n\t\t\t// \r\n\t\t\tthis._DownloadButton.Enabled = false;\r\n\t\t\tthis._DownloadButton.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\tthis._DownloadButton.Location = new System.Drawing.Point(21, 474);\r\n\t\t\tthis._DownloadButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\r\n\t\t\tthis._DownloadButton.Name = \"_DownloadButton\";\r\n\t\t\tthis._DownloadButton.Size = new System.Drawing.Size(170, 35);\r\n\t\t\tthis._DownloadButton.TabIndex = 1;\r\n\t\t\tthis._DownloadButton.Text = \"下载新版本(&X)\";\r\n\t\t\tthis._DownloadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r\n\t\t\tthis._DownloadButton.UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// label1\r\n\t\t\t// \r\n\t\t\tthis.label1.AutoSize = true;\r\n\t\t\tthis.label1.Location = new System.Drawing.Point(490, 482);\r\n\t\t\tthis.label1.Name = \"label1\";\r\n\t\t\tthis.label1.Size = new System.Drawing.Size(170, 18);\r\n\t\t\tthis.label1.TabIndex = 4;\r\n\t\t\tthis.label1.Text = \"自动检查更新间隔：\";\r\n\t\t\t// \r\n\t\t\t// _CheckUpdateIntervalBox\r\n\t\t\t// \r\n\t\t\tthis._CheckUpdateIntervalBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._CheckUpdateIntervalBox.FormattingEnabled = true;\r\n\t\t\tthis._CheckUpdateIntervalBox.Items.AddRange(new object[] {\r\n            \"7天\",\r\n            \"14天\",\r\n            \"30天\",\r\n            \"从不检查\"});\r\n\t\t\tthis._CheckUpdateIntervalBox.Location = new System.Drawing.Point(657, 479);\r\n\t\t\tthis._CheckUpdateIntervalBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);\r\n\t\t\tthis._CheckUpdateIntervalBox.Name = \"_CheckUpdateIntervalBox\";\r\n\t\t\tthis._CheckUpdateIntervalBox.Size = new System.Drawing.Size(136, 26);\r\n\t\t\tthis._CheckUpdateIntervalBox.TabIndex = 5;\r\n\t\t\t// \r\n\t\t\t// UpdateForm\r\n\t\t\t// \r\n\t\t\tthis.AcceptButton = this._HomePageButton;\r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.CancelButton = this._CancelButton;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(818, 534);\r\n\t\t\tthis.Controls.Add(this._CheckUpdateIntervalBox);\r\n\t\t\tthis.Controls.Add(this.label1);\r\n\t\t\tthis.Controls.Add(this._DownloadButton);\r\n\t\t\tthis.Controls.Add(this._CancelButton);\r\n\t\t\tthis.Controls.Add(this._HomePageButton);\r\n\t\t\tthis.Controls.Add(this._InfoBox);\r\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\r\n\t\t\tthis.MaximizeBox = false;\r\n\t\t\tthis.MinimizeBox = false;\r\n\t\t\tthis.Name = \"UpdateForm\";\r\n\t\t\tthis.Text = \"检查更新\";\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.RichTextBox _InfoBox;\r\n\t\tprivate System.Windows.Forms.Button _HomePageButton;\r\n\t\tprivate System.Windows.Forms.Button _CancelButton;\r\n\t\tprivate System.Windows.Forms.Button _DownloadButton;\r\n\t\tprivate System.Windows.Forms.Label label1;\r\n\t\tprivate System.Windows.Forms.ComboBox _CheckUpdateIntervalBox;\r\n\t}\r\n}"
  },
  {
    "path": "App/Functions/UpdateForm.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Net;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic partial class UpdateForm : Form\r\n\t{\r\n\t\tWebClient _UpdateChecker;\r\n\r\n\t\tpublic UpdateForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.SetIcon(Properties.Resources.CheckUpdate);\r\n\t\t\tLoad += (s, args) => {\r\n\t\t\t\tCheckNewVersion();\r\n\t\t\t\tvar i = AppContext.CheckUpdateInterval;\r\n\t\t\t\t_CheckUpdateIntervalBox.Select(i == 7 ? 0 : i == 14 ? 1 : i == 30 ? 2 : 3);\r\n\t\t\t};\r\n\t\t\tFormClosed += (s, args) => {\r\n\t\t\t\tvar c = _UpdateChecker;\r\n\t\t\t\tif (c != null) {\r\n\t\t\t\t\tc.DownloadDataCompleted -= UpdateChecker_DownloadDataCompleted;\r\n\t\t\t\t\tc.CancelAsync();\r\n\t\t\t\t\tc.Dispose();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t_HomePageButton.Click += (s, args) => ShellHelper.VisitHomePage();\r\n\t\t\t_DownloadButton.Click += (s, args) => System.Diagnostics.Process.Start(_DownloadButton.Tag.ToString());\r\n\t\t\t_CheckUpdateIntervalBox.SelectedIndexChanged += (s, args) => {\r\n\t\t\t\tAppContext.CheckUpdateInterval = _CheckUpdateIntervalBox.SelectedIndex switch {\r\n\t\t\t\t\t0 => 7,\r\n\t\t\t\t\t1 => 14,\r\n\t\t\t\t\t2 => 30,\r\n\t\t\t\t\t_ => Int32.MaxValue,\r\n\t\t\t\t};\r\n\t\t\t\tif (AppContext.CheckUpdateInterval != Int32.MaxValue) {\r\n\t\t\t\t\tAppContext.CheckUpdateDate = DateTime.Today + TimeSpan.FromDays(AppContext.CheckUpdateInterval);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tprivate void CheckNewVersion() {\r\n\t\t\t_UpdateChecker = new WebClient();\r\n\t\t\t_InfoBox.AppendLine(\"正在检查新版本，请稍候……\");\r\n\t\t\t_UpdateChecker.DownloadDataCompleted += UpdateChecker_DownloadDataCompleted;\r\n\t\t\t_UpdateChecker.DownloadDataAsync(new Uri(Constants.AppUpdateFile));\r\n\t\t}\r\n\r\n\t\tvoid UpdateChecker_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs args) {\r\n\t\t\t_InfoBox.Clear();\r\n\t\t\tif (args.Error != null) {\r\n\t\t\t\t_InfoBox.AppendText(\"检查新版本失败：\" + args.Error.Message);\r\n\t\t\t\tgoto Exit;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tvar x = new XmlDocument();\r\n\t\t\t\tx.Load(new System.IO.MemoryStream(args.Result));\r\n\t\t\t\tCheckResult(x);\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\tFormHelper.ErrorBox(\"版本信息文件格式错误，请稍候重试。\");\r\n\t\t\t}\r\n\t\tExit:\r\n\t\t\t_UpdateChecker.Dispose();\r\n\t\t\t_UpdateChecker = null;\r\n\t\t}\r\n\r\n\t\tvoid CheckResult(XmlDocument x) {\r\n\t\t\tvar r = x.DocumentElement;\r\n\t\t\tif (r == null || r.Name != Constants.AppEngName) {\r\n\t\t\t\t_InfoBox.SelectionColor = Color.Red;\r\n\t\t\t\t_InfoBox.AppendLine(\"版本信息文件格式错误，请稍候重试。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar v = r.GetAttribute(\"version\");\r\n\t\t\tvar d = r.GetAttribute(\"date\");\r\n\t\t\tif (new Version(ProductVersion) < new Version(r.GetAttribute(\"version\"))) {\r\n\t\t\t\t_InfoBox.SelectionColor = Color.Blue;\r\n\t\t\t\t_InfoBox.AppendLine($\"发现新版本：{v} {d}\");\r\n\t\t\t\tvar u = r.GetAttribute(\"url\");\r\n\t\t\t\tif (u.Length > 0) {\r\n\t\t\t\t\t_DownloadButton.Enabled = true;\r\n\t\t\t\t\t_DownloadButton.Tag = u;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_InfoBox.AppendLine(String.Join(\"\\n\", new string[] {\r\n\t\t\t\t\t\t\t\"未发现新版本。\", $\"服务器上发布的版本是：{v} {d}\", String.Empty\r\n\t\t\t\t\t\t}));\r\n\t\t\t\t_InfoBox.SelectionColor = Color.DimGray;\r\n\t\t\t}\r\n\r\n\t\t\tvar c = r.SelectSingleNode(\"content\");\r\n\t\t\tif (c != null) {\r\n\t\t\t\t_InfoBox.AppendLine(c.InnerText);\r\n\t\t\t\t_InfoBox.SelectionStart = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/UpdateForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Functions/ViewerPreferenceEditor.Designer.cs",
    "content": "﻿namespace PDFPatcher.Functions\r\n{\r\n\tpartial class ViewerPreferenceEditor\r\n\t{\r\n\t\t/// <summary> \r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary> \r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region 组件设计器生成的代码\r\n\r\n\t\t/// <summary> \r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.groupBox2 = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis._ForceInternalLinkBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._ForceRemoveZoomRateBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._ForceBookmarkOpenBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis.label2 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.groupBox1 = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis.label8 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._ForceInitialModeBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis._ForceDirectionBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis.label7 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._ForceInitialViewBox = new System.Windows.Forms.ComboBox ();\r\n\t\t\tthis.label3 = new System.Windows.Forms.Label ();\r\n\t\t\tthis.label5 = new System.Windows.Forms.Label ();\r\n\t\t\tthis._HideMenuBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._HideToolbarBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._HideUIBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._FitWindowBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._CenterWindowBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._DisplayDocTitleBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis._UISettingsPanel = new System.Windows.Forms.Panel ();\r\n\t\t\tthis._OverrideUISettingsBox = new System.Windows.Forms.CheckBox ();\r\n\t\t\tthis.groupBox4 = new System.Windows.Forms.GroupBox ();\r\n\t\t\tthis.groupBox2.SuspendLayout ();\r\n\t\t\tthis.groupBox1.SuspendLayout ();\r\n\t\t\tthis._UISettingsPanel.SuspendLayout ();\r\n\t\t\tthis.groupBox4.SuspendLayout ();\r\n\t\t\tthis.SuspendLayout ();\r\n\t\t\t// \r\n\t\t\t// groupBox2\r\n\t\t\t// \r\n\t\t\tthis.groupBox2.Controls.Add (this._ForceInternalLinkBox);\r\n\t\t\tthis.groupBox2.Controls.Add (this._ForceRemoveZoomRateBox);\r\n\t\t\tthis.groupBox2.Location = new System.Drawing.Point (6, 164);\r\n\t\t\tthis.groupBox2.Name = \"groupBox2\";\r\n\t\t\tthis.groupBox2.Size = new System.Drawing.Size (426, 70);\r\n\t\t\tthis.groupBox2.TabIndex = 2;\r\n\t\t\tthis.groupBox2.TabStop = false;\r\n\t\t\tthis.groupBox2.Text = \"书签及链接动作\";\r\n\t\t\t// \r\n\t\t\t// _ForceInternalLinkBox\r\n\t\t\t// \r\n\t\t\tthis._ForceInternalLinkBox.AutoSize = true;\r\n\t\t\tthis._ForceInternalLinkBox.Location = new System.Drawing.Point (6, 42);\r\n\t\t\tthis._ForceInternalLinkBox.Name = \"_ForceInternalLinkBox\";\r\n\t\t\tthis._ForceInternalLinkBox.Size = new System.Drawing.Size (234, 16);\r\n\t\t\tthis._ForceInternalLinkBox.TabIndex = 3;\r\n\t\t\tthis._ForceInternalLinkBox.Text = \"强制将外部 PDF 文件链接改成内部链接\";\r\n\t\t\tthis._ForceInternalLinkBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ForceInternalLinkBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _ForceRemoveZoomRateBox\r\n\t\t\t// \r\n\t\t\tthis._ForceRemoveZoomRateBox.AutoSize = true;\r\n\t\t\tthis._ForceRemoveZoomRateBox.Location = new System.Drawing.Point (6, 20);\r\n\t\t\tthis._ForceRemoveZoomRateBox.Name = \"_ForceRemoveZoomRateBox\";\r\n\t\t\tthis._ForceRemoveZoomRateBox.Size = new System.Drawing.Size (204, 16);\r\n\t\t\tthis._ForceRemoveZoomRateBox.TabIndex = 0;\r\n\t\t\tthis._ForceRemoveZoomRateBox.Text = \"禁止书签及页面链接更改显示比例\";\r\n\t\t\tthis._ForceRemoveZoomRateBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._ForceRemoveZoomRateBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _ForceBookmarkOpenBox\r\n\t\t\t// \r\n\t\t\tthis._ForceBookmarkOpenBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ForceBookmarkOpenBox.FormattingEnabled = true;\r\n\t\t\tthis._ForceBookmarkOpenBox.Location = new System.Drawing.Point (77, 96);\r\n\t\t\tthis._ForceBookmarkOpenBox.Name = \"_ForceBookmarkOpenBox\";\r\n\t\t\tthis._ForceBookmarkOpenBox.Size = new System.Drawing.Size (127, 20);\r\n\t\t\tthis._ForceBookmarkOpenBox.TabIndex = 2;\r\n\t\t\tthis._ForceBookmarkOpenBox.SelectedIndexChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label2\r\n\t\t\t// \r\n\t\t\tthis.label2.AutoSize = true;\r\n\t\t\tthis.label2.Location = new System.Drawing.Point (6, 99);\r\n\t\t\tthis.label2.Name = \"label2\";\r\n\t\t\tthis.label2.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label2.TabIndex = 1;\r\n\t\t\tthis.label2.Text = \"书签状态：\";\r\n\t\t\t// \r\n\t\t\t// groupBox1\r\n\t\t\t// \r\n\t\t\tthis.groupBox1.Controls.Add (this.label8);\r\n\t\t\tthis.groupBox1.Controls.Add (this._ForceBookmarkOpenBox);\r\n\t\t\tthis.groupBox1.Controls.Add (this._ForceInitialModeBox);\r\n\t\t\tthis.groupBox1.Controls.Add (this._ForceDirectionBox);\r\n\t\t\tthis.groupBox1.Controls.Add (this.label2);\r\n\t\t\tthis.groupBox1.Controls.Add (this.label7);\r\n\t\t\tthis.groupBox1.Controls.Add (this._ForceInitialViewBox);\r\n\t\t\tthis.groupBox1.Controls.Add (this.label3);\r\n\t\t\tthis.groupBox1.Location = new System.Drawing.Point (6, 23);\r\n\t\t\tthis.groupBox1.Name = \"groupBox1\";\r\n\t\t\tthis.groupBox1.Size = new System.Drawing.Size (210, 135);\r\n\t\t\tthis.groupBox1.TabIndex = 1;\r\n\t\t\tthis.groupBox1.TabStop = false;\r\n\t\t\tthis.groupBox1.Text = \"阅读器设定\";\r\n\t\t\t// \r\n\t\t\t// label8\r\n\t\t\t// \r\n\t\t\tthis.label8.AutoSize = true;\r\n\t\t\tthis.label8.Location = new System.Drawing.Point (6, 73);\r\n\t\t\tthis.label8.Name = \"label8\";\r\n\t\t\tthis.label8.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label8.TabIndex = 4;\r\n\t\t\tthis.label8.Text = \"初始模式：\";\r\n\t\t\t// \r\n\t\t\t// _ForceInitialModeBox\r\n\t\t\t// \r\n\t\t\tthis._ForceInitialModeBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ForceInitialModeBox.FormattingEnabled = true;\r\n\t\t\tthis._ForceInitialModeBox.Location = new System.Drawing.Point (77, 70);\r\n\t\t\tthis._ForceInitialModeBox.Name = \"_ForceInitialModeBox\";\r\n\t\t\tthis._ForceInitialModeBox.Size = new System.Drawing.Size (127, 20);\r\n\t\t\tthis._ForceInitialModeBox.TabIndex = 5;\r\n\t\t\tthis._ForceInitialModeBox.SelectedIndexChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _ForceDirectionBox\r\n\t\t\t// \r\n\t\t\tthis._ForceDirectionBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ForceDirectionBox.FormattingEnabled = true;\r\n\t\t\tthis._ForceDirectionBox.Location = new System.Drawing.Point (77, 44);\r\n\t\t\tthis._ForceDirectionBox.Name = \"_ForceDirectionBox\";\r\n\t\t\tthis._ForceDirectionBox.Size = new System.Drawing.Size (127, 20);\r\n\t\t\tthis._ForceDirectionBox.TabIndex = 3;\r\n\t\t\tthis._ForceDirectionBox.SelectedIndexChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label7\r\n\t\t\t// \r\n\t\t\tthis.label7.AutoSize = true;\r\n\t\t\tthis.label7.Location = new System.Drawing.Point (6, 47);\r\n\t\t\tthis.label7.Name = \"label7\";\r\n\t\t\tthis.label7.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label7.TabIndex = 2;\r\n\t\t\tthis.label7.Text = \"阅读方向：\";\r\n\t\t\t// \r\n\t\t\t// _ForceInitialViewBox\r\n\t\t\t// \r\n\t\t\tthis._ForceInitialViewBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r\n\t\t\tthis._ForceInitialViewBox.Location = new System.Drawing.Point (77, 18);\r\n\t\t\tthis._ForceInitialViewBox.Name = \"_ForceInitialViewBox\";\r\n\t\t\tthis._ForceInitialViewBox.Size = new System.Drawing.Size (127, 20);\r\n\t\t\tthis._ForceInitialViewBox.TabIndex = 1;\r\n\t\t\tthis._ForceInitialViewBox.SelectedIndexChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// label3\r\n\t\t\t// \r\n\t\t\tthis.label3.AutoSize = true;\r\n\t\t\tthis.label3.Location = new System.Drawing.Point (6, 21);\r\n\t\t\tthis.label3.Name = \"label3\";\r\n\t\t\tthis.label3.Size = new System.Drawing.Size (65, 12);\r\n\t\t\tthis.label3.TabIndex = 0;\r\n\t\t\tthis.label3.Text = \"初始视图：\";\r\n\t\t\t// \r\n\t\t\t// label5\r\n\t\t\t// \r\n\t\t\tthis.label5.AutoSize = true;\r\n\t\t\tthis.label5.Location = new System.Drawing.Point (6, 8);\r\n\t\t\tthis.label5.Name = \"label5\";\r\n\t\t\tthis.label5.Size = new System.Drawing.Size (221, 12);\r\n\t\t\tthis.label5.TabIndex = 0;\r\n\t\t\tthis.label5.Text = \"说明：以下设定优先于信息文件的内容。\";\r\n\t\t\t// \r\n\t\t\t// _HideMenuBox\r\n\t\t\t// \r\n\t\t\tthis._HideMenuBox.AutoSize = true;\r\n\t\t\tthis._HideMenuBox.Location = new System.Drawing.Point (3, 3);\r\n\t\t\tthis._HideMenuBox.Name = \"_HideMenuBox\";\r\n\t\t\tthis._HideMenuBox.Size = new System.Drawing.Size (72, 16);\r\n\t\t\tthis._HideMenuBox.TabIndex = 0;\r\n\t\t\tthis._HideMenuBox.Text = \"隐藏菜单\";\r\n\t\t\tthis._HideMenuBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._HideMenuBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _HideToolbarBox\r\n\t\t\t// \r\n\t\t\tthis._HideToolbarBox.AutoSize = true;\r\n\t\t\tthis._HideToolbarBox.Location = new System.Drawing.Point (99, 3);\r\n\t\t\tthis._HideToolbarBox.Name = \"_HideToolbarBox\";\r\n\t\t\tthis._HideToolbarBox.Size = new System.Drawing.Size (84, 16);\r\n\t\t\tthis._HideToolbarBox.TabIndex = 1;\r\n\t\t\tthis._HideToolbarBox.Text = \"隐藏工具栏\";\r\n\t\t\tthis._HideToolbarBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._HideToolbarBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _HideUIBox\r\n\t\t\t// \r\n\t\t\tthis._HideUIBox.AutoSize = true;\r\n\t\t\tthis._HideUIBox.Location = new System.Drawing.Point (3, 25);\r\n\t\t\tthis._HideUIBox.Name = \"_HideUIBox\";\r\n\t\t\tthis._HideUIBox.Size = new System.Drawing.Size (192, 16);\r\n\t\t\tthis._HideUIBox.TabIndex = 2;\r\n\t\t\tthis._HideUIBox.Text = \"隐藏操作界面，仅显示文档内容\";\r\n\t\t\tthis._HideUIBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._HideUIBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _FitWindowBox\r\n\t\t\t// \r\n\t\t\tthis._FitWindowBox.AutoSize = true;\r\n\t\t\tthis._FitWindowBox.Location = new System.Drawing.Point (3, 47);\r\n\t\t\tthis._FitWindowBox.Name = \"_FitWindowBox\";\r\n\t\t\tthis._FitWindowBox.Size = new System.Drawing.Size (120, 16);\r\n\t\t\tthis._FitWindowBox.TabIndex = 3;\r\n\t\t\tthis._FitWindowBox.Text = \"窗口适应文档首页\";\r\n\t\t\tthis._FitWindowBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._FitWindowBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _CenterWindowBox\r\n\t\t\t// \r\n\t\t\tthis._CenterWindowBox.AutoSize = true;\r\n\t\t\tthis._CenterWindowBox.Location = new System.Drawing.Point (3, 68);\r\n\t\t\tthis._CenterWindowBox.Name = \"_CenterWindowBox\";\r\n\t\t\tthis._CenterWindowBox.Size = new System.Drawing.Size (72, 16);\r\n\t\t\tthis._CenterWindowBox.TabIndex = 4;\r\n\t\t\tthis._CenterWindowBox.Text = \"窗口居中\";\r\n\t\t\tthis._CenterWindowBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._CenterWindowBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _DisplayDocTitleBox\r\n\t\t\t// \r\n\t\t\tthis._DisplayDocTitleBox.AutoSize = true;\r\n\t\t\tthis._DisplayDocTitleBox.Location = new System.Drawing.Point (99, 68);\r\n\t\t\tthis._DisplayDocTitleBox.Name = \"_DisplayDocTitleBox\";\r\n\t\t\tthis._DisplayDocTitleBox.Size = new System.Drawing.Size (96, 16);\r\n\t\t\tthis._DisplayDocTitleBox.TabIndex = 5;\r\n\t\t\tthis._DisplayDocTitleBox.Text = \"显示文档标题\";\r\n\t\t\tthis._DisplayDocTitleBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._DisplayDocTitleBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// _UISettingsPanel\r\n\t\t\t// \r\n\t\t\tthis._UISettingsPanel.Controls.Add (this._DisplayDocTitleBox);\r\n\t\t\tthis._UISettingsPanel.Controls.Add (this._HideMenuBox);\r\n\t\t\tthis._UISettingsPanel.Controls.Add (this._CenterWindowBox);\r\n\t\t\tthis._UISettingsPanel.Controls.Add (this._HideToolbarBox);\r\n\t\t\tthis._UISettingsPanel.Controls.Add (this._FitWindowBox);\r\n\t\t\tthis._UISettingsPanel.Controls.Add (this._HideUIBox);\r\n\t\t\tthis._UISettingsPanel.Enabled = false;\r\n\t\t\tthis._UISettingsPanel.Location = new System.Drawing.Point (2, 42);\r\n\t\t\tthis._UISettingsPanel.Name = \"_UISettingsPanel\";\r\n\t\t\tthis._UISettingsPanel.Size = new System.Drawing.Size (208, 87);\r\n\t\t\tthis._UISettingsPanel.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _OverrideUISettingsBox\r\n\t\t\t// \r\n\t\t\tthis._OverrideUISettingsBox.AutoSize = true;\r\n\t\t\tthis._OverrideUISettingsBox.Location = new System.Drawing.Point (5, 20);\r\n\t\t\tthis._OverrideUISettingsBox.Name = \"_OverrideUISettingsBox\";\r\n\t\t\tthis._OverrideUISettingsBox.Size = new System.Drawing.Size (144, 16);\r\n\t\t\tthis._OverrideUISettingsBox.TabIndex = 0;\r\n\t\t\tthis._OverrideUISettingsBox.Text = \"设置阅读器的操作界面\";\r\n\t\t\tthis._OverrideUISettingsBox.UseVisualStyleBackColor = true;\r\n\t\t\tthis._OverrideUISettingsBox.CheckedChanged += new System.EventHandler (this.DocumentInfoChanged);\r\n\t\t\t// \r\n\t\t\t// groupBox4\r\n\t\t\t// \r\n\t\t\tthis.groupBox4.Controls.Add (this._OverrideUISettingsBox);\r\n\t\t\tthis.groupBox4.Controls.Add (this._UISettingsPanel);\r\n\t\t\tthis.groupBox4.Location = new System.Drawing.Point (222, 23);\r\n\t\t\tthis.groupBox4.Name = \"groupBox4\";\r\n\t\t\tthis.groupBox4.Size = new System.Drawing.Size (210, 135);\r\n\t\t\tthis.groupBox4.TabIndex = 3;\r\n\t\t\tthis.groupBox4.TabStop = false;\r\n\t\t\tthis.groupBox4.Text = \"阅读器操作界面设定\";\r\n\t\t\t// \r\n\t\t\t// ViewerPreferenceEditor\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF (6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.Controls.Add (this.groupBox4);\r\n\t\t\tthis.Controls.Add (this.groupBox2);\r\n\t\t\tthis.Controls.Add (this.groupBox1);\r\n\t\t\tthis.Controls.Add (this.label5);\r\n\t\t\tthis.Name = \"ViewerPreferenceEditor\";\r\n\t\t\tthis.Size = new System.Drawing.Size (438, 279);\r\n\t\t\tthis.groupBox2.ResumeLayout (false);\r\n\t\t\tthis.groupBox2.PerformLayout ();\r\n\t\t\tthis.groupBox1.ResumeLayout (false);\r\n\t\t\tthis.groupBox1.PerformLayout ();\r\n\t\t\tthis._UISettingsPanel.ResumeLayout (false);\r\n\t\t\tthis._UISettingsPanel.PerformLayout ();\r\n\t\t\tthis.groupBox4.ResumeLayout (false);\r\n\t\t\tthis.groupBox4.PerformLayout ();\r\n\t\t\tthis.ResumeLayout (false);\r\n\t\t\tthis.PerformLayout ();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox2;\r\n\t\tprivate System.Windows.Forms.ComboBox _ForceBookmarkOpenBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _ForceRemoveZoomRateBox;\r\n\t\tprivate System.Windows.Forms.Label label2;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox1;\r\n\t\tprivate System.Windows.Forms.Label label8;\r\n\t\tprivate System.Windows.Forms.ComboBox _ForceInitialModeBox;\r\n\t\tprivate System.Windows.Forms.ComboBox _ForceDirectionBox;\r\n\t\tprivate System.Windows.Forms.Label label7;\r\n\t\tprivate System.Windows.Forms.ComboBox _ForceInitialViewBox;\r\n\t\tprivate System.Windows.Forms.Label label3;\r\n\t\tprivate System.Windows.Forms.Label label5;\r\n\t\tprivate System.Windows.Forms.CheckBox _HideUIBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _HideToolbarBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _HideMenuBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _FitWindowBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _DisplayDocTitleBox;\r\n\t\tprivate System.Windows.Forms.CheckBox _CenterWindowBox;\r\n\t\tprivate System.Windows.Forms.Panel _UISettingsPanel;\r\n\t\tprivate System.Windows.Forms.CheckBox _OverrideUISettingsBox;\r\n\t\tprivate System.Windows.Forms.GroupBox groupBox4;\r\n\t\tprivate System.Windows.Forms.CheckBox _ForceInternalLinkBox;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ViewerPreferenceEditor.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Functions\r\n{\r\n\tpublic partial class ViewerPreferenceEditor : UserControl\r\n\t{\r\n\t\treadonly string[] __bookmarkStatus = new string[] { \"保持不变\", \"全部关闭\", \"全部打开\", \"打开首层\" };\r\n\t\tbool _settingsLockdown;\r\n\t\tViewerOptions _Options;\r\n\t\tinternal ViewerOptions Options {\r\n\t\t\tget => _Options;\r\n\t\t\tset {\r\n\t\t\t\t_Options = value;\r\n\t\t\t\t_settingsLockdown = true;\r\n\t\t\t\t_ForceRemoveZoomRateBox.Checked = _Options.RemoveZoomRate;\r\n\t\t\t\t_FitWindowBox.Checked = _Options.FitWindow;\r\n\t\t\t\t_DisplayDocTitleBox.Checked = _Options.DisplayDocTitle;\r\n\t\t\t\t_CenterWindowBox.Checked = _Options.CenterWindow;\r\n\t\t\t\t_HideMenuBox.Checked = _Options.HideMenu;\r\n\t\t\t\t_HideToolbarBox.Checked = _Options.HideToolbar;\r\n\t\t\t\t_HideUIBox.Checked = _Options.HideUI;\r\n\t\t\t\t_OverrideUISettingsBox.Checked = _Options.SpecifyViewerPreferences;\r\n\t\t\t\t_ForceInternalLinkBox.Checked = _Options.ForceInternalLink;\r\n\r\n\t\t\t\t_ForceBookmarkOpenBox.SelectedIndex = (int)_Options.CollapseBookmark;\r\n\t\t\t\tvar i = Array.IndexOf(Constants.PageLayoutType.Names, _Options.InitialView);\r\n\t\t\t\t_ForceInitialViewBox.SelectedIndex = i != -1 ? i : 0;\r\n\t\t\t\ti = Array.IndexOf(Constants.ViewerPreferencesType.DirectionType.Names, _Options.Direction);\r\n\t\t\t\t_ForceDirectionBox.SelectedIndex = i != -1 ? i : 0;\r\n\t\t\t\ti = Array.IndexOf(Constants.PageModes.Names, _Options.InitialMode);\r\n\t\t\t\t_ForceInitialModeBox.SelectedIndex = i != -1 ? i : 0;\r\n\t\t\t\t_settingsLockdown = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic ViewerPreferenceEditor() {\r\n\t\t\tInitializeComponent();\r\n\r\n\t\t\t_settingsLockdown = true;\r\n\t\t\t_ForceBookmarkOpenBox.FormattingEnabled\r\n\t\t\t\t= _ForceDirectionBox.FormattingEnabled\r\n\t\t\t\t= _ForceInitialModeBox.FormattingEnabled\r\n\t\t\t\t= _ForceInitialViewBox.FormattingEnabled\r\n\t\t\t\t= false;\r\n\t\t\t_ForceBookmarkOpenBox.AddRange(__bookmarkStatus).Select(0);\r\n\t\t\t_ForceInitialViewBox.AddRange(Constants.PageLayoutType.Names).Select(0);\r\n\t\t\t_ForceDirectionBox.AddRange(Constants.ViewerPreferencesType.DirectionType.Names).Select(0);\r\n\t\t\t_ForceInitialModeBox.AddRange(Constants.PageModes.Names).Select(0);\r\n\t\t\t_settingsLockdown = false;\r\n\t\t}\r\n\r\n\r\n\t\tvoid DocumentInfoChanged(object sender, EventArgs e) {\r\n\t\t\tif (_settingsLockdown) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (sender == _ForceBookmarkOpenBox) {\r\n\t\t\t\tOptions.CollapseBookmark = (BookmarkStatus)_ForceBookmarkOpenBox.SelectedIndex;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ForceDirectionBox) {\r\n\t\t\t\tOptions.Direction = (string)_ForceDirectionBox.SelectedItem;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ForceInitialModeBox) {\r\n\t\t\t\tOptions.InitialMode = (string)_ForceInitialModeBox.SelectedItem;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ForceInitialViewBox) {\r\n\t\t\t\tOptions.InitialView = (string)_ForceInitialViewBox.SelectedItem;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ForceRemoveZoomRateBox) {\r\n\t\t\t\tOptions.RemoveZoomRate = _ForceRemoveZoomRateBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _OverrideUISettingsBox) {\r\n\t\t\t\tOptions.SpecifyViewerPreferences\r\n\t\t\t\t\t= _UISettingsPanel.Enabled\r\n\t\t\t\t\t= _OverrideUISettingsBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _HideMenuBox) {\r\n\t\t\t\tOptions.HideMenu = _HideMenuBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _HideToolbarBox) {\r\n\t\t\t\tOptions.HideToolbar = _HideToolbarBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _HideUIBox) {\r\n\t\t\t\tOptions.HideUI = _HideUIBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _CenterWindowBox) {\r\n\t\t\t\tOptions.CenterWindow = _CenterWindowBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _FitWindowBox) {\r\n\t\t\t\tOptions.FitWindow = _FitWindowBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _DisplayDocTitleBox) {\r\n\t\t\t\tOptions.DisplayDocTitle = _DisplayDocTitleBox.Checked;\r\n\t\t\t}\r\n\t\t\telse if (sender == _ForceInternalLinkBox) {\r\n\t\t\t\tOptions.ForceInternalLink = _ForceInternalLinkBox.Checked;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Functions/ViewerPreferenceEditor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "App/Lib/FreeImageNET.XML",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>FreeImageNET</name>\n    </assembly>\n    <members>\n        <member name=\"T:FreeImageAPI.FreeImageException\">\n            <summary>An exception which is thrown during image manipulation.</summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageException.#ctor\">\n            <summary>Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageException\"/> class with a specified error message.</summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageException.#ctor(System.String)\">\n            <summary>Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageException\"/> class with a specified error message.</summary>\n            <param name=\"message\">The message that describes the error.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageException.#ctor(System.String,System.Exception)\">\n            <summary>Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageException\"/> class with a specified error message and a reference to the inner exception that is the cause of this exception.</summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n            <param name=\"innerException\">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageException\"/> class with serialized data.</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=\"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 <see cref=\"P:System.Exception.HResult\"/> is zero (0).</exception>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.FreeImagePlugin\">\n            <summary>\n            Class representing a FreeImage format.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.#ctor(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"fif\">The FreeImage format to wrap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.FIFormat\">\n            <summary>\n            Gets the format of this instance.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.Enabled\">\n            <summary>\n            Gets or sets whether this plugin is enabled.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.Format\">\n            <summary>\n            Gets a string describing the format.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.ExtentsionList\">\n            <summary>\n            Gets a comma-delimited file extension list describing the bitmap formats\n            this plugin can read and/or write.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.Description\">\n            <summary>\n            Gets a descriptive string that describes the bitmap formats\n            this plugin can read and/or write.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.RegExpr\">\n            <summary>\n            Returns a regular expression string that can be used by\n            a regular expression engine to identify the bitmap.\n            FreeImageQt makes use of this function.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.SupportsReading\">\n            <summary>\n            Gets whether this plugin can load bitmaps.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.SupportsWriting\">\n            <summary>\n            Gets whether this plugin can save bitmaps.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.SupportsExportType(FreeImageAPI.FREE_IMAGE_TYPE)\">\n            <summary>\n            Checks whether this plugin can save a bitmap in the desired data type.\n            </summary>\n            <param name=\"type\">The desired image type.</param>\n            <returns>True if this plugin can save bitmaps as the desired type, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.SupportsExportBPP(System.Int32)\">\n            <summary>\n            Checks whether this plugin can save bitmaps in the desired bit depth.\n            </summary>\n            <param name=\"bpp\">The desired bit depth.</param>\n            <returns>True if this plugin can save bitmaps in the desired bit depth, else false.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.FreeImagePlugin.SupportsICCProfiles\">\n            <summary>\n            Gets whether this plugin can load or save an ICC profile.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.ValidExtension(System.String)\">\n            <summary>\n            Checks whether an extension is valid for this format.\n            </summary>\n            <param name=\"extension\">The desired extension.</param>\n            <returns>True if the extension is valid for this format, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.ValidExtension(System.String,System.StringComparison)\">\n            <summary>\n            Checks whether an extension is valid for this format.\n            </summary>\n            <param name=\"extension\">The desired extension.</param>\n            <param name=\"comparisonType\">The string comparison type.</param>\n            <returns>True if the extension is valid for this format, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.ValidFilename(System.String)\">\n            <summary>\n            Checks whether a filename is valid for this format.\n            </summary>\n            <param name=\"filename\">The desired filename.</param>\n            <returns>True if the filename is valid for this format, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.ValidFilename(System.String,System.StringComparison)\">\n            <summary>\n            Checks whether a filename is valid for this format.\n            </summary>\n            <param name=\"filename\">The desired filename.</param>\n            <param name=\"comparisonType\">The string comparison type.</param>\n            <returns>True if the filename is valid for this format, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.FreeImagePlugin.ToString\">\n            <summary>\n            Gets a descriptive string that describes the bitmap formats\n            this plugin can read and/or write.\n            </summary>\n            <returns>A descriptive string that describes the bitmap formats.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.LocalPlugin\">\n            <summary>\n            Class representing own FreeImage-Plugins.\n            </summary>\n            <remarks>\n            FreeImages itself is plugin based. Each supported format is integrated by a seperat plugin,\n            that handles loading, saving, descriptions, identifing ect.\n            And of course the user can create own plugins and use them in FreeImage.\n            To do that the above mentioned predefined methodes need to be implemented.\n            <para/>\n            The class below handles the creation of such a plugin. The class itself is abstract\n            as well as some core functions that need to be implemented.\n            The class can be used to enable or disable the plugin in FreeImage after regististration or\n            retrieve the formatid, assigned by FreeImage.\n            The class handles the callback functions, garbage collector and pointer operation to make\n            the implementation as user friendly as possible.\n            <para/>\n            How to:\n            There are two functions that need to be implemented:\n            <see cref=\"M:FreeImageAPI.Plugins.LocalPlugin.GetImplementedMethods\"/> and\n            <see cref=\"M:FreeImageAPI.Plugins.LocalPlugin.FormatProc\"/>.\n            <see cref=\"M:FreeImageAPI.Plugins.LocalPlugin.GetImplementedMethods\"/> is used by the constructor\n            of the abstract class. FreeImage wants a list of the implemented functions. Each function is\n            represented by a function pointer (a .NET <see cref=\"T:System.Delegate\"/>). In case a function\n            is not implemented FreeImage receives an empty <b>delegate</b>). To tell the constructor\n            which functions have been implemented the information is represented by a disjunction of\n            <see cref=\"T:FreeImageAPI.Plugins.LocalPlugin.MethodFlags\"/>.\n            <para/>\n            For example:\n            \treturn MethodFlags.LoadProc | MethodFlags.SaveProc;\n            <para/>\n            The above statement means that LoadProc and SaveProc have been implemented by the user.\n            Keep in mind, that each function has a standard implementation that has static return\n            values that may cause errors if listed in\n            <see cref=\"M:FreeImageAPI.Plugins.LocalPlugin.GetImplementedMethods\"/> without a real implementation.\n            <para/>\n            <see cref=\"M:FreeImageAPI.Plugins.LocalPlugin.FormatProc\"/> is used by some checks of FreeImage and\n            must be implemented. <see cref=\"M:FreeImageAPI.Plugins.LocalPlugin.LoadProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.Int32,System.Int32,System.IntPtr)\"/> for example can be\n            implemented if the plugin supports reading, but it doesn't have to, the plugin could only\n            be used to save an already loaded bitmap in a special format.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.plugin\">\n            <summary>\n            Struct containing function pointers.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.initProc\">\n            <summary>\n            Delegate for register callback by FreeImage.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.format\">\n            <summary>\n            The format id assiged to the plugin.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.registered\">\n            <summary>\n            When true the plugin was registered successfully else false.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.implementedMethods\">\n            <summary>\n            A copy of the functions used to register.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.LocalPlugin.MethodFlags\">\n            <summary>\n            MethodFlags defines values to fill a bitfield telling which\n            functions have been implemented by a plugin.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.None\">\n            <summary>\n            No mothods implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.DescriptionProc\">\n            <summary>\n            DescriptionProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.ExtensionListProc\">\n            <summary>\n            ExtensionListProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.RegExprProc\">\n            <summary>\n            RegExprProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.OpenProc\">\n            <summary>\n            OpenProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.CloseProc\">\n            <summary>\n            CloseProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.PageCountProc\">\n            <summary>\n            PageCountProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.PageCapabilityProc\">\n            <summary>\n            PageCapabilityProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.LoadProc\">\n            <summary>\n            LoadProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.SaveProc\">\n            <summary>\n            SaveProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.ValidateProc\">\n            <summary>\n            ValidateProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.MimeProc\">\n            <summary>\n            MimeProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.SupportsExportBPPProc\">\n            <summary>\n            SupportsExportBPPProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.SupportsExportTypeProc\">\n            <summary>\n            SupportsExportTypeProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.LocalPlugin.MethodFlags.SupportsICCProfilesProc\">\n            <summary>\n            SupportsICCProfilesProc has been implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.GetImplementedMethods\">\n            <summary>\n            Function that returns a bitfield containing the\n            implemented methods.\n            </summary>\n            <returns>Bitfield of the implemented methods.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.FormatProc\">\n            <summary>\n            Implementation of <b>FormatProc</b>\n            </summary>\n            <returns>A string containing the plugins format.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.DescriptionProc\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.ExtensionListProc\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.RegExprProc\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.OpenProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.Boolean)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.CloseProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.IntPtr)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.PageCountProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.IntPtr)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.PageCapabilityProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.IntPtr)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.LoadProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.Int32,System.Int32,System.IntPtr)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.SaveProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.FIBITMAP,FreeImageAPI.IO.fi_handle,System.Int32,System.Int32,System.IntPtr)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.ValidateProc(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.MimeProc\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.SupportsExportBPPProc(System.Int32)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.SupportsExportTypeProc(FreeImageAPI.FREE_IMAGE_TYPE)\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.SupportsICCProfilesProc\">\n            <summary>\n            Function that can be implemented.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.#ctor\">\n            <summary>\n            The constructor automatically registeres the plugin in FreeImage.\n            To do this it prepares a FreeImage defined structure with function pointers\n            to the implemented functions or null if not implemented.\n            Before registing the functions they are pinned in memory so the garbage collector\n            can't move them around in memory after we passed there addresses to FreeImage.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.LocalPlugin.Enabled\">\n            <summary>\n            Gets or sets if the plugin is enabled.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.LocalPlugin.Registered\">\n            <summary>\n            Gets if the plugin was registered successfully.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.LocalPlugin.Format\">\n            <summary>\n            Gets the <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> FreeImage assigned to this plugin.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.Read(FreeImageAPI.IO.FreeImageIO,FreeImageAPI.IO.fi_handle,System.UInt32,System.UInt32,System.Byte[]@)\">\n            <summary>\n            Reads from an unmanaged stream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.ReadByte(FreeImageAPI.IO.FreeImageIO,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Reads a single byte from an unmanaged stream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.Write(FreeImageAPI.IO.FreeImageIO,FreeImageAPI.IO.fi_handle,System.UInt32,System.UInt32,System.Byte[]@)\">\n            <summary>\n            Writes to an unmanaged stream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.WriteByte(FreeImageAPI.IO.FreeImageIO,FreeImageAPI.IO.fi_handle,System.Byte)\">\n            <summary>\n            Writes a single byte to an unmanaged stream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.Seek(FreeImageAPI.IO.FreeImageIO,FreeImageAPI.IO.fi_handle,System.Int32,System.IO.SeekOrigin)\">\n            <summary>\n            Seeks in an unmanaged stream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.LocalPlugin.Tell(FreeImageAPI.IO.FreeImageIO,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Retrieves the position of an unmanaged stream.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.PluginRepository\">\n            <summary>\n            Class representing all registered <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/> in FreeImage.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.RegisterLocalPlugin(FreeImageAPI.Plugins.LocalPlugin)\">\n            <summary>\n            Adds local plugin to this class.\n            </summary>\n            <param name=\"localPlugin\">The registered plugin.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.Plugin(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>, representing the given format.\n            </summary>\n            <param name=\"fif\">The representing format.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.Plugin(System.Int32)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>,\n            representing the format at the given index.\n            </summary>\n            <param name=\"index\">The index of the representing format.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.Plugin(System.String)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.\n            <typeparamref name=\"expression\"/> is searched in:\n            <c>Format</c>, <c>RegExpr</c>,\n            <c>ValidExtension</c> and <c>ValidFilename</c>.\n            </summary>\n            <param name=\"expression\">The expression to search for.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.PluginFromFormat(System.String)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/> for the given format.\n            </summary>\n            <param name=\"format\">The format of the Plugin.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.PluginFromFilename(System.String)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/> for the given filename.\n            </summary>\n            <param name=\"filename\">The valid filename for the plugin.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Plugins.PluginRepository.PluginFromMime(System.String)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/> for the given mime.\n            </summary>\n            <param name=\"mime\">The valid mime for the plugin.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Plugins.FreeImagePlugin\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.FIFCount\">\n            <summary>\n            Gets the number of registered plugins.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PluginList\">\n            <summary>\n            Gets a readonly collection of all plugins.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.ReadOnlyPlugins\">\n            <summary>\n            Gets a list of plugins that are only able to\n            read but not to write.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.WriteOnlyPlugins\">\n            <summary>\n            Gets a list of plugins that are only able to\n            write but not to read.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.StupidPlugins\">\n            <summary>\n            Gets a list of plugins that are not able to\n            read or write.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.ReadablePlugins\">\n            <summary>\n            Gets a list of plugins that are able to read.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.WriteablePlugins\">\n            <summary>\n            Gets a list of plugins that are able to write.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.LocalPlugins\">\n            <summary>\n            Gets a list of local plugins.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.BuiltInPlugins\">\n            <summary>\n            Gets a list of built-in plugins.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.BMP\">\n            <summary>\n            Windows or OS/2 Bitmap File (*.BMP)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.ICO\">\n            <summary>\n            Independent JPEG Group (*.JPG, *.JIF, *.JPEG, *.JPE)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.JPEG\">\n            <summary>\n            Independent JPEG Group (*.JPG, *.JIF, *.JPEG, *.JPE)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.JNG\">\n            <summary>\n            JPEG Network Graphics (*.JNG)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.KOALA\">\n            <summary>\n            Commodore 64 Koala format (*.KOA)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.LBM\">\n            <summary>\n            Amiga IFF (*.IFF, *.LBM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.IFF\">\n            <summary>\n            Amiga IFF (*.IFF, *.LBM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.MNG\">\n            <summary>\n            Multiple Network Graphics (*.MNG)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PBM\">\n            <summary>\n            Portable Bitmap (ASCII) (*.PBM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PBMRAW\">\n            <summary>\n            Portable Bitmap (BINARY) (*.PBM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PCD\">\n            <summary>\n            Kodak PhotoCD (*.PCD)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PCX\">\n            <summary>\n            Zsoft Paintbrush PCX bitmap format (*.PCX)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PGM\">\n            <summary>\n            Portable Graymap (ASCII) (*.PGM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PGMRAW\">\n            <summary>\n            Portable Graymap (BINARY) (*.PGM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PNG\">\n            <summary>\n            Portable Network Graphics (*.PNG)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PPM\">\n            <summary>\n            Portable Pixelmap (ASCII) (*.PPM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PPMRAW\">\n            <summary>\n            Portable Pixelmap (BINARY) (*.PPM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.RAS\">\n            <summary>\n            Sun Rasterfile (*.RAS)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.TARGA\">\n            <summary>\n            truevision Targa files (*.TGA, *.TARGA)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.TIFF\">\n            <summary>\n            Tagged Image File Format (*.TIF, *.TIFF)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.WBMP\">\n            <summary>\n            Wireless Bitmap (*.WBMP)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PSD\">\n            <summary>\n            Adobe Photoshop (*.PSD)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.CUT\">\n            <summary>\n            Dr. Halo (*.CUT)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.XBM\">\n            <summary>\n            X11 Bitmap Format (*.XBM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.XPM\">\n            <summary>\n            X11 Pixmap Format (*.XPM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.DDS\">\n            <summary>\n            DirectDraw Surface (*.DDS)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.GIF\">\n            <summary>\n            Graphics Interchange Format (*.GIF)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.HDR\">\n            <summary>\n            High Dynamic Range (*.HDR)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.FAXG3\">\n            <summary>\n            Raw Fax format CCITT G3 (*.G3)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.SGI\">\n            <summary>\n            Silicon Graphics SGI image format (*.SGI)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.EXR\">\n            <summary>\n            OpenEXR format (*.EXR)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.J2K\">\n            <summary>\n            JPEG-2000 format (*.J2K, *.J2C)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.JP2\">\n            <summary>\n            JPEG-2000 format (*.JP2)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PFM\">\n            <summary>\n            Portable FloatMap (*.PFM)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.PICT\">\n            <summary>\n            Macintosh PICT (*.PICT)\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Plugins.PluginRepository.RAW\">\n            <summary>\n            RAW camera image (*.*)\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.FormatProc\">\n            <summary>\n            Delegate to a function that returns a string which describes\n            the plugins format.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.DescriptionProc\">\n            <summary>\n            Delegate to a function that returns a string which contains\n            a more detailed description.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.ExtensionListProc\">\n            <summary>\n            Delegate to a function that returns a comma seperated list\n            of file extensions the plugin can read or write.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.RegExprProc\">\n            <summary>\n            Delegate to a function that returns a regular expression that\n            can be used to idientify whether a file can be handled by the plugin.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.OpenProc\">\n            <summary>\n            Delegate to a function that opens a file.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.CloseProc\">\n            <summary>\n            Delegate to a function that closes a previosly opened file.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.PageCountProc\">\n            <summary>\n            Delegate to a function that returns the number of pages of a multipage\n            bitmap if the plugin is capable of handling multipage bitmaps.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.PageCapabilityProc\">\n            <summary>\n            UNKNOWN\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.LoadProc\">\n            <summary>\n            Delegate to a function that loads and decodes a bitmap into memory.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.SaveProc\">\n            <summary>\n             Delegate to a function that saves a bitmap.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.ValidateProc\">\n            <summary>\n            Delegate to a function that determines whether the source defined\n            by <param name=\"io\"/> and <param name=\"handle\"/> is a valid image.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.MimeProc\">\n            <summary>\n            Delegate to a function that returns a string which contains\n            the plugin's mime type.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.SupportsExportBPPProc\">\n            <summary>\n            Delegate to a function that returns whether the plugin can handle the\n            specified color depth.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.SupportsExportTypeProc\">\n            <summary>\n            Delegate to a function that returns whether the plugin can handle the\n            specified image type.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.SupportsICCProfilesProc\">\n            <summary>\n            Delegate to a function that returns whether the plugin can handle\n            ICC-Profiles.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.InitProc\">\n            <summary>\n            Callback function used by FreeImage to register plugins.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Plugins.Plugin\">\n            <summary>\n            The structure contains functionpointers that make up a FreeImage plugin.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.formatProc\">\n            <summary>\n            Delegate to a function that returns a string which describes\n            the plugins format.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.descriptionProc\">\n            <summary>\n            Delegate to a function that returns a string which contains\n            a more detailed description.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.extensionListProc\">\n            <summary>\n            Delegate to a function that returns a comma seperated list\n            of file extensions the plugin can read or write.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.regExprProc\">\n            <summary>\n            Delegate to a function that returns a regular expression that\n            can be used to idientify whether a file can be handled by the plugin.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.openProc\">\n            <summary>\n            Delegate to a function that opens a file.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.closeProc\">\n            <summary>\n            Delegate to a function that closes a previosly opened file.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.pageCountProc\">\n            <summary>\n            Delegate to a function that returns the number of pages of a multipage\n            bitmap if the plugin is capable of handling multipage bitmaps.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.pageCapabilityProc\">\n            <summary>\n            UNKNOWN\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.loadProc\">\n            <summary>\n            Delegate to a function that loads and decodes a bitmap into memory.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.saveProc\">\n            <summary>\n             Delegate to a function that saves a bitmap.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.validateProc\">\n            <summary>\n            Delegate to a function that determines whether the source is a valid image.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.mimeProc\">\n            <summary>\n            Delegate to a function that returns a string which contains\n            the plugin's mime type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.supportsExportBPPProc\">\n            <summary>\n            Delegate to a function that returns whether the plugin can handle the\n            specified color depth.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.supportsExportTypeProc\">\n            <summary>\n            Delegate to a function that returns whether the plugin can handle the\n            specified image type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Plugins.Plugin.supportsICCProfilesProc\">\n            <summary>\n            Delegate to a function that returns whether the plugin can handle\n            ICC-Profiles.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FreeImageBitmap\">\n            <summary>\n            Encapsulates a FreeImage-bitmap.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.disposed\">\n            <summary>\n            Indicates whether this instance is disposed.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.tag\">\n            <summary>\n            Tab object.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.lockObject\">\n            <summary>\n            Object used to syncronize lock methods.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.saveInformation\">\n            <summary>\n            Holds information used by SaveAdd() methods.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.stream\">\n            <summary>\n            The stream that this instance was loaded from or\n            null if it has been cloned or deserialized.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.disposeStream\">\n            <summary>\n            True if the stream must be disposed with this\n            instance.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.frameCount\">\n            <summary>\n            The number of frames contained by a mutlipage bitmap.\n            Default value is 1 and only changed if needed.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.frameIndex\">\n            <summary>\n            The index of the loaded frame.\n            Default value is 0 and only changed if needed.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.originalFormat\">\n            <summary>\n            Format of the sourceimage.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImageBitmap.dib\">\n            <summary>\n            Handle to the encapsulated FreeImage-bitmap.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class.\n            For internal use only.\n            </summary>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(FreeImageAPI.FreeImageBitmap,System.Drawing.Size)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image with the specified size.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <param name=\"newSize\">The Size structure that represent the\n            size of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"newSize.Width.Width\"/> or <paramref name=\"newSize.Height.Height\"/> are less or equal zero.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(FreeImageAPI.FreeImageBitmap,System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image with the specified size.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <param name=\"width\">Width of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">Height of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Drawing.Image)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Drawing.Image,System.Drawing.Size)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image with the specified size.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <param name=\"newSize\">The Size structure that represent the\n            size of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"newSize.Width.Width\"/> or <paramref name=\"newSize.Height.Height\"/> are less or equal zero.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Drawing.Image,System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image with the specified size.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Drawing.Bitmap)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Drawing.Bitmap,System.Drawing.Size)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image with the specified size.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <param name=\"newSize\">The Size structure that represent the\n            size of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"newSize.Width.Width\"/> or <paramref name=\"newSize.Height.Height\"/> are less or equal zero.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Drawing.Bitmap,System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified image with the specified size.\n            </summary>\n            <param name=\"original\">The original to clone from.</param>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"original\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.IO.Stream,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified stream.\n            </summary>\n            <param name=\"stream\">Stream to read from.</param>\n            <param name=\"useIcm\">Ignored.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <remarks>\n            You must keep the stream open for the lifetime of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.IO.Stream)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified stream.\n            </summary>\n            <param name=\"stream\">Stream to read from.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <remarks>\n            You must keep the stream open for the lifetime of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified stream in the specified format.\n            </summary>\n            <param name=\"stream\">Stream to read from.</param>\n            <param name=\"format\">Format of the image.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <remarks>\n            You must keep the stream open for the lifetime of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.IO.Stream,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified stream with the specified loading flags.\n            </summary>\n            <param name=\"stream\">Stream to read from.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <remarks>\n            You must keep the stream open for the lifetime of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified stream in the specified format\n            with the specified loading flags.\n            </summary>\n            <param name=\"stream\">Stream to read from.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <remarks>\n            You must keep the stream open for the lifetime of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified file.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified file.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"useIcm\">Ignored.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.String,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified file\n            with the specified loading flags.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.String,FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified file\n            in the specified format.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"format\">Format of the image.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.String,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified file\n            in the specified format with the specified loading flags.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class\n            bases on the specified size.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Type,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified resource.\n            </summary>\n            <param name=\"type\">The class used to extract the resource.</param>\n            <param name=\"resource\">The name of the resource.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,System.Drawing.Graphics)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size\n            and with the resolution of the specified <see cref=\"T:System.Drawing.Graphics\"/> object.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"g\">The Graphics object that specifies the resolution for the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"g\"/> is a null reference.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,System.Drawing.Imaging.PixelFormat)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size and format.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"format\">The PixelFormat enumeration for the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"format\"/> is invalid.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,FreeImageAPI.FREE_IMAGE_TYPE)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size and type.\n            Only non standard bitmaps are supported.\n            </summary>\t\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"type\">The type of the bitmap.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"type\"/> is FIT_BITMAP or FIT_UNKNOWN.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"type\"/> is invalid.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,System.Int32,System.Drawing.Imaging.PixelFormat,System.IntPtr)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size,\n            pixel format and pixel data.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"stride\">Integer that specifies the byte offset between the beginning\n            of one scan line and the next. This is usually (but not necessarily)\n            the number of bytes in the pixel format (for example, 2 for 16 bits per pixel)\n            multiplied by the width of the bitmap. The value passed to this parameter must\n            be a multiple of four..</param>\n            <param name=\"format\">The PixelFormat enumeration for the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"scan0\">Pointer to an array of bytes that contains the pixel data.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"format\"/> is invalid.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,System.Int32,System.Drawing.Imaging.PixelFormat,System.Byte[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size,\n            pixel format and pixel data.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"stride\">Integer that specifies the byte offset between the beginning\n            of one scan line and the next. This is usually (but not necessarily)\n            the number of bytes in the pixel format (for example, 2 for 16 bits per pixel)\n            multiplied by the width of the bitmap. The value passed to this parameter must\n            be a multiple of four..</param>\n            <param name=\"format\">The PixelFormat enumeration for the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"bits\">Array of bytes containing the bitmap data.</param>\n            <remarks>\n            Although this constructor supports creating images in both formats\n            <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format32bppPArgb\"/>\n            and <see cref=\"F:System.Drawing.Imaging.PixelFormat.Format64bppPArgb\"/>, bitmaps\n            created in these formats are treated like any normal 32-bit RGBA and 64-bit RGBA\n            images respectively. Currently, there is no  support for automatic premultiplying images in\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </remarks>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"format\"/> is invalid.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"bits\"/> is null</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,FreeImageAPI.FREE_IMAGE_TYPE,System.IntPtr)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size,\n            pixel format and pixel data.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"stride\">Integer that specifies the byte offset between the beginning\n            of one scan line and the next. This is usually (but not necessarily)\n            the number of bytes in the pixel format (for example, 2 for 16 bits per pixel)\n            multiplied by the width of the bitmap. The value passed to this parameter must\n            be a multiple of four..</param>\n            <param name=\"bpp\">The color depth of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/></param>\n            <param name=\"type\">The type for the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"scan0\">Pointer to an array of bytes that contains the pixel data.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"bpp\"/> or <paramref name=\"type\"/> is invalid.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,FreeImageAPI.FREE_IMAGE_TYPE,System.Byte[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class bases on the specified size,\n            pixel format and pixel data.\n            </summary>\n            <param name=\"width\">The width, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">The height, in pixels, of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"stride\">Integer that specifies the byte offset between the beginning\n            of one scan line and the next. This is usually (but not necessarily)\n            the number of bytes in the pixel format (for example, 2 for 16 bits per pixel)\n            multiplied by the width of the bitmap. The value passed to this parameter must\n            be a multiple of four..</param>\n            <param name=\"bpp\">The color depth of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/></param>\n            <param name=\"type\">The type for the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"bits\">Array of bytes containing the bitmap data.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"bpp\"/> or <paramref name=\"type\"/> is invalid.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"width\"/> or <paramref name=\"height\"/> are less or equal zero.</exception>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"bits\"/> is null</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> class.\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=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The operation failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Finalize\">\n            <summary>\n            Frees all managed and unmanaged ressources.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.op_Explicit(FreeImageAPI.FreeImageBitmap)~System.Drawing.Bitmap\">\n            <summary>\n            Converts a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> instance to a <see cref=\"T:System.Drawing.Bitmap\"/> instance.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> instance.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Bitmap\"/> initialized to <paramref name=\"value\"/>.</returns>\n            <remarks>\n            The explicit conversion from <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> into Bitmap\n            allows to create an instance on the fly and use it as if\n            was a Bitmap. This way it can be directly used with a\n            PixtureBox for example without having to call any\n            conversion operations.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.op_Explicit(System.Drawing.Bitmap)~FreeImageAPI.FreeImageBitmap\">\n            <summary>\n            Converts a <see cref=\"T:System.Drawing.Bitmap\"/> instance to a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> instance.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Bitmap\"/> instance.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> initialized to <paramref name=\"value\"/>.</returns>\n            <remarks>\n            The explicit conversion from <see cref=\"T:System.Drawing.Bitmap\"/> into <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>\n            allows to create an instance on the fly to perform\n            image processing operations and converting it back.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.op_Equality(FreeImageAPI.FreeImageBitmap,FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            Determines whether two specified <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> objects have the same value.\n            </summary>\n            <param name=\"left\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <param name=\"right\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <returns>\n            <b>true</b> if the value of left is the same as the value of right; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.op_Inequality(FreeImageAPI.FreeImageBitmap,FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            Determines whether two specified <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> objects have different values.\n            </summary>\n            <param name=\"left\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <param name=\"right\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <returns>\n            true if the value of left is different from the value of right; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.ImageType\">\n            <summary>\n            Type of the bitmap.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.ColorsUsed\">\n            <summary>\n            Number of palette entries.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.UniqueColors\">\n            <summary>\n            The number of unique colors actually used by the bitmap. This might be different from\n            what ColorsUsed returns, which actually returns the palette size for palletised images.\n            Works for FIT_BITMAP type bitmaps only.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.ColorDepth\">\n            <summary>\n            The size of one pixel in the bitmap in bits.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Width\">\n            <summary>\n            Width of the bitmap in pixel units.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Height\">\n            <summary>\n            Height of the bitmap in pixel units.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Pitch\">\n            <summary>\n            Returns the width of the bitmap in bytes, rounded to the next 32-bit boundary.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.DataSize\">\n            <summary>\n            Size of the bitmap in memory.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Palette\">\n            <summary>\n            Returns a structure that represents the palette of a FreeImage bitmap.\n            </summary>\n            <exception cref=\"T:System.InvalidOperationException\"><see cref=\"P:FreeImageAPI.FreeImageBitmap.HasPalette\"/> is false.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.IsRGB555\">\n            <summary>\n            Gets whether the bitmap is RGB 555.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.IsRGB565\">\n            <summary>\n            Gets whether the bitmap is RGB 565.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.HorizontalResolution\">\n            <summary>\n            Gets the horizontal resolution, in pixels per inch, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.VerticalResolution\">\n            <summary>\n            Gets the vertical resolution, in pixels per inch, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.InfoHeader\">\n            <summary>\n            Returns the <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Info\">\n            <summary>\n            Returns the <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure of a this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.ColorType\">\n            <summary>\n            Investigates the color type of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>\n            by reading the bitmaps pixel bits and analysing them.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.RedMask\">\n            <summary>\n            Bit pattern describing the red color component of a pixel in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.GreenMask\">\n            <summary>\n            Bit pattern describing the green color component of a pixel in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.BlueMask\">\n            <summary>\n            Bit pattern describing the blue color component of a pixel in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.TransparencyCount\">\n            <summary>\n            Number of transparent colors in a palletised <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.TransparencyTable\">\n            <summary>\n            Get or sets transparency table of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.IsTransparent\">\n            <summary>\n            Gets or sets whether this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> is transparent.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.HasBackgroundColor\">\n            <summary>\n            Gets whether this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> has a file background color.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.BackgroundColor\">\n            <summary>\n            Gets or sets the background color of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            In case the value is null, the background color is removed.\n            </summary>\n            <exception cref=\"T:System.InvalidOperationException\">Get: There is no background color available.</exception>\n            <exception cref=\"T:System.Exception\">Set: Setting background color failed.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Bits\">\n            <summary>\n            Pointer to the data-bits of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Line\">\n            <summary>\n            Width, in bytes, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Scan0\">\n            <summary>\n            Pointer to the scanline of the top most pixel row of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Stride\">\n            <summary>\n            Width, in bytes, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            In case this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> is top down <b>Stride</b> will be positive, else negative.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Flags\">\n            <summary>\n            Gets attribute flags for the pixel data of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.PhysicalDimension\">\n            <summary>\n            Gets the width and height of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.PixelFormat\">\n            <summary>\n            Gets the pixel format for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.PropertyIdList\">\n            <summary>\n            Gets IDs of the property items stored in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.PropertyItems\">\n            <summary>\n            Gets all the property items (pieces of metadata) stored in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.RawFormat\">\n            <summary>\n            Gets the format of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Size\">\n            <summary>\n            Gets the width and height, in pixels, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Tag\">\n            <summary>\n            Gets or sets an object that provides additional data about the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.IsDisposed\">\n            <summary>\n            Gets whether this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> has been disposed.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Metadata\">\n            <summary>\n            Gets a new instance of a metadata representing class.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Comment\">\n            <summary>\n            Gets or sets the comment of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            Supported formats are JPEG, PNG and GIF.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.HasPalette\">\n            <summary>\n            Returns whether this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> has a palette.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.TransparentIndex\">\n            <summary>\n            Gets or sets the entry used as transparent color in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            Only works for 1-, 4- and 8-bpp.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.FrameCount\">\n            <summary>\n            Gets the number of frames in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.ICCProfile\">\n            <summary>\n            Gets the ICCProfile structure of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.ImageFormat\">\n            <summary>\n            Gets the format of the original image in case\n            this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> was loaded from a file or stream.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageBitmap.Dib\">\n            <summary>\n            Gets the encapsulated FIBITMAP.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetBounds(System.Drawing.GraphicsUnit@)\">\n            <summary>\n            Gets the bounds of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> in the specified unit.\n            </summary>\n            <param name=\"pageUnit\">One of the <see cref=\"T:System.Drawing.GraphicsUnit\"/> values indicating\n            the unit of measure for the bounding rectangle.</param>\n            <returns>The <see cref=\"T:System.Drawing.RectangleF\"/> that represents the bounds of this\n            <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>, in the specified unit.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetPropertyItem(System.Int32)\">\n            <summary>\n            Gets the specified property item from this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"propid\">The ID of the property item to get.</param>\n            <returns>The <see cref=\"T:System.Drawing.Imaging.PropertyItem\"/> this method gets.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetThumbnailImage(System.Int32,System.Int32,System.Drawing.Image.GetThumbnailImageAbort,System.IntPtr)\">\n            <summary>\n            Returns a thumbnail for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"thumbWidth\">The width, in pixels, of the requested thumbnail image.</param>\n            <param name=\"thumbHeight\">The height, in pixels, of the requested thumbnail image.</param>\n            <param name=\"callback\">Ignored.</param>\n            <param name=\"callBackData\">Ignored.</param>\n            <returns>A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that represents the thumbnail.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetThumbnailImage(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a thumbnail for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>, keeping aspect ratio.\n            <paramref name=\"maxPixelSize\"/> defines the maximum width or height\n            of the thumbnail.\n            </summary>\n            <param name=\"maxPixelSize\">Thumbnail square size.</param>\n            <param name=\"convert\">When true HDR images are transperantly\n            converted to standard images.</param>\n            <returns>The thumbnail in a new instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.ToBitmap\">\n            <summary>\n            Converts this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> instance to a <see cref=\"T:System.Drawing.Bitmap\"/> instance.\n            </summary>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Bitmap\"/> initialized this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetScanline``1(System.Int32)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Scanline`1\"/>, representing the scanline\n            specified by <paramref name=\"scanline\"/> of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            Since FreeImage bitmaps are always bottum up aligned, keep in mind that scanline 0 is the\n            bottom-most line of the image.\n            </summary>\n            <param name=\"scanline\">Number of the scanline to retrieve.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Scanline`1\"/> representing the\n            <paramref name=\"scanline\"/>th scanline.</returns>\n            <remarks>\n            List of return-types of <b>T</b>:<para/>\n            <list type=\"table\">\n            <listheader><term>Color Depth / Type</term><description><see cref=\"T:System.Type\">Result Type</see></description></listheader>\n            <item><term>1 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI1BIT\"/></description></item>\n            <item><term>4 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI4BIT\"/></description></item>\n            <item><term>8 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:System.Byte\"/></description></item>\n            <item><term>16 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:System.UInt16\"/></description></item>\n            <item><term>16 - 555 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI16RGB555\"/></description></item>\n            <item><term>16 - 565 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI16RGB565\"/></description></item>\n            <item><term>24 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.RGBTRIPLE\"/></description></item>\n            <item><term>32 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.RGBQUAD\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_COMPLEX\"/></term><description><see cref=\"T:FreeImageAPI.FICOMPLEX\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_DOUBLE\"/></term><description><see cref=\"T:System.Double\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_FLOAT\"/></term><description><see cref=\"T:System.Single\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT16\"/></term><description><see cref=\"T:System.Int16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT32\"/></term><description><see cref=\"T:System.Int32\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGB16\"/></term><description><see cref=\"T:FreeImageAPI.FIRGB16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBA16\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBA16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBAF\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBAF\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBF\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBF\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT16\"/></term><description><see cref=\"T:System.UInt16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT32\"/></term><description><see cref=\"T:System.UInt32\"/></description></item>\n            </list>\n            </remarks>\n            <example>\n            <code>\n            FreeImageBitmap bitmap = new FreeImageBitmap(@\"C:\\Pictures\\picture.bmp\");\n            if (bitmap.ColorDepth == 32)\n            {\n            \tScanline&lt;RGBQUAD&gt; scanline = bitmap.GetScanline&lt;RGBQUAD&gt;(0);\n            \tforeach (RGBQUAD pixel in scanline)\n            \t{\n            \t\tConsole.WriteLine(pixel);\n            \t}\n            }\n            </code>\n            </example>\n            <exception cref=\"T:System.ArgumentException\">\n            The bitmap's type or color depth are not supported.\n            </exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"scanline\"/> is no valid value.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetScanline(System.Int32)\">\n            <summary>\n            Returns an instance of <see cref=\"T:FreeImageAPI.Scanline`1\"/>, representing the scanline\n            specified by <paramref name=\"scanline\"/> of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            Since FreeImage bitmaps are always bottum up aligned, keep in mind that scanline 0 is the\n            bottom-most line of the image.\n            </summary>\n            <param name=\"scanline\">Number of the scanline to retrieve.</param>\n            <returns>An instance of <see cref=\"T:FreeImageAPI.Scanline`1\"/> representing the\n            <paramref name=\"scanline\"/>th scanline.</returns>\n            <remarks>\n            List of return-types of <b>T</b>:<para/>\n            <list type=\"table\">\n            <listheader><term>Color Depth / Type</term><description><see cref=\"T:System.Type\">Result Type</see></description></listheader>\n            <item><term>1 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI1BIT\"/></description></item>\n            <item><term>4 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI4BIT\"/></description></item>\n            <item><term>8 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:System.Byte\"/></description></item>\n            <item><term>16 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:System.UInt16\"/></description></item>\n            <item><term>16 - 555 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI16RGB555\"/></description></item>\n            <item><term>16 - 565 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI16RGB565\"/></description></item>\n            <item><term>24 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.RGBTRIPLE\"/></description></item>\n            <item><term>32 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.RGBQUAD\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_COMPLEX\"/></term><description><see cref=\"T:FreeImageAPI.FICOMPLEX\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_DOUBLE\"/></term><description><see cref=\"T:System.Double\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_FLOAT\"/></term><description><see cref=\"T:System.Single\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT16\"/></term><description><see cref=\"T:System.Int16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT32\"/></term><description><see cref=\"T:System.Int32\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGB16\"/></term><description><see cref=\"T:FreeImageAPI.FIRGB16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBA16\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBA16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBAF\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBAF\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBF\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBF\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT16\"/></term><description><see cref=\"T:System.UInt16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT32\"/></term><description><see cref=\"T:System.UInt32\"/></description></item>\n            </list>\n            </remarks>\n            <example>\n            <code>\n            FreeImageBitmap bitmap = new FreeImageBitmap(@\"C:\\Pictures\\picture.bmp\");\n            if (bitmap.ColorDepth == 32)\n            {\n            \tScanline&lt;RGBQUAD&gt; scanline = (Scanline&lt;RGBQUAD&gt;)bitmap.GetScanline(0);\n            \tforeach (RGBQUAD pixel in scanline)\n            \t{\n            \t\tConsole.WriteLine(pixel);\n            \t}\n            }\n            </code>\n            </example>\n            <exception cref=\"T:System.ArgumentException\">\n            The type of the bitmap or color depth are not supported.\n            </exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"scanline\"/> is no valid value.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetScanlinePointer(System.Int32)\">\n            <summary>\n            Returns a pointer to the specified scanline.\n            Due to FreeImage bitmaps are bottum up,\n            scanline 0 is the most bottom line of the image.\n            </summary>\n            <param name=\"scanline\">Number of the scanline.</param>\n            <returns>Pointer to the scanline.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetScanlines\">\n            <summary>\n            Returns a list of structures, representing the scanlines of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            Due to FreeImage bitmaps are bottum up, scanline 0 is the\n            bottom-most line of the image.\n            Each color depth has a different representing structure due to different memory layouts.\n            </summary>\n            <remarks>\n            List of return-types of <b>T</b>:<para/>\n            <list type=\"table\">\n            <listheader><term>Color Depth / Type</term><description><see cref=\"T:System.Type\">Result Type of IEnmuerable&lt;Scanline&lt;T&gt;&gt;</see></description></listheader>\n            <item><term>1 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI1BIT\"/></description></item>\n            <item><term>4 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI4BIT\"/></description></item>\n            <item><term>8 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:System.Byte\"/></description></item>\n            <item><term>16 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:System.UInt16\"/></description></item>\n            <item><term>16 - 555 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI16RGB555\"/></description></item>\n            <item><term>16 - 565 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.FI16RGB565\"/></description></item>\n            <item><term>24 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.RGBTRIPLE\"/></description></item>\n            <item><term>32 (<see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>)</term><description><see cref=\"T:FreeImageAPI.RGBQUAD\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_COMPLEX\"/></term><description><see cref=\"T:FreeImageAPI.FICOMPLEX\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_DOUBLE\"/></term><description><see cref=\"T:System.Double\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_FLOAT\"/></term><description><see cref=\"T:System.Single\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT16\"/></term><description><see cref=\"T:System.Int16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT32\"/></term><description><see cref=\"T:System.Int32\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGB16\"/></term><description><see cref=\"T:FreeImageAPI.FIRGB16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBA16\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBA16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBAF\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBAF\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBF\"/></term><description><see cref=\"T:FreeImageAPI.FIRGBF\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT16\"/></term><description><see cref=\"T:System.UInt16\"/></description></item>\n            <item><term><see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT32\"/></term><description><see cref=\"T:System.UInt32\"/></description></item>\n            </list>\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.RemovePropertyItem(System.Int32)\">\n            <summary>\n            Removes the specified property item from this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"propid\">The ID of the property item to remove.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.RotateFlip(System.Drawing.RotateFlipType)\">\n            <summary>\n            This method rotates, flips, or rotates and flips this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"rotateFlipType\">A RotateFlipType member\n            that specifies the type of rotation and flip to apply to this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.CloneMetadataFrom(FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            Copies the metadata from another <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"bitmap\">The bitmap to read the metadata from.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> is a null reference.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.CloneMetadataFrom(FreeImageAPI.FreeImageBitmap,FreeImageAPI.FREE_IMAGE_METADATA_COPY)\">\n            <summary>\n            Copies the metadata from another <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> using\n            the provided options.\n            </summary>\n            <param name=\"bitmap\">The bitmap to read the metadata from.</param>\n            <param name=\"flags\">Specifies the way the metadata is copied.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> is a null reference.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified file.\n            </summary>\n            <param name=\"filename\">A string that contains the name of the file to which\n            to save this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"filename\"/> is null or empty.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String,FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified file in the specified format.\n            </summary>\n            <param name=\"filename\">A string that contains the name of the file to which\n            to save this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"format\">An <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> that specifies the format of the saved image.</param>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"filename\"/> is null or empty.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified file in the specified format\n            using the specified saving flags.\n            </summary>\n            <param name=\"filename\">A string that contains the name of the file to which\n            to save this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"format\">An <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> that specifies the format of the saved image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"filename\"/> is null or empty.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Save(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified stream in the specified format.\n            </summary>\n            <param name=\"stream\">The stream where this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> will be saved.</param>\n            <param name=\"format\">An <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> that specifies the format of the saved image.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Save(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified stream in the specified format\n            using the specified saving flags.\n            </summary>\n            <param name=\"stream\">The stream where this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> will be saved.</param>\n            <param name=\"format\">An <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> that specifies the format of the saved image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"stream\"/> is a null reference.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd\">\n            <summary>\n            Adds a frame to the file specified in a previous call to the <see cref=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String)\"/>\n            method.\n            </summary>\n            <exception cref=\"T:System.InvalidOperationException\">\n            This instance has not been saved to a file using Save(...) before.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.Int32)\">\n            <summary>\n            Adds a frame to the file specified in a previous call to the <see cref=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String)\"/> method.\n            </summary>\n            <param name=\"insertPosition\">The position at which the frame should be inserted.</param>\n            <exception cref=\"T:System.InvalidOperationException\">\n            This instance has not yet been saved to a file using the Save(...) method.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"insertPosition\"/> is out of range.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            Adds a frame to the file specified in a previous call to the <see cref=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String)\"/> method.\n            </summary>\n            <param name=\"bitmap\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that contains the frame to add.</param>\n            <exception cref=\"T:System.InvalidOperationException\">\n            This instance has not yet been saved to a file using the Save(...) method.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(FreeImageAPI.FreeImageBitmap,System.Int32)\">\n            <summary>\n            Adds a frame to the file specified in a previous call to the <see cref=\"M:FreeImageAPI.FreeImageBitmap.Save(System.String)\"/> method.\n            </summary>\n            <param name=\"bitmap\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that contains the frame to add.</param>\n            <param name=\"insertPosition\">The position at which the frame should be inserted.</param>\n            <exception cref=\"T:System.InvalidOperationException\">\n            This instance has not yet been saved to a file using the Save(...) method.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"insertPosition\"/> is out of range.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.String)\">\n            <summary>\n            Adds a frame to the file specified.\n            </summary>\n            <param name=\"filename\">File to add this frame to.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image has failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.String,System.Int32)\">\n            <summary>\n            Adds a frame to the file specified.\n            </summary>\n            <param name=\"filename\">File to add this frame to.</param>\n            <param name=\"insertPosition\">The position at which the frame should be inserted.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image has failed.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"insertPosition\"/> is out of range.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.String,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Adds a frame to the file specified using the specified parameters.\n            </summary>\n            <param name=\"filename\">File to add this frame to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"loadFlags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"saveFlags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image has failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.String,System.Int32,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Adds a frame to the file specified using the specified parameters.\n            </summary>\n            <param name=\"filename\">File to add this frame to.</param>\n            <param name=\"insertPosition\">The position at which the frame should be inserted.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"loadFlags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"saveFlags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"filename\"/> is a null reference.</exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image has failed.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"insertPosition\"/> is out of range.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SelectActiveFrame(System.Int32)\">\n            <summary>\n            Selects the frame specified by the index.\n            </summary>\n            <param name=\"frameIndex\">The index of the active frame.</param>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"frameIndex\"/> is out of range.</exception>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.InvalidOperationException\">The source of the bitmap is not available.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetHbitmap\">\n            <summary>\n            Creates a GDI bitmap object from this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <returns>A handle to the GDI bitmap object that this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetHbitmap(System.Drawing.Color)\">\n            <summary>\n            Creates a GDI bitmap object from this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"background\">A <see cref=\"T:System.Drawing.Color\"/> structure that specifies the background color.\n            This parameter is ignored if the bitmap is totally opaque.</param>\n            <returns>A handle to the GDI bitmap object that this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetHicon\">\n            <summary>\n            Returns the handle to an icon.\n            </summary>\n            <returns>A Windows handle to an icon with the same image as this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetHbitmapForDevice\">\n            <summary>\n            Creates a GDI bitmap object from this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> with the same\n            color depth as the primary device.\n            </summary>\n            <returns>A handle to the GDI bitmap object that this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetPixel(System.Int32,System.Int32)\">\n            <summary>\n            Gets the <see cref=\"T:System.Drawing.Color\"/> of the specified pixel in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"x\">The x-coordinate of the pixel to retrieve.</param>\n            <param name=\"y\">The y-coordinate of the pixel to retrieve.</param>\n            <returns>A <see cref=\"T:System.Drawing.Color\"/> structure that represents the color of the specified pixel.</returns>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.NotSupportedException\">The type of this bitmap is not supported.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.MakeTransparent\">\n            <summary>\n            Makes the default transparent color transparent for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.MakeTransparent(System.Drawing.Color)\">\n            <summary>\n            Makes the specified color transparent for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"transparentColor\">The <see cref=\"T:System.Drawing.Color\"/> structure that represents\n            the color to make transparent.</param>\n            <exception cref=\"T:System.NotImplementedException\">\n            This method is not implemented.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SetPixel(System.Int32,System.Int32,System.Drawing.Color)\">\n            <summary>\n            Sets the <see cref=\"T:System.Drawing.Color\"/> of the specified pixel in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"x\">The x-coordinate of the pixel to set.</param>\n            <param name=\"y\">The y-coordinate of the pixel to set.</param>\n            <param name=\"color\">A <see cref=\"T:System.Drawing.Color\"/> structure that represents the color\n            to assign to the specified pixel.</param>\n            <exception cref=\"T:System.Exception\">The operation failed.</exception>\n            <exception cref=\"T:System.NotSupportedException\">The type of this bitmap is not supported.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SetResolution(System.Single,System.Single)\">\n            <summary>\n            Sets the resolution for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"xDpi\">The horizontal resolution, in dots per inch, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"yDpi\">The vertical resolution, in dots per inch, of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.LockBits(System.Drawing.Rectangle,System.Drawing.Imaging.ImageLockMode,System.Drawing.Imaging.PixelFormat)\">\n            <summary>\n            This function is not yet implemented.\n            </summary>\n            <exception cref=\"T:System.NotImplementedException\">\n            This method is not implemented.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.LockBits(System.Drawing.Rectangle,System.Drawing.Imaging.ImageLockMode,System.Drawing.Imaging.PixelFormat,System.Drawing.Imaging.BitmapData)\">\n            <summary>\n            This function is not yet implemented.\n            </summary>\n            <exception cref=\"T:System.NotImplementedException\">\n            This method is not implemented.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.UnlockBits(System.Drawing.Imaging.BitmapData)\">\n            <summary>\n            This function is not yet implemented.\n            </summary>\n            <exception cref=\"T:System.NotImplementedException\">\n            This method is not implemented.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH)\">\n            <summary>\n            Converts this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> into a different color depth.\n            The parameter <paramref name=\"bpp\"/> specifies color depth, greyscale conversion\n            and palette reorder.\n            <para>Adding the <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE\"/> flag\n            will first perform a convesion to greyscale. This can be done with any target\n            color depth.</para>\n            <para>Adding the <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_REORDER_PALETTE\"/> flag\n            will allow the algorithm to reorder the palette. This operation will not be performed to\n            non-greyscale images to prevent data loss by mistake.</para>\n            </summary>\n            <param name=\"bpp\">A bitfield containing information about the conversion\n            to perform.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.ConvertType(FreeImageAPI.FREE_IMAGE_TYPE,System.Boolean)\">\n            <summary>\n            Converts this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> <see cref=\"T:FreeImageAPI.FREE_IMAGE_TYPE\"/> to\n            <paramref name=\"type\"/> initializing a new instance.\n            In case source and destination type are the same, the operation fails.\n            An error message can be catched using the 'Message' event.\n            </summary>\n            <param name=\"type\">Destination type.</param>\n            <param name=\"scaleLinear\">True to scale linear, else false.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetTypeConvertedInstance(FreeImageAPI.FREE_IMAGE_TYPE,System.Boolean)\">\n            <summary>\n            Converts this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to <paramref name=\"type\"/>.\n            In case source and destination type are the same, the operation fails.\n            An error message can be catched using the 'Message' event.\n            </summary>\n            <param name=\"type\">Destination type.</param>\n            <param name=\"scaleLinear\">True to scale linear, else false.</param>\n            <returns>The converted instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetColorConvertedInstance(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH)\">\n            <summary>\n            Converts this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> into a different color depth initializing\n            a new instance.\n            The parameter <paramref name=\"bpp\"/> specifies color depth, greyscale conversion\n            and palette reorder.\n            <para>Adding the <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE\"/> flag will\n            first perform a convesion to greyscale. This can be done with any target color depth.</para>\n            <para>Adding the <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_REORDER_PALETTE\"/> flag will\n            allow the algorithm to reorder the palette. This operation will not be performed to\n            non-greyscale images to prevent data loss by mistake.</para>\n            </summary>\n            <param name=\"bpp\">A bitfield containing information about the conversion\n            to perform.</param>\n            <returns>The converted instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Rescale(System.Drawing.Size,FreeImageAPI.FREE_IMAGE_FILTER)\">\n            <summary>\n            Rescales this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified size using the\n            specified filter.\n            </summary>\n            <param name=\"newSize\">The Size structure that represent the\n            size of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"filter\">Filter to use for resizing.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Rescale(System.Int32,System.Int32,FreeImageAPI.FREE_IMAGE_FILTER)\">\n            <summary>\n            Rescales this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified size using the\n            specified filter.\n            </summary>\n            <param name=\"width\">Width of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">Height of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"filter\">Filter to use for resizing.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetScaledInstance(System.Drawing.Size,FreeImageAPI.FREE_IMAGE_FILTER)\">\n            <summary>\n            Rescales this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified size using the\n            specified filter initializing a new instance.\n            </summary>\n            <param name=\"newSize\">The Size structure that represent the\n            size of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"filter\">Filter to use for resizing.</param>\n            <returns>The rescaled instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetScaledInstance(System.Int32,System.Int32,FreeImageAPI.FREE_IMAGE_FILTER)\">\n            <summary>\n            Rescales this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified size using the\n            specified filter initializing a new instance.\n            </summary>\n            <param name=\"width\">Width of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"height\">Height of the new <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"filter\">Filter to use for resizing.</param>\n            <returns>The rescaled instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.EnlargeCanvas``1(System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0})\">\n            <summary>\n            Enlarges or shrinks this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> selectively per side and fills\n            newly added areas with the specified background color.\n            See <see cref=\"M:FreeImageAPI.FreeImage.EnlargeCanvas``1(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"left\">The number of pixels, the image should be enlarged on its left side.\n            Negative values shrink the image on its left side.</param>\n            <param name=\"top\">The number of pixels, the image should be enlarged on its top side.\n            Negative values shrink the image on its top side.</param>\n            <param name=\"right\">The number of pixels, the image should be enlarged on its right side.\n            Negative values shrink the image on its right side.</param>\n            <param name=\"bottom\">The number of pixels, the image should be enlarged on its bottom side.\n            Negative values shrink the image on its bottom side.</param>\n            <param name=\"color\">The color, the enlarged sides of the image should be filled with.</param>\n            <returns><c>true</c> on success, <c>false</c> on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.EnlargeCanvas``1(System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\">\n            <summary>\n            Enlarges or shrinks this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> selectively per side and fills\n            newly added areas with the specified background color.\n            See <see cref=\"M:FreeImageAPI.FreeImage.EnlargeCanvas``1(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"left\">The number of pixels, the image should be enlarged on its left side.\n            Negative values shrink the image on its left side.</param>\n            <param name=\"top\">The number of pixels, the image should be enlarged on its top side.\n            Negative values shrink the image on its top side.</param>\n            <param name=\"right\">The number of pixels, the image should be enlarged on its right side.\n            Negative values shrink the image on its right side.</param>\n            <param name=\"bottom\">The number of pixels, the image should be enlarged on its bottom side.\n            Negative values shrink the image on its bottom side.</param>\n            <param name=\"color\">The color, the enlarged sides of the image should be filled with.</param>\n            <param name=\"options\">Options that affect the color search process for palletized images.</param>\n            <returns><c>true</c> on success, <c>false</c> on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetEnlargedInstance``1(System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0})\">\n            <summary>\n            Enlarges or shrinks this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> selectively per side and fills\n            newly added areas with the specified background color returning a new instance.\n            See <see cref=\"M:FreeImageAPI.FreeImage.EnlargeCanvas``1(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"left\">The number of pixels, the image should be enlarged on its left side.\n            Negative values shrink the image on its left side.</param>\n            <param name=\"top\">The number of pixels, the image should be enlarged on its top side.\n            Negative values shrink the image on its top side.</param>\n            <param name=\"right\">The number of pixels, the image should be enlarged on its right side.\n            Negative values shrink the image on its right side.</param>\n            <param name=\"bottom\">The number of pixels, the image should be enlarged on its bottom side.\n            Negative values shrink the image on its bottom side.</param>\n            <param name=\"color\">The color, the enlarged sides of the image should be filled with.</param>\n            <returns>The enlarged instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetEnlargedInstance``1(System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\">\n            <summary>\n            Enlarges or shrinks this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> selectively per side and fills\n            newly added areas with the specified background color returning a new instance.\n            See <see cref=\"M:FreeImageAPI.FreeImage.EnlargeCanvas``1(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"left\">The number of pixels, the image should be enlarged on its left side.\n            Negative values shrink the image on its left side.</param>\n            <param name=\"top\">The number of pixels, the image should be enlarged on its top side.\n            Negative values shrink the image on its top side.</param>\n            <param name=\"right\">The number of pixels, the image should be enlarged on its right side.\n            Negative values shrink the image on its right side.</param>\n            <param name=\"bottom\">The number of pixels, the image should be enlarged on its bottom side.\n            Negative values shrink the image on its bottom side.</param>\n            <param name=\"color\">The color, the enlarged sides of the image should be filled with.</param>\n            <param name=\"options\">Options that affect the color search process for palletized images.</param>\n            <returns>The enlarged instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32)\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit to 8bit creating a new\n            palette with the specified <paramref name=\"paletteSize\"/> using the specified\n            <paramref name=\"algorithm\"/>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,FreeImageAPI.Palette)\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit to 8bit creating a new\n            palette with the specified <paramref name=\"paletteSize\"/> using the specified\n            <paramref name=\"algorithm\"/> and the specified\n            <paramref name=\"reservePalette\">palette</paramref> up to the\n            specified <paramref name=\"paletteSize\">length</paramref>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <param name=\"reservePalette\">The provided palette.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,System.Int32,FreeImageAPI.Palette)\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit to 8bit creating a new\n            palette with the specified <paramref name=\"paletteSize\"/> using the specified\n            <paramref name=\"algorithm\"/> and the specified\n            <paramref name=\"reservePalette\">palette</paramref> up to the\n            specified <paramref name=\"paletteSize\">length</paramref>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <param name=\"reserveSize\">Size of the provided palette of ReservePalette.</param>\n            <param name=\"reservePalette\">The provided palette.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,System.Int32,FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit to 8bit creating a new\n            palette with the specified <paramref name=\"paletteSize\"/> using the specified\n            <paramref name=\"algorithm\"/> and the specified\n            <paramref name=\"reservePalette\">palette</paramref> up to the\n            specified <paramref name=\"paletteSize\">length</paramref>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <param name=\"reserveSize\">Size of the provided palette of ReservePalette.</param>\n            <param name=\"reservePalette\">The provided palette.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetQuantizedInstance(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32)\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit, using the specified\n            <paramref name=\"algorithm\"/> initializing a new 8 bit instance with the\n            specified <paramref name=\"paletteSize\"/>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <returns>The quantized instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetQuantizedInstance(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,FreeImageAPI.Palette)\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit, using the specified\n            <paramref name=\"algorithm\"/> and <paramref name=\"reservePalette\">palette</paramref>\n            initializing a new 8 bit instance with the specified <paramref name=\"paletteSize\"/>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <param name=\"reservePalette\">The provided palette.</param>\n            <returns>The quantized instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetQuantizedInstance(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,System.Int32,FreeImageAPI.Palette)\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit, using the specified\n            <paramref name=\"algorithm\"/> and up to <paramref name=\"reserveSize\"/>\n            entries from <paramref name=\"reservePalette\">palette</paramref> initializing\n            a new 8 bit instance with the specified <paramref name=\"paletteSize\"/>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <param name=\"reserveSize\">Size of the provided palette.</param>\n            <param name=\"reservePalette\">The provided palette.</param>\n            <returns>The quantized instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetQuantizedInstance(FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,System.Int32,FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Quantizes this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from 24 bit, using the specified\n            <paramref name=\"algorithm\"/> and up to <paramref name=\"reserveSize\"/>\n            entries from <paramref name=\"reservePalette\">palette</paramref> initializing\n            a new 8 bit instance with the specified <paramref name=\"paletteSize\"/>.\n            </summary>\n            <param name=\"algorithm\">The color reduction algorithm to be used.</param>\n            <param name=\"paletteSize\">Size of the desired output palette.</param>\n            <param name=\"reserveSize\">Size of the provided palette.</param>\n            <param name=\"reservePalette\">The provided palette.</param>\n            <returns>The quantized instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.TmoDrago03(System.Double,System.Double)\">\n            <summary>\n            Converts a High Dynamic Range image to a 24-bit RGB image using a global\n            operator based on logarithmic compression of luminance values, imitating\n            the human response to light.\n            </summary>\n            <param name=\"gamma\">A gamma correction that is applied after the tone mapping.\n            A value of 1 means no correction.</param>\n            <param name=\"exposure\">Scale factor allowing to adjust the brightness of the output image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.TmoReinhard05(System.Double,System.Double)\">\n            <summary>\n            Converts a High Dynamic Range image to a 24-bit RGB image using a global operator inspired\n            by photoreceptor physiology of the human visual system.\n            </summary>\n            <param name=\"intensity\">Controls the overall image intensity in the range [-8, 8].</param>\n            <param name=\"contrast\">Controls the overall image contrast in the range [0.3, 1.0[.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.TmoFattal02(System.Double,System.Double)\">\n            <summary>\n            Apply the Gradient Domain High Dynamic Range Compression to a RGBF image and convert to 24-bit RGB.\n            </summary>\n            <param name=\"color_saturation\">Color saturation (s parameter in the paper) in [0.4..0.6]</param>\n            <param name=\"attenuation\">Atenuation factor (beta parameter in the paper) in [0.8..0.9]</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Rotate(System.Double)\">\n            <summary>\n            This method rotates a 1-, 4-, 8-bit greyscale or a 24-, 32-bit color image by means of 3 shears.\n            For 1- and 4-bit images, rotation is limited to angles whose value is an integer\n            multiple of 90.\n            </summary>\n            <param name=\"angle\">The angle of rotation.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Rotate``1(System.Double,System.Nullable{``0})\">\n            <summary>\n            This method rotates a 1-, 4-, 8-bit greyscale or a 24-, 32-bit color image by means of 3 shears.\n            For 1- and 4-bit images, rotation is limited to angles whose value is an integer\n            multiple of 90.\n            </summary>\n            <typeparam name=\"T\">The type of the color to use as background.</typeparam>\n            <param name=\"angle\">The angle of rotation.</param>\n            <param name=\"backgroundColor\">The color used used to fill the bitmap's background.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetRotatedInstance``1(System.Double,System.Nullable{``0})\">\n            <summary>\n            Rotates this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> by the specified angle initializing a new instance.\n            For 1- and 4-bit images, rotation is limited to angles whose value is an integer\n            multiple of 90.\n            </summary>\n            <typeparam name=\"T\">The type of the color to use as background.</typeparam>\n            <param name=\"angle\">The angle of rotation.</param>\n            <param name=\"backgroundColor\">The color used used to fill the bitmap's background.</param>\n            <returns>The rotated instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetRotatedInstance(System.Double)\">\n            <summary>\n            Rotates this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> by the specified angle initializing a new instance.\n            For 1- and 4-bit images, rotation is limited to angles whose value is an integer\n            multiple of 90.\n            </summary>\n            <param name=\"angle\">The angle of rotation.</param>\n            <returns>The rotated instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Rotate(System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            This method performs a rotation and / or translation of an 8-bit greyscale,\n            24- or 32-bit image, using a 3rd order (cubic) B-Spline.\n            </summary>\n            <param name=\"angle\">The angle of rotation.</param>\n            <param name=\"xShift\">Horizontal image translation.</param>\n            <param name=\"yShift\">Vertical image translation.</param>\n            <param name=\"xOrigin\">Rotation center x-coordinate.</param>\n            <param name=\"yOrigin\">Rotation center y-coordinate.</param>\n            <param name=\"useMask\">When true the irrelevant part of the image is set to a black color,\n            otherwise, a mirroring technique is used to fill irrelevant pixels.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetRotatedInstance(System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            This method performs a rotation and / or translation of an 8-bit greyscale,\n            24- or 32-bit image, using a 3rd order (cubic) B-Spline initializing a new instance.\n            </summary>\n            <param name=\"angle\">The angle of rotation.</param>\n            <param name=\"xShift\">Horizontal image translation.</param>\n            <param name=\"yShift\">Vertical image translation.</param>\n            <param name=\"xOrigin\">Rotation center x-coordinate.</param>\n            <param name=\"yOrigin\">Rotation center y-coordinate.</param>\n            <param name=\"useMask\">When true the irrelevant part of the image is set to a black color,\n            otherwise, a mirroring technique is used to fill irrelevant pixels.</param>\n            <returns>The rotated instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.AdjustCurve(System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Perfoms an histogram transformation on a 8-, 24- or 32-bit image.\n            </summary>\n            <param name=\"lookUpTable\">The lookup table (LUT).\n            It's size is assumed to be 256 in length.</param>\n            <param name=\"channel\">The color channel to be transformed.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.AdjustGamma(System.Double)\">\n            <summary>\n            Performs gamma correction on a 8-, 24- or 32-bit image.\n            </summary>\n            <param name=\"gamma\">The parameter represents the gamma value to use (gamma > 0).\n            A value of 1.0 leaves the image alone, less than one darkens it, and greater than one lightens it.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.AdjustBrightness(System.Double)\">\n            <summary>\n            Adjusts the brightness of a 8-, 24- or 32-bit image by a certain amount.\n            </summary>\n            <param name=\"percentage\">A value 0 means no change,\n            less than 0 will make the image darker and greater than 0 will make the image brighter.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.AdjustContrast(System.Double)\">\n            <summary>\n            Adjusts the contrast of a 8-, 24- or 32-bit image by a certain amount.\n            </summary>\n            <param name=\"percentage\">A value 0 means no change,\n            less than 0 will decrease the contrast and greater than 0 will increase the contrast of the image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Invert\">\n            <summary>\n            Inverts each pixel data.\n            </summary>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetHistogram(FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL,System.Int32[]@)\">\n            <summary>\n            Computes the image histogram.\n            </summary>\n            <param name=\"channel\">Channel to compute from.</param>\n            <param name=\"histogram\">Array of integers containing the histogram.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetChannel(FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Retrieves the red, green, blue or alpha channel of a 24- or 32-bit image.\n            </summary>\n            <param name=\"channel\">The color channel to extract.</param>\n            <returns>The color channel in a new instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SetChannel(FreeImageAPI.FreeImageBitmap,FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Insert a 8-bit dib into a 24- or 32-bit image.\n            Both images must have to same width and height.\n            </summary>\n            <param name=\"bitmap\">The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to insert.</param>\n            <param name=\"channel\">The color channel to replace.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetComplexChannel(FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Retrieves the real part, imaginary part, magnitude or phase of a complex image.\n            </summary>\n            <param name=\"channel\">The color channel to extract.</param>\n            <returns>The color channel in a new instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SetComplexChannel(FreeImageAPI.FreeImageBitmap,FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Set the real or imaginary part of a complex image.\n            Both images must have to same width and height.\n            </summary>\n            <param name=\"bitmap\">The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to insert.</param>\n            <param name=\"channel\">The color channel to replace.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Copy(System.Drawing.Rectangle)\">\n            <summary>\n            Copy a sub part of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"rect\">The subpart to copy.</param>\n            <returns>The sub part in a new instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Copy(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Copy a sub part of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"left\">Specifies the left position of the cropped rectangle.</param>\n            <param name=\"top\">Specifies the top position of the cropped rectangle.</param>\n            <param name=\"right\">Specifies the right position of the cropped rectangle.</param>\n            <param name=\"bottom\">Specifies the bottom position of the cropped rectangle.</param>\n            <returns>The sub part in a new instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Paste(FreeImageAPI.FreeImageBitmap,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Alpha blend or combine a sub part image with this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            The bit depth of <paramref name=\"bitmap\"/> must be greater than or equal to the bit depth this instance.\n            </summary>\n            <param name=\"bitmap\">The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to paste into this instance.</param>\n            <param name=\"left\">Specifies the left position of the sub image.</param>\n            <param name=\"top\">Specifies the top position of the sub image.</param>\n            <param name=\"alpha\">alpha blend factor.\n            The source and destination images are alpha blended if alpha=0..255.\n            If alpha > 255, then the source image is combined to the destination image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Paste(FreeImageAPI.FreeImageBitmap,System.Drawing.Point,System.Int32)\">\n            <summary>\n            Alpha blend or combine a sub part image with tthis <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            The bit depth of <paramref name=\"bitmap\"/> must be greater than or equal to the bit depth this instance.\n            </summary>\n            <param name=\"bitmap\">The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to paste into this instance.</param>\n            <param name=\"point\">Specifies the position of the sub image.</param>\n            <param name=\"alpha\">alpha blend factor.\n            The source and destination images are alpha blended if alpha=0..255.\n            If alpha > 255, then the source image is combined to the destination image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Composite(System.Boolean,System.Nullable{System.Drawing.Color},FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            This method composite a transparent foreground image against a single background color or\n            against a background image.\n            In case <paramref name=\"useBitmapBackground\"/> is false and <paramref name=\"applicationBackground\"/>\n            and <paramref name=\"bitmapBackGround\"/>\n            are null, a checkerboard will be used as background.\n            </summary>\n            <param name=\"useBitmapBackground\">When true the background of this instance is used\n            if it contains one.</param>\n            <param name=\"applicationBackground\">Backgroundcolor used in case <paramref name=\"useBitmapBackground\"/> is false\n            and <paramref name=\"applicationBackground\"/> is not null.</param>\n            <param name=\"bitmapBackGround\">Background used in case <paramref name=\"useBitmapBackground\"/>\n            is false and <paramref name=\"applicationBackground\"/> is a null reference.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.PreMultiplyWithAlpha\">\n            <summary>\n            Applies the alpha value of each pixel to its color components.\n            The aplha value stays unchanged.\n            Only works with 32-bits color depth.\n            </summary>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.MultigridPoissonSolver(System.Int32)\">\n            <summary>\n            Solves a Poisson equation, remap result pixels to [0..1] and returns the solution.\n            </summary>\n            <param name=\"ncycle\">Number of cycles in the multigrid algorithm (usually 2 or 3)</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.AdjustColors(System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            Adjusts an image's brightness, contrast and gamma as well as it may\n            optionally invert the image within a single operation.\n            </summary>\n            <param name=\"brightness\">Percentage brightness value where -100 &lt;= brightness &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will make the image darker and greater\n            than 0 will make the image brighter.</para></param>\n            <param name=\"contrast\">Percentage contrast value where -100 &lt;= contrast &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will decrease the contrast\n            and greater than 0 will increase the contrast of the image.</para></param>\n            <param name=\"gamma\">Gamma value to be used for gamma correction.\n            <para>A value of 1.0 leaves the image alone, less than one darkens it,\n            and greater than one lightens it.</para>\n            This parameter must not be zero or smaller than zero.\n            If so, it will be ignored and no gamma correction will be performed on the image.</param>\n            <param name=\"invert\">If set to true, the image will be inverted.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.ApplyColorMapping(FreeImageAPI.RGBQUAD[],FreeImageAPI.RGBQUAD[],System.Boolean,System.Boolean)\">\n            <summary>\n            Applies color mapping for one or several colors on a 1-, 4- or 8-bit\n            palletized or a 16-, 24- or 32-bit high color image.\n            </summary>\n            <param name=\"srccolors\">Array of colors to be used as the mapping source.</param>\n            <param name=\"dstcolors\">Array of colors to be used as the mapping destination.</param>\n            <param name=\"ignore_alpha\">If true, 32-bit images and colors are treated as 24-bit.</param>\n            <param name=\"swap\">If true, source and destination colors are swapped, that is,\n            each destination color is also mapped to the corresponding source color.</param>\n            <returns>The total number of pixels changed.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"srccolors\"/> or <paramref name=\"dstcolors\"/> is a null reference.\n            </exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"srccolors\"/> has a different length than <paramref name=\"dstcolors\"/>.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SwapColors(FreeImageAPI.RGBQUAD,FreeImageAPI.RGBQUAD,System.Boolean)\">\n            <summary>\n            Swaps two specified colors on a 1-, 4- or 8-bit palletized\n            or a 16-, 24- or 32-bit high color image.\n            </summary>\n            <param name=\"color_a\">One of the two colors to be swapped.</param>\n            <param name=\"color_b\">The other of the two colors to be swapped.</param>\n            <param name=\"ignore_alpha\">If true, 32-bit images and colors are treated as 24-bit.</param>\n            <returns>The total number of pixels changed.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.ApplyPaletteIndexMapping(System.Byte[],System.Byte[],System.UInt32,System.Boolean)\">\n            <summary>\n            Applies palette index mapping for one or several indices\n            on a 1-, 4- or 8-bit palletized image.\n            </summary>\n            <param name=\"srcindices\">Array of palette indices to be used as the mapping source.</param>\n            <param name=\"dstindices\">Array of palette indices to be used as the mapping destination.</param>\n            <param name=\"count\">The number of palette indices to be mapped. This is the size of both\n            srcindices and dstindices</param>\n            <param name=\"swap\">If true, source and destination palette indices are swapped, that is,\n            each destination index is also mapped to the corresponding source index.</param>\n            <returns>The total number of pixels changed.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"srcindices\"/> or <paramref name=\"dstindices\"/> is a null reference.\n            </exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"srcindices\"/> has a different length than <paramref name=\"dstindices\"/>.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SwapPaletteIndices(System.Byte,System.Byte)\">\n            <summary>\n            Swaps two specified palette indices on a 1-, 4- or 8-bit palletized image.\n            </summary>\n            <param name=\"index_a\">One of the two palette indices to be swapped.</param>\n            <param name=\"index_b\">The other of the two palette indices to be swapped.</param>\n            <returns>The total number of pixels changed.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FillBackground``1(``0)\">\n            <summary>\n            Sets all pixels of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified color.\n            See <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"color\">The color to fill this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> with.</param>\n            <returns><c>true</c> on success, <c>false</c> on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FillBackground``1(``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\">\n            <summary>\n            Sets all pixels of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> to the specified color.\n            See <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"color\">The color to fill this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> with.</param>\n            <param name=\"options\">Options that affect the color search process for palletized images.</param>\n            <returns><c>true</c> on success, <c>false</c> on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.CreateICCProfile(System.Byte[])\">\n            <summary>\n            Creates a new ICC-Profile.\n            </summary>\n            <param name=\"data\">The data of the new ICC-Profile.</param>\n            <returns>The new ICC-Profile of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"data\"/> is a null reference.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.CreateICCProfile(System.Byte[],System.Int32)\">\n            <summary>\n            Creates a new ICC-Profile.\n            </summary>\n            <param name=\"data\">The data of the new ICC-Profile.</param>\n            <param name=\"size\">The number of bytes of <paramref name=\"data\"/> to use.</param>\n            <returns>The new ICC-Profile of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"data\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Equals(System.Object)\">\n            <summary>\n            Determines whether this and the specified instances are the same.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if this instance is the same <paramref name=\"obj\"/>\n            or if both are null references; otherwise, false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.IsAlphaPixelFormat(System.Drawing.Imaging.PixelFormat)\">\n            <summary>\n            Returns a value that indicates whether the pixel format for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> contains alpha information.\n            </summary>\n            <param name=\"pixfmt\">The <see cref=\"T:System.Drawing.Imaging.PixelFormat\"/> to test.</param>\n            <returns><b>true</b> if pixfmt contains alpha information; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.IsCanonicalPixelFormat(System.Drawing.Imaging.PixelFormat)\">\n            <summary>\n            Returns a value that indicates whether the pixel format is 32 bits per pixel.\n            </summary>\n            <param name=\"pixfmt\">The <see cref=\"T:System.Drawing.Imaging.PixelFormat\"/> to test.</param>\n            <returns>true if pixfmt is canonical; otherwise, false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.IsExtendedPixelFormat(System.Drawing.Imaging.PixelFormat)\">\n            <summary>\n            Returns a value that indicates whether the pixel format is 64 bits per pixel.\n            </summary>\n            <param name=\"pixfmt\">The <see cref=\"T:System.Drawing.Imaging.PixelFormat\"/> enumeration to test.</param>\n            <returns>true if pixfmt is extended; otherwise, false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromHicon(System.IntPtr)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from a Windows handle to an icon.\n            </summary>\n            <param name=\"hicon\">A handle to an icon.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromResource(System.IntPtr,System.String)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from the specified Windows resource.\n            </summary>\n            <param name=\"hinstance\">A handle to an instance of the executable\n            file that contains the resource.</param>\n            <param name=\"bitmapName\">A string containing the name of the resource bitmap.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromFile(System.String)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from the specified file.\n            </summary>\n            <param name=\"filename\">A string that contains the name of the file\n            from which to create the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromFile(System.String,System.Boolean)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from the specified file\n            using embedded color management information in that file.\n            </summary>\n            <param name=\"filename\">A string that contains the\n            name of the file from which to create the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"useEmbeddedColorManagement\">Ignored.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromHbitmap(System.IntPtr)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from a handle to a GDI bitmap.\n            </summary>\n            <param name=\"hbitmap\">The GDI bitmap handle from which to create the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromHbitmap(System.IntPtr,System.IntPtr)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from a handle to a GDI bitmap and a handle to a GDI palette.\n            </summary>\n            <param name=\"hbitmap\">The GDI bitmap handle from which to create the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"hpalette\">Ignored.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FreeHbitmap(System.IntPtr)\">\n            <summary>\n            Frees a bitmap handle.\n            </summary>\n            <param name=\"hbitmap\">Handle to a bitmap.</param>\n            <returns><b>true</b> on success, <b>false</b> on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromStream(System.IO.Stream)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from the specified data stream.\n            </summary>\n            <param name=\"stream\">A <see cref=\"T:System.IO.Stream\"/> that contains the data for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromStream(System.IO.Stream,System.Boolean)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from the specified data stream.\n            </summary>\n            <param name=\"stream\">A <see cref=\"T:System.IO.Stream\"/> that contains the data for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"useEmbeddedColorManagement\">Ignored.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.FromStream(System.IO.Stream,System.Boolean,System.Boolean)\">\n            <summary>\n            Creates a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> from the specified data stream.\n            </summary>\n            <param name=\"stream\">A <see cref=\"T:System.IO.Stream\"/> that contains the data for this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</param>\n            <param name=\"useEmbeddedColorManagement\">Ignored.</param>\n            <param name=\"validateImageData\">Ignored.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> this method creates.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetPixelFormatSize(System.Drawing.Imaging.PixelFormat)\">\n            <summary>\n            Returns the color depth, in number of bits per pixel,\n            of the specified pixel format.\n            </summary>\n            <param name=\"pixfmt\">The <see cref=\"T:System.Drawing.Imaging.PixelFormat\"/> member that specifies\n            the format for which to find the size.</param>\n            <returns>The color depth of the specified pixel format.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.JPEGTransform(System.String,System.String,FreeImageAPI.FREE_IMAGE_JPEG_OPERATION,System.Boolean)\">\n            <summary>\n            Performs a lossless rotation or flipping on a JPEG file.\n            </summary>\n            <param name=\"source\">Source file.</param>\n            <param name=\"destination\">Destination file; can be the source file; will be overwritten.</param>\n            <param name=\"operation\">The operation to apply.</param>\n            <param name=\"perfect\">To avoid lossy transformation, you can set the perfect parameter to true.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.JPEGCrop(System.String,System.String,System.Drawing.Rectangle)\">\n            <summary>\n            Performs a lossless crop on a JPEG file.\n            </summary>\n            <param name=\"source\">Source filename.</param>\n            <param name=\"destination\">Destination filename.</param>\n            <param name=\"rect\">Specifies the cropped rectangle.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"source\"/> or <paramref name=\"destination\"/> is null.\n            </exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"source\"/> does not exist.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.JPEGCrop(System.String,System.String,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Performs a lossless crop on a JPEG file.\n            </summary>\n            <param name=\"source\">Source filename.</param>\n            <param name=\"destination\">Destination filename.</param>\n            <param name=\"left\">Specifies the left position of the cropped rectangle.</param>\n            <param name=\"top\">Specifies the top position of the cropped rectangle.</param>\n            <param name=\"right\">Specifies the right position of the cropped rectangle.</param>\n            <param name=\"bottom\">Specifies the bottom position of the cropped rectangle.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"source\"/> or <paramref name=\"destination\"/> is null.\n            </exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"source\"/> does not exist.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.LookupX11Color(System.String,System.Byte@,System.Byte@,System.Byte@)\">\n            <summary>\n            Converts a X11 color name into a corresponding RGB value.\n            </summary>\n            <param name=\"color\">Name of the color to convert.</param>\n            <param name=\"red\">Red component.</param>\n            <param name=\"green\">Green component.</param>\n            <param name=\"blue\">Blue component.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"color\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.LookupSVGColor(System.String,System.Byte@,System.Byte@,System.Byte@)\">\n            <summary>\n            Converts a SVG color name into a corresponding RGB value.\n            </summary>\n            <param name=\"color\">Name of the color to convert.</param>\n            <param name=\"red\">Red component.</param>\n            <param name=\"green\">Green component.</param>\n            <param name=\"blue\">Blue component.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"color\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.GetAdjustColorsLookupTable(System.Byte[],System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            Creates a lookup table to be used with AdjustCurve() which\n            may adjusts brightness and contrast, correct gamma and invert the image with a\n            single call to AdjustCurve().\n            </summary>\n            <param name=\"lookUpTable\">Output lookup table to be used with AdjustCurve().\n            The size of <paramref name=\"lookUpTable\"/> is assumed to be 256.</param>\n            <param name=\"brightness\">Percentage brightness value where -100 &lt;= brightness &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will make the image darker and greater\n            than 0 will make the image brighter.</para></param>\n            <param name=\"contrast\">Percentage contrast value where -100 &lt;= contrast &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will decrease the contrast\n            and greater than 0 will increase the contrast of the image.</para></param>\n            <param name=\"gamma\">Gamma value to be used for gamma correction.\n            <para>A value of 1.0 leaves the image alone, less than one darkens it,\n            and greater than one lightens it.</para></param>\n            <param name=\"invert\">If set to true, the image will be inverted.</param>\n            <returns>The number of adjustments applied to the resulting lookup table\n            compared to a blind lookup table.</returns>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"lookUpTable\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"lookUpTable.Length.Length\"/> is not 256.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.String,FreeImageAPI.FreeImageBitmap,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Adds a specified frame to the file specified using the specified parameters.\n            Use this method to save selected frames from an to a multiple-frame image.\n            </summary>\n            <param name=\"filename\">File to add this frame to.</param>\n            <param name=\"bitmap\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that contains the frame to add.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"loadFlags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"saveFlags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"filename\"/> or <paramref name=\"bitmap\"/> is null.\n            </exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd(System.String,FreeImageAPI.FreeImageBitmap,System.Int32,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Adds a specified frame to the file specified using the specified parameters.\n            Use this method to save selected frames from an image to a multiple-frame image.\n            </summary>\n            <param name=\"filename\">File to add this frame to.</param>\n            <param name=\"bitmap\">A <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> that contains the frame to add.</param>\n            <param name=\"insertPosition\">The position of the inserted frame.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"loadFlags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"saveFlags\">Flags to enable or disable plugin-features.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"filename\"/> or <paramref name=\"bitmap\"/> is null.\n            </exception>\n            <exception cref=\"T:System.IO.FileNotFoundException\"><paramref name=\"filename\"/> does not exist.</exception>\n            <exception cref=\"T:System.Exception\">Saving the image failed.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\"><paramref name=\"insertPosition\"/> is out of range.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.CreateNewPropertyItem\">\n            <summary>\n            Returns a new instance of the <see cref=\"T:System.Drawing.Imaging.PropertyItem\"/> class which\n            has no public accessible constructor.\n            </summary>\n            <returns>A new instace of <see cref=\"T:System.Drawing.Imaging.PropertyItem\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.EnsureNotDisposed\">\n            <summary>\n            Throws an exception in case the instance has already been disposed.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.ReplaceDib(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Tries to replace the wrapped <see cref=\"T:FreeImageAPI.FIBITMAP\"/> with a new one.\n            In case the new dib is null or the same as the already\n            wrapped one, nothing will be changed and the result will\n            be false.\n            Otherwise the wrapped <see cref=\"T:FreeImageAPI.FIBITMAP\"/> will be unloaded and replaced.\n            </summary>\n            <param name=\"newDib\">The new dib.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.UnloadDib\">\n            <summary>\n            Unloads currently wrapped <see cref=\"T:FreeImageAPI.FIBITMAP\"/> or unlocks the locked page\n            in case it came from a multipaged bitmap.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.AddMemoryPressure\">\n            <summary>\n            Informs the runtime about unmanaged allocoted memory.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.LoadFromStream(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Opens the stream and reads the number of available pages.\n            Then loads the first page to this instance.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FreeImageBitmap.SaveInformation\">\n            <summary>\n            Helper class to store informations for <see cref=\"M:FreeImageAPI.FreeImageBitmap.SaveAdd\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Clone\">\n            <summary>\n            Creates a deep copy of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <returns>A deep copy of this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Dispose\">\n            <summary>\n            Performs application-defined tasks associated with freeing,\n            releasing, or resetting unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.Dispose(System.Boolean)\">\n            <summary>\n            Performs application-defined tasks associated with freeing,\n            releasing, or resetting unmanaged resources.\n            </summary>\n            <param name=\"disposing\">If true managed ressources are released.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageBitmap.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Retrieves an object that can iterate through the individual scanlines in this <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.IEnumerator\"/> for the <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.</returns>\n            <exception cref=\"T:System.ArgumentException\">The bitmaps's type is not supported.</exception>\n        </member>\n        <member name=\"T:FreeImageAPI.FreeImageEngine\">\n            <summary>\n            Class handling non-bitmap related functions.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImageEngine.OnMessage(FreeImageAPI.FREE_IMAGE_FORMAT,System.String)\">\n            <summary>\n            Internal callback\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageEngine.IsAvailable\">\n            <summary>\n            Gets a value indicating if the FreeImage DLL is available or not.\n            </summary>\n        </member>\n        <member name=\"E:FreeImageAPI.FreeImageEngine.Message\">\n            <summary>\n            Internal errors in FreeImage generate a logstring that can be\n            captured by this event.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageEngine.Version\">\n            <summary>\n            Gets a string containing the current version of the library.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageEngine.CopyrightMessage\">\n            <summary>\n            Gets a string containing a standard copyright message.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FreeImageEngine.IsLittleEndian\">\n            <summary>\n            Gets whether the platform is using Little Endian.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.FreeImageStreamIO\">\n            <summary>\n            Internal class wrapping stream io functions.\n            </summary>\n            <remarks>\n            FreeImage can read files from a disk or a network drive but also allows the user to\n            implement their own loading or saving functions to load them directly from an ftp or web\n            server for example.\n            <para/>\n            In .NET streams are a common way to handle data. The <b>FreeImageStreamIO</b> class handles\n            the loading and saving from and to streams. It implements the funtions FreeImage needs\n            to load data from an an arbitrary source.\n            <para/>\n            The class is for internal use only.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.FreeImageStreamIO.io\">\n            <summary>\n            <see cref=\"T:FreeImageAPI.IO.FreeImageIO\"/> structure that can be used to read from streams via\n            <see cref=\"M:FreeImageAPI.FreeImage.LoadFromHandle(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.FreeImageStreamIO.#cctor\">\n            <summary>\n            Initializes a new instances which can be used to\n            create a FreeImage compatible <see cref=\"T:FreeImageAPI.IO.FreeImageIO\"/> structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.FreeImageStreamIO.streamRead(System.IntPtr,System.UInt32,System.UInt32,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Reads the requested data from the stream and writes it to the given address.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.FreeImageStreamIO.streamWrite(System.IntPtr,System.UInt32,System.UInt32,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Reads the given data and writes it into the stream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.FreeImageStreamIO.streamSeek(FreeImageAPI.IO.fi_handle,System.Int32,System.IO.SeekOrigin)\">\n            <summary>\n            Moves the streams position.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.FreeImageStreamIO.streamTell(FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Returns the streams current position\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.StreamWrapper\">\n            <summary>\n            Class wrapping streams, implementing a buffer for read data,\n            so that seek operations can be made.\n            </summary>\n            <remarks>\n            FreeImage can load bitmaps from arbitrary sources.\n            .NET works with different streams like File- or NetConnection-strams.\n            NetConnection streams, which are used to load files from web servers,\n            for example cannot seek.\n            But FreeImage frequently uses the seek operation when loading bitmaps.\n            <b>StreamWrapper</b> wrapps a stream and makes it seekable by caching all read\n            data into an internal MemoryStream to jump back- and forward.\n            StreamWapper is for internal use and only for loading from streams.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.StreamWrapper.stream\">\n            <summary>\n            The stream to wrap\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.StreamWrapper.memoryStream\">\n            <summary>\n            The caching stream\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.StreamWrapper.eos\">\n            <summary>\n            Indicates if the wrapped stream reached its end\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.StreamWrapper.blocking\">\n            <summary>\n            Tells the wrapper to block readings or not\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.StreamWrapper.disposed\">\n            <summary>\n            Indicates if the wrapped stream is disposed or not\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.StreamWrapper.#ctor(System.IO.Stream,System.Boolean)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.IO.Stream\"/>.\n            </summary>\n            <param name=\"stream\">The stream to wrap.</param>\n            <param name=\"blocking\">When true the wrapper always tries to read the requested\n            amount of data from the wrapped stream.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.StreamWrapper.Finalize\">\n            <summary>\n            Releases all resources used by the instance.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.ReadProc\">\n            <summary>\n            Delegate to the C++ function <b>fread</b>.\n            </summary>\n            <param name=\"buffer\">Pointer to read from.</param>\n            <param name=\"size\">Item size in bytes.</param>\n            <param name=\"count\">Maximum number of items to be read.</param>\n            <param name=\"handle\">Handle/stream to read from.</param>\n            <returns>Number of full items actually read,\n            which may be less than count if an error occurs or\n            if the end of the file is encountered before reaching count.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.WriteProc\">\n            <summary>\n            Delegate to the C++ function <b>fwrite</b>.\n            </summary>\n            <param name=\"buffer\">Pointer to data to be written.</param>\n            <param name=\"size\">Item size in bytes.</param>\n            <param name=\"count\">Maximum number of items to be written.</param>\n            <param name=\"handle\">Handle/stream to write to.</param>\n            <returns>Number of full items actually written,\n            which may be less than count if an error occurs.\n            Also, if an error occurs, the file-position indicator cannot be determined.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.SeekProc\">\n            <summary>\n            Delegate to the C++ function <b>fseek</b>.\n            </summary>\n            <param name=\"handle\">Handle/stream to seek in.</param>\n            <param name=\"offset\">Number of bytes from origin.</param>\n            <param name=\"origin\">Initial position.</param>\n            <returns>If successful 0 is returned; otherwise a nonzero value. </returns>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.TellProc\">\n            <summary>\n            Delegate to the C++ function <b>ftell</b>.\n            </summary>\n            <param name=\"handle\">Handle/stream to retrieve its currents position from.</param>\n            <returns>The current position.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.fi_handle\">\n             <summary>\n             Wrapper for a custom handle.\n             </summary>\n             <remarks>\n             The <b>fi_handle</b> of FreeImage in C++ is a simple pointer, but in .NET\n             it's not that simple. This wrapper uses fi_handle in two different ways.\n            \n             We implement a new plugin and FreeImage gives us a handle (pointer) that\n             we can simply pass through to the given functions in a 'FreeImageIO'\n             structure.\n             But when we want to use LoadFromhandle or SaveToHandle we need\n             a fi_handle (that we receive again in our own functions).\n             This handle is for example a stream (see LoadFromStream / SaveToStream)\n             that we want to work with. To know which stream a read/write is meant for\n             we could use a hash value that the wrapper itself handles or we can\n             go the unmanaged way of using a handle.\n             Therefor we use a <see cref=\"T:System.Runtime.InteropServices.GCHandle\"/> to receive a unique pointer that we can\n             convert back into a .NET object.\n             When the <b>fi_handle</b> instance is no longer needed the instance must be disposed\n             by the creater manually! It is recommended to use the <c>using</c> statement to\n             be sure the instance is always disposed:\n             \n             <code>\n             using (fi_handle handle = new fi_handle(object))\n             {\n                 callSomeFunctions(handle);\n             }\n             </code>\n             \n             What does that mean?\n             If we get a <b>fi_handle</b> from unmanaged code we get a pointer to unmanaged\n             memory that we do not have to care about, and just pass ist back to FreeImage.\n             If we have to create a handle our own we use the standard constructur\n             that fills the <see cref=\"T:System.IntPtr\"/> with an pointer that represents the given object.\n             With calling <see cref=\"M:FreeImageAPI.IO.fi_handle.GetObject\"/> the <see cref=\"T:System.IntPtr\"/> is used to retrieve the original\n             object we passed through the constructor.\n            \n             This way we can implement a <b>fi_handle</b> that works with managed an unmanaged\n             code.\n             </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.fi_handle.handle\">\n            <summary>\n            The handle to wrap.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance wrapping a managed object.\n            </summary>\n            <param name=\"obj\">The object to wrap.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"obj\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.op_Equality(FreeImageAPI.IO.fi_handle,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.op_Inequality(FreeImageAPI.IO.fi_handle,FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.IO.fi_handle.IsNull\">\n            <summary>\n            Gets whether the pointer is a null pointer.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.GetObject\">\n            <summary>\n            Returns the object assigned to the handle in case this instance\n            was created by managed code.\n            </summary>\n            <returns><see cref=\"T:System.Object\"/> assigned to this handle or null on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.IO.fi_handle\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.Equals(FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this object.</param>\n            <returns>True if the current object is equal to the other parameter; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.IO.fi_handle\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.CompareTo(FreeImageAPI.IO.fi_handle)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.IO.fi_handle\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.IO.fi_handle.Dispose\">\n            <summary>\n            Releases all resources used by the instance.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.IO.FreeImageIO\">\n            <summary>\n            Structure for implementing access to custom handles.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.FreeImageIO.readProc\">\n            <summary>\n            Delegate to the C++ function <b>fread</b>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.FreeImageIO.writeProc\">\n            <summary>\n            Delegate to the C++ function <b>fwrite</b>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.FreeImageIO.seekProc\">\n            <summary>\n            Delegate to the C++ function <b>fseek</b>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.IO.FreeImageIO.tellProc\">\n            <summary>\n            Delegate to the C++ function <b>ftell</b>.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.GifInformation\">\n            <summary>\n            Provides additional information specific for GIF files. This class cannot be inherited.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.GifInformation.#ctor(FreeImageAPI.FreeImageBitmap)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.Metadata.GifInformation\"/> class\n            with the specified <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>.\n            </summary>\n            <param name=\"bitmap\">A reference to a <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/> instance.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.GifInformation.UseGlobalPalette\">\n            <summary>\n            Gets or sets a value indicating whether this frame uses the\n            GIF image's global palette. If set to <b>false</b>, this\n            frame uses its local palette.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.GifInformation.CreateGlobalPalette\">\n            <summary>\n            Creates a global palette for the GIF image, intialized with all entries of the\n            current local palette.\n            The property <see cref=\"P:FreeImageAPI.Metadata.GifInformation.UseGlobalPalette\"/> will be set to <b>true</b> when\n            invoking this method. This effectively enables the newly created global palette.\n            </summary>\n            <exception cref=\"T:System.InvalidOperationException\">\n            The image does not have a palette.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.GifInformation.CreateGlobalPalette(System.Int32)\">\n            <summary>\n            Creates a global palette for the GIF image with the specified size, intialized\n            with the first <paramref name=\"size\"/> entries of the current local palette.\n            The property <see cref=\"P:FreeImageAPI.Metadata.GifInformation.UseGlobalPalette\"/> will be set to <b>true</b> when\n            invoking this method. This effectively enables the newly created global palette.\n            </summary>\n            <param name=\"size\">The size of the newly created global palette.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"palette\"/> is a null reference.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.GifInformation.CreateGlobalPalette(FreeImageAPI.Palette)\">\n            <summary>\n            Creates a global palette for the GIF image, intialized with the entries\n            of the specified palette.\n            The property <see cref=\"P:FreeImageAPI.Metadata.GifInformation.UseGlobalPalette\"/> will be set to <b>true</b> when\n            invoking this method. This effectively enables the newly created global palette.\n            </summary>\n            <param name=\"palette\">The palette that contains the initial values for\n            the newly created global palette.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"palette\"/> is a null reference.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.GifInformation.CreateGlobalPalette(FreeImageAPI.Palette,System.Int32)\">\n            <summary>\n            Creates a global palette for the GIF image with the specified size, intialized\n            with the first <paramref name=\"size\"/> entries of the specified palette.\n            The property <see cref=\"P:FreeImageAPI.Metadata.GifInformation.UseGlobalPalette\"/> will be set to <b>true</b> when\n            invoking this method. This effectively enables the newly created global palette.\n            </summary>\n            <param name=\"palette\">The palette that contains the initial values for\n            the newly created global palette.</param>\n            <param name=\"size\">The size of the newly created global palette.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"palette\"/> is a null reference.</exception>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.ImageMetadata\">\n            <summary>\n            Class handling metadata of a FreeImage bitmap.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.ImageMetadata.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:FreeImageAPI.FIBITMAP\"/>,\n            showing all known models.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.ImageMetadata.#ctor(FreeImageAPI.FIBITMAP,System.Boolean)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:FreeImageAPI.FIBITMAP\"/>,\n            showing or hiding empry models.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"hideEmptyModels\">When <b>true</b>, empty metadata models\n            will be hidden until a tag to this model is added.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.ImageMetadata.Item(FreeImageAPI.FREE_IMAGE_MDMODEL)\">\n            <summary>\n            Gets or sets the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\"/> of the specified type.\n            <para>In case the getter returns <c>null</c> the model is not contained\n            by the list.</para>\n            <para><c>null</c> can be used calling the setter to destroy the model.</para>\n            </summary>\n            <param name=\"model\">Type of the model.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\"/> object of the specified type.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.ImageMetadata.Item(System.Int32)\">\n            <summary>\n            Gets or sets the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\"/> at the specified index.\n            <para>In case the getter returns <c>null</c> the model is not contained\n            by the list.</para>\n            <para><c>null</c> can be used calling the setter to destroy the model.</para>\n            </summary>\n            <param name=\"index\">Index of the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\"/> within\n            this instance.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\"/>\n            object at the specified index.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.ImageMetadata.List\">\n            <summary>\n            Returns a list of all visible\n            <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\">MetadataModels</see>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.ImageMetadata.AddTag(FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Adds new tag to the bitmap or updates its value in case it already exists.\n            <see cref=\"P:FreeImageAPI.Metadata.MetadataTag.Key\"/> will be used as key.\n            </summary>\n            <param name=\"tag\">The tag to add or update.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"tag\"/> is null.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.ImageMetadata.Count\">\n            <summary>\n            Returns the number of visible\n            <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\">MetadataModels</see>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.ImageMetadata.HideEmptyModels\">\n            <summary>\n            Gets or sets whether empty\n            <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\">MetadataModels</see> are hidden.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.ImageMetadata.GetEnumerator\">\n            <summary>\n            Retrieves an object that can iterate through the individual\n            <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\">MetadataModels</see>\n            in this <see cref=\"T:FreeImageAPI.Metadata.ImageMetadata\"/>.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.IEnumerator\"/> for this <see cref=\"T:FreeImageAPI.Metadata.ImageMetadata\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.ImageMetadata.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.Metadata.ImageMetadata\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.ImageMetadata.CompareTo(FreeImageAPI.Metadata.ImageMetadata)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.Metadata.ImageMetadata\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.Metadata.ImageMetadata\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel\">\n            <summary>\n            Base class that represents a collection of all tags contained in a metadata model.\n            </summary>\n            <remarks>\n            The <b>MetedataModel</b> class is an abstract base class, which is inherited by\n            several derived classes, one for each existing metadata model.\n            </remarks> \n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.dib\">\n            <summary>\n            Handle to the encapsulated FreeImage-bitmap.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataModel.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.AddTag(FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Adds new tag to the bitmap or updates its value in case it already exists.\n            <see cref=\"P:FreeImageAPI.Metadata.MetadataTag.Key\"/> will be used as key.\n            </summary>\n            <param name=\"tag\">The tag to add or update.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"tag\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The tags model differs from this instances model.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.AddTag(System.Collections.Generic.IEnumerable{FreeImageAPI.Metadata.MetadataTag})\">\n            <summary>\n            Adds a list of tags to the bitmap or updates their values in case they already exist.\n            <see cref=\"P:FreeImageAPI.Metadata.MetadataTag.Key\"/> will be used as key.\n            </summary>\n            <param name=\"list\">A list of tags to add or update.</param>\n            <returns>Returns the number of successfully added tags.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"list\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.RemoveTag(System.String)\">\n            <summary>\n            Removes the specified tag from the bitmap.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"key\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.DestoryModel\">\n            <summary>\n            Destroys the metadata model\n            which will remove all tags of this model from the bitmap.\n            </summary>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetTag(System.String)\">\n            <summary>\n            Returns the specified metadata tag.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>The metadata tag.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"key\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.TagExists(System.String)\">\n            <summary>\n            Returns whether the specified tag exists.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>True in case the tag exists, else false.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"key\"/> is null.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataModel.List\">\n            <summary>\n            Returns a list of all metadata tags this instance represents.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetTagFromIndex(System.Int32)\">\n            <summary>\n            Returns the tag at the given index.\n            </summary>\n            <param name=\"index\">Index of the tag to return.</param>\n            <returns>The tag at the given index.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataModel.Item(System.Int32)\">\n            <summary>\n            Returns the metadata tag at the given index. This operation is slow when accessing all tags.\n            </summary>\n            <param name=\"index\">Index of the tag.</param>\n            <returns>The metadata tag.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"index\"/> is greater or equal <b>Count</b>\n            or index is less than zero.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetEnumerator\">\n            <summary>\n            Retrieves an object that can iterate through the individual MetadataTags in this MetadataModel.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.IEnumerator\"/> for the\n            <see cref=\"T:FreeImageAPI.Metadata.MetadataModel\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataModel.Count\">\n            <summary>\n            Returns the number of metadata tags this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataModel.Exists\">\n            <summary>\n            Returns whether this model exists in the bitmaps metadata structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.RegexSearch(System.String,FreeImageAPI.MD_SEARCH_FLAGS)\">\n            <summary>\n            Searches for a pattern in each metadata tag and returns the result as a list.\n            </summary>\n            <param name=\"searchPattern\">The regular expression to use for the search.</param>\n            <param name=\"flags\">A bitfield that controls which fields should be searched in.</param>\n            <returns>A list containing all found metadata tags.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <typeparamref name=\"searchPattern\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <typeparamref name=\"searchPattern\"/> is empty.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetTagValue``1(System.String)\">\n            <summary>\n            Returns the value of the specified tag.\n            </summary>\n            <typeparam name=\"T\">Type of the tag's data.</typeparam>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>The value of the specified tag.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetTagArray``1(System.String)\">\n            <summary>\n            Returns an array containing the data of the specified tag.\n            </summary>\n            <typeparam name=\"T\">The type of the tag's data.</typeparam>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>An array containing the data of the specified tag.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetTagText(System.String)\">\n            <summary>\n            Returns the string contained by the specified tag.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>The string contained by the specified tag.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetUInt32Array(System.String)\">\n            <summary>\n            Returns an array containg the data of the specified tag\n            as unsigned 32bit integer.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>An array containg the data of the specified tag\n            as unsigned 32bit integer.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.GetUInt32Value(System.String)\">\n            <summary>\n            Returns the value of the tag as unsigned 32bit integer.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <returns>The value of the tag as unsigned 32bit integer.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.SetTagValue``1(System.String,System.Nullable{``0})\">\n            <summary>\n            Sets the value of the specified tag.\n            </summary>\n            <typeparam name=\"T\">The type of the tag's data.</typeparam>\n            <param name=\"key\">The key of the tag.</param>\n            <param name=\"value\">The new value of the specified tag or null.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.SetTagValue(System.String,System.Object)\">\n            <summary>\n            Sets the value of the specified tag.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <param name=\"value\">The new value of the specified tag or null.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.SetTagValueUndefined(System.String,System.Byte[])\">\n            <summary>\n            Sets the value of the specified tag as undefined.\n            </summary>\n            <param name=\"key\">The key of the tag.</param>\n            <param name=\"value\">The new value of the specified tag or null.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToDirectionType(System.String)\">\n            <summary>\n            Returns the equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\"/> for the\n            specified <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"s\">The string containing the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\"/>.</param>\n            <returns>The equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\"/> for the\n            specified <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToString(System.Nullable{FreeImageAPI.Metadata.MetadataModel.DirectionReference})\">\n            <summary>\n            Returns the equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\"/> to convert.</param>\n            <returns>The equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToUnitType(System.String)\">\n            <summary>\n            Returns the equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\"/> for the\n            specified <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"s\">The string containing the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\"/>.</param>\n            <returns>The equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\"/> for the\n            specified <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToString(System.Nullable{FreeImageAPI.Metadata.MetadataModel.VelocityUnit})\">\n            <summary>\n            Returns the equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\"/> to convert.</param>\n            <returns>The equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToLongitudeType(System.String)\">\n            <summary>\n            Returns the equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\"/> for the\n            specified <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"s\">The string containing the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\"/>.</param>\n            <returns>The equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\"/> for the\n            specified <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToString(System.Nullable{FreeImageAPI.Metadata.MetadataModel.LongitudeType})\">\n            <summary>\n            Returns the equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\"/> to convert.</param>\n            <returns>The equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToLatitudeType(System.String)\">\n            <summary>\n            Returns the equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\"/> for the\n            specified <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"s\">The string containing the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\"/>.</param>\n            <returns>The equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\"/> for the\n            specified <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToString(System.Nullable{FreeImageAPI.Metadata.MetadataModel.LatitudeType})\">\n            <summary>\n            Returns the equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\"/> to convert.</param>\n            <returns>The equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToInteroperabilityType(System.String)\">\n            <summary>\n            Returns the equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\"/> for the\n            specified <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"s\">The string containing the <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\"/>.</param>\n            <returns>The equivalent <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\"/> for the\n            specified <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToString(System.Nullable{FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode})\">\n            <summary>\n            Returns the equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\"/> to convert.</param>\n            <returns>The equivalent <see cref=\"T:System.String\"/> for the\n            specified <see cref=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.VelocityUnit\">\n            <summary>\n            Specified different unit types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.VelocityUnit.Undefinied\">\n            <summary>\n            No or unknown type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.VelocityUnit.Kilometers\">\n            <summary>\n            Kilometers per hour.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.VelocityUnit.Miles\">\n            <summary>\n            Miles per hour.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.VelocityUnit.Knots\">\n            <summary>\n            Knots.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.DirectionReference\">\n            <summary>\n            Specifies different direction types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.DirectionReference.Undefined\">\n            <summary>\n            No or unknown direction type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.DirectionReference.TrueDirection\">\n            <summary>\n            True direction.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.DirectionReference.MagneticDirection\">\n            <summary>\n            Magnatic direction.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.LatitudeType\">\n            <summary>\n            Specifies the type of a latitude value.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.LatitudeType.Undefined\">\n            <summary>\n            No or unknown type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.LatitudeType.North\">\n            <summary>\n            North.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.LatitudeType.South\">\n            <summary>\n            South.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.LongitudeType\">\n            <summary>\n            Specifies the type of a longitude value.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.LongitudeType.Undefined\">\n            <summary>\n            No or unknown type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.LongitudeType.East\">\n            <summary>\n            East.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.LongitudeType.West\">\n            <summary>\n            West.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.AltitudeType\">\n            <summary>\n            Specifies different altitude types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.AltitudeType.Undefined\">\n            <summary>\n            No or unknown type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.AltitudeType.AboveSeaLevel\">\n            <summary>\n            East.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.AltitudeType.BelowSeaLevel\">\n            <summary>\n            West.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode\">\n            <summary>\n            Specifies interoperability types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode.Undefined\">\n            <summary>\n            No or unknown type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode.R98\">\n            <summary>\n            Indicates a file conforming to R98 file specification of Recommended\n            Exif Interoperability Rules (ExifR98) or to DCF basic file stipulated\n            by Design Rule for Camera File System.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.InteroperabilityMode.THM\">\n            <summary>\n            Indicates a file conforming to DCF thumbnail file stipulated by Design\n            rule for Camera File System. \n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation\">\n            <summary>\n            Specifies orientation of images.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.Undefined\">\n            <summary>\n            Undefinied orientation.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.TopLeft\">\n            <summary>\n            TopLeft.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.TopRight\">\n            <summary>\n            TopRight.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.BottomRight\">\n            <summary>\n            BottomRight.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.BottomLeft\">\n            <summary>\n            BottomLeft.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.LeftTop\">\n            <summary>\n            LeftTop.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.RightTop\">\n            <summary>\n            RightTop.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.RightBottom\">\n            <summary>\n            RightBottom.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataModel.ExifImageOrientation.LeftBottom\">\n            <summary>\n            LeftBottom.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataModel.ToString\">\n            <summary>\n            Converts the model of the MetadataModel object to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_ANIMATION\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_ANIMATION\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_ANIMATION.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.LogicalWidth\">\n            <summary>\n            Gets or sets the width of the entire canvas area, that each page is displayed in.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.LogicalHeight\">\n            <summary>\n            Gets or sets the height of the entire canvas area, that each page is displayed in.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.GlobalPalette\">\n            <summary>\n            Gets or sets the global palette of the GIF image.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.LoopCount\">\n            <summary>\n            Gets or sets the number of replays for the animation.\n            Use 0 (zero) to specify an infinte number of replays.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.FrameLeft\">\n            <summary>\n            Gets or sets the horizontal offset within the logical canvas area, this frame is to be displayed at.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.FrameTop\">\n            <summary>\n            Gets or sets the vertical offset within the logical canvas area, this frame is to be displayed at.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.NoLocalPalette\">\n            <summary>\n            Gets or sets a flag to supress saving the dib's attached palette\n            (making it use the global palette). The local palette is the palette used by a page.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.Interlaced\">\n            <summary>\n            Gets or sets a value indicating whether the image is interlaced.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.FrameTime\">\n            <summary>\n            Gets or sets the amout of time in milliseconds this frame is to be displayed.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_ANIMATION.DisposalMethod\">\n            <summary>\n            Gets or sets this frame's disposal method. Generally, this method defines, how to\n            remove or replace a frame when the next frame has to be drawn.<para/>\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_COMMENTS\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_COMMENTS\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_COMMENTS.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_COMMENTS.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_COMMENTS.Comment\">\n            <summary>\n            Gets or sets the comment of the image.\n            Supported formats are JPEG, PNG and GIF.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_CUSTOM\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_CUSTOM\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_CUSTOM.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_CUSTOM.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_EXIF_EXIF\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_EXIF\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_EXIF_EXIF.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ExifVersion\">\n            <summary>\n            Gets or sets the version of this standard supported.\n            Constant length or 4.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FlashpixVersion\">\n            <summary>\n            Gets or sets the Flashpix format version supported by a FPXR file.\n            Constant length or 4.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ColorSpace\">\n            <summary>\n            Gets or sets the color space information tag.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are defined:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>sRGB (default)</description>\n            \t</item>\n            \t<item>\n            \t\t<term>0xFFFF</term>\n            \t\t<description>uncalibrated</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.PixelXDimension\">\n            <summary>\n            Gets or sets the valid width of a compressed image.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.PixelYDimension\">\n            <summary>\n            Gets or sets the valid height of a compressed image.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ComponentsConfiguration\">\n            <summary>\n            Gets or sets components configuration. See remarks for further information.\n            Constant length of 4.\n            </summary>\n            <remarks>\n            The channels of each component are arranged in order from the 1st component to the 4th.\n            For uncompressed data the data arrangement is given in the PhotometricInterpretation tag.\n            However, since PhotometricInterpretation can only express the order of Y,Cb and Cr,\n            this tag is provided for cases when compressed data uses components other than Y, Cb,\n            and Cr and to enable support of other sequences.<para/>\n            Default = 4 5 6 0 (if RGB uncompressed)<para/>\n            The following values are defined:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>does not exist</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>Y</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>Cb</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>Cr</description>\n            \t</item>\n            \t<item>\n            \t\t<term>4</term>\n            \t\t<description>R</description>\n            \t</item>\n            \t<item>\n            \t\t<term>5</term>\n            \t\t<description>R</description>\n            \t</item>\n            \t<item>\n            \t\t<term>6</term>\n            \t\t<description>R</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.CompressedBitsPerPixel\">\n            <summary>\n            Gets or sets compression mode used for a compressed image is indicated\n            in unit bits per pixel.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.MakerNote\">\n            <summary>\n            Gets or sets a tag for manufacturers of Exif writers to record any desired information.\n            The contents are up to the manufacturer, but this tag should not be used for any other\n            than its intended purpose.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.UserComment\">\n            <summary>\n            Gets or sets a tag for Exif users to write keywords or comments on the image besides\n            those in ImageDescription, and without the character code limitations of the ImageDescription tag.\n            Minimum length of 8. See remarks for further information.\n            </summary>\n            <remarks>\n            The character code used in the UserComment tag is identified based on an ID code in a fixed 8-byte\n            area at the start of the tag data area. The unused portion of the area is padded with NULL.\n            The ID code for the UserComment area may be a Defined code such as JIS or ASCII, or may be Undefined.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.RelatedSoundFile\">\n            <summary>\n            Gets or sets the name of an audio file related to the image data.\n            The format is 8.3.\n            Constant length of 12\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.DateTimeOriginal\">\n            <summary>\n            Gets or sets the date and time when the original image data was generated.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.DateTimeDigitized\">\n            <summary>\n            Gets or sets the date and time when the image was stored as digital data.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubsecTime\">\n            <summary>\n            Gets or sets a tag used to record fractions of seconds for the DateTime tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubsecTimeOriginal\">\n            <summary>\n            Gets or sets a tag used to record fractions of seconds for the DateTimeOriginal tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubsecTimeDigitized\">\n            <summary>\n            Gets or sets a tag used to record fractions of seconds for the DateTimeDigitized tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ExposureTime\">\n            <summary>\n            Gets or the exposure time, given in seconds (sec).\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FNumber\">\n            <summary>\n            Gets or the F number.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ExposureProgram\">\n            <summary>\n            Gets or sets the class of the program used by the camera to set exposure when the\n            picture is taken.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are defined:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>not defined</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>manual</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>normal program</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>aperture priority</description>\n            \t</item>\n            \t<item>\n            \t\t<term>4</term>\n            \t\t<description>shutter priority</description>\n            \t</item>\n            \t<item>\n            \t\t<term>5</term>\n            \t\t<description>create program</description>\n            \t</item>\n            \t<item>\n            \t\t<term>6</term>\n            \t\t<description>action program</description>\n            \t</item>\n            \t<item>\n            \t\t<term>7</term>\n            \t\t<description>portrait mode</description>\n            \t</item>\n            \t<item>\n            \t\t<term>8</term>\n            \t\t<description>landscape mode</description>\n            \t</item>\n            \t<item>\n            \t\t<term>others</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SpectralSensitivity\">\n            <summary>\n            Gets or sets the spectral sensitivity of each channel of the camera used.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ISOSpeedRatings\">\n            <summary>\n            Gets or sets the the ISO Speed and ISO Latitude of the camera or input device as\n            specified in ISO 12232.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.OECF\">\n            <summary>\n            Gets or sets the Opto-Electric Conversion Function (OECF) specified in ISO 14524.\n            OECF is the relationship between the camera optical input and the image values.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ShutterSpeedValue\">\n            <summary>\n            Gets or sets the shutter speed. The unit is the APEX (Additive System of Photographic Exposure).\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ApertureValue\">\n            <summary>\n            Gets or sets the lens aperture. The unit is the APEX value.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.BrightnessValue\">\n            <summary>\n            Gets or sets the value of brightness. The unit is the APEX value.\n            Ordinarily it is given in the range of -99.99 to 99.99.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ExposureBiasValue\">\n            <summary>\n            Gets or sets the exposure bias. The unit is the APEX value.\n            Ordinarily it is given in the range of ?9.99 to 99.99.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.MaxApertureValue\">\n            <summary>\n            Gets or sets the smallest F number of the lens. The unit is the APEX value.\n            Ordinarily it is given in the range of 00.00 to 99.99,\n            but it is not limited to this range.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubjectDistance\">\n            <summary>\n            Gets or sets distance to the subject, given in meters.\n            Note that if the numerator of the recorded value is FFFFFFFF, infinity shall be indicated;\n            and if the numerator is 0, distance unknown shall be indicated.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.MeteringMode\">\n            <summary>\n            Gets or sets the metering mode. See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are defined:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>unknown</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>average</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>center-weighted-average</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>spot</description>\n            \t</item>\n            \t<item>\n            \t\t<term>4</term>\n            \t\t<description>multi-spot</description>\n            \t</item>\n            \t<item>\n            \t\t<term>5</term>\n            \t\t<description>pattern</description>\n            \t</item>\n            \t<item>\n            \t\t<term>6</term>\n            \t\t<description>partial</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            \t<item>\n            \t\t<term>255</term>\n            \t\t<description>other</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.LightSource\">\n            <summary>\n            Gets or sets the kind of light source.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are defined:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>unknown</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>daylight</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>fluorescent</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>tungsten</description>\n            \t</item>\n            \t<item>\n            \t\t<term>4</term>\n            \t\t<description>flash</description>\n            \t</item>\n            \t<item>\n            \t\t<term>9</term>\n            \t\t<description>fine weather</description>\n            \t</item>\n            \t<item>\n            \t\t<term>10</term>\n            \t\t<description>cloudy weather</description>\n            \t</item>\n            \t<item>\n            \t\t<term>11</term>\n            \t\t<description>shade</description>\n            \t</item>\n            \t<item>\n            \t\t<term>12</term>\n            \t\t<description>daylight fluorecent (D 5700 - 7100K)</description>\n            \t</item>\n            \t<item>\n            \t\t<term>13</term>\n            \t\t<description>day white fluorescent (N 4600 - 5400K)</description>\n            \t</item>\n            \t<item>\n            \t\t<term>14</term>\n            \t\t<description>cool white fluorescent (W 3900 - 4500K)</description>\n            \t</item>\n            \t<item>\n            \t\t<term>15</term>\n            \t\t<description>white fluorescent (WW 3200 - 3700K)</description>\n            \t</item>\n            \t<item>\n            \t\t<term>17</term>\n            \t\t<description>standard light A</description>\n            \t</item>\n            \t<item>\n            \t\t<term>18</term>\n            \t\t<description>standard light B</description>\n            \t</item>\n            \t<item>\n            \t\t<term>19</term>\n            \t\t<description>standard light C</description>\n            \t</item>\n            \t<item>\n            \t\t<term>20</term>\n            \t\t<description>D55</description>\n            \t</item>\n            \t<item>\n            \t\t<term>21</term>\n            \t\t<description>D65</description>\n            \t</item>\n            \t<item>\n            \t\t<term>22</term>\n            \t\t<description>D75</description>\n            \t</item>\n            \t<item>\n            \t\t<term>23</term>\n            \t\t<description>D50</description>\n            \t</item>\n            \t<item>\n            \t\t<term>24</term>\n            \t\t<description>ISO studio tungsten</description>\n            \t</item>\n            \t<item>\n            \t\t<term>255</term>\n            \t\t<description>other light source</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.Flash\">\n            <summary>\n            Gets or sets a value indicating the status of flash when the image was shot.\n            Bit 0 indicates the flash firing status, bits 1 and 2 indicate the flash return\n            status, bits 3 and 4 indicate the flash mode, bit 5 indicates whether the flash\n            function is present, and bit 6 indicates \"red eye\" mode.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubjectArea\">\n            <summary>\n            Gets or sets a value indicating the location and area of the main subject in\n            the overall scene. Variable length between 2 and 4.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FocalLength\">\n            <summary>\n            Gets or sets the actual focal length of the lens, in mm.\n            Conversion is not made to the focal length of a 35 mm film camera.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FlashEnergy\">\n            <summary>\n            Gets or sets the strobe energy at the time the image is captured,\n            as measured in Beam Candle Power Seconds (BCPS).\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SpatialFrequencyResponse\">\n            <summary>\n            Gets or sets the camera or input device spatial frequency table and SFR values\n            in the direction of image width, image height, and diagonal direction,\n            as specified in ISO 12233.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FocalPlaneXResolution\">\n            <summary>\n            Gets or sets the number of pixels in the image width (X) direction per\n            FocalPlaneResolutionUnit on the camera focal plane.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FocalPlaneYResolution\">\n            <summary>\n            Gets or sets the number of pixels in the image height (Y) direction per\n            FocalPlaneResolutionUnit on the camera focal plane.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FocalPlaneResolutionUnit\">\n            <summary>\n            Gets or sets the unit for measuring FocalPlaneXResolution and FocalPlaneYResolution.\n            This value is the same as the ResolutionUnit.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubjectLocation\">\n            <summary>\n            Gets or sets the location of the main subject in the scene.\n            The value of this tag represents the pixel at the center of the main subject\n            relative to the left edge, prior to rotation processing as per the Rotation tag.\n            The first value indicates the X column number and second indicates the Y row number.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ExposureIndex\">\n            <summary>\n            Gets or sets the exposure index selected on the camera or input device at the\n            time the image was captured.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SensingMethod\">\n            <summary>\n            Gets or sets the image sensor type on the camera or input device.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are defined:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>not defined</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>one-chip color area sensor</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>two-chip color area sensor</description>\n            \t</item>\n            \t<item>\n            \t\t<term>4</term>\n            \t\t<description>three-chip color area sensor</description>\n            \t</item>\n            \t<item>\n            \t\t<term>5</term>\n            \t\t<description>color sequential area sensor</description>\n            \t</item>\n            \t<item>\n            \t\t<term>7</term>\n            \t\t<description>trilinear sensor</description>\n            \t</item>\n            \t<item>\n            \t\t<term>8</term>\n            \t\t<description>color sequential linear sensor</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FileSource\">\n            <summary>\n            Gets or sets the image source. If a DSC recorded the image, this tag value of this\n            tag always be set to 3, indicating that the image was recorded on a DSC.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SceneType\">\n            <summary>\n            Gets or sets the type of scene. If a DSC recorded the image, this tag value shall\n            always be set to 1, indicating that the image was directly photographed.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.CFAPattern\">\n            <summary>\n            Gets or sets the color filter array (CFA) geometric pattern of the image sensor\n            when a one-chip color area sensor is used. It does not apply to all sensing methods.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.CustomRendered\">\n            <summary>\n            Gets or sets the use of special processing on image data, such as rendering geared to output.\n            When special processing is performed, the reader is expected to disable or minimize any\n            further processing. See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>normal process</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>custom process</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ExposureMode\">\n            <summary>\n            Gets or sets the exposure mode set when the image was shot.\n            In auto-bracketing mode, the camera shoots a series of frames of the same scene\n            at different exposure settings. See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>auto exposure</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>manual exposure</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>auto bracket</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.WhiteBalance\">\n            <summary>\n            Gets or sets the white balance mode set when the image was shot.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>auto white balance</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>manual white balance</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.DigitalZoomRatio\">\n            <summary>\n            Gets or sets the digital zoom ratio when the image was shot.\n            If the numerator of the recorded value is 0, this indicates that digital zoom was not used.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.FocalLengthIn35mmFilm\">\n            <summary>\n            Gets or sets the equivalent focal length assuming a 35mm film camera, in mm.\n            A value of 0 means the focal length is unknown. Note that this tag differs\n            from the FocalLength tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SceneCaptureType\">\n            <summary>\n            Gets or sets the type of scene that was shot.\n            It can also be used to record the mode in which the image was shot.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>standard</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>landscape</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>portrait</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>night scene</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.GainControl\">\n            <summary>\n            Gets or sets the degree of overall image gain adjustment.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>none</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>low gain up</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>high gain up</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>low gain down</description>\n            \t</item>\n            \t<item>\n            \t\t<term>4</term>\n            \t\t<description>high gain down</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.Contrast\">\n            <summary>\n            Gets or sets the direction of contrast processing applied by the camera\n            when the image was shot.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>normal</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>soft</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>hard</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.Saturation\">\n            <summary>\n            Gets or sets the direction of saturation processing applied by the camera\n            when the image was shot.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>normal</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>low saturation</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>high saturation</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.Sharpness\">\n            <summary>\n            Gets or sets the direction of sharpness processing applied by the camera\n            when the image was shot.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>normal</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>soft</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>hard</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.DeviceSettingDescription\">\n            <summary>\n            Gets or sets information on the picture-taking conditions of a particular camera model.\n            The tag is used only to indicate the picture-taking conditions in the reader.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.SubjectDistanceRange\">\n            <summary>\n            Gets or sets the distance to the subject.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>0</term>\n            \t\t<description>unknown</description>\n            \t</item>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>macro</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>close view</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>distant view</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_EXIF.ImageUniqueID\">\n            <summary>\n            Gets or sets an identifier assigned uniquely to each image.\n            It is recorded as an ASCII string equivalent to hexadecimal notation and 128-bit fixed length.\n            Constant length of 32.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_EXIF_GPS\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_GPS\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_EXIF_GPS.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.VersionID\">\n            <summary>\n            Gets or sets the GPS version ID. Constant length of 4.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.LatitudeDirection\">\n            <summary>\n            Gets or sets a value indicating whether the <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Latitude\"/>\n            is north or south latitude.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Latitude\">\n            <summary>\n            Gets or sets the latitude of the image. The latitude is expressed as three rational\n            values giving the degrees, minutes, and seconds, respectively. Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.LatitudeDirection\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.LongitudeDirection\">\n            <summary>\n            Gets or sets a value indicating whether <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Longitude\"/>\n            is east or west longitude.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Longitude\">\n            <summary>\n            Gets or sets the longitude of the image. The longitude is expressed as three rational\n            values giving the degrees, minutes, and seconds, respectively. Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.LongitudeDirection\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.AltitudeDirection\">\n            <summary>\n            Gets a value indicating whether <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Altitude\"/> is sea level and the altitude\n            is above sea level. If the altitude is below sea level <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Altitude\"/> is\n            indicated as an absolute value.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Altitude\">\n            <summary>\n            Gets or sets the altitude based on the reference in <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.AltitudeDirection\"/>.\n            Altitude is expressed as one rational value. The reference unit is meters.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.AltitudeSign\">\n            <summary>\n            Gets or sets the sign of the <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.SignedAltitude\"/>.\n            </summary>\n            <remarks>\n            This is a derived property. There is no metadata tag directly associated\n            with this property value.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.SignedAltitude\">\n            <summary>\n            Gets or sets the signed altitude.\n            Altitude is expressed as one rational value. The reference unit is meters.\n            </summary>\n            <exception cref=\"T:System.OverflowException\">\n            Altitude is too large to fit into a FIRational.\n            </exception>\n            <remarks>\n            This is a derived property. There is no metadata tag directly associated\n            with this property value.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.TimeStamp\">\n            <summary>\n            Gets or sets the time as UTC (Coordinated Universal Time). Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Satellites\">\n            <summary>\n            Gets or sets the GPS satellites used for measurements. This tag can be used to describe\n            the number of satellites, their ID number, angle of elevation, azimuth, SNR and other\n            information in ASCII notation. The format is not specified.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Status\">\n            <summary>\n            Gets or sets a value indicating the status of the GPS receiver when the image was recorded.\n            <b>true</b> indicates measurement was in progress;\n            <b>false</b> indicates measurement was Interoperability.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.MeasureMode3D\">\n            <summary>\n            Gets or sets a value indicating the GPS measurement mode.\n            <b>true</b> indicates three-dimensional measurement;\n            <b>false</b> indicated two-dimensional measurement was in progress.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DOP\">\n            <summary>\n            Gets or sets the GPS DOP (data degree of precision). An HDOP value is written during\n            two-dimensional measurement, and PDOP during three-dimensional measurement.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.SpeedUnit\">\n            <summary>\n            Gets or sets the unit used to express the GPS receiver <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Speed\"/> of movement.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Speed\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Speed\">\n            <summary>\n            Gets or sets the speed of GPS receiver movement.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.SpeedUnit\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.TrackDirectionReference\">\n            <summary>\n            Gets or sets the reference for giving the direction of GPS receiver movement.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Track\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Track\">\n            <summary>\n            Gets or sets the direction of GPS receiver movement.\n            The range of values is from 0.00 to 359.99.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.TrackDirectionReference\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.ImageDirectionReference\">\n            <summary>\n            Gets or sets the reference for giving the direction of GPS receiver movement.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.ImageDirection\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.ImageDirection\">\n            <summary>\n            Gets or sets the direction of the image when it was captured.\n            The range of values is from 0.00 to 359.99.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.ImageDirectionReference\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.MapDatum\">\n            <summary>\n            Gets or sets the geodetic survey data used by the GPS receiver. If the survey data\n            is restricted to Japan, the value of this tag is 'TOKYO' or 'WGS-84'.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationLatitudeDirection\">\n            <summary>\n            Gets or sets a value indicating whether the destination point\n            is north or south latitude.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Latitude\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationLatitude\">\n            <summary>\n            Gets or sets the latitude of the destination point. The latitude is expressed as three rational\n            values giving the degrees, minutes, and seconds, respectively. Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationLatitudeDirection\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationLongitudeDirection\">\n            <summary>\n            Gets or sets a value indicating whether the destination point\n            is east or west longitude.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.Latitude\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationLongitude\">\n            <summary>\n            Gets or sets the longitude of the destination point. The longitude is expressed as three rational\n            values giving the degrees, minutes, and seconds, respectively. Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationDirectionReference\">\n            <summary>\n            Gets or sets the reference used for giving the bearing to the destination point.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationBearing\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationBearing\">\n            <summary>\n            Gets or sets the bearing to the destination point.\n            The range of values is from 0.00 to 359.99.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationDirectionReference\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationUnit\">\n            <summary>\n            Gets or sets the unit used to express the distance to the destination point.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DestinationBearing\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.ProcessingMethod\">\n            <summary>\n            Gets or sets a character string recording the name of the method used\n            for location finding. The first byte indicates the character code used,\n            and this is followed by the name of the method. Since the Type is not ASCII,\n            NULL termination is not necessary.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.AreaInformation\">\n            <summary>\n            Gets or sets a character string recording the name of the GPS area.\n            The first byte indicates the character code used, and this is followed by\n            the name of the GPS area. Since the Type is not ASCII, NULL termination is\n            not necessary. \n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DateTimeStamp\">\n            <summary>\n            Gets or sets date and time information relative to UTC (Coordinated Universal Time). \n            </summary>\n            <remarks>\n            This is a derived property. There is no metadata tag directly associated\n            with this property value.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.DateStamp\">\n            <summary>\n            Gets or sets date information relative to UTC (Coordinated Universal Time).\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_GPS.IsDifferential\">\n            <summary>\n            Gets or sets a value indicating whether differential correction was applied to\n            the GPS receiver. \n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_INTEROP\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_INTEROP\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_INTEROP.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_INTEROP.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_INTEROP.Identification\">\n            <summary>\n            Gets or sets the identification of the Interoperability rule.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_MAIN\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_MAIN\"/>.\n            <para/>\n            <b>This class is obsolete. Use class <see cref=\"T:FreeImageAPI.Metadata.MDM_EXIF_MAIN\"/> instead.</b>\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_MAIN.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_EXIF_MAIN\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_MAIN\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_EXIF_MAIN.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ImageWidth\">\n            <summary>\n            Gets or sets the number of columns of image data, equal to the number\n            of pixels per row. In JPEG compressed data a JPEG marker is used\n            instead of this tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ImageHeight\">\n            <summary>\n            Gets or sets number of rows of image data. In JPEG compressed data a JPEG marker\n            is used instead of this tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.BitsPerSample\">\n            <summary>\n            Gets or sets number of bits per image component. In this standard\n            each component of the image is 8 bits, so the value for this tag is 8.\n            Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Compression\">\n            <summary>\n            Gets or sets compression scheme used for the image data. When a primary image\n            is JPEG compressed, this designation is not necessary and is omitted.\n            When thumbnails use JPEG compression, this tag value is set to 6.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.PhotometricInterpretation\">\n            <summary>\n            Gets or sets pixel composition. In JPEG compressed data a JPEG marker is\n            used instead of this tag. See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>RGB</description>\n            \t</item>\n            \t<item>\n            \t\t<term>6</term>\n            \t\t<description>YCbCr</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Orientation\">\n            <summary>\n            Gets or sets the image orientation viewed in terms of rows and columns.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.SamplesPerPixel\">\n            <summary>\n            Gets or sets the number of components per pixel. Since this standard applies\n            to RGB and YCbCr images, the value set for this tag is 3. In JPEG compressed\n            data a JPEG marker is used instead of this tag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.PlanarConfiguration\">\n            <summary>\n            Gets or sets a value that indicates whether pixel components are recorded in\n            chunky or planar format. In JPEG compressed files a JPEG marker is used instead\n            of this tag. If this field does not exist, the TIFF default of 1 (chunky) is assumed.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>chunky format</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>planar format</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.YCbCrSubSampling\">\n            <summary>\n            Gets or sets the sampling ratio of chrominance components in relation to\n            the luminance component. In JPEG compressed dat a JPEG marker is used\n            instead of this tag.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>[2,1]</term>\n            \t\t<description>YCbCr4:2:2</description>\n            \t</item>\n            \t<item>\n            \t\t<term>[2,2]</term>\n            \t\t<description>YCbCr4:2:0</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.YCbCrPositioning\">\n            <summary>\n            Gets or sets position of chrominance components in relation to the luminance component.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            This field is designated only for JPEG compressed data or uncompressed YCbCr data.\n            The TIFF default is 1 (centered); but when Y:Cb:Cr = 4:2:2 it is recommended in\n            this standard that 2 (co-sited) be used to record data, in order to improve the\n            image quality when viewed on TV systems.\n            <para/>\n            When this field does not exist, the reader shall assume the TIFF default.\n            In the case of Y:Cb:Cr = 4:2:0, the TIFF default (centered) is recommended.\n            If the reader does not have the capability of supporting both kinds of YCbCrPositioning,\n            it shall follow the TIFF default regardless of the value in this field.\n            It is preferable that readers be able to support both centered and co-sited positioning.\n            <para/>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>1</term>\n            \t\t<description>centered</description>\n            \t</item>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>co-sited</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>reserved</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.XResolution\">\n            <summary>\n            Gets or sets the number of pixels per <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ResolutionUnit\"/>\n            in the <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ImageWidth\"/> direction. When the image resolution is unknown,\n            72 [dpi] is designated.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.YResolution\">\n            <summary>\n            Gets or sets the number of pixels per <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ResolutionUnit\"/>\n            in the <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ImageHeight\"/> direction. When the image resolution is unknown,\n            72 [dpi] is designated.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ResolutionUnit\">\n            <summary>\n            Gets or sets the unit for measuring <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.XResolution\"/> and <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.YResolution\"/>.\n            The same unit is used for both <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.XResolution\"/> and <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.YResolution\"/>.\n            If the image resolution in unknown, 2 (inches) is designated.\n            See remarks for further information.\n            </summary>\n            <remarks>\n            The following values are definied:<para/>\n            <list type=\"table\">\n            \t<listheader>\n            \t\t<term>ID</term>\n            \t\t<description>Description</description>\n            \t</listheader>\n            \t<item>\n            \t\t<term>2</term>\n            \t\t<description>inches</description>\n            \t</item>\n            \t<item>\n            \t\t<term>3</term>\n            \t\t<description>YCbCr4:2:0</description>\n            \t</item>\n            \t<item>\n            \t\t<term>other</term>\n            \t\t<description>centimeters</description>\n            \t</item>\n            </list>\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.StripOffsets\">\n            <summary>\n            Gets or sets the byte offset of that strip.\n            It is recommended that this be selected so the number of strip bytes\n            does not exceed 64 Kbytes.\n            With JPEG compressed data this designation is not needed and is omitted.\n            Constant length of <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.SamplesPerPixel\"/> * StripsPerImage.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.RowsPerStrip\"/>\n            <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.StripByteCounts\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.RowsPerStrip\">\n            <summary>\n            Gets or sets number of rows per strip. This is the number of rows in the image of\n            one strip when an image is divided into strips. With JPEG compressed data this\n            designation is not needed and is omitted.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n            <seealso cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.StripByteCounts\"/>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.StripByteCounts\">\n            <summary>\n            Gets or sets the total number of bytes in each strip.\n            With JPEG compressed data this designation is not needed and is omitted.\n            Constant length of <see cref=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.SamplesPerPixel\"/> * StripsPerImage.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.JPEGInterchangeFormat\">\n            <summary>\n            Gets or sets the offset to the start byte (SOI) of JPEG compressed thumbnail data.\n            This is not used for primary image JPEG data.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.JPEGInterchangeFormatLength\">\n            <summary>\n            Gets or sets the number of bytes of JPEG compressed thumbnail data.\n            </summary>\n            <remarks>\n            This is not used for primary image JPEG data.\n            JPEG thumbnails are not divided but are recorded as a continuous\n            JPEG bitstream from SOI to EOI. APPn and COM markers should not be recorded.\n            Compressed thumbnails shall be recorded in no more than 64 Kbytes,\n            including all other data to be recorded in APP1.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.TransferFunction\">\n            <summary>\n            Gets or sets a transfer function for the image, described in tabular style.\n            Constant length of 3 * 256.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.WhitePoint\">\n            <summary>\n            Gets or sets the chromaticity of the white point of the image.\n            Constant length of 2.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.PrimaryChromaticities\">\n            <summary>\n            Gets or sets the chromaticity of the three primary colors of the image.\n            Constant length of 6.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.YCbCrCoefficients\">\n            <summary>\n            Gets or sets the matrix coefficients for transformation from RGB to YCbCr image data.\n            Constant length of 3.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ReferenceBlackWhite\">\n            <summary>\n            Gets or sets the reference black point value and reference white point value.\n            Constant length of 6.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.DateTime\">\n            <summary>\n            Gets or sets the date and time of image creation.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.ImageDescription\">\n            <summary>\n            Gets or sets a string giving the title of the image.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Make\">\n            <summary>\n            Gets or sets the manufacturer of the recording equipment.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.EquipmentModel\">\n            <summary>\n            Gets or sets the model name or model number of the equipment.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Software\">\n            <summary>\n            Gets or sets the name and version of the software or firmware of the camera\n            or image input device used to generate the image.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Artist\">\n            <summary>\n            Gets or sets the name of the camera owner, photographer or image creator.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_EXIF_MAIN.Copyright\">\n            <summary>\n            Gets or sets the photographer and editor copyrights.\n            Constant length of 1-2.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_MAKERNOTE\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_MAKERNOTE\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_MAKERNOTE.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_MAKERNOTE.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_GEOTIFF\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_GEOTIFF\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_GEOTIFF.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.GeoASCIIParams\">\n            <summary>\n            Gets or sets the value of the GeoTIFF GeoASCIIParamsTag.\n            </summary>\n            <remarks>\n            The GeoASCIIParamsTag is used to store all of the <see cref=\"T:System.String\"/> valued\n            GeoKeys, referenced by the <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.GeoKeyDirectory\"/> property. Since keys\n            defined in the GeoKeyDirectoryTag use offsets into this tag, any special\n            comments may be placed at the beginning of this tag.\n            For the most part, the only keys that are <see cref=\"T:System.String\"/> valued are\n            <i>Citation</i> keys, giving documentation and references for obscure\n            projections, datums, etc.\n            <para/>\n            Special handling is required for <see cref=\"T:System.String\"/>-valued keys. While it\n            is true that TIFF 6.0 permits multiple NULL-delimited strings within a single\n            ASCII tag, the secondary strings might not appear in the output of naive\n            <i>tiffdump</i> programs. For this reason, the NULL delimiter of each ASCII key\n            value shall be converted to a \"|\" (pipe) character before being installed\n            back into the <see cref=\"T:System.String\"/> holding tag, so that a dump of the tag\n            will look like this.\n            <para/>\n            AsciiTag=\"first_value|second_value|etc...last_value|\"\n            <para/>\n            A baseline GeoTIFF-reader must check for and convert the final \"|\" pipe \n            character of a key back into a NULL before returning it to the client \n            software.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.GeoDoubleParams\">\n            <summary>\n            Gets or sets the value of the GeoTIFF GeoDoubleParamsTag.\n            </summary>\n            <remarks>\n            The GeoDoubleParamsTag is used to store all of the <see cref=\"T:System.Double\"/> valued\n            GeoKeys, referenced by the <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.GeoKeyDirectory\"/> property. The meaning of\n            any value of this double array is determined from the GeoKeyDirectoryTag reference\n            pointing to it. <see cref=\"T:System.Single\"/> values should first be converted to\n            <see cref=\"T:System.Double\"/> and stored here.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.GeoKeyDirectory\">\n            <summary>\n            Gets or sets the value of the GeoTIFF GeoKeyDirectoryTag.\n            </summary>\n            <remarks>\n            The GeoKeyDirectoryTag may be used to store the GeoKey Directory, which defines and\n            references the <i>GeoKeys</i>.\n            <para/>\n            The tag is an array of unsigned <see cref=\"T:System.UInt16\"/> values, which are primarily\n            grouped into blocks of 4. The first 4 values are special, and contain GeoKey directory\n            header information. The header values consist of the following information, in order:\n            <para/>\n            Header={KeyDirectoryVersion, KeyRevision, MinorRevision, NumberOfKeys}\n            <para/>\n            where\n            <para/>\n            <i>KeyDirectoryVersion</i> indicates the current version of Key implementation, and will\n            only change if this Tag's Key structure is changed. (Similar to the TIFFVersion (42)).\n            The current DirectoryVersion number is 1. This value will most likely never change,\n            and may be used to ensure that this is a valid Key-implementation.\n            <para/>\n            <i>KeyRevision</i> indicates what revision of Key-Sets are used.\n            <para/>\n            <i>MinorRevision</i> indicates what set of Key-Codes are used. The complete revision number\n            is denoted &lt;KeyRevision&gt;.&lt;MinorRevision&gt;.\n            <para/>\n            <i>NumberOfKeys</i> indicates how many Keys are defined by the rest of this Tag.\n            <para/>\n            This header is immediately followed by a collection of &lt;NumberOfKeys&gt; KeyEntry\n            sets, each of which is also 4-<see cref=\"T:System.UInt16\"/> long. Each KeyEntry is modeled on the\n            <i>TIFFEntry</i> format of the TIFF directory header, and is of the form:\n            <para/>\n            KeyEntry = { KeyID, TIFFTagLocation, Count, Value_Offset }\n            <para/>\n            where\n            <para/>\n            <i>KeyID</i> gives the Key-ID value of the Key (identical in function to TIFF tag ID,\n            but completely independent of TIFF tag-space),\n            <para/>\n            <i>TIFFTagLocation</i> indicates which TIFF tag contains the value(s) of the Key: if\n            TIFFTagLocation is 0, then the value is <see cref=\"T:System.UInt16\"/>, and is contained in the\n            <i>Value_Offset</i> entry. Otherwise, the type (format) of the value is implied by the\n            TIFF-Type of the tag containing the value.\n            <para/>\n            <i>Count</i> indicates the number of values in this key.\n            <para/>\n            <i>Value_Offset</i> Value_Offset indicates the index-offset into the TagArray indicated\n            by TIFFTagLocation, if it is nonzero. If TIFFTagLocation is 0 (zero) , then Value_Offset \n            contains the actual (<see cref=\"T:System.UInt16\"/>) value of the Key, and Count=1 is implied.\n            Note that the offset is not a byte-offset, but rather an index based on the natural data\n            type of the specified tag array.\n            <para/>\n            Following the KeyEntry definitions, the KeyDirectory tag may also contain additional\n            values. For example, if a key requires multiple <see cref=\"T:System.UInt16\"/> values, they shall\n            be placed at the end of this tag, and the KeyEntry will set\n            TIFFTagLocation=GeoKeyDirectoryTag, with the Value_Offset pointing to the location of the\n            value(s).\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelPixelScale\">\n            <summary>\n            Gets or sets the value of the GeoTIFF ModelPixelScaleTag.\n            </summary>\n            <remarks>\n            The ModelPixelScaleTag tag may be used to specify the size of raster pixel spacing\n            in the model space units, when the raster space can be embedded in the model space\n            coordinate system without rotation, and consists of the following 3 values:\n            <para/>\n            ModelPixelScaleTag = (ScaleX, ScaleY, ScaleZ)\n            <para/>\n            where <i>ScaleX</i> and <i>ScaleY</i> give the horizontal and vertical spacing of\n            raster pixels. The <i>ScaleZ</i> is primarily used to map the pixel value of a\n            digital elevation model into the correct Z-scale, and so for most other purposes\n            this value should be zero (since most model spaces are 2-D, with Z=0).\n            <para/>\n            A single tiepoint in the <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTiePoints\"/> tag, together with this tag,\n            completely determine the relationship between raster and model space; thus they\n            comprise the two tags which Baseline GeoTIFF files most often will use to place a\n            raster image into a \"standard position\" in model space.\n            <para/>\n            Like the <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTiePoints\"/> tag, this tag information is independent of the\n            XPosition, YPosition, Resolution and Orientation tags of the standard TIFF 6.0 spec.\n            However, simple reversals of orientation between raster and model space\n            (e.g. horizontal or vertical flips) may be indicated by reversal of sign in the\n            corresponding component of the ModelPixelScaleTag. GeoTIFF compliant readers must\n            honor this signreversal convention.\n            <para/>\n            This tag must not be used if the raster image requires rotation or shearing to place\n            it into the standard model space. In such cases the transformation shall be defined\n            with the more general <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTransformationMatrix\"/>.\n            <para/>\n            <br/><b>Naming differences</b><para/>\n            In the native FreeImage library and thus, in the FreeImage API documentation, this\n            property's key is named <i>GeoPixelScale</i>. Since the GeoTIFF specification\n            as well as Java's <c>EXIFTIFFTagSet</c> class call this tag\n            <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelPixelScale\"/>, this property was renamed accordingly.\n            However, when accessing this property's tag by its <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> object,\n            the native FreeImage tag key <i>GeoPixelScale</i> must be used.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTiePoints\">\n            <summary>\n            Gets or sets the value of the GeoTIFF GeoTiePointsTag.\n            </summary>\n            <remarks>\n            The GeoTiePointsTag stores raster -> model tiepoint pairs in the order\n            <para/>\n            ModelTiePoints = (...,I,J,K, X,Y,Z...),\n            <para/>\n            where <i>(I,J,K)</i> is the point at location <i>(I,J)</i> in raster space with \n            pixel-value <i>K</i>, and <i>(X,Y,Z)</i> is a vector in model space. In most cases\n            the model space is only two-dimensional, in which case both K and Z should be set\n            to zero; this third dimension is provided in anticipation of future support for 3D\n            digital elevation models and vertical coordinate systems.\n            <para/>\n            A raster image may be georeferenced simply by specifying its location, size and\n            orientation in the model coordinate space M. This may be done by specifying the\n            location of three of the four bounding corner points. However, tiepoints are only\n            to be considered exact at the points specified; thus defining such a set of\n            bounding tiepoints does not imply that the model space locations of the interior\n            of the image may be exactly computed by a linear interpolation of these tiepoints.\n            <para/>\n            However, since the relationship between the Raster space and the model space will\n            often be an exact, affine transformation, this relationship can be defined using\n            one set of tiepoints and the <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelPixelScale\"/>, described below, which\n            gives the vertical and horizontal raster grid cell size, specified in model units.\n            <para/>\n            If possible, the first tiepoint placed in this tag shall be the one establishing\n            the location of the point (0,0) in raster space. However, if this is not possible\n            (for example, if (0,0) is goes to a part of model space in which the projection is\n            ill-defined), then there is no particular order in which the tiepoints need be\n            listed.\n            <para/>\n            For orthorectification or mosaicking applications a large number of tiepoints may\n            be specified on a mesh over the raster image. However, the definition of associated\n            grid interpolation methods is not in the scope of the current GeoTIFF spec.\n            <para/>\n            <br/><b>Naming differences</b><para/>\n            In the native FreeImage library and thus, in the FreeImage API documentation, this\n            property's key is named <i>GeoTiePoints</i>. Since the GeoTIFF specification\n            as well as Java's <c>EXIFTIFFTagSet</c> class call this tag\n            <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTiePoints\"/>, this property was renamed accordingly.\n            However, when accessing this property's tag by its <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> object,\n            the native FreeImage tag key <i>GeoTiePoints</i> must be used.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTransformationMatrix\">\n            <summary>\n            Gets or sets the value of the GeoTIFF ModelTransformationMatrixTag.\n            </summary>\n            <remarks>\n            This tag may be used to specify the transformation matrix between the raster space\n            (and its dependent pixel-value space) and the (possibly 3D) model space.\n            <para/>\n            <br/><b>Naming differences</b><para/>\n            In the native FreeImage library and thus, in the FreeImage API documentation, this\n            property's key is named <i>GeoTransformationMatrix</i>. Since the GeoTIFF specification\n            as well as Java's <c>EXIFTIFFTagSet</c> class call this tag\n            <see cref=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.ModelTransformationMatrix\"/>, this property was renamed accordingly.\n            However, when accessing this property's tag by its <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> object,\n            the native FreeImage tag key <i>GeoTransformationMatrix</i> must be used.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.IntergraphTransformationMatrix\">\n            <summary>\n            Gets or sets the value of the GeoTIFF IntergraphTransformationMatrixTag.\n            </summary>\n            <remarks>\n            The IntergraphTransformationMatrixTag conflicts with an internal software implementation\n            at Intergraph, and so its use is no longer encouraged. A GeoTIFF reader should look first\n            for the new tag, and only if it is not found should it check for this older tag. If found,\n            it should only consider it to be contain valid GeoTIFF matrix information if the tag-count\n            is 16; the Intergraph version uses 17 values.\n            <para/>\n            <br/><b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_GEOTIFF.JPLCartoIFDOffset\">\n            <summary>\n            Gets or sets the value of the GeoTIFF JPLCartoIFDOffsetTag.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_IPTC\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_IPTC\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_IPTC.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ApplicationRecordVersion\">\n            <summary>\n            Gets the Application Record Version.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectTypeReference\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Type Reference.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectAttributeReference\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Attribute Reference.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectName\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Name.\n            This is also referred to as Title.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.EditStatus\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Edit Status.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.EditorialUpdate\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Editorial Update.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Urgency\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Urgency.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.SubjectReference\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Subject Reference.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Category\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Category.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.SupplementalCategories\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Supplemental Categories.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.FixtureIdentifier\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Fixture Identifier.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Keywords\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Keywords.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ContentLocationCode\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Content Location Code.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ContentLocationName\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Content Location Name.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ReleaseDate\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Release Date.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ReleaseTime\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Release Time.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ExpirationDate\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Expiration Date.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ExpirationTime\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Expiration Time.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.SpecialInstructions\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Special Instructions.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ActionAdvised\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Action Advised.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ReferenceService\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Reference Service.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ReferenceDate\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Reference Date.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ReferenceNumber\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Reference Number.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.DateCreated\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Date Created.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.TimeCreated\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Time Created.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.DigitalCreationDate\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Digital Creation Date.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.DigitalCreationTime\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Digital Creation Time.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.OriginatingProgram\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Originating Program.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ProgramVersion\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Program Version.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectCycle\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Cycle.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ByLine\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag By Line.\n            This is the author's name.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ByLineTitle\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag By Line Title.\n            This is the author's position.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.City\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag City.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.SubLocation\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Sub Location.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ProvinceState\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Province State.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.CountryPrimaryLocationCode\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Country Primary Location Code.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.CountryPrimaryLocationName\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Country Primary Location Name.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.OriginalTransmissionReference\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Original Transmission Reference.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Headline\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Headline.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Credit\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Credit.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Source\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Source.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.CopyrightNotice\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Copyright Notice.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Contact\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Contact.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.CaptionAbstract\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Caption Abstract.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.WriterEditor\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Writer Editor.\n            This is also referred to as Caption Writer.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.RasterizedCaption\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Rasterized Caption.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ImageType\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Image Type.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ImageOrientation\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Image Orientation.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.LanguageIdentifier\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Language Identifier.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.AudioType\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Audio Type.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.AudioSamplingRate\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Audio Sampling Rate.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.AudioSamplingResolution\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Audio Sampling Resolution.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.AudioDuration\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Audio Duration.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.AudioOutcue\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Audio Outcue.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.JobID\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Job I D.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.MasterDocumentID\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Master Document I D.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ShortDocumentID\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Short Document I D.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.UniqueDocumentID\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Unique Document I D.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.OwnerID\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Owner I D.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectPreviewFileFormat\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Preview File Format.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectPreviewFileVersion\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Preview File Version.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ObjectPreviewData\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Object Preview Data.\n            This is also referred to as Audio Outcue.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.Prefs\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Prefs.\n            This is also referred to as photo-mechanic preferences.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ClassifyState\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Classify State.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.SimilarityIndex\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Similarity Index.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.DocumentNotes\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Document Notes.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.DocumentHistory\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Document History.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_IPTC.ExifCameraInfo\">\n            <summary>\n            Gets or sets the value of the IPTC/NAA tag Exif Camera Info.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_NODATA\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_NODATA\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_NODATA.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_NODATA.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MDM_XMP\">\n            <summary>\n            Represents a collection of all tags contained in the metadata model\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_XMP\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MDM_XMP.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_XMP.Model\">\n            <summary>\n            Retrieves the datamodel that this instance represents.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_XMP.Xml\">\n            <summary>\n            Gets or sets the XMP XML content.\n            </summary>\n            <remarks>\n            <b>Handling of null values</b><para/>\n            A null value indicates, that the corresponding metadata tag is not\n            present in the metadata model.\n            Setting this property's value to a non-null reference creates the\n            metadata tag if necessary.\n            Setting this property's value to a null reference deletes the\n            metadata tag from the metadata model.\n            </remarks>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MDM_XMP.XmlReader\">\n            <summary>\n            Gets an <see cref=\"P:FreeImageAPI.Metadata.MDM_XMP.XmlReader\"/> initialized to read the XMP XML content.\n            Returns null, if the metadata tag <i>XMLPacket</i> is not present in\n            this model.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.MetadataTag\">\n            <summary>\n            Manages metadata objects and operations.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataTag.tag\">\n            <summary>\n            The encapsulated FreeImage-tag.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataTag.model\">\n            <summary>\n            The metadata model of <see cref=\"F:FreeImageAPI.Metadata.MetadataTag.tag\"/>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataTag.disposed\">\n            <summary>\n            Indicates whether this instance has already been disposed.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataTag.selfCreated\">\n            <summary>\n            Indicates whether this instance was created by FreeImage or\n            by the user.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataTag.idList\">\n            <summary>\n            List linking metadata-model and Type.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.MetadataTag.typeList\">\n            <summary>\n            List linking Type and metadata-model.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.#ctor\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.#ctor(FreeImageAPI.FREE_IMAGE_MDMODEL)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"model\">The new model the tag should be of.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.#ctor(FreeImageAPI.FITAG,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"tag\">The <see cref=\"T:FreeImageAPI.FITAG\"/> to represent.</param>\n            <param name=\"dib\">The bitmap <paramref name=\"tag\"/> was extracted from.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.#ctor(FreeImageAPI.FITAG,FreeImageAPI.FREE_IMAGE_MDMODEL)\">\n            <summary>\n            Initializes a new instance of this class.\n            </summary>\n            <param name=\"tag\">The <see cref=\"T:FreeImageAPI.FITAG\"/> to represent.</param>\n            <param name=\"model\">The model of <paramref name=\"tag\"/>.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.Finalize\">\n            <summary>\n            Releases all resources used by the instance.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.op_Equality(FreeImageAPI.Metadata.MetadataTag,FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Determines whether two specified <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> objects have the same value.\n            </summary>\n            <param name=\"left\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <param name=\"right\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <returns>\n            <b>true</b> if the value of left is the same as the value of right; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.op_Inequality(FreeImageAPI.Metadata.MetadataTag,FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Determines whether two specified <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> objects have different values.\n            </summary>\n            <param name=\"left\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <param name=\"right\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> or a null reference (<b>Nothing</b> in Visual Basic).</param>\n            <returns>\n            true if the value of left is different from the value of right; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.op_Implicit(FreeImageAPI.Metadata.MetadataTag)~FreeImageAPI.FITAG\">\n            <summary>\n            Extracts the value of a <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance to a <see cref=\"T:FreeImageAPI.FITAG\"/> handle.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FITAG\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Model\">\n            <summary>\n            Gets the model of the metadata.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Key\">\n            <summary>\n            Gets or sets the key of the metadata.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Description\">\n            <summary>\n            Gets or sets the description of the metadata.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.ID\">\n            <summary>\n            Gets or sets the ID of the metadata.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Type\">\n            <summary>\n            Gets the type of the metadata.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Count\">\n            <summary>\n            Gets the number of elements the metadata object contains.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Length\">\n            <summary>\n            Gets the length of the value in bytes.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Value\">\n            <summary>\n            Gets or sets the value of the metadata.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.SetValue(System.Object)\">\n            <summary>\n            Sets the value of the metadata.\n            <para> In case value is of byte or byte[] <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_UNDEFINED\"/> is assumed.</para>\n            <para> In case value is of uint or uint[] <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_LONG\"/> is assumed.</para>\n            </summary>\n            <param name=\"value\">New data of the metadata.</param>\n            <returns>True on success, false on failure.</returns>\n            <exception cref=\"T:System.NotSupportedException\">\n            The data format is not supported.</exception>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"value\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.SetValue(System.Object,FreeImageAPI.FREE_IMAGE_MDTYPE)\">\n            <summary>\n            Sets the value of the metadata.\n            </summary>\n            <param name=\"value\">New data of the metadata.</param>\n            <param name=\"type\">Type of the data.</param>\n            <returns>True on success, false on failure.</returns>\n            <exception cref=\"T:System.NotSupportedException\">\n            The data type is not supported.</exception>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"value\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"value\"/> and <paramref name=\"type\"/> to not fit.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.SetArrayValue(System.Object,FreeImageAPI.FREE_IMAGE_MDTYPE)\">\n            <summary>\n            Sets the value of this tag to the value of <paramref name=\"value\"/>\n            using the given type.\n            </summary>\n            <param name=\"value\">New value of the tag.</param>\n            <param name=\"type\">Data-type of the tag.</param>\n            <returns></returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"value\"/> is a null reference.\n            </exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"type\"/> is FIDT_ASCII and\n            <paramref name=\"value\"/> is not String.\n            <paramref name=\"type\"/> is not FIDT_ASCII and\n            <paramref name=\"value\"/> is not Array.</exception>\n            <exception cref=\"T:System.NotSupportedException\">\n            <paramref name=\"type\"/> is FIDT_NOTYPE.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.AddToImage(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Add this metadata to an image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>True on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.GetPropertyItem\">\n            <summary>\n            Gets a .NET PropertyItem for this metadata tag.\n            </summary>\n            <returns>The .NET PropertyItem.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.ToString\">\n            <summary>\n            Converts the value of the <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.Clone\">\n            <summary>\n            Creates a deep copy of this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/>.\n            </summary>\n            <returns>A deep copy of this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance\n            and is equivalent to this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance\n            equivalent to this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.Equals(FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance is equivalent to this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> equivalent to this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> instance;\n            otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.CompareTo(FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Compares the current instance with another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer that indicates the relative order of the objects being compared.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.Dispose\">\n            <summary>\n            Releases all resources used by the instance.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Metadata.MetadataTag.Disposed\">\n            <summary>\n            Gets whether this instance has already been disposed.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Metadata.MetadataTag.CheckDisposed\">\n            <summary>\n            Throwns an <see cref=\"T:System.ObjectDisposedException\"/> in case\n            this instance has already been disposed.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.Metadata.DisposalMethodType\">\n            <summary>\n            Specifies how a single frame will be handled after being displayed.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.DisposalMethodType.Unspecified\">\n            <summary>\n            Same behavior as <see cref=\"F:FreeImageAPI.Metadata.DisposalMethodType.Leave\"/> but should not be used.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.DisposalMethodType.Leave\">\n            <summary>\n            The image is left in place and will be overdrawn by the next image.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.DisposalMethodType.Background\">\n            <summary>\n            The area of the image will be blanked out by its background.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.Metadata.DisposalMethodType.Previous\">\n            <summary>\n            Restores the the area of the image to the state it was before it\n            has been dawn.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.MemoryArray`1\">\n            <summary>\n            Represents unmanaged memory, containing an array of a given structure.\n            </summary>\n            <typeparam name=\"T\">Structuretype represented by the instance.</typeparam>\n            <remarks>\n            <see cref=\"T:System.Boolean\"/> and <see cref=\"T:System.Char\"/> can not be marshalled.\n            <para/>\n            Use <see cref=\"T:System.Int32\"/> instead of <see cref=\"T:System.Boolean\"/> and\n            <see cref=\"T:System.Byte\"/> instead of <see cref=\"T:System.Char\"/>.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.baseAddress\">\n            <summary>\n            Baseaddress of the wrapped memory.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.length\">\n            <summary>\n            Number of elements being wrapped.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.size\">\n            <summary>\n            Size, in bytes, of each element.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.buffer\">\n            <summary>\n            Array of <b>T</b> containing a single element.\n            The array is used as a workaround, because there are no pointer for generic types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.ptr\">\n            <summary>\n            Pointer to the element of <b>buffer</b>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.handle\">\n            <summary>\n            Handle for pinning <b>buffer</b>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.isOneBit\">\n            <summary>\n            Indicates whether the wrapped memory is handled like a bitfield.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.isFourBit\">\n            <summary>\n            Indicates whther the wrapped memory is handles like 4-bit blocks.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MemoryArray`1.syncRoot\">\n            <summary>\n            An object that can be used to synchronize access to the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.#ctor\">\n            <summary>\n            Initializes a new instance.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.#ctor(System.IntPtr,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> class. \n            </summary>\n            <param name=\"baseAddress\">Address of the memory block.</param>\n            <param name=\"length\">Length of the array.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"baseAddress\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"length\"/> is less or equal zero.</exception>\n            <exception cref=\"T:System.NotSupportedException\">\n            The type is not supported.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.#ctor(System.Void*,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> class. \n            </summary>\n            <param name=\"baseAddress\">Address of the memory block.</param>\n            <param name=\"length\">Length of the array.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"baseAddress\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"length\"/> is less or equal zero.</exception>\n            <exception cref=\"T:System.NotSupportedException\">\n            The type is not supported.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.Finalize\">\n            <summary>\n            Frees the allocated <see cref=\"T:System.Runtime.InteropServices.GCHandle\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.op_Equality(FreeImageAPI.MemoryArray{`0},FreeImageAPI.MemoryArray{`0})\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.op_Inequality(FreeImageAPI.MemoryArray{`0},FreeImageAPI.MemoryArray{`0})\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.GetValue(System.Int32)\">\n            <summary>\n            Gets the value at the specified position.\n            </summary>\n            <param name=\"index\">A 32-bit integer that represents the position\n            of the array element to get.</param>\n            <returns>The value at the specified position.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"index\"/> is outside the range of valid indexes\n            for the unmanaged array.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.SetValue(`0,System.Int32)\">\n            <summary>\n            Sets a value to the element at the specified position.\n            </summary>\n            <param name=\"value\">The new value for the specified element.</param>\n            <param name=\"index\">A 32-bit integer that represents the\n            position of the array element to set.</param>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"index\"/> is outside the range of valid indexes\n            for the unmanaged array.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.GetValues(System.Int32,System.Int32)\">\n            <summary>\n            Gets the values at the specified position and length.\n            </summary>\n            <param name=\"index\">A 32-bit integer that represents the position\n            of the array elements to get.</param>\n            <param name=\"length\"> A 32-bit integer that represents the length\n            of the array elements to get.</param>\n            <returns>The values at the specified position and length.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"index\"/> is outside the range of valid indexes\n            for the unmanaged array or <paramref name=\"length\"/> is greater than the number of elements\n            from <paramref name=\"index\"/> to the end of the unmanaged array.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.SetValues(`0[],System.Int32)\">\n            <summary>\n            Sets the values at the specified position.\n            </summary>\n            <param name=\"values\">An array containing the new values for the specified elements.</param>\n            <param name=\"index\">A 32-bit integer that represents the position\n            of the array elements to set.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"values\"/> is a null reference (Nothing in Visual Basic).</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"index\"/> is outside the range of valid indexes\n            for the unmanaged array or <paramref name=\"values.Length.Length\"/> is greater than the number of elements\n            from <paramref name=\"index\"/> to the end of the array.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.CopyTo(System.Array,System.Int32)\">\n            <summary>\n            Copies the entire array to a compatible one-dimensional <see cref=\"T:System.Array\"/>,\n            starting at the specified index of the target array.\n            </summary>\n            <param name=\"array\">The one-dimensional <see cref=\"T:System.Array\"/> that is the destination\n            of the elements copied from <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            The <see cref=\"T:System.Array\"/> must have zero-based indexing.</param>\n            <param name=\"index\">The zero-based index in <paramref name=\"array\"/>\n            at which copying begins.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.CopyTo(`0[],System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Copies a range of elements from the unmanaged array starting at the specified\n            <typeparamref name=\"sourceIndex\"/> and pastes them to <paramref name=\"array\"/>\n            starting at the specified <paramref name=\"destinationIndex\"/>.\n            The length and the indexes are specified as 32-bit integers.\n            </summary>\n            <param name=\"array\">The array that receives the data.</param>\n            <param name=\"sourceIndex\">A 32-bit integer that represents the index\n            in the unmanaged array at which copying begins.</param>\n            <param name=\"destinationIndex\">A 32-bit integer that represents the index in\n            the destination array at which storing begins.</param>\n            <param name=\"length\">A 32-bit integer that represents the number of elements to copy.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"array\"/> is a null reference (Nothing in Visual Basic).</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"sourceIndex\"/> is outside the range of valid indexes\n            for the unmanaged array or <paramref name=\"length\"/> is greater than the number of elements\n            from <paramref name=\"index\"/> to the end of the unmanaged array\n            <para>-or-</para>\n            <paramref name=\"destinationIndex\"/> is outside the range of valid indexes\n            for the array or <paramref name=\"length\"/> is greater than the number of elements\n            from <paramref name=\"index\"/> to the end of the array.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.CopyFrom(`0[],System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Copies a range of elements from the array starting at the specified\n            <typeparamref name=\"sourceIndex\"/> and pastes them to the unmanaged array\n            starting at the specified <paramref name=\"destinationIndex\"/>.\n            The length and the indexes are specified as 32-bit integers.\n            </summary>\n            <param name=\"array\">The array that holds the data.</param>\n            <param name=\"sourceIndex\">A 32-bit integer that represents the index\n            in the array at which copying begins.</param>\n            <param name=\"destinationIndex\">A 32-bit integer that represents the index in\n            the unmanaged array at which storing begins.</param>\n            <param name=\"length\">A 32-bit integer that represents the number of elements to copy.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"array\"/> is a null reference (Nothing in Visual Basic).</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"sourceIndex\"/> is outside the range of valid indexes\n            for the array or <paramref name=\"length\"/> is greater than the number of elements\n            from <paramref name=\"index\"/> to the end of the array\n            <para>-or-</para>\n            <paramref name=\"destinationIndex\"/> is outside the range of valid indexes\n            for the unmanaged array or <paramref name=\"length\"/> is greater than the number of elements\n            from <paramref name=\"index\"/> to the end of the unmanaged array.\n            </exception>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.ToByteArray\">\n            <summary>\n            Returns the represented block of memory as an array of <see cref=\"T:System.Byte\"/>.\n            </summary>\n            <returns>The represented block of memory.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.Item(System.Int32)\">\n            <summary>\n            Gets or sets the value at the specified position in the array.\n            </summary>\n            <param name=\"index\">A 32-bit integer that represents the position\n            of the array element to get.</param>\n            <returns>The value at the specified position in the array.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"index\"/> is outside the range of valid indexes\n            for the unmanaged array.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.Data\">\n            <summary>\n            Gets or sets the values of the unmanaged array.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.Length\">\n            <summary>\n            Gets the length of the unmanaged array.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.BaseAddress\">\n            <summary>\n            Gets the base address of the represented memory block.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.Clone\">\n            <summary>\n            Creates a shallow copy of the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            </summary>\n            <returns>A shallow copy of the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.Count\">\n            <summary>\n            Gets a 32-bit integer that represents the total number of elements\n            in the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.IsSynchronized\">\n            <summary>\n            Gets a value indicating whether access to the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>\n            is synchronized (thread safe).\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.MemoryArray`1.SyncRoot\">\n            <summary>\n            Gets an object that can be used to synchronize access to the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.GetEnumerator\">\n            <summary>\n            Retrieves an object that can iterate through the individual\n            elements in this <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.IEnumerator\"/> for the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.System#Collections#Generic#IEnumerable{T}#GetEnumerator\">\n            <summary>\n            Retrieves an object that can iterate through the individual\n            elements in this <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> for the <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.Dispose\">\n            <summary>\n            Releases all ressources.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.Dispose(System.Boolean)\">\n            <summary>\n            Releases allocated handles associated with this instance.\n            </summary>\n            <param name=\"disposing\"><b>true</b> to release managed resources.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.EnsureNotDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if\n            this instance is disposed.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structure is equivalent to this\n            <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structure.\n            </summary>\n            <param name=\"obj\">The structure to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>\n            instance equivalent to this <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structure; otherwise,\n            <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.Equals(FreeImageAPI.MemoryArray{`0})\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structure is equivalent to this\n            <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structure.\n            </summary>\n            <param name=\"other\">The structure to test.</param>\n            <returns><b>true</b> if <paramref name=\"other\"/> is equivalent to this\n            <see cref=\"T:FreeImageAPI.MemoryArray`1\"/> structure; otherwise,\n            <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>A hash code for the current <see cref=\"T:FreeImageAPI.MemoryArray`1\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.MemoryArray`1.CopyMemory(System.Byte*,System.Byte*,System.Int32)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">Pointer to the starting address of the copy destination.</param>\n            <param name=\"src\">Pointer to the starting address of the block of memory to be copied.</param>\n            <param name=\"len\">Size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"T:FreeImageAPI.Palette\">\n            <summary>\n            Provides methods for working with the standard bitmap palette.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance for the given FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"dib\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"dib\"/> is not\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/><para/>-or-<para/>\n            <paramref name=\"dib\"/> has more than 8bpp.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.#ctor(FreeImageAPI.FITAG)\">\n            <summary>\n            Initializes a new instance for the given FITAG that contains\n            a palette.\n            </summary>\n            <param name=\"tag\">The tag containing the palette.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"tag\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"tag\"/> is not\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_PALETTE\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.#ctor(FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Initializes a new instance for the given MetadataTag that contains\n            a palette.\n            </summary>\n            <param name=\"tag\">The tag containing the palette.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"dib\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"tag\"/> is not\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_PALETTE\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.#ctor(FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Initializes a new instance for the given array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/> that contains\n            a palette.\n            </summary>\n            <param name=\"palette\">A RGBQUAD array containing the palette data to initialize this instance.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.#ctor(System.Drawing.Color[])\">\n            <summary>\n            Initializes a new instance for the given array of <see cref=\"T:System.Drawing.Color\"/> that contains\n            a palette.\n            </summary>\n            <param name=\"palette\">A Color array containing the palette data to initialize this instance.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.#ctor(System.Int32)\">\n            <summary>\n            Initializes a new instance with the specified size.\n            </summary>\n            <param name=\"size\">The size of the palette.</param>\n        </member>\n        <member name=\"P:FreeImageAPI.Palette.AsArray\">\n            <summary>\n            Gets or sets the palette through an array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.Palette.ColorData\">\n            <summary>\n            Get an array of <see cref=\"T:System.Drawing.Color\"/> that the block of memory represents.\n            This property is used for internal palette operations.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.ToArray\">\n            <summary>\n            Returns the palette as an array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.\n            </summary>\n            <returns>The palette as an array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Colorize(System.Drawing.Color)\">\n            <summary>\n            Creates a linear palette based on the provided <paramref name=\"color\"/>.\n            </summary>\n            <param name=\"color\">The <see cref=\"T:System.Drawing.Color\"/> used to colorize the palette.</param>\n            <remarks>\n            Only call this method on linear palettes.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Colorize(System.Drawing.Color,System.Double)\">\n            <summary>\n            Creates a linear palette based on the provided <paramref name=\"color\"/>.\n            </summary>\n            <param name=\"color\">The <see cref=\"T:System.Drawing.Color\"/> used to colorize the palette.</param>\n            <param name=\"splitSize\">The position of the color within the new palette.\n            0 &lt; <paramref name=\"splitSize\"/> &lt; 1.</param>\n            <remarks>\n            Only call this method on linear palettes.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Colorize(System.Drawing.Color,System.Int32)\">\n            <summary>\n            Creates a linear palette based on the provided <paramref name=\"color\"/>.\n            </summary>\n            <param name=\"color\">The <see cref=\"T:System.Drawing.Color\"/> used to colorize the palette.</param>\n            <param name=\"splitSize\">The position of the color within the new palette.\n            0 &lt; <paramref name=\"splitSize\"/> &lt; <see cref=\"P:FreeImageAPI.MemoryArray`1.Length\"/>.</param>\n            <remarks>\n            Only call this method on linear palettes.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.CreateGrayscalePalette\">\n            <summary>\n            Creates a linear grayscale palette.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.CreateGrayscalePalette(System.Boolean)\">\n            <summary>\n            Creates a linear grayscale palette.\n            </summary>\n            <param name=\"inverse\"><b>true</b> to create an inverse grayscale palette.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.CreateGrayscalePalette(System.Drawing.Color,System.Boolean)\">\n            <summary>\n            Creates a linear palette with the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <remarks>\n            A linear grayscale palette contains all shades of colors from\n            black to white. This method creates a similar palette with the white\n            color being replaced by the specified color.\n            </remarks>\n            <param name=\"color\">The <see cref=\"T:System.Drawing.Color\"/> used to create the palette.</param>\n            <param name=\"inverse\"><b>true</b> to create an inverse palette.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Reverse\">\n            <summary>\n            Reverses the palette.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.CopyFrom(FreeImageAPI.Palette)\">\n            <summary>\n            Copies the values from the specified <see cref=\"T:FreeImageAPI.Palette\"/> to this instance.\n            </summary>\n            <param name=\"palette\">The palette to copy from.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"palette\"/> is a null reference.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.CopyFrom(FreeImageAPI.Palette,System.Int32)\">\n            <summary>\n            Copies the values from the specified <see cref=\"T:FreeImageAPI.Palette\"/> to this instance,\n            starting at the specified <paramref name=\"offset\"/>.\n            </summary>\n            <param name=\"palette\">The palette to copy from.</param>\n            <param name=\"offset\">The position in this instance where the values\n            will be copied to.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"palette\"/> is a null reference.</exception>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            <paramref name=\"offset\"/> is outside the range of valid indexes.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Save(System.String)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.Palette\"/> to the specified file.\n            </summary>\n            <param name=\"filename\">\n            A string that contains the name of the file to which to save this <see cref=\"T:FreeImageAPI.Palette\"/>.\n            </param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Save(System.IO.Stream)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.Palette\"/> to the specified stream.\n            </summary>\n            <param name=\"stream\">\n            The <see cref=\"T:System.IO.Stream\"/> where the image will be saved.\n            </param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Save(System.IO.BinaryWriter)\">\n            <summary>\n            Saves this <see cref=\"T:FreeImageAPI.Palette\"/> using the specified writer.\n            </summary>\n            <param name=\"writer\">\n            The <see cref=\"T:System.IO.BinaryWriter\"/> used to save the image.\n            </param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Load(System.String)\">\n            <summary>\n            Loads a palette from the specified file.\n            </summary>\n            <param name=\"filename\">The name of the palette file.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Load(System.IO.Stream)\">\n            <summary>\n            Loads a palette from the specified stream.\n            </summary>\n            <param name=\"stream\">The stream to load the palette from.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Load(System.IO.BinaryReader)\">\n            <summary>\n            Loads a palette from the reader.\n            </summary>\n            <param name=\"reader\">The reader to load the palette from.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Palette.Dispose(System.Boolean)\">\n            <summary>\n            Releases allocated handles associated with this instance.\n            </summary>\n            <param name=\"disposing\"><b>true</b> to release managed resources.</param>\n        </member>\n        <member name=\"T:FreeImageAPI.Scanline`1\">\n            <summary>\n            Provides methods for working with generic bitmap scanlines.\n            </summary>\n            <typeparam name=\"T\">Type of the bitmaps' scanlines.</typeparam>\n        </member>\n        <member name=\"M:FreeImageAPI.Scanline`1.#ctor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Initializes a new instance based on the specified FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.Scanline`1.#ctor(FreeImageAPI.FIBITMAP,System.Int32)\">\n            <summary>\n            Initializes a new instance based on the specified FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"scanline\">Index of the zero based scanline.</param>\n        </member>\n        <member name=\"T:FreeImageAPI.OutputMessageFunction\">\n            <summary>\n            Delegate for capturing FreeImage error messages.\n            </summary>\n            <param name=\"fif\">The format of the image.</param>\n            <param name=\"message\">The errormessage.</param>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS\">\n            <summary>\n            Constants used in color filling routines.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_DEFAULT\">\n            <summary>\n            Default value.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_RGB\">\n            <summary>\n            <see cref=\"T:FreeImageAPI.RGBQUAD\"/> color is RGB color (contains no valid alpha channel).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_RGBA\">\n            <summary>\n            <see cref=\"T:FreeImageAPI.RGBQUAD\"/> color is RGBA color (contains a valid alpha channel).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_NEAREST_COLOR\">\n            <summary>\n            Lookup nearest RGB color from palette.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_EQUAL_COLOR\">\n            <summary>\n            Lookup equal RGB color from palette.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\">\n            <summary>\n            <see cref=\"F:FreeImageAPI.RGBQUAD.rgbReserved\"/> contains the palette index to be used.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_DITHER\">\n            <summary>\n            Dithering algorithms.\n            Constants used in FreeImage_Dither.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_FS\">\n            <summary>\n            Floyd and Steinberg error diffusion\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_BAYER4x4\">\n            <summary>\n            Bayer ordered dispersed dot dithering (order 2 dithering matrix)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_BAYER8x8\">\n            <summary>\n            Bayer ordered dispersed dot dithering (order 3 dithering matrix)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_CLUSTER6x6\">\n            <summary>\n            Ordered clustered dot dithering (order 3 - 6x6 matrix)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_CLUSTER8x8\">\n            <summary>\n            Ordered clustered dot dithering (order 4 - 8x8 matrix)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_CLUSTER16x16\">\n            <summary>\n            Ordered clustered dot dithering (order 8 - 16x16 matrix)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_DITHER.FID_BAYER16x16\">\n            <summary>\n            Bayer ordered dispersed dot dithering (order 4 dithering matrix)\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\">\n            <summary>\n            I/O image format identifiers.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\">\n            <summary>\n            Unknown format (returned value only, never use it as input value)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_BMP\">\n            <summary>\n            Windows or OS/2 Bitmap File (*.BMP)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_ICO\">\n            <summary>\n            Windows Icon (*.ICO)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_JPEG\">\n            <summary>\n            Independent JPEG Group (*.JPG, *.JIF, *.JPEG, *.JPE)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_JNG\">\n            <summary>\n            JPEG Network Graphics (*.JNG)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_KOALA\">\n            <summary>\n            Commodore 64 Koala format (*.KOA)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_LBM\">\n            <summary>\n            Amiga IFF (*.IFF, *.LBM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_IFF\">\n            <summary>\n            Amiga IFF (*.IFF, *.LBM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_MNG\">\n            <summary>\n            Multiple Network Graphics (*.MNG)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PBM\">\n            <summary>\n            Portable Bitmap (ASCII) (*.PBM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PBMRAW\">\n            <summary>\n            Portable Bitmap (BINARY) (*.PBM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PCD\">\n            <summary>\n            Kodak PhotoCD (*.PCD)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PCX\">\n            <summary>\n            Zsoft Paintbrush PCX bitmap format (*.PCX)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PGM\">\n            <summary>\n            Portable Graymap (ASCII) (*.PGM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PGMRAW\">\n            <summary>\n            Portable Graymap (BINARY) (*.PGM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG\">\n            <summary>\n            Portable Network Graphics (*.PNG)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PPM\">\n            <summary>\n            Portable Pixelmap (ASCII) (*.PPM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PPMRAW\">\n            <summary>\n            Portable Pixelmap (BINARY) (*.PPM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_RAS\">\n            <summary>\n            Sun Rasterfile (*.RAS)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_TARGA\">\n            <summary>\n            truevision Targa files (*.TGA, *.TARGA)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_TIFF\">\n            <summary>\n            Tagged Image File Format (*.TIF, *.TIFF)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_WBMP\">\n            <summary>\n            Wireless Bitmap (*.WBMP)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PSD\">\n            <summary>\n            Adobe Photoshop (*.PSD)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_CUT\">\n            <summary>\n            Dr. Halo (*.CUT)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_XBM\">\n            <summary>\n            X11 Bitmap Format (*.XBM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_XPM\">\n            <summary>\n            X11 Pixmap Format (*.XPM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_DDS\">\n            <summary>\n            DirectDraw Surface (*.DDS)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_GIF\">\n            <summary>\n            Graphics Interchange Format (*.GIF)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_HDR\">\n            <summary>\n            High Dynamic Range (*.HDR)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_FAXG3\">\n            <summary>\n            Raw Fax format CCITT G3 (*.G3)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_SGI\">\n            <summary>\n            Silicon Graphics SGI image format (*.SGI)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_EXR\">\n            <summary>\n            OpenEXR format (*.EXR)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_J2K\">\n            <summary>\n            JPEG-2000 format (*.J2K, *.J2C)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_JP2\">\n            <summary>\n            JPEG-2000 format (*.JP2)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PFM\">\n            <summary>\n            Portable FloatMap (*.PFM)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PICT\">\n            <summary>\n            Macintosh PICT (*.PICT)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_RAW\">\n            <summary>\n            RAW camera image (*.*)\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_TMO\">\n            <summary>\n            Tone mapping operators. Constants used in FreeImage_ToneMapping.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TMO.FITMO_DRAGO03\">\n            <summary>\n            Adaptive logarithmic mapping (F. Drago, 2003)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TMO.FITMO_REINHARD05\">\n            <summary>\n            Dynamic range reduction inspired by photoreceptor physiology (E. Reinhard, 2005)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TMO.FITMO_FATTAL02\">\n            <summary>\n            Gradient domain high dynamic range compression (R. Fattal, 2002)\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_TYPE\">\n            <summary>\n            Image types used in FreeImage.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UNKNOWN\">\n            <summary>\n            unknown type\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\">\n            <summary>\n            standard image : 1-, 4-, 8-, 16-, 24-, 32-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT16\">\n            <summary>\n            array of unsigned short : unsigned 16-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT16\">\n            <summary>\n            array of short : signed 16-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_UINT32\">\n            <summary>\n            array of unsigned long : unsigned 32-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_INT32\">\n            <summary>\n            array of long : signed 32-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_FLOAT\">\n            <summary>\n            array of float : 32-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_DOUBLE\">\n            <summary>\n            array of double : 64-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_COMPLEX\">\n            <summary>\n            array of FICOMPLEX : 2 x 64-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGB16\">\n            <summary>\n            48-bit RGB image : 3 x 16-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBA16\">\n            <summary>\n            64-bit RGBA image : 4 x 16-bit\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBF\">\n            <summary>\n            96-bit RGB float image : 3 x 32-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBAF\">\n            <summary>\n            128-bit RGBA float image : 4 x 32-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL\">\n            <summary>\n            Color channels. Constants used in color manipulation routines.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_RGB\">\n            <summary>\n            Use red, green and blue channels\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_RED\">\n            <summary>\n            Use red channel\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_GREEN\">\n            <summary>\n            Use green channel\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_BLUE\">\n            <summary>\n            Use blue channel\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_ALPHA\">\n            <summary>\n            Use alpha channel\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_BLACK\">\n            <summary>\n            Use black channel\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_REAL\">\n            <summary>\n            Complex images: use real part\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_IMAG\">\n            <summary>\n            Complex images: use imaginary part\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_MAG\">\n            <summary>\n            Complex images: use magnitude\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL.FICC_PHASE\">\n            <summary>\n            Complex images: use phase\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_COLOR_TYPE\">\n            <summary>\n            Image color types used in FreeImage.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_TYPE.FIC_MINISWHITE\">\n            <summary>\n            min value is white\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_TYPE.FIC_MINISBLACK\">\n            <summary>\n            min value is black\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_TYPE.FIC_RGB\">\n            <summary>\n            RGB color model\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_TYPE.FIC_PALETTE\">\n            <summary>\n            color map indexed\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_TYPE.FIC_RGBALPHA\">\n            <summary>\n            RGB color model with alpha channel\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_TYPE.FIC_CMYK\">\n            <summary>\n            CMYK color model\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_FILTER\">\n            <summary>\n            Upsampling / downsampling filters. Constants used in FreeImage_Rescale.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FILTER.FILTER_BOX\">\n            <summary>\n            Box, pulse, Fourier window, 1st order (constant) b-spline\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FILTER.FILTER_BICUBIC\">\n            <summary>\n            Mitchell and Netravali's two-param cubic filter\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FILTER.FILTER_BILINEAR\">\n            <summary>\n            Bilinear filter\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FILTER.FILTER_BSPLINE\">\n            <summary>\n            4th order (cubic) b-spline\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FILTER.FILTER_CATMULLROM\">\n            <summary>\n            Catmull-Rom spline, Overhauser spline\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_FILTER.FILTER_LANCZOS3\">\n            <summary>\n            Lanczos3 filter\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION\">\n            <summary>\n            Lossless JPEG transformations constants used in FreeImage_JPEGTransform.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_NONE\">\n            <summary>\n            no transformation\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_FLIP_H\">\n            <summary>\n            horizontal flip\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_FLIP_V\">\n            <summary>\n            vertical flip\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_TRANSPOSE\">\n            <summary>\n            transpose across UL-to-LR axis\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_TRANSVERSE\">\n            <summary>\n            transpose across UR-to-LL axis\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_90\">\n            <summary>\n            90-degree clockwise rotation\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_180\">\n            <summary>\n            180-degree rotation\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_270\">\n            <summary>\n            270-degree clockwise (or 90 ccw)\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS\">\n            <summary>\n            Flags used in load functions.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.DEFAULT\">\n            <summary>\n            Default option for all types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.GIF_LOAD256\">\n            <summary>\n            Load the image as a 256 color image with ununsed palette entries, if it's 16 or 2 color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.GIF_PLAYBACK\">\n            <summary>\n            'Play' the GIF to generate each frame (as 32bpp) instead of returning raw frame data when loading.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.ICO_MAKEALPHA\">\n            <summary>\n            Convert to 32bpp and create an alpha channel from the AND-mask when loading.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.JPEG_FAST\">\n            <summary>\n            Load the file as fast as possible, sacrificing some quality.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.JPEG_ACCURATE\">\n            <summary>\n            Load the file with the best quality, sacrificing some speed.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.JPEG_CMYK\">\n            <summary>\n            Load separated CMYK \"as is\" (use | to combine with other load flags).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.JPEG_EXIFROTATE\">\n            <summary>\n            Load and rotate according to Exif 'Orientation' tag if available.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.PCD_BASE\">\n            <summary>\n            Load the bitmap sized 768 x 512.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.PCD_BASEDIV4\">\n            <summary>\n            Load the bitmap sized 384 x 256.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.PCD_BASEDIV16\">\n            <summary>\n            Load the bitmap sized 192 x 128.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.PNG_IGNOREGAMMA\">\n            <summary>\n            Avoid gamma correction.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.TARGA_LOAD_RGB888\">\n            <summary>\n            If set the loader converts RGB555 and ARGB8888 -> RGB888.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.TIFF_CMYK\">\n            <summary>\n            Reads tags for separated CMYK.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.RAW_PREVIEW\">\n            <summary>\n            Tries to load the JPEG preview image, embedded in\n            Exif Metadata or load the image as RGB 24-bit if no \n            preview image is available.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.RAW_DISPLAY\">\n            <summary>\n            Loads the image as RGB 24-bit.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_MDMODEL\">\n            <summary>\n            Metadata models supported by FreeImage.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_NODATA\">\n            <summary>\n            No data\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_COMMENTS\">\n            <summary>\n            single comment or keywords\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_MAIN\">\n            <summary>\n            Exif-TIFF metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_EXIF\">\n            <summary>\n            Exif-specific metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_GPS\">\n            <summary>\n            Exif GPS metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_MAKERNOTE\">\n            <summary>\n            Exif maker note metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_EXIF_INTEROP\">\n            <summary>\n            Exif interoperability metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_IPTC\">\n            <summary>\n            IPTC/NAA metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_XMP\">\n            <summary>\n            Abobe XMP metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_GEOTIFF\">\n            <summary>\n            GeoTIFF metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_ANIMATION\">\n            <summary>\n            Animation metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDMODEL.FIMD_CUSTOM\">\n            <summary>\n            Used to attach other metadata types to a dib\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_MDTYPE\">\n            <summary>\n            Tag data type information (based on TIFF specifications)\n            Note: RATIONALs are the ratio of two 32-bit integer values.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_NOTYPE\">\n            <summary>\n            placeholder\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_BYTE\">\n            <summary>\n            8-bit unsigned integer\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_ASCII\">\n            <summary>\n            8-bit bytes w/ last byte null\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_SHORT\">\n            <summary>\n            16-bit unsigned integer\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_LONG\">\n            <summary>\n            32-bit unsigned integer\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_RATIONAL\">\n            <summary>\n            64-bit unsigned fraction\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_SBYTE\">\n            <summary>\n            8-bit signed integer\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_UNDEFINED\">\n            <summary>\n            8-bit untyped data\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_SSHORT\">\n            <summary>\n            16-bit signed integer\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_SLONG\">\n            <summary>\n            32-bit signed integer\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_SRATIONAL\">\n            <summary>\n            64-bit signed fraction\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_FLOAT\">\n            <summary>\n            32-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_DOUBLE\">\n            <summary>\n            64-bit IEEE floating point\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_IFD\">\n            <summary>\n            32-bit unsigned integer (offset)\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_MDTYPE.FIDT_PALETTE\">\n            <summary>\n            32-bit RGBQUAD\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_QUANTIZE\">\n            <summary>\n            Color quantization algorithms.\n            Constants used in FreeImage_ColorQuantize.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_QUANTIZE.FIQ_WUQUANT\">\n            <summary>\n            Xiaolin Wu color quantization algorithm\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_QUANTIZE.FIQ_NNQUANT\">\n            <summary>\n            NeuQuant neural-net quantization algorithm by Anthony Dekker\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS\">\n            <summary>\n            Flags used in save functions.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.DEFAULT\">\n            <summary>\n            Default option for all types.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.BMP_SAVE_RLE\">\n            <summary>\n            Save with run length encoding.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_FLOAT\">\n            <summary>\n            Save data as float instead of as half (not recommended).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_NONE\">\n            <summary>\n            Save with no compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_ZIP\">\n            <summary>\n            Save with zlib compression, in blocks of 16 scan lines.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_PIZ\">\n            <summary>\n            Save with piz-based wavelet compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_PXR24\">\n            <summary>\n            Save with lossy 24-bit float compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_B44\">\n            <summary>\n            Save with lossy 44% float compression - goes to 22% when combined with EXR_LC.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.EXR_LC\">\n            <summary>\n            Save images with one luminance and two chroma channels, rather than as RGB (lossy compression).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYSUPERB\">\n            <summary>\n            Save with superb quality (100:1).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYGOOD\">\n            <summary>\n            Save with good quality (75:1).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYNORMAL\">\n            <summary>\n            Save with normal quality (50:1).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYAVERAGE\">\n            <summary>\n            Save with average quality (25:1).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYBAD\">\n            <summary>\n            Save with bad quality (10:1).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_PROGRESSIVE\">\n            <summary>\n            Save as a progressive-JPEG (use | to combine with other save flags).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_SUBSAMPLING_411\">\n            <summary>\n            Save with high 4x1 chroma subsampling (4:1:1).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_SUBSAMPLING_420\">\n            <summary>\n            Save with medium 2x2 medium chroma (4:2:0).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_SUBSAMPLING_422\">\n            <summary>\n            Save with low 2x1 chroma subsampling (4:2:2).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_SUBSAMPLING_444\">\n            <summary>\n            Save with no chroma subsampling (4:4:4).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_OPTIMIZE\">\n            <summary>\n            On saving, compute optimal Huffman coding tables (can reduce a few percent of file size).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_BASELINE\">\n            <summary>\n            save basic JPEG, without metadata or any markers.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_SPEED\">\n            <summary>\n            Save using ZLib level 1 compression flag\n            (default value is <see cref=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION\"/>).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION\">\n            <summary>\n            Save using ZLib level 6 compression flag (default recommended value).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION\">\n            <summary>\n            save using ZLib level 9 compression flag\n            (default value is <see cref=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION\"/>).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_NO_COMPRESSION\">\n            <summary>\n            Save without ZLib compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_INTERLACED\">\n            <summary>\n            Save using Adam7 interlacing (use | to combine with other save flags).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNM_SAVE_ASCII\">\n            <summary>\n            If set the writer saves in ASCII format (i.e. P1, P2 or P3).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_CMYK\">\n            <summary>\n            Stores tags for separated CMYK (use | to combine with compression flags).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_PACKBITS\">\n            <summary>\n            Save using PACKBITS compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_DEFLATE\">\n            <summary>\n            Save using DEFLATE compression (a.k.a. ZLIB compression).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_ADOBE_DEFLATE\">\n            <summary>\n            Save using ADOBE DEFLATE compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_NONE\">\n            <summary>\n            Save without any compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_CCITTFAX3\">\n            <summary>\n            Save using CCITT Group 3 fax encoding.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_CCITTFAX4\">\n            <summary>\n            Save using CCITT Group 4 fax encoding.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_LZW\">\n            <summary>\n            Save using LZW compression.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.TIFF_JPEG\">\n            <summary>\n            Save using JPEG compression.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.ICC_FLAGS\">\n            <summary>\n            Flags for ICC profiles.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.ICC_FLAGS.FIICC_DEFAULT\">\n            <summary>\n            Default value.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.ICC_FLAGS.FIICC_COLOR_IS_CMYK\">\n            <summary>\n            The color is CMYK.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH\">\n            <summary>\n            Enumeration used for color conversions.\n            FREE_IMAGE_COLOR_DEPTH contains several colors to convert to.\n            The default value 'FICD_AUTO'.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_UNKNOWN\">\n            <summary>\n            Unknown.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_AUTO\">\n            <summary>\n            Auto selected by the used algorithm.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP\">\n            <summary>\n            1-bit.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_DITHER\">\n            <summary>\n            1-bit using dithering.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_THRESHOLD\">\n            <summary>\n            1-bit using threshold.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_04_BPP\">\n            <summary>\n            4-bit.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP\">\n            <summary>\n            8-bit.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_16_BPP_555\">\n            <summary>\n            16-bit 555 (1 bit remains unused).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_16_BPP\">\n            <summary>\n            16-bit 565 (all bits are used).\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_24_BPP\">\n            <summary>\n            24-bit.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_32_BPP\">\n            <summary>\n            32-bit.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_REORDER_PALETTE\">\n            <summary>\n            Reorder palette (make it linear). Only affects 1-, 4- and 8-bit images.\n            <para>The palette is only reordered in case the image is greyscale\n            (all palette entries have the same red, green and blue value).</para>\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE\">\n            <summary>\n            Converts the image to greyscale.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_COLOR_MASK\">\n            <summary>\n            Flag to mask out all non color depth flags.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS\">\n            <summary>\n            List of combinable compare modes.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS.HEADER\">\n            <summary>\n            Compare headers.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS.PALETTE\">\n            <summary>\n            Compare palettes.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS.DATA\">\n            <summary>\n            Compare pixel data.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS.METADATA\">\n            <summary>\n            Compare meta data.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS.COMPLETE\">\n            <summary>\n            Compare everything.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FREE_IMAGE_METADATA_COPY\">\n            <summary>\n            Flags for copying data from a bitmap to another.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_METADATA_COPY.KEEP_EXISITNG\">\n            <summary>\n            Exisiting metadata will remain unchanged.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_METADATA_COPY.CLEAR_EXISTING\">\n            <summary>\n            Existing metadata will be cleared.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FREE_IMAGE_METADATA_COPY.REPLACE_EXISTING\">\n            <summary>\n            Existing metadata will be overwritten.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.MD_SEARCH_FLAGS\">\n            <summary>\n            List different search modes.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MD_SEARCH_FLAGS.KEY\">\n            <summary>\n            The key of the metadata.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MD_SEARCH_FLAGS.DESCRIPTION\">\n            <summary>\n            The description of the metadata\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.MD_SEARCH_FLAGS.TOSTRING\">\n            <summary>\n            The ToString value of the metadata\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.BITMAP\">\n            <summary>\n            The <b>BITMAP</b> structure defines the type, width, height, color format, and bit values of a bitmap.\n            </summary>\n            <remarks>\n            The bitmap formats currently used are monochrome and color. The monochrome bitmap uses a one-bit,\n            one-plane format. Each scan is a multiple of 32 bits.\n            <para/>\n            Scans are organized as follows for a monochrome bitmap of height n:\n            <para/>\n            <code>\n            Scan 0\n            Scan 1\n            .\n            .\n            .\n            Scan n-2\n            Scan n-1\n            </code>\n            <para/>\n            The pixels on a monochrome device are either black or white. If the corresponding bit in the\n            bitmap is 1, the pixel is set to the foreground color; if the corresponding bit in the bitmap\n            is zero, the pixel is set to the background color.\n            <para/>\n            All devices that have the RC_BITBLT device capability support bitmaps. For more information,\n            see <b>GetDeviceCaps</b>.\n            <para/>\n            Each device has a unique color format. To transfer a bitmap from one device to another,\n            use the <b>GetDIBits</b> and <b>SetDIBits</b> functions.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmType\">\n            <summary>\n            Specifies the bitmap type. This member must be zero.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmWidth\">\n            <summary>\n            Specifies the width, in pixels, of the bitmap. The width must be greater than zero.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmHeight\">\n            <summary>\n            Specifies the height, in pixels, of the bitmap. The height must be greater than zero.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmWidthBytes\">\n            <summary>\n            Specifies the number of bytes in each scan line. This value must be divisible by 2,\n            because the system assumes that the bit values of a bitmap form an array that is word aligned.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmPlanes\">\n            <summary>\n            Specifies the count of color planes.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmBitsPixel\">\n            <summary>\n            Specifies the number of bits required to indicate the color of a pixel.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAP.bmBits\">\n            <summary>\n            Pointer to the location of the bit values for the bitmap.\n            The <b>bmBits</b> member must be a long pointer to an array of character (1-byte) values.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.BITMAPINFO\">\n            <summary>\n            The <b>BITMAPINFO</b> structure defines the dimensions and color information for a DIB.\n            </summary>\n            <remarks>\n            A DIB consists of two distinct parts: a <b>BITMAPINFO</b> structure describing the dimensions\n            and colors of the bitmap, and an array of bytes defining the pixels of the bitmap. The bits in\n            the array are packed together, but each scan line must be padded with zeroes to end on a\n            <b>LONG</b> data-type boundary. If the height of the bitmap is positive, the bitmap is a\n            bottom-up DIB and its origin is the lower-left corner. If the height is negative, the bitmap is\n            a top-down DIB and its origin is the upper left corner.\n            <para/>\n            A bitmap is packed when the bitmap array immediately follows the <b>BITMAPINFO</b> header.\n            Packed bitmaps are referenced by a single pointer. For packed bitmaps, the <b>biClrUsed</b>\n            member must be set to an even number when using the DIB_PAL_COLORS mode so that the DIB bitmap\n            array starts on a <b>DWORD</b> boundary.\n            <para/>\n            <b>Note</b>  The <b>bmiColors</b> member should not contain palette indexes if the bitmap is to\n            be stored in a file or transferred to another application.\n            <para/>\n            Unless the application has exclusive use and control of the bitmap, the bitmap color table\n            should contain explicit RGB values.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFO.bmiHeader\">\n            <summary>\n            Specifies a <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure that contains information\n            about the dimensions of color format.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFO.bmiColors\">\n            <summary>\n            The <b>bmiColors</b> member contains one of the following:\n            <list type=\"bullets\">\n            \n            <item>\n            <term>\n            An array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/>. The elements of the array that make up the\n            color table.\n            </term>\n            </item>\n            \n            <item>\n            <term>\n            An array of 16-bit unsigned integers that specifies indexes into the currently realized\n            logical palette. This use of <b>bmiColors</b> is allowed for functions that use DIBs.\n            When <b>bmiColors</b> elements contain indexes to a realized logical palette, they must\n            also call the following bitmap functions:\n            </term>\n            </item>\n            \n            </list>\n            <b>CreateDIBitmap</b>\n            <para/>\n            <b>CreateDIBPatternBrush</b>\n            <para/>\n            <b>CreateDIBSection</b>\n            <para/>\n            The <i>iUsage</i> parameter of CreateDIBSection must be set to DIB_PAL_COLORS.\n            <para/>\n            The number of entries in the array depends on the values of the <b>biBitCount</b> and\n            <b>biClrUsed</b> members of the <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure.\n            <para/>\n            The colors in the <b>bmiColors</b> table appear in order of importance. For more information,\n            see the Remarks section.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFO.op_Equality(FreeImageAPI.BITMAPINFO,FreeImageAPI.BITMAPINFO)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFO.op_Inequality(FreeImageAPI.BITMAPINFO,FreeImageAPI.BITMAPINFO)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFO.Equals(FreeImageAPI.BITMAPINFO)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFO.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFO.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.BITMAPINFO\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.BITMAPINFOHEADER\">\n            <summary>\n            This structure contains information about the dimensions and color format\n            of a device-independent bitmap (DIB).\n            </summary>\n            <remarks>\n            The <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure combines the\n            <b>BITMAPINFOHEADER</b> structure and a color table to provide a complete\n            definition of the dimensions and colors of a DIB.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biSize\">\n            <summary>\n            Specifies the size of the structure, in bytes.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biWidth\">\n            <summary>\n            Specifies the width of the bitmap, in pixels.\n            <para/>\n            <b>Windows 98/Me, Windows 2000/XP:</b> If <b>biCompression</b> is BI_JPEG or BI_PNG,\n            the <b>biWidth</b> member specifies the width of the decompressed JPEG or PNG image file,\n            respectively.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biHeight\">\n            <summary>\n            Specifies the height of the bitmap, in pixels. If <b>biHeight</b> is positive, the bitmap\n            is a bottom-up DIB and its origin is the lower-left corner. If <b>biHeight</b> is negative,\n            the bitmap is a top-down DIB and its origin is the upper-left corner. \n            <para/>\n            If <b>biHeight</b> is negative, indicating a top-down DIB, <b>biCompression</b> must be\n            either BI_RGB or BI_BITFIELDS. Top-down DIBs cannot be compressed.\n            <para/>\n            <b>Windows 98/Me, Windows 2000/XP:</b> If <b>biCompression</b> is BI_JPEG or BI_PNG,\n            the <b>biHeight</b> member specifies the height of the decompressed JPEG or PNG image file,\n            respectively.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biPlanes\">\n            <summary>\n            Specifies the number of planes for the target device. This value must be set to 1.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biBitCount\">\n            <summary>\n            Specifies the number of bits per pixel.The biBitCount member of the <b>BITMAPINFOHEADER</b>\n            structure determines the number of bits that define each pixel and the maximum number of\n            colors in the bitmap. This member must be one of the following values.\n            <para/>\n            \n            <list type=\"table\">\n            <listheader>\n            <term>Value</term>\n            <description>Meaning</description>\n            </listheader>\n            \n            <item>\n            <term>0</term>\n            <description>\n            <b>Windows 98/Me, Windows 2000/XP:</b> The number of bits-per-pixel is specified\n            or is implied by the JPEG or PNG format.\n            </description>\n            </item>\n            \n            <item>\n            <term>1</term>\n            <description>\n            The bitmap is monochrome, and the bmiColors member of <see cref=\"T:FreeImageAPI.BITMAPINFO\"/>\n            contains two entries. Each bit in the bitmap array represents a pixel. If the bit is clear,\n            the pixel is displayed with the color of the first entry in the bmiColors table; if the bit\n            is set, the pixel has the color of the second entry in the table.\n            </description>\n            </item>\n            \n            <item>\n            <term>4</term>\n            <description>\n            The bitmap has a maximum of 16 colors, and the <b>bmiColors</b> member of <b>BITMAPINFO</b>\n            contains up to 16 entries. Each pixel in the bitmap is represented by a 4-bit index into the\n            color table. For example, if the first byte in the bitmap is 0x1F, the byte represents two\n            pixels. The first pixel contains the color in the second table entry, and the second pixel\n            contains the color in the sixteenth table entry.</description>\n            </item>\n            \n            <item>\n            <term>8</term>\n            <description>\n            The bitmap has a maximum of 256 colors, and the <b>bmiColors</b> member of <b>BITMAPINFO</b>\n            contains up to 256 entries. In this case, each byte in the array represents a single pixel.\n            </description>\n            </item>\n            \n            <item>\n            <term>16</term>\n            <description>\n            The bitmap has a maximum of 2^16 colors. If the <b>biCompression</b> member of the\n            <b>BITMAPINFOHEADER</b> is BI_RGB, the <b>bmiColors</b> member of <b>BITMAPINFO</b> is NULL.\n            Each <b>WORD</b> in the bitmap array represents a single pixel. The relative intensities\n            of red, green, and blue are represented with five bits for each color component.\n            The value for blue is in the least significant five bits, followed by five bits each for\n            green and red. The most significant bit is not used. The <b>bmiColors</b> color table is used\n            for optimizing colors used on palette-based devices, and must contain the number of entries\n            specified by the <b>biClrUsed</b> member of the <b>BITMAPINFOHEADER</b>.\n            <para/>\n            If the <b>biCompression</b> member of the <b>BITMAPINFOHEADER</b> is BI_BITFIELDS, the\n            <b>bmiColors</b> member contains three <b>DWORD</b> color masks that specify the red, green,\n            and blue components, respectively, of each pixel. Each <b>WORD</b> in the bitmap array represents\n            a single pixel.\n            <para/>\n            <b>Windows NT/Windows 2000/XP:</b> When the <b>biCompression</b> member is BI_BITFIELDS,\n            bits set in each <b>DWORD</b> mask must be contiguous and should not overlap the bits\n            of another mask. All the bits in the pixel do not have to be used.\n            <para/>\n            <b>Windows 95/98/Me:</b> When the <b>biCompression</b> member is BI_BITFIELDS, the system\n            supports only the following 16bpp color masks: A 5-5-5 16-bit image, where the blue mask is\n            0x001F, the green mask is 0x03E0, and the red mask is 0x7C00; and a 5-6-5 16-bit image,\n            where the blue mask is 0x001F, the green mask is 0x07E0, and the red mask is 0xF800.\n            </description>\n            </item>\n            \n            <item>\n            <term>24</term>\n            <description>\n            The bitmap has a maximum of 2^24 colors, and the <b>bmiColors</b> member of <b>BITMAPINFO</b>\n            is NULL. Each 3-byte triplet in the bitmap array represents the relative intensities of blue,\n            green, and red, respectively, for a pixel. The <b>bmiColors</b> color table is used for\n            optimizing colors used on palette-based devices, and must contain the number of entries\n            specified by the <b>biClrUsed</b> member of the <b>BITMAPINFOHEADER</b>.\n            </description>\n            </item>\n            \n            <item>\n            <term>32</term>\n            <description>\n            The bitmap has a maximum of 2^32 colors. If the <b>biCompression</b> member of the\n            <b>BITMAPINFOHEADER</b> is BI_RGB, the <b>bmiColors</b> member of <b>BITMAPINFO</b> is NULL.\n            Each <b>DWORD</b> in the bitmap array represents the relative intensities of blue, green, and red,\n            respectively, for a pixel. The high byte in each <b>DWORD</b> is not used. The <b>bmiColors</b>\n            color table is used for optimizing colors used on palette-based devices, and must contain the \n            number of entries specified by the <b>biClrUsed</b> member of the <b>BITMAPINFOHEADER</b>.\n            <para/>\n            If the <b>biCompression</b> member of the <b>BITMAPINFOHEADER</b> is BI_BITFIELDS,\n            the <b>bmiColors</b> member contains three <b>DWORD</b> color masks that specify the red, green,\n            and blue components, respectively, of each pixel. Each <b>DWORD</b> in the bitmap array represents\n            a single pixel.\n            <para/>\n            <b>Windows NT/ 2000:</b> When the <b>biCompression</b> member is BI_BITFIELDS, bits set in each\n            <b>DWORD</b> mask must be contiguous and should not overlap the bits of another mask. All the\n            bits in the pixel do not need to be used.\n            <para/>\n            <b>Windows 95/98/Me:</b> When the <b>biCompression</b> member is BI_BITFIELDS, the system\n            supports only the following 32-bpp color mask: The blue mask is 0x000000FF, the green mask is\n            0x0000FF00, and the red mask is 0x00FF0000.\n            </description>\n            </item>\n            </list>\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biCompression\">\n            <summary>\n            Specifies the type of compression for a compressed bottom-up bitmap (top-down DIBs cannot be\n            compressed).\n            <list type=\"table\">\n            <listheader>\n            <term>Value</term>\n            <description>Meaning</description>\n            </listheader>\n            \n            <item>\n            <term>BI_RGB</term>\n            <description>An uncompressed format.</description>\n            </item>\n            \n            <item>\n            <term>BI_RLE8</term>\n            <description>A run-length encoded (RLE) format for bitmaps with 8 bpp. The compression format\n            is a 2-byte format consisting of a count byte followed by a byte containing a color index.\n            </description>\n            </item>\n            \n            <item>\n            <term>BI_RLE4</term>\n            <description>An RLE format for bitmaps with 4 bpp. The compression format is a 2-byte format\n            consisting of a count byte followed by two word-length color indexes.</description>\n            </item>\n            \n            <item>\n            <term>BI_BITFIELDS</term>\n            <description>Specifies that the bitmap is not compressed and that the color table consists\n            of three <b>DWORD</b> color masks that specify the red, green, and blue components, respectively,\n            of each pixel. This is valid when used with 16- and 32-bpp bitmaps.</description>\n            </item>\n            \n            <item>\n            <term>BI_JPEG</term>\n            <description><b>Windows 98/Me, Windows 2000/XP:</b> Indicates that the image is a JPEG image.\n            </description>\n            </item>\n            \n            <item>\n            <term>BI_PNG</term>\n            <description><b>Windows 98/Me, Windows 2000/XP:</b> Indicates that the image is a PNG image.\n            </description>\n            </item>\n            \n            </list>\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biSizeImage\">\n            <summary>\n            Specifies the size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps.\n            <para/>\n            <b>Windows 98/Me, Windows 2000/XP:</b> If <b>biCompression</b> is BI_JPEG or BI_PNG,\n            <b>biSizeImage</b> indicates the size of the JPEG or PNG image buffer, respectively.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biXPelsPerMeter\">\n            <summary>\n            Specifies the horizontal resolution, in pixels-per-meter, of the target device for the bitmap.\n            An application can use this value to select a bitmap from a resource group that best matches\n            the characteristics of the current device.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biYPelsPerMeter\">\n            <summary>\n            Specifies the vertical resolution, in pixels-per-meter, of the target device for the bitmap.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biClrUsed\">\n            <summary>\n            Specifies the number of color indexes in the color table that are actually used by the bitmap.\n            If this value is zero, the bitmap uses the maximum number of colors corresponding to the value\n            of the biBitCount member for the compression mode specified by <b>biCompression</b>.\n            <para/>\n            If <b>iClrUsed</b> is nonzero and the <b>biBitCount</b> member is less than 16, the <b>biClrUsed</b>\n            member specifies the actual number of colors the graphics engine or device driver accesses.\n            If <b>biBitCount</b> is 16 or greater, the <b>biClrUsed</b> member specifies the size of the color\n            table used to optimize performance of the system color palettes. If <b>biBitCount</b> equals 16 or 32,\n            the optimal color palette starts immediately following the three <b>DWORD</b> masks.\n            <para/>\n            When the bitmap array immediately follows the <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure, it is a packed bitmap.\n            Packed bitmaps are referenced by a single pointer. Packed bitmaps require that the\n            <b>biClrUsed</b> member must be either zero or the actual size of the color table.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.BITMAPINFOHEADER.biClrImportant\">\n            <summary>\n            Specifies the number of color indexes that are required for displaying the bitmap. If this value\n            is zero, all colors are required.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFOHEADER.op_Equality(FreeImageAPI.BITMAPINFOHEADER,FreeImageAPI.BITMAPINFOHEADER)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFOHEADER.op_Inequality(FreeImageAPI.BITMAPINFOHEADER,FreeImageAPI.BITMAPINFOHEADER)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFOHEADER.Equals(FreeImageAPI.BITMAPINFOHEADER)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFOHEADER.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.BITMAPINFOHEADER.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FI16RGB555\">\n            <summary>\n            The <b>FI16RGB555</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 5 bits and so, takes values in the range from 0 to 31.\n            </summary>\n            <remarks>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>FI16RGB555</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>FI16RGB555</b> structure and my be used in all situations which require\n            an <b>FI16RGB555</b> type.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>FI16RGB555</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            FI16RGB555 fi16rgb;\n            // Initialize the structure using a native .NET Color structure.\n            fi16rgb = new FI16RGB555(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            fi16rgb = Color.DarkSeaGreen;\n            // Convert the FI16RGB555 instance into a native .NET Color\n            // using its implicit operator.\n            Color color = fi16rgb;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = fi16rgb.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.FI16RGB555.value\">\n            <summary>\n            The value of the color.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.op_Equality(FreeImageAPI.FI16RGB555,FreeImageAPI.FI16RGB555)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FI16RGB555\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FI16RGB555\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.op_Inequality(FreeImageAPI.FI16RGB555,FreeImageAPI.FI16RGB555)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FI16RGB555\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FI16RGB555\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.op_Implicit(System.Drawing.Color)~FreeImageAPI.FI16RGB555\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FI16RGB555\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.op_Implicit(FreeImageAPI.FI16RGB555)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB555.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB555.Red\">\n            <summary>\n            Gets or sets the red color component.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB555.Green\">\n            <summary>\n            Gets or sets the green color component.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB555.Blue\">\n            <summary>\n            Gets or sets the blue color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FI16RGB555\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.CompareTo(FreeImageAPI.FI16RGB555)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FI16RGB555\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FI16RGB555\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.Equals(FreeImageAPI.FI16RGB555)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FI16RGB555\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FI16RGB555\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB555.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FI16RGB555\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FI16RGB565\">\n            <summary>\n            The <b>FI16RGB565</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 5 bits and so, takes values in the range from 0 to 31.\n            </summary>\n            <remarks>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>FI16RGB565</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>FI16RGB565</b> structure and my be used in all situations which require\n            an <b>FI16RGB565</b> type.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>FI16RGB565</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            FI16RGB565 fi16rgb;\n            // Initialize the structure using a native .NET Color structure.\n            fi16rgb = new FI16RGB565(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            fi16rgb = Color.DarkSeaGreen;\n            // Convert the FI16RGB565 instance into a native .NET Color\n            // using its implicit operator.\n            Color color = fi16rgb;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = fi16rgb.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.FI16RGB565.value\">\n            <summary>\n            The value of the color.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.op_Equality(FreeImageAPI.FI16RGB565,FreeImageAPI.FI16RGB565)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FI16RGB565\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FI16RGB565\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.op_Inequality(FreeImageAPI.FI16RGB565,FreeImageAPI.FI16RGB565)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FI16RGB565\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FI16RGB565\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.op_Implicit(System.Drawing.Color)~FreeImageAPI.FI16RGB565\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FI16RGB565\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.op_Implicit(FreeImageAPI.FI16RGB565)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB565.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB565.Red\">\n            <summary>\n            Gets or sets the red color component.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB565.Green\">\n            <summary>\n            Gets or sets the green color component.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FI16RGB565.Blue\">\n            <summary>\n            Gets or sets the blue color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FI16RGB565\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.CompareTo(FreeImageAPI.FI16RGB565)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FI16RGB565\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FI16RGB565\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.Equals(FreeImageAPI.FI16RGB565)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FI16RGB565\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FI16RGB565\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI16RGB565.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FI16RGB565\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FI1BIT\">\n            <summary>\n            The <b>FI1BIT</b> structure represents a single bit.\n            It's value can be <i>0</i> or <i>1</i>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FI1BIT.MaxValue\">\n            <summary>\n            Represents the largest possible value of <see cref=\"T:FreeImageAPI.FI1BIT\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FI1BIT.MinValue\">\n            <summary>\n            Represents the smallest possible value of <see cref=\"T:FreeImageAPI.FI1BIT\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FI1BIT.value\">\n            <summary>\n            The value of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FI1BIT.#ctor(System.Byte)\">\n            <summary>\n            Initializes a new instance based on the specified value.\n            </summary>\n            <param name=\"value\">The value to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FI1BIT.op_Implicit(FreeImageAPI.FI1BIT)~System.Byte\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FI1BIT\"/> structure to a <see cref=\"T:System.Byte\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FI1BIT\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FI1BIT\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI1BIT.op_Implicit(System.Byte)~FreeImageAPI.FI1BIT\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Byte\"/> structure to a <see cref=\"T:FreeImageAPI.FI1BIT\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Byte\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FI1BIT\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI1BIT.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FI1BIT\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIBITMAP\">\n            <summary>\n            The <b>FIBITMAP</b> structure is a handle to a FreeImage bimtap.\n            </summary>\n            <remarks>\n            The handle represented by a <b>FIBITBAP</b> structure provides\n            access to either a singlepage bitmap or exactly one page of\n            a multipage bitmap.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.FIBITMAP.Zero\">\n            <summary>\n            A read-only field that represents a handle that has been initialized to zero.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.op_Equality(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIBITMAP\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIBITMAP\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIBITMAP\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIBITMAP\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.op_Inequality(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIBITMAP\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIBITMAP\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIBITMAP\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIBITMAP\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIBITMAP.IsNull\">\n            <summary>\n            Gets whether the handle is a null or not.\n            </summary>\n            <value><b>true</b> if this <see cref=\"T:FreeImageAPI.FIBITMAP\"/> handle is a null;\n            otherwise, <b>false</b>.</value>\t\t\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.SetNull\">\n            <summary>\n            Sets the handle to <i>null</i>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIBITMAP\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIBITMAP\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIBITMAP\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with the current <see cref=\"T:System.Object\"/>.</param>\n            <returns><b>true</b> if the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.Equals(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this object.</param>\n            <returns><b>true</b> if the current object is equal to the other parameter; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIBITMAP\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIBITMAP.CompareTo(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIBITMAP\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIBITMAP\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FICOMPLEX\">\n            <summary>\n            The <b>FICOMPLEX</b> structure describes a color consisting of a real and an imaginary part.\n            Each part is using 4 bytes of data.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FICOMPLEX.real\">\n            <summary>\n            Real part of the color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FICOMPLEX.imag\">\n            <summary>\n            Imaginary part of the color.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.op_Equality(FreeImageAPI.FICOMPLEX,FreeImageAPI.FICOMPLEX)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.op_Inequality(FreeImageAPI.FICOMPLEX,FreeImageAPI.FICOMPLEX)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FICOMPLEX\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.CompareTo(FreeImageAPI.FICOMPLEX)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.Equals(FreeImageAPI.FICOMPLEX)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FICOMPLEX.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FICOMPLEX\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FICOMPLEX\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIICCPROFILE\">\n            <summary>\n            This Structure contains ICC-Profile data.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIICCPROFILE.#ctor(FreeImageAPI.FIBITMAP,System.Byte[])\">\n            <summary>\n            Creates a new ICC-Profile for <paramref name=\"dib\"/>.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"data\">The ICC-Profile data.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIICCPROFILE.#ctor(FreeImageAPI.FIBITMAP,System.Byte[],System.Int32)\">\n            <summary>\n            Creates a new ICC-Profile for <paramref name=\"dib\"/>.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"data\">The ICC-Profile data.</param>\n            <param name=\"size\">Number of bytes to use from data.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.FIICCPROFILE.Flags\">\n            <summary>\n            Info flag of the profile.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FIICCPROFILE.Size\">\n            <summary>\n            Profile's size measured in bytes.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FIICCPROFILE.DataPointer\">\n            <summary>\n            Points to a block of contiguous memory containing the profile.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FIICCPROFILE.Data\">\n            <summary>\n            Copy of the ICC-Profiles data.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FIICCPROFILE.IsCMYK\">\n            <summary>\n            Indicates whether the profile is CMYK.\n            </summary>\n        </member>\n        <member name=\"T:FreeImageAPI.FIMEMORY\">\n            <summary>\n            The <b>FIMEMORY</b> structure is a handle to an opened memory stream.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIMEMORY.Zero\">\n            <summary>\n            A read-only field that represents a handle that has been initialized to zero.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.op_Equality(FreeImageAPI.FIMEMORY,FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIMEMORY\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIMEMORY\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIMEMORY\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIMEMORY\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.op_Inequality(FreeImageAPI.FIMEMORY,FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIMEMORY\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIMEMORY\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIMEMORY\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIMEMORY\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIMEMORY.IsNull\">\n            <summary>\n            Gets whether the pointer is a null pointer or not.\n            </summary>\n            <value><b>true</b> if this <see cref=\"T:FreeImageAPI.FIMEMORY\"/> is a null pointer;\n            otherwise, <b>false</b>.</value>\t\t\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.SetNull\">\n            <summary>\n            Sets the handle to <i>null</i>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIMEMORY\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIMEMORY\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIMEMORY\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with the current <see cref=\"T:System.Object\"/>.</param>\n            <returns><b>true</b> if the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.Equals(FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this object.</param>\n            <returns><b>true</b> if the current object is equal to the other parameter; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIMEMORY\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMEMORY.CompareTo(FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIMEMORY\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIMEMORY\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIMETADATA\">\n            <summary>\n            The <b>FIMETADATA</b> structure is an unique search handle for metadata search operations.\n            </summary>\n            <remarks>\n            The <b>FIMETADATA</b> structure is usually returned by the\n            <see cref=\"M:FreeImageAPI.FreeImage.FindFirstMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,FreeImageAPI.FITAG@)\"/>\n            function and then used on subsequent calls to\n            <see cref=\"M:FreeImageAPI.FreeImage.FindNextMetadata(FreeImageAPI.FIMETADATA,FreeImageAPI.FITAG@)\"/>.\n            When the <b>FIMETADATA</b> handle is no longer used, it needs to be freed by the\n            <see cref=\"M:FreeImageAPI.FreeImage.FindCloseMetadata(FreeImageAPI.FIMETADATA)\"/> function.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.FIMETADATA.Zero\">\n            <summary>\n            A read-only field that represents a handle that has been initialized to zero.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.op_Equality(FreeImageAPI.FIMETADATA,FreeImageAPI.FIMETADATA)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIMETADATA\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIMETADATA\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIMETADATA\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIMETADATA\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.op_Inequality(FreeImageAPI.FIMETADATA,FreeImageAPI.FIMETADATA)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIMETADATA\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIMETADATA\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIMETADATA\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIMETADATA\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIMETADATA.IsNull\">\n            <summary>\n            Gets whether the pointer is a null pointer or not.\n            </summary>\n            <value><b>true</b> if this <see cref=\"T:FreeImageAPI.FIMETADATA\"/> is a null pointer;\n            otherwise, <b>false</b>.</value>\t\t\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.SetNull\">\n            <summary>\n            Sets the handle to <i>null</i>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIMETADATA\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIMETADATA\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIMETADATA\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with the current <see cref=\"T:System.Object\"/>.</param>\n            <returns><b>true</b> if the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.Equals(FreeImageAPI.FIMETADATA)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this object.</param>\n            <returns><b>true</b> if the current object is equal to the other parameter; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIMETADATA\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMETADATA.CompareTo(FreeImageAPI.FIMETADATA)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIMETADATA\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIMETADATA\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIMULTIBITMAP\">\n            <summary>\n            The <b>FIMULTIBITMAP</b> structure is a handle to a FreeImage multipaged bimtap.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIMULTIBITMAP.Zero\">\n            <summary>\n            A read-only field that represents a handle that has been initialized to zero.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.op_Equality(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.op_Inequality(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIMULTIBITMAP.IsNull\">\n            <summary>\n            Gets whether the handle is a null or not.\n            </summary>\n            <value><b>true</b> if this <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> handle is a null;\n            otherwise, <b>false</b>.</value>\t\t\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.SetNull\">\n            <summary>\n            Sets the handle to <i>null</i>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with the current <see cref=\"T:System.Object\"/>.</param>\n            <returns><b>true</b> if the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.Equals(FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this object.</param>\n            <returns><b>true</b> if the current object is equal to the other parameter; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIMULTIBITMAP.CompareTo(FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIMULTIBITMAP\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIRational\">\n            <summary>\n            The <b>FIRational</b> structure represents a fraction via two <see cref=\"T:System.Int32\"/>\n            instances which are interpreted as numerator and denominator.\n            </summary>\n            <remarks>\n            The structure tries to approximate the value of <see cref=\"M:FreeImageAPI.FIRational.#ctor(System.Decimal)\"/>\n            when creating a new instance by using a better algorithm than FreeImage does.\n            <para/>\n            The structure implements the following operators:\n            +, -, ++, --, ==, != , >, >==, &lt;, &lt;== and ~ (which switches nominator and denomiator).\n            <para/>\n            The structure can be converted into all .NET standard types either implicit or\n            explicit.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRational.MaxValue\">\n            <summary>\n            Represents the largest possible value of <see cref=\"T:FreeImageAPI.FIRational\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRational.MinValue\">\n            <summary>\n            Represents the smallest possible value of <see cref=\"T:FreeImageAPI.FIRational\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRational.Epsilon\">\n            <summary>\n            Represents the smallest positive <see cref=\"T:FreeImageAPI.FIRational\"/> value greater than zero. This field is constant.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance based on the specified parameters.\n            </summary>\n            <param name=\"n\">The numerator.</param>\n            <param name=\"d\">The denominator.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.#ctor(FreeImageAPI.FITAG)\">\n            <summary>\n            Initializes a new instance based on the specified parameters.\n            </summary>\n            <param name=\"tag\">The tag to read the data from.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.#ctor(System.Decimal)\">\n            <summary>\n            Initializes a new instance based on the specified parameters.\n            </summary>\n            <param name=\"value\">The value to convert into a fraction.</param>\n            <exception cref=\"T:System.OverflowException\">\n            <paramref name=\"value\"/> cannot be converted into a fraction\n            represented by two integer values.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRational.Numerator\">\n            <summary>\n            The numerator of the fraction.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRational.Denominator\">\n            <summary>\n            The denominator of the fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Truncate\">\n            <summary>\n            Returns the truncated value of the fraction.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRational.IsInteger\">\n            <summary>\n            Returns whether the fraction is representing an integer value.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Gcd(System.Int64,System.Int64)\">\n            <summary>\n            Calculated the greatest common divisor of 'a' and 'b'.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Scm(System.Int32,System.Int32)\">\n            <summary>\n            Calculated the smallest common multiple of 'a' and 'b'.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Normalize\">\n            <summary>\n            Normalizes the fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Normalize(System.Int64@,System.Int64@)\">\n            <summary>\n            Normalizes a fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.GetDigits(System.Decimal)\">\n            <summary>\n            Returns the digits after the point.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.CreateContinuedFraction(System.Decimal)\">\n            <summary>\n            Creates a continued fraction of a decimal value.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.CreateFraction(System.Int32[],System.Int32@,System.Int32@)\">\n            <summary>\n            Creates a fraction from a continued fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.ApproximateFraction(System.Decimal,System.Int32,System.Int32@,System.Int32@)\">\n            <summary>\n            Tries 'brute force' to approximate <paramref name=\"value\"/> with a fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIRational\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FIRational\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRational\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRational\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIRational\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_UnaryPlus(FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_UnaryNegation(FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_OnesComplement(FreeImageAPI.FIRational)\">\n            <summary>\n            Returns the reciprocal value of this instance.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Increment(FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Decrement(FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Addition(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Subtraction(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Multiply(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Division(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Modulus(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Equality(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Inequality(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_GreaterThan(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_LessThan(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_GreaterThanOrEqual(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_LessThanOrEqual(FreeImageAPI.FIRational,FreeImageAPI.FIRational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.Boolean\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.Boolean\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Boolean\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.Byte\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.Byte\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Byte\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.Char\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.Char\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Char\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(FreeImageAPI.FIRational)~System.Decimal\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.Decimal\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Decimal\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(FreeImageAPI.FIRational)~System.Double\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.Double\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Double\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.Int16\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to an <see cref=\"T:System.Int16\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Int16\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.Int32\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to an <see cref=\"T:System.Int32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Int32\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.Int64\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to an <see cref=\"T:System.Int64\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Int64\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(FreeImageAPI.FIRational)~System.Single\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.Single\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Single\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.SByte\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to a <see cref=\"T:System.SByte\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.SByte\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.UInt16\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to an <see cref=\"T:System.UInt16\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.UInt16\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.UInt32\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to an <see cref=\"T:System.UInt32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.UInt32\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(FreeImageAPI.FIRational)~System.UInt64\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRational\"/> structure to an <see cref=\"T:System.UInt64\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.UInt64\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.Boolean)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Boolean\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Boolean\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(System.Byte)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Byte\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Byte\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(System.Char)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Char\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Char\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.Decimal)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Decimal\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Decimal\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.Double)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Double\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Double\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(System.Int16)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.Int16\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.Int16\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(System.Int32)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.Int32\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.Int32\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.Int64)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.Int64\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.Int64\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(System.SByte)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.SByte\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.SByte\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.Single)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Single\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Single\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Implicit(System.UInt16)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt16\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt16\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.UInt32)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt32\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt32\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.op_Explicit(System.UInt64)~FreeImageAPI.FIRational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt64\"/> structure to a <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt64\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIRational\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.ToString(System.String,System.IFormatProvider)\">\n            <summary>\n            Formats the value of the current instance using the specified format.\n            </summary>\n            <param name=\"format\">The String specifying the format to use.</param>\n            <param name=\"formatProvider\">The IFormatProvider to use to format the value.</param>\n            <returns>A String containing the value of the current instance in the specified format.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.Equals(FreeImageAPI.FIRational)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FIRational\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FIRational\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRational\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRational\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRational\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRational.CompareTo(FreeImageAPI.FIRational)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIRational\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRational\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIRGB16\">\n            <summary>\n            The <b>FIRGB16</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 16 bits and so, takes values in the range from 0 to 65535.\n            </summary>\n            <remarks>\n            <para>\n            The <b>FIRGB16</b> structure provides access to an underlying FreeImage <b>FIRGB16</b>\n            structure. To determine the red, green or blue component of a color,\n            use the red, green or blue fields, respectively.\n            </para>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>FIRGB16</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>FIRGB16</b> structure and my be used in all situations which require\n            an <b>FIRGB16</b> type.\n            </para>\n            <para>\n            Each color component red, green or blue of <b>FIRGB16</b> is translated into\n            it's corresponding color component R, G or B of\n            <see cref=\"T:System.Drawing.Color\"/> by right shifting 8 bits and shifting left 8 bits for the reverse conversion.\n            When converting from <see cref=\"T:System.Drawing.Color\"/> into <b>FIRGB16</b>, the\n            color's alpha value is ignored and assumed to be 255 when converting from\n            <b>FIRGB16</b> into <see cref=\"T:System.Drawing.Color\"/>, creating a fully\n            opaque color.\n            </para>\n            <para>\n            <b>Conversion from System.Drawing.Color to FIRGB16</b>\n            </para>\n            <c>FIRGB16.component = Color.component &lt;&lt; 8</c>\n            <para>\n            <b>Conversion from FIRGB16 to System.Drawing.Color</b>\n            </para>\n            <c>Color.component = FIRGB16.component &gt;&gt; 8</c>\n            <para>\n            The same conversion is also applied when the <see cref=\"P:FreeImageAPI.FIRGB16.Color\"/>\n            property or the <see cref=\"M:FreeImageAPI.FIRGB16.#ctor(System.Drawing.Color)\"/> constructor\n            is invoked.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>FIRGB16</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            FIRGB16 firgb16;\n            // Initialize the structure using a native .NET Color structure.\n            firgb16 = new FIRGBA16(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            firgb16 = Color.DarkSeaGreen;\n            // Convert the FIRGB16 instance into a native .NET Color\n            // using its implicit operator.\n            Color color = firgb16;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = firgb16.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGB16.red\">\n            <summary>\n            The red color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGB16.green\">\n            <summary>\n            The green color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGB16.blue\">\n            <summary>\n            The blue color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.op_Equality(FreeImageAPI.FIRGB16,FreeImageAPI.FIRGB16)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGB16\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGB16\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGB16\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGB16\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.op_Inequality(FreeImageAPI.FIRGB16,FreeImageAPI.FIRGB16)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGB16\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGB16\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGB16\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGB16\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.op_Implicit(System.Drawing.Color)~FreeImageAPI.FIRGB16\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRGB16\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.op_Implicit(FreeImageAPI.FIRGB16)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRGB16.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIRGB16\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.CompareTo(FreeImageAPI.FIRGB16)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIRGB16\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGB16\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.Equals(FreeImageAPI.FIRGB16)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIRGB16\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIRGB16\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGB16.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIRGB16\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIRGBA16\">\n            <summary>\n            The <b>FIRGBA16</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 16 bits and so, takes values in the range from 0 to 65535.\n            </summary>\n            <remarks>\n            <para>\n            The <b>FIRGBA16</b> structure provides access to an underlying FreeImage <b>FIRGBA16</b>\n            structure. To determine the alpha, red, green or blue component of a color,\n            use the alpha, red, green or blue fields, respectively.\n            </para>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>FIRGBA16</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>FIRGBA16</b> structure and my be used in all situations which require\n            an <b>FIRGBA16</b> type.\n            </para>\n            <para>\n            Each color component alpha, red, green or blue of <b>FIRGBA16</b>\n            is translated into it's corresponding color component A, R, G or B of\n            <see cref=\"T:System.Drawing.Color\"/> by an 8 bit right shift and vice versa.\n            </para>\n            <para>\n            <b>Conversion from System.Drawing.Color to FIRGBA16</b>\n            </para>\n            <c>FIRGBA16.component = Color.component &lt;&lt; 8</c>\n            <para>\n            <b>Conversion from FIRGBA16 to System.Drawing.Color</b>\n            </para>\n            <c>Color.component = FIRGBA16.component &gt;&gt; 8</c>\n            <para>\n            The same conversion is also applied when the <see cref=\"P:FreeImageAPI.FIRGBA16.Color\"/>\n            property or the <see cref=\"M:FreeImageAPI.FIRGBA16.#ctor(System.Drawing.Color)\"/> constructor\n            is invoked.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>FIRGBA16</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            FIRGBA16 firgba16;\n            // Initialize the structure using a native .NET Color structure.\n            firgba16 = new FIRGBA16(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            firgba16 = Color.DarkSeaGreen;\n            // Convert the FIRGBA16 instance into a native .NET Color\n            // using its implicit operator.\n            Color color = firgba16;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = firgba16.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBA16.red\">\n            <summary>\n            The red color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBA16.green\">\n            <summary>\n            The green color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBA16.blue\">\n            <summary>\n            The blue color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBA16.alpha\">\n            <summary>\n            The alpha color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.op_Equality(FreeImageAPI.FIRGBA16,FreeImageAPI.FIRGBA16)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGBA16\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGBA16\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.op_Inequality(FreeImageAPI.FIRGBA16,FreeImageAPI.FIRGBA16)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGBA16\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGBA16\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.op_Implicit(System.Drawing.Color)~FreeImageAPI.FIRGBA16\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRGBA16\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.op_Implicit(FreeImageAPI.FIRGBA16)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRGBA16.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIRGBA16\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.CompareTo(FreeImageAPI.FIRGBA16)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIRGBA16\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGBA16\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.Equals(FreeImageAPI.FIRGBA16)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIRGBA16\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIRGBA16\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBA16.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIRGBA16\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIRGBAF\">\n            <summary>\n            The <b>FIRGBAF</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 32 bits and takes values in the range from 0 to 1.\n            </summary>\n            <remarks>\n            <para>\n            The <b>FIRGBAF</b> structure provides access to an underlying FreeImage <b>FIRGBAF</b>\n            structure. To determine the alpha, red, green or blue component of a color,\n            use the alpha, red, green or blue fields, respectively.\n            </para>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>FIRGBAF</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>FIRGBAF</b> structure and my be used in all situations which require\n            an <b>FIRGBAF</b> type.\n            </para>\n            <para>\n            Each color component alpha, red, green or blue of <b>FIRGBAF</b> is translated\n            into it's corresponding color component A, R, G or B of\n            <see cref=\"T:System.Drawing.Color\"/> by linearly mapping the values of one range\n            into the other range and vice versa.\n            </para>\n            <para>\n            <b>Conversion from System.Drawing.Color to FIRGBAF</b>\n            </para>\n            <c>FIRGBAF.component = (float)Color.component / 255f</c>\n            <para>\n            <b>Conversion from FIRGBAF to System.Drawing.Color</b>\n            </para>\n            <c>Color.component = (int)(FIRGBAF.component * 255f)</c>\n            <para>\n            The same conversion is also applied when the <see cref=\"P:FreeImageAPI.FIRGBAF.Color\"/>\n            property or the <see cref=\"M:FreeImageAPI.FIRGBAF.#ctor(System.Drawing.Color)\"/> constructor\n            is invoked.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>FIRGBAF</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            FIRGBAF firgbaf;\n            // Initialize the structure using a native .NET Color structure.\n            firgbaf = new FIRGBAF(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            firgbaf = Color.DarkSeaGreen;\n            // Convert the FIRGBAF instance into a native .NET Color\n            // using its implicit operator.\n            Color color = firgbaf;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = firgbaf.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBAF.red\">\n            <summary>\n            The red color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBAF.green\">\n            <summary>\n            The green color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBAF.blue\">\n            <summary>\n            The blue color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBAF.alpha\">\n            <summary>\n            The alpha color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.op_Equality(FreeImageAPI.FIRGBAF,FreeImageAPI.FIRGBAF)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGBAF\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGBAF\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.op_Inequality(FreeImageAPI.FIRGBAF,FreeImageAPI.FIRGBAF)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGBAF\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGBAF\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.op_Implicit(System.Drawing.Color)~FreeImageAPI.FIRGBAF\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRGBAF\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.op_Implicit(FreeImageAPI.FIRGBAF)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRGBAF.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIRGBAF\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.CompareTo(FreeImageAPI.FIRGBAF)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIRGBAF\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGBAF\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.Equals(FreeImageAPI.FIRGBAF)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIRGBAF\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIRGBAF\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBAF.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIRGBAF\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIRGBF\">\n            <summary>\n            The <b>FIRGBF</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 32 bits and takes values in the range from 0 to 1.\n            </summary>\n            <remarks>\n            <para>\n            The <b>FIRGBF</b> structure provides access to an underlying FreeImage <b>FIRGBF</b>\n            structure. To determine the red, green or blue component of a color, use the\n            red, green or blue fields, respectively.\n            </para>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>FIRGBF</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>FIRGBF</b> structure and my be used in all situations which require\n            an <b>FIRGBF</b> type.\n            </para>\n            <para>\n            Each color component alpha, red, green or blue of <b>FIRGBF</b> is translated\n            into it's corresponding color component A, R, G or B of\n            <see cref=\"T:System.Drawing.Color\"/> by linearly mapping the values of one range\n            into the other range and vice versa.\n            When converting from <see cref=\"T:System.Drawing.Color\"/> into <b>FIRGBF</b>, the\n            color's alpha value is ignored and assumed to be 255 when converting from\n            <b>FIRGBF</b> into <see cref=\"T:System.Drawing.Color\"/>, creating a fully\n            opaque color.\n            </para>\n            <para>\n            <b>Conversion from System.Drawing.Color to FIRGBF</b>\n            </para>\n            <c>FIRGBF.component = (float)Color.component / 255f</c>\n            <para>\n            <b>Conversion from FIRGBF to System.Drawing.Color</b>\n            </para>\n            <c>Color.component = (int)(FIRGBF.component * 255f)</c>\n            <para>\n            The same conversion is also applied when the <see cref=\"P:FreeImageAPI.FIRGBF.Color\"/>\n            property or the <see cref=\"M:FreeImageAPI.FIRGBF.#ctor(System.Drawing.Color)\"/> constructor\n            is invoked.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>FIRGBF</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            FIRGBF firgbf;\n            // Initialize the structure using a native .NET Color structure.\n            firgbf = new FIRGBF(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            firgbf = Color.DarkSeaGreen;\n            // Convert the FIRGBF instance into a native .NET Color\n            // using its implicit operator.\n            Color color = firgbf;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = firgbf.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBF.red\">\n            <summary>\n            The red color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBF.green\">\n            <summary>\n            The green color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIRGBF.blue\">\n            <summary>\n            The blue color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.op_Equality(FreeImageAPI.FIRGBF,FreeImageAPI.FIRGBF)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGBF\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGBF\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGBF\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGBF\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.op_Inequality(FreeImageAPI.FIRGBF,FreeImageAPI.FIRGBF)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FIRGBF\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FIRGBF\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FIRGBF\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FIRGBF\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.op_Implicit(System.Drawing.Color)~FreeImageAPI.FIRGBF\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIRGBF\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.op_Implicit(FreeImageAPI.FIRGBF)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIRGBF.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIRGBF\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.CompareTo(FreeImageAPI.FIRGBF)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIRGBF\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGBF\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.Equals(FreeImageAPI.FIRGBF)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIRGBF\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIRGBF.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIRGBF\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FreeImage\">\n            <summary>\n            Static class importing functions from the FreeImage library\n            and providing additional functions.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FreeImageLibrary\">\n            <summary>\n            Filename of the FreeImage library.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_RED\">\n            <summary>\n            Number of bytes to shift left within a 4 byte block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_GREEN\">\n            <summary>\n            Number of bytes to shift left within a 4 byte block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_BLUE\">\n            <summary>\n            Number of bytes to shift left within a 4 byte block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_ALPHA\">\n            <summary>\n            Number of bytes to shift left within a 4 byte block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_RED_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_GREEN_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_BLUE_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_ALPHA_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_RED_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 32 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_GREEN_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 32 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_BLUE_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 32 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_ALPHA_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 32 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI_RGBA_RGB_MASK\">\n            <summary>\n            Mask indicating the position of color components of a 32 bit color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_555_RED_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_555_GREEN_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_555_BLUE_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_555_RED_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 16 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_555_GREEN_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 16 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_555_BLUE_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 16 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_565_RED_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_565_GREEN_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_565_BLUE_MASK\">\n            <summary>\n            Mask indicating the position of the given color.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_565_RED_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 16 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_565_GREEN_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 16 bit block.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FI16_565_BLUE_SHIFT\">\n            <summary>\n            Number of bits to shift left within a 16 bit block.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Initialise(System.Boolean)\">\n            <summary>\n            Initialises the library.\n            </summary>\n            <param name=\"load_local_plugins_only\">\n            When the <paramref name=\"load_local_plugins_only\"/> is true, FreeImage won't make use of external plugins.\n            </param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.DeInitialise\">\n            <summary>\n            Deinitialises the library.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetVersion\">\n            <summary>\n            Returns a string containing the current version of the library.\n            </summary>\n            <returns>The current version of the library.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetCopyrightMessage\">\n            <summary>\n            Returns a string containing a standard copyright message.\n            </summary>\n            <returns>A standard copyright message.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OutputMessageProc(FreeImageAPI.FREE_IMAGE_FORMAT,System.String)\">\n            <summary>\n            Calls the set error message function in FreeImage.\n            </summary>\n            <param name=\"fif\">Format of the bitmaps.</param>\n            <param name=\"message\">The error message.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetOutputMessage(FreeImageAPI.OutputMessageFunction)\">\n            <summary>\n            You use the function FreeImage_SetOutputMessage to capture the log string\n            so that you can show it to the user of the program.\n            The callback is implemented in the <see cref=\"E:FreeImageAPI.FreeImageEngine.Message\"/> event of this class.\n            </summary>\n            <remarks>The function is private because FreeImage can only have a single\n            callback function. To use the callback use the <see cref=\"E:FreeImageAPI.FreeImageEngine.Message\"/>\n            event of this class.</remarks>\n            <param name=\"omf\">Handler to the callback function.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\">\n            <summary>\n            Creates a new bitmap in memory.\n            </summary>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new Bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmap</param>\n            <param name=\"red_mask\">Red part of the color layout.\n            eg: 0xFF0000</param>\n            <param name=\"green_mask\">Green part of the color layout.\n            eg: 0x00FF00</param>\n            <param name=\"blue_mask\">Blue part of the color layout.\n            eg: 0x0000FF</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\">\n            <summary>\n            Creates a new bitmap in memory.\n            </summary>\n            <param name=\"type\">Type of the image.</param>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new Bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmap</param>\n            <param name=\"red_mask\">Red part of the color layout.\n            eg: 0xFF0000</param>\n            <param name=\"green_mask\">Green part of the color layout.\n            eg: 0x00FF00</param>\n            <param name=\"blue_mask\">Blue part of the color layout.\n            eg: 0x0000FF</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Clone(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Makes an exact reproduction of an existing bitmap, including metadata and attached profile if any.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Unload(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Deletes a previously loaded FIBITMAP from memory.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Load(FreeImageAPI.FREE_IMAGE_FORMAT,System.String,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Decodes a bitmap, allocates memory for it and returns it as a FIBITMAP.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"filename\">Name of the file to decode.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadU(FreeImageAPI.FREE_IMAGE_FORMAT,System.String,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Decodes a bitmap, allocates memory for it and returns it as a FIBITMAP.\n            The filename supports UNICODE.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"filename\">Name of the file to decode.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadFromHandle(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Loads a bitmap from an arbitrary source.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"io\">A FreeImageIO structure with functionpointers to handle the source.</param>\n            <param name=\"handle\">A handle to the source.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Save(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a previosly loaded FIBITMAP to a file.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">Name of the file to save to.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveU(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a previosly loaded FIBITMAP to a file.\n            The filename supports UNICODE.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">Name of the file to save to.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToHandle(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FIBITMAP,FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a bitmap to an arbitrary source.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"io\">A FreeImageIO structure with functionpointers to handle the source.</param>\n            <param name=\"handle\">A handle to the source.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMemory(System.IntPtr,System.UInt32)\">\n            <summary>\n            Open a memory stream.\n            </summary>\n            <param name=\"data\">Pointer to the data in memory.</param>\n            <param name=\"size_in_bytes\">Length of the data in byte.</param>\n            <returns>Handle to a memory stream.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloseMemory(FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Close and free a memory stream.\n            </summary>\n            <param name=\"stream\">Handle to a memory stream.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadFromMemory(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FIMEMORY,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Decodes a bitmap from a stream, allocates memory for it and returns it as a FIBITMAP.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"stream\">Handle to a memory stream.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToMemory(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FIBITMAP,FreeImageAPI.FIMEMORY,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a previosly loaded FIBITMAP to a stream.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">Handle to a memory stream.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.TellMemory(FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Gets the current position of a memory handle.\n            </summary>\n            <param name=\"stream\">Handle to a memory stream.</param>\n            <returns>The current file position if successful, -1 otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SeekMemory(FreeImageAPI.FIMEMORY,System.Int32,System.IO.SeekOrigin)\">\n            <summary>\n            Moves the memory handle to a specified location.\n            </summary>\n            <param name=\"stream\">Handle to a memory stream.</param>\n            <param name=\"offset\">Number of bytes from origin.</param>\n            <param name=\"origin\">Initial position.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AcquireMemory(FreeImageAPI.FIMEMORY,System.IntPtr@,System.UInt32@)\">\n            <summary>\n            Provides a direct buffer access to a memory stream.\n            </summary>\n            <param name=\"stream\">The target memory stream.</param>\n            <param name=\"data\">Pointer to the data in memory.</param>\n            <param name=\"size_in_bytes\">Size of the data in bytes.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ReadMemory(System.Byte[],System.UInt32,System.UInt32,FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Reads data from a memory stream.\n            </summary>\n            <param name=\"buffer\">The buffer to store the data in.</param>\n            <param name=\"size\">Size in bytes of the items.</param>\n            <param name=\"count\">Number of items to read.</param>\n            <param name=\"stream\">The stream to read from.\n            The memory pointer associated with stream is increased by the number of bytes actually read.</param>\n            <returns>The number of full items actually read.\n            May be less than count on error or stream-end.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.WriteMemory(System.Byte[],System.UInt32,System.UInt32,FreeImageAPI.FIMEMORY)\">\n            <summary>\n            Writes data to a memory stream.\n            </summary>\n            <param name=\"buffer\">The buffer to read the data from.</param>\n            <param name=\"size\">Size in bytes of the items.</param>\n            <param name=\"count\">Number of items to write.</param>\n            <param name=\"stream\">The stream to write to.\n            The memory pointer associated with stream is increased by the number of bytes actually written.</param>\n            <returns>The number of full items actually written.\n            May be less than count on error or stream-end.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadMultiBitmapFromMemory(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FIMEMORY,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Open a multi-page bitmap from a memory stream.\n            </summary>\n            <param name=\"fif\">Type of the bitmap.</param>\n            <param name=\"stream\">The stream to decode.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.RegisterLocalPlugin(FreeImageAPI.Plugins.InitProc,System.String,System.String,System.String,System.String)\">\n            <summary>\n            Registers a new plugin to be used in FreeImage.\n            </summary>\n            <param name=\"proc_address\">Pointer to the function that initialises the plugin.</param>\n            <param name=\"format\">A string describing the format of the plugin.</param>\n            <param name=\"description\">A string describing the plugin.</param>\n            <param name=\"extension\">A string witha comma sperated list of extensions. f.e: \"pl,pl2,pl4\"</param>\n            <param name=\"regexpr\">A regular expression used to identify the bitmap.</param>\n            <returns>The format idientifier assigned by FreeImage.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.RegisterExternalPlugin(System.String,System.String,System.String,System.String,System.String)\">\n            <summary>\n            Registers a new plugin to be used in FreeImage. The plugin is residing in a DLL.\n            The Init function must be called 揑nit?and must use the stdcall calling convention.\n            </summary>\n            <param name=\"path\">Complete path to the dll file hosting the plugin.</param>\n            <param name=\"format\">A string describing the format of the plugin.</param>\n            <param name=\"description\">A string describing the plugin.</param>\n            <param name=\"extension\">A string witha comma sperated list of extensions. f.e: \"pl,pl2,pl4\"</param>\n            <param name=\"regexpr\">A regular expression used to identify the bitmap.</param>\n            <returns>The format idientifier assigned by FreeImage.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFCount\">\n            <summary>\n            Retrieves the number of FREE_IMAGE_FORMAT identifiers being currently registered.\n            </summary>\n            <returns>The number of registered formats.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetPluginEnabled(FreeImageAPI.FREE_IMAGE_FORMAT,System.Boolean)\">\n            <summary>\n            Enables or disables a plugin.\n            </summary>\n            <param name=\"fif\">The plugin to enable or disable.</param>\n            <param name=\"enable\">True: enable the plugin. false: disable the plugin.</param>\n            <returns>The previous state of the plugin.\n            1 - enabled. 0 - disables. -1 plugin does not exist.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsPluginEnabled(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Retrieves the state of a plugin.\n            </summary>\n            <param name=\"fif\">The plugin to check.</param>\n            <returns>1 - enabled. 0 - disables. -1 plugin does not exist.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFFromFormat(System.String)\">\n            <summary>\n            Returns a <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier from the format string that was used to register the FIF.\n            </summary>\n            <param name=\"format\">The string that was used to register the plugin.</param>\n            <returns>A <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier from the format.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFFromMime(System.String)\">\n            <summary>\n            Returns a <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier from a MIME content type string\n            (MIME stands for Multipurpose Internet Mail Extension).\n            </summary>\n            <param name=\"mime\">A MIME content type.</param>\n            <returns>A <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier from the MIME.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFormatFromFIF(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Returns the string that was used to register a plugin from the system assigned <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.\n            </summary>\n            <param name=\"fif\">The assigned <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.</param>\n            <returns>The string that was used to register the plugin.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFExtensionList(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Returns a comma-delimited file extension list describing the bitmap formats the given plugin can read and/or write.\n            </summary>\n            <param name=\"fif\">The desired <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.</param>\n            <returns>A comma-delimited file extension list.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFDescription(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Returns a descriptive string that describes the bitmap formats the given plugin can read and/or write.\n            </summary>\n            <param name=\"fif\">The desired <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.</param>\n            <returns>A descriptive string that describes the bitmap formats.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFRegExpr(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Returns a regular expression string that can be used by a regular expression engine to identify the bitmap.\n            FreeImageQt makes use of this function.\n            </summary>\n            <param name=\"fif\">The desired <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.</param>\n            <returns>A regular expression string.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFMimeType(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Given a <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier, returns a MIME content type string (MIME stands for Multipurpose Internet Mail Extension).\n            </summary>\n            <param name=\"fif\">The desired <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.</param>\n            <returns>A MIME content type string.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFFromFilename(System.String)\">\n            <summary>\n            This function takes a filename or a file-extension and returns the plugin that can\n            read/write files with that extension in the form of a <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier.\n            </summary>\n            <param name=\"filename\">The filename or -extension.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFIFFromFilenameU(System.String)\">\n            <summary>\n            This function takes a filename or a file-extension and returns the plugin that can\n            read/write files with that extension in the form of a <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> identifier.\n            Supports UNICODE filenames.\n            </summary>\n            <param name=\"filename\">The filename or -extension.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FIFSupportsReading(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Checks if a plugin can load bitmaps.\n            </summary>\n            <param name=\"fif\">The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</param>\n            <returns>True if the plugin can load bitmaps, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FIFSupportsWriting(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Checks if a plugin can save bitmaps.\n            </summary>\n            <param name=\"fif\">The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</param>\n            <returns>True if the plugin can save bitmaps, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FIFSupportsExportBPP(FreeImageAPI.FREE_IMAGE_FORMAT,System.Int32)\">\n            <summary>\n            Checks if a plugin can save bitmaps in the desired bit depth.\n            </summary>\n            <param name=\"fif\">The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</param>\n            <param name=\"bpp\">The desired bit depth.</param>\n            <returns>True if the plugin can save bitmaps in the desired bit depth, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FIFSupportsExportType(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_TYPE)\">\n            <summary>\n            Checks if a plugin can save a bitmap in the desired data type.\n            </summary>\n            <param name=\"fif\">The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</param>\n            <param name=\"type\">The desired image type.</param>\n            <returns>True if the plugin can save bitmaps as the desired type, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FIFSupportsICCProfiles(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Checks if a plugin can load or save an ICC profile.\n            </summary>\n            <param name=\"fif\">The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> of the plugin.</param>\n            <returns>True if the plugin can load or save an ICC profile, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmap(FreeImageAPI.FREE_IMAGE_FORMAT,System.String,System.Boolean,System.Boolean,System.Boolean,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            Load flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"fif\">Format of the image.</param>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"create_new\">When true a new bitmap is created.</param>\n            <param name=\"read_only\">When true the bitmap will be loaded read only.</param>\n            <param name=\"keep_cache_in_memory\">When true performance is increased at the cost of memory.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapFromHandle(FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Loads a FreeImage multi-pages bitmap from the specified handle\n            using the specified functions.\n            Load flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"fif\">Format of the image.</param>\n            <param name=\"io\">IO functions used to read from the specified handle.</param>\n            <param name=\"handle\">The handle to load the bitmap from.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloseMultiBitmap_(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Closes a previously opened multi-page bitmap and, when the bitmap was not opened read-only, applies any changes made to it.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPageCount(FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Returns the number of pages currently available in the multi-paged bitmap.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <returns>Number of pages.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AppendPage(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Appends a new page to the end of the bitmap.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"data\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.InsertPage(FreeImageAPI.FIMULTIBITMAP,System.Int32,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Inserts a new page before the given position in the bitmap.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"page\">Page has to be a number smaller than the current number of pages available in the bitmap.</param>\n            <param name=\"data\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.DeletePage(FreeImageAPI.FIMULTIBITMAP,System.Int32)\">\n            <summary>\n            Deletes the page on the given position.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"page\">Number of the page to delete.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LockPage(FreeImageAPI.FIMULTIBITMAP,System.Int32)\">\n            <summary>\n            Locks a page in memory for editing.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"page\">Number of the page to lock.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.UnlockPage(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FIBITMAP,System.Boolean)\">\n            <summary>\n            Unlocks a previously locked page and gives it back to the multi-page engine.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"data\">Handle to a FreeImage bitmap.</param>\n            <param name=\"changed\">If true, the page is applied to the multi-page bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MovePage(FreeImageAPI.FIMULTIBITMAP,System.Int32,System.Int32)\">\n            <summary>\n            Moves the source page to the position of the target page.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"target\">New position of the page.</param>\n            <param name=\"source\">Old position of the page.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetLockedPageNumbers(FreeImageAPI.FIMULTIBITMAP,System.Int32[],System.Int32@)\">\n            <summary>\n            Returns an array of page-numbers that are currently locked in memory.\n            When the pages parameter is null, the size of the array is returned in the count variable.\n            </summary>\n            <example>\n            <code>\n            int[] lockedPages = null;\n            int count = 0;\n            GetLockedPageNumbers(dib, lockedPages, ref count);\n            lockedPages = new int[count];\n            GetLockedPageNumbers(dib, lockedPages, ref count);\n            </code>\n            </example>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"pages\">The list of locked pages in the multi-pages bitmap.\n            If set to null, count will contain the number of pages.</param>\n            <param name=\"count\">If <paramref name=\"pages\"/> is set to null count will contain the number of locked pages.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFileType(System.String,System.Int32)\">\n            <summary>\n            Orders FreeImage to analyze the bitmap signature.\n            </summary>\n            <param name=\"filename\">Name of the file to analyze.</param>\n            <param name=\"size\">Reserved parameter - use 0.</param>\n            <returns>Type of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFileTypeU(System.String,System.Int32)\">\n            <summary>\n            Orders FreeImage to analyze the bitmap signature.\n            Supports UNICODE filenames.\n            </summary>\n            <param name=\"filename\">Name of the file to analyze.</param>\n            <param name=\"size\">Reserved parameter - use 0.</param>\n            <returns>Type of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFileTypeFromHandle(FreeImageAPI.IO.FreeImageIO@,FreeImageAPI.IO.fi_handle,System.Int32)\">\n            <summary>\n            Uses the <see cref=\"T:FreeImageAPI.IO.FreeImageIO\"/> structure as described in the topic bitmap management functions\n            to identify a bitmap type.\n            </summary>\n            <param name=\"io\">A <see cref=\"T:FreeImageAPI.IO.FreeImageIO\"/> structure with functionpointers to handle the source.</param>\n            <param name=\"handle\">A handle to the source.</param>\n            <param name=\"size\">Size in bytes of the source.</param>\n            <returns>Type of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFileTypeFromMemory(FreeImageAPI.FIMEMORY,System.Int32)\">\n            <summary>\n            Uses a memory handle to identify a bitmap type.\n            </summary>\n            <param name=\"stream\">Pointer to the stream.</param>\n            <param name=\"size\">Size in bytes of the source.</param>\n            <returns>Type of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsLittleEndian\">\n            <summary>\n            Returns whether the platform is using Little Endian.\n            </summary>\n            <returns>Returns true if the platform is using Litte Endian, else false.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LookupX11Color(System.String,System.Byte@,System.Byte@,System.Byte@)\">\n            <summary>\n            Converts a X11 color name into a corresponding RGB value.\n            </summary>\n            <param name=\"szColor\">Name of the color to convert.</param>\n            <param name=\"nRed\">Red component.</param>\n            <param name=\"nGreen\">Green component.</param>\n            <param name=\"nBlue\">Blue component.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LookupSVGColor(System.String,System.Byte@,System.Byte@,System.Byte@)\">\n            <summary>\n            Converts a SVG color name into a corresponding RGB value.\n            </summary>\n            <param name=\"szColor\">Name of the color to convert.</param>\n            <param name=\"nRed\">Red component.</param>\n            <param name=\"nGreen\">Green component.</param>\n            <param name=\"nBlue\">Blue component.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBits(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a pointer to the data-bits of the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Pointer to the data-bits.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetScanLine(FreeImageAPI.FIBITMAP,System.Int32)\">\n            <summary>\n            Returns a pointer to the start of the given scanline in the bitmap's data-bits.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"scanline\">Number of the scanline.</param>\n            <returns>Pointer to the scanline.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPixelIndex(FreeImageAPI.FIBITMAP,System.UInt32,System.UInt32,System.Byte@)\">\n            <summary>\n            Get the pixel index of a palettized image at position (x, y), including range check (slow access).\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"x\">Pixel position in horizontal direction.</param>\n            <param name=\"y\">Pixel position in vertical direction.</param>\n            <param name=\"value\">The pixel index.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPixelColor(FreeImageAPI.FIBITMAP,System.UInt32,System.UInt32,FreeImageAPI.RGBQUAD@)\">\n            <summary>\n            Get the pixel color of a 16-, 24- or 32-bit image at position (x, y), including range check (slow access).\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"x\">Pixel position in horizontal direction.</param>\n            <param name=\"y\">Pixel position in vertical direction.</param>\n            <param name=\"value\">The pixel color.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetPixelIndex(FreeImageAPI.FIBITMAP,System.UInt32,System.UInt32,System.Byte@)\">\n            <summary>\n            Set the pixel index of a palettized image at position (x, y), including range check (slow access).\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"x\">Pixel position in horizontal direction.</param>\n            <param name=\"y\">Pixel position in vertical direction.</param>\n            <param name=\"value\">The new pixel index.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetPixelColor(FreeImageAPI.FIBITMAP,System.UInt32,System.UInt32,FreeImageAPI.RGBQUAD@)\">\n            <summary>\n            Set the pixel color of a 16-, 24- or 32-bit image at position (x, y), including range check (slow access).\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"x\">Pixel position in horizontal direction.</param>\n            <param name=\"y\">Pixel position in vertical direction.</param>\n            <param name=\"value\">The new pixel color.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetImageType(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Retrieves the type of the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Type of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetColorsUsed(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the number of colors used in a bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Palette-size for palletised bitmaps, and 0 for high-colour bitmaps.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBPP(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the size of one pixel in the bitmap in bits.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Size of one pixel in the bitmap in bits.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetWidth(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the width of the bitmap in pixel units.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>With of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetHeight(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the height of the bitmap in pixel units.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Height of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetLine(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the width of the bitmap in bytes.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>With of the bitmap in bytes.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPitch(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the width of the bitmap in bytes, rounded to the next 32-bit boundary,\n            also known as pitch or stride or scan width.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>With of the bitmap in bytes.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetDIBSize(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the size of the DIB-element of a FIBITMAP in memory.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Size of the DIB-element</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPalette(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a pointer to the bitmap's palette.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Pointer to the bitmap's palette.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetDotsPerMeterX(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the horizontal resolution, in pixels-per-meter, of the target device for the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The horizontal resolution, in pixels-per-meter.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetDotsPerMeterY(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the vertical resolution, in pixels-per-meter, of the target device for the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The vertical resolution, in pixels-per-meter.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetDotsPerMeterX(FreeImageAPI.FIBITMAP,System.UInt32)\">\n            <summary>\n            Set the horizontal resolution, in pixels-per-meter, of the target device for the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"res\">The new horizontal resolution.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetDotsPerMeterY(FreeImageAPI.FIBITMAP,System.UInt32)\">\n            <summary>\n            Set the vertical resolution, in pixels-per-meter, of the target device for the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"res\">The new vertical resolution.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetInfoHeader(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a pointer to the <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> of the DIB-element in a FIBITMAP.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Poiter to the header of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetInfo(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Alias for FreeImage_GetInfoHeader that returns a pointer to a <see cref=\"T:FreeImageAPI.BITMAPINFO\"/>\n            rather than to a <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/>.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Pointer to the <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure for the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetColorType(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Investigates the color type of the bitmap by reading the bitmap's pixel bits and analysing them.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The color type of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetRedMask(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a bit pattern describing the red color component of a pixel in a FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The bit pattern for RED.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetGreenMask(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a bit pattern describing the green color component of a pixel in a FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The bit pattern for green.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBlueMask(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a bit pattern describing the blue color component of a pixel in a FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The bit pattern for blue.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTransparencyCount(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the number of transparent colors in a palletised bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The number of transparent colors in a palletised bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTransparencyTable(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a pointer to the bitmap's transparency table.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Pointer to the bitmap's transparency table.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTransparent(FreeImageAPI.FIBITMAP,System.Boolean)\">\n            <summary>\n            Tells FreeImage if it should make use of the transparency table\n            or the alpha channel that may accompany a bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"enabled\">True to enable the transparency, false to disable.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTransparencyTable(FreeImageAPI.FIBITMAP,System.Byte[],System.Int32)\">\n            <summary>\n            Set the bitmap's transparency table. Only affects palletised bitmaps.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"table\">Pointer to the bitmap's new transparency table.</param>\n            <param name=\"count\">The number of transparent colors in the new transparency table.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsTransparent(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns whether the transparency table is enabled.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns true when the transparency table is enabled (1-, 4- or 8-bit images)\n            or when the input dib contains alpha values (32-bit images). Returns false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.HasBackgroundColor(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns whether the bitmap has a file background color.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns true when the image has a file background color, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBackgroundColor(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD@)\">\n            <summary>\n            Returns the file background color of an image.\n            For 8-bit images, the color index in the palette is returned in the\n            rgbReserved member of the bkcolor parameter.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"bkcolor\">The background color.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetBackgroundColor(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD@)\">\n            <summary>\n            Set the file background color of an image.\n            When saving an image to PNG, this background color is transparently saved to the PNG file.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"bkcolor\">The new background color.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetBackgroundColor(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Set the file background color of an image.\n            When saving an image to PNG, this background color is transparently saved to the PNG file.\n            When the bkcolor parameter is null, the background color is removed from the image.\n            <para>\n            This overloaded version of the function with an array parameter is provided to allow\n            passing <c>null</c> in the <paramref name=\"bkcolor\"/> parameter. This is similar to the\n            original C/C++ function. Passing <c>null</c> as <paramref name=\"bkcolor\"/> parameter will\n            unset the dib's previously set background color.\n            </para> \n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"bkcolor\">The new background color.\n            The first entry in the array is used.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <example>\n            <code>\n            // create a RGBQUAD color\n            RGBQUAD color = new RGBQUAD(Color.Green);\n            \n            // set the dib's background color (using the other version of the function)\n            FreeImage.SetBackgroundColor(dib, ref color);\n            \n            // remove it again (this only works due to the array parameter RGBQUAD[])\n            FreeImage.SetBackgroundColor(dib, null);\n            </code>\n            </example>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTransparentIndex(FreeImageAPI.FIBITMAP,System.Int32)\">\n            <summary>\n            Sets the index of the palette entry to be used as transparent color\n            for the image specified. Does nothing on high color images.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"index\">The index of the palette entry to be set as transparent color.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTransparentIndex(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the palette entry used as transparent color for the image specified.\n            Works for palletised images only and returns -1 for high color\n            images or if the image has no color set to be transparent.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>the index of the palette entry used as transparent color for\n            the image specified or -1 if there is no transparent color found\n            (e.g. the image is a high color image).</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetICCProfileEx(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Retrieves the <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> data of the bitmap.\n            This function can also be called safely, when the original format does not support profiles.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> data of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetICCProfile(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Retrieves a pointer to the <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> data of the bitmap.\n            This function can also be called safely, when the original format does not support profiles.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Pointer to the <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> data of the bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateICCProfile(FreeImageAPI.FIBITMAP,System.Byte[],System.Int32)\">\n            <summary>\n            Creates a new <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> block from ICC profile data previously read from a file\n            or built by a color management system. The profile data is attached to the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"data\">Pointer to the new <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> data.</param>\n            <param name=\"size\">Size of the <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> data.</param>\n            <returns>Pointer to the created <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> structure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.DestroyICCProfile(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            This function destroys an <see cref=\"T:FreeImageAPI.FIICCPROFILE\"/> previously created by <see cref=\"M:FreeImageAPI.FreeImage.CreateICCProfile(FreeImageAPI.FIBITMAP,System.Byte[],System.Int32)\"/>.\n            After this call the bitmap will contain no profile information.\n            This function should be called to ensure that a stored bitmap will not contain any profile information.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertTo4Bits(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to 4 bits.\n            If the bitmap was a high-color bitmap (16, 24 or 32-bit) or if it was a\n            monochrome or greyscale bitmap (1 or 8-bit), the end result will be a\n            greyscale bitmap, otherwise (1-bit palletised bitmaps) it will be a palletised bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertTo8Bits(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to 8 bits. If the bitmap was a high-color bitmap (16, 24 or 32-bit)\n            or if it was a monochrome or greyscale bitmap (1 or 4-bit), the end result will be a\n            greyscale bitmap, otherwise (1 or 4-bit palletised bitmaps) it will be a palletised bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertToGreyscale(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to a 8-bit greyscale image with a linear ramp.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertTo16Bits555(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to 16 bits, where each pixel has a color pattern of\n            5 bits red, 5 bits green and 5 bits blue. One bit in each pixel is unused.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertTo16Bits565(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to 16 bits, where each pixel has a color pattern of\n            5 bits red, 6 bits green and 5 bits blue.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertTo24Bits(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to 24 bits. A clone of the input bitmap is returned for 24-bit bitmaps.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertTo32Bits(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a bitmap to 32 bits. A clone of the input bitmap is returned for 32-bit bitmaps.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ColorQuantize(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE)\">\n            <summary>\n            Quantizes a high-color 24-bit bitmap to an 8-bit palette color bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"quantize\">Specifies the color reduction algorithm to be used.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ColorQuantizeEx(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,System.Int32,FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            ColorQuantizeEx is an extension to the <see cref=\"M:FreeImageAPI.FreeImage.ColorQuantize(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE)\"/> method that\n            provides additional options used to quantize a 24-bit image to any\n            number of colors (up to 256), as well as quantize a 24-bit image using a\n            partial or full provided palette.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"quantize\">Specifies the color reduction algorithm to be used.</param>\n            <param name=\"PaletteSize\">Size of the desired output palette.</param>\n            <param name=\"ReserveSize\">Size of the provided palette of ReservePalette.</param>\n            <param name=\"ReservePalette\">The provided palette.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Threshold(FreeImageAPI.FIBITMAP,System.Byte)\">\n            <summary>\n            Converts a bitmap to 1-bit monochrome bitmap using a threshold T between [0..255].\n            The function first converts the bitmap to a 8-bit greyscale bitmap.\n            Then, any brightness level that is less than T is set to zero, otherwise to 1.\n            For 1-bit input bitmaps, the function clones the input bitmap and builds a monochrome palette.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"t\">The threshold.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Dither(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_DITHER)\">\n            <summary>\n            Converts a bitmap to 1-bit monochrome bitmap using a dithering algorithm.\n            For 1-bit input bitmaps, the function clones the input bitmap and builds a monochrome palette.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"algorithm\">The dithering algorithm to use.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertFromRawBits(System.IntPtr,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.Boolean)\">\n            <summary>\n            Converts a raw bitmap to a FreeImage bitmap.\n            </summary>\n            <param name=\"bits\">Pointer to the memory block containing the raw bitmap.</param>\n            <param name=\"width\">The width in pixels of the raw bitmap.</param>\n            <param name=\"height\">The height in pixels of the raw bitmap.</param>\n            <param name=\"pitch\">Defines the total width of a scanline in the raw bitmap,\n            including padding bytes.</param>\n            <param name=\"bpp\">The bit depth (bits per pixel) of the raw bitmap.</param>\n            <param name=\"red_mask\">The bit mask describing the bits used to store a single \n            pixel's red component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"green_mask\">The bit mask describing the bits used to store a single\n            pixel's green component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"blue_mask\">The bit mask describing the bits used to store a single\n            pixel's blue component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"topdown\">If true, the raw bitmap is stored in top-down order (top-left pixel first)\n            and in bottom-up order (bottom-left pixel first) otherwise.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertFromRawBits(System.Byte[],System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.Boolean)\">\n            <summary>\n            Converts a raw bitmap to a FreeImage bitmap.\n            </summary>\n            <param name=\"bits\">Array of bytes containing the raw bitmap.</param>\n            <param name=\"width\">The width in pixels of the raw bitmap.</param>\n            <param name=\"height\">The height in pixels of the raw bitmap.</param>\n            <param name=\"pitch\">Defines the total width of a scanline in the raw bitmap,\n            including padding bytes.</param>\n            <param name=\"bpp\">The bit depth (bits per pixel) of the raw bitmap.</param>\n            <param name=\"red_mask\">The bit mask describing the bits used to store a single \n            pixel's red component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"green_mask\">The bit mask describing the bits used to store a single\n            pixel's green component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"blue_mask\">The bit mask describing the bits used to store a single\n            pixel's blue component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"topdown\">If true, the raw bitmap is stored in top-down order (top-left pixel first)\n            and in bottom-up order (bottom-left pixel first) otherwise.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertToRawBits(System.IntPtr,FreeImageAPI.FIBITMAP,System.Int32,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap to a raw bitmap, that is a raw piece of memory.\n            </summary>\n            <param name=\"bits\">Pointer to the memory block receiving the raw bitmap.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"pitch\">The desired total width in bytes of a scanline in the raw bitmap,\n            including any padding bytes.</param>\n            <param name=\"bpp\">The desired bit depth (bits per pixel) of the raw bitmap.</param>\n            <param name=\"red_mask\">The desired bit mask describing the bits used to store a single \n            pixel's red component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"green_mask\">The desired bit mask describing the bits used to store a single\n            pixel's green component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"blue_mask\">The desired bit mask describing the bits used to store a single\n            pixel's blue component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"topdown\">If true, the raw bitmap will be stored in top-down order (top-left pixel first)\n            and in bottom-up order (bottom-left pixel first) otherwise.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertToRawBits(System.Byte[],FreeImageAPI.FIBITMAP,System.Int32,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap to a raw bitmap, that is a raw piece of memory.\n            </summary>\n            <param name=\"bits\">Array of bytes receiving the raw bitmap.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"pitch\">The desired total width in bytes of a scanline in the raw bitmap,\n            including any padding bytes.</param>\n            <param name=\"bpp\">The desired bit depth (bits per pixel) of the raw bitmap.</param>\n            <param name=\"red_mask\">The desired bit mask describing the bits used to store a single \n            pixel's red component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"green_mask\">The desired bit mask describing the bits used to store a single\n            pixel's green component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"blue_mask\">The desired bit mask describing the bits used to store a single\n            pixel's blue component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"topdown\">If true, the raw bitmap will be stored in top-down order (top-left pixel first)\n            and in bottom-up order (bottom-left pixel first) otherwise.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertToRGBF(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a 24- or 32-bit RGB(A) standard image or a 48-bit RGB image to a FIT_RGBF type image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertToStandardType(FreeImageAPI.FIBITMAP,System.Boolean)\">\n             <summary>\n             Converts a non standard image whose color type is FIC_MINISBLACK\n             to a standard 8-bit greyscale image.\n             </summary>\n             <param name=\"src\">Handle to a FreeImage bitmap.</param>\n             <param name=\"scale_linear\">When true the conversion is done by scaling linearly\n             each pixel value from [min, max] to an integer value between [0..255],\n             where min and max are the minimum and maximum pixel values in the image.\n             When false the conversion is done by rounding each pixel value to an integer between [0..255].\n            \n             Rounding is done using the following formula:\n            \n             dst_pixel = (BYTE) MIN(255, MAX(0, q)) where int q = int(src_pixel + 0.5);</param>\n             <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertToType(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_TYPE,System.Boolean)\">\n            <summary>\n            Converts an image of any type to type dst_type.\n            </summary>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"dst_type\">Destination type.</param>\n            <param name=\"scale_linear\">True to scale linear, else false.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ToneMapping(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_TMO,System.Double,System.Double)\">\n            <summary>\n            Converts a High Dynamic Range image (48-bit RGB or 96-bit RGBF) to a 24-bit RGB image, suitable for display.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"tmo\">The tone mapping operator to be used.</param>\n            <param name=\"first_param\">Parmeter depending on the used algorithm</param>\n            <param name=\"second_param\">Parmeter depending on the used algorithm</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.TmoDrago03(FreeImageAPI.FIBITMAP,System.Double,System.Double)\">\n            <summary>\n            Converts a High Dynamic Range image to a 24-bit RGB image using a global\n            operator based on logarithmic compression of luminance values, imitating the human response to light.\n            </summary>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"gamma\">A gamma correction that is applied after the tone mapping.\n            A value of 1 means no correction.</param>\n            <param name=\"exposure\">Scale factor allowing to adjust the brightness of the output image.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.TmoReinhard05(FreeImageAPI.FIBITMAP,System.Double,System.Double)\">\n            <summary>\n            Converts a High Dynamic Range image to a 24-bit RGB image using a global operator inspired\n            by photoreceptor physiology of the human visual system.\n            </summary>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"intensity\">Controls the overall image intensity in the range [-8, 8].</param>\n            <param name=\"contrast\">Controls the overall image contrast in the range [0.3, 1.0[.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.TmoFattal02(FreeImageAPI.FIBITMAP,System.Double,System.Double)\">\n            <summary>\n            Apply the Gradient Domain High Dynamic Range Compression to a RGBF image and convert to 24-bit RGB.\n            </summary>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"color_saturation\">Color saturation (s parameter in the paper) in [0.4..0.6]</param>\n            <param name=\"attenuation\">Atenuation factor (beta parameter in the paper) in [0.8..0.9]</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ZLibCompress(System.Byte[],System.UInt32,System.Byte[],System.UInt32)\">\n            <summary>\n            Compresses a source buffer into a target buffer, using the ZLib library.\n            </summary>\n            <param name=\"target\">Pointer to the target buffer.</param>\n            <param name=\"target_size\">Size of the target buffer.\n            Must be at least 0.1% larger than source_size plus 12 bytes.</param>\n            <param name=\"source\">Pointer to the source buffer.</param>\n            <param name=\"source_size\">Size of the source buffer.</param>\n            <returns>The actual size of the compressed buffer, or 0 if an error occurred.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ZLibUncompress(System.Byte[],System.UInt32,System.Byte[],System.UInt32)\">\n            <summary>\n            Decompresses a source buffer into a target buffer, using the ZLib library.\n            </summary>\n            <param name=\"target\">Pointer to the target buffer.</param>\n            <param name=\"target_size\">Size of the target buffer.\n            Must have been saved outlide of zlib.</param>\n            <param name=\"source\">Pointer to the source buffer.</param>\n            <param name=\"source_size\">Size of the source buffer.</param>\n            <returns>The actual size of the uncompressed buffer, or 0 if an error occurred.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ZLibGZip(System.Byte[],System.UInt32,System.Byte[],System.UInt32)\">\n            <summary>\n            Compresses a source buffer into a target buffer, using the ZLib library.\n            </summary>\n            <param name=\"target\">Pointer to the target buffer.</param>\n            <param name=\"target_size\">Size of the target buffer.\n            Must be at least 0.1% larger than source_size plus 24 bytes.</param>\n            <param name=\"source\">Pointer to the source buffer.</param>\n            <param name=\"source_size\">Size of the source buffer.</param>\n            <returns>The actual size of the compressed buffer, or 0 if an error occurred.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ZLibGUnzip(System.Byte[],System.UInt32,System.Byte[],System.UInt32)\">\n            <summary>\n            Decompresses a source buffer into a target buffer, using the ZLib library.\n            </summary>\n            <param name=\"target\">Pointer to the target buffer.</param>\n            <param name=\"target_size\">Size of the target buffer.\n            Must have been saved outlide of zlib.</param>\n            <param name=\"source\">Pointer to the source buffer.</param>\n            <param name=\"source_size\">Size of the source buffer.</param>\n            <returns>The actual size of the uncompressed buffer, or 0 if an error occurred.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ZLibCRC32(System.UInt32,System.Byte[],System.UInt32)\">\n            <summary>\n            Generates a CRC32 checksum.\n            </summary>\n            <param name=\"crc\">The CRC32 checksum to begin with.</param>\n            <param name=\"source\">Pointer to the source buffer.\n            If the value is 0, the function returns the required initial value for the crc.</param>\n            <param name=\"source_size\">Size of the source buffer.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateTag\">\n            <summary>\n            Allocates a new <see cref=\"T:FreeImageAPI.FITAG\"/> object.\n            This object must be destroyed with a call to\n            <see cref=\"M:FreeImageAPI.FreeImage.DeleteTag(FreeImageAPI.FITAG)\"/> when no longer in use.\n            </summary>\n            <returns>The new <see cref=\"T:FreeImageAPI.FITAG\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.DeleteTag(FreeImageAPI.FITAG)\">\n            <summary>\n            Delete a previously allocated <see cref=\"T:FreeImageAPI.FITAG\"/> object.\n            </summary>\n            <param name=\"tag\">The <see cref=\"T:FreeImageAPI.FITAG\"/> to destroy.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloneTag(FreeImageAPI.FITAG)\">\n            <summary>\n            Creates and returns a copy of a <see cref=\"T:FreeImageAPI.FITAG\"/> object.\n            </summary>\n            <param name=\"tag\">The <see cref=\"T:FreeImageAPI.FITAG\"/> to clone.</param>\n            <returns>The new <see cref=\"T:FreeImageAPI.FITAG\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagKey(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the tag field name (unique inside a metadata model).\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>The field name.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagDescription(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the tag description.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>The description or NULL if unavailable.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagID(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the tag ID.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>The ID or 0 if unavailable.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagType(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the tag data type.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>The tag type.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagCount(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the number of components in the tag (in tag type units).\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>The number of components.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagLength(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the length of the tag value in bytes.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>The length of the tag value.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTagValue(FreeImageAPI.FITAG)\">\n            <summary>\n            Returns the tag value.\n            It is up to the programmer to interpret the returned pointer correctly,\n            according to the results of GetTagType and GetTagCount.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <returns>Pointer to the value.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagKey(FreeImageAPI.FITAG,System.String)\">\n            <summary>\n            Sets the tag field name.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"key\">The new name.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagDescription(FreeImageAPI.FITAG,System.String)\">\n            <summary>\n            Sets the tag description.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"description\">The new description.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagID(FreeImageAPI.FITAG,System.UInt16)\">\n            <summary>\n            Sets the tag ID.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"id\">The new ID.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagType(FreeImageAPI.FITAG,FreeImageAPI.FREE_IMAGE_MDTYPE)\">\n            <summary>\n            Sets the tag data type.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"type\">The new type.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagCount(FreeImageAPI.FITAG,System.UInt32)\">\n            <summary>\n            Sets the number of data in the tag.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"count\">New number of data.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagLength(FreeImageAPI.FITAG,System.UInt32)\">\n            <summary>\n            Sets the length of the tag value in bytes.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"length\">The new length.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTagValue(FreeImageAPI.FITAG,System.Byte[])\">\n            <summary>\n            Sets the tag value.\n            </summary>\n            <param name=\"tag\">The tag field.</param>\n            <param name=\"value\">Pointer to the new value.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FindFirstMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,FreeImageAPI.FITAG@)\">\n            <summary>\n            Provides information about the first instance of a tag that matches the metadata model.\n            </summary>\n            <param name=\"model\">The model to match.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"tag\">Tag that matches the metadata model.</param>\n            <returns>Unique search handle that can be used to call FindNextMetadata or FindCloseMetadata.\n            Null if the metadata model does not exist.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FindNextMetadata(FreeImageAPI.FIMETADATA,FreeImageAPI.FITAG@)\">\n            <summary>\n            Find the next tag, if any, that matches the metadata model argument in a previous call\n            to FindFirstMetadata, and then alters the tag object contents accordingly.\n            </summary>\n            <param name=\"mdhandle\">Unique search handle provided by FindFirstMetadata.</param>\n            <param name=\"tag\">Tag that matches the metadata model.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FindCloseMetadata_(FreeImageAPI.FIMETADATA)\">\n            <summary>\n            Closes the specified metadata search handle and releases associated resources.\n            </summary>\n            <param name=\"mdhandle\">The handle to close.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FITAG@)\">\n            <summary>\n            Retrieve a metadata attached to a dib.\n            </summary>\n            <param name=\"model\">The metadata model to look for.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"key\">The metadata field name.</param>\n            <param name=\"tag\">A FITAG structure returned by the function.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FITAG)\">\n            <summary>\n            Attach a new FreeImage tag to a dib.\n            </summary>\n            <param name=\"model\">The metadata model used to store the tag.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"key\">The tag field name.</param>\n            <param name=\"tag\">The FreeImage tag to be attached.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetMetadataCount(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the number of tags contained in the model metadata model attached to the input dib.\n            </summary>\n            <param name=\"model\">The metadata model.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Number of tags contained in the metadata model.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloneMetadata(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Copies the metadata of FreeImage bitmap to another.\n            </summary>\n            <param name=\"dst\">The FreeImage bitmap to copy the metadata to.</param>\n            <param name=\"src\">The FreeImage bitmap to copy the metadata from.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.TagToString(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FITAG,System.UInt32)\">\n            <summary>\n            Converts a FreeImage tag structure to a string that represents the interpreted tag value.\n            The function is not thread safe.\n            </summary>\n            <param name=\"model\">The metadata model.</param>\n            <param name=\"tag\">The interpreted tag value.</param>\n            <param name=\"Make\">Reserved.</param>\n            <returns>The representing string.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.RotateClassic(FreeImageAPI.FIBITMAP,System.Double)\">\n            <summary>\n            This function rotates a 1-, 8-bit greyscale or a 24-, 32-bit color image by means of 3 shears.\n            1-bit images rotation is limited to integer multiple of 90?\n            <c>null</c> is returned for other values.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"angle\">The angle of rotation.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.RotateEx(FreeImageAPI.FIBITMAP,System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            This function performs a rotation and / or translation of an 8-bit greyscale,\n            24- or 32-bit image, using a 3rd order (cubic) B-Spline.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"angle\">The angle of rotation.</param>\n            <param name=\"x_shift\">Horizontal image translation.</param>\n            <param name=\"y_shift\">Vertical image translation.</param>\n            <param name=\"x_origin\">Rotation center x-coordinate.</param>\n            <param name=\"y_origin\">Rotation center y-coordinate.</param>\n            <param name=\"use_mask\">When true the irrelevant part of the image is set to a black color,\n            otherwise, a mirroring technique is used to fill irrelevant pixels.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FlipHorizontal(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Flip the input dib horizontally along the vertical axis.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FlipVertical(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Flip the input dib vertically along the horizontal axis.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.JPEGTransform(System.String,System.String,FreeImageAPI.FREE_IMAGE_JPEG_OPERATION,System.Boolean)\">\n            <summary>\n            Performs a lossless rotation or flipping on a JPEG file.\n            </summary>\n            <param name=\"src_file\">Source file.</param>\n            <param name=\"dst_file\">Destination file; can be the source file; will be overwritten.</param>\n            <param name=\"operation\">The operation to apply.</param>\n            <param name=\"perfect\">To avoid lossy transformation, you can set the perfect parameter to true.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Rescale(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,FreeImageAPI.FREE_IMAGE_FILTER)\">\n            <summary>\n            Performs resampling (or scaling, zooming) of a greyscale or RGB(A) image\n            to the desired destination width and height.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"dst_width\">Destination width.</param>\n            <param name=\"dst_height\">Destination height.</param>\n            <param name=\"filter\">The filter to apply.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MakeThumbnail(FreeImageAPI.FIBITMAP,System.Int32,System.Boolean)\">\n            <summary>\n            Creates a thumbnail from a greyscale or RGB(A) image, keeping aspect ratio.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"max_pixel_size\">Thumbnail square size.</param>\n            <param name=\"convert\">When true HDR images are transperantly converted to standard images.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Perfoms an histogram transformation on a 8-, 24- or 32-bit image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"lookUpTable\">The lookup table.\n            It's size is assumed to be 256 in length.</param>\n            <param name=\"channel\">The color channel to be transformed.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AdjustGamma(FreeImageAPI.FIBITMAP,System.Double)\">\n            <summary>\n            Performs gamma correction on a 8-, 24- or 32-bit image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"gamma\">The parameter represents the gamma value to use (gamma > 0).\n            A value of 1.0 leaves the image alone, less than one darkens it, and greater than one lightens it.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AdjustBrightness(FreeImageAPI.FIBITMAP,System.Double)\">\n            <summary>\n            Adjusts the brightness of a 8-, 24- or 32-bit image by a certain amount.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"percentage\">A value 0 means no change,\n            less than 0 will make the image darker and greater than 0 will make the image brighter.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AdjustContrast(FreeImageAPI.FIBITMAP,System.Double)\">\n            <summary>\n            Adjusts the contrast of a 8-, 24- or 32-bit image by a certain amount.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"percentage\">A value 0 means no change,\n            less than 0 will decrease the contrast and greater than 0 will increase the contrast of the image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Invert(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Inverts each pixel data.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetHistogram(FreeImageAPI.FIBITMAP,System.Int32[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Computes the image histogram.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"histo\">Array of integers with a size of 256.</param>\n            <param name=\"channel\">Channel to compute from.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetChannel(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Retrieves the red, green, blue or alpha channel of a 24- or 32-bit image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"channel\">The color channel to extract.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetChannel(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Insert a 8-bit dib into a 24- or 32-bit image.\n            Both images must have to same width and height.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"dib8\">Handle to the bitmap to insert.</param>\n            <param name=\"channel\">The color channel to replace.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetComplexChannel(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Retrieves the real part, imaginary part, magnitude or phase of a complex image.\n            </summary>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"channel\">The color channel to extract.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetComplexChannel(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\">\n            <summary>\n            Set the real or imaginary part of a complex image.\n            Both images must have to same width and height.\n            </summary>\n            <param name=\"dst\">Handle to a FreeImage bitmap.</param>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"channel\">The color channel to replace.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Copy(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Copy a sub part of the current dib image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"left\">Specifies the left position of the cropped rectangle.</param>\n            <param name=\"top\">Specifies the top position of the cropped rectangle.</param>\n            <param name=\"right\">Specifies the right position of the cropped rectangle.</param>\n            <param name=\"bottom\">Specifies the bottom position of the cropped rectangle.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Paste(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Alpha blend or combine a sub part image with the current dib image.\n            The bit depth of the dst bitmap must be greater than or equal to the bit depth of the src.\n            </summary>\n            <param name=\"dst\">Handle to a FreeImage bitmap.</param>\n            <param name=\"src\">Handle to a FreeImage bitmap.</param>\n            <param name=\"left\">Specifies the left position of the sub image.</param>\n            <param name=\"top\">Specifies the top position of the sub image.</param>\n            <param name=\"alpha\">alpha blend factor.\n            The source and destination images are alpha blended if alpha=0..255.\n            If alpha > 255, then the source image is combined to the destination image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Composite(FreeImageAPI.FIBITMAP,System.Boolean,FreeImageAPI.RGBQUAD@,FreeImageAPI.FIBITMAP)\">\n            <summary>\n            This function composite a transparent foreground image against a single background color or\n            against a background image.\n            </summary>\n            <param name=\"fg\">Handle to a FreeImage bitmap.</param>\n            <param name=\"useFileBkg\">When true the background of fg is used if it contains one.</param>\n            <param name=\"appBkColor\">The application background is used if useFileBkg is false.</param>\n            <param name=\"bg\">Image used as background when useFileBkg is false or fg has no background\n            and appBkColor is null.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Composite(FreeImageAPI.FIBITMAP,System.Boolean,FreeImageAPI.RGBQUAD[],FreeImageAPI.FIBITMAP)\">\n            <summary>\n            This function composite a transparent foreground image against a single background color or\n            against a background image.\n            </summary>\n            <param name=\"fg\">Handle to a FreeImage bitmap.</param>\n            <param name=\"useFileBkg\">When true the background of fg is used if it contains one.</param>\n            <param name=\"appBkColor\">The application background is used if useFileBkg is false\n            and 'appBkColor' is not null.</param>\n            <param name=\"bg\">Image used as background when useFileBkg is false or fg has no background\n            and appBkColor is null.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.JPEGCrop(System.String,System.String,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Performs a lossless crop on a JPEG file.\n            </summary>\n            <param name=\"src_file\">Source filename.</param>\n            <param name=\"dst_file\">Destination filename.</param>\n            <param name=\"left\">Specifies the left position of the cropped rectangle.</param>\n            <param name=\"top\">Specifies the top position of the cropped rectangle.</param>\n            <param name=\"right\">Specifies the right position of the cropped rectangle.</param>\n            <param name=\"bottom\">Specifies the bottom position of the cropped rectangle.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.PreMultiplyWithAlpha(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Applies the alpha value of each pixel to its color components.\n            The aplha value stays unchanged.\n            Only works with 32-bits color depth.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MultigridPoissonSolver(FreeImageAPI.FIBITMAP,System.Int32)\">\n            <summary>\n            Solves a Poisson equation, remap result pixels to [0..1] and returns the solution.\n            </summary>\n            <param name=\"Laplacian\">Handle to a FreeImage bitmap.</param>\n            <param name=\"ncycle\">Number of cycles in the multigrid algorithm (usually 2 or 3)</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetAdjustColorsLookupTable(System.Byte[],System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            Creates a lookup table to be used with <see cref=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\"/> which may adjusts brightness and\n            contrast, correct gamma and invert the image with a single call to <see cref=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\"/>.\n            </summary>\n            <param name=\"lookUpTable\">Output lookup table to be used with <see cref=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\"/>.\n            The size of 'lookUpTable' is assumed to be 256.</param>\n            <param name=\"brightness\">Percentage brightness value where -100 &lt;= brightness &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will make the image darker and greater\n            than 0 will make the image brighter.</para></param>\n            <param name=\"contrast\">Percentage contrast value where -100 &lt;= contrast &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will decrease the contrast\n            and greater than 0 will increase the contrast of the image.</para></param>\n            <param name=\"gamma\">Gamma value to be used for gamma correction.\n            <para>A value of 1.0 leaves the image alone, less than one darkens it,\n            and greater than one lightens it.</para></param>\n            <param name=\"invert\">If set to true, the image will be inverted.</param>\n            <returns>The number of adjustments applied to the resulting lookup table\n            compared to a blind lookup table.</returns>\n            <remarks>\n            This function creates a lookup table to be used with <see cref=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\"/> which may adjust\n            brightness and contrast, correct gamma and invert the image with a single call to\n            <see cref=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\"/>. If more than one of these image display properties need to be adjusted,\n            using a combined lookup table should be preferred over calling each adjustment function\n            separately. That's particularly true for huge images or if performance is an issue. Then,\n            the expensive process of iterating over all pixels of an image is performed only once and\n            not up to four times.\n            <para/>\n            Furthermore, the lookup table created does not depend on the order, in which each single\n            adjustment operation is performed. Due to rounding and byte casting issues, it actually\n            matters in which order individual adjustment operations are performed. Both of the following\n            snippets most likely produce different results:\n            <para/>\n            <code>\n            // snippet 1: contrast, brightness\n            AdjustContrast(dib, 15.0);\n            AdjustBrightness(dib, 50.0); \n            </code>\n            <para/>\n            <code>\n            // snippet 2: brightness, contrast\n            AdjustBrightness(dib, 50.0);\n            AdjustContrast(dib, 15.0);\n            </code>\n            <para/>\n            Better and even faster would be snippet 3:\n            <para/>\n            <code>\n            // snippet 3:\n            byte[] lut = new byte[256];\n            GetAdjustColorsLookupTable(lut, 50.0, 15.0, 1.0, false);\n            AdjustCurve(dib, lut, FREE_IMAGE_COLOR_CHANNEL.FICC_RGB);\n            </code>\n            <para/>\n            This function is also used internally by <see cref=\"M:FreeImageAPI.FreeImage.AdjustColors(FreeImageAPI.FIBITMAP,System.Double,System.Double,System.Double,System.Boolean)\"/>, which does not return the\n            lookup table, but uses it to call <see cref=\"M:FreeImageAPI.FreeImage.AdjustCurve(FreeImageAPI.FIBITMAP,System.Byte[],FreeImageAPI.FREE_IMAGE_COLOR_CHANNEL)\"/> on the passed image.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AdjustColors(FreeImageAPI.FIBITMAP,System.Double,System.Double,System.Double,System.Boolean)\">\n            <summary>\n            Adjusts an image's brightness, contrast and gamma as well as it may\n            optionally invert the image within a single operation.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"brightness\">Percentage brightness value where -100 &lt;= brightness &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will make the image darker and greater\n            than 0 will make the image brighter.</para></param>\n            <param name=\"contrast\">Percentage contrast value where -100 &lt;= contrast &lt;= 100.\n            <para>A value of 0 means no change, less than 0 will decrease the contrast\n            and greater than 0 will increase the contrast of the image.</para></param>\n            <param name=\"gamma\">Gamma value to be used for gamma correction.\n            <para>A value of 1.0 leaves the image alone, less than one darkens it,\n            and greater than one lightens it.</para>\n            This parameter must not be zero or smaller than zero.\n            If so, it will be ignored and no gamma correction will be performed on the image.</param>\n            <param name=\"invert\">If set to true, the image will be inverted.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <remarks>\n            This function adjusts an image's brightness, contrast and gamma as well as it\n            may optionally invert the image within a single operation. If more than one of\n            these image display properties need to be adjusted, using this function should\n            be preferred over calling each adjustment function separately. That's particularly\n            true for huge images or if performance is an issue.\n            <para/>\n            This function relies on <see cref=\"M:FreeImageAPI.FreeImage.GetAdjustColorsLookupTable(System.Byte[],System.Double,System.Double,System.Double,System.Boolean)\"/>,\n            which creates a single lookup table, that combines all adjustment operations requested.\n            <para/>\n            Furthermore, the lookup table created by <see cref=\"M:FreeImageAPI.FreeImage.GetAdjustColorsLookupTable(System.Byte[],System.Double,System.Double,System.Double,System.Boolean)\"/> does\n            not depend on the order, in which each single adjustment operation is performed.\n            Due to rounding and byte casting issues, it actually matters in which order individual\n            adjustment operations are performed. Both of the following snippets most likely produce\n            different results:\n            <para/>\n            <code>\n            // snippet 1: contrast, brightness\n            AdjustContrast(dib, 15.0);\n            AdjustBrightness(dib, 50.0);\n            </code>\n            <para/>\n            <code>\n            // snippet 2: brightness, contrast\n            AdjustBrightness(dib, 50.0);\n            AdjustContrast(dib, 15.0);\n            </code>\n            <para/>\n            Better and even faster would be snippet 3:\n            <para/>\n            <code>\n            // snippet 3:\n            AdjustColors(dib, 50.0, 15.0, 1.0, false);\n            </code>\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ApplyColorMapping(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD[],FreeImageAPI.RGBQUAD[],System.UInt32,System.Boolean,System.Boolean)\">\n            <summary>\n            Applies color mapping for one or several colors on a 1-, 4- or 8-bit\n            palletized or a 16-, 24- or 32-bit high color image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"srccolors\">Array of colors to be used as the mapping source.</param>\n            <param name=\"dstcolors\">Array of colors to be used as the mapping destination.</param>\n            <param name=\"count\">The number of colors to be mapped. This is the size of both\n            srccolors and dstcolors.</param>\n            <param name=\"ignore_alpha\">If true, 32-bit images and colors are treated as 24-bit.</param>\n            <param name=\"swap\">If true, source and destination colors are swapped, that is,\n            each destination color is also mapped to the corresponding source color.</param>\n            <returns>The total number of pixels changed.</returns>\n            <remarks>\n            This function maps up to <paramref name=\"count\"/> colors specified in\n            <paramref name=\"srccolors\"/> to these specified in <paramref name=\"dstcolors\"/>.\n            Thereby, color <i>srccolors[N]</i>, if found in the image, will be replaced by color\n            <i>dstcolors[N]</i>. If <paramref name=\"swap\"/> is <b>true</b>, additionally all colors\n            specified in <paramref name=\"dstcolors\"/> are also mapped to these specified\n            in <paramref name=\"srccolors\"/>. For high color images, the actual image data will be\n            modified whereas, for palletized images only the palette will be changed.\n            <para/>\n            The function returns the number of pixels changed or zero, if no pixels were changed. \n            <para/>\n            Both arrays <paramref name=\"srccolors\"/> and <paramref name=\"dstcolors\"/> are assumed\n            not to hold less than <paramref name=\"count\"/> colors.\n            <para/>\n            For 16-bit images, all colors specified are transparently converted to their \n            proper 16-bit representation (either in RGB555 or RGB565 format, which is determined\n            by the image's red- green- and blue-mask).\n            <para/>\n            <b>Note, that this behaviour is different from what <see cref=\"M:FreeImageAPI.FreeImage.ApplyPaletteIndexMapping(FreeImageAPI.FIBITMAP,System.Byte[],System.Byte[],System.UInt32,System.Boolean)\"/> does,\n            which modifies the actual image data on palletized images.</b>\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SwapColors(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD@,FreeImageAPI.RGBQUAD@,System.Boolean)\">\n            <summary>\n            Swaps two specified colors on a 1-, 4- or 8-bit palletized\n            or a 16-, 24- or 32-bit high color image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"color_a\">One of the two colors to be swapped.</param>\n            <param name=\"color_b\">The other of the two colors to be swapped.</param>\n            <param name=\"ignore_alpha\">If true, 32-bit images and colors are treated as 24-bit.</param>\n            <returns>The total number of pixels changed.</returns>\n            <remarks>\n            This function swaps the two specified colors <paramref name=\"color_a\"/> and\n            <paramref name=\"color_b\"/> on a palletized or high color image.\n            For high color images, the actual image data will be modified whereas, for palletized\n            images only the palette will be changed.\n            <para/>\n            <b>Note, that this behaviour is different from what <see cref=\"M:FreeImageAPI.FreeImage.SwapPaletteIndices(FreeImageAPI.FIBITMAP,System.Byte@,System.Byte@)\"/> does,\n            which modifies the actual image data on palletized images.</b>\n            <para/>\n            This is just a thin wrapper for <see cref=\"M:FreeImageAPI.FreeImage.ApplyColorMapping(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD[],FreeImageAPI.RGBQUAD[],System.UInt32,System.Boolean,System.Boolean)\"/> and resolves to:\n            <para/>\n            <code>\n            return ApplyColorMapping(dib, color_a, color_b, 1, ignore_alpha, true);\n            </code>\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ApplyPaletteIndexMapping(FreeImageAPI.FIBITMAP,System.Byte[],System.Byte[],System.UInt32,System.Boolean)\">\n            <summary>\n            Applies palette index mapping for one or several indices\n            on a 1-, 4- or 8-bit palletized image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"srcindices\">Array of palette indices to be used as the mapping source.</param>\n            <param name=\"dstindices\">Array of palette indices to be used as the mapping destination.</param>\n            <param name=\"count\">The number of palette indices to be mapped. This is the size of both\n            srcindices and dstindices</param>\n            <param name=\"swap\">If true, source and destination palette indices are swapped, that is,\n            each destination index is also mapped to the corresponding source index.</param>\n            <returns>The total number of pixels changed.</returns>\n            <remarks>\n            This function maps up to <paramref name=\"count\"/> palette indices specified in\n            <paramref name=\"srcindices\"/> to these specified in <paramref name=\"dstindices\"/>.\n            Thereby, index <i>srcindices[N]</i>, if present in the image, will be replaced by index\n            <i>dstindices[N]</i>. If <paramref name=\"swap\"/> is <b>true</b>, additionally all indices\n            specified in <paramref name=\"dstindices\"/> are also mapped to these specified in \n            <paramref name=\"srcindices\"/>.\n            <para/>\n            The function returns the number of pixels changed or zero, if no pixels were changed.\n            Both arrays <paramref name=\"srcindices\"/> and <paramref name=\"dstindices\"/> are assumed not to\n            hold less than <paramref name=\"count\"/> indices.\n            <para/>\n            <b>Note, that this behaviour is different from what <see cref=\"M:FreeImageAPI.FreeImage.ApplyColorMapping(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD[],FreeImageAPI.RGBQUAD[],System.UInt32,System.Boolean,System.Boolean)\"/> does, which\n            modifies the actual image data on palletized images.</b>\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SwapPaletteIndices(FreeImageAPI.FIBITMAP,System.Byte@,System.Byte@)\">\n            <summary>\n            Swaps two specified palette indices on a 1-, 4- or 8-bit palletized image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"index_a\">One of the two palette indices to be swapped.</param>\n            <param name=\"index_b\">The other of the two palette indices to be swapped.</param>\n            <returns>The total number of pixels changed.</returns>\n            <remarks>\n            This function swaps the two specified palette indices <i>index_a</i> and\n            <i>index_b</i> on a palletized image. Therefore, not the palette, but the\n            actual image data will be modified.\n            <para/>\n            <b>Note, that this behaviour is different from what <see cref=\"M:FreeImageAPI.FreeImage.SwapColors(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD@,FreeImageAPI.RGBQUAD@,System.Boolean)\"/> does on palletized images,\n            which only swaps the colors in the palette.</b>\n            <para/>\n            This is just a thin wrapper for <see cref=\"M:FreeImageAPI.FreeImage.ApplyColorMapping(FreeImageAPI.FIBITMAP,FreeImageAPI.RGBQUAD[],FreeImageAPI.RGBQUAD[],System.UInt32,System.Boolean,System.Boolean)\"/> and resolves to:\n            <para/>\n            <code>\n            return ApplyPaletteIndexMapping(dib, index_a, index_b, 1, true);\n            </code>\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.FREE_IMAGE_MDMODELS\">\n            <summary>\n            Array containing all 'FREE_IMAGE_MDMODEL's.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.streamHandles\">\n            <summary>\n            Stores handles used to read from streams.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.WrapperVersion\">\n            <summary>\n            Version of the wrapper library.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.BI_RGB\">\n            <summary>\n            An uncompressed format.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.BI_RLE8\">\n            <summary>\n            A run-length encoded (RLE) format for bitmaps with 8 bpp. The compression format is a 2-byte\n            format consisting of a count byte followed by a byte containing a color index.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.BI_RLE4\">\n            <summary>\n            An RLE format for bitmaps with 4 bpp. The compression format is a 2-byte format consisting\n            of a count byte followed by two word-length color indexes.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.BI_BITFIELDS\">\n            <summary>\n            Specifies that the bitmap is not compressed and that the color table consists of three\n            <b>DWORD</b> color masks that specify the red, green, and blue components, respectively,\n            of each pixel. This is valid when used with 16- and 32-bpp bitmaps.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.BI_JPEG\">\n            <summary>\n            <b>Windows 98/Me, Windows 2000/XP:</b> Indicates that the image is a JPEG image.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.BI_PNG\">\n            <summary>\n            <b>Windows 98/Me, Windows 2000/XP:</b> Indicates that the image is a PNG image.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetWrapperVersion\">\n            <summary>\n            Returns the internal version of this FreeImage .NET wrapper.\n            </summary>\n            <returns>The internal version of this FreeImage .NET wrapper.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetNativeVersion\">\n            <summary>\n            Returns the version of the native FreeImage library.\n            </summary>\n            <returns>The version of the native FreeImage library.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsAvailable\">\n            <summary>\n            Returns a value indicating if the FreeImage library is available or not.\n            See remarks for further details.\n            </summary>\n            <returns><c>false</c> if the file is not available or out of date;\n            <c>true</c>, otherwise.</returns>\n            <remarks>\n            The FreeImage.NET library is a wrapper for the native C++ library\n            (FreeImage.dll ... dont mix ist up with this library FreeImageNet.dll).\n            The native library <b>must</b> be either in the same folder as the program's\n            executable or in a folder contained in the envirent variable <i>PATH</i>\n            (for example %WINDIR%\\System32).<para/>\n            Further more must both libraries, including the program itself,\n            be the same architecture (x86 or x64).\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Creates a new bitmap in memory.\n            </summary>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new Bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmap</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Creates a new bitmap in memory.\n            </summary>\n            <param name=\"type\">Type of the image.</param>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new Bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmap</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AllocateEx(System.Int32,System.Int32,System.Int32,System.Nullable{FreeImageAPI.RGBQUAD},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS,FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Allocates a new image of the specified width, height and bit depth and optionally\n            fills it with the specified color. See remarks for further details.\n            </summary>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmaps.</param>\n            <param name=\"color\">The color to fill the bitmap with or <c>null</c>.</param>\n            <param name=\"options\">Options to enable or disable function-features.</param>\n            <param name=\"palette\">The palette of the bitmap or <c>null</c>.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>\n            This function is an extension to <see cref=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, which additionally supports\n            specifying a palette to be set for the newly create image, as well as specifying a\n            background color, the newly created image should initially be filled with.\n            <para/>\n            Basically, this function internally relies on function <see cref=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, followed by a\n            call to <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. This is why both parameters\n            <paramref name=\"color\"/> and <paramref name=\"options\"/> behave the same as it is\n            documented for function <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>.\n            So, please refer to the documentation of <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> to\n            learn more about parameters <paramref name=\"color\"/> and <paramref name=\"options\"/>.\n            <para/>\n            The palette specified through parameter <paramref name=\"palette\"/> is only copied to the\n            newly created image, if the desired bit depth is smaller than or equal to 8 bits per pixel.\n            In other words, the <paramref name=\"palette\"/> parameter is only taken into account for\n            palletized images. So, for an 8-bit image, the length is 256, for an 4-bit image it is 16\n            and it is 2 for a 1-bit image. In other words, this function does not support partial palettes.\n            <para/>\n            However, specifying a palette is not necesarily needed, even for palletized images. This\n            function is capable of implicitly creating a palette, if <paramref name=\"palette\"/> is <c>null</c>.\n            If the specified background color is a greyscale value (red = green = blue) or if option\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/> is specified, a greyscale palette\n            is created. For a 1-bit image, only if the specified background color is either black or white,\n            a monochrome palette, consisting of black and white only is created. In any case, the darker\n            colors are stored at the smaller palette indices.\n            <para/>\n            If the specified background color is not a greyscale value, or is neither black nor white\n            for a 1-bit image, solely this specified color is injected into the otherwise black-initialized\n            palette. For this operation, option <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/>\n            is implicit, so the specified <paramref name=\"color\"/> is applied to the palette entry,\n            specified by the background color's <see cref=\"F:FreeImageAPI.RGBQUAD.rgbReserved\"/> field.\n            The image is then filled with this palette index.\n            <para/>\n            This function returns a newly created image as function <see cref=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/> does, if both\n            parameters <paramref name=\"color\"/> and <paramref name=\"palette\"/> are <c>null</c>.\n            If only <paramref name=\"color\"/> is <c>null</c>, the palette pointed to by\n            parameter <paramref name=\"palette\"/> is initially set for the new image, if a palletized\n            image of type <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> is created.\n            However, in the latter case, this function returns an image, whose\n            pixels are all initialized with zeros so, the image will be filled with the color of the\n            first palette entry.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AllocateEx(System.Int32,System.Int32,System.Int32,System.Nullable{FreeImageAPI.RGBQUAD},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS,FreeImageAPI.RGBQUAD[],System.UInt32,System.UInt32,System.UInt32)\">\n            <summary>\n            Allocates a new image of the specified width, height and bit depth and optionally\n            fills it with the specified color. See remarks for further details.\n            </summary>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmaps.</param>\n            <param name=\"color\">The color to fill the bitmap with or <c>null</c>.</param>\n            <param name=\"options\">Options to enable or disable function-features.</param>\n            <param name=\"palette\">The palette of the bitmap or <c>null</c>.</param>\n            <param name=\"red_mask\">Red part of the color layout.\n            eg: 0xFF0000</param>\n            <param name=\"green_mask\">Green part of the color layout.\n            eg: 0x00FF00</param>\n            <param name=\"blue_mask\">Blue part of the color layout.\n            eg: 0x0000FF</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>\n            This function is an extension to <see cref=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, which additionally supports\n            specifying a palette to be set for the newly create image, as well as specifying a\n            background color, the newly created image should initially be filled with.\n            <para/>\n            Basically, this function internally relies on function <see cref=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, followed by a\n            call to <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. This is why both parameters\n            <paramref name=\"color\"/> and <paramref name=\"options\"/> behave the same as it is\n            documented for function <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>.\n            So, please refer to the documentation of <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> to\n            learn more about parameters <paramref name=\"color\"/> and <paramref name=\"options\"/>.\n            <para/>\n            The palette specified through parameter <paramref name=\"palette\"/> is only copied to the\n            newly created image, if the desired bit depth is smaller than or equal to 8 bits per pixel.\n            In other words, the <paramref name=\"palette\"/> parameter is only taken into account for\n            palletized images. So, for an 8-bit image, the length is 256, for an 4-bit image it is 16\n            and it is 2 for a 1-bit image. In other words, this function does not support partial palettes.\n            <para/>\n            However, specifying a palette is not necesarily needed, even for palletized images. This\n            function is capable of implicitly creating a palette, if <paramref name=\"palette\"/> is <c>null</c>.\n            If the specified background color is a greyscale value (red = green = blue) or if option\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/> is specified, a greyscale palette\n            is created. For a 1-bit image, only if the specified background color is either black or white,\n            a monochrome palette, consisting of black and white only is created. In any case, the darker\n            colors are stored at the smaller palette indices.\n            <para/>\n            If the specified background color is not a greyscale value, or is neither black nor white\n            for a 1-bit image, solely this specified color is injected into the otherwise black-initialized\n            palette. For this operation, option <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/>\n            is implicit, so the specified <paramref name=\"color\"/> is applied to the palette entry,\n            specified by the background color's <see cref=\"F:FreeImageAPI.RGBQUAD.rgbReserved\"/> field.\n            The image is then filled with this palette index.\n            <para/>\n            This function returns a newly created image as function <see cref=\"M:FreeImageAPI.FreeImage.Allocate(System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/> does, if both\n            parameters <paramref name=\"color\"/> and <paramref name=\"palette\"/> are <c>null</c>.\n            If only <paramref name=\"color\"/> is <c>null</c>, the palette pointed to by\n            parameter <paramref name=\"palette\"/> is initially set for the new image, if a palletized\n            image of type <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> is created.\n            However, in the latter case, this function returns an image, whose\n            pixels are all initialized with zeros so, the image will be filled with the color of the\n            first palette entry.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AllocateExT``1(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS,FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Allocates a new image of the specified type, width, height and bit depth and optionally\n            fills it with the specified color. See remarks for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"type\">Type of the image.</param>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmap</param>\n            <param name=\"color\">The color to fill the bitmap with or <c>null</c>.</param>\n            <param name=\"options\">Options to enable or disable function-features.</param>\n            <param name=\"palette\">The palette of the bitmap or <c>null</c>.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>\n            This function is an extension to <see cref=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, which additionally supports\n            specifying a palette to be set for the newly create image, as well as specifying a\n            background color, the newly created image should initially be filled with.\n            <para/>\n            Basically, this function internally relies on function <see cref=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, followed by a\n            call to <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. This is why both parameters \n            <paramref name=\"color\"/> and <paramref name=\"options\"/> behave the same as it is\n            documented for function <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. So, please refer to the\n            documentation of <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> to learn more about parameters color and options.\n            <para/>\n            The palette specified through parameter palette is only copied to the newly created\n            image, if its image type is <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> and the desired bit\n            depth is smaller than or equal to 8 bits per pixel. In other words, the <paramref name=\"palette\"/>\n            palette is only taken into account for palletized images. However, if the preceding conditions\n            match and if <paramref name=\"palette\"/> is not <c>null</c>, the palette is assumed to be at\n            least as large as the size of a fully populated palette for the desired bit depth.\n            So, for an 8-bit image, this length is 256, for an 4-bit image it is 16 and it is\n            2 for a 1-bit image. In other words, this function does not support partial palettes.\n            <para/>\n            However, specifying a palette is not necesarily needed, even for palletized images. This\n            function is capable of implicitly creating a palette, if <paramref name=\"palette\"/> is <c>null</c>.\n            If the specified background color is a greyscale value (red = green = blue) or if option\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/> is specified, a greyscale palette\n            is created. For a 1-bit image, only if the specified background color is either black or white,\n            a monochrome palette, consisting of black and white only is created. In any case, the darker\n            colors are stored at the smaller palette indices.\n            <para/>\n            If the specified background color is not a greyscale value, or is neither black nor white\n            for a 1-bit image, solely this specified color is injected into the otherwise black-initialized\n            palette. For this operation, option <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/>\n            is implicit, so the specified color is applied to the palette entry, specified by the\n            background color's <see cref=\"F:FreeImageAPI.RGBQUAD.rgbReserved\"/> field. The image is then filled with\n            this palette index.\n            <para/>\n            This function returns a newly created image as function <see cref=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/> does, if both\n            parameters <paramref name=\"color\"/> and <paramref name=\"palette\"/> are <c>null</c>.\n            If only <paramref name=\"color\"/> is <c>null</c>, the palette pointed to by\n            parameter <paramref name=\"palette\"/> is initially set for the new image, if a palletized\n            image of type <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> is created.\n            However, in the latter case, this function returns an image, whose\n            pixels are all initialized with zeros so, the image will be filled with the color of the\n            first palette entry.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.AllocateExT``1(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS,FreeImageAPI.RGBQUAD[],System.UInt32,System.UInt32,System.UInt32)\">\n            <summary>\n            Allocates a new image of the specified type, width, height and bit depth and optionally\n            fills it with the specified color. See remarks for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"type\">Type of the image.</param>\n            <param name=\"width\">Width of the new bitmap.</param>\n            <param name=\"height\">Height of the new bitmap.</param>\n            <param name=\"bpp\">Bit depth of the new bitmap.\n            Supported pixel depth: 1-, 4-, 8-, 16-, 24-, 32-bit per pixel for standard bitmap</param>\n            <param name=\"color\">The color to fill the bitmap with or <c>null</c>.</param>\n            <param name=\"options\">Options to enable or disable function-features.</param>\n            <param name=\"palette\">The palette of the bitmap or <c>null</c>.</param>\n            <param name=\"red_mask\">Red part of the color layout.\n            eg: 0xFF0000</param>\n            <param name=\"green_mask\">Green part of the color layout.\n            eg: 0x00FF00</param>\n            <param name=\"blue_mask\">Blue part of the color layout.\n            eg: 0x0000FF</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>\n            This function is an extension to <see cref=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, which additionally supports\n            specifying a palette to be set for the newly create image, as well as specifying a\n            background color, the newly created image should initially be filled with.\n            <para/>\n            Basically, this function internally relies on function <see cref=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/>, followed by a\n            call to <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. This is why both parameters \n            <paramref name=\"color\"/> and <paramref name=\"options\"/> behave the same as it is\n            documented for function <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. So, please refer to the\n            documentation of <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> to learn more about parameters color and options.\n            <para/>\n            The palette specified through parameter palette is only copied to the newly created\n            image, if its image type is <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> and the desired bit\n            depth is smaller than or equal to 8 bits per pixel. In other words, the <paramref name=\"palette\"/>\n            palette is only taken into account for palletized images. However, if the preceding conditions\n            match and if <paramref name=\"palette\"/> is not <c>null</c>, the palette is assumed to be at\n            least as large as the size of a fully populated palette for the desired bit depth.\n            So, for an 8-bit image, this length is 256, for an 4-bit image it is 16 and it is\n            2 for a 1-bit image. In other words, this function does not support partial palettes.\n            <para/>\n            However, specifying a palette is not necesarily needed, even for palletized images. This\n            function is capable of implicitly creating a palette, if <paramref name=\"palette\"/> is <c>null</c>.\n            If the specified background color is a greyscale value (red = green = blue) or if option\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/> is specified, a greyscale palette\n            is created. For a 1-bit image, only if the specified background color is either black or white,\n            a monochrome palette, consisting of black and white only is created. In any case, the darker\n            colors are stored at the smaller palette indices.\n            <para/>\n            If the specified background color is not a greyscale value, or is neither black nor white\n            for a 1-bit image, solely this specified color is injected into the otherwise black-initialized\n            palette. For this operation, option <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/>\n            is implicit, so the specified color is applied to the palette entry, specified by the\n            background color's <see cref=\"F:FreeImageAPI.RGBQUAD.rgbReserved\"/> field. The image is then filled with\n            this palette index.\n            <para/>\n            This function returns a newly created image as function <see cref=\"M:FreeImageAPI.FreeImage.AllocateT(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32)\"/> does, if both\n            parameters <paramref name=\"color\"/> and <paramref name=\"palette\"/> are <c>null</c>.\n            If only <paramref name=\"color\"/> is <c>null</c>, the palette pointed to by\n            parameter <paramref name=\"palette\"/> is initially set for the new image, if a palletized\n            image of type <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> is created.\n            However, in the latter case, this function returns an image, whose\n            pixels are all initialized with zeros so, the image will be filled with the color of the\n            first palette entry.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBitmap(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Converts a FreeImage bitmap to a .NET <see cref=\"T:System.Drawing.Bitmap\"/>.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The converted .NET <see cref=\"T:System.Drawing.Bitmap\"/>.</returns>\n            <remarks>Copying metadata has been disabled until a proper way\n            of reading and storing metadata in a .NET bitmap is found.</remarks>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The image type of <paramref name=\"dib\"/> is not FIT_BITMAP.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBitmap(FreeImageAPI.FIBITMAP,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap to a .NET <see cref=\"T:System.Drawing.Bitmap\"/>.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"copyMetadata\">When true existing metadata will be copied.</param>\n            <returns>The converted .NET <see cref=\"T:System.Drawing.Bitmap\"/>.</returns>\n            <remarks>Copying metadata has been disabled until a proper way\n            of reading and storing metadata in a .NET bitmap is found.</remarks>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The image type of <paramref name=\"dib\"/> is not FIT_BITMAP.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateFromBitmap(System.Drawing.Bitmap)\">\n            <summary>\n            Converts an .NET <see cref=\"T:System.Drawing.Bitmap\"/> into a FreeImage bitmap.\n            </summary>\n            <param name=\"bitmap\">The <see cref=\"T:System.Drawing.Bitmap\"/> to convert.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>Copying metadata has been disabled until a proper way\n            of reading and storing metadata in a .NET bitmap is found.</remarks>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The bitmaps pixelformat is invalid.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateFromBitmap(System.Drawing.Bitmap,System.Boolean)\">\n            <summary>\n            Converts an .NET <see cref=\"T:System.Drawing.Bitmap\"/> into a FreeImage bitmap.\n            </summary>\n            <param name=\"bitmap\">The <see cref=\"T:System.Drawing.Bitmap\"/> to convert.</param>\n            <param name=\"copyMetadata\">When true existing metadata will be copied.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>Copying metadata has been disabled until a proper way\n            of reading and storing metadata in a .NET bitmap is found.</remarks>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The bitmaps pixelformat is invalid.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertFromRawBits(System.Byte[],FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.Boolean)\">\n            <summary>\n            Converts a raw bitmap to a FreeImage bitmap.\n            </summary>\n            <param name=\"bits\">Array of bytes containing the raw bitmap.</param>\n            <param name=\"type\">The type of the raw bitmap.</param>\n            <param name=\"width\">The width in pixels of the raw bitmap.</param>\n            <param name=\"height\">The height in pixels of the raw bitmap.</param>\n            <param name=\"pitch\">Defines the total width of a scanline in the raw bitmap,\n            including padding bytes.</param>\n            <param name=\"bpp\">The bit depth (bits per pixel) of the raw bitmap.</param>\n            <param name=\"red_mask\">The bit mask describing the bits used to store a single \n            pixel's red component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"green_mask\">The bit mask describing the bits used to store a single\n            pixel's green component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"blue_mask\">The bit mask describing the bits used to store a single\n            pixel's blue component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"topdown\">If true, the raw bitmap is stored in top-down order (top-left pixel first)\n            and in bottom-up order (bottom-left pixel first) otherwise.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertFromRawBits(System.IntPtr,FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.Int32,System.Int32,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.Boolean)\">\n            <summary>\n            Converts a raw bitmap to a FreeImage bitmap.\n            </summary>\n            <param name=\"bits\">Pointer to the memory block containing the raw bitmap.</param>\n            <param name=\"type\">The type of the raw bitmap.</param>\n            <param name=\"width\">The width in pixels of the raw bitmap.</param>\n            <param name=\"height\">The height in pixels of the raw bitmap.</param>\n            <param name=\"pitch\">Defines the total width of a scanline in the raw bitmap,\n            including padding bytes.</param>\n            <param name=\"bpp\">The bit depth (bits per pixel) of the raw bitmap.</param>\n            <param name=\"red_mask\">The bit mask describing the bits used to store a single \n            pixel's red component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"green_mask\">The bit mask describing the bits used to store a single\n            pixel's green component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"blue_mask\">The bit mask describing the bits used to store a single\n            pixel's blue component in the raw bitmap. This is only applied to 16-bpp raw bitmaps.</param>\n            <param name=\"topdown\">If true, the raw bitmap is stored in top-down order (top-left pixel first)\n            and in bottom-up order (bottom-left pixel first) otherwise.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveBitmap(System.Drawing.Bitmap,System.String)\">\n            <summary>\n            Saves a .NET <see cref=\"T:System.Drawing.Bitmap\"/> to a file.\n            </summary>\n            <param name=\"bitmap\">The .NET <see cref=\"T:System.Drawing.Bitmap\"/> to save.</param>\n            <param name=\"filename\">Name of the file to save to.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> or <paramref name=\"filename\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The bitmaps pixelformat is invalid.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveBitmap(System.Drawing.Bitmap,System.String,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a .NET <see cref=\"T:System.Drawing.Bitmap\"/> to a file.\n            </summary>\n            <param name=\"bitmap\">The .NET <see cref=\"T:System.Drawing.Bitmap\"/> to save.</param>\n            <param name=\"filename\">Name of the file to save to.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> or <paramref name=\"filename\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The bitmaps pixelformat is invalid.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveBitmap(System.Drawing.Bitmap,System.String,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a .NET <see cref=\"T:System.Drawing.Bitmap\"/> to a file.\n            </summary>\n            <param name=\"bitmap\">The .NET <see cref=\"T:System.Drawing.Bitmap\"/> to save.</param>\n            <param name=\"filename\">Name of the file to save to.</param>\n            <param name=\"format\">Format of the bitmap. If the format should be taken from the\n            filename use <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"bitmap\"/> or <paramref name=\"filename\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The bitmaps pixelformat is invalid.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadEx(System.String)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            The file will be loaded with default loading flags.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadEx(System.String,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            Load flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadEx(System.String,FreeImageAPI.FREE_IMAGE_FORMAT@)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> the files\n            real format is being analysed. If no plugin can read the file, format remains\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> and 0 is returned.\n            The file will be loaded with default loading flags.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.\n            In case a suitable format was found by LoadEx it will be returned in format.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadEx(System.String,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_FORMAT@)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> the files\n            real format is being analysed. If no plugin can read the file, format remains\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> and 0 is returned.\n            Load flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.\n            In case a suitable format was found by LoadEx it will be returned in format.\n            </param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadBitmap(System.String,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_FORMAT@)\">\n            <summary>\n            Loads a .NET <see cref=\"T:System.Drawing.Bitmap\"/> from a file.\n            </summary>\n            <param name=\"filename\">Name of the file to be loaded.</param>\n            <param name=\"format\">Format of the image. If the format should be taken from the\n            filename use <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>The loaded .NET <see cref=\"T:System.Drawing.Bitmap\"/>.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            The image type of the image is not <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.UnloadEx(FreeImageAPI.FIBITMAP@)\">\n            <summary>\n            Deletes a previously loaded FreeImage bitmap from memory and resets the handle to 0.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP,System.String)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            The format is taken off the filename.\n            If no suitable format was found false will be returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>\n            the format is taken off the filename.\n            If no suitable format was found false will be returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <param name=\"format\">Format of the image. If the format should be taken from the\n            filename use <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP@,System.String,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            The format is taken off the filename.\n            If no suitable format was found false will be returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.\n            If the function failed and returned false, the bitmap was not unloaded.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            The format is taken off the filename.\n            If no suitable format was found false will be returned.\n            Save flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP@,System.String,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            The format is taken off the filename.\n            If no suitable format was found false will be returned.\n            Save flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.\n            If the function failed and returned false, the bitmap was not unloaded.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP@,System.String,FreeImageAPI.FREE_IMAGE_FORMAT,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>\n            the format is taken off the filename.\n            If no suitable format was found false will be returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <param name=\"format\">Format of the image. If the format should be taken from the\n            filename use <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.\n            If the function failed and returned false, the bitmap was not unloaded.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>\n            the format is taken off the filename.\n            If no suitable format was found false will be returned.\n            Save flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <param name=\"format\">Format of the image. If the format should be taken from the\n            filename use <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveEx(FreeImageAPI.FIBITMAP@,System.String,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a file.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>\n            the format is taken off the filename.\n            If no suitable format was found false will be returned.\n            Save flags can be provided by the flags parameter.\n            The bitmaps color depth can be set by 'colorDepth'.\n            If set to <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_AUTO\"/> a suitable color depth\n            will be taken if available.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"filename\">The complete name of the file to save to.\n            The extension will be corrected if it is no valid extension for the\n            selected format or if no extension was specified.</param>\n            <param name=\"format\">Format of the image. If the format should be taken from the\n            filename use <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"colorDepth\">The new color depth of the bitmap.\n            Set to <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_AUTO\"/> if Save should take the\n            best suitable color depth.\n            If a color depth is selected that the provided format cannot write an\n            error-message will be thrown.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.\n            If the function failed and returned false, the bitmap was not unloaded.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentException\">\n            A direct color conversion failed.</exception>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadFromStream(System.IO.Stream)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            The stream must be set to the correct position before calling LoadFromStream.\n            </summary>\n            <param name=\"stream\">The stream to read from.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> is not capable of reading.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadFromStream(System.IO.Stream,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            The stream must be set to the correct position before calling LoadFromStream.\n            </summary>\n            <param name=\"stream\">The stream to read from.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> is not capable of reading.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadFromStream(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT@)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> the\n            bitmaps real format is being analysed.\n            The stream must be set to the correct position before calling LoadFromStream.\n            </summary>\n            <param name=\"stream\">The stream to read from.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.\n            In case a suitable format was found by LoadFromStream it will be returned in format.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> is not capable of reading.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadFromStream(System.IO.Stream,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FREE_IMAGE_FORMAT@)\">\n            <summary>\n            Loads a FreeImage bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>\n            the bitmaps real format is being analysed.\n            The stream must be set to the correct position before calling LoadFromStream.\n            </summary>\n            <param name=\"stream\">The stream to read from.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.\n            In case a suitable format was found by LoadFromStream it will be returned in format.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> is not capable of reading.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToStream(FreeImageAPI.FIBITMAP,System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a stream.\n            The stream must be set to the correct position before calling SaveToStream.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">The stream to write to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> cannot write.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToStream(FreeImageAPI.FIBITMAP@,System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a stream.\n            The stream must be set to the correct position before calling SaveToStream.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">The stream to write to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> cannot write.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToStream(FreeImageAPI.FIBITMAP,System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a stream.\n            The stream must be set to the correct position before calling SaveToStream.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">The stream to write to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> cannot write.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToStream(FreeImageAPI.FIBITMAP@,System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a stream.\n            The stream must be set to the correct position before calling SaveToStream.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">The stream to write to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> cannot write.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToStream(FreeImageAPI.FIBITMAP,System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a stream.\n            The stream must be set to the correct position before calling SaveToStream.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">The stream to write to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"colorDepth\">The new color depth of the bitmap.\n            Set to <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_AUTO\"/> if SaveToStream should\n            take the best suitable color depth.\n            If a color depth is selected that the provided format cannot write an\n            error-message will be thrown.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> cannot write.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SaveToStream(FreeImageAPI.FIBITMAP@,System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,System.Boolean)\">\n            <summary>\n            Saves a previously loaded FreeImage bitmap to a stream.\n            The stream must be set to the correct position before calling SaveToStream.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"stream\">The stream to write to.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"colorDepth\">The new color depth of the bitmap.\n            Set to <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_AUTO\"/> if SaveToStream should\n            take the best suitable color depth.\n            If a color depth is selected that the provided format cannot write an\n            error-message will be thrown.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> cannot write.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsExtensionValidForFIF(FreeImageAPI.FREE_IMAGE_FORMAT,System.String)\">\n            <summary>\n            Checks if an extension is valid for a certain format.\n            </summary>\n            <param name=\"fif\">The desired format.</param>\n            <param name=\"extension\">The desired extension.</param>\n            <returns>True if the extension is valid for the given format, false otherwise.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"extension\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsExtensionValidForFIF(FreeImageAPI.FREE_IMAGE_FORMAT,System.String,System.StringComparison)\">\n            <summary>\n            Checks if an extension is valid for a certain format.\n            </summary>\n            <param name=\"fif\">The desired format.</param>\n            <param name=\"extension\">The desired extension.</param>\n            <param name=\"comparisonType\">The string comparison type.</param>\n            <returns>True if the extension is valid for the given format, false otherwise.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"extension\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsFilenameValidForFIF(FreeImageAPI.FREE_IMAGE_FORMAT,System.String)\">\n            <summary>\n            Checks if a filename is valid for a certain format.\n            </summary>\n            <param name=\"fif\">The desired format.</param>\n            <param name=\"filename\">The desired filename.</param>\n            <returns>True if the filename is valid for the given format, false otherwise.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsFilenameValidForFIF(FreeImageAPI.FREE_IMAGE_FORMAT,System.String,System.StringComparison)\">\n            <summary>\n            Checks if a filename is valid for a certain format.\n            </summary>\n            <param name=\"fif\">The desired format.</param>\n            <param name=\"filename\">The desired filename.</param>\n            <param name=\"comparisonType\">The string comparison type.</param>\n            <returns>True if the filename is valid for the given format, false otherwise.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"filename\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPrimaryExtensionFromFIF(FreeImageAPI.FREE_IMAGE_FORMAT)\">\n            <summary>\n            This function returns the primary (main or most commonly used?) extension of a certain\n            image format (fif). This is done by returning the first of all possible extensions\n            returned by GetFIFExtensionList().\n            That assumes, that the plugin returns the extensions in ordered form.</summary>\n            <param name=\"fif\">The image format to obtain the primary extension for.</param>\n            <returns>The primary extension of the specified image format.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapEx(System.String)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists while opening.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapEx(System.String,System.Boolean)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"keep_cache_in_memory\">When true performance is increased at the cost of memory.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists while opening.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapEx(System.String,System.Boolean,System.Boolean)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"read_only\">When true the bitmap will be loaded read only.</param>\n            <param name=\"keep_cache_in_memory\">When true performance is increased at the cost of memory.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists while opening.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapEx(System.String,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"create_new\">When true a new bitmap is created.</param>\n            <param name=\"read_only\">When true the bitmap will be loaded read only.</param>\n            <param name=\"keep_cache_in_memory\">When true performance is increased at the cost of memory.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists while opening.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapEx(System.String,FreeImageAPI.FREE_IMAGE_FORMAT@,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> the files real\n            format is being analysed. If no plugin can read the file, format remains\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> and 0 is returned.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.\n            In case a suitable format was found by LoadEx it will be returned in format.</param>\n            <param name=\"create_new\">When true a new bitmap is created.</param>\n            <param name=\"read_only\">When true the bitmap will be loaded read only.</param>\n            <param name=\"keep_cache_in_memory\">When true performance is increased at the cost of memory.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists while opening.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapEx(System.String,FreeImageAPI.FREE_IMAGE_FORMAT@,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> the files\n            real format is being analysed. If no plugin can read the file, format remains\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> and 0 is returned.\n            Load flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"filename\">The complete name of the file to load.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use \n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/>.\n            In case a suitable format was found by LoadEx it will be returned in format.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"create_new\">When true a new bitmap is created.</param>\n            <param name=\"read_only\">When true the bitmap will be loaded read only.</param>\n            <param name=\"keep_cache_in_memory\">When true performance is increased at the cost of memory.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.IO.FileNotFoundException\">\n            <paramref name=\"filename\"/> does not exists while opening.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapFromStream(System.IO.Stream)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            </summary>\n            <param name=\"stream\">The stream to load the bitmap from.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.OpenMultiBitmapFromStream(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT@,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap.\n            In case the loading format is <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> the files\n            real format is being analysed. If no plugin can read the file, format remains\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/> and 0 is returned.\n            Load flags can be provided by the flags parameter.\n            </summary>\n            <param name=\"stream\">The stream to load the bitmap from.</param>\n            <param name=\"format\">Format of the image. If the format is unknown use \n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_FORMAT.FIF_UNKNOWN\"/></param>.\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloseMultiBitmap(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Closes a previously opened multi-page bitmap and, when the bitmap was not opened read-only, applies any changes made to it.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloseMultiBitmapEx(FreeImageAPI.FIMULTIBITMAP@)\">\n            <summary>\n            Closes a previously opened multi-page bitmap and, when the bitmap was not opened read-only,\n            applies any changes made to it.\n            On success the handle will be reset to null.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloseMultiBitmapEx(FreeImageAPI.FIMULTIBITMAP@,FreeImageAPI.FREE_IMAGE_SAVE_FLAGS)\">\n            <summary>\n            Closes a previously opened multi-page bitmap and, when the bitmap was not opened read-only,\n            applies any changes made to it.\n            On success the handle will be reset to null.\n            </summary>\n            <param name=\"bitmap\">Handle to a FreeImage multi-paged bitmap.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetLockedPageCount(FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Retrieves the number of pages that are locked in a multi-paged bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage multi-paged bitmap.</param>\n            <returns>Number of locked pages.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetLockedPages(FreeImageAPI.FIMULTIBITMAP)\">\n            <summary>\n            Retrieves a list locked pages of a multi-paged bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage multi-paged bitmap.</param>\n            <returns>List containing the indexes of the locked pages.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.LoadMultiBitmapFromStream(System.IO.Stream,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_LOAD_FLAGS,FreeImageAPI.FIMEMORY@)\">\n            <summary>\n            Loads a FreeImage multi-paged bitmap from a stream and returns the\n            FreeImage memory stream used as temporary buffer.\n            The bitmap can not be modified by calling\n            <see cref=\"M:FreeImageAPI.FreeImage.AppendPage(FreeImageAPI.FIMULTIBITMAP,FreeImageAPI.FIBITMAP)\"/>,\n            <see cref=\"M:FreeImageAPI.FreeImage.InsertPage(FreeImageAPI.FIMULTIBITMAP,System.Int32,FreeImageAPI.FIBITMAP)\"/>,\n            <see cref=\"M:FreeImageAPI.FreeImage.MovePage(FreeImageAPI.FIMULTIBITMAP,System.Int32,System.Int32)\"/> or\n            <see cref=\"M:FreeImageAPI.FreeImage.DeletePage(FreeImageAPI.FIMULTIBITMAP,System.Int32)\"/>.\n            </summary>\n            <param name=\"stream\">The stream to read from.</param>\n            <param name=\"format\">Format of the image.</param>\n            <param name=\"flags\">Flags to enable or disable plugin-features.</param>\n            <param name=\"memory\">The temporary memory buffer used to load the bitmap.</param>\n            <returns>Handle to a FreeImage multi-paged bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> can not read.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFileTypeFromStream(System.IO.Stream)\">\n            <summary>\n            Orders FreeImage to analyze the bitmap signature.\n            In case the stream is not seekable, the stream will have been used\n            and must be recreated for loading.\n            </summary>\n            <param name=\"stream\">Name of the stream to analyze.</param>\n            <returns>Type of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"stream\"/> is null.</exception>\n            <exception cref=\"T:System.ArgumentException\">\n            <paramref name=\"stream\"/> can not read.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetHbitmap(FreeImageAPI.FIBITMAP,System.IntPtr,System.Boolean)\">\n            <summary>\n            Retrieves an hBitmap for a FreeImage bitmap.\n            Call FreeHbitmap(IntPtr) to free the handle.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"hdc\">A reference device context.\n            Use IntPtr.Zero if no reference is available.</param>\n            <param name=\"unload\">When true dib will be unloaded if the function succeeded.</param>\n            <returns>The hBitmap for the FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetBitmapForDevice(FreeImageAPI.FIBITMAP,System.IntPtr,System.Boolean)\">\n            <summary>\n            Returns an HBITMAP created by the <c>CreateDIBitmap()</c> function which in turn\n            has always the same color depth as the reference DC, which may be provided\n            through <paramref name=\"hdc\"/>. The desktop DC will be used,\n            if <c>IntPtr.Zero</c> DC is specified.\n            Call <see cref=\"M:FreeImageAPI.FreeImage.FreeHbitmap(System.IntPtr)\"/> to free the handle.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"hdc\">Handle to a device context.</param>\n            <param name=\"unload\">When true the structure will be unloaded on success.\n            If the function failed and returned false, the bitmap was not unloaded.</param>\n            <returns>If the function succeeds, the return value is a handle to the\n            compatible bitmap. If the function fails, the return value is <see cref=\"F:System.IntPtr.Zero\"/>.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateFromHbitmap(System.IntPtr,System.IntPtr)\">\n            <summary>\n            Creates a FreeImage DIB from a Device Context/Compatible Bitmap.\n            </summary>\n            <param name=\"hbitmap\">Handle to the bitmap.</param>\n            <param name=\"hdc\">Handle to a device context.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"hbitmap\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FreeHbitmap(System.IntPtr)\">\n            <summary>\n            Frees a bitmap handle.\n            </summary>\n            <param name=\"hbitmap\">Handle to a bitmap.</param>\n            <returns>True on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetResolutionX(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Retrieves a DIB's resolution in X-direction measured in 'dots per inch' (DPI) and not in\n            'dots per meter'.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The resolution in 'dots per inch'.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetResolutionY(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Retrieves a DIB's resolution in Y-direction measured in 'dots per inch' (DPI) and not in\n            'dots per meter'.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The resolution in 'dots per inch'.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetResolutionX(FreeImageAPI.FIBITMAP,System.UInt32)\">\n            <summary>\n            Sets a DIB's resolution in X-direction measured in 'dots per inch' (DPI) and not in\n            'dots per meter'.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"res\">The new resolution in 'dots per inch'.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetResolutionY(FreeImageAPI.FIBITMAP,System.UInt32)\">\n            <summary>\n            Sets a DIB's resolution in Y-direction measured in 'dots per inch' (DPI) and not in\n            'dots per meter'.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"res\">The new resolution in 'dots per inch'.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsGreyscaleImage(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns whether the image is a greyscale image or not.\n            The function scans all colors in the bitmaps palette for entries where\n            red, green and blue are not all the same (not a grey color).\n            Supports 1-, 4- and 8-bit bitmaps.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>True if the image is a greyscale image, else false.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPaletteEx(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns a structure that represents the palette of a FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>A structure representing the bitmaps palette.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetInfoHeaderEx(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the <see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure of a FreeImage bitmap.\n            The structure is a copy, so changes will have no effect on\n            the bitmap itself.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns><see cref=\"T:FreeImageAPI.BITMAPINFOHEADER\"/> structure of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetInfoEx(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the <see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure of a FreeImage bitmap.\n            The structure is a copy, so changes will have no effect on\n            the bitmap itself.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns><see cref=\"T:FreeImageAPI.BITMAPINFO\"/> structure of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPixelFormat(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the pixelformat of the bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns><see cref=\"T:System.Drawing.Imaging.PixelFormat\"/> of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFormatParameters(System.Drawing.Imaging.PixelFormat,FreeImageAPI.FREE_IMAGE_TYPE@,System.UInt32@,System.UInt32@,System.UInt32@,System.UInt32@)\">\n            <summary>\n            Retrieves all parameters needed to create a new FreeImage bitmap from\n            the format of a .NET <see cref=\"T:System.Drawing.Image\"/>.\n            </summary>\n            <param name=\"format\">The <see cref=\"T:System.Drawing.Imaging.PixelFormat\"/>\n            of the .NET <see cref=\"T:System.Drawing.Image\"/>.</param>\n            <param name=\"type\">Returns the type used for the new bitmap.</param>\n            <param name=\"bpp\">Returns the color depth for the new bitmap.</param>\n            <param name=\"red_mask\">Returns the red_mask for the new bitmap.</param>\n            <param name=\"green_mask\">Returns the green_mask for the new bitmap.</param>\n            <param name=\"blue_mask\">Returns the blue_mask for the new bitmap.</param>\n            <returns>True in case a matching conversion exists; else false.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetFormat(System.Drawing.Imaging.ImageFormat)\">\n            <summary>\n            Returns the <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> for the specified\n            <see cref=\"T:System.Drawing.Imaging.ImageFormat\"/>.\n            </summary>\n            <param name=\"imageFormat\">The <see cref=\"T:System.Drawing.Imaging.ImageFormat\"/>\n            for which to return the corresponding <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/>.</param>\n            <returns>The <see cref=\"T:FreeImageAPI.FREE_IMAGE_FORMAT\"/> for the specified\n            <see cref=\"T:System.Drawing.Imaging.ImageFormat\"/></returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTypeParameters(FreeImageAPI.FREE_IMAGE_TYPE,System.Int32,System.UInt32@,System.UInt32@,System.UInt32@)\">\n            <summary>\n            Retrieves all parameters needed to create a new FreeImage bitmap from\n            raw bits <see cref=\"T:System.Drawing.Image\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:FreeImageAPI.FREE_IMAGE_TYPE\"/>\n            of the data in memory.</param>\n            <param name=\"bpp\">The color depth for the data.</param>\n            <param name=\"red_mask\">Returns the red_mask for the data.</param>\n            <param name=\"green_mask\">Returns the green_mask for the data.</param>\n            <param name=\"blue_mask\">Returns the blue_mask for the data.</param>\n            <returns>True in case a matching conversion exists; else false.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Compare(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COMPARE_FLAGS)\">\n            <summary>\n            Compares two FreeImage bitmaps.\n            </summary>\n            <param name=\"dib1\">The first bitmap to compare.</param>\n            <param name=\"dib2\">The second bitmap to compare.</param>\n            <param name=\"flags\">Determines which components of the bitmaps will be compared.</param>\n            <returns>True in case both bitmaps match the compare conditions, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetTransparencyTableEx(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the FreeImage bitmap's transparency table.\n            The array is empty in case the bitmap has no transparency table.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>The FreeImage bitmap's transparency table.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetTransparencyTable(FreeImageAPI.FIBITMAP,System.Byte[])\">\n            <summary>\n            Set the FreeImage bitmap's transparency table. Only affects palletised bitmaps.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"table\">The FreeImage bitmap's new transparency table.</param>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> or <paramref name=\"table\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetUniqueColors(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            This function returns the number of unique colors actually used by the\n            specified 1-, 4-, 8-, 16-, 24- or 32-bit image. This might be different from\n            what function FreeImage_GetColorsUsed() returns, which actually returns the\n            palette size for palletised images. Works for\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/> type images only.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Returns the number of unique colors used by the image specified or\n            zero, if the image type cannot be handled.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsRGB555(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Verifies whether the FreeImage bitmap is 16bit 555.\n            </summary>\n            <param name=\"dib\">The FreeImage bitmap to verify.</param>\n            <returns><b>true</b> if the bitmap is RGB16-555; otherwise <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.IsRGB565(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Verifies whether the FreeImage bitmap is 16bit 565.\n            </summary>\n            <param name=\"dib\">The FreeImage bitmap to verify.</param>\n            <returns><b>true</b> if the bitmap is RGB16-565; otherwise <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateICCProfileEx(FreeImageAPI.FIBITMAP,System.Byte[])\">\n            <summary>\n            Creates a new ICC-Profile for a FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"data\">The data of the new ICC-Profile.</param>\n            <returns>The new ICC-Profile of the bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateICCProfileEx(FreeImageAPI.FIBITMAP,System.Byte[],System.Int32)\">\n            <summary>\n            Creates a new ICC-Profile for a FreeImage bitmap.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"data\">The data of the new ICC-Profile.</param>\n            <param name=\"size\">The number of bytes of <paramref name=\"data\"/> to use.</param>\n            <returns>The new ICC-Profile of the FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,System.Byte)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"threshold\">Threshold value when converting with\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_THRESHOLD\"/>.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,FreeImageAPI.FREE_IMAGE_DITHER)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"ditherMethod\">Dither algorithm when converting \n            with <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_DITHER\"/>.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,FreeImageAPI.FREE_IMAGE_QUANTIZE)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"quantizationMethod\">The quantization algorithm for conversion to 8-bit color depth.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,System.Byte,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"threshold\">Threshold value when converting with\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_THRESHOLD\"/>.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,FreeImageAPI.FREE_IMAGE_DITHER,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"ditherMethod\">Dither algorithm when converting with\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_DITHER\"/>.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"quantizationMethod\">The quantization algorithm for conversion to 8-bit color depth.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ConvertColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH,System.Byte,FreeImageAPI.FREE_IMAGE_DITHER,FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Boolean)\">\n            <summary>\n            Converts a FreeImage bitmap from one color depth to another.\n            If the conversion fails the original FreeImage bitmap is returned.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"conversion\">The desired output format.</param>\n            <param name=\"threshold\">Threshold value when converting with\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_THRESHOLD\"/>.</param>\n            <param name=\"ditherMethod\">Dither algorithm when converting with\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_DITHER\"/>.</param>\n            <param name=\"quantizationMethod\">The quantization algorithm for conversion to 8-bit color depth.</param>\n            <param name=\"unloadSource\">When true the structure will be unloaded on success.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ColorQuantizeEx(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,FreeImageAPI.RGBQUAD[],System.Boolean)\">\n            <summary>\n            ColorQuantizeEx is an extension to the <see cref=\"M:FreeImageAPI.FreeImage.ColorQuantize(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE)\"/>\n            method that provides additional options used to quantize a 24-bit image to any\n            number of colors (up to 256), as well as quantize a 24-bit image using a\n            provided palette.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"quantize\">Specifies the color reduction algorithm to be used.</param>\n            <param name=\"PaletteSize\">Size of the desired output palette.</param>\n            <param name=\"ReservePalette\">The provided palette.</param>\n            <param name=\"minColorDepth\"><b>true</b> to create a bitmap with the smallest possible\n            color depth for the specified <paramref name=\"PaletteSize\"/>.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ColorQuantizeEx(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE,System.Int32,FreeImageAPI.RGBQUAD[],System.Int32)\">\n            <summary>\n            ColorQuantizeEx is an extension to the <see cref=\"M:FreeImageAPI.FreeImage.ColorQuantize(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_QUANTIZE)\"/>\n            method that provides additional options used to quantize a 24-bit image to any\n            number of colors (up to 256), as well as quantize a 24-bit image using a\n            partial or full provided palette.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"quantize\">Specifies the color reduction algorithm to be used.</param>\n            <param name=\"PaletteSize\">Size of the desired output palette.</param>\n            <param name=\"ReservePalette\">The provided palette.</param>\n            <param name=\"bpp\">The desired color depth of the created image.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CloneMetadataEx(FreeImageAPI.FIBITMAP,FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_METADATA_COPY)\">\n            <summary>\n            Copies metadata from one FreeImage bitmap to another.\n            </summary>\n            <param name=\"src\">Source FreeImage bitmap containing the metadata.</param>\n            <param name=\"dst\">FreeImage bitmap to copy the metadata to.</param>\n            <param name=\"flags\">Flags to switch different copy modes.</param>\n            <returns>Returns -1 on failure else the number of copied tags.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"src\"/> or <paramref name=\"dst\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetImageComment(FreeImageAPI.FIBITMAP)\">\n            <summary>\n            Returns the comment of a JPEG, PNG or GIF image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <returns>Comment of the FreeImage bitmp, or null in case no comment exists.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetImageComment(FreeImageAPI.FIBITMAP,System.String)\">\n            <summary>\n            Sets the comment of a JPEG, PNG or GIF image.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"comment\">New comment of the FreeImage bitmap.\n            Use null to remove the comment.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.Metadata.MetadataTag@)\">\n            <summary>\n            Retrieve a metadata attached to a FreeImage bitmap.\n            </summary>\n            <param name=\"model\">The metadata model to look for.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"key\">The metadata field name.</param>\n            <param name=\"tag\">A <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> structure returned by the function.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.SetMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,System.String,FreeImageAPI.Metadata.MetadataTag)\">\n            <summary>\n            Attach a new metadata tag to a FreeImage bitmap.\n            </summary>\n            <param name=\"model\">The metadata model used to store the tag.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"key\">The tag field name.</param>\n            <param name=\"tag\">The <see cref=\"T:FreeImageAPI.Metadata.MetadataTag\"/> to be attached.</param>\n            <returns>Returns true on success, false on failure.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FindFirstMetadata(FreeImageAPI.FREE_IMAGE_MDMODEL,FreeImageAPI.FIBITMAP,FreeImageAPI.Metadata.MetadataTag@)\">\n            <summary>\n            Provides information about the first instance of a tag that matches the metadata model.\n            </summary>\n            <param name=\"model\">The model to match.</param>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"tag\">Tag that matches the metadata model.</param>\n            <returns>Unique search handle that can be used to call FindNextMetadata or FindCloseMetadata.\n            Null if the metadata model does not exist.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FindNextMetadata(FreeImageAPI.FIMETADATA,FreeImageAPI.Metadata.MetadataTag@)\">\n            <summary>\n            Find the next tag, if any, that matches the metadata model argument in a previous call\n            to FindFirstMetadata, and then alters the tag object contents accordingly.\n            </summary>\n            <param name=\"mdhandle\">Unique search handle provided by FindFirstMetadata.</param>\n            <param name=\"tag\">Tag that matches the metadata model.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FindCloseMetadata(FreeImageAPI.FIMETADATA)\">\n            <summary>\n            Closes the specified metadata search handle and releases associated resources.\n            </summary>\n            <param name=\"mdhandle\">The handle to close.</param>\n        </member>\n        <member name=\"F:FreeImageAPI.FreeImage.metaDataSearchHandler\">\n            <summary>\n            This dictionary links FIMETADATA handles and FREE_IMAGE_MDMODEL models.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Rotate(FreeImageAPI.FIBITMAP,System.Double)\">\n            <summary>\n            This function rotates a 1-, 8-bit greyscale or a 24-, 32-bit color image by means of 3 shears.\n            1-bit images rotation is limited to integer multiple of 90?\n            <c>null</c> is returned for other values.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"angle\">The angle of rotation.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Rotate``1(FreeImageAPI.FIBITMAP,System.Double,System.Nullable{``0})\">\n            <summary>\n            This function rotates a 1-, 8-bit greyscale or a 24-, 32-bit color image by means of 3 shears.\n            1-bit images rotation is limited to integer multiple of 90?\n            <c>null</c> is returned for other values.\n            </summary>\n            <typeparam name=\"T\">The type of the color to use as background.</typeparam>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"angle\">The angle of rotation.</param>\n            <param name=\"backgroundColor\">The color used used to fill the bitmap's background.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.Rotate4bit(FreeImageAPI.FIBITMAP,System.Double)\">\n            <summary>\n            Rotates a 4-bit color FreeImage bitmap.\n            Allowed values for <paramref name=\"angle\"/> are 90, 180 and 270.\n            In case <paramref name=\"angle\"/> is 0 or 360 a clone is returned.\n            0 is returned for other values or in case the rotation fails.\n            </summary>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"angle\">The angle of rotation.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>\n            This function is kind of temporary due to FreeImage's lack of\n            rotating 4-bit images. It's particularly used by <see cref=\"T:FreeImageAPI.FreeImageBitmap\"/>'s\n            method RotateFlip. This function will be removed as soon as FreeImage\n            supports rotating 4-bit images.\n            </remarks>\n            <exception cref=\"T:System.ArgumentNullException\">\n            <paramref name=\"dib\"/> is null.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.EnlargeCanvas``1(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32,System.Nullable{``0},FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\">\n            <summary>\n            Enlarges or shrinks the FreeImage bitmap selectively per side and fills newly added areas\n            with the specified background color. See remarks for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"left\">The number of pixels, the image should be enlarged on its left side.\n            Negative values shrink the image on its left side.</param>\n            <param name=\"top\">The number of pixels, the image should be enlarged on its top side.\n            Negative values shrink the image on its top side.</param>\n            <param name=\"right\">The number of pixels, the image should be enlarged on its right side.\n            Negative values shrink the image on its right side.</param>\n            <param name=\"bottom\">The number of pixels, the image should be enlarged on its bottom side.\n            Negative values shrink the image on its bottom side.</param>\n            <param name=\"color\">The color, the enlarged sides of the image should be filled with.</param>\n            <param name=\"options\">Options that affect the color search process for palletized images.</param>\n            <returns>Handle to a FreeImage bitmap.</returns>\n            <remarks>\n            This function enlarges or shrinks an image selectively per side.\n            The main purpose of this function is to add borders to an image.\n            To add a border to any of the image's sides, a positive integer value must be passed in\n            any of the parameters <paramref name=\"left\"/>, <paramref name=\"top\"/>, <paramref name=\"right\"/>\n            or <paramref name=\"bottom\"/>. This value represents the border's\n            width in pixels. Newly created parts of the image (the border areas) are filled with the\n            specified <paramref name=\"color\"/>.\n            Specifying a negative integer value for a certain side, will shrink or crop the image on\n            this side. Consequently, specifying zero for a certain side will not change the image's\n            extension on that side.\n            <para/>\n            So, calling this function with all parameters <paramref name=\"left\"/>, <paramref name=\"top\"/>,\n            <paramref name=\"right\"/> and <paramref name=\"bottom\"/> set to zero, is\n            effectively the same as calling function <see cref=\"M:FreeImageAPI.FreeImage.Clone(FreeImageAPI.FIBITMAP)\"/>; setting all parameters\n            <paramref name=\"left\"/>, <paramref name=\"top\"/>, <paramref name=\"right\"/> and\n            <paramref name=\"bottom\"/> to value equal to or smaller than zero, my easily be substituted\n            by a call to function <see cref=\"M:FreeImageAPI.FreeImage.Copy(FreeImageAPI.FIBITMAP,System.Int32,System.Int32,System.Int32,System.Int32)\"/>. Both these cases produce a new image, which is\n            guaranteed not to be larger than the input image. Thus, since the specified\n            <paramref name=\"color\"/> is not needed in these cases, <paramref name=\"color\"/>\n            may be <c>null</c>.\n            <para/>\n            Both parameters <paramref name=\"color\"/> and <paramref name=\"options\"/> work according to\n            function <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/>. So, please refer to the documentation of\n            <see cref=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\"/> to learn more about parameters <paramref name=\"color\"/>\n            and <paramref name=\"options\"/>. For palletized images, the palette of the input image is\n            transparently copied to the newly created enlarged or shrunken image, so any color look-ups\n            are performed on this palette.\n            </remarks>\n            <example>\n            // create a white color<br/>\n            RGBQUAD c;<br/>\n            c.rgbRed = 0xFF;<br/>\n            c.rgbGreen = 0xFF;<br/>\n            c.rgbBlue = 0xFF;<br/>\n            c.rgbReserved = 0x00;<br/>\n            <br/>\n            // add a white, symmetric 10 pixel wide border to the image<br/>\n            dib2 = FreeImage_EnlargeCanvas(dib, 10, 10, 10, 10, c, FREE_IMAGE_COLOR_OPTIONS.FICO_RGB);<br/>\n            <br/>\n            // add white, 20 pixel wide stripes to the top and bottom side of the image<br/>\n            dib3 = FreeImage_EnlargeCanvas(dib, 0, 20, 0, 20, c, FREE_IMAGE_COLOR_OPTIONS.FICO_RGB);<br/>\n            <br/>\n            // add white, 30 pixel wide stripes to the right side of the image and<br/>\n            // cut off the 40 leftmost pixel columns<br/>\n            dib3 = FreeImage_EnlargeCanvas(dib, -40, 0, 30, 0, c, FREE_IMAGE_COLOR_OPTIONS.FICO_RGB);<br/>\n            </example>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.FillBackground``1(FreeImageAPI.FIBITMAP,``0,FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS)\">\n            <summary>\n            Sets all pixels of the specified image to the color provided through the\n            <paramref name=\"color\"/> parameter. See remarks for further details.\n            </summary>\n            <typeparam name=\"T\">The type of the specified color.</typeparam>\n            <param name=\"dib\">Handle to a FreeImage bitmap.</param>\n            <param name=\"color\">The color to fill the bitmap with. See remarks for further details.</param>\n            <param name=\"options\">Options that affect the color search process for palletized images.</param>\n            <returns><c>true</c> on success, <c>false</c> on failure.</returns>\n            <remarks>\n            This function sets all pixels of an image to the color provided through\n            the <paramref name=\"color\"/> parameter. <see cref=\"T:FreeImageAPI.RGBQUAD\"/> is used for standard type images.\n            For non standard type images the underlaying structure is used.\n            <para/>\n            So, <paramref name=\"color\"/> must be of type <see cref=\"T:System.Double\"/>, if the image to be filled is of type\n            <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_DOUBLE\"/> and must be a <see cref=\"T:FreeImageAPI.FIRGBF\"/> structure if the\n            image is of type <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_RGBF\"/> and so on.\n            <para/>\n            However, the fill color is always specified through a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure\n            for all images of type <see cref=\"F:FreeImageAPI.FREE_IMAGE_TYPE.FIT_BITMAP\"/>.\n            So, for 32- and 24-bit images, the red, green and blue members of the <see cref=\"T:FreeImageAPI.RGBQUAD\"/>\n            structure are directly used for the image's red, green and blue channel respectively.\n            Although alpha transparent <see cref=\"T:FreeImageAPI.RGBQUAD\"/> colors are\n            supported, the alpha channel of a 32-bit image never gets modified by this function.\n            A fill color with an alpha value smaller than 255 gets blended with the image's actual\n            background color, which is determined from the image's bottom-left pixel.\n            So, currently using alpha enabled colors, assumes the image to be unicolor before the\n            fill operation. However, the <see cref=\"F:FreeImageAPI.RGBQUAD.rgbReserved\"/> field is only taken into account,\n            if option <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_RGBA\"/> has been specified.\n            <para/>\n            For 16-bit images, the red-, green- and blue components of the specified color are\n            transparently translated into either the 16-bit 555 or 565 representation. This depends\n            on the image's actual red- green- and blue masks.\n            <para/>\n            Special attention must be payed for palletized images. Generally, the RGB color specified\n            is looked up in the image's palette. The found palette index is then used to fill the image.\n            There are some option flags, that affect this lookup process:\n            <list type=\"table\">\n            <listheader>\n            <term>Value</term>\n            <description>Meaning</description>\n            </listheader>\n            <item>\n            <term><see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_DEFAULT\"/></term>\n            <description>\n            Uses the color, that is nearest to the specified color.\n            This is the default behavior and should always find a\n            color in the palette. However, the visual result may\n            far from what was expected and mainly depends on the\n            image's palette.\n            </description>\n            </item>\n            <item>\n            <term><see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_EQUAL_COLOR\"/></term>\n            <description>\n            Searches the image's palette for the specified color\n            but only uses the returned palette index, if the specified\n            color exactly matches the palette entry. Of course,\n            depending on the image's actual palette entries, this\n            operation may fail. In this case, the function falls back\n            to option <see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/>\n            and uses the RGBQUAD's rgbReserved member (or its low nibble for 4-bit images\n            or its least significant bit (LSB) for 1-bit images) as\n            the palette index used for the fill operation.\n            </description>\n            </item>\n            <item>\n            <term><see cref=\"F:FreeImageAPI.FREE_IMAGE_COLOR_OPTIONS.FICO_ALPHA_IS_INDEX\"/></term>\n            <description>\n            Does not perform any color lookup from the palette, but\n            uses the RGBQUAD's alpha channel member rgbReserved as\n            the palette index to be used for the fill operation.\n            However, for 4-bit images, only the low nibble of the\n            rgbReserved member are used and for 1-bit images, only\n            the least significant bit (LSB) is used.\n            </description>\n            </item>\n            </list>\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetNextColorDepth(System.Int32)\">\n            <summary>\n            Returns the next higher possible color depth.\n            </summary>\n            <param name=\"bpp\">Color depth to increase.</param>\n            <returns>The next higher color depth or 0 if there is no valid color depth.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetPrevousColorDepth(System.Int32)\">\n            <summary>\n            Returns the next lower possible color depth.\n            </summary>\n            <param name=\"bpp\">Color depth to decrease.</param>\n            <returns>The next lower color depth or 0 if there is no valid color depth.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.PtrToStr(System.Byte*)\">\n            <summary>\n            Reads a null-terminated c-string.\n            </summary>\n            <param name=\"ptr\">Pointer to the first char of the string.</param>\n            <returns>The converted string.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.PrepareBitmapColorDepth(FreeImageAPI.FIBITMAP,FreeImageAPI.FREE_IMAGE_FORMAT,FreeImageAPI.FREE_IMAGE_COLOR_DEPTH)\">\n            <summary>\n            Changes a bitmaps color depth.\n            Used by SaveEx and SaveToStream.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CompareMemory(System.Void*,System.Void*,System.UInt32)\">\n            <summary>\n            Compares blocks of memory.\n            </summary>\n            <param name=\"buf1\">A pointer to a block of memory to compare.</param>\n            <param name=\"buf2\">A pointer to a block of memory to compare.</param>\n            <param name=\"length\">Specifies the number of bytes to be compared.</param>\n            <returns>true, if all bytes compare as equal, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CompareMemory(System.Void*,System.Void*,System.Int64)\">\n            <summary>\n            Compares blocks of memory.\n            </summary>\n            <param name=\"buf1\">A pointer to a block of memory to compare.</param>\n            <param name=\"buf2\">A pointer to a block of memory to compare.</param>\n            <param name=\"length\">Specifies the number of bytes to be compared.</param>\n            <returns>true, if all bytes compare as equal, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CompareMemory(System.IntPtr,System.IntPtr,System.UInt32)\">\n            <summary>\n            Compares blocks of memory.\n            </summary>\n            <param name=\"buf1\">A pointer to a block of memory to compare.</param>\n            <param name=\"buf2\">A pointer to a block of memory to compare.</param>\n            <param name=\"length\">Specifies the number of bytes to be compared.</param>\n            <returns>true, if all bytes compare as equal, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CompareMemory(System.IntPtr,System.IntPtr,System.Int64)\">\n            <summary>\n            Compares blocks of memory.\n            </summary>\n            <param name=\"buf1\">A pointer to a block of memory to compare.</param>\n            <param name=\"buf2\">A pointer to a block of memory to compare.</param>\n            <param name=\"length\">Specifies the number of bytes to be compared.</param>\n            <returns>true, if all bytes compare as equal, false otherwise.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MoveMemory(System.Void*,System.Void*,System.Int64)\">\n            <summary>\n            Moves a block of memory from one location to another.\n            </summary>\n            <param name=\"dst\">A pointer to the starting address of the move destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to be moved.</param>\n            <param name=\"size\">The size of the block of memory to move, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MoveMemory(System.IntPtr,System.IntPtr,System.UInt32)\">\n            <summary>\n            Moves a block of memory from one location to another.\n            </summary>\n            <param name=\"dst\">A pointer to the starting address of the move destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to be moved.</param>\n            <param name=\"size\">The size of the block of memory to move, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MoveMemory(System.IntPtr,System.IntPtr,System.Int64)\">\n            <summary>\n            Moves a block of memory from one location to another.\n            </summary>\n            <param name=\"dst\">A pointer to the starting address of the move destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to be moved.</param>\n            <param name=\"size\">The size of the block of memory to move, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Byte*,System.Byte*,System.Int32)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n            <remarks>\n            <b>CopyMemory</b> runs faster than <see cref=\"M:FreeImageAPI.FreeImage.MoveMemory(System.Void*,System.Void*,System.UInt32)\"/>.\n            However, if both blocks overlap the result is undefined.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Byte*,System.Byte*,System.Int64)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n            <remarks>\n            <b>CopyMemory</b> runs faster than <see cref=\"M:FreeImageAPI.FreeImage.MoveMemory(System.Void*,System.Void*,System.Int64)\"/>.\n            However, if both blocks overlap the result is undefined.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Void*,System.Void*,System.Int64)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n            <remarks>\n            <b>CopyMemory</b> runs faster than <see cref=\"M:FreeImageAPI.FreeImage.MoveMemory(System.Void*,System.Void*,System.Int64)\"/>.\n            However, if both blocks overlap the result is undefined.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Void*,System.Void*,System.Int32)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n            <remarks>\n            <b>CopyMemory</b> runs faster than <see cref=\"M:FreeImageAPI.FreeImage.MoveMemory(System.Void*,System.Void*,System.UInt32)\"/>.\n            However, if both blocks overlap the result is undefined.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.IntPtr,System.IntPtr,System.Int32)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n            <remarks>\n            <b>CopyMemory</b> runs faster than <see cref=\"M:FreeImageAPI.FreeImage.MoveMemory(System.IntPtr,System.IntPtr,System.UInt32)\"/>.\n            However, if both blocks overlap the result is undefined.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.IntPtr,System.IntPtr,System.Int64)\">\n            <summary>\n            Copies a block of memory from one location to another.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n            <remarks>\n            <b>CopyMemory</b> runs faster than <see cref=\"M:FreeImageAPI.FreeImage.MoveMemory(System.IntPtr,System.IntPtr,System.Int64)\"/>.\n            However, if both blocks overlap the result is undefined.\n            </remarks>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Array,System.Void*,System.Int32)\">\n            <summary>\n            Copies a block of memory into an array.\n            </summary>\n            <param name=\"dest\">An array used as the destination of the copy process.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Array,System.Void*,System.Int64)\">\n            <summary>\n            Copies a block of memory into an array.\n            </summary>\n            <param name=\"dest\">An array used as the destination of the copy process.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Array,System.IntPtr,System.Int32)\">\n            <summary>\n            Copies a block of memory into an array.\n            </summary>\n            <param name=\"dest\">An array used as the destination of the copy process.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Array,System.IntPtr,System.Int64)\">\n            <summary>\n            Copies a block of memory into an array.\n            </summary>\n            <param name=\"dest\">An array used as the destination of the copy process.</param>\n            <param name=\"src\">A pointer to the starting address of the block of memory to copy.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Void*,System.Array,System.Int32)\">\n            <summary>\n            Copies the content of an array to a memory location.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">An array used as the source of the copy process.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Void*,System.Array,System.Int64)\">\n            <summary>\n            Copies the content of an array to a memory location.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">An array used as the source of the copy process.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.IntPtr,System.Array,System.Int32)\">\n            <summary>\n            Copies the content of an array to a memory location.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">An array used as the source of the copy process.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.IntPtr,System.Array,System.Int64)\">\n            <summary>\n            Copies the content of an array to a memory location.\n            </summary>\n            <param name=\"dest\">A pointer to the starting address of the copied block's destination.</param>\n            <param name=\"src\">An array used as the source of the copy process.</param>\n            <param name=\"len\">The size of the block of memory to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Array,System.Array,System.Int32)\">\n            <summary>\n            Copies the content of one array into another array.\n            </summary>\n            <param name=\"dest\">An array used as the destination of the copy process.</param>\n            <param name=\"src\">An array used as the source of the copy process.</param>\n            <param name=\"len\">The size of the content to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CopyMemory(System.Array,System.Array,System.Int64)\">\n            <summary>\n            Copies the content of one array into another array.\n            </summary>\n            <param name=\"dest\">An array used as the destination of the copy process.</param>\n            <param name=\"src\">An array used as the source of the copy process.</param>\n            <param name=\"len\">The size of the content to copy, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetDC(System.IntPtr)\">\n            <summary>\n            Retrieves a handle to a display device context (DC) for the client area of a specified window\n            or for the entire screen. You can use the returned handle in subsequent GDI functions to draw in the DC.\n            </summary>\n            <param name=\"hWnd\">Handle to the window whose DC is to be retrieved.\n            If this value is IntPtr.Zero, GetDC retrieves the DC for the entire screen. </param>\n            <returns>If the function succeeds, the return value is a handle to the DC for the specified window's client area.\n            If the function fails, the return value is NULL.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.ReleaseDC(System.IntPtr,System.IntPtr)\">\n            <summary>\n            Releases a device context (DC), freeing it for use by other applications.\n            The effect of the ReleaseDC function depends on the type of DC. It frees only common and window DCs.\n            It has no effect on class or private DCs.\n            </summary>\n            <param name=\"hWnd\">Handle to the window whose DC is to be released.</param>\n            <param name=\"hDC\">Handle to the DC to be released.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateDIBSection(System.IntPtr,System.IntPtr,System.UInt32,System.IntPtr@,System.IntPtr,System.UInt32)\">\n            <summary>\n            Creates a DIB that applications can write to directly.\n            The function gives you a pointer to the location of the bitmap bit values.\n            You can supply a handle to a file-mapping object that the function will use to create the bitmap,\n            or you can let the system allocate the memory for the bitmap.\n            </summary>\n            <param name=\"hdc\">Handle to a device context.</param>\n            <param name=\"pbmi\">Pointer to a BITMAPINFO structure that specifies various attributes of the DIB,\n            including the bitmap dimensions and colors.</param>\n            <param name=\"iUsage\">Specifies the type of data contained in the bmiColors array member of the BITMAPINFO structure\n            pointed to by pbmi (either logical palette indexes or literal RGB values).</param>\n            <param name=\"ppvBits\">Pointer to a variable that receives a pointer to the location of the DIB bit values.</param>\n            <param name=\"hSection\">Handle to a file-mapping object that the function will use to create the DIB.\n            This parameter can be NULL.</param>\n            <param name=\"dwOffset\">Specifies the offset from the beginning of the file-mapping object referenced by hSection\n            where storage for the bitmap bit values is to begin. This value is ignored if hSection is NULL.</param>\n            <returns>If the function succeeds, the return value is a handle to the newly created DIB,\n            and *ppvBits points to the bitmap bit values. If the function fails, the return value is NULL, and *ppvBits is NULL.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.DeleteObject(System.IntPtr)\">\n            <summary>\n            Deletes a logical pen, brush, font, bitmap, region, or palette, freeing all system resources associated with the object.\n            After the object is deleted, the specified handle is no longer valid.\n            </summary>\n            <param name=\"hObject\">Handle to a logical pen, brush, font, bitmap, region, or palette.</param>\n            <returns>Returns true on success, false on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.CreateDIBitmap(System.IntPtr,System.IntPtr,System.UInt32,System.IntPtr,System.IntPtr,System.UInt32)\">\n            <summary>\n            Creates a compatible bitmap (DDB) from a DIB and, optionally, sets the bitmap bits.\n            </summary>\n            <param name=\"hdc\">Handle to a device context.</param>\n            <param name=\"lpbmih\">Pointer to a bitmap information header structure.</param>\n            <param name=\"fdwInit\">Specifies how the system initializes the bitmap bits - (use 4).</param>\n            <param name=\"lpbInit\">Pointer to an array of bytes containing the initial bitmap data.</param>\n            <param name=\"lpbmi\">Pointer to a BITMAPINFO structure that describes the dimensions\n            and color format of the array pointed to by the lpbInit parameter.</param>\n            <param name=\"fuUsage\">Specifies whether the bmiColors member of the BITMAPINFO structure\n            was initialized - (use 0).</param>\n            <returns>Handle to a DIB or null on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetObject(System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            Retrieves information for the specified graphics object.\n            </summary>\n            <param name=\"hgdiobj\">Handle to the graphics object of interest.</param>\n            <param name=\"cbBuffer\">Specifies the number of bytes of information to\n            be written to the buffer.</param>\n            <param name=\"lpvObject\">Pointer to a buffer that receives the information\n            about the specified graphics object.</param>\n            <returns>0 on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.GetDIBits(System.IntPtr,System.IntPtr,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr,System.UInt32)\">\n            <summary>\n            Retrieves the bits of the specified compatible bitmap and copies them into a buffer\n            as a DIB using the specified format.\n            </summary>\n            <param name=\"hdc\">Handle to the device context.</param>\n            <param name=\"hbmp\">Handle to the bitmap. This must be a compatible bitmap (DDB).</param>\n            <param name=\"uStartScan\">Specifies the first scan line to retrieve.</param>\n            <param name=\"cScanLines\">Specifies the number of scan lines to retrieve.</param>\n            <param name=\"lpvBits\">Pointer to a buffer to receive the bitmap data.</param>\n            <param name=\"lpbmi\">Pointer to a BITMAPINFO structure that specifies the desired\n            format for the DIB data.</param>\n            <param name=\"uUsage\">Specifies the format of the bmiColors member of the\n            BITMAPINFO structure - (use 0).</param>\n            <returns>0 on failure.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.MoveMemory(System.Void*,System.Void*,System.UInt32)\">\n            <summary>\n            Moves a block of memory from one location to another.\n            </summary>\n            <param name=\"dst\">Pointer to the starting address of the move destination.</param>\n            <param name=\"src\">Pointer to the starting address of the block of memory to be moved.</param>\n            <param name=\"size\">Size of the block of memory to move, in bytes.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FreeImage.RtlCompareMemory(System.Void*,System.Void*,System.UInt32)\">\n            <summary>\n            The RtlCompareMemory routine compares blocks of memory\n            and returns the number of bytes that are equivalent.\n            </summary>\n            <param name=\"buf1\">A pointer to a block of memory to compare.</param>\n            <param name=\"buf2\">A pointer to a block of memory to compare.</param>\n            <param name=\"count\">Specifies the number of bytes to be compared.</param>\n            <returns>RtlCompareMemory returns the number of bytes that compare as equal.\n            If all bytes compare as equal, the input Length is returned.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FITAG\">\n            <summary>\n            The <b>FITAG</b> structure is a handle to a FreeImage metadata tag.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FITAG.Zero\">\n            <summary>\n            A read-only field that represents a handle that has been initialized to zero.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.op_Equality(FreeImageAPI.FITAG,FreeImageAPI.FITAG)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FITAG\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FITAG\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FITAG\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FITAG\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.op_Inequality(FreeImageAPI.FITAG,FreeImageAPI.FITAG)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.FITAG\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.FITAG\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.FITAG\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.FITAG\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FITAG.IsNull\">\n            <summary>\n            Gets whether the pointer is a null pointer or not.\n            </summary>\n            <value><b>true</b> if this <see cref=\"T:FreeImageAPI.FITAG\"/> is a null pointer;\n            otherwise, <b>false</b>.</value>\t\t\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.SetNull\">\n            <summary>\n            Sets the handle to <i>null</i>.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FITAG\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FITAG\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FITAG\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with the current <see cref=\"T:System.Object\"/>.</param>\n            <returns><b>true</b> if the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.Equals(FreeImageAPI.FITAG)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <param name=\"other\">An object to compare with this object.</param>\n            <returns><b>true</b> if the current object is equal to the other parameter; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FITAG\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FITAG.CompareTo(FreeImageAPI.FITAG)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FITAG\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FITAG\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FIURational\">\n            <summary>\n            The <b>FIURational</b> structure represents a fraction via two <see cref=\"T:System.UInt32\"/>\n            instances which are interpreted as numerator and denominator.\n            </summary>\n            <remarks>\n            The structure tries to approximate the value of <see cref=\"M:FreeImageAPI.FIURational.#ctor(System.Decimal)\"/>\n            when creating a new instance by using a better algorithm than FreeImage does.\n            <para/>\n            The structure implements the following operators:\n            +, ++, --, ==, != , >, >==, &lt;, &lt;== and ~ (which switches nominator and denomiator).\n            <para/>\n            The structure can be converted into all .NET standard types either implicit or\n            explicit.\n            </remarks>\n        </member>\n        <member name=\"F:FreeImageAPI.FIURational.MaxValue\">\n            <summary>\n            Represents the largest possible value of <see cref=\"T:FreeImageAPI.FIURational\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIURational.MinValue\">\n            <summary>\n            Represents the smallest possible value of <see cref=\"T:FreeImageAPI.FIURational\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FIURational.Epsilon\">\n            <summary>\n            Represents the smallest positive <see cref=\"T:FreeImageAPI.FIURational\"/> value greater than zero. This field is constant.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.#ctor(System.UInt32,System.UInt32)\">\n            <summary>\n            Initializes a new instance based on the specified parameters.\n            </summary>\n            <param name=\"n\">The numerator.</param>\n            <param name=\"d\">The denominator.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.#ctor(FreeImageAPI.FITAG)\">\n            <summary>\n            Initializes a new instance based on the specified parameters.\n            </summary>\n            <param name=\"tag\">The tag to read the data from.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.#ctor(System.Decimal)\">\n             <summary>\n            Initializes a new instance based on the specified parameters.\n             </summary>\n             <param name=\"value\">The value to convert into a fraction.</param>\n             <exception cref=\"T:System.OverflowException\">\n             <paramref name=\"value\"/> cannot be converted into a fraction\n             represented by two unsigned integer values.</exception>\n        </member>\n        <member name=\"P:FreeImageAPI.FIURational.Numerator\">\n            <summary>\n            The numerator of the fraction.\n            </summary>\n        </member>\n        <member name=\"P:FreeImageAPI.FIURational.Denominator\">\n            <summary>\n            The denominator of the fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Truncate\">\n            <summary>\n            Returns the truncated value of the fraction.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:FreeImageAPI.FIURational.IsInteger\">\n            <summary>\n            Returns whether the fraction is representing an integer value.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Gcd(System.UInt64,System.UInt64)\">\n            <summary>\n            Calculated the greatest common divisor of 'a' and 'b'.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Scm(System.UInt32,System.UInt32)\">\n            <summary>\n            Calculated the smallest common multiple of 'a' and 'b'.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Normalize\">\n            <summary>\n            Normalizes the fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Normalize(System.UInt64@,System.UInt64@)\">\n            <summary>\n            Normalizes a fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.GetDigits(System.Decimal)\">\n            <summary>\n            Returns the digits after the point.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.CreateContinuedFraction(System.Decimal)\">\n            <summary>\n            Creates a continued fraction of a decimal value.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.CreateFraction(System.Int32[],System.UInt32@,System.UInt32@)\">\n            <summary>\n            Creates a fraction from a continued fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.ApproximateFraction(System.Decimal,System.Int32,System.UInt32@,System.UInt32@)\">\n            <summary>\n            Tries 'brute force' to approximate <paramref name=\"value\"/> with a fraction.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FIURational\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.FIURational\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIURational\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIURational\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.FIURational\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_UnaryPlus(FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_OnesComplement(FreeImageAPI.FIURational)\">\n            <summary>\n            Returns the reciprocal value of this instance.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Increment(FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Decrement(FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Addition(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Subtraction(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Multiply(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Division(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Modulus(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Equality(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Inequality(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_GreaterThan(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_LessThan(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_GreaterThanOrEqual(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_LessThanOrEqual(FreeImageAPI.FIURational,FreeImageAPI.FIURational)\">\n            <summary>\n            Standard implementation of the operator.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.Boolean\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.Boolean\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Boolean\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.Byte\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.Byte\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Byte\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.Char\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.Char\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Char\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(FreeImageAPI.FIURational)~System.Decimal\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.Decimal\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Decimal\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(FreeImageAPI.FIURational)~System.Double\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.Double\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Double\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.Int16\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to an <see cref=\"T:System.Int16\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Int16\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.Int32\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to an <see cref=\"T:System.Int32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Int32\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.Int64\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to an <see cref=\"T:System.Int64\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Int64\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(FreeImageAPI.FIURational)~System.Single\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.Single\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Single\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.SByte\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to a <see cref=\"T:System.SByte\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.SByte\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.UInt16\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to an <see cref=\"T:System.UInt16\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.UInt16\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.UInt32\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to an <see cref=\"T:System.UInt32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.UInt32\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(FreeImageAPI.FIURational)~System.UInt64\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FIURational\"/> structure to an <see cref=\"T:System.UInt32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.UInt32\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.Boolean)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Boolean\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Boolean\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(System.Byte)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Byte\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Byte\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(System.Char)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Char\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Char\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.Decimal)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Decimal\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Decimal\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.Double)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Double\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Double\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(System.Int16)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.Int16\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.Int16\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(System.Int32)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.Int32\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.Int32\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.Int64)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.Int64\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.Int64\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(System.SByte)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.SByte\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.SByte\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.Single)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Single\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Single\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Implicit(System.UInt16)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt16\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt16\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.UInt32)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt32\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt32\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.op_Explicit(System.UInt64)~FreeImageAPI.FIURational\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt64\"/> structure to a <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt64\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FIURational\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.FIURational\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.ToString(System.String,System.IFormatProvider)\">\n            <summary>\n            Formats the value of the current instance using the specified format.\n            </summary>\n            <param name=\"format\">The String specifying the format to use.</param>\n            <param name=\"formatProvider\">The IFormatProvider to use to format the value.</param>\n            <returns>A String containing the value of the current instance in the specified format.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.Equals(FreeImageAPI.FIURational)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.FIURational\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.FIURational\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIURational\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.FIURational\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.FIURational\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FIURational.CompareTo(FreeImageAPI.FIURational)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.FIURational\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.FIURational\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.FI4BIT\">\n            <summary>\n            The <b>FI4BIT</b> structure represents the half of a <see cref=\"T:System.Byte\"/>.\n            It's valuerange is between <i>0</i> and <i>15</i>.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FI4BIT.MaxValue\">\n            <summary>\n            Represents the largest possible value of <see cref=\"T:FreeImageAPI.FI4BIT\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FI4BIT.MinValue\">\n            <summary>\n            Represents the smallest possible value of <see cref=\"T:FreeImageAPI.FI4BIT\"/>. This field is constant.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.FI4BIT.value\">\n            <summary>\n            The value of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.FI4BIT.#ctor(System.Byte)\">\n            <summary>\n            Initializes a new instance based on the specified value.\n            </summary>\n            <param name=\"value\">The value to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.FI4BIT.op_Implicit(FreeImageAPI.FI4BIT)~System.Byte\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.FI4BIT\"/> structure to a <see cref=\"T:System.Byte\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.FI4BIT\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FI4BIT\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI4BIT.op_Implicit(System.Byte)~FreeImageAPI.FI4BIT\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Byte\"/> structure to a <see cref=\"T:FreeImageAPI.FI4BIT\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Byte\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.FI4BIT\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.FI4BIT.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.FI4BIT\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.RGBQUAD\">\n            <summary>\n            The <b>RGBQUAD</b> structure describes a color consisting of relative\n            intensities of red, green, blue and alpha value. Each single color\n            component consumes 8 bits and so, takes values in the range from 0 to 255.\n            </summary>\n            <remarks>\n            <para>\n            The <b>RGBQUAD</b> structure provides access to an underlying Win32 <b>RGBQUAD</b>\n            structure. To determine the alpha, red, green or blue component of a color,\n            use the rgbReserved, rgbRed, rgbGreen or rgbBlue fields, respectively.\n            </para>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>RGBQUAD</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>RGBQUAD</b> structure and my be used in all situations which require\n            an <b>RGBQUAD</b> type.\n            </para>\n            <para>\n            Each color component rgbReserved, rgbRed, rgbGreen or rgbBlue of <b>RGBQUAD</b>\n            is translated into it's corresponding color component A, R, G or B of\n            <see cref=\"T:System.Drawing.Color\"/> by an one-to-one manner and vice versa.\n            </para>\n            <para>\n            <b>Conversion from System.Drawing.Color to RGBQUAD</b>\n            </para>\n            <c>RGBQUAD.component = Color.component</c>\n            <para>\n            <b>Conversion from RGBQUAD to System.Drawing.Color</b>\n            </para>\n            <c>Color.component = RGBQUAD.component</c>\n            <para>\n            The same conversion is also applied when the <see cref=\"P:FreeImageAPI.RGBQUAD.Color\"/>\n            property or the <see cref=\"M:FreeImageAPI.RGBQUAD.#ctor(System.Drawing.Color)\"/> constructor\n            is invoked.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>RGBQUAD</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            RGBQUAD rgbq;\n            // Initialize the structure using a native .NET Color structure.\n            rgbq = new RGBQUAD(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            rgbq = Color.DarkSeaGreen;\n            // Convert the RGBQUAD instance into a native .NET Color\n            // using its implicit operator.\n            Color color = rgbq;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = rgbq.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBQUAD.rgbBlue\">\n            <summary>\n            The blue color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBQUAD.rgbGreen\">\n            <summary>\n            The green color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBQUAD.rgbRed\">\n            <summary>\n            The red color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBQUAD.rgbReserved\">\n            <summary>\n            The alpha color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBQUAD.uintValue\">\n            <summary>\n            The color's value.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.op_Equality(FreeImageAPI.RGBQUAD,FreeImageAPI.RGBQUAD)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.RGBQUAD\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.RGBQUAD\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.op_Inequality(FreeImageAPI.RGBQUAD,FreeImageAPI.RGBQUAD)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.RGBQUAD\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.RGBQUAD\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.op_Implicit(System.Drawing.Color)~FreeImageAPI.RGBQUAD\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.RGBQUAD\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.op_Implicit(FreeImageAPI.RGBQUAD)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure to a Color structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.op_Implicit(System.UInt32)~FreeImageAPI.RGBQUAD\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt32\"/> structure to a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt32\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.RGBQUAD\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.op_Implicit(FreeImageAPI.RGBQUAD)~System.UInt32\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure to an <see cref=\"T:System.UInt32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.RGBQUAD\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.RGBQUAD.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.ToRGBQUAD(System.Drawing.Color[])\">\n            <summary>\n            Converts an array of <see cref=\"P:FreeImageAPI.RGBQUAD.Color\"/> into an array of\n            <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.\n            </summary>\n            <param name=\"array\">The array to convert.</param>\n            <returns>An array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.ToColor(FreeImageAPI.RGBQUAD[])\">\n            <summary>\n            Converts an array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/> into an array of\n            <see cref=\"P:FreeImageAPI.RGBQUAD.Color\"/>.\n            </summary>\n            <param name=\"array\">The array to convert.</param>\n            <returns>An array of <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.CompareTo(FreeImageAPI.RGBQUAD)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.RGBQUAD\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.RGBQUAD\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.Equals(FreeImageAPI.RGBQUAD)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure is equivalent to this <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.RGBQUAD\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.RGBQUAD\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBQUAD.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.RGBQUAD\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n        <member name=\"T:FreeImageAPI.RGBTRIPLE\">\n            <summary>\n            The <b>RGBTRIPLE</b> structure describes a color consisting of relative\n            intensities of red, green and blue value. Each single color component\n            consumes 8 bits and so, takes values in the range from 0 to 255.\n            </summary>\n            <remarks>\n            <para>\n            The <b>RGBTRIPLE</b> structure provides access to an underlying Win32 <b>RGBTRIPLE</b>\n            structure. To determine the red, green or blue component of a color, use the\n            rgbtRed, rgbtGreen or rgbtBlue fields, respectively.\n            </para>\n            <para>For easy integration of the underlying structure into the .NET framework,\n            the <b>RGBTRIPLE</b> structure implements implicit conversion operators to \n            convert the represented color to and from the <see cref=\"T:System.Drawing.Color\"/>\n            type. This makes the <see cref=\"T:System.Drawing.Color\"/> type a real replacement\n            for the <b>RGBTRIPLE</b> structure and my be used in all situations which require\n            an <b>RGBTRIPLE</b> type.\n            </para>\n            <para>\n            Each of the color components rgbtRed, rgbtGreen or rgbtBlue of <b>RGBTRIPLE</b> is\n            translated into it's corresponding color component R, G or B of\n            <see cref=\"T:System.Drawing.Color\"/> by an one-to-one manner and vice versa.\n            When converting from <see cref=\"T:System.Drawing.Color\"/> into <b>RGBTRIPLE</b>, the\n            color's alpha value is ignored and assumed to be 255 when converting from\n            <b>RGBTRIPLE</b> into <see cref=\"T:System.Drawing.Color\"/>, creating a fully\n            opaque color.\n            </para>\n            <para>\n            <b>Conversion from System.Drawing.Color to RGBTRIPLE</b>\n            </para>\n            <c>RGBTRIPLE.component = Color.component</c>\n            <para>\n            <b>Conversion from RGBTRIPLE to System.Drawing.Color</b>\n            </para>\n            <c>Color.component = RGBTRIPLE.component</c>\n            <para>\n            The same conversion is also applied when the <see cref=\"P:FreeImageAPI.RGBTRIPLE.Color\"/>\n            property or the <see cref=\"M:FreeImageAPI.RGBTRIPLE.#ctor(System.Drawing.Color)\"/> constructor\n            is invoked.\n            </para>\n            </remarks>\n            <example>\n            The following code example demonstrates the various conversions between the\n            <b>RGBTRIPLE</b> structure and the <see cref=\"T:System.Drawing.Color\"/> structure.\n            <code>\n            RGBTRIPLE rgbt;\n            // Initialize the structure using a native .NET Color structure.\n            rgbt = new RGBTRIPLE(Color.Indigo);\n            // Initialize the structure using the implicit operator.\n            rgbt = Color.DarkSeaGreen;\n            // Convert the RGBTRIPLE instance into a native .NET Color\n            // using its implicit operator.\n            Color color = rgbt;\n            // Using the structure's Color property for converting it\n            // into a native .NET Color.\n            Color another = rgbt.Color;\n            </code>\n            </example>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBTRIPLE.rgbtBlue\">\n            <summary>\n            The blue color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBTRIPLE.rgbtGreen\">\n            <summary>\n            The green color component.\n            </summary>\n        </member>\n        <member name=\"F:FreeImageAPI.RGBTRIPLE.rgbtRed\">\n            <summary>\n            The red color component.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.#ctor(System.Drawing.Color)\">\n            <summary>\n            Initializes a new instance based on the specified <see cref=\"T:System.Drawing.Color\"/>.\n            </summary>\n            <param name=\"color\"><see cref=\"T:System.Drawing.Color\"/> to initialize with.</param>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.op_Equality(FreeImageAPI.RGBTRIPLE,FreeImageAPI.RGBTRIPLE)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structures are equivalent.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> that is to the left of the equality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> that is to the right of the equality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structures are equal; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.op_Inequality(FreeImageAPI.RGBTRIPLE,FreeImageAPI.RGBTRIPLE)\">\n            <summary>\n            Tests whether two specified <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structures are different.\n            </summary>\n            <param name=\"left\">The <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> that is to the left of the inequality operator.</param>\n            <param name=\"right\">The <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> that is to the right of the inequality operator.</param>\n            <returns>\n            <b>true</b> if the two <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structures are different; otherwise, <b>false</b>.\n            </returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.op_Implicit(System.Drawing.Color)~FreeImageAPI.RGBTRIPLE\">\n            <summary>\n            Converts the value of a <see cref=\"T:System.Drawing.Color\"/> structure to a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:System.Drawing.Color\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.op_Implicit(FreeImageAPI.RGBTRIPLE)~System.Drawing.Color\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure to a <see cref=\"T:System.Drawing.Color\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:System.Drawing.Color\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.op_Implicit(System.UInt32)~FreeImageAPI.RGBTRIPLE\">\n            <summary>\n            Converts the value of an <see cref=\"T:System.UInt32\"/> structure to a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.\n            </summary>\n            <param name=\"value\">An <see cref=\"T:System.UInt32\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.op_Implicit(FreeImageAPI.RGBTRIPLE)~System.UInt32\">\n            <summary>\n            Converts the value of a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure to an <see cref=\"T:System.UInt32\"/> structure.\n            </summary>\n            <param name=\"value\">A <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.</param>\n            <returns>A new instance of <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> initialized to <paramref name=\"value\"/>.</returns>\n        </member>\n        <member name=\"P:FreeImageAPI.RGBTRIPLE.Color\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Drawing.Color\"/> of the structure.\n            </summary>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.CompareTo(System.Object)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>A 32-bit signed integer indicating the lexical relationship between the two comparands.</returns>\n            <exception cref=\"T:System.ArgumentException\"><paramref name=\"obj\"/> is not a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/>.</exception>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.CompareTo(FreeImageAPI.RGBTRIPLE)\">\n            <summary>\n            Compares this instance with a specified <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> to compare.</param>\n            <returns>A signed number indicating the relative values of this instance\n            and <paramref name=\"other\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.Equals(System.Object)\">\n            <summary>\n            Tests whether the specified object is a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure\n            and is equivalent to this <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.\n            </summary>\n            <param name=\"obj\">The object to test.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.Equals(FreeImageAPI.RGBTRIPLE)\">\n            <summary>\n            Tests whether the specified <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure is equivalent to this\n            <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure to compare to this instance.</param>\n            <returns><b>true</b> if <paramref name=\"obj\"/> is a <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure\n            equivalent to this <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure; otherwise, <b>false</b>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.GetHashCode\">\n            <summary>\n            Returns a hash code for this <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> structure.\n            </summary>\n            <returns>An integer value that specifies the hash code for this <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/>.</returns>\n        </member>\n        <member name=\"M:FreeImageAPI.RGBTRIPLE.ToString\">\n            <summary>\n            Converts the numeric value of the <see cref=\"T:FreeImageAPI.RGBTRIPLE\"/> object\n            to its equivalent string representation.\n            </summary>\n            <returns>The string representation of the value of this instance.</returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "App/Lib/PowerJSON.XML",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>PowerJson</name>\n    </assembly>\n    <members>\n        <member name=\"T:PowerJson.Extensions.DataReaderSerializer\">\n            <summary>\n            A serializer that directly writes out JSON from <see cref=\"T:System.Data.IDataReader\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Extensions.DataReaderSerializer.WriteAsDataArray(System.Data.IDataReader,System.IO.TextWriter,PowerJson.SerializationManager)\">\n            <summary>\n            Writes the JSON array representation from an <see cref=\"T:System.Data.IDataReader\"/> to the output <paramref name=\"target\" />.\n            </summary>\n            <param name=\"data\">The data to be serialized.</param>\n            <param name=\"target\">The output target.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON serialization.</param>\n        </member>\n        <member name=\"T:PowerJson.Extensions.EnumerableDataReader\">\n            <summary>\n            Turns an <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> collection into an <see cref=\"T:PowerJson.Extensions.EnumerableDataReader\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader.Create``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Creates an <see cref=\"T:PowerJson.Extensions.EnumerableDataReader`1\"/> instance from a given <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> instance.\n            </summary>\n            <typeparam name=\"T\">The type of the data.</typeparam>\n            <param name=\"collection\">The data to be read.</param>\n            <returns>An <see cref=\"T:PowerJson.Extensions.EnumerableDataReader`1\"/> instance.</returns>\n        </member>\n        <member name=\"T:PowerJson.Extensions.EnumerableDataReader`1\">\n            <summary>\n            Experimental Feature:\n            Converts <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> instances into <see cref=\"T:System.Data.IDataReader\"/> for <see cref=\"M:System.Data.SqlClient.SqlBulkCopy.WriteToServer(System.Data.IDataReader)\"/>.\n            </summary>\n            <remarks>References:\n            1) https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs;\n            2) http://www.codeproject.com/Articles/876276/Bulk-Insert-Into-SQL-From-Csharp</remarks>\n            <typeparam name=\"T\">The data type in the data source.</typeparam>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.#ctor(System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.Extensions.EnumerableDataReader`1\"/> class.\n            </summary>\n            <param name=\"collection\">The collection to be exported.</param>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.#ctor(System.Collections.Generic.IEnumerable{`0},System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.Extensions.EnumerableDataReader`1\"/> class.\n            </summary>\n            <param name=\"collection\">The collection.</param>\n            <param name=\"showReadOnlyValues\">if set to <c>true</c>, read-only values will be exported to the <see cref=\"T:System.Data.IDataReader\"/>.</param>\n            <exception cref=\"T:System.NotSupportedException\">This exception will be thrown when <typeparamref name=\"T\"/> is a scalar type.</exception>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.Close\">\n            <summary>\n            Closes the reader.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Extensions.EnumerableDataReader`1.Depth\">\n            <summary>\n            Gets the depth of the reader (0 is always returned).\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetSchemaTable\">\n            <summary>\n            Gets the schema table.\n            </summary>\n            <returns>The schema table containing the following columns for each member: ColumnName, ColumnOrdinal, DataType, DataTypeName, ColumnSize.</returns>\n        </member>\n        <member name=\"P:PowerJson.Extensions.EnumerableDataReader`1.IsClosed\">\n            <summary>\n            Gets a value indicating whether this instance is closed.\n            </summary>\n            <value>\n              <c>true</c> if this instance is closed; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.NextResult\">\n            <summary>\n            Proceed to the next result.\n            </summary>\n            <returns>Always returns false.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.Read\">\n            <summary>\n            Reads an object in the collection.\n            </summary>\n            <returns>True if there is an object being read, otherwise, false.</returns>\n            <exception cref=\"T:System.ObjectDisposedException\">The instance is disposed.</exception>\n        </member>\n        <member name=\"P:PowerJson.Extensions.EnumerableDataReader`1.RecordsAffected\">\n            <summary>\n            Gets the records affected (always returns -1).\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.Dispose\">\n            <summary>\n            Dispose the internal collection enumerator.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Extensions.EnumerableDataReader`1.FieldCount\">\n            <summary>\n            Gets the field count.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetBoolean(System.Int32)\">\n            <summary>\n            Gets a boolean value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetByte(System.Int32)\">\n            <summary>\n            Gets a byte value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)\">\n            <summary>\n            Gets the bytes at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <param name=\"fieldOffset\">The field offset.</param>\n            <param name=\"buffer\">The buffer.</param>\n            <param name=\"bufferoffset\">The buffer offset.</param>\n            <param name=\"length\">The length to read.</param>\n            <returns>The number of bytes copied into the buffer.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetChar(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Char\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Char\"/> array at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <param name=\"fieldoffset\">The field offset.</param>\n            <param name=\"buffer\">The buffer.</param>\n            <param name=\"bufferoffset\">The buffer offset.</param>\n            <param name=\"length\">The length to read.</param>\n            <returns>The number of bytes copied into the buffer.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetData(System.Int32)\">\n            <summary>\n            This method is not implemented.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns></returns>\n            <exception cref=\"T:System.NotImplementedException\"></exception>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetDataTypeName(System.Int32)\">\n            <summary>\n            Gets the name of the data type.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetDateTime(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.DateTime\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetDecimal(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Decimal\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetDouble(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Double\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetFieldType(System.Int32)\">\n            <summary>\n            Gets the type of the field.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The <see cref=\"T:System.Type\"/> of the member at specific field index.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetFloat(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Single\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetGuid(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Guid\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetInt16(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Int16\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetInt32(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Int32\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetInt64(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.Int64\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetName(System.Int32)\">\n            <summary>\n            Gets the name of the field.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The member name at the specific index.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetOrdinal(System.String)\">\n            <summary>\n            Gets the ordinal index of a member.\n            </summary>\n            <param name=\"name\">The name of the member.</param>\n            <returns>The field index of the member.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetString(System.Int32)\">\n            <summary>\n            Gets a <see cref=\"T:System.String\"/> value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetValue(System.Int32)\">\n            <summary>\n            Gets the value at the specific index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.GetValues(System.Object[])\">\n            <summary>\n            Loads all values into the <paramref name=\"values\"/> array.\n            </summary>\n            <param name=\"values\">The array which holds the field values.</param>\n            <returns>The number of fields loaded into the array.</returns>\n        </member>\n        <member name=\"M:PowerJson.Extensions.EnumerableDataReader`1.IsDBNull(System.Int32)\">\n            <summary>\n            Determines whether the field at the specific index is <see cref=\"T:System.DBNull\"/>.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>True if the value is <see cref=\"T:System.DBNull\"/></returns>\n        </member>\n        <member name=\"P:PowerJson.Extensions.EnumerableDataReader`1.Item(System.String)\">\n            <summary>\n            Gets the value of a member with the specified name.\n            </summary>\n            <param name=\"name\">The name of the field.</param>\n            <returns>The value of the member with the specific name.</returns>\n        </member>\n        <member name=\"P:PowerJson.Extensions.EnumerableDataReader`1.Item(System.Int32)\">\n            <summary>\n            Gets the value of a member at the specified index.\n            </summary>\n            <param name=\"i\">The index of the field.</param>\n            <returns>The value of a member at the specified index.</returns>\n        </member>\n        <member name=\"T:PowerJson.ExtraConverters.IPAddressConverter\">\n            <summary>\n            An <see cref=\"T:PowerJson.IJsonConverter\"/> which converts between <see cref=\"T:System.Net.IPAddress\"/> and string.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.ExtraConverters.VersionConverter\">\n            <summary>\n            An <see cref=\"T:PowerJson.IJsonConverter\"/> which converts between <see cref=\"T:System.Version\"/> and string.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.ExtraConverters.XmlNodeConverter\">\n            <summary>\n            A <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Xml.XmlElement\"/> to JSON strings. Currently deserialization has not yet been implemented.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.ExtraConverters.ZeroOneBooleanConverter\">\n            <summary>\n            A <see cref=\"T:PowerJson.IJsonConverter\"/> converts boolean values to 1/0 or \"1\"/\"0\", rather than the default \"true\" and \"false\" values.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.ExtraConverters.ZeroOneBooleanConverter.#ctor\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.ExtraConverters.ZeroOneBooleanConverter\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.ExtraConverters.ZeroOneBooleanConverter.#ctor(System.Boolean)\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.ExtraConverters.ZeroOneBooleanConverter\"/>, specifying whether the boolean values should be serialized to textual \"1\"/\"0\" values.\n            </summary>\n            <param name=\"useTextualForm\">When this value is true, the boolean values will be serialized to textual \"1\"/\"0\" values.</param>\n        </member>\n        <member name=\"P:PowerJson.ExtraConverters.ZeroOneBooleanConverter.UseTextualForm\">\n            <summary>\n            Gets whether the boolean values should be serialized to textual \"1\"/\"0\" values.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.EnumValueFormat\">\n            <summary>\n            Controls the naming format of serialized enum values.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.EnumValueFormat.Default\">\n            <summary>\n            The serialized names will be the same as the field name.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.EnumValueFormat.LowerCase\">\n            <summary>\n            All letters in the serialized names will be changed to lowercase.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.EnumValueFormat.CamelCase\">\n            <summary>\n            The first letter of each serialized names will be changed to lowercase.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.EnumValueFormat.UpperCase\">\n            <summary>\n            All letters in the serialized names will be changed to uppercase.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.EnumValueFormat.Numeric\">\n            <summary>\n            Enum fields will be serialized numerically.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.NamingConvention\">\n            <summary>\n            Controls the letter case of serialized field names.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.NamingConvention.Default\">\n            <summary>\n            The letter case of the serialized field names will be the same as the field or member name.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.NamingConvention.LowerCase\">\n            <summary>\n            All letters in the serialized field names will be changed to lowercase.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.NamingConvention.CamelCase\">\n            <summary>\n            The first letter of each serialized field names will be changed to lowercase.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.NamingConvention.UpperCase\">\n            <summary>\n            All letters in the serialized field names will be changed to uppercase.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.TriState\">\n            <summary>Indicates the state of a setting.</summary>\n        </member>\n        <member name=\"F:PowerJson.TriState.Default\">\n            <summary>Represents the normal behavior.</summary>\n        </member>\n        <member name=\"F:PowerJson.TriState.True\">\n            <summary>Represents a positive setting. Actions should be taken to the object.</summary>\n        </member>\n        <member name=\"F:PowerJson.TriState.False\">\n            <summary>Represents a negative setting. Actions may not be taken to the object.</summary>\n        </member>\n        <member name=\"T:PowerJson.Converters\">\n            <summary>\n            Contains extra <see cref=\"T:PowerJson.IJsonConverter\"/>s to help serializing extra types. Those converters will not automatically get effective unless they are applied to corresponding types via the <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method or members via the <see cref=\"M:PowerJson.SerializationManager.OverrideMemberConverter(System.Type,System.String,PowerJson.IJsonConverter)\"/> method.\n            </summary>\n            <preliminary />\n        </member>\n        <member name=\"P:PowerJson.Converters.IPAddress\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Net.IPAddress\"/> instances.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.Regex\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Text.RegularExpressions.Regex\"/> instances.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.ZeroOneBoolean\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Boolean\"/> instances to numeric 1 or 0 rather than the default \"true\", \"false\" values.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.TextualZeroOneBoolean\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Boolean\"/> instances to literal \"1\" or \"0\" rather than the default \"true\", \"false\" values.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.Type\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Type\"/> instances.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.Uri\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Uri\"/> instances.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.Version\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert <see cref=\"T:System.Version\"/> instances.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Converters.XmlNode\">\n            <summary>\n            Gets an <see cref=\"T:PowerJson.IJsonConverter\"/> to serialize <see cref=\"T:System.Xml.XmlDocument\"/> or <see cref=\"T:System.Xml.XmlElement\"/> instances. NOTICE: Deserialization is not supported at this moment.\n            </summary>\n            <remarks>\n            <para>Elements will be serialized as a dictionary which contains the following three items:</para>\n            <list type=\"table\">\n            <listheader><term>XML Node</term><description>Serialization Result</description></listheader>\n            <item><term>Element name</term><description>A dictionary entry with a name as the element qualified name surrounded with &lt; and &gt; and the value is its namespace URL.</description></item>\n            <item><term>Attributes</term><description>A dictionary entry with a name as the attribute name prefixed with an \"@\" character, and the value of the attribute.</description></item>\n            <item><term>Nodes</term><description>An array contains the child nodes of the element. The array can contain the following node types and child elements.</description></item>\n            <item><term>Text, CDATA, Entity reference</term><description>A text in the nodes array.</description></item>\n            <item><term>Processing Instruction, XML declaration</term><description>A dictionary containing one name-value pair in the nodes array.</description></item>\n            <item><term>Comment</term><description>A dictionary in the nodes array with a name \"!\" and a value as the content of the comment.</description></item>\n            </list>\n            </remarks>\n        </member>\n        <member name=\"T:PowerJson.IJsonConverter\">\n            <summary>\n            Converts the member value being serialized or deserialized.\n            </summary>\n            <remarks>\n            <para>During deserialization, the JSON string is parsed and converted to primitive data.\n            The data could be one of the following six types returned from the JSON Parser: <see cref=\"T:System.Boolean\"/>, <see cref=\"T:System.Int64\"/>, <see cref=\"T:System.Double\"/>, <see cref=\"T:System.String\"/>, <see cref=\"T:System.Collections.Generic.IList`1\"/> and <see cref=\"T:System.Collections.Generic.IDictionary`2\"/>.</para>\n            <para>The <see cref=\"M:PowerJson.IJsonConverter.DeserializationConvert(System.Object)\"/> method should be able to process the above six types, as well as the null value, and convert the value to match the type of the member being deserialized.</para>\n            <para>If the <see cref=\"M:PowerJson.IJsonConverter.GetReversiveType(PowerJson.JsonItem)\"/> method returns a <see cref=\"T:System.Type\"/> instead of null or the type of <see cref=\"T:System.Object\"/>, the deserializer will firstly attempt to revert the primitive data to match that type, and then pass the reverted value to the <see cref=\"M:PowerJson.IJsonConverter.DeserializationConvert(System.Object)\"/> method.\n            By this means, the implementation of <see cref=\"M:PowerJson.IJsonConverter.DeserializationConvert(System.Object)\"/> method does not have to cope with primitive data types.</para>\n            <para>To implement the <see cref=\"M:PowerJson.IJsonConverter.GetReversiveType(PowerJson.JsonItem)\"/> method, keep in mind that the <see cref=\"P:PowerJson.JsonItem.Value\"/> in the <see cref=\"T:PowerJson.JsonItem\"/> instance will always be primitive data.</para>\n            </remarks>\n            <preliminary />\n        </member>\n        <member name=\"M:PowerJson.IJsonConverter.GetReversiveType(PowerJson.JsonItem)\">\n            <summary>\n            Returns the expected type from the primitive data in <paramref name=\"item\" />.\n            If the returned type is not null, the deserializer will attempt to convert the <see cref=\"P:PowerJson.JsonItem.Value\"/> of <paramref name=\"item\" /> to match the returned type.\n            </summary>\n            <param name=\"item\">The item to be deserialized.</param>\n            <returns>The expected data type.</returns>\n        </member>\n        <member name=\"M:PowerJson.IJsonConverter.SerializationConvert(System.Object)\">\n            <summary>\n            Converts the <paramref name=\"value\" /> to a new value during serialization.\n            </summary>\n            <param name=\"value\">The value to be serialized.</param>\n            <returns>The new value.</returns>\n        </member>\n        <member name=\"M:PowerJson.IJsonConverter.DeserializationConvert(System.Object)\">\n            <summary>\n            <para>Converts the <paramref name=\"value\" /> to a new value during deserialization. The new value can be changed to a different type than the original value.\n            This enables adapting various data types from deserialization.</para>\n            <para>The <paramref name=\"value\" /> could be one of six primitive value types.\n            For further information, refer to <see cref=\"T:PowerJson.IJsonConverter\"/>.</para>\n            </summary>\n            <param name=\"value\">The item to be deserialized.</param>\n            <returns>The new deserialized value.</returns>\n        </member>\n        <member name=\"T:PowerJson.JsonConverter`2\">\n            <summary>\n            A helper converter which implements the <see cref=\"T:PowerJson.IJsonConverter\"/> to convert between two specific types.\n            </summary>\n            <typeparam name=\"TOriginal\">The original type of the data being serialized.</typeparam>\n            <typeparam name=\"TSerialized\">The serialized type of the data.</typeparam>\n            <remarks>For further details about implementation, please refer to <seealso cref=\"T:PowerJson.IJsonConverter\"/>.</remarks>\n            <preliminary />\n        </member>\n        <member name=\"M:PowerJson.JsonConverter`2.#ctor\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.JsonConverter`2\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonConverter`2.GetReversiveType(PowerJson.JsonItem)\">\n            <summary>\n            Returns the expected type for <paramref name=\"item\"/>. The default implementation returns <typeparamref name=\"TSerialized\"/>.\n            </summary>\n            <param name=\"item\">The item to be deserialized.</param>\n            <returns>The type of <typeparamref name=\"TSerialized\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonConverter`2.SerializationConvert(System.Object)\">\n            <summary>\n            Converts the original value before serialization. If the serialized value is not the type of <typeparamref name=\"TOriginal\" />, the original <paramref name=\"value\" /> will be returned.\n            </summary>\n            <param name=\"value\">The item to be serialized.</param>\n            <returns>The new value.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonConverter`2.DeserializationConvert(System.Object)\">\n            <summary>\n            Reverts the serialized value to <typeparamref name=\"TOriginal\" />. If the serialized value is not the type of <typeparamref name=\"TSerialized\" />, nothing will be changed.\n            </summary>\n            <param name=\"value\">The item to be deserialized.</param>\n            <returns>The new deserialized value.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonConverter`2.Convert(`0)\">\n            <summary>\n            Converts <paramref name=\"value\"/> to <typeparamref name=\"TSerialized\"/> type before serialization.\n            </summary>\n            <param name=\"value\">The value being serialized.</param>\n            <returns>The converted value.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonConverter`2.Revert(`1)\">\n            <summary>\n            Reverts the serialized <paramref name=\"value\"/> to the <typeparamref name=\"TOriginal\"/> type.\n            </summary>\n            <param name=\"value\">The serialized value.</param>\n            <returns>The reverted value which has the <typeparamref name=\"TOriginal\"/> type.</returns>\n        </member>\n        <member name=\"T:PowerJson.JsonItem\">\n            <summary>\n            Represents a JSON name-value pair.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonItem.Renameable\">\n            <summary>\n            Gets whether the <see cref=\"P:PowerJson.JsonItem.Name\"/> property of this <see cref=\"T:PowerJson.JsonItem\"/> instance can be changed.\n            </summary>\n            <remarks>During serialization, the <see cref=\"P:PowerJson.JsonItem.Name\"/> of the property can be changed, and this value is true. During deserialization or serializing an item of an <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> instance, the <see cref=\"P:PowerJson.JsonItem.Name\"/> can not be changed, and this value is false.</remarks>\n        </member>\n        <member name=\"P:PowerJson.JsonItem.Name\">\n            <summary>\n            The name of the item. During serialization, this property can be changed to serialize the member to another name. If the item is the object initially passed to the <see cref=\"M:PowerJson.Json.ToJson(System.Object)\"/> method (or its overloads), this value will be an empty string.\n            </summary>\n            <exception cref=\"T:System.InvalidOperationException\">This value is changed during deserialization or serializing an item of an <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> instance.</exception>\n        </member>\n        <member name=\"P:PowerJson.JsonItem.Value\">\n            <summary>\n            Gets or sets the value of the item. The type and value of this property can be changed. The serializer and deserializer will take the changed value.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonItem.#ctor(System.String,System.Object)\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.JsonItem\"/>.\n            </summary>\n            <param name=\"name\">The name of the item.</param>\n            <param name=\"value\">The value of the item.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonDeserializer.CreateObject(PowerJson.JsonDict,PowerJson.SerializationInfo,System.Object)\">\n            <summary>\n            Deserializes an object.\n            </summary>\n            <param name=\"data\">The data to be deserialized.</param>\n            <param name=\"type\">The reflection cache of the type.</param>\n            <param name=\"input\">The data container. If this value is not null, deserialized members will be written to it. If null, new object will be created.</param>\n            <returns>The deserialized object.</returns>\n            <exception cref=\"T:PowerJson.JsonSerializationException\">Cannot determine type from <paramref name=\"data\"/>.</exception>\n        </member>\n        <member name=\"T:PowerJson.IJsonInterceptor\">\n            <summary>\n            <para>An interface to intercept various aspects in JSON serialization and deserialization.</para>\n            <para>It is recommended to inherit from <see cref=\"T:PowerJson.JsonInterceptor`1\"/> for easier implementation when possible.</para>\n            </summary>\n            <preliminary />\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.OnSerializing(System.Object)\">\n            <summary>\n            This method is called before values are written out during serialization. If the method returns false, the object will not be serialized.\n            </summary>\n            <param name=\"data\">The object being serialized.</param>\n            <returns>Whether the object should be serialized.</returns>\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.SerializeExtraValues(System.Object)\">\n            <summary>\n            This method is called before the serialization is finished. Extra values can be returned and written to the serialized result.\n            </summary>\n            <param name=\"data\">The object being serialized.</param>\n            <returns>Extra values to be serialized.</returns>\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.OnSerialized(System.Object)\">\n            <summary>\n            This method is called after the object has been fully serialized.\n            </summary>\n            <param name=\"data\">The object being serialized.</param>\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.OnSerializing(System.Object,PowerJson.JsonItem)\">\n            <summary>\n            This method is called before serializing a field or a property. If the method returns false, the member will not be serialized.\n            </summary>\n            <param name=\"data\">The container object.</param>\n            <param name=\"item\">The item to be serialized.</param>\n            <returns>Whether the member should be serialized.</returns>\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.OnDeserializing(System.Object)\">\n            <summary>\n            This method is called between the object has been created and the values are filled during deserialization.\n            This method provides an opportunity to initialize an object before deserialization.\n            </summary>\n            <param name=\"data\">The object being deserialized.</param>\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.OnDeserialized(System.Object)\">\n            <summary>\n            This method is called after the object has been fully deserialized. Data validation could be done onto the serialized object.\n            </summary>\n            <param name=\"data\">The object created from deserialization.</param>\n        </member>\n        <member name=\"M:PowerJson.IJsonInterceptor.OnDeserializing(System.Object,PowerJson.JsonItem)\">\n            <summary>\n            This method is called before deserializing a field or a property. If the method returns false, the member will not be deserialized.\n            </summary>\n            <param name=\"data\">The container object.</param>\n            <param name=\"item\">The item to be deserialized.</param>\n            <returns>Whether the member should be deserialized.</returns>\n        </member>\n        <member name=\"T:PowerJson.JsonInterceptor`1\">\n            <summary>\n            This is a default implementation of <see cref=\"T:PowerJson.IJsonInterceptor\"/>, which restricts the type of the object being serialized or deserialized.\n            The default implementation does nothing and returns true for all OnSerializing or OnDeserializing methods.\n            </summary>\n            <typeparam name=\"T\">The type of the object being serialized or deserialized.</typeparam>\n            <preliminary />\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.OnSerializing(`0)\">\n            <summary>\n            This method is called before values are written out during serialization. If the method returns false, the object will not be serialized.\n            </summary>\n            <param name=\"data\">The object being serialized.</param>\n            <returns>Whether the object should be serialized.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.SerializeExtraValues(`0)\">\n            <summary>\n            This method is called before the serialization is finished. Extra values can be returned and written to the serialized result.\n            </summary>\n            <param name=\"data\">The object being serialized.</param>\n            <returns>Extra values to be serialized.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.OnSerialized(`0)\">\n            <summary>\n            This method is called after the object has been fully serialized.\n            </summary>\n            <param name=\"data\">The object being serialized.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.OnDeserializing(`0)\">\n            <summary>\n            This method is called between the object has been created and the values are filled during deserialization.\n            This method provides an opportunity to initialize an object before deserialization.\n            </summary>\n            <param name=\"data\">The object being deserialized.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.OnDeserialized(`0)\">\n            <summary>\n            This method is called after the object has been fully deserialized. Data validation could be done onto the serialized object.\n            </summary>\n            <param name=\"data\">The object created from deserialization.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.OnSerializing(`0,PowerJson.JsonItem)\">\n            <summary>\n            This method is called before serializing a field or a property. If the method returns false, the member will not be serialized.\n            </summary>\n            <param name=\"data\">The container object.</param>\n            <param name=\"item\">The item being serialized.</param>\n            <returns>Whether the member should be serialized.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptor`1.OnDeserializing(`0,PowerJson.JsonItem)\">\n            <summary>\n            This method is called before deserializing a field or a property. If the method returns false, the member will not be deserialized.\n            </summary>\n            <param name=\"data\">The container object.</param>\n            <param name=\"item\">The item to be deserialized.</param>\n            <returns>Whether the member should be deserialized.</returns>\n        </member>\n        <member name=\"T:PowerJson.JsonSerializationException\">\n            <summary>\n            An exception thrown during serialization or deserialization.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonSerializationException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.JsonSerializationException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonSerializationException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.JsonSerializationException\"/> class.\n            </summary>\n            <param name=\"message\">The message that describes the error.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonSerializationException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.JsonSerializationException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner exception.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonSerializationException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.JsonSerializationException\"/> class.\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        </member>\n        <member name=\"T:PowerJson.JsonParserException\">\n            <summary>\n            An exception thrown when parser encounters malformed JSON string.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonParserException.Position\">\n            <summary>\n            Gets the index where parse error occurs.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonParserException.ContextText\">\n            <summary>\n            Gets the context text around the error position.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonParserException.Reason\">\n            <summary>\n            Gets the reason which raises the exception.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.Json\">\n            <summary>\n            The operation center of JSON serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.Json.Manager\">\n            <summary>\n            Gets the default serialization manager for controlling the serializer.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Json.ToNiceJson(System.Object)\">\n            <summary>\n            Creates a formatted JSON string (beautified) from an object.\n            </summary>\n            <param name=\"data\">The object to be serialized.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToJson(System.Object)\">\n            <summary>\n            Creates a JSON representation for an object with the default settings.\n            </summary>\n            <param name=\"value\">The object to be serialized.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToJson(System.Object,PowerJson.SerializationManager)\">\n            <summary>\n            Creates a JSON representation for an object with serialization manager override.\n            </summary>\n            <param name=\"data\">The object to be serialized.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON serialization.</param>\n            <returns>The serialized JSON string.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToJson(System.Object,System.IO.TextWriter,PowerJson.SerializationManager)\">\n            <summary>\n            Writes the JSON representation for an object to the output target.\n            </summary>\n            <param name=\"data\">The object to be serialized.</param>\n            <param name=\"output\">The output target.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON serialization.</param>\n        </member>\n        <member name=\"M:PowerJson.Json.Parse(System.String)\">\n            <summary>\n            Parses a JSON string and generate a <see cref=\"T:System.Collections.Generic.Dictionary`2\"/> or <see cref=\"T:System.Collections.Generic.List`1\"/> instance.\n            </summary>\n            <param name=\"json\">The object to be parsed.</param>\n            <returns>The parsed object.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToObject``1(System.String)\">\n            <summary>\n            Creates a typed generic object from the JSON with the default settings in <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of the expected object after deserialization.</typeparam>\n            <param name=\"json\">The JSON string to be deserialized.</param>\n            <returns>The deserialized object of type <typeparamref name=\"T\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToObject``1(System.String,PowerJson.SerializationManager)\">\n            <summary>\n            Create a typed generic object from the JSON with serialization manager override on this call.\n            </summary>\n            <typeparam name=\"T\">The type of the expected object after deserialization.</typeparam>\n            <param name=\"json\">The JSON string to be deserialized.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON deserialization.</param>\n            <returns>The deserialized object of type <typeparamref name=\"T\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToObject(System.String)\">\n            <summary>\n            Creates an object from the JSON with the default settings.\n            </summary>\n            <param name=\"json\">The JSON string to be deserialized.</param>\n            <returns>The serialized object.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToObject(System.String,PowerJson.SerializationManager)\">\n            <summary>\n            Creates an object from the JSON with <see cref=\"T:PowerJson.SerializationManager\"/> override on this call.\n            </summary>\n            <param name=\"json\">The JSON string to be deserialized.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON deserialization.</param>\n            <returns>The deserialized object.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToObject(System.String,System.Type,PowerJson.SerializationManager)\">\n            <summary>\n            Creates an object from the JSON with <see cref=\"T:PowerJson.SerializationManager\"/> override on this call.\n            </summary>\n            <param name=\"json\">The JSON string to be deserialized.</param>\n            <param name=\"type\">The type of the expected object after deserialization.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON deserialization.</param>\n            <returns>The deserialized object.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.ToObject(System.String,System.Type)\">\n            <summary>\n            Creates an object of type from the JSON with the default settings.\n            </summary>\n            <param name=\"json\">The JSON string to be deserialized.</param>\n            <param name=\"type\">The type of the expected object after deserialization.</param>\n            <returns>The deserialized object of type <paramref name=\"type\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.FillObject(System.Object,System.String)\">\n            <summary>\n            Fills <paramref name=\"input\" /> with the JSON representation with the default settings.\n            </summary>\n            <param name=\"input\">The object to contain the result of the deserialization.</param>\n            <param name=\"json\">The JSON representation string to be deserialized.</param>\n            <returns>The <paramref name=\"input\" /> object containing deserialized properties and fields from the JSON string.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.DeepCopy(System.Object)\">\n            <summary>\n            Deep-copies an object i.e. clones to a new object.\n            </summary>\n            <param name=\"data\">The object to be deep copied.</param>\n            <returns>The copy of <paramref name=\"data\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.DeepCopy``1(``0)\">\n            <summary>\n            Deep-copies an object i.e. clones to a new object.\n            </summary>\n            <typeparam name=\"T\">The type of the object to be copied.</typeparam>\n            <param name=\"data\">The object to be deep copied.</param>\n            <returns>The copy of <paramref name=\"data\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.DeepCopy``1(``0,PowerJson.SerializationManager)\">\n            <summary>\n            Deep-copies an object i.e. clones to a new object.\n            </summary>\n            <typeparam name=\"T\">The type of the object to be copied.</typeparam>\n            <param name=\"data\">The object to be deep copied.</param>\n            <param name=\"manager\">The <see cref=\"T:PowerJson.SerializationManager\"/> to control advanced JSON deserialization.</param>\n            <returns>The copy of <paramref name=\"data\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.Beautify(System.String)\">\n            <summary>\n            Creates a human readable string from the JSON. \n            </summary>\n            <param name=\"input\">The JSON string to be beautified.</param>\n            <returns>A pretty-printed JSON string.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.Beautify(System.String,System.Boolean)\">\n            <summary>\n            Create a human readable string from the JSON. \n            </summary>\n            <param name=\"input\">The JSON string to be beautified.</param>\n            <param name=\"decodeUnicode\">Indicates whether \\uXXXX encoded Unicode notations should be converted into actual Unicode characters.</param>\n            <returns>A pretty-printed JSON string.</returns>\n        </member>\n        <member name=\"M:PowerJson.Json.Minify(System.String)\">\n            <summary>\n            Creates a minified string from the JSON. \n            </summary>\n            <param name=\"input\">The JSON string to be minified.</param>\n            <returns>A minified JSON string.</returns>\n        </member>\n        <member name=\"T:PowerJson.JsonParser\">\n            <summary>\n            This class encodes and decodes JSON strings.\n            Spec. details, see http://www.json.org/\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.JsonStringWriter\">\n            <summary>\n            This class serves as a lightweight text appender based on an internal <see cref=\"T:System.Text.StringBuilder\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.Reflection.CreateWrapperMethod``1(System.Reflection.MethodInfo)\">\n            <summary>\n            Creates a wrapper delegate for the given method.\n            The delegate should have a similar signature as the <paramref name=\"method\"/>, except that an argument in inserted before the method arguments.\n            </summary>\n            <typeparam name=\"T\">A delegate definition. The first argument of the delegate will be used to invoke the method.</typeparam>\n            <param name=\"method\">The method to be converted to the delegate.</param>\n            <returns>The wrapper delegate to invoke the method.</returns>\n            <example><code><![CDATA[delegate void MyAddMethod (IEnumerable target, object value);\n            Reflection.CreateWrapperMethod<MyAddMethod> (typeof(List<string>).GetMethod(\"Add\"));]]></code></example>\n        </member>\n        <member name=\"M:PowerJson.Reflection.FindMethod(System.Type,System.String,System.Type[])\">\n            <summary>\n            Finds a public instance method with the same name as <paramref name=\"methodName\"/> and having arguments match the <paramref name=\"argumentTypes\"/> in the given <paramref name=\"type\"/>.\n            </summary>\n            <param name=\"type\">The type which contains the method.</param>\n            <param name=\"methodName\">The method to match.</param>\n            <param name=\"argumentTypes\">The types of method arguments. Null value in the array means the corresponding argument can be any type.</param>\n            <returns>The method matches the name and argument types.</returns>\n        </member>\n        <member name=\"F:PowerJson.ReflectionCache.IsAbstract\">\n            <summary>\n            Whether the type is an abstract type, an interface, or object type.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.IMemberInfo\">\n            <summary>\n            Contains information about a member, used in reflection phase before serialization.\n            </summary>\n            <preliminary/>\n        </member>\n        <member name=\"P:PowerJson.IMemberInfo.MemberName\">\n            <summary>\n            The name of the field or property.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.IMemberInfo.MemberType\">\n            <summary>\n            The type of the member.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.IMemberInfo.IsProperty\">\n            <summary>\n            True if the member is a property, false for a field.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.IMemberInfo.IsReadOnly\">\n            <summary>\n            Indicates whether the member is read-only. Read-only properties or initialized-only fields returns true.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.IMemberInfo.IsStatic\">\n            <summary>\n            Indicates whether the member is static.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.IMemberInfo.IsPublic\">\n            <summary>\n            Indicates whether the member is publicly visible.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.MemberCache\">\n            <summary>\n            Caches reflection information for a member\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.JsonReflectionController\">\n            <summary>\n            The general implementation of <see cref=\"T:PowerJson.IReflectionController\"/>, which takes custom attributes such as <see cref=\"T:PowerJson.JsonFieldAttribute\"/>, <see cref=\"T:PowerJson.JsonConverterAttribute\"/>, etc. into consideration.\n            </summary>\n            <preliminary />\n        </member>\n        <member name=\"P:PowerJson.JsonReflectionController.UseXmlSerializationAttributes\">\n            <summary>\n            Gets a value indicating whether XML serialization attributes should be used to control serialized field names. (default: false)\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonReflectionController.IgnoreAttributes\">\n            <summary>\n            Ignore attributes to check for (default : XmlIgnoreAttribute).\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.#ctor\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.JsonReflectionController\"/>. For backward compatibility, <see cref=\"T:System.Xml.Serialization.XmlIgnoreAttribute\"/> is added into <see cref=\"P:PowerJson.JsonReflectionController.IgnoreAttributes\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.#ctor(System.Boolean)\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.JsonReflectionController\"/> and sets whether <see cref=\"P:PowerJson.JsonReflectionController.UseXmlSerializationAttributes\"/> option is turned on. For backward compatibility, <see cref=\"T:System.Xml.Serialization.XmlIgnoreAttribute\"/> is added into <see cref=\"P:PowerJson.JsonReflectionController.IgnoreAttributes\"/>.\n            </summary>\n            <param name=\"useXmlSerializationAttributes\">Controls whether <see cref=\"T:System.Xml.Serialization.XmlElementAttribute\"/> and other serialization attributes should be supported to control serialized field names.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetEnumValueFormat(System.Type)\">\n            <summary>\n            This method is called to determine whether the values of the given <see cref=\"T:System.Enum\"/> type should be serialized as its numeric form rather than literal form. The override can be set via the <see cref=\"T:PowerJson.JsonEnumFormatAttribute\"/>.\n            </summary>\n            <param name=\"type\">An <see cref=\"T:System.Enum\"/> value type.</param>\n            <returns>If the type should be serialized numerically, returns true, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetEnumValueName(System.Reflection.MemberInfo)\">\n            <summary>\n            Gets the overridden name for an enum value. The overridden name can be set via the <see cref=\"T:PowerJson.JsonEnumValueAttribute\"/>. If null or empty string is returned, the original name of the enum value is used.\n            </summary>\n            <param name=\"member\">The enum value member.</param>\n            <returns>The name of the enum value.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetTypeAlias(System.Type)\">\n            <summary>\n            Gets the type alias which can be used to determine derived types for abstract types, interface types or the <see cref=\"T:System.Object\" /> type during deserialization.\n            </summary>\n            <param name=\"type\">The type to be serialized.</param>\n            <returns>\n            The alias denotes the type.\n            </returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.IsAlwaysDeserializable(System.Type)\">\n            <summary>\n            Gets whether the type is always deserializable. The value can be set via <see cref=\"T:PowerJson.JsonSerializableAttribute\"/>.\n            </summary>\n            <param name=\"type\">The type to be deserialized.</param>\n            <returns>Whether the type can be deserialized even if it is a non-public type.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetInterceptor(System.Type)\">\n            <summary>\n            Returns the <see cref=\"T:PowerJson.IJsonInterceptor\"/> for given type. If no interceptor, null should be returned. The interceptor can be set via <see cref=\"T:PowerJson.JsonInterceptorAttribute\"/>.\n            </summary>\n            <param name=\"type\">The type to be checked.</param>\n            <returns>The interceptor.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetConverter(System.Type)\">\n            <summary>\n            This method is called to get the <see cref=\"T:PowerJson.IJsonConverter\"/> for the type. If no converter, null should be returned. The converter can be set via <see cref=\"T:PowerJson.JsonConverterAttribute\"/>.\n            </summary>\n            <param name=\"type\">The type to be checked for <see cref=\"T:PowerJson.IJsonConverter\"/>.</param>\n            <returns>The interceptor.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetCollectionContainerName(System.Type)\">\n            <summary>\n            Gets the name of the collection container for customized types which implement <see cref=\"T:System.Collections.IEnumerable\"/> and have extra members to be serialized.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:System.Type\"/> which implements <see cref=\"T:System.Collections.IEnumerable\"/> and contains extra members to be serialized.</param>\n            <returns>The name of the collection container. If null is returned, no container will be created.</returns>\n            <remarks>By default, the serializer serializes types which implement <see cref=\"T:System.Collections.IEnumerable\"/> interface as JSON arrays.\n            Members of the type will be ignored. And so to the types which implements <see cref=\"T:System.Collections.IDictionary\"/>.\n            To serialize those members, return a non-empty name and the members will be serialized into a field named returned by this method.</remarks>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.IsMemberSerializable(System.Reflection.MemberInfo,PowerJson.IMemberInfo)\">\n            <summary>\n            Returns whether the specific member is serializable. This value can be set via <see cref=\"T:PowerJson.JsonIncludeAttribute\"/> and <see cref=\"P:PowerJson.JsonReflectionController.IgnoreAttributes\"/>.\n            If true is returned, the member will always get serialized.\n            If false is returned, the member will be excluded from serialization.\n            If null is returned, the serialization of the member will be determined by the settings in <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n            <param name=\"member\">The member to be serialized.</param>\n            <param name=\"info\">Reflection information for the member.</param>\n            <returns>True is returned if the member is serializable, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.IsMemberDeserializable(System.Reflection.MemberInfo,PowerJson.IMemberInfo)\">\n            <summary>\n            Gets whether a field or a property is deserializable. If false is returned, the member will be excluded from deserialization. By default, writable fields or properties are deserializable. The value can be set via <see cref=\"T:System.ComponentModel.ReadOnlyAttribute\"/>.\n            </summary>\n            <param name=\"member\">The member to be serialized.</param>\n            <param name=\"info\">Reflection information for the member.</param>\n            <returns>True is returned if the member is serializable, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetSerializedNames(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns possible names for corresponding types of a field or a property. This enables polymorphic serialization and deserialization for abstract classes, interfaces, or object types, with predetermined concrete types. If polymorphic serialization is not used, null or an empty <see cref=\"T:PowerJson.SerializedNames\"/> could be returned. The names can be set via <see cref=\"T:PowerJson.JsonFieldAttribute\"/>.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The dictionary contains types and their corresponding names.</returns>\n            <exception cref=\"T:System.InvalidCastException\">The <see cref=\"P:PowerJson.JsonFieldAttribute.DataType\"/> type does not derive from the member type.</exception>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetNonSerializedValues(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns a series of values that will not be serialized for a field or a property. When the value of the member matches those values, it will not be serialized. If all values can be serialized, null should be returned. The value can be set via <see cref=\"T:System.ComponentModel.DefaultValueAttribute\"/>.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The values which are not serialized for <paramref name=\"member\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetMemberConverter(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns the <see cref=\"T:PowerJson.IJsonConverter\"/> to convert values for a field or a property during serialization and deserialization. If no converter is used, null can be returned. The converter can be set via <see cref=\"T:PowerJson.JsonConverterAttribute\"/>.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The converter.</returns>\n        </member>\n        <member name=\"M:PowerJson.JsonReflectionController.GetMemberItemConverter(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns an <see cref=\"T:PowerJson.IJsonConverter\"/> instance to convert item values for a field or a property which is of <see cref=\"T:System.Collections.IEnumerable\"/> type during serialization and deserialization. If no converter is used, null can be returned. The converter can be set via <see cref=\"T:PowerJson.JsonItemConverterAttribute\"/>.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The converter.</returns>\n        </member>\n        <member name=\"T:PowerJson.DefaultReflectionController\">\n            <summary>\n            This is an empty implementation of <see cref=\"T:PowerJson.IReflectionController\"/> doing nothing but serving as a template class for method-overriding.\n            </summary>\n            <preliminary />\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetEnumValueFormat(System.Type)\">\n            <summary>\n            This method is called to determine whether the values of the given <see cref=\"T:System.Enum\"/> type should be serialized as its numeric form rather than literal form.\n            </summary>\n            <param name=\"type\">An <see cref=\"T:System.Enum\"/> value type.</param>\n            <returns>If the type should be serialized numerically, returns true, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetEnumValueName(System.Reflection.MemberInfo)\">\n            <summary>\n            This method is called to override the serialized name of an enum value. If null or empty string is returned, the original name of the enum value is used.\n            </summary>\n            <param name=\"member\">The enum value member.</param>\n            <returns>The name of the enum value.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetTypeAlias(System.Type)\">\n            <summary>\n            Gets the type alias which can be used to determine derived types for abstract types, interface types or the <see cref=\"T:System.Object\" /> type during deserialization.\n            </summary>\n            <param name=\"type\">The type to be serialized.</param>\n            <returns>\n            The alias denotes the type.\n            </returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.IsAlwaysDeserializable(System.Type)\">\n            <summary>\n            This method is called before the constructor of a type is built for deserialization to detect whether the type is deserializable.\n            When this method returns true, the type can be deserialized regardless it is a non-public type.\n            Public types are always deserializable and not affected by the value returned from this method.\n            If the type contains generic parameters (for generic types) or an element type (for array types), the parameters and element types will be checked first.\n            </summary>\n            <param name=\"type\">The type to be deserialized.</param>\n            <returns>Whether the type can be deserialized even if it is a non-public type.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetInterceptor(System.Type)\">\n            <summary>\n            This method is called to get the <see cref=\"T:PowerJson.IJsonInterceptor\"/> for the type. If no interceptor, null should be returned.\n            </summary>\n            <param name=\"type\">The type to be checked.</param>\n            <returns>The interceptor.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetConverter(System.Type)\">\n            <summary>\n            This method is called to get the <see cref=\"T:PowerJson.IJsonConverter\"/> for the type. If no converter, null should be returned.\n            </summary>\n            <param name=\"type\">The type to be checked for <see cref=\"T:PowerJson.IJsonConverter\"/>.</param>\n            <returns>The interceptor.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetCollectionContainerName(System.Type)\">\n            <summary>\n            Gets the name of the collection container for customized types which implement <see cref=\"T:System.Collections.IEnumerable\"/> and have extra members to be serialized.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:System.Type\"/> which implements <see cref=\"T:System.Collections.IEnumerable\"/> and contains extra members to be serialized.</param>\n            <returns>The name of the collection container. If null is returned, no container will be created.</returns>\n            <remarks>By default, the serializer serializes types which implement <see cref=\"T:System.Collections.IEnumerable\"/> interface as JSON arrays.\n            Members of the type will be ignored. And so to the types which implements <see cref=\"T:System.Collections.IDictionary\"/>.\n            To serialize those members, return a non-empty name and the members will be serialized into a field named returned by this method.</remarks>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.IsMemberSerializable(System.Reflection.MemberInfo,PowerJson.IMemberInfo)\">\n            <summary>\n            This method is called to determine whether a field or a property is serializable.\n            If false is returned, the member will be excluded from serialization.\n            If true is returned, the member will always get serialized.\n            If null is returned, the serialization of the member will be determined by the settings in <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n            <param name=\"member\">The member to be serialized.</param>\n            <param name=\"info\">Reflection information for the member.</param>\n            <returns>False is returned if the member is private, otherwise, null is returned.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.IsMemberDeserializable(System.Reflection.MemberInfo,PowerJson.IMemberInfo)\">\n            <summary>\n            This method is called to determine whether a field or a property is deserializable. If false is returned, the member will be excluded from deserialization. By default, writable fields or properties are deserializable.\n            </summary>\n            <param name=\"member\">The member to be serialized.</param>\n            <param name=\"info\">Reflection information for the member.</param>\n            <returns>True is returned if the member is public, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetSerializedNames(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns possible names for corresponding types of a field or a property. This enables polymorphic serialization and deserialization for abstract, interface, or object types, with predetermined concrete types. If polymorphic serialization is not used, null or an empty <see cref=\"T:PowerJson.SerializedNames\"/> could be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The dictionary contains types and their corresponding names.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetNonSerializedValues(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns a series of values that will not be serialized for a field or a property. When the value of the member matches those values, it will not be serialized. If all values can be serialized, null should be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The values which are not serialized for <paramref name=\"member\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetMemberConverter(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns the <see cref=\"T:PowerJson.IJsonConverter\"/> to convert values for a field or a property during serialization and deserialization. If no converter is used, null can be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The converter.</returns>\n        </member>\n        <member name=\"M:PowerJson.DefaultReflectionController.GetMemberItemConverter(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns an <see cref=\"T:PowerJson.IJsonConverter\"/> instance to convert item values for a field or a property which is of <see cref=\"T:System.Collections.IEnumerable\"/> type during serialization and deserialization. If no converter is used, null can be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The converter.</returns>\n        </member>\n        <member name=\"T:PowerJson.IReflectionController\">\n            <summary>\n            The controller interface to control type reflections for serialization and deserialization.\n            </summary>\n            <remarks>\n            <para>The interface works in the reflection phase. Its methods are executed typically once and the result will be cached. Consequently, changes occur after the reflection phase will not take effect.</para>\n            <para>It is recommended to inherit from <see cref=\"T:PowerJson.DefaultReflectionController\"/> or <see cref=\"T:PowerJson.JsonReflectionController\"/>.</para>\n            </remarks>\n            <preliminary />\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetEnumValueFormat(System.Type)\">\n            <summary>\n            This method is called to determine how to format values of the given <see cref=\"T:System.Enum\"/> type.\n            </summary>\n            <param name=\"type\">An <see cref=\"T:System.Enum\"/> value type.</param>\n            <returns>The format of the enum value.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetEnumValueName(System.Reflection.MemberInfo)\">\n            <summary>\n            This method is called to override the serialized name of an enum value. If null or empty string is returned, the original name of the enum value is used.\n            </summary>\n            <param name=\"member\">The enum value member.</param>\n            <returns>The name of the enum value.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetTypeAlias(System.Type)\">\n            <summary>\n            Gets the type alias which can be used to determine derived types for abstract types, interface types or the <see cref=\"T:System.Object\"/> type during deserialization.\n            </summary>\n            <param name=\"type\">The type to be serialized.</param>\n            <returns>The alias denotes the type.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.IsAlwaysDeserializable(System.Type)\">\n            <summary>\n            This method is called before the constructor of a type is built for deserialization to detect whether the type is deserializable.\n            When this method returns true, the type can be deserialized regardless it is a non-public type.\n            Public types are always deserializable and not affected by the value returned from this method.\n            If the type contains type parameters (for generic types) or an element type (for array types), the parameters and element types will be checked first.\n            </summary>\n            <param name=\"type\">The type to be deserialized.</param>\n            <returns>Whether the type can be deserialized even if it is a non-public type.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetInterceptor(System.Type)\">\n            <summary>\n            This method is called to get the <see cref=\"T:PowerJson.IJsonInterceptor\"/> for the type. If no interceptor, null should be returned.\n            </summary>\n            <param name=\"type\">The type to be checked for <see cref=\"T:PowerJson.IJsonInterceptor\"/>.</param>\n            <returns>The interceptor.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetConverter(System.Type)\">\n            <summary>\n            This method is called to get the <see cref=\"T:PowerJson.IJsonConverter\"/> for the type. If no converter, null should be returned.\n            </summary>\n            <param name=\"type\">The type to be checked for <see cref=\"T:PowerJson.IJsonConverter\"/>.</param>\n            <returns>The interceptor.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetCollectionContainerName(System.Type)\">\n            <summary>\n            Gets the name of the collection container for customized types which implement <see cref=\"T:System.Collections.IEnumerable\"/> and have extra members to be serialized.\n            </summary>\n            <param name=\"type\">The <see cref=\"T:System.Type\"/> which implements <see cref=\"T:System.Collections.IEnumerable\"/> and contains extra members to be serialized.</param>\n            <returns>The name of the collection container. If null is returned, no container will be created.</returns>\n            <remarks>By default, the serializer serializes types which implement <see cref=\"T:System.Collections.IEnumerable\"/> interface as JSON arrays.\n            Members of those types will be ignored. And so to the types which implements <see cref=\"T:System.Collections.IDictionary\"/>.\n            To serialize those members, return a non-empty name for those types and the members will be serialized into a field with the returned name.</remarks>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.IsMemberSerializable(System.Reflection.MemberInfo,PowerJson.IMemberInfo)\">\n            <summary>\n            This method is called to determine whether a field or a property is serializable.\n            If false is returned, the member will be excluded from serialization.\n            If true is returned, the member will always get serialized.\n            If null is returned, the serialization of the member will be determined by the settings in <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n            <param name=\"member\">The member to be serialized.</param>\n            <param name=\"info\">Reflection information for the member.</param>\n            <returns>True is returned if the member is serializable, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.IsMemberDeserializable(System.Reflection.MemberInfo,PowerJson.IMemberInfo)\">\n            <summary>\n            This method is called to determine whether a field or a property is deserializable. If false is returned, the member will be excluded from deserialization. By default, writable fields or properties are deserializable.\n            </summary>\n            <param name=\"member\">The member to be serialized.</param>\n            <param name=\"info\">Reflection information for the member.</param>\n            <returns>True is returned if the member is serializable, otherwise, false.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetSerializedNames(System.Reflection.MemberInfo)\">\n            <summary>\n            <para>Returns possible names for corresponding types of a field or a property.</para>\n            <para>This enables polymorphic serialization and deserialization for abstract, interface, or object types, with predetermined concrete types. If polymorphic serialization is not used, null or an empty dictionary could be returned.</para>\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The dictionary contains types and their corresponding names.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetNonSerializedValues(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns a series of values that will not be serialized for a field or a property. When the value of the member matches those values, it will not be serialized. If all values can be serialized, null should be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The values which are not serialized for <paramref name=\"member\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetMemberConverter(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns an <see cref=\"T:PowerJson.IJsonConverter\"/> instance to convert values for a field or a property during serialization and deserialization. If no converter is used, null can be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The converter.</returns>\n        </member>\n        <member name=\"M:PowerJson.IReflectionController.GetMemberItemConverter(System.Reflection.MemberInfo)\">\n            <summary>\n            This method returns an <see cref=\"T:PowerJson.IJsonConverter\"/> instance to convert item values for a field or a property which is of <see cref=\"T:System.Collections.IEnumerable\"/> type during serialization and deserialization. If no converter is used, null can be returned.\n            </summary>\n            <param name=\"member\">The <see cref=\"T:System.Reflection.MemberInfo\"/> of the field or property.</param>\n            <returns>The converter.</returns>\n        </member>\n        <member name=\"T:PowerJson.SerializedNames\">\n            <summary>\n            Contains the names for a serialized member.\n            </summary>\n            <preliminary />\n        </member>\n        <member name=\"P:PowerJson.SerializedNames.DefaultName\">\n            <summary>\n            Gets the default name for the serialized member.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.SerializedNames.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.SerializedNames\"/> class.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.SafeDictionary`2\">\n            <summary>\n            A thread-safe <see cref=\"T:System.Collections.Generic.IDictionary`2\"/>.\n            </summary>\n            <typeparam name=\"TKey\">The type of the dictionary key.</typeparam>\n            <typeparam name=\"TValue\">The type of the dictionary value.</typeparam>\n        </member>\n        <member name=\"M:PowerJson.SafeDictionary`2.#ctor(System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.SafeDictionary`2\"/> class that is empty, has the specified initial capacity, and uses the default equality comparer for the key type.\n            </summary>\n            <param name=\"capacity\"></param>\n        </member>\n        <member name=\"M:PowerJson.SafeDictionary`2.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.SafeDictionary`2\"/> class that is empty, has the default initial capacity, and uses the default equality comparer for the key type.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.SafeDictionary`2.Clear\">\n            <summary>\n            Clears all items.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.SafeDictionary`2.TryGetValue(`0,`1@)\">\n            <summary>\n            Gets the value associated with the specified key.\n            </summary>\n            <param name=\"key\">The key of the value to get.</param>\n            <param name=\"value\">When this method returns, contains the value associated with the specified key, if the key is found; otherwise, the default value for the type of the <paramref name=\"value\"/> parameter. This parameter is passed uninitialized. </param>\n            <returns>Returns true if the dictionary contains an element with the specified key; otherwise, false.</returns>\n        </member>\n        <member name=\"P:PowerJson.SafeDictionary`2.Count\">\n            <summary>\n            Gets the number of key/value pairs contained in the dictionary.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.SafeDictionary`2.Item(`0)\">\n            <summary>\n            Gets or sets the value associated with the specified key.\n            </summary>\n            <param name=\"key\">The key of the value to get or set.</param>\n            <returns>The value associated with the specified key. If the specified key is not found, a get operation throws a <see cref=\"T:System.Collections.Generic.KeyNotFoundException\"/>, and a set operation creates a new element with the specified key.</returns>\n        </member>\n        <member name=\"M:PowerJson.SafeDictionary`2.Add(`0,`1)\">\n            <summary>\n            Adds the specified key and value to the dictionary.\n            </summary>\n            <param name=\"key\">The key of the element to add.</param>\n            <param name=\"value\">The value of the element to add. The value can be null for reference types.</param>\n        </member>\n        <member name=\"M:PowerJson.SafeDictionary`2.Remove(`0)\">\n            <summary>\n            Removes specific key from the dictionary.\n            </summary>\n            <param name=\"key\">The key of the element to remove.</param>\n        </member>\n        <member name=\"T:PowerJson.JsonSerializableAttribute\">\n            <summary>\n            Indicates whether non-public classes, structs, fields or properties could be serialized and deserialized.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.JsonIncludeAttribute\">\n            <summary>\n            Indicates whether a field or property should be included in serialization.\n            To control whether a field or property should be deserialized, use the <see cref=\"T:System.ComponentModel.ReadOnlyAttribute\"/>.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonIncludeAttribute.Include\">\n            <summary>\n            Gets whether the annotated field or property should be included in serialization disregarding whether it is read-only or not. The default value is true.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonIncludeAttribute.#ctor\">\n            <summary>\n            Indicates a member should be included in serialization.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonIncludeAttribute.#ctor(System.Boolean)\">\n            <summary>\n            Indicates whether a member should be included in serialization.\n            </summary>\n            <param name=\"include\">Indicates whether a member should be included in serialization.</param>\n        </member>\n        <member name=\"T:PowerJson.JsonFieldAttribute\">\n            <summary>\n            Indicates the name and data type of a field or property.\n            The same field or property with multiple <see cref=\"T:PowerJson.JsonFieldAttribute\"/> can have various names mapped to various types.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonFieldAttribute.Name\">\n            <summary>\n            Gets the name of the serialized field or property.\n            The case of the serialized name defined in this attribute will not be changed by <see cref=\"P:PowerJson.SerializationManager.NamingConvention\"/> setting in <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonFieldAttribute.DataType\">\n            <summary>\n            Gets the type of the field or property.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonFieldAttribute.#ctor(System.String)\">\n            <summary>\n            Specifies the name of the serialized field or property.\n            </summary>\n            <param name=\"name\">The name of the serialized field or property.</param>\n        </member>\n        <member name=\"M:PowerJson.JsonFieldAttribute.#ctor(System.String,System.Type)\">\n            <summary>\n            Specifies the name of the serialized field or property which has a associated type.\n            </summary>\n            <param name=\"name\">The name of the serialized field or property.</param>\n            <param name=\"dataType\">The name is only used when the value is of this data type.</param>\n        </member>\n        <member name=\"T:PowerJson.JsonTypeAliasAttribute\">\n            <summary>\n            Indicates the name of the serialized data type, which will be used during polymorphic deserialization for instances of abstract types, interface types or the <see cref=\"T:System.Object\"/> type.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonTypeAliasAttribute.Name\">\n            <summary>\n            Gets the name of the serialized class.\n            The case of the serialized name defined in this attribute will not be changed by <see cref=\"P:PowerJson.SerializationManager.NamingConvention\"/> setting in <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonTypeAliasAttribute.#ctor(System.String)\">\n            <summary>\n            Specifies the name of the serialized type.\n            </summary>\n            <param name=\"name\">The name of the serialized type.</param>\n        </member>\n        <member name=\"T:PowerJson.JsonNonSerializedValueAttribute\">\n            <summary>\n            Specifies a value of the annotated member which is hidden from being serialized.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonNonSerializedValueAttribute.Value\">\n            <summary>\n            Gets the non-serialized value.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonNonSerializedValueAttribute.#ctor(System.Object)\">\n            <summary>\n            Specifies a value of the annotated member which is hidden from being serialized.\n            </summary>\n            <param name=\"value\">The non-serialized value.</param>\n        </member>\n        <member name=\"T:PowerJson.JsonEnumFormatAttribute\">\n            <summary>\n            Indicates the value format of the annotated enum type.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonEnumFormatAttribute.#ctor(PowerJson.EnumValueFormat)\">\n            <summary>\n            Specifies the format of an enum type.\n            </summary>\n            <param name=\"format\">The format of the serialized enum type.</param>\n        </member>\n        <member name=\"P:PowerJson.JsonEnumFormatAttribute.Format\">\n            <summary>\n            Gets the format of the annotated enum type.\n            </summary>\n        </member>\n        <member name=\"T:PowerJson.JsonEnumValueAttribute\">\n            <summary>\n            Controls the serialized name of an Enum value.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonEnumValueAttribute.Name\">\n            <summary>\n            Gets the literal name of the Enum value.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonEnumValueAttribute.#ctor(System.String)\">\n            <summary>\n            Specifies the serialized name of the annotated Enum value.\n            </summary>\n            <param name=\"name\"></param>\n        </member>\n        <member name=\"T:PowerJson.JsonInterceptorAttribute\">\n            <summary>\n            Controls the object being serialized or deserialized.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonInterceptorAttribute.InterceptorType\">\n            <summary>\n            The type of interceptor. The instance of the type should implement <see cref=\"T:PowerJson.IJsonInterceptor\"/>.\n            During serialization and deserialization, an instance of <see cref=\"T:PowerJson.IJsonInterceptor\"/> will be created to process values of the object being serialized or deserialized.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonInterceptorAttribute.#ctor(System.Type)\">\n            <summary>\n            Marks a class or a struct to be processed by an <see cref=\"T:PowerJson.IJsonInterceptor\"/>.\n            </summary>\n            <param name=\"interceptorType\">The type of <see cref=\"T:PowerJson.IJsonInterceptor\"/></param>\n            <exception cref=\"T:PowerJson.JsonSerializationException\">The exception will be thrown if the type does not implements <see cref=\"T:PowerJson.IJsonInterceptor\"/>.</exception>\n        </member>\n        <member name=\"T:PowerJson.JsonConverterAttribute\">\n            <summary>\n            Controls data conversion in serialization and deserialization.\n            </summary>\n            <remarks>\n            <para>This attribute can be applied to types or type members.</para>\n            <para>If it is applied to types, the converter will be used in all instances of the type, each property or field that has that data type will use the converter prior to serialization or deserialization.</para>\n            <para>If both the type member and the type has applied this attribute, the attribute on the type member will have a higher precedence.</para>\n            </remarks>\n        </member>\n        <member name=\"P:PowerJson.JsonConverterAttribute.ConverterType\">\n            <summary>\n            <para>The type of converter to convert string to object. The type should implement <see cref=\"T:PowerJson.IJsonConverter\"/>.</para>\n            <para>During serialization and deserialization, an instance of <see cref=\"T:PowerJson.IJsonConverter\"/> will be used to convert values between their original type and target type.</para>\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonConverterAttribute.#ctor(System.Type)\">\n            <summary>\n            Marks the value of a field or a property to be converted by an <see cref=\"T:PowerJson.IJsonConverter\"/>.\n            </summary>\n            <param name=\"converterType\">The type of the <see cref=\"T:PowerJson.IJsonConverter\"/>.</param>\n            <exception cref=\"T:PowerJson.JsonSerializationException\">Exception can be thrown if the type does not implements <see cref=\"T:PowerJson.IJsonConverter\"/>.</exception>\n        </member>\n        <member name=\"T:PowerJson.JsonItemConverterAttribute\">\n            <summary>\n            Controls data conversion of <see cref=\"T:System.Collections.IEnumerable\"/> items in serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonItemConverterAttribute.ConverterType\">\n            <summary>\n            <para>The type of converter to convert string to object. The type should implement <see cref=\"T:PowerJson.IJsonConverter\"/>.</para>\n            <para>During serialization and deserialization, an instance of <see cref=\"T:PowerJson.IJsonConverter\"/> will be used to convert values between their original type and target type.</para>\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonItemConverterAttribute.#ctor(System.Type)\">\n            <summary>\n            Marks the item value of a field or a property to be converted by an <see cref=\"T:PowerJson.IJsonConverter\"/>.\n            </summary>\n            <param name=\"converterType\">The type of the <see cref=\"T:PowerJson.IJsonConverter\"/>.</param>\n            <exception cref=\"T:PowerJson.JsonSerializationException\">Exception can be thrown if the type does not implements <see cref=\"T:PowerJson.IJsonConverter\"/>.</exception>\n        </member>\n        <member name=\"T:PowerJson.JsonCollectionAttribute\">\n            <summary>\n            Denotes a type which implements <see cref=\"T:System.Collections.IEnumerable\"/> should be serialized with its members and items being placed to a field named by this attribute.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.JsonCollectionAttribute.Name\">\n            <summary>\n            Gets the name of the container.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.JsonCollectionAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.JsonCollectionAttribute\"/> class.\n            </summary>\n            <param name=\"name\">The name of the container.</param>\n        </member>\n        <member name=\"T:PowerJson.SerializationInfo\">\n            <summary>\n            An overridden copy of <see cref=\"T:PowerJson.ReflectionCache\"/>.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.SerializationInfo.Instantiate\">\n            <summary>\n            Creates an instance of the type by calling its parameterless constructor.\n            </summary>\n            <returns>\n            The created instance.\n            </returns>\n            <exception cref=\"T:PowerJson.JsonSerializationException\">\n            The type has no constructor, or constructor is not publicly visible, or the constructor takes any argument.\n            </exception>\n        </member>\n        <member name=\"T:PowerJson.SerializationManager\">\n            <summary>\n            A class controls special serialization for specified types and members.\n            </summary>\n            <remarks>\n            <para>This class can be used to control serialization and deserialization for specified types and members.</para>\n            <para>The overriding methods, such as <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/>, <see cref=\"M:PowerJson.SerializationManager.OverrideMemberName``1(System.String,System.String)\"/>, etc., must be called before serialization or deserialization. Otherwise, inconsistent serialization results may occur between types.</para>\n            </remarks>\n            <preliminary />\n        </member>\n        <member name=\"P:PowerJson.SerializationManager.ReflectionController\">\n            <summary>\n            Returns the <see cref=\"T:PowerJson.IReflectionController\"/> currently used by the <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.UseOptimizedDatasetSchema\">\n            <summary>\n            Uses the optimized fast Dataset Schema format (default = True)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.UseFastGuid\">\n            <summary>\n            Uses the fast GUID format (default = false)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.SerializeNullValues\">\n            <summary>\n            Serializes null values to the output (default = True)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.SerializeStaticMembers\">\n            <summary>\n            Serializes static fields or properties into the output (default = false).\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.SerializeEmptyCollections\">\n            <summary>\n            Serializes arrays, collections, lists or dictionaries with no element (default = true).\n            </summary>\n            <remarks>If the collection is the root object, it is not affected by this setting. Byte arrays are not affected by this setting either.</remarks>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.UseUniversalTime\">\n            <summary>\n            Use the UTC date format (default = false)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.SerializeReadOnlyProperties\">\n            <summary>\n            Shows the read-only properties of types in the output (default = False). <see cref=\"T:PowerJson.JsonIncludeAttribute\"/> has higher precedence than this setting.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.SerializeReadOnlyFields\">\n            <summary>\n            Shows the read-only fields of types in the output (default = False). <see cref=\"T:PowerJson.JsonIncludeAttribute\"/> has higher precedence than this setting.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.EnableAnonymousTypes\">\n            <summary>\n            Anonymous types have read only properties \n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.UseExtensions\">\n            <summary>\n            Enables JSON extensions $type, $i (default = True).\n            This setting must be set to true if circular reference detection is required.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.UseEscapedUnicode\">\n            <summary>\n            Use escaped Unicode i.e. \\uXXXX format for non ASCII characters (default = false)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.KVStyleStringDictionary\">\n            <summary>\n            Outputs string key dictionaries as \"k\"/\"v\" format (default = False) \n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.UseValuesOfEnums\">\n            <summary>\n            Outputs Enum values instead of names (default = False).\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.ParametricConstructorOverride\">\n            <summary>\n            If you have parametric and no default constructor for you classes (default = False)\n            \n            IMPORTANT NOTE : If True then all initial values within the class will be ignored and will be not set.\n            In this case, you can use <see cref=\"T:PowerJson.JsonInterceptorAttribute\"/> to assign an <see cref=\"T:PowerJson.IJsonInterceptor\"/> to initialize the object.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.DateTimeMilliseconds\">\n            <summary>\n            Serializes DateTime milliseconds i.e. yyyy-MM-dd HH:mm:ss.nnn (default = false)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.SerializerMaxDepth\">\n            <summary>\n            Maximum depth for circular references in inline mode (default = 20)\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.InlineCircularReferences\">\n            <summary>\n            Inlines circular or already seen objects instead of replacement with $i (default = False) \n            </summary>\n        </member>\n        <member name=\"P:PowerJson.SerializationManager.NamingConvention\">\n            <summary>\n            Controls the case of serialized field names.\n            </summary>\n        </member>\n        <member name=\"F:PowerJson.SerializationManager.Instance\">\n            <summary>\n            Gets the singleton instance.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.#ctor\">\n            <summary>\n            Creates a new instance of <see cref=\"T:PowerJson.SerializationManager\"/>.\n            </summary>\n            <remarks>The <see cref=\"P:PowerJson.SerializationManager.ReflectionController\"/> will be initialized to a new instance of <see cref=\"T:PowerJson.JsonReflectionController\"/>.</remarks>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.#ctor(PowerJson.IReflectionController)\">\n            <summary>\n            Creates a new instance of <see cref=\"T:PowerJson.SerializationManager\"/> with a specific <see cref=\"T:PowerJson.IReflectionController\"/>.\n            </summary>\n            <param name=\"controller\">The controller to control object reflections before serialization.</param>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.ClearSerializationOverrides\">\n            <summary>\n            Clears all cached override information.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.LoadSerializationInfo(PowerJson.SerializationInfo)\">\n            <summary>\n            Loads the serialization information into the overrides dictionary and return the information.\n            </summary>\n            <param name=\"s\">The <see cref=\"T:PowerJson.SerializationInfo\"/> which holds the serialization information.</param>\n            <returns>The newly loaded <see cref=\"T:PowerJson.SerializationInfo\"/>.</returns>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\">\n            <summary>\n            Overrides reflection result with <see cref=\"T:PowerJson.TypeOverride\"/> for the <typeparamref name=\"T\"/> type. If the type is already overridden, either automatically or manually, the <paramref name=\"overrideInfo\"/> will merged into the existing reflected info.\n            </summary>\n            <typeparam name=\"T\">The type to be overridden.</typeparam>\n            <param name=\"overrideInfo\">The override info of the type.</param>\n            <seealso cref=\"M:PowerJson.SerializationManager.Override(System.Type,PowerJson.TypeOverride,System.Boolean)\"/>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride,System.Boolean)\">\n            <summary>\n            Overrides reflection result with <see cref=\"T:PowerJson.TypeOverride\"/> for the <typeparamref name=\"T\"/> type.\n            </summary>\n            <typeparam name=\"T\">The type to be overridden.</typeparam>\n            <param name=\"overrideInfo\">The override info of the type.</param>\n            <param name=\"purgeExisting\">If this value is true, the reflection engine will reflect the type again and apply the <paramref name=\"overrideInfo\"/>, otherwise, <paramref name=\"overrideInfo\"/> is merged into the existing reflection cache.</param>\n            <seealso cref=\"M:PowerJson.SerializationManager.Override(System.Type,PowerJson.TypeOverride,System.Boolean)\"/>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.Override(System.Type,PowerJson.TypeOverride,System.Boolean)\">\n            <summary>\n            Overrides reflection result with <see cref=\"T:PowerJson.TypeOverride\"/> for the specific type and optionally purge existing overrides.\n            </summary>\n            <param name=\"type\">The type to be overridden.</param>\n            <param name=\"overrideInfo\">The override info of the type.</param>\n            <param name=\"purgeExisting\">If this value is true, the reflection engine will reflect the type again and apply the <paramref name=\"overrideInfo\"/>, otherwise, <paramref name=\"overrideInfo\"/> is merged into the existing reflection cache.</param>\n            <remarks>\n            <para>At this moment, the override only affects the registered type.</para>\n            <para>If a class has its subclasses, the override will not be applied to its subclasses.</para>\n            </remarks>\n            <exception cref=\"T:System.ArgumentNullException\">The parameter <paramref name=\"type\"/> or <paramref name=\"overrideInfo\"/> is null.</exception>\n            <exception cref=\"T:System.MissingMemberException\">No member is found for a <see cref=\"T:PowerJson.MemberOverride\"/> in <paramref name=\"overrideInfo\"/>.</exception>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideInterceptor``1(PowerJson.IJsonInterceptor)\">\n            <summary>\n            <para>Assigns an <see cref=\"T:PowerJson.IJsonInterceptor\"/> to process a specific type.</para>\n            <para>This is a simplified version of <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method replacing the <see cref=\"T:PowerJson.IJsonInterceptor\"/> of a type.</para>\n            </summary>\n            <typeparam name=\"T\">The type to be processed by the interceptor.</typeparam>\n            <param name=\"interceptor\">The interceptor to intercept the serialization and deserialization.</param>\n            <remarks>If the type has already gotten an <see cref=\"T:PowerJson.IJsonInterceptor\"/>, the new <paramref name=\"interceptor\"/> will replace it. If the new interceptor is null, existing interceptor will be removed from the type.</remarks>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideTypeAlias``1(System.String)\">\n            <summary>\n            <para>Assigns an alias for a specific type.</para>\n            <para>This is a simplified version of <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method replacing the <see cref=\"P:PowerJson.TypeOverride.Alias\"/> of a type.</para>\n            </summary>\n            <param name=\"alias\">The alias for the type.</param>\n            <remarks>If the type has already gotten an alias, the new alias will replace it. If the new alias is null, existing alias will be removed.</remarks>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideConverter``1(PowerJson.IJsonConverter)\">\n            <summary>\n            <para>Assigns an <see cref=\"T:PowerJson.IJsonConverter\"/> to process a specific type.</para>\n            <para>This is a simplified version of <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method replacing the <see cref=\"T:PowerJson.IJsonConverter\"/> of a type.</para>\n            </summary>\n            <typeparam name=\"T\">The type to be processed by the interceptor.</typeparam>\n            <param name=\"converter\">The converter to convert instances of type before the serialization and deserialization.</param>\n            <remarks>If the type has already gotten an <see cref=\"T:PowerJson.IJsonConverter\"/>, the new <paramref name=\"converter\"/> will replace it.\n            If the new converter is null, existing converter will be removed from the type.</remarks>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideMemberName``1(System.String,System.String)\">\n            <summary>\n            <para>Assigns the serialized name of a field or property.</para>\n            <para>This is a simplified version of <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method replacing the serialized name of a member.</para>\n            </summary>\n            <typeparam name=\"T\">The type containing the member.</typeparam>\n            <param name=\"memberName\">The name of the field or property.</param>\n            <param name=\"serializedName\">The serialized name of the member.</param>\n            <remarks>If <paramref name=\"serializedName\"/> is null or <see cref=\"F:System.String.Empty\"/>, the field or property name will be used.</remarks>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideMemberName(System.Type,System.String,System.String)\">\n            <summary>\n            <para>Assigns the serialized name of a field or property.</para>\n            <para>This is a simplified version of <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method replacing the serialized name of a member.</para>\n            </summary>\n            <param name=\"type\">The type containing the member.</param>\n            <param name=\"memberName\">The name of the field or property.</param>\n            <param name=\"serializedName\">The serialized name of the member.</param>\n            <remarks>If <paramref name=\"serializedName\"/> is null or <see cref=\"F:System.String.Empty\"/>, the field or property name will be used.</remarks>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideMemberConverter(System.Type,System.String,PowerJson.IJsonConverter)\">\n            <summary>\n            <para>Assigns an <see cref=\"T:PowerJson.IJsonConverter\"/> to convert the value of the specific member.</para>\n            <para>This is a simplified version of <see cref=\"M:PowerJson.SerializationManager.Override``1(PowerJson.TypeOverride)\"/> method replacing the <see cref=\"T:PowerJson.IJsonConverter\"/> of a member.</para>\n            </summary>\n            <param name=\"type\">The type containing the member.</param>\n            <param name=\"memberName\">The member to be assigned.</param>\n            <param name=\"converter\">The converter to process the member value.</param>\n            <remarks>If the member has already gotten an <see cref=\"T:PowerJson.IJsonConverter\"/>, the new <paramref name=\"converter\"/> will replace it.\n            If the new converter is null, existing converter will be removed from the type.</remarks>\n            <exception cref=\"T:System.MissingMemberException\">No field or property matches <paramref name=\"memberName\"/> in <paramref name=\"type\"/>.</exception>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideEnumValueNames``1(System.Collections.Generic.IDictionary{System.String,System.String})\">\n            <summary>\n            Assigns new name mapping for an Enum type <typeparamref name=\"T\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of the Enum.</typeparam>\n            <param name=\"nameMapper\">The value mapper for the enum type <typeparamref name=\"T\"/>.\n            The key of the dictionary is the original name of the enum value to be overridden, the value is the new serialized name to be specified to the value.</param>\n            <exception cref=\"T:System.InvalidOperationException\"><typeparamref name=\"T\"/> is not an Enum type.</exception>\n        </member>\n        <member name=\"M:PowerJson.SerializationManager.OverrideEnumValueNames(System.Type,System.Collections.Generic.IDictionary{System.String,System.String})\">\n            <summary>\n            Assigns new name mapping for an Enum type <paramref name=\"type\"/>.\n            </summary>\n            <param name=\"type\">The type of the Enum.</param>\n            <param name=\"nameMapper\">The Enum value mapper.\n            The key of the dictionary is the original name of the enum value to be overridden, the value is the new serialized name to be specified to the value.</param>\n            <exception cref=\"T:System.InvalidOperationException\"><paramref name=\"type\"/> is not an Enum type.</exception>\n        </member>\n        <member name=\"T:PowerJson.TypeOverride\">\n            <summary>\n            Contains reflection overriding information, used in type reflection phase before serialization or deserialization.\n            </summary>\n            <seealso cref=\"T:PowerJson.SerializationManager\"/>\n            <preliminary />\n        </member>\n        <member name=\"P:PowerJson.TypeOverride.Alias\">\n            <summary>\n            Specifies the alias to identify the type.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.TypeOverride.Deserializable\">\n            <summary>\n            Specifies whether the type is deserializable disregarding its visibility.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.TypeOverride.Interceptor\">\n            <summary>\n            Gets or sets the <see cref=\"T:PowerJson.IJsonInterceptor\"/> for the overridden type.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.TypeOverride.Converter\">\n            <summary>\n            Gets or sets the <see cref=\"T:PowerJson.IJsonConverter\"/> for the overridden type.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.TypeOverride.CollectionContainer\">\n            <summary>\n            Gets or sets the name of the container for the overridden type which implements <see cref=\"T:System.Collections.IEnumerable\"/> or <see cref=\"T:System.Collections.IDictionary\"/>.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.TypeOverride.MemberOverrides\">\n            <summary>\n            Gets the override information for members.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.TypeOverride.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.TypeOverride\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:PowerJson.TypeOverride.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:PowerJson.TypeOverride\"/> class.\n            </summary>\n            <param name=\"alias\">The alias for the type.</param>\n        </member>\n        <member name=\"T:PowerJson.MemberOverride\">\n            <summary>\n            Contains reflection override settings for a member.\n            </summary>\n            <seealso cref=\"T:PowerJson.SerializationManager\"/>\n            <seealso cref=\"T:PowerJson.TypeOverride\"/>\n            <preliminary />\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.MemberName\">\n            <summary>\n            Gets the name of the overridden member.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.SerializedName\">\n            <summary>\n            Gets or sets the serialized name for the member.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.TypedNames\">\n            <summary>\n            Gets the polymorphic serialization for the member.\n            The item key is the type and the item value is the serialized name corresponding to the type.\n            The type should derive from the type of the member.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.Serializable\">\n            <summary>\n            Gets or sets whether the member is always serialized (true), never serialized (false) or compliant to the existing behavior (null).\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.Deserializable\">\n            <summary>\n            Gets or sets whether the member can be deserialized (true), never deserialized (false) or compliant to the existing behavior (null).\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.NonSerializedValues\">\n            <summary>\n            Gets the values of the member that should not be serialized.\n            </summary>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.Converter\">\n            <summary>\n            Gets or sets the <see cref=\"T:PowerJson.IJsonConverter\"/> for the member.\n            </summary>\n            <remarks>If the member has a converter before the override, and the value of this converter is null, existing converter will be removed after the override.</remarks>\n        </member>\n        <member name=\"P:PowerJson.MemberOverride.ItemConverter\">\n            <summary>\n            Gets or sets the <see cref=\"T:PowerJson.IJsonConverter\"/> for the item of an <see cref=\"T:System.Collections.IEnumerable\"/> member.\n            </summary>\n            <remarks>If the member has an item converter before the override, and the value of this converter is null, existing converter will be removed after the override.</remarks>\n        </member>\n        <member name=\"M:PowerJson.MemberOverride.#ctor(System.String)\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.MemberOverride\"/>.\n            </summary>\n            <param name=\"memberName\">The name of the member.</param>\n            <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"memberName\"/> is null or an empty string.</exception>\n        </member>\n        <member name=\"M:PowerJson.MemberOverride.#ctor(System.String,System.Nullable{System.Boolean})\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.MemberOverride\"/>, setting the <see cref=\"P:PowerJson.MemberOverride.Serializable\"/> property.\n            </summary>\n            <param name=\"memberName\">The name of the member.</param>\n            <param name=\"serializable\">Whether the member should be serialized.</param>\n        </member>\n        <member name=\"M:PowerJson.MemberOverride.#ctor(System.String,System.Nullable{System.Boolean},System.Nullable{System.Boolean})\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.MemberOverride\"/>, setting the <see cref=\"P:PowerJson.MemberOverride.Serializable\"/> property and <see cref=\"P:PowerJson.MemberOverride.Deserializable\"/> property.\n            </summary>\n            <param name=\"memberName\">The name of the member.</param>\n            <param name=\"serializable\">How the member is serialized.</param>\n            <param name=\"deserializable\">Whether the member should be deserialized.</param>\n        </member>\n        <member name=\"M:PowerJson.MemberOverride.#ctor(System.String,PowerJson.IJsonConverter)\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.MemberOverride\"/>, setting the <see cref=\"P:PowerJson.MemberOverride.Converter\"/> property.\n            </summary>\n            <param name=\"memberName\">The name of the member.</param>\n            <param name=\"converter\">The converter.</param>\n        </member>\n        <member name=\"M:PowerJson.MemberOverride.#ctor(System.String,System.String)\">\n            <summary>\n            Creates an instance of <see cref=\"T:PowerJson.MemberOverride\"/>, setting the <see cref=\"P:PowerJson.MemberOverride.SerializedName\"/> property.\n            </summary>\n            <param name=\"memberName\">The name of the member.</param>\n            <param name=\"serializedName\">The serialized name of the member.</param>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "App/Lib/iTextSharp.xml",
    "content": "<?xml version=\"1.0\"?>\r\n<doc>\r\n    <assembly>\r\n        <name>itextsharp</name>\r\n    </assembly>\r\n    <members>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareException.#ctor(System.String)\">\r\n             Creates a new instance of MemoryLimitsAwareException.\r\n            \r\n             @param message the detail message.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\">\r\n            <summary>\r\n            A\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            handles memory allocation and prevents decompressed pdf streams from occupation of more space than allowed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.#ctor\">\r\n            <summary>\r\n            Creates a\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            which will be used to handle decompression of pdf streams.\r\n            The max allowed memory limits will be generated by default.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.#ctor(System.Int64)\">\r\n            <summary>\r\n            Creates a\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            which will be used to handle decompression of pdf streams.\r\n            The max allowed memory limits will be generated by default, based on the size of the document.\r\n            </summary>\r\n            <param name=\"documentSize\">the size of the document, which is going to be handled by iText.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.GetMaxSizeOfSingleDecompressedPdfStream\">\r\n            <summary>Gets the maximum allowed size which can be occupied by a single decompressed pdf stream.</summary>\r\n            <returns>the maximum allowed size which can be occupied by a single decompressed pdf stream.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.SetMaxSizeOfSingleDecompressedPdfStream(System.Int32)\">\r\n            <summary>Sets the maximum allowed size which can be occupied by a single decompressed pdf stream.</summary>\r\n            <remarks>\r\n            Sets the maximum allowed size which can be occupied by a single decompressed pdf stream.\r\n            This value correlates with maximum heap size. This value should not exceed limit of the heap size.\r\n            iText will throw an exception if during decompression a pdf stream with two or more filters of identical type\r\n            occupies more memory than allowed.\r\n            </remarks>\r\n            <param name=\"maxSizeOfSingleDecompressedPdfStream\">the maximum allowed size which can be occupied by a single decompressed pdf stream.\r\n                </param>\r\n            <returns>\r\n            this\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            instance.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.GetMaxSizeOfDecompressedPdfStreamsSum\">\r\n            <summary>Gets the maximum allowed size which can be occupied by all decompressed pdf streams.</summary>\r\n            <returns>the maximum allowed size value which streams may occupy</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.SetMaxSizeOfDecompressedPdfStreamsSum(System.Int64)\">\r\n            <summary>Sets the maximum allowed size which can be occupied by all decompressed pdf streams.</summary>\r\n            <remarks>\r\n            Sets the maximum allowed size which can be occupied by all decompressed pdf streams.\r\n            This value can be limited by the maximum expected PDF file size when it's completely decompressed.\r\n            Setting this value correlates with the maximum processing time spent on document reading\r\n            iText will throw an exception if during decompression pdf streams with two or more filters of identical type\r\n            occupy more memory than allowed.\r\n            </remarks>\r\n            <param name=\"maxSizeOfDecompressedPdfStreamsSum\">he maximum allowed size which can be occupied by all decompressed pdf streams.\r\n                </param>\r\n            <returns>\r\n            this\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            instance.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.ConsiderBytesOccupiedByDecompressedPdfStream(System.Int64)\">\r\n            <summary>Considers the number of bytes which are occupied by the decompressed pdf stream.</summary>\r\n            <remarks>\r\n            Considers the number of bytes which are occupied by the decompressed pdf stream.\r\n            If memory limits have not been faced, throws an exception.\r\n            </remarks>\r\n            <param name=\"numOfOccupiedBytes\">the number of bytes which are occupied by the decompressed pdf stream.</param>\r\n            <returns>\r\n            this\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            instance.\r\n            </returns>\r\n            <seealso>\r\n            \r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareException\"/>\r\n            </seealso>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.BeginDecompressedPdfStreamProcessing\">\r\n            <summary>Begins handling of current pdf stream decompression.</summary>\r\n            <returns>\r\n            this\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            instance.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareHandler.EndDecompressedPdfStreamProcessing\">\r\n            <summary>Ends handling of current pdf stream decompression.</summary>\r\n            <remarks>\r\n            Ends handling of current pdf stream decompression.\r\n            If memory limits have not been faced, throws an exception.\r\n            </remarks>\r\n            <returns>\r\n            this\r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareHandler\"/>\r\n            instance.\r\n            </returns>\r\n            <seealso>\r\n            \r\n            <see cref=\"T:iTextSharp.text.pdf.MemoryLimitsAwareException\"/>\r\n            </seealso>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream\">\r\n            This class implements an output stream which can be used for memory limits aware decompression of pdf streams.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.DEFAULT_MAX_STREAM_SIZE\">\r\n            The maximum size of array to allocate.\r\n            Attempts to allocate larger arrays will result in an exception.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.maxStreamSize\">\r\n            The maximum size of array to allocate.\r\n            Attempts to allocate larger arrays will result in an exception.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.#ctor\">\r\n            Creates a new byte array output stream. The buffer capacity is\r\n            initially 32 bytes, though its size increases if necessary.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.#ctor(System.Int32)\">\r\n             Creates a new byte array output stream, with a buffer capacity of\r\n             the specified size, in bytes.\r\n            \r\n             @param size the initial size.\r\n             @throws IllegalArgumentException if size is negative.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.GetMaxStreamSize\">\r\n             Gets the maximum size which can be occupied by this output stream.\r\n            \r\n             @return the maximum size which can be occupied by this output stream.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.SetMaxStreamSize(System.Int32)\">\r\n             Sets the maximum size which can be occupied by this output stream.\r\n            \r\n             @param maxStreamSize the maximum size which can be occupied by this output stream.\r\n             @return this {@link MemoryLimitsAwareOutputStream}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.MemoryLimitsAwareOutputStream.Write(System.Byte[],System.Int32,System.Int32)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.AcroFields\">\r\n            Query and change fields in existing documents either by method\r\n            calls or by FDF merging.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_NONE\">\r\n            A field type invalid or not found.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_PUSHBUTTON\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_CHECKBOX\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_RADIOBUTTON\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_TEXT\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_LIST\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_COMBO\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.FIELD_TYPE_SIGNATURE\">\r\n            A field type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.generateAppearances\">\r\n            Holds value of property generateAppearances. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.fieldCache\">\r\n            Holds value of property fieldCache.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetAppearanceStates(System.String)\">\r\n            Gets the list of appearance names. Use it to get the names allowed\r\n             with radio and checkbox fields. If the /Opt key exists the values will\r\n             also be included. The name 'Off' may also be valid\r\n             even if not returned in the list.\r\n              \r\n             For Comboboxes it will return an array of display values. To extract the\r\n             export values of a Combobox, please refer to {@link AcroFields#getListOptionExport(String)}\r\n            \r\n             @param fieldName the fully qualified field name\r\n             @return the list of names or <CODE>null</CODE> if the field does not exist\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetListOptionExport(System.String)\">\r\n            Gets the list of export option values from fields of type list or combo.\r\n            If the field doesn't exist or the field type is not list or combo it will return\r\n            <CODE>null</CODE>.\r\n            @param fieldName the field name\r\n            @return the list of export option values from fields of type list or combo\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetListOptionDisplay(System.String)\">\r\n            Gets the list of display option values from fields of type list or combo.\r\n            If the field doesn't exist or the field type is not list or combo it will return\r\n            <CODE>null</CODE>.\r\n            @param fieldName the field name\r\n            @return the list of export option values from fields of type list or combo\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.AcroFields.SetListOption(System.String,System.String[],System.String[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.AcroFields.GetFieldType(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.ExportAsFdf(iTextSharp.text.pdf.FdfWriter)\">\r\n            Export the fields as a FDF.\r\n            @param writer the FDF writer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.RenameField(System.String,System.String)\">\r\n            Renames a field. Only the last part of the name can be renamed. For example,\r\n            if the original field is \"ab.cd.ef\" only the \"ef\" part can be renamed.\r\n            @param oldName the old field name\r\n            @param newName the new field name\r\n            @return <CODE>true</CODE> if the renaming was successful, <CODE>false</CODE>\r\n            otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetFieldRichValue(System.String)\">\r\n            Retrieve the rich value for the given field\r\n            @param name\r\n            @return The rich value if present, or null.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetField(System.String)\">\r\n            Gets the field value.\r\n            @param name the fully qualified field name\r\n            @return the field value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetListSelection(System.String)\">\r\n            Gets the field values of a Choice field.\r\n            @param name the fully qualified field name\r\n            @return the field value\r\n            @since 2.1.3\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.AcroFields.SetFieldProperty(System.String,System.String,System.Object,System.Int32[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.AcroFields.SetFieldProperty(System.String,System.String,System.Int32,System.Int32[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.MergeXfaData(System.Xml.XmlNode)\">\r\n            Merges an XML data structure into this form.\r\n            @param n the top node of the data structure\r\n            @throws java.io.IOException on error\r\n            @throws com.lowagie.text.DocumentException o error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetFields(iTextSharp.text.pdf.FdfReader)\">\r\n            Sets the fields by FDF merging.\r\n            @param fdf the FDF form\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetFields(iTextSharp.text.pdf.XfdfReader)\">\r\n            Sets the fields by XFDF merging.\r\n            @param xfdf the XFDF form\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.RegenerateField(System.String)\">\r\n            Regenerates the field appearance.\r\n            This is usefull when you change a field property, but not its value,\r\n            for instance form.SetFieldProperty(\"f\", \"bgcolor\", BaseColor.BLUE, null);\r\n            This won't have any effect, unless you use RegenerateField(\"f\") after changing\r\n            the property.\r\n            \r\n            @param name the fully qualified field name or the partial name in the case of XFA forms\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return <CODE>true</CODE> if the field was found and changed,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetField(System.String,System.String)\">\r\n            Sets the field value.\r\n            @param name the fully qualified field name or the partial name in the case of XFA forms\r\n            @param value the field value\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return <CODE>true</CODE> if the field was found and changed,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetField(System.String,System.String,System.Boolean)\">\r\n            Sets the field value.\r\n            @param name the fully qualified field name or the partial name in the case of XFA forms\r\n            @param value the field value\r\n            @param saveAppearance save the current appearance of the field or not\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return <CODE>true</CODE> if the field was found and changed,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetFieldRichValue(System.String,System.String)\">\r\n            Sets the rich value for the given field.  See <a href=\"http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf\">PDF Reference</a> chapter \r\n            12.7.3.4 (Rich Text) and 12.7.4.3 (Text Fields) for further details. Note that iText doesn't create an appearance for Rich Text fields.\r\n            So you either need to use XML Worker to create an appearance (/N entry in the /AP dictionary), or you need to use setGenerateAppearances(false) to tell the viewer\r\n            that iText didn't create any appearances.\r\n            @param name  Field name\r\n            @param richValue html markup \r\n            @return success/failure (will fail if the field isn't found, isn't a text field, or doesn't support rich text)\r\n            @throws DocumentException\r\n            @throws IOException \r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetField(System.String,System.String,System.String)\">\r\n            Sets the field value and the display string. The display string\r\n            is used to build the appearance in the cases where the value\r\n            is modified by Acrobat with JavaScript and the algorithm is\r\n            known.\r\n            @param name the fully qualified field name or the partial name in the case of XFA forms\r\n            @param value the field value\r\n            @param display the string that is used for the appearance. If <CODE>null</CODE>\r\n            the <CODE>value</CODE> parameter will be used\r\n            @return <CODE>true</CODE> if the field was found and changed,\r\n            <CODE>false</CODE> otherwise\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetField(System.String,System.String,System.String,System.Boolean)\">\r\n            Sets the field value and the display string. The display string\r\n            is used to build the appearance in the cases where the value\r\n            is modified by Acrobat with JavaScript and the algorithm is\r\n            known.\r\n            @param name the fully qualified field name or the partial name in the case of XFA forms\r\n            @param value the field value\r\n            @param display the string that is used for the appearance. If <CODE>null</CODE>\r\n            the <CODE>value</CODE> parameter will be used\r\n            @param saveAppearance save the current appearance of the field or not\r\n            @return <CODE>true</CODE> if the field was found and changed,\r\n            <CODE>false</CODE> otherwise\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetListSelection(System.String,System.String[])\">\r\n            Sets different values in a list selection.\r\n            No appearance is generated yet; nor does the code check if multiple select is allowed.\r\n            \r\n            @param    name    the name of the field\r\n            @param    value   an array with values that need to be selected\r\n            @return   true only if the field value was changed\r\n            @since 2.1.4\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.AcroFields.Fields\">\r\n            Gets all the fields. The fields are keyed by the fully qualified field name and\r\n            the value is an instance of <CODE>AcroFields.Item</CODE>.\r\n            @return all the fields\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetFieldItem(System.String)\">\r\n            Gets the field structure.\r\n            @param name the name of the field\r\n            @return the field structure or <CODE>null</CODE> if the field\r\n            does not exist\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetTranslatedFieldName(System.String)\">\r\n            Gets the long XFA translated name.\r\n            @param name the name of the field\r\n            @return the long field name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetFieldPositions(System.String)\">\r\n            Gets the field box positions in the document. The return is an array of <CODE>float</CODE>\r\n            multiple of 5. For each of this groups the values are: [page, llx, lly, urx,\r\n            ury]. The coordinates have the page rotation in consideration.\r\n            @param name the field name\r\n            @return the positions or <CODE>null</CODE> if field does not exist\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.RemoveFieldsFromPage(System.Int32)\">\r\n            Removes all the fields from <CODE>page</CODE>.\r\n            @param page the page to remove the fields from\r\n            @return <CODE>true</CODE> if any field was removed, <CODE>false otherwise</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.RemoveField(System.String,System.Int32)\">\r\n            Removes a field from the document. If page equals -1 all the fields with this\r\n            <CODE>name</CODE> are removed from the document otherwise only the fields in\r\n            that particular page are removed.\r\n            @param name the field name\r\n            @param page the page to remove the field from or -1 to remove it from all the pages\r\n            @return <CODE>true</CODE> if the field exists, <CODE>false otherwise</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.RemoveField(System.String)\">\r\n            Removes a field from the document.\r\n            @param name the field name\r\n            @return <CODE>true</CODE> if the field exists, <CODE>false otherwise</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.AcroFields.GenerateAppearances\">\r\n            Sets the option to generate appearances. Not generating apperances\r\n            will speed-up form filling but the results can be\r\n            unexpected in Acrobat. Don't use it unless your environment is well\r\n            controlled. The default is <CODE>true</CODE>.\r\n            @param generateAppearances the option to generate appearances\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.AcroFields.Item\">\r\n            The field representations for retrieval and modification. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.WRITE_MERGED\">\r\n            <CODE>writeToAll</CODE> constant.\r\n            \r\n             @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.WRITE_WIDGET\">\r\n            <CODE>writeToAll</CODE> and <CODE>markUsed</CODE> constant.\r\n            \r\n             @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.WRITE_VALUE\">\r\n            <CODE>writeToAll</CODE> and <CODE>markUsed</CODE> constant.\r\n            \r\n             @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.WriteToAll(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject,System.Int32)\">\r\n             This function writes the given key/value pair to all the instances\r\n             of merged, widget, and/or value, depending on the <code>writeFlags</code> setting\r\n            \r\n             @since 2.1.5\r\n            \r\n             @param key        you'll never guess what this is for.\r\n             @param value      if value is null, the key will be removed\r\n             @param writeFlags ORed together WRITE_* flags\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.MarkUsed(iTextSharp.text.pdf.AcroFields,System.Int32)\">\r\n            Mark all the item dictionaries used matching the given flags\r\n            \r\n            @since 2.1.5\r\n            @param writeFlags WRITE_MERGED is ignored\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.values\">\r\n            An array of <CODE>PdfDictionary</CODE> where the value tag /V\r\n            is present.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.widgets\">\r\n            An array of <CODE>PdfDictionary</CODE> with the widgets.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.widget_refs\">\r\n            An array of <CODE>PdfDictionary</CODE> with the widget references.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.merged\">\r\n            An array of <CODE>PdfDictionary</CODE> with all the field\r\n            and widget tags merged.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.page\">\r\n            An array of <CODE>Integer</CODE> with the page numbers where\r\n            the widgets are displayed.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.AcroFields.Item.tabOrder\">\r\n            An array of <CODE>Integer</CODE> with the tab order of the field in the page.\r\n            \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.AcroFields.Item.Size\">\r\n            Preferred method of determining the number of instances\r\n            of a given field.\r\n            \r\n            @since 2.1.5\r\n            @return number of instances\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.Remove(System.Int32)\">\r\n            Remove the given instance from this item.  It is possible to\r\n            remove all instances using this function.\r\n            \r\n            @since 2.1.5\r\n            @param killIdx\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.GetValue(System.Int32)\">\r\n            Retrieve the value dictionary of the given instance\r\n            \r\n            @since 2.1.5\r\n            @param idx instance index\r\n            @return dictionary storing this instance's value.  It may be shared across instances.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.AddValue(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Add a value dict to this Item\r\n            \r\n            @since 2.1.5\r\n            @param value new value dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.GetWidget(System.Int32)\">\r\n            Retrieve the widget dictionary of the given instance\r\n            \r\n            @since 2.1.5\r\n            @param idx instance index\r\n            @return The dictionary found in the appropriate page's Annot array.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.AddWidget(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Add a widget dict to this Item\r\n            \r\n            @since 2.1.5\r\n            @param widget\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.GetWidgetRef(System.Int32)\">\r\n            Retrieve the reference to the given instance\r\n            \r\n            @since 2.1.5\r\n            @param idx instance index\r\n            @return reference to the given field instance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.AddWidgetRef(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Add a widget ref to this Item\r\n            \r\n            @since 2.1.5\r\n            @param widgRef\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.GetMerged(System.Int32)\">\r\n            Retrieve the merged dictionary for the given instance.  The merged\r\n            dictionary contains all the keys present in parent fields, though they\r\n            may have been overwritten (or modified?) by children.\r\n            Example: a merged radio field dict will contain /V\r\n            \r\n            @since 2.1.5\r\n            @param idx  instance index\r\n            @return the merged dictionary for the given instance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.AddMerged(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Adds a merged dictionary to this Item.\r\n            \r\n            @since 2.1.5\r\n            @param mergeDict\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.GetPage(System.Int32)\">\r\n            Retrieve the page number of the given instance\r\n            \r\n            @since 2.1.5\r\n            @param idx\r\n            @return remember, pages are \"1-indexed\", not \"0-indexed\" like field instances.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.AddPage(System.Int32)\">\r\n            Adds a page to the current Item.\r\n            \r\n            @since 2.1.5\r\n            @param pg\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.ForcePage(System.Int32,System.Int32)\">\r\n            forces a page value into the Item.\r\n            \r\n            @since 2.1.5\r\n            @param idx\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.GetTabOrder(System.Int32)\">\r\n            Gets the tabOrder.\r\n            \r\n            @since 2.1.5\r\n            @param idx\r\n            @return tab index of the given field instance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.Item.AddTabOrder(System.Int32)\">\r\n            Adds a tab order value to this Item.\r\n            \r\n            @since 2.1.5\r\n            @param order\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.ClearSignatureField(System.String)\">\r\n            Clears a signed field.\r\n            @param name the field name\r\n            @return true if the field was signed, false if the field was not signed or not found\r\n            @since 5.0.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetSignatureNames\">\r\n            Gets the field names that have signatures and are signed.\r\n            @return the field names that have signatures and are signed\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetBlankSignatureNames\">\r\n            Gets the field names that have blank signatures.\r\n            @return the field names that have blank signatures\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetSignatureDictionary(System.String)\">\r\n            Gets the signature dictionary, the one keyed by /V.\r\n            @param name the field name\r\n            @return the signature dictionary keyed by /V or <CODE>null</CODE> if the field is not\r\n            a signature\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetNormalAppearance(System.String)\">\r\n             Gets a reference to the normal appearance of a field.\r\n            \r\n             @param name the field name\r\n             @return a reference to the /N entry of the /AP dictionary or <CODE>null</CODE> if the field is not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SignatureCoversWholeDocument(System.String)\">\r\n            Checks is the signature covers the entire document or just part of it.\r\n            @param name the signature field name\r\n            @return <CODE>true</CODE> if the signature covers the entire document,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.AcroFields.VerifySignature(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.AcroFields.TotalRevisions\">\r\n            Gets the total number of revisions this document has.\r\n            @return the total number of revisions\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetRevision(System.String)\">\r\n            Gets this <CODE>field</CODE> revision.\r\n            @param field the signature field name\r\n            @return the revision or zero if it's not a signature field\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.ExtractRevision(System.String)\">\r\n            Extracts a revision from the document.\r\n            @param field the signature field name\r\n            @return an <CODE>Stream</CODE> covering the revision. Returns <CODE>null</CODE> if\r\n            it's not a signature field\r\n            @throws IOException on error\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.AcroFields.FieldCache”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.SetExtraMargin(System.Single,System.Single)\">\r\n            Sets extra margins in text fields to better mimic the Acrobat layout.\r\n            @param extraMarginLeft the extra marging left\r\n            @param extraMarginTop the extra margin top\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.AddSubstitutionFont(iTextSharp.text.pdf.BaseFont)\">\r\n            Adds a substitution font to the list. The fonts in this list will be used if the original\r\n            font doesn't contain the needed glyphs.\r\n            @param font the font\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.AcroFields.SubstitutionFonts\">\r\n            Sets a list of substitution fonts. The list is composed of <CODE>BaseFont</CODE> and can also be <CODE>null</CODE>. The fonts in this list will be used if the original\r\n            font doesn't contain the needed glyphs.\r\n            @param substitutionFonts the list\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.AcroFields.Xfa\">\r\n            Gets the XFA form processor.\r\n            @return the XFA form processor\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.RemoveXfa\">\r\n            Removes the XFA stream from the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetNewPushbuttonFromField(System.String)\">\r\n            Creates a new pushbutton from an existing field. If there are several pushbuttons with the same name\r\n            only the first one is used. This pushbutton can be changed and be used to replace \r\n            an existing one, with the same name or other name, as long is it is in the same document. To replace an existing pushbutton\r\n            call {@link #replacePushbuttonField(String,PdfFormField)}.\r\n            @param field the field name that should be a pushbutton\r\n            @return a new pushbutton or <CODE>null</CODE> if the field is not a pushbutton\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.GetNewPushbuttonFromField(System.String,System.Int32)\">\r\n            Creates a new pushbutton from an existing field. This pushbutton can be changed and be used to replace \r\n            an existing one, with the same name or other name, as long is it is in the same document. To replace an existing pushbutton\r\n            call {@link #replacePushbuttonField(String,PdfFormField,int)}.\r\n            @param field the field name that should be a pushbutton\r\n            @param order the field order in fields with same name\r\n            @return a new pushbutton or <CODE>null</CODE> if the field is not a pushbutton\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.ReplacePushbuttonField(System.String,iTextSharp.text.pdf.PdfFormField)\">\r\n            Replaces the first field with a new pushbutton. The pushbutton can be created with\r\n            {@link #getNewPushbuttonFromField(String)} from the same document or it can be a\r\n            generic PdfFormField of the type pushbutton.\r\n            @param field the field name\r\n            @param button the <CODE>PdfFormField</CODE> representing the pushbutton\r\n            @return <CODE>true</CODE> if the field was replaced, <CODE>false</CODE> if the field\r\n            was not a pushbutton\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.ReplacePushbuttonField(System.String,iTextSharp.text.pdf.PdfFormField,System.Int32)\">\r\n            Replaces the designated field with a new pushbutton. The pushbutton can be created with\r\n            {@link #getNewPushbuttonFromField(String,int)} from the same document or it can be a\r\n            generic PdfFormField of the type pushbutton.\r\n            @param field the field name\r\n            @param button the <CODE>PdfFormField</CODE> representing the pushbutton\r\n            @param order the field order in fields with same name\r\n            @return <CODE>true</CODE> if the field was replaced, <CODE>false</CODE> if the field\r\n            was not a pushbutton\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.AcroFields.DoesSignatureFieldExist(System.String)\">\r\n            Checks whether a name exists as a signature field or not. It checks both signed fields and blank signatures.\r\n            @param name String\r\n            @return boolean does the signature field exist\r\n            @since 5.5.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.AcroFields.FieldPosition\">\r\n            A class representing a field position\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.wmf.InputMeta\">\r\n            <summary>\r\n            Summary description for InputMeta.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.wmf.MetaDo\">\r\n            <summary>\r\n            Summary description for MetaDo.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.wmf.MetaState.#ctor\">\r\n            Creates new MetaState \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.codec.wmf.MetaState.CurrentBackgroundColor\">\r\n            Getter for property currentBackgroundColor.\r\n            @return Value of property currentBackgroundColor.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.codec.wmf.MetaState.CurrentTextColor\">\r\n            Getter for property currentTextColor.\r\n            @return Value of property currentTextColor.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.codec.wmf.MetaState.BackgroundMode\">\r\n            Getter for property backgroundMode.\r\n            @return Value of property backgroundMode.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.codec.wmf.MetaState.TextAlign\">\r\n            Getter for property textAlign.\r\n            @return Value of property textAlign.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.codec.wmf.MetaState.PolyFillMode\">\r\n            Getter for property polyFillMode.\r\n            @return Value of property polyFillMode.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.BitFile\">\r\n             Came from GIFEncoder initially.\r\n             Modified - to allow for output compressed data without the block counts\r\n             which breakup the compressed data stream for GIF.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.BitFile.blocks_\">\r\n            note this also indicates gif format BITFile. *\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.BitFile.#ctor(System.IO.Stream,System.Boolean)\">\r\n             @param output destination for output data\r\n             @param blocks GIF LZW requires block counts for output data\r\n            \r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.codec.BmpImage”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.codec.BmpImage.GetImage(System.Uri)\">\r\n            Reads a BMP from an url.\r\n            @param url the url\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.BmpImage.GetImage(System.IO.Stream)\">\r\n            Reads a BMP from a stream. The stream is not closed.\r\n            @param is the stream\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.BmpImage.GetImage(System.IO.Stream,System.Boolean,System.Int32)\">\r\n            Reads a BMP from a stream. The stream is not closed.\r\n            The BMP may not have a header and be considered as a plain DIB.\r\n            @param is the stream\r\n            @param noHeader true to process a plain DIB\r\n            @param size the size of the DIB. Not used for a BMP\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.BmpImage.GetImage(System.String)\">\r\n            Reads a BMP from a file.\r\n            @param file the file\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.BmpImage.GetImage(System.Byte[])\">\r\n            Reads a BMP from a byte array.\r\n            @param data the byte array\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.CCITTG4Encoder\">\r\n            Encodes data in the CCITT G4 FAX format.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.CCITTG4Encoder.#ctor(System.Int32)\">\r\n            Creates a new encoder.\r\n            @param width the line width\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.CCITTG4Encoder.Fax4Encode(System.Byte[],System.Int32,System.Int32)\">\r\n            Encodes a number of lines.\r\n            @param data the data to be encoded\r\n            @param offset the offset into the data\r\n            @param size the size of the data to be encoded\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.CCITTG4Encoder.Compress(System.Byte[],System.Int32,System.Int32)\">\r\n            Encodes a full image.\r\n            @param data the data to encode\r\n            @param width the image width\r\n            @param height the image height\r\n            @return the encoded image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.CCITTG4Encoder.Fax4Encode(System.Byte[],System.Int32)\">\r\n            Encodes a number of lines.\r\n            @param data the data to be encoded\r\n            @param height the number of lines to encode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.CCITTG4Encoder.Close\">\r\n            Closes the encoder and returns the encoded data.\r\n            @return the encoded data\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.GifImage\">\r\n            Reads gif images of all types. All the images in a gif are read in the constructors\r\n            and can be retrieved with other methods.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.#ctor(System.Uri)\">\r\n            Reads gif images from an URL.\r\n            @param url the URL\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.#ctor(System.String)\">\r\n            Reads gif images from a file.\r\n            @param file the file\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.#ctor(System.Byte[])\">\r\n            Reads gif images from a byte array.\r\n            @param data the byte array\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.#ctor(System.IO.Stream)\">\r\n            Reads gif images from a stream. The stream isp not closed.\r\n            @param isp the stream\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.GetFrameCount\">\r\n            Gets the number of frames the gif has.\r\n            @return the number of frames the gif has\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.GetImage(System.Int32)\">\r\n            Gets the image from a frame. The first frame isp 1.\r\n            @param frame the frame to get the image from\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.GetFramePosition(System.Int32)\">\r\n            Gets the [x,y] position of the frame in reference to the\r\n            logical screen.\r\n            @param frame the frame\r\n            @return the [x,y] position of the frame\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.GetLogicalScreen\">\r\n            Gets the logical screen. The images may be smaller and placed\r\n            in some position in this screen to playback some animation.\r\n            No image will be be bigger that this.\r\n            @return the logical screen dimensions as [x,y]\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ReadHeader\">\r\n            Reads GIF file header information.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ReadLSD\">\r\n            Reads Logical Screen Descriptor\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ReadShort\">\r\n            Reads next 16-bit value, LSB first\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ReadBlock\">\r\n             Reads next variable length block from input.\r\n            \r\n             @return number of bytes stored in \"buffer\"\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ReadImage\">\r\n            Reads next frame image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ResetFrame\">\r\n            Resets frame state for reading next image.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.ReadGraphicControlExt\">\r\n            Reads Graphics Control Extension values\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.GifImage.Skip\">\r\n            Skips variable length blocks up to and including\r\n            next zero length block.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.JBIG2Image\">\r\n            Support for JBIG2 Images.\r\n            This class assumes that we are always embedding into a pdf.\r\n            \r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.JBIG2Image.GetGlobalSegment(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Gets a byte array that can be used as a /JBIG2Globals,\r\n            or null if not applicable to the given jbig2.\r\n            @param   ra  an random access file or array\r\n            @return  a byte array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.JBIG2Image.GetJbig2Image(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Int32)\">\r\n            returns an Image representing the given page.\r\n            @param ra    the file or array containing the image\r\n            @param page  the page number of the image\r\n            @return  an Image object\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.JBIG2SegmentReader\">\r\n            Class to read a JBIG2 file at a basic level: understand all the segments, \r\n            understand what segments belong to which pages, how many pages there are,\r\n            what the width and height of each page is, and global segments if there\r\n            are any.  Or: the minimum required to be able to take a normal sequential\r\n            or random-access organized file, and be able to embed JBIG2 pages as images \r\n            in a PDF.\r\n            \r\n            TODO: the indeterminate-segment-size value of dataLength, else?\r\n            \r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.JBIG2SegmentReader.JBIG2Segment\">\r\n            Inner class that holds information about a JBIG2 segment.\r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.JBIG2SegmentReader.JBIG2Page\">\r\n            Inner class that holds information about a JBIG2 page.\r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.JBIG2SegmentReader.JBIG2Page.GetData(System.Boolean)\">\r\n            return as a single byte array the header-data for each segment in segment number\r\n            order, EMBEDDED organization, but i am putting the needed segments in SEQUENTIAL organization.\r\n            if for_embedding, skip the segment types that are known to be not for acrobat. \r\n            @param for_embedding\r\n            @return  a byte array\r\n            @throws IOException\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.codec.PngImage”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.PNGID\">\r\n            Some PNG specific values. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.IHDR\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.PLTE\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.IDAT\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.IEND\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.tRNS\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.pHYs\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.gAMA\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.cHRM\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.sRGB\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.PngImage.iCCP\">\r\n            A PNG marker. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.#ctor(System.IO.Stream)\">\r\n            Creates a new instance of PngImage \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetImage(System.Uri)\">\r\n            Reads a PNG from an url.\r\n            @param url the url\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetImage(System.IO.Stream)\">\r\n            Reads a PNG from a stream.\r\n            @param is the stream\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetImage(System.String)\">\r\n            Reads a PNG from a file.\r\n            @param file the file\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetImage(System.Byte[])\">\r\n            Reads a PNG from a byte array.\r\n            @param data the byte array\r\n            @throws IOException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetInt(System.IO.Stream)\">\r\n             Gets an <CODE>int</CODE> from an <CODE>Stream</CODE>.\r\n            \r\n             @param\t\tis      an <CODE>Stream</CODE>\r\n             @return\t\tthe value of an <CODE>int</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetWord(System.IO.Stream)\">\r\n             Gets a <CODE>word</CODE> from an <CODE>Stream</CODE>.\r\n            \r\n             @param\t\tis      an <CODE>Stream</CODE>\r\n             @return\t\tthe value of an <CODE>int</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.PngImage.GetString(System.IO.Stream)\">\r\n             Gets a <CODE>String</CODE> from an <CODE>Stream</CODE>.\r\n            \r\n             @param\t\tis      an <CODE>Stream</CODE>\r\n             @return\t\tthe value of an <CODE>int</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.TIFFConstants\">\r\n            A list of constants used in class TIFFImage.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.codec.TIFFDirectory”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFDirectory.isBigEndian\">\r\n            A bool storing the endianness of the stream. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFDirectory.numEntries\">\r\n            The number of entries in the IFD. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFDirectory.fields\">\r\n            An array of TIFFFields. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFDirectory.fieldIndex\">\r\n            A Hashtable indexing the fields by tag number. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFDirectory.IFDOffset\">\r\n            The offset of this IFD. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFDirectory.nextIFDOffset\">\r\n            The offset of the next IFD. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.#ctor\">\r\n            The default constructor. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Int32)\">\r\n             Constructs a TIFFDirectory from a SeekableStream.\r\n             The directory parameter specifies which directory to read from\r\n             the linked list present in the stream; directory 0 is normally\r\n             read but it is possible to store multiple images in a single\r\n             TIFF file by maintaing multiple directories.\r\n            \r\n             @param stream a SeekableStream to read from.\r\n             @param directory the index of the directory to read.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Int64,System.Int32)\">\r\n             Constructs a TIFFDirectory by reading a SeekableStream.\r\n             The ifd_offset parameter specifies the stream offset from which\r\n             to begin reading; this mechanism is sometimes used to store\r\n             private IFDs within a TIFF file that are not part of the normal\r\n             sequence of IFDs.\r\n            \r\n             @param stream a SeekableStream to read from.\r\n             @param ifd_offset the long byte offset of the directory.\r\n             @param directory the index of the directory to read beyond the\r\n                    one at the current stream offset; zero indicates the IFD\r\n                    at the current offset.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetNumEntries\">\r\n            Returns the number of directory entries. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetField(System.Int32)\">\r\n            Returns the value of a given tag as a TIFFField,\r\n            or null if the tag is not present.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.IsTagPresent(System.Int32)\">\r\n            Returns true if a tag appears in the directory.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetTags\">\r\n            Returns an ordered array of ints indicating the tag\r\n            values.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFields\">\r\n            Returns an array of TIFFFields containing all the fields\r\n            in this directory.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsByte(System.Int32,System.Int32)\">\r\n            Returns the value of a particular index of a given tag as a\r\n            byte.  The caller is responsible for ensuring that the tag is\r\n            present and has type TIFFField.TIFF_SBYTE, TIFF_BYTE, or\r\n            TIFF_UNDEFINED.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsByte(System.Int32)\">\r\n            Returns the value of index 0 of a given tag as a\r\n            byte.  The caller is responsible for ensuring that the tag is\r\n            present and has  type TIFFField.TIFF_SBYTE, TIFF_BYTE, or\r\n            TIFF_UNDEFINED.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsLong(System.Int32,System.Int32)\">\r\n            Returns the value of a particular index of a given tag as a\r\n            long.  The caller is responsible for ensuring that the tag is\r\n            present and has type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED,\r\n            TIFF_SHORT, TIFF_SSHORT, TIFF_SLONG or TIFF_LONG.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsLong(System.Int32)\">\r\n            Returns the value of index 0 of a given tag as a\r\n            long.  The caller is responsible for ensuring that the tag is\r\n            present and has type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED,\r\n            TIFF_SHORT, TIFF_SSHORT, TIFF_SLONG or TIFF_LONG.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsFloat(System.Int32,System.Int32)\">\r\n            Returns the value of a particular index of a given tag as a\r\n            float.  The caller is responsible for ensuring that the tag is\r\n            present and has numeric type (all but TIFF_UNDEFINED and\r\n            TIFF_ASCII).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsFloat(System.Int32)\">\r\n            Returns the value of index 0 of a given tag as a float.  The\r\n            caller is responsible for ensuring that the tag is present and\r\n            has numeric type (all but TIFF_UNDEFINED and TIFF_ASCII).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsDouble(System.Int32,System.Int32)\">\r\n            Returns the value of a particular index of a given tag as a\r\n            double.  The caller is responsible for ensuring that the tag is\r\n            present and has numeric type (all but TIFF_UNDEFINED and\r\n            TIFF_ASCII).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetFieldAsDouble(System.Int32)\">\r\n            Returns the value of index 0 of a given tag as a double.  The\r\n            caller is responsible for ensuring that the tag is present and\r\n            has numeric type (all but TIFF_UNDEFINED and TIFF_ASCII).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetNumDirectories(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Returns the number of image directories (subimages) stored in a\r\n            given TIFF file, represented by a <code>SeekableStream</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.IsBigEndian\">\r\n            Returns a bool indicating whether the byte order used in the\r\n            the TIFF file is big-endian (i.e. whether the byte order is from\r\n            the most significant to the least significant)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetIFDOffset\">\r\n            Returns the offset of the IFD corresponding to this\r\n            <code>TIFFDirectory</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFDirectory.GetNextIFDOffset\">\r\n            Returns the offset of the next IFD after the IFD corresponding to this\r\n            <code>TIFFDirectory</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFFaxDecoder.#ctor(System.Int64,System.Int32,System.Int32)\">\r\n            @param fillOrder   The fill order of the compressed data bytes.\r\n            @param w\r\n            @param h\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFFaxDecompressor.fillOrder\">\r\n            The logical order of bits within a byte.\r\n            <pre>\r\n            1 = MSB-to-LSB\r\n            2 = LSB-to-MSB (flipped)\r\n            </pre>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFFaxDecompressor.uncompressedMode\">\r\n            Uncompressed mode flag: 1 if uncompressed, 0 if not.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFFaxDecompressor.fillBits\">\r\n            EOL padding flag: 1 if fill bits have been added before an EOL such\r\n            that the EOL ends on a byte boundary, 0 otherwise.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFFaxDecompressor.oneD\">\r\n            Coding dimensionality: 1 for 2-dimensional, 0 for 1-dimensional.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFFaxDecompressor.SetOptions(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            Invokes the superclass method and then sets instance variables on\r\n            the basis of the metadata set on this decompressor.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.codec.TIFFField”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_BYTE\">\r\n            Flag for 8 bit unsigned integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_ASCII\">\r\n            Flag for null-terminated ASCII strings. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_SHORT\">\r\n            Flag for 16 bit unsigned integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_LONG\">\r\n            Flag for 32 bit unsigned integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_RATIONAL\">\r\n            Flag for pairs of 32 bit unsigned integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_SBYTE\">\r\n            Flag for 8 bit signed integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_UNDEFINED\">\r\n            Flag for 8 bit uninterpreted bytes. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_SSHORT\">\r\n            Flag for 16 bit signed integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_SLONG\">\r\n            Flag for 32 bit signed integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_SRATIONAL\">\r\n            Flag for pairs of 32 bit signed integers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_FLOAT\">\r\n            Flag for 32 bit IEEE floats. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.TIFF_DOUBLE\">\r\n            Flag for 64 bit IEEE doubles. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.tag\">\r\n            The tag number. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.type\">\r\n            The tag type. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.count\">\r\n            The number of data items present in the field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.TIFFField.data\">\r\n            The field data. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFField.#ctor\">\r\n            The default constructor. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.#ctor(System.Int32,System.Int32,System.Int32,System.Object)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFField.GetTag\">\r\n            Returns the tag number, between 0 and 65535.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFField.GetType\">\r\n             Returns the type of the data stored in the IFD.\r\n             For a TIFF6.0 file, the value will equal one of the\r\n             TIFF_ constants defined in this class.  For future\r\n             revisions of TIFF, higher values are possible.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFField.GetCount\">\r\n            Returns the number of elements in the IFD.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsBytes”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsChars”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsShorts”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsInts”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsLongs”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsFloats”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsDoubles”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsSRationals”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsRationals”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsInt(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsLong(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsFloat(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsDouble(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsString(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsSRational(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.GetAsRational(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.codec.TIFFField.CompareTo(iTextSharp.text.pdf.codec.TIFFField)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.codec.TiffImage\">\r\n            Reads TIFF images\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TiffImage.GetNumberOfPages(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Gets the number of pages the TIFF document has.\r\n            @param s the file source\r\n            @return the number of pages\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TiffImage.GetTiffImage(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Boolean,System.Int32,System.Boolean)\">\r\n            Reads a page from a TIFF image.\r\n            @param s the file source\r\n            @param page the page to get. The first page is 1\r\n            @param direct for single strip, CCITT images, generate the image\r\n            by direct byte copying. It's faster but may not work\r\n            every time\r\n            @return the <CODE>Image</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TiffImage.GetTiffImage(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Int32)\">\r\n            Reads a page from a TIFF image. Direct mode is not used.\r\n            @param s the file source\r\n            @param page the page to get. The first page is 1\r\n            @return the <CODE>Image</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TiffImage.GetTiffImage(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Int32,System.Boolean)\">\r\n            Reads a page from a TIFF image.\r\n            @param s the file source\r\n            @param page the page to get. The first page is 1\r\n            @param direct for single strip, CCITT images, generate the image\r\n            by direct byte copying. It's faster but may not work\r\n            every time\r\n            @return the <CODE>Image</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.TIFFLZWDecoder\">\r\n             A class for performing LZW decoding.\r\n            \r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFLZWDecoder.Decode(System.Byte[],System.Byte[],System.Int32)\">\r\n             Method to decode LZW compressed data.\r\n            \r\n             @param data            The compressed data.\r\n             @param uncompData      Array to return the uncompressed data in.\r\n             @param h               The number of rows the compressed data contains.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFLZWDecoder.InitializeStringTable\">\r\n            Initialize the string table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFLZWDecoder.WriteString(System.Byte[])\">\r\n            Write out the string just uncompressed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFLZWDecoder.AddStringToTable(System.Byte[],System.Byte)\">\r\n            Add a new string to the string table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFLZWDecoder.AddStringToTable(System.Byte[])\">\r\n            Add a new string to the string table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.TIFFLZWDecoder.ComposeString(System.Byte[],System.Byte)\">\r\n            Append <code>newString</code> to the end of <code>oldString</code>.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.TiffWriter\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.LZWCompressor\">\r\n             Modified from original LZWCompressor to change interface to passing a\r\n             buffer of data to be compressed.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.codeSize_\">\r\n            base underlying code size of data being compressed 8 for TIFF, 1 to 8 for GIF *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.clearCode_\">\r\n            reserved clear code based on code size *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.endOfInfo_\">\r\n            reserved end of data code based on code size *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.numBits_\">\r\n            current number bits output for each code *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.limit_\">\r\n            limit at which current number of bits code size has to be increased *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.prefix_\">\r\n            the prefix code which represents the predecessor string to current input point *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.bf_\">\r\n            output destination for bit codes *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.lzss_\">\r\n            general purpose LZW string table *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWCompressor.tiffFudge_\">\r\n            modify the limits of the code values in LZW encoding due to TIFF bug / feature *\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWCompressor.#ctor(System.IO.Stream,System.Int32,System.Boolean)\">\r\n             @param outp destination for compressed data\r\n             @param codeSize the initial code size for the LZW compressor\r\n             @param TIFF flag indicating that TIFF lzw fudge needs to be applied\r\n             @exception IOException if underlying output stream error\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWCompressor.Compress(System.Byte[],System.Int32,System.Int32)\">\r\n             @param buf data to be compressed to output stream\r\n             @exception IOException if underlying output stream error\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWCompressor.Flush\">\r\n             Indicate to compressor that no more data to go so write outp\r\n             any remaining buffered data.\r\n            \r\n             @exception IOException if underlying output stream error\r\n            \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.codec.LZWStringTable\">\r\n             General purpose LZW String Table.\r\n             Extracted from GIFEncoder by Adam Doppelt\r\n             Comments added by Robin Luiten\r\n             <code>expandCode</code> added by Robin Luiten\r\n             The strLen_ table to give quick access to the lenght of an expanded\r\n             code for use by the <code>expandCode</code> method added by Robin.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWStringTable.RES_CODES\">\r\n            codesize + Reserved Codes \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.codec.LZWStringTable.strLen_\">\r\n             each entry corresponds to a code and contains the length of data\r\n             that the code expands to when decoded.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWStringTable.#ctor\">\r\n             Constructor allocate memory for string store data\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWStringTable.AddCharString(System.Int16,System.Byte)\">\r\n             @param index value of -1 indicates no predecessor [used in initialisation]\r\n             @param b the byte [character] to add to the string store which follows\r\n             the predecessor string specified the index.\r\n             @return 0xFFFF if no space in table left for addition of predecesor\r\n             index and byte b. Else return the code allocated for combination index + b.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWStringTable.FindCharString(System.Int16,System.Byte)\">\r\n             @param index index to prefix string\r\n             @param b the character that follws the index prefix\r\n             @return b if param index is HASH_FREE. Else return the code\r\n             for this prefix and byte successor\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWStringTable.ClearTable(System.Int32)\">\r\n             @param codesize the size of code to be preallocated for the\r\n             string store.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.codec.LZWStringTable.ExpandCode(System.Byte[],System.Int32,System.Int16,System.Int32)\">\r\n             If expanded data doesnt fit into array only what will fit is written\r\n             to buf and the return value indicates how much of the expanded code has\r\n             been written to the buf. The next call to ExpandCode() should be with \r\n             the same code and have the skip parameter set the negated value of the \r\n             previous return. Succesive negative return values should be negated and\r\n             added together for next skip parameter value with same code.\r\n            \r\n             @param buf buffer to place expanded data into\r\n             @param offset offset to place expanded data\r\n             @param code the code to expand to the byte array it represents.\r\n             PRECONDITION This code must allready be in the LZSS\r\n             @param skipHead is the number of bytes at the start of the expanded code to \r\n             be skipped before data is written to buf. It is possible that skipHead is\r\n             equal to codeLen.\r\n             @return the length of data expanded into buf. If the expanded code is longer\r\n             than space left in buf then the value returned is a negative number which when\r\n             negated is equal to the number of bytes that were used of the code being expanded.\r\n             This negative value also indicates the buffer is full.\r\n            \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.AbstractCMap\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CidLocationFromByte\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CidResource\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.fonts.cmaps.CMapByteCid.DecodeSingle(iTextSharp.text.pdf.fonts.cmaps.CMapSequence)\">\r\n            \r\n            @param seq\r\n            @return the cid code or -1 for end\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CMapCache\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CMapCidUni\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CMapParserEx\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CMapToUnicode\">\r\n             This class represents a CMap file.\r\n            \r\n             @author Ben Litchfield (ben@benlitchfield.com)\r\n             @since   2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.fonts.cmaps.CMapToUnicode.#ctor\">\r\n            Creates a new instance of CMap.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.fonts.cmaps.CMapToUnicode.HasOneByteMappings\">\r\n             This will tell if this cmap has any one byte mappings.\r\n            \r\n             @return true If there are any one byte mappings, false otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.fonts.cmaps.CMapToUnicode.HasTwoByteMappings\">\r\n             This will tell if this cmap has any two byte mappings.\r\n            \r\n             @return true If there are any two byte mappings, false otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.fonts.cmaps.CMapToUnicode.Lookup(System.Byte[],System.Int32,System.Int32)\">\r\n             This will perform a lookup into the map.\r\n            \r\n             @param code The code used to lookup.\r\n             @param offset The offset into the byte array.\r\n             @param length The length of the data we are getting.\r\n            \r\n             @return The string that matches the lookup.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.CMapUniCid\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.fonts.cmaps.ICidLocation\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.interfaces.IAlternateDescription\">\r\n            Interface providing alternate description for accessible elements.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IAccessibleElement.GetAccessibleAttribute(iTextSharp.text.pdf.PdfName)\">\r\n            Get the attribute of accessible element (everything in <code>A</code> dictionary + <code>Lang</code>, <code>Alt</code>, <code>ActualText</code>, <code>E</code>).\r\n            @param key\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IAccessibleElement.SetAccessibleAttribute(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Set the attribute of accessible element (everything in <code>A</code> dictionary + <code>Lang</code>, <code>Alt</code>, <code>ActualText</code>, <code>E</code>).\r\n            @param key\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IAccessibleElement.GetAccessibleAttributes\">\r\n            Gets all the properties of accessible element.\r\n            @return\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IAccessibleElement.Role\">\r\n            Role propherty of the accessible element.\r\n            Note that all child elements won't also be tagged.\r\n            @return\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfAnnotations.AcroForm\">\r\n            Use this methods to get the AcroForm object.\r\n            Use this method only if you know what you're doing\r\n            @return the PdfAcroform object of the PdfDocument\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfAnnotations.AddAnnotation(iTextSharp.text.pdf.PdfAnnotation)\">\r\n            Use this methods to add a <CODE>PdfAnnotation</CODE> or a <CODE>PdfFormField</CODE>\r\n            to the document. Only the top parent of a <CODE>PdfFormField</CODE>\r\n            needs to be added.\r\n            @param annot the <CODE>PdfAnnotation</CODE> or the <CODE>PdfFormField</CODE> to add\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfAnnotations.AddCalculationOrder(iTextSharp.text.pdf.PdfFormField)\">\r\n            Use this method to adds the <CODE>PdfAnnotation</CODE>\r\n            to the calculation order array.\r\n            @param annot the <CODE>PdfAnnotation</CODE> to be added\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfAnnotations.SigFlags\">\r\n            Use this method to set the signature flags.\r\n            @param f the flags. This flags are ORed with current ones\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.interfaces.IPdfDocumentActions\">\r\n            A PDF document can have an open action and other additional actions.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfDocumentActions.SetOpenAction(System.String)\">\r\n            When the document opens it will jump to the destination with\r\n            this name.\r\n            @param name the name of the destination to jump to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfDocumentActions.SetOpenAction(iTextSharp.text.pdf.PdfAction)\">\r\n            When the document opens this <CODE>action</CODE> will be\r\n            invoked.\r\n            @param action the action to be invoked\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfDocumentActions.SetAdditionalAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction)\">\r\n             Additional-actions defining the actions to be taken in\r\n             response to various trigger events affecting the document\r\n             as a whole. The actions types allowed are: <CODE>DOCUMENT_CLOSE</CODE>,\r\n             <CODE>WILL_SAVE</CODE>, <CODE>DID_SAVE</CODE>, <CODE>WILL_PRINT</CODE>\r\n             and <CODE>DID_PRINT</CODE>.\r\n            \r\n             @param actionType the action type\r\n             @param action the action to execute in response to the trigger\r\n             @throws DocumentException on invalid action type\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.interfaces.IPdfEncryptionSettings\">\r\n            Encryption settings are described in section 3.5 (more specifically\r\n            section 3.5.2) of the PDF Reference 1.7.\r\n            They are explained in section 3.3.3 of the book 'iText in Action'.\r\n            The values of the different  preferences were originally stored\r\n            in class PdfWriter, but they have been moved to this separate interface\r\n            for reasons of convenience.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfEncryptionSettings.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n            ownerPassword can be null or have zero length. In this case the ownerPassword\r\n            is replaced by a random string. The open permissions for the document can be\r\n            AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n            AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n            The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfEncryptionSettings.SetEncryption(Org.BouncyCastle.X509.X509Certificate[],System.Int32[],System.Int32)\">\r\n            Sets the certificate encryption options for this document. An array of one or more public certificates\r\n            must be provided together with an array of the same size for the permissions for each certificate.\r\n             The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param certs the public certificates to be used for the encryption\r\n            @param permissions the user permissions for each of the certicates\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.interfaces.IPdfPageActions\">\r\n            A PDF page can have an open and/or close action.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfPageActions.SetPageAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction)\">\r\n            Sets the open and close page additional action.\r\n            @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>\r\n            or <CODE>PdfWriter.PAGE_CLOSE</CODE>\r\n            @param action the action to perform\r\n            @throws DocumentException if the action type is invalid\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfPageActions.Duration\">\r\n            Sets the display duration for the page (for presentations)\r\n            @param seconds   the number of seconds to display the page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfPageActions.Transition\">\r\n            Sets the transition for the page\r\n            @param transition   the Transition object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfRunDirection.RunDirection\">\r\n            Sets the run direction. This is only used as a placeholder\r\n            as it does not affect anything.\r\n            @param runDirection the run direction\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.interfaces.IPdfVersion\">\r\n            The PDF version is described in the PDF Reference 1.7 p92\r\n            (about the PDF Header) and page 139 (the version entry in\r\n            the Catalog). You'll also find info about setting the version\r\n            in the book 'iText in Action' sections 2.1.3 (PDF Header)\r\n            and 3.3 (Version history).\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfVersion.PdfVersion\">\r\n            If the PDF Header hasn't been written yet,\r\n            this changes the version as it will appear in the PDF Header.\r\n            If the PDF header was already written to the Stream,\r\n            this changes the version as it will appear in the Catalog.\r\n            @param version   a character representing the PDF version\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfVersion.SetAtLeastPdfVersion(System.Char)\">\r\n            If the PDF Header hasn't been written yet,\r\n            this changes the version as it will appear in the PDF Header,\r\n            but only if param refers to a higher version.\r\n            If the PDF header was already written to the Stream,\r\n            this changes the version as it will appear in the Catalog.\r\n            @param version   a character representing the PDF version\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfVersion.SetPdfVersion(iTextSharp.text.pdf.PdfName)\">\r\n            Sets the PDF version as it will appear in the Catalog.\r\n            Note that this only has effect if you use a later version\r\n            than the one that appears in the header. This method\r\n            ignores the parameter if you try to set a lower version\r\n            than the one currently set in the Catalog.\r\n            @param version   the PDF name that will be used for the Version key in the catalog\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfVersion.AddDeveloperExtension(iTextSharp.text.pdf.PdfDeveloperExtension)\">\r\n            Adds a developer extension to the Extensions dictionary\r\n            in the Catalog.\r\n            @param de an object that contains the extensions prefix and dictionary\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.interfaces.IPdfViewerPreferences\">\r\n            Viewer preferences are described in section 3.6.1 and 8.1 of the\r\n            PDF Reference 1.7 (Table 3.25 on p139-142 and Table 8.1 on p579-581).\r\n            They are explained in section 13.1 of the book 'iText in Action'.\r\n            The values of the different preferences were originally stored\r\n            in class PdfWriter, but they have been moved to this separate interface\r\n            for reasons of convenience.\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.interfaces.IPdfViewerPreferences.ViewerPreferences”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.interfaces.IPdfViewerPreferences.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.interfaces.IPdfXConformance.PDFXConformance\">\r\n            Sets the PDF/X conformance level.\r\n            Allowed values are PDFX1A2001, PDFX32002, PDFA1A and PDFA1B.\r\n            It must be called before opening the document.\r\n            @param pdfxConformance the conformance level\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfXConformance.IsPdfX\">\r\n            Checks if the PDF/X Conformance is necessary.\r\n            @return true if the PDF has to be in conformance with any of the PDF/X specifications\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.interfaces.IPdfIsoConformance.IsPdfIso\">\r\n            Checks if any PDF ISO conformance is necessary.\r\n            @return <code>true</code> if the PDF has to be in conformance with any of the PDF ISO specifications\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.ArabicLigaturizer\">\r\n             Shape arabic characters. This code was inspired by an LGPL'ed C library:\r\n             Pango ( see http://www.pango.com/ ). Note that the code of this is the\r\n             original work of Paulo Soares. Hence it is perfectly justifiable to distribute\r\n             it under the MPL.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.reverseLigatureMapTable\">\r\n            Some fonts do not implement ligaturized variations on Arabic characters\r\n            e.g. Simplified Arabic has got code point 0xFEED but not 0xFEEE\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGITS_EN2AN\">\r\n            Digit shaping option: Replace European digits (U+0030...U+0039) by Arabic-Indic digits.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGITS_AN2EN\">\r\n            Digit shaping option: Replace Arabic-Indic digits by European digits (U+0030...U+0039).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGITS_EN2AN_INIT_LR\">\r\n            Digit shaping option:\r\n            Replace European digits (U+0030...U+0039) by Arabic-Indic digits\r\n            if the most recent strongly directional character\r\n            is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).\r\n            The initial state at the start of the text is assumed to be not an Arabic,\r\n            letter, so European digits at the start of the text will not change.\r\n            Compare to DIGITS_ALEN2AN_INIT_AL.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGITS_EN2AN_INIT_AL\">\r\n            Digit shaping option:\r\n            Replace European digits (U+0030...U+0039) by Arabic-Indic digits\r\n            if the most recent strongly directional character\r\n            is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).\r\n            The initial state at the start of the text is assumed to be an Arabic,\r\n            letter, so European digits at the start of the text will change.\r\n            Compare to DIGITS_ALEN2AN_INT_LR.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGITS_RESERVED\">\r\n            Not a valid option value. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGITS_MASK\">\r\n            Bit mask for digit shaping options.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGIT_TYPE_AN\">\r\n            Digit type option: Use Arabic-Indic digits (U+0660...U+0669).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGIT_TYPE_AN_EXTENDED\">\r\n            Digit type option: Use Eastern (Extended) Arabic-Indic digits (U+06f0...U+06f9).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ArabicLigaturizer.DIGIT_TYPE_MASK\">\r\n            Bit mask for digit type options.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ArabicLigaturizer.IsRTL\">\r\n            Arabic is written from right to left.\r\n            @return true\r\n            @see com.itextpdf.text.pdf.languages.LanguageProcessor#isRTL()\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.BadPdfFormatException\">\r\n             Signals that a bad PDF format has been used to construct a <CODE>PdfObject</CODE>.\r\n            \r\n             @see        PdfException\r\n             @see        PdfBoolean\r\n             @see        PdfNumber\r\n             @see        PdfString\r\n             @see        PdfName\r\n             @see        PdfDictionary\r\n             @see        PdfFont\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.Barcode\">\r\n            Base class containing properties and methods commom to all\r\n             barcode types.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.EAN13\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.EAN8\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.UPCA\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.UPCE\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.SUPP2\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.SUPP5\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.POSTNET\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.PLANET\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.CODE128\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.CODE128_UCC\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.CODE128_RAW\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.CODABAR\">\r\n            A type of barcode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.x\">\r\n            The minimum bar width.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.n\">\r\n            The bar multiplier for wide bars or the distance between\r\n            bars for Postnet and Planet.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.font\">\r\n            The text font. <CODE>null</CODE> if no text.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.size\">\r\n            The size of the text or the height of the shorter bar\r\n            in Postnet.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.baseline\">\r\n            If positive, the text distance under the bars. If zero or negative,\r\n            the text distance above the bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.barHeight\">\r\n            The height of the bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.textAlignment\">\r\n            The text Element. Can be <CODE>Element.ALIGN_LEFT</CODE>,\r\n            <CODE>Element.ALIGN_CENTER</CODE> or <CODE>Element.ALIGN_RIGHT</CODE>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.generateChecksum\">\r\n            The optional checksum generation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.checksumText\">\r\n            Shows the generated checksum in the the text.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.startStopText\">\r\n            Show the start and stop character '*' in the text for\r\n            the barcode 39 or 'ABCD' for codabar.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.extended\">\r\n            Generates extended barcode 39.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.code\">\r\n            The code to generate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.guardBars\">\r\n            Show the guard bars for barcode EAN.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.codeType\">\r\n            The code type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.inkSpreading\">\r\n            The ink spreading. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.X\">\r\n            Gets the minimum bar width.\r\n            @return the minimum bar width\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.N\">\r\n            Gets the bar multiplier for wide bars.\r\n            @return the bar multiplier for wide bars\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.Font\">\r\n            Gets the text font. <CODE>null</CODE> if no text.\r\n            @return the text font. <CODE>null</CODE> if no text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.Size\">\r\n            Gets the size of the text.\r\n            @return the size of the text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.Baseline\">\r\n            Gets the text baseline.\r\n            If positive, the text distance under the bars. If zero or negative,\r\n            the text distance above the bars.\r\n            @return the baseline.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.BarHeight\">\r\n            Gets the height of the bars.\r\n            @return the height of the bars\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.TextAlignment\">\r\n            Gets the text Element. Can be <CODE>Element.ALIGN_LEFT</CODE>,\r\n            <CODE>Element.ALIGN_CENTER</CODE> or <CODE>Element.ALIGN_RIGHT</CODE>.\r\n            @return the text alignment\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.GenerateChecksum\">\r\n            The property for the optional checksum generation.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.ChecksumText\">\r\n            Sets the property to show the generated checksum in the the text.\r\n            @param checksumText new value of property checksumText\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.StartStopText\">\r\n            Gets the property to show the start and stop character '*' in the text for\r\n            the barcode 39.\r\n            @param startStopText new value of property startStopText\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.Extended\">\r\n            Sets the property to generate extended barcode 39.\r\n            @param extended new value of property extended\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.Code\">\r\n            Gets the code to generate.\r\n            @return the code to generate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.GuardBars\">\r\n            Sets the property to show the guard bars for barcode EAN.\r\n            @param guardBars new value of property guardBars\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.CodeType\">\r\n            Gets the code type.\r\n            @return the code type\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.Barcode.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode.CreateTemplateWithBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)\">\r\n            Creates a template with the barcode.\r\n            @param cb the <CODE>PdfContentByte</CODE> to create the template. It\r\n            serves no other use\r\n            @param barColor the color of the bars. It can be <CODE>null</CODE>\r\n            @param textColor the color of the text. It can be <CODE>null</CODE>\r\n            @return the template\r\n            @see #placeBarcode(PdfContentByte cb, BaseColor barColor, BaseColor textColor)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode.CreateImageWithBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)\">\r\n            Creates an <CODE>Image</CODE> with the barcode.\r\n            @param cb the <CODE>PdfContentByte</CODE> to create the <CODE>Image</CODE>. It\r\n            serves no other use\r\n            @param barColor the color of the bars. It can be <CODE>null</CODE>\r\n            @param textColor the color of the text. It can be <CODE>null</CODE>\r\n            @return the <CODE>Image</CODE>\r\n            @see #placeBarcode(PdfContentByte cb, BaseColor barColor, BaseColor textColor)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode.altText\">\r\n            The alternate text to be used, if present.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode.AltText\">\r\n            Sets the alternate text. If present, this text will be used instead of the\r\n            text derived from the supplied code.\r\n            @param altText the alternate text\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.Barcode128”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.BARS\">\r\n            The bars to generate the code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.BARS_STOP\">\r\n            The stop bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.CODE_AB_TO_C\">\r\n            The charset code change.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.CODE_AC_TO_B\">\r\n            The charset code change.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.CODE_BC_TO_A\">\r\n            The charset code change.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.FNC1_INDEX\">\r\n            The code for UCC/EAN-128.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.START_A\">\r\n            The start code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.START_B\">\r\n            The start code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode128.START_C\">\r\n            The start code.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.#ctor\">\r\n            Creates new Barcode128 \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.RemoveFNC1(System.String)\">\r\n            Removes the FNC1 codes in the text.\r\n            @param code the text to clean\r\n            @return the cleaned text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.GetHumanReadableUCCEAN(System.String)\">\r\n            Gets the human readable text of a sequence of AI.\r\n            @param code the text\r\n            @return the human readable text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.IsNextDigits(System.String,System.Int32,System.Int32)\">\r\n            Returns <CODE>true</CODE> if the next <CODE>numDigits</CODE>\r\n            starting from index <CODE>textIndex</CODE> are numeric skipping any FNC1.\r\n            @param text the text to check\r\n            @param textIndex where to check from\r\n            @param numDigits the number of digits to check\r\n            @return the check result\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.GetPackedRawDigits(System.String,System.Int32,System.Int32)\">\r\n            Packs the digits for charset C also considering FNC1. It assumes that all the parameters\r\n            are valid.\r\n            @param text the text to pack\r\n            @param textIndex where to pack from\r\n            @param numDigits the number of digits to pack. It is always an even number\r\n            @return the packed digits, two digits per character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.GetRawText(System.String,System.Boolean,iTextSharp.text.pdf.Barcode128.Barcode128CodeSet)\">\r\n            Converts the human readable text to the characters needed to\r\n            create a barcode using the specified code set.\r\n            @param text the text to convert\r\n            @param ucc <CODE>true</CODE> if it is an UCC/EAN-128. In this case\r\n            the character FNC1 is added\r\n            @param codeSet forced code set, or AUTO for optimized barcode.\r\n            @return the code ready to be fed to getBarsCode128Raw()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.GetRawText(System.String,System.Boolean)\">\r\n            Converts the human readable text to the characters needed to\r\n            create a barcode. Some optimization is done to get the shortest code.\r\n            @param text the text to convert\r\n            @param ucc <CODE>true</CODE> if it is an UCC/EAN-128. In this case\r\n            the character FNC1 is added\r\n            @return the code ready to be fed to getBarsCode128Raw()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode128.GetBarsCode128Raw(System.String)\">\r\n            Generates the bars. The input has the actual barcodes, not\r\n            the human readable text.\r\n            @param text the barcode\r\n            @return the bars\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode128.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.Barcode128.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.Barcode128.Code”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.Barcode39\">\r\n            Implements the code 39 and code 39 extended. The default parameters are:\r\n             <pre>\r\n            x = 0.8f;\r\n            n = 2;\r\n            font = BaseFont.CreateFont(\"Helvetica\", \"winansi\", false);\r\n            size = 8;\r\n            baseline = size;\r\n            barHeight = size * 3;\r\n            textint= Element.ALIGN_CENTER;\r\n            generateChecksum = false;\r\n            checksumText = false;\r\n            startStopText = true;\r\n            extended = false;\r\n             </pre>\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode39.BARS\">\r\n            The bars to generate the code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode39.CHARS\">\r\n            The index chars to <CODE>BARS</CODE>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Barcode39.EXTENDED\">\r\n            The character combinations to make the code 39 extended.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode39.#ctor\">\r\n            Creates a new Barcode39.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode39.GetBarsCode39(System.String)\">\r\n            Creates the bars.\r\n            @param text the text to create the bars. This text does not include the start and\r\n            stop characters\r\n            @return the bars\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode39.GetCode39Ex(System.String)\">\r\n            Converts the extended text into a normal, escaped text,\r\n            ready to generate bars.\r\n            @param text the extended text\r\n            @return the escaped text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Barcode39.GetChecksum(System.String)\">\r\n            Calculates the checksum.\r\n            @param text the text\r\n            @return the checksum\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Barcode39.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.Barcode39.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.BarcodeCodabar\">\r\n            Implements the code codabar. The default parameters are:\r\n             <pre>\r\n            x = 0.8f;\r\n            n = 2;\r\n            font = BaseFont.CreateFont(\"Helvetica\", \"winansi\", false);\r\n            size = 8;\r\n            baseline = size;\r\n            barHeight = size * 3;\r\n            textAlignment = Element.ALIGN_CENTER;\r\n            generateChecksum = false;\r\n            checksumText = false;\r\n            startStopText = false;\r\n             </pre>\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeCodabar.BARS\">\r\n            The bars to generate the code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeCodabar.CHARS\">\r\n            The index chars to <CODE>BARS</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeCodabar.#ctor\">\r\n            Creates a new BarcodeCodabar.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeCodabar.GetBarsCodabar(System.String)\">\r\n            Creates the bars.\r\n            @param text the text to create the bars\r\n            @return the bars\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodeCodabar.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeCodabar.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_NO_ERROR\">\r\n            No error.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_ERROR_TEXT_TOO_BIG\">\r\n            The text is too big for the symbology capabilities.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_ERROR_INVALID_SQUARE\">\r\n            The dimensions given for the symbol are illegal.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_ERROR_EXTENSION\">\r\n            An error while parsing an extension.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_AUTO\">\r\n            The best encodation will be used.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_ASCII\">\r\n            ASCII encodation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_C40\">\r\n            C40 encodation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_TEXT\">\r\n            TEXT encodation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_B256\">\r\n            Binary encodation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_X12\">\r\n            X21 encodation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_X21\">\r\n             X12 encodation.\r\n            \r\n             @deprecated Use {@link BarcodeDataMatrix#DM_X12} instead.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_EDIFACT\">\r\n            EDIFACT encodation.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_RAW\">\r\n            No encodation needed. The bytes provided are already encoded.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_EXTENSION\">\r\n            Allows extensions to be embedded at the start of the text.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeDatamatrix.DM_TEST\">\r\n            Doesn't generate the image but returns all the other information.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeDatamatrix.#ctor\">\r\n            Creates an instance of this class.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeDatamatrix.Generate(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeDatamatrix.Generate(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeDatamatrix.Generate(System.Byte[],System.Int32,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeDatamatrix.CreateImage\">\r\n            Gets an <CODE>Image</CODE> with the barcode. A successful call to the method <CODE>generate()</CODE>\r\n            before calling this method is required.\r\n            @return the barcode <CODE>Image</CODE>\r\n            @throws BadElementException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodeDatamatrix.BitImage\">\r\n            Gets the generated image. The image is represented as a stream of bytes, each byte representing\r\n            8 pixels, 0 for white and 1 for black, with the high-order bit of each byte first. Each row\r\n            is aligned at byte boundaries. The dimensions of the image are defined by height and width\r\n            plus 2 * ws.\r\n            @return the generated image\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.BarcodeDatamatrix.Height”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.BarcodeDatamatrix.Width”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodeDatamatrix.Ws\">\r\n            Gets/sets the whitespace border around the barcode.\r\n            @param ws the whitespace border around the barcode\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.BarcodeDatamatrix.Options”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.BarcodeEAN\">\r\n            Generates barcodes in several formats: EAN13, EAN8, UPCA, UPCE,\r\n             supplemental 2 and 5. The default parameters are:\r\n             <pre>\r\n            x = 0.8f;\r\n            font = BaseFont.CreateFont(\"Helvetica\", \"winansi\", false);\r\n            size = 8;\r\n            baseline = size;\r\n            barHeight = size * 3;\r\n            guardBars = true;\r\n            codeType = EAN13;\r\n            code = \"\";\r\n             </pre>\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.GUARD_EMPTY\">\r\n            The bar positions that are guard bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.GUARD_UPCA\">\r\n            The bar positions that are guard bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.GUARD_EAN13\">\r\n            The bar positions that are guard bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.GUARD_EAN8\">\r\n            The bar positions that are guard bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.GUARD_UPCE\">\r\n            The bar positions that are guard bars.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TEXTPOS_EAN13\">\r\n            The x coordinates to place the text.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TEXTPOS_EAN8\">\r\n            The x coordinates to place the text.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.BARS\">\r\n            The basic bar widths.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TOTALBARS_EAN13\">\r\n            The total number of bars for EAN13.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TOTALBARS_EAN8\">\r\n            The total number of bars for EAN8.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TOTALBARS_UPCE\">\r\n            The total number of bars for UPCE.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TOTALBARS_SUPP2\">\r\n            The total number of bars for supplemental 2.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.TOTALBARS_SUPP5\">\r\n            The total number of bars for supplemental 5.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.ODD\">\r\n            Marker for odd parity.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.EVEN\">\r\n            Marker for even parity.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.PARITY13\">\r\n            Sequence of parities to be used with EAN13.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.PARITY2\">\r\n            Sequence of parities to be used with supplemental 2.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.PARITY5\">\r\n            Sequence of parities to be used with supplemental 2.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEAN.PARITYE\">\r\n            Sequence of parities to be used with UPCE.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.#ctor\">\r\n            Creates new BarcodeEAN \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.CalculateEANParity(System.String)\">\r\n            Calculates the EAN parity character.\r\n            @param code the code\r\n            @return the parity character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.ConvertUPCAtoUPCE(System.String)\">\r\n            Converts an UPCA code into an UPCE code. If the code can not\r\n            be converted a <CODE>null</CODE> is returned.\r\n            @param text the code to convert. It must have 12 numeric characters\r\n            @return the 8 converted digits or <CODE>null</CODE> if the\r\n            code could not be converted\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.GetBarsEAN13(System.String)\">\r\n            Creates the bars for the barcode EAN13 and UPCA.\r\n            @param _code the text with 13 digits\r\n            @return the barcode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.GetBarsEAN8(System.String)\">\r\n            Creates the bars for the barcode EAN8.\r\n            @param _code the text with 8 digits\r\n            @return the barcode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.GetBarsUPCE(System.String)\">\r\n            Creates the bars for the barcode UPCE.\r\n            @param _code the text with 8 digits\r\n            @return the barcode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.GetBarsSupplemental2(System.String)\">\r\n            Creates the bars for the barcode supplemental 2.\r\n            @param _code the text with 2 digits\r\n            @return the barcode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEAN.GetBarsSupplemental5(System.String)\">\r\n            Creates the bars for the barcode supplemental 5.\r\n            @param _code the text with 5 digits\r\n            @return the barcode\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodeEAN.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeEAN.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.BarcodeEANSUPP”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEANSUPP.ean\">\r\n            The barcode with the EAN/UPC.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeEANSUPP.supp\">\r\n            The barcode with the supplemental.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeEANSUPP.#ctor(iTextSharp.text.pdf.Barcode,iTextSharp.text.pdf.Barcode)\">\r\n            Creates new combined barcode.\r\n            @param ean the EAN/UPC barcode\r\n            @param supp the supplemental barcode\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodeEANSUPP.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeEANSUPP.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.BarcodeInter25\">\r\n            Implements the code interleaved 2 of 5. The text can include\r\n             non numeric characters that are printed but do not generate bars.\r\n             The default parameters are:\r\n             <pre>\r\n            x = 0.8f;\r\n            n = 2;\r\n            font = BaseFont.CreateFont(\"Helvetica\", \"winansi\", false);\r\n            size = 8;\r\n            baseline = size;\r\n            barHeight = size * 3;\r\n            textint= Element.ALIGN_CENTER;\r\n            generateChecksum = false;\r\n            checksumText = false;\r\n             </pre>\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodeInter25.BARS\">\r\n            The bars to generate the code.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeInter25.#ctor\">\r\n            Creates new BarcodeInter25 \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeInter25.KeepNumbers(System.String)\">\r\n            Deletes all the non numeric characters from <CODE>text</CODE>.\r\n            @param text the text\r\n            @return a <CODE>string</CODE> with only numeric characters\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeInter25.GetChecksum(System.String)\">\r\n            Calculates the checksum.\r\n            @param text the numeric text\r\n            @return the checksum\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeInter25.GetBarsInter25(System.String)\">\r\n            Creates the bars for the barcode.\r\n            @param text the text. It can contain non numeric characters\r\n            @return the barcode\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodeInter25.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodeInter25.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.BarcodePDF417\">\r\n            Generates the 2D barcode PDF417. Supports dimensioning auto-sizing, fixed\r\n            and variable sizes, automatic and manual error levels, raw codeword input,\r\n            codeword size optimization and bitmap inversion. The output can\r\n            be a CCITT G4 <CODE>Image</CODE> or a raw bitmap.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_USE_ASPECT_RATIO\">\r\n            Auto-size is made based on <CODE>aspectRatio</CODE> and <CODE>yHeight</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_FIXED_RECTANGLE\">\r\n            The size of the barcode will be at least <CODE>codeColumns*codeRows</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_FIXED_COLUMNS\">\r\n            The size will be at least <CODE>codeColumns</CODE>\r\n            with a variable number of <CODE>codeRows</CODE>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_FIXED_ROWS\">\r\n            The size will be at least <CODE>codeRows</CODE>\r\n            with a variable number of <CODE>codeColumns</CODE>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_AUTO_ERROR_LEVEL\">\r\n            The error level correction is set automatically according\r\n            to ISO 15438 recomendations.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_USE_ERROR_LEVEL\">\r\n            The error level correction is set by the user. It can be 0 to 8. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_FORCE_BINARY\">\r\n            One single binary segment is used\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_USE_RAW_CODEWORDS\">\r\n            No <CODE>text</CODE> interpretation is done and the content of <CODE>codewords</CODE>\r\n            is used directly.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_INVERT_BITMAP\">\r\n            Inverts the output bits of the raw bitmap that is normally\r\n            bit one for black. It has only effect for the raw bitmap.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.PDF417_USE_MACRO\">\r\n            Use Macro PDF417 Encoding\r\n            @see #setMacroFileId(String)\r\n            @see #setMacroSegmentId(int)\r\n            @see #setMacroSegmentCount(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePDF417.#ctor\">\r\n            Creates a new <CODE>BarcodePDF417</CODE> with the default settings. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.MacroSegmentId\">\r\n            Sets the segment id for macro PDF417 encoding\r\n            @param id the id (starting at 0)\r\n            @see #setMacroSegmentCount(int)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.MacroSegmentCount\">\r\n            Sets the segment count for macro PDF417 encoding\r\n            @param cnt the number of macro segments\r\n            @see #setMacroSegmentId(int)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.MacroFileId\">\r\n            Sets the File ID for macro PDF417 encoding \r\n            @param id the file id\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePDF417.SetDefaultParameters\">\r\n            Set the default settings that correspond to <CODE>PDF417_USE_ASPECT_RATIO</CODE>\r\n            and <CODE>PDF417_AUTO_ERROR_LEVEL</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePDF417.PaintCode\">\r\n            Paints the barcode. If no exception was thrown a valid barcode is available. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePDF417.GetImage\">\r\n            Gets an <CODE>Image</CODE> with the barcode. The image will have to be\r\n            scaled in the Y direction by <CODE>yHeight</CODE>for the barcode\r\n            to have the right printing aspect.\r\n            @return the barcode <CODE>Image</CODE>\r\n            @throws BadElementException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.OutBits\">\r\n            Gets the raw image bits of the barcode. The image will have to\r\n            be scaled in the Y direction by <CODE>yHeight</CODE>.\r\n            @return The raw barcode image\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.BitColumns\">\r\n            Gets the number of X pixels of <CODE>outBits</CODE>.\r\n            @return the number of X pixels of <CODE>outBits</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.CodeRows\">\r\n            Gets the number of Y pixels of <CODE>outBits</CODE>.\r\n            It is also the number of rows in the barcode.\r\n            @return the number of Y pixels of <CODE>outBits</CODE>\r\n            Sets the number of barcode rows. This number may be changed\r\n            to keep the barcode valid.\r\n            @param codeRows the number of barcode rows\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.CodeColumns\">\r\n            Sets the number of barcode data columns.\r\n            This number may be changed to keep the barcode valid.\r\n            @param codeColumns the number of barcode data columns\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.Codewords\">\r\n            Gets the codeword array. This array is always 928 elements long.\r\n            It can be writen to if the option <CODE>PDF417_USE_RAW_CODEWORDS</CODE>\r\n            is set.\r\n            @return the codeword array\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.LenCodewords\">\r\n            Sets the length of the codewords.\r\n            @param lenCodewords the length of the codewords\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.ErrorLevel\">\r\n            Gets the error level correction used for the barcode. It may different\r\n            from the previously set value.\r\n            @return the error level correction used for the barcode\r\n            Sets the error level correction for the barcode.\r\n            @param errorLevel the error level correction for the barcode\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.Text\">\r\n            Sets the bytes that form the barcode. This bytes should\r\n            be interpreted in the codepage Cp437.\r\n            @param text the bytes that form the barcode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePDF417.SetText(System.String)\">\r\n            Sets the text that will form the barcode. This text is converted\r\n            to bytes using the encoding Cp437.\r\n            @param s the text that will form the barcode\r\n            @throws UnsupportedEncodingException if the encoding Cp437 is not supported\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.Options\">\r\n            Sets the options to generate the barcode. This can be all\r\n            the <CODE>PDF417_*</CODE> constants.\r\n            @param options the options to generate the barcode\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.AspectRatio\">\r\n            Sets the barcode aspect ratio. A ratio or 0.5 will make the\r\n            barcode width twice as large as the height.\r\n            @param aspectRatio the barcode aspect ratio\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePDF417.YHeight\">\r\n            Sets the Y pixel height relative to X. It is usually 3.\r\n            @param yHeight the Y pixel height relative to X\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.outBits\">\r\n            Holds value of property outBits. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.bitColumns\">\r\n            Holds value of property bitColumns. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.codeRows\">\r\n            Holds value of property codeRows. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.codeColumns\">\r\n            Holds value of property codeColumns. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.codewords\">\r\n            Holds value of property codewords. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.lenCodewords\">\r\n            Holds value of property lenCodewords. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.errorLevel\">\r\n            Holds value of property errorLevel. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.text\">\r\n            Holds value of property text. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.options\">\r\n            Holds value of property options. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.aspectRatio\">\r\n            Holds value of property aspectRatio. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePDF417.yHeight\">\r\n            Holds value of property yHeight. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePDF417.GetBarcodeSize\">\r\n            Gets the size of the barcode grid. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.BarcodePostnet\">\r\n            Implements the Postnet and Planet barcodes. The default parameters are:\r\n             <pre>\r\n            n = 72f / 22f; // distance between bars\r\n            x = 0.02f * 72f; // bar width\r\n            barHeight = 0.125f * 72f; // height of the tall bars\r\n            size = 0.05f * 72f; // height of the short bars\r\n            codeType = POSTNET; // type of code\r\n             </pre>\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BarcodePostnet.BARS\">\r\n            The bars for each character.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePostnet.#ctor\">\r\n            Creates new BarcodePostnet \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodePostnet.GetBarsPostnet(System.String)\">\r\n            Creates the bars for Postnet.\r\n            @param text the code to be created without checksum\r\n            @return the bars\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BarcodePostnet.BarcodeSize\">\r\n            Gets the maximum area that the barcode and the text, if\r\n            any, will occupy. The lower left corner is always (0, 0).\r\n            @return the size the barcode occupies.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BarcodePostnet.PlaceBarcode(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.BaseColor,iTextSharp.text.BaseColor)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.BarcodeQRCode\">\r\n            A QRCode implementation based on the zxing code.\r\n            @author Paulo Soares\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeQRCode.#ctor(System.String,System.Int32,System.Int32,System.Collections.Generic.IDictionary{iTextSharp.text.pdf.qrcode.EncodeHintType,System.Object})\">\r\n            Creates the QR barcode. The barcode is always created with the smallest possible size and is then stretched\r\n            to the width and height given. Set the width and height to 1 to get an unscaled barcode.\r\n            @param content the text to be encoded\r\n            @param width the barcode width\r\n            @param height the barcode height\r\n            @param hints modifiers to change the way the barcode is create. They can be EncodeHintType.ERROR_CORRECTION\r\n            and EncodeHintType.CHARACTER_SET. For EncodeHintType.ERROR_CORRECTION the values can be ErrorCorrectionLevel.L, M, Q, H.\r\n            For EncodeHintType.CHARACTER_SET the values are strings and can be Cp437, Shift_JIS and ISO-8859-1 to ISO-8859-16.\r\n            You can also use UTF-8, but correct behaviour is not guaranteed as Unicode is not supported in QRCodes.\r\n            The default value is ISO-8859-1.\r\n            @throws WriterException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeQRCode.GetImage\">\r\n            Gets an <CODE>Image</CODE> with the barcode.\r\n            @return the barcode <CODE>Image</CODE>\r\n            @throws BadElementException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BarcodeQRCode.GetBarcodeSize\">\r\n            Gets the size of the barcode grid. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.BORDER_WIDTH_THIN\">\r\n            A thin border with 1 point width. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.BORDER_WIDTH_MEDIUM\">\r\n            A medium border with 2 point width. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.BORDER_WIDTH_THICK\">\r\n            A thick border with 3 point width. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.VISIBLE\">\r\n            The field is visible. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.HIDDEN\">\r\n            The field is hidden. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.VISIBLE_BUT_DOES_NOT_PRINT\">\r\n            The field is visible but does not print. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.HIDDEN_BUT_PRINTABLE\">\r\n            The field is hidden but is printable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.READ_ONLY\">\r\n            The user may not change the value of the field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.REQUIRED\">\r\n            The field must have a value at the time it is exported by a submit-form\r\n            action.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.MULTILINE\">\r\n            The field may contain multiple lines of text.\r\n            This flag is only meaningful with text fields.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.DO_NOT_SCROLL\">\r\n            The field will not scroll (horizontally for single-line\r\n            fields, vertically for multiple-line fields) to accommodate more text\r\n            than will fit within its annotation rectangle. Once the field is full, no\r\n            further text will be accepted.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.PASSWORD\">\r\n            The field is intended for entering a secure password that should\r\n            not be echoed visibly to the screen.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.FILE_SELECTION\">\r\n            The text entered in the field represents the pathname of\r\n            a file whose contents are to be submitted as the value of the field.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.DO_NOT_SPELL_CHECK\">\r\n            The text entered in the field will not be spell-checked.\r\n            This flag is meaningful only in text fields and in combo\r\n            fields with the <CODE>EDIT</CODE> flag set.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.EDIT\">\r\n            If set the combo box includes an editable text box as well as a drop list; if\r\n            clear, it includes only a drop list.\r\n            This flag is only meaningful with combo fields.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.MULTISELECT\">\r\n            whether or not a list may have multiple selections.  Only applies to /CH LIST\r\n            fields, not combo boxes.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.COMB\">\r\n            combo box flag.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.rotation\">\r\n            Holds value of property rotation. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.visibility\">\r\n            Holds value of property visibility. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.fieldName\">\r\n            Holds value of property fieldName. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.options\">\r\n            Holds value of property options. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseField.maxCharacterLength\">\r\n            Holds value of property maxCharacterLength. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseField.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String)\">\r\n            Creates a new <CODE>TextField</CODE>.\r\n            @param writer the document <CODE>PdfWriter</CODE>\r\n            @param box the field location and dimensions\r\n            @param fieldName the field name. If <CODE>null</CODE> only the widget keys\r\n            will be included in the field allowing it to be used as a kid field.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.BorderWidth\">\r\n            Sets the border width in points. To eliminate the border\r\n            set the border color to <CODE>null</CODE>.\r\n            @param borderWidth the border width in points\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.BorderStyle\">\r\n            Sets the border style. The styles are found in <CODE>PdfBorderDictionary</CODE>\r\n            and can be <CODE>STYLE_SOLID</CODE>, <CODE>STYLE_DASHED</CODE>,\r\n            <CODE>STYLE_BEVELED</CODE>, <CODE>STYLE_INSET</CODE> and\r\n            <CODE>STYLE_UNDERLINE</CODE>.\r\n            @param borderStyle the border style\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.BorderColor\">\r\n            Sets the border color. Set to <CODE>null</CODE> to remove\r\n            the border.\r\n            @param borderColor the border color\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.BackgroundColor\">\r\n            Sets the background color. Set to <CODE>null</CODE> for\r\n            transparent background.\r\n            @param backgroundColor the background color\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.TextColor\">\r\n            Sets the text color. If <CODE>null</CODE> the color used\r\n            will be black.\r\n            @param textColor the text color\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Font\">\r\n            Sets the text font. If <CODE>null</CODE> then Helvetica\r\n            will be used.\r\n            @param font the text font\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.FontSize\">\r\n            Sets the font size. If 0 then auto-sizing will be used but\r\n            only for text fields.\r\n            @param fontSize the font size\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Alignment\">\r\n            Sets the text horizontal alignment. It can be <CODE>Element.ALIGN_LEFT</CODE>,\r\n            <CODE>Element.ALIGN_CENTER</CODE> and <CODE>Element.ALIGN_RIGHT</CODE>.\r\n            @param alignment the text horizontal alignment\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Text\">\r\n            Sets the text for text fields.\r\n            @param text the text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Box\">\r\n            Sets the field dimension and position.\r\n            @param box the field dimension and position\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Rotation\">\r\n            Sets the field rotation. This value should be the same as\r\n            the page rotation where the field will be shown.\r\n            @param rotation the field rotation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseField.SetRotationFromPage(iTextSharp.text.Rectangle)\">\r\n            Convenience method to set the field rotation the same as the\r\n            page rotation.\r\n            @param page the page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Visibility\">\r\n            Sets the field visibility flag. This flags can be one of\r\n            <CODE>VISIBLE</CODE>, <CODE>HIDDEN</CODE>, <CODE>VISIBLE_BUT_DOES_NOT_PRINT</CODE>\r\n            and <CODE>HIDDEN_BUT_PRINTABLE</CODE>.\r\n            @param visibility field visibility flag\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.FieldName\">\r\n            Sets the field name.\r\n            @param fieldName the field name. If <CODE>null</CODE> only the widget keys\r\n            will be included in the field allowing it to be used as a kid field.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.Options\">\r\n            Sets the option flags. The option flags can be a combination by oring of\r\n            <CODE>READ_ONLY</CODE>, <CODE>REQUIRED</CODE>,\r\n            <CODE>MULTILINE</CODE>, <CODE>DO_NOT_SCROLL</CODE>,\r\n            <CODE>PASSWORD</CODE>, <CODE>FILE_SELECTION</CODE>,\r\n            <CODE>DO_NOT_SPELL_CHECK</CODE> and <CODE>EDIT</CODE>.\r\n            @param options the option flags\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseField.MaxCharacterLength\">\r\n            Sets the maximum length of the field�s text, in characters.\r\n            It is only meaningful for text fields.\r\n            @param maxCharacterLength the maximum length of the field�s text, in characters\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseField.MoveFields(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Moves the field keys from <CODE>from</CODE> to <CODE>to</CODE>. The moved keys\r\n            are removed from <CODE>from</CODE>.\r\n            @param from the source\r\n            @param to the destination. It may be <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.BaseFont\">\r\n            <summary>\r\n            Summary description for BaseFont.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.COURIER\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.COURIER_BOLD\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.COURIER_OBLIQUE\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.COURIER_BOLDOBLIQUE\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.HELVETICA\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.HELVETICA_BOLD\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.HELVETICA_OBLIQUE\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.HELVETICA_BOLDOBLIQUE\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.SYMBOL\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.TIMES_ROMAN\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.TIMES_BOLD\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.TIMES_ITALIC\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.TIMES_BOLDITALIC\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.ZAPFDINGBATS\">\r\n            This is a possible value of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.ASCENT\">\r\n            The maximum height above the baseline reached by glyphs in this\r\n            font, excluding the height of glyphs for accented characters.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.CAPHEIGHT\">\r\n            The y coordinate of the top of flat capital letters, measured from\r\n            the baseline.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.DESCENT\">\r\n            The maximum depth below the baseline reached by glyphs in this\r\n            font. The value is a negative number.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.ITALICANGLE\">\r\n            The angle, expressed in degrees counterclockwise from the vertical,\r\n            of the dominant vertical strokes of the font. The value is\r\n            negative for fonts that slope to the right, as almost all italic fonts do.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.BBOXLLX\">\r\n            The lower left x glyph coordinate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.BBOXLLY\">\r\n            The lower left y glyph coordinate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.BBOXURX\">\r\n            The upper right x glyph coordinate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.BBOXURY\">\r\n            The upper right y glyph coordinate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.AWT_ASCENT\">\r\n            java.awt.Font property \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.AWT_DESCENT\">\r\n            java.awt.Font property \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.AWT_LEADING\">\r\n            java.awt.Font property \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.AWT_MAXADVANCE\">\r\n            java.awt.Font property \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.UNDERLINE_POSITION\">\r\n            The underline position. Usually a negative value.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.UNDERLINE_THICKNESS\">\r\n            The underline thickness.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.STRIKETHROUGH_POSITION\">\r\n            The strikethrough position.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.STRIKETHROUGH_THICKNESS\">\r\n            The strikethrough thickness.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.SUBSCRIPT_SIZE\">\r\n            The recommended vertical size for subscripts for this font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.SUBSCRIPT_OFFSET\">\r\n            The recommended vertical offset from the baseline for subscripts for this font. Usually a negative value.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.SUPERSCRIPT_SIZE\">\r\n            The recommended vertical size for superscripts for this font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.SUPERSCRIPT_OFFSET\">\r\n            The recommended vertical offset from the baseline for superscripts for this font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.WEIGHT_CLASS\">\r\n            The weight class of the font, as defined by the font author\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.WIDTH_CLASS\">\r\n            The width class of the font, as defined by the font author\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_WEIGHT\">\r\n            The entry of PDF FontDescriptor dictionary.\r\n            (Optional; PDF 1.5; strongly recommended for Type 3 fonts in Tagged PDF documents)\r\n            The weight (thickness) component of the fully-qualified font name or font specifier.\r\n            A value larger than 500 indicates bold font-weight.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_TYPE_T1\">\r\n            The font is Type 1.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_TYPE_TT\">\r\n            The font is True Type with a standard encoding.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_TYPE_CJK\">\r\n            The font is CJK.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_TYPE_TTUNI\">\r\n            The font is True Type with a Unicode encoding.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_TYPE_DOCUMENT\">\r\n            A font already inside the document.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.FONT_TYPE_T3\">\r\n            A Type3 font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.IDENTITY_H\">\r\n            The Unicode encoding with horizontal writing.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.IDENTITY_V\">\r\n            The Unicode encoding with vertical writing.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.CP1250\">\r\n            A possible encoding. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.CP1252\">\r\n            A possible encoding. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.CP1257\">\r\n            A possible encoding. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.WINANSI\">\r\n            A possible encoding. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.MACROMAN\">\r\n            A possible encoding. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.DEFAULT_FONT_MATRIX\">\r\n            default array of six numbers specifying the font matrix, mapping glyph space to text space \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.EMBEDDED\">\r\n            if the font has to be embedded \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED\">\r\n            if the font doesn't have to be embedded \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.CACHED\">\r\n            if the font has to be cached \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.NOT_CACHED\">\r\n            if the font doesn't have to be cached \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.RESOURCE_PATH\">\r\n            The path to the font resources. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.CID_NEWLINE\">\r\n            The fake CID code that represents a newline. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.PARAGRAPH_SEPARATOR\">\r\n                     * Unicode Character 'PARAGRAPH SEPARATOR' (U+2029)\r\n            \t     * Treated as a line feed character in XFA rich and plain text.\r\n                     * @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.fontType\">\r\n            The font type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.notdef\">\r\n            a not defined character in a custom PDF encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.widths\">\r\n            table of characters widths for this encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.differences\">\r\n            encoding names \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.unicodeDifferences\">\r\n            same as differences but with the unicode codes \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.encoding\">\r\n            encoding used with this font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.embedded\">\r\n            true if the font is to be embedded in the PDF \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.compressionLevel\">\r\n            The compression level for the font stream.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.fontSpecific\">\r\n            true if the font must use its built in encoding. In that case the\r\n            <CODE>encoding</CODE> is only used to map a char to the position inside\r\n            the font, not to the expected char name.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.fontCache\">\r\n            cache for the fonts already used. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.BuiltinFonts14\">\r\n            list of the 14 built in fonts. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.forceWidthsOutput\">\r\n            Forces the output of the width array. Only matters for the 14\r\n            built-in fonts.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.directTextToByte\">\r\n            Converts <CODE>char</CODE> directly to <CODE>byte</CODE>\r\n            by casting.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.subset\">\r\n            Indicates if all the glyphs and widths for that particular\r\n            encoding should be included in the document.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BaseFont.specialMap\">\r\n            Custom encodings use this map to key the Unicode character\r\n            to the single byte code.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.BaseFont.StreamFont\">\r\n            Generates the PDF stream with the Type1 and Truetype fonts returning\r\n            a PdfStream.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.StreamFont.#ctor(System.Byte[],System.Int32[],System.Int32)\">\r\n            Generates the PDF stream with the Type1 and Truetype fonts returning\r\n            a PdfStream.\r\n            @param contents the content of the stream\r\n            @param lengths an array of int that describes the several lengths of each part of the font\r\n            @param compressionLevel  the compression level of the Stream\r\n            @throws DocumentException error in the stream compression\r\n            @since   2.1.3 (replaces the constructor without param compressionLevel)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.StreamFont.#ctor(System.Byte[],System.String,System.Int32)\">\r\n            Generates the PDF stream for a font.\r\n            @param contents the content of a stream\r\n            @param subType the subtype of the font.\r\n            @param compressionLevel  the compression level of the Stream\r\n            @throws DocumentException error in the stream compression\r\n            @since   2.1.3 (replaces the constructor without param compressionLevel)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.#ctor\">\r\n            Creates new BaseFont\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.CreateFont\">\r\n            Creates a new font. This will always be the default Helvetica font (not embedded).\r\n            This method is introduced because Helvetica is used in many examples.\r\n            @return  a BaseFont object (Helvetica, Winansi, not embedded)\r\n            @throws  IOException         This shouldn't occur ever\r\n            @throws  DocumentException   This shouldn't occur ever\r\n            @since   2.1.1 \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.CreateFont(System.String,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.CreateFont(System.String,System.String,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.CreateFont(System.String,System.String,System.Boolean,System.Boolean,System.Byte[],System.Byte[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.CreateFont(System.String,System.String,System.Boolean,System.Boolean,System.Byte[],System.Byte[],System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.CreateFont(System.String,System.String,System.Boolean,System.Boolean,System.Byte[],System.Byte[],System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.CreateFont(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Creates a font based on an existing document font. The created font font may not\r\n            behave as expected, depending on the encoding or subset.\r\n            @param fontRef the reference to the document font\r\n            @return the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.IsVertical\">\r\n            Indicates whether the font is used for verticl writing or not.\r\n            @return <code>true</code> if the writing mode is vertical for the given font, <code>false</code> otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetBaseName(System.String)\">\r\n            Gets the name without the modifiers Bold, Italic or BoldItalic.\r\n            @param name the full name of the font\r\n            @return the name without the modifiers Bold, Italic or BoldItalic\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.NormalizeEncoding(System.String)\">\r\n            Normalize the encoding names. \"winansi\" is changed to \"Cp1252\" and\r\n            \"macroman\" is changed to \"MacRoman\".\r\n            @param enc the encoding to be normalized\r\n            @return the normalized encoding\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.CreateEncoding\">\r\n            Creates the <CODE>widths</CODE> and the <CODE>differences</CODE> arrays\r\n            @throws UnsupportedEncodingException the encoding is not supported\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetRawWidth(System.Int32,System.String)\">\r\n            Gets the width from the font according to the Unicode char <CODE>c</CODE>\r\n            or the <CODE>name</CODE>. If the <CODE>name</CODE> is null it's a symbolic font.\r\n            @param c the unicode char\r\n            @param name the glyph name\r\n            @return the width of the char\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetKerning(System.Int32,System.Int32)\">\r\n            Gets the kerning between two Unicode chars.\r\n            @param char1 the first char\r\n            @param char2 the second char\r\n            @return the kerning to be applied\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.SetKerning(System.Int32,System.Int32,System.Int32)\">\r\n            Sets the kerning between two Unicode chars.\r\n            @param char1 the first char\r\n            @param char2 the second char\r\n            @param kern the kerning to apply in normalized 1000 units\r\n            @return <code>true</code> if the kerning was applied, <code>false</code> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetWidth(System.Int32)\">\r\n            Gets the width of a <CODE>char</CODE> in normalized 1000 units.\r\n            @param char1 the unicode <CODE>char</CODE> to get the width of\r\n            @return the width in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetWidth(System.String)\">\r\n            Gets the width of a <CODE>string</CODE> in normalized 1000 units.\r\n            @param text the <CODE>string</CODE> to get the witdth of\r\n            @return the width in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetDescent(System.String)\">\r\n            Gets the descent of a <CODE>String</CODE> in normalized 1000 units. The descent will always be\r\n            less than or equal to zero even if all the characters have an higher descent.\r\n            @param text the <CODE>String</CODE> to get the descent of\r\n            @return the dexcent in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetAscent(System.String)\">\r\n            Gets the ascent of a <CODE>String</CODE> in normalized 1000 units. The ascent will always be\r\n            greater than or equal to zero even if all the characters have a lower ascent.\r\n            @param text the <CODE>String</CODE> to get the ascent of\r\n            @return the ascent in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetDescentPoint(System.String,System.Single)\">\r\n            Gets the descent of a <CODE>String</CODE> in points. The descent will always be\r\n            less than or equal to zero even if all the characters have an higher descent.\r\n            @param text the <CODE>String</CODE> to get the descent of\r\n            @param fontSize the size of the font\r\n            @return the dexcent in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetAscentPoint(System.String,System.Single)\">\r\n            Gets the ascent of a <CODE>String</CODE> in points. The ascent will always be\r\n            greater than or equal to zero even if all the characters have a lower ascent.\r\n            @param text the <CODE>String</CODE> to get the ascent of\r\n            @param fontSize the size of the font\r\n            @return the ascent in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetWidthPointKerned(System.String,System.Single)\">\r\n            Gets the width of a <CODE>String</CODE> in points taking kerning\r\n            into account.\r\n            @param text the <CODE>String</CODE> to get the witdth of\r\n            @param fontSize the font size\r\n            @return the width in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetWidthPoint(System.String,System.Single)\">\r\n            Gets the width of a <CODE>string</CODE> in points.\r\n            @param text the <CODE>string</CODE> to get the witdth of\r\n            @param fontSize the font size\r\n            @return the width in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetWidthPoint(System.Int32,System.Single)\">\r\n            Gets the width of a <CODE>char</CODE> in points.\r\n            @param char1 the <CODE>char</CODE> to get the witdth of\r\n            @param fontSize the font size\r\n            @return the width in points\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.ConvertToBytes(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.ConvertToBytes(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.WriteFont(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfIndirectReference,System.Object[])\">\r\n            Outputs to the writer the font dictionaries and streams.\r\n            @param writer the writer for this document\r\n            @param ref the font indirect reference\r\n            @param params several parameters that depend on the font type\r\n            @throws IOException on error\r\n            @throws DocumentException error in generating the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetFullFontStream\">\r\n            Returns a PdfStream object with the full font program (if possible).\r\n            This method will return null for some types of fonts (CJKFont, Type3Font)\r\n            or if there is no font program available (standard Type 1 fonts).\r\n            @return  a PdfStream with the font program\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.Encoding\">\r\n            Gets the encoding used to convert <CODE>string</CODE> into <CODE>byte[]</CODE>.\r\n            @return the encoding name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetFontDescriptor(System.Int32,System.Single)\">\r\n            Gets the font parameter identified by <CODE>key</CODE>. Valid values\r\n            for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,\r\n            <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>\r\n            and <CODE>BBOXURY</CODE>.\r\n            @param key the parameter to be extracted\r\n            @param fontSize the font size in points\r\n            @return the parameter in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.SetFontDescriptor(System.Int32,System.Single)\">\r\n            Sets the font parameter identified by <CODE>key</CODE>. Valid values\r\n            for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,\r\n            <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>\r\n            and <CODE>BBOXURY</CODE>.\r\n            @param key the parameter to be updated\r\n            @param value the parameter value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.FontType\">\r\n            Gets the font type. The font types can be: FONT_TYPE_T1,\r\n            FONT_TYPE_TT, FONT_TYPE_CJK and FONT_TYPE_TTUNI.\r\n            @return the font type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.IsEmbedded\">\r\n            Gets the embedded flag.\r\n            @return <CODE>true</CODE> if the font is embedded.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.IsFontSpecific\">\r\n            Gets the symbolic flag of the font.\r\n            @return <CODE>true</CODE> if the font is symbolic\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.CreateSubsetPrefix\">\r\n            Creates a unique subset prefix to be added to the font name when the font is embedded and subset.\r\n            @return the subset prefix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetUnicodeDifferences(System.Int32)\">\r\n            Gets the Unicode character corresponding to the byte output to the pdf stream.\r\n            @param index the byte index\r\n            @return the Unicode character\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.PostscriptFontName\">\r\n            Gets the postscript font name.\r\n            @return the postscript font name\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.BaseFont.FullFontName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.BaseFont.AllNameEntries”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.GetFullFontName(System.String,System.String,System.Byte[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetAllFontNames(System.String,System.String,System.Byte[])\">\r\n            Gets all the names from the font. Only the required tables are read.\r\n            @param name the name of the font\r\n            @param encoding the encoding of the font\r\n            @param ttfAfm the true type font or the afm in a byte array\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n            @return an array of Object[] built with {getPostscriptFontName(), GetFamilyFontName(), GetFullFontName()}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetAllNameEntries(System.String,System.String,System.Byte[])\">\r\n            Gets all the entries of the namestable from the font. Only the required tables are read.\r\n            @param name the name of the font\r\n            @param encoding the encoding of the font\r\n            @param ttfAfm the true type font or the afm in a byte array\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n            @return an array of Object[] built with {getPostscriptFontName(), getFamilyFontName(), getFullFontName()}\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.BaseFont.FamilyFontName”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.CodePagesSupported\">\r\n            Gets the code pages supported by the font. This has only meaning\r\n            with True Type fonts.\r\n            @return the code pages supported by the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.EnumerateTTCNames(System.String)\">\r\n            Enumerates the postscript font names present inside a\r\n            True Type Collection.\r\n            @param ttcFile the file name of the font\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n            @return the postscript font names\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.EnumerateTTCNames(System.Byte[])\">\r\n            Enumerates the postscript font names present inside a\r\n            True Type Collection.\r\n            @param ttcArray the font as a <CODE>byte</CODE> array\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n            @return the postscript font names\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.Widths\">\r\n            Gets the font width array.\r\n            @return the font width array\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.Differences\">\r\n            Gets the array with the names of the characters.\r\n            @return the array with the names of the characters\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.UnicodeDifferences\">\r\n            Gets the array with the unicode characters.\r\n            @return the array with the unicode characters\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.ForceWidthsOutput\">\r\n            Set to <CODE>true</CODE> to force the generation of the\r\n            widths array.\r\n            @param forceWidthsOutput <CODE>true</CODE> to force the generation of the\r\n            widths array\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.DirectTextToByte\">\r\n            Sets the conversion of <CODE>char</CODE> directly to <CODE>byte</CODE>\r\n            by casting. This is a low level feature to put the bytes directly in\r\n            the content stream without passing through string.GetBytes().\r\n            @param directTextToByte New value of property directTextToByte.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.Subset\">\r\n            Indicates if all the glyphs and widths for that particular\r\n            encoding should be included in the document. When set to <CODE>true</CODE>\r\n            only the glyphs used will be included in the font. When set to <CODE>false</CODE>\r\n            and {@link #addSubsetRange(int[])} was not called the full font will be included\r\n            otherwise just the characters ranges will be included.\r\n            @param subset new value of property subset\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BaseFont.GetUnicodeEquivalent(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetCidCode(System.Int32)\">\r\n            Gets the CID code given an Unicode.\r\n            It has only meaning with CJK fonts.\r\n            @param c the Unicode\r\n            @return the CID equivalent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.HasKernPairs\">\r\n            Checks if the font has any kerning pairs.\r\n            @return <CODE>true</CODE> if the font has any kerning pairs\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.CharExists(System.Int32)\">\r\n            Checks if a character exists in this font.\r\n            @param c the character to check\r\n            @return <CODE>true</CODE> if the character has a glyph,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.SetCharAdvance(System.Int32,System.Int32)\">\r\n            Sets the character advance.\r\n            @param c the character\r\n            @param advance the character advance normalized to 1000 units\r\n            @return <CODE>true</CODE> if the advance was set,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetDocumentFonts(iTextSharp.text.pdf.PdfReader)\">\r\n            Gets a list of all document fonts. Each element of the <CODE>ArrayList</CODE>\r\n            contains a <CODE>Object[]{String,PRIndirectReference}</CODE> with the font name\r\n            and the indirect reference to it.\r\n            @param reader the document where the fonts are to be listed from\r\n            @return the list of fonts and references\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetDocumentFonts(iTextSharp.text.pdf.PdfReader,System.Int32)\">\r\n            Gets a list of the document fonts in a particular page. Each element of the <CODE>ArrayList</CODE>\r\n            contains a <CODE>Object[]{String,PRIndirectReference}</CODE> with the font name\r\n            and the indirect reference to it.\r\n            @param reader the document where the fonts are to be listed from\r\n            @param page the page to list the fonts from\r\n            @return the list of fonts and references\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetCharBBox(System.Int32)\">\r\n            Gets the smallest box enclosing the character contours. It will return\r\n            <CODE>null</CODE> if the font has not the information or the character has no\r\n            contours, as in the case of the space, for example. Characters with no contours may\r\n            also return [0,0,0,0].\r\n            @param c the character to get the contour bounding box from\r\n            @return an array of four floats with the bounding box in the format [llx,lly,urx,ury] or\r\n            <code>null</code>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.GetFontMatrix\">\r\n             Gets default array of six numbers specifying the font matrix, mapping glyph space to text space\r\n            @return an array of six values\r\n            <code>null</code>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.CorrectArabicAdvance\">\r\n            iText expects Arabic Diactrics (tashkeel) to have zero advance but some fonts,\r\n            most notably those that come with Windows, like times.ttf, have non-zero\r\n            advance for those characters. This method makes those character to have zero\r\n            width advance and work correctly in the iText Arabic shaping and reordering\r\n            context.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BaseFont.AddSubsetRange(System.Int32[])\">\r\n            Adds a character range when subsetting. The range is an <CODE>int</CODE> array\r\n            where the first element is the start range inclusive and the second element is the\r\n            end range inclusive. Several ranges are allowed in the same array.\r\n            @param range the character range\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.BaseFont.CompressionLevel\">\r\n            Sets the compression level to be used for the font streams.\r\n            @param compressionLevel a value between 0 (best speed) and 9 (best compression)\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.BidiLine\">\r\n            Does all the line bidirectional processing with PdfChunk assembly.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiLine.#ctor\">\r\n            Creates new BidiLine \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiLine.IsWordSplit\">\r\n            Call this after processLine() to know if any word was split into several lines.\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiLine.GetWidth(System.Int32,System.Int32)\">\r\n            Gets the width of a range of characters.\r\n            @param startIdx the first index to calculate\r\n            @param lastIdx the last inclusive index to calculate\r\n            @return the sum of all widths\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiLine.GetWidth(System.Int32,System.Int32,System.Single)\">\r\n            Gets the width of a range of characters.\r\n            @param startIdx the first index to calculate\r\n            @param lastIdx the last inclusive index to calculate\r\n            @param originalWidth the full width of the line. It is used in case of RTL and tab stops\r\n            @return the sum of all widths\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiLine.ProcessLTR(System.String,System.Int32,System.Int32)\">\r\n            Method that changes a String with Arabic characters into a String in which the ligatures are made.\r\n            @param s\tthe original String\r\n            @param runDirection\r\n            @param arabicOptions\r\n            @return the String with the ligaturesc\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.L\">\r\n            Left-to-right\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.LRE\">\r\n            Left-to-Right Embedding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.LRO\">\r\n            Left-to-Right Override \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.R\">\r\n            Right-to-Left \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.AL\">\r\n            Right-to-Left Arabic \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.RLE\">\r\n            Right-to-Left Embedding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.RLO\">\r\n            Right-to-Left Override \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.PDF\">\r\n            Pop Directional Format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.EN\">\r\n            European Number \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.ES\">\r\n            European Number Separator \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.ET\">\r\n            European Number Terminator \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.AN\">\r\n            Arabic Number \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.CS\">\r\n            Common Number Separator \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.NSM\">\r\n            Non-Spacing Mark \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.BN\">\r\n            Boundary Neutral \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.B\">\r\n            Paragraph Separator \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.S\">\r\n            Segment Separator \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.WS\">\r\n            Whitespace \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.ON\">\r\n            Other Neutrals \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.TYPE_MIN\">\r\n            Minimum bidi type value. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.BidiOrder.TYPE_MAX\">\r\n            Maximum bidi type value. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.#ctor(System.SByte[])\">\r\n             Initialize using an array of direction types.  Types range from TYPE_MIN to TYPE_MAX inclusive\r\n             and represent the direction codes of the characters in the text.\r\n            \r\n             @param types the types array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.#ctor(System.SByte[],System.SByte)\">\r\n             Initialize using an array of direction types and an externally supplied paragraph embedding level.\r\n             The embedding level may be -1, 0, or 1.  -1 means to apply the default algorithm (rules P2 and P3),\r\n             0 is for LTR paragraphs, and 1 is for RTL paragraphs.\r\n            \r\n             @param types the types array\r\n             @param paragraphEmbeddingLevel the externally supplied paragraph embedding level.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.RunAlgorithm\">\r\n            The algorithm.\r\n            Does not include line-based processing (Rules L1, L2).\r\n            These are applied later in the line-based phase of the algorithm.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BidiOrder.DetermineParagraphEmbeddingLevel”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BidiOrder.DetermineExplicitEmbeddingLevels”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.RemoveExplicitCodes\">\r\n            Rules X9.\r\n            Remove explicit codes so that they may be ignored during the remainder\r\n            of the main portion of the algorithm.  The length of the resulting text\r\n            is returned.\r\n            @return the length of the data excluding explicit codes and BN.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ReinsertExplicitCodes(System.Int32)\">\r\n            Reinsert levels information for explicit codes.\r\n            This is for ease of relating the level information\r\n            to the original input data.  Note that the levels\r\n            assigned to these codes are arbitrary, they're\r\n            chosen so as to avoid breaking level runs.\r\n            @param textLength the length of the data after compression\r\n            @return the length of the data (original length of\r\n            types array supplied to constructor)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ProcessEmbeddings(System.SByte[],System.SByte)\">\r\n             2) determining explicit levels\r\n             Rules X1 - X8\r\n            \r\n             The interaction of these rules makes handling them a bit complex.\r\n             This examines resultTypes but does not modify it.  It returns embedding and\r\n             override information in the result array.  The low 7 bits are the level, the high\r\n             bit is set if the level is an override, and clear if it is an embedding.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ResolveWeakTypes(System.Int32,System.Int32,System.SByte,System.SByte,System.SByte)\">\r\n             3) resolving weak types\r\n             Rules W1-W7.\r\n            \r\n             Note that some weak types (EN, AN) remain after this processing is complete.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ResolveNeutralTypes(System.Int32,System.Int32,System.SByte,System.SByte,System.SByte)\">\r\n            6) resolving neutral types\r\n            Rules N1-N2.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ResolveImplicitLevels(System.Int32,System.Int32,System.SByte,System.SByte,System.SByte)\">\r\n            7) resolving implicit embedding levels\r\n            Rules I1, I2.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.BidiOrder.GetLevels(System.Int32[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ComputeMultilineReordering(System.SByte[],System.Int32[])\">\r\n            Return multiline reordering array for a given level array.\r\n            Reordering does not occur across a line break.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ComputeReordering(System.SByte[])\">\r\n            Return reordering array for a given level array.  This reorders a single line.\r\n            The reordering is a visual to logical map.  For example,\r\n            the leftmost char is string.CharAt(order[0]).\r\n            Rule L2.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.GetBaseLevel\">\r\n            Return the base level of the paragraph.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.IsWhitespace(System.SByte)\">\r\n            Return true if the type is considered a whitespace type for the line break rules.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.TypeForLevel(System.Int32)\">\r\n            Return the strong type (L or R) corresponding to the level.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.FindRunLimit(System.Int32,System.Int32,System.SByte[])\">\r\n            Return the limit of the run starting at index that includes only resultTypes in validSet.\r\n            This checks the value at index, and will return index if that value is not in validSet.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.FindRunStart(System.Int32,System.SByte[])\">\r\n            Return the start of the run including index that includes only resultTypes in validSet.\r\n            This assumes the value at index is valid, and does not check it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.SetTypes(System.Int32,System.Int32,System.SByte)\">\r\n            Set resultTypes from start up to (but not including) limit to newType.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.SetLevels(System.Int32,System.Int32,System.SByte)\">\r\n            Set resultLevels from start up to (but not including) limit to newLevel.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ValidateTypes(System.SByte[])\">\r\n            Throw exception if type array is invalid.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ValidateParagraphEmbeddingLevel(System.SByte)\">\r\n            Throw exception if paragraph embedding level is invalid. Special allowance for -1 so that\r\n            default processing can still be performed when using this API.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.BidiOrder.ValidateLineBreaks(System.Int32[],System.Int32)\">\r\n            Throw exception if line breaks array is invalid.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.ByteBuffer\">\r\n            Acts like a <CODE>StringBuilder</CODE> but works with <CODE>byte</CODE> arrays.\r\n            floating point is converted to a format suitable to the PDF.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ByteBuffer.count\">\r\n            The count of bytes in the buffer. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ByteBuffer.buf\">\r\n            The buffer where the bytes are stored. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ByteBuffer.HIGH_PRECISION\">\r\n            If <CODE>true</CODE> always output floating point numbers with 6 decimal digits.\r\n            If <CODE>false</CODE> uses the faster, although less precise, representation.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.#ctor\">\r\n            Creates new ByteBuffer with capacity 128 \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.#ctor(System.Int32)\">\r\n            Creates a byte buffer with a certain capacity.\r\n            @param size the initial capacity\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.ByteBuffer.SetCacheSize(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.FillCache(System.Int32)\">\r\n             You can fill the cache in advance if you want to.\r\n            \r\n             @param   decimals\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.ConvertToBytes(System.Int32)\">\r\n             Converts an double (multiplied by 100 and cast to an int) into an array of bytes.\r\n            \r\n             @param   i   the int\r\n             @return  a bytearray\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append_i(System.Int32)\">\r\n            Appends an <CODE>int</CODE>. The size of the array will grow by one.\r\n            @param b the int to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Byte[],System.Int32,System.Int32)\">\r\n            Appends the subarray of the <CODE>byte</CODE> array. The buffer will grow by\r\n            <CODE>len</CODE> bytes.\r\n            @param b the array to be appended\r\n            @param off the offset to the start of the array\r\n            @param len the length of bytes to Append\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Byte[])\">\r\n            Appends an array of bytes.\r\n            @param b the array to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.String)\">\r\n            Appends a <CODE>string</CODE> to the buffer. The <CODE>string</CODE> is\r\n            converted according to the encoding ISO-8859-1.\r\n            @param str the <CODE>string</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Char)\">\r\n            Appends a <CODE>char</CODE> to the buffer. The <CODE>char</CODE> is\r\n            converted according to the encoding ISO-8859-1.\r\n            @param c the <CODE>char</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(iTextSharp.text.pdf.ByteBuffer)\">\r\n            Appends another <CODE>ByteBuffer</CODE> to this buffer.\r\n            @param buf the <CODE>ByteBuffer</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Int32)\">\r\n            Appends the string representation of an <CODE>int</CODE>.\r\n            @param i the <CODE>int</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Int64)\">\r\n            Appends the string representation of a <CODE>long</CODE>.\r\n            @param i the <CODE>long</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Single)\">\r\n            Appends a string representation of a <CODE>float</CODE> according\r\n            to the Pdf conventions.\r\n            @param i the <CODE>float</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Append(System.Double)\">\r\n            Appends a string representation of a <CODE>double</CODE> according\r\n            to the Pdf conventions.\r\n            @param d the <CODE>double</CODE> to be appended\r\n            @return a reference to this <CODE>ByteBuffer</CODE> object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.FormatDouble(System.Double)\">\r\n            Outputs a <CODE>double</CODE> into a format suitable for the PDF.\r\n            @param d a double\r\n            @return the <CODE>string</CODE> representation of the <CODE>double</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.FormatDouble(System.Double,iTextSharp.text.pdf.ByteBuffer)\">\r\n            Outputs a <CODE>double</CODE> into a format suitable for the PDF.\r\n            @param d a double\r\n            @param buf a ByteBuffer\r\n            @return the <CODE>String</CODE> representation of the <CODE>double</CODE> if\r\n            <CODE>buf</CODE> is <CODE>null</CODE>. If <CODE>buf</CODE> is <B>not</B> <CODE>null</CODE>,\r\n            then the double is appended directly to the buffer and this methods returns <CODE>null</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.Reset\">\r\n            Sets the size to zero.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.ToByteArray\">\r\n             Creates a newly allocated byte array. Its size is the current\r\n             size of this output stream and the valid contents of the buffer\r\n             have been copied into it.\r\n            \r\n             @return  the current contents of this output stream, as a byte array.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ByteBuffer.Size\">\r\n             Returns the current size of the buffer.\r\n            \r\n             @return the value of the <code>count</code> field, which is the number of valid bytes in this byte buffer.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.ToString\">\r\n             Converts the buffer's contents into a string, translating bytes into\r\n             characters according to the platform's default character encoding.\r\n            \r\n             @return string translated from the buffer's contents.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ByteBuffer.WriteTo(System.IO.Stream)\">\r\n             Writes the complete contents of this byte buffer output to\r\n             the specified output stream argument, as if by calling the output\r\n             stream's write method using <code>out.Write(buf, 0, count)</code>.\r\n            \r\n             @param      out   the output stream to which to write the data.\r\n             @exception  IOException  if an I/O error occurs.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.Item\">\r\n            List items for the linked list that builds the new CID font.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFont.Item.Increment(System.Int32[])\">\r\n            remember the current offset and increment by item's size in bytes. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFont.Item.Emit(System.Byte[])\">\r\n            Emit the byte stream for this item. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFont.Item.Xref\">\r\n            Fix up cross references to this item (applies only to markers). \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFont.OffsetItem.Set(System.Int32)\">\r\n            set the value of an offset item that was initially unknown.\r\n            It will be fixed up latex by a call to xref on some marker.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.RangeItem\">\r\n            A range item.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.IndexOffsetItem\">\r\n            An index-offset item for the list.\r\n            The size denotes the required size in the CFF. A positive\r\n            value means that we need a specific size in bytes (for offset arrays)\r\n            and a negative value means that this is a dict item that uses a\r\n            variable-size representation.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.SubrMarkerItem\">\r\n             \r\n             @author orly manor\r\n            \r\n             TODO To change the template for this generated type comment go to\r\n             Window - Preferences - Java - Code Generation - Code and Comments\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.DictOffsetItem\">\r\n            an unknown offset in a dictionary for the list.\r\n            We will fix up the offset later; for now, assume it's large.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.UInt24Item\">\r\n            Card24 item.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.UInt32Item\">\r\n            Card32 item.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.UInt16Item\">\r\n            A SID or Card16 item.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.UInt8Item\">\r\n            A Card8 item.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.DictNumberItem\">\r\n            A dictionary number on the list.\r\n            This implementation is inefficient: it doesn't use the variable-length\r\n            representation.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CFFFont.MarkerItem\">\r\n            An offset-marker item for the list.\r\n            It is used to mark an offset and to set the offset list item.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFont.GetEntireIndexRange(System.Int32)\">\r\n            a utility that creates a range item for an entire index\r\n            \r\n             @param indexOffset where the index is\r\n             @return a range item representing the entire index\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFont.GetCID(System.String)\">\r\n            get a single CID font. The PDF architecture (1.4)\r\n            supports 16-bit strings only with CID CFF fonts, not\r\n            in Type-1 CFF fonts, so we convert the font to CID if\r\n            it is in the Type-1 format.\r\n            Two other tasks that we need to do are to select\r\n            only a single font from the CFF package (this again is\r\n            a PDF restriction) and to subset the CharStrings glyph\r\n            description.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFont.buf\">\r\n            A random Access File or an array\r\n            (contributed by orly manor)\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.CFFFont.Font”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.CFFFontSubset”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.SubrsFunctions\">\r\n            The Strings in this array represent Type1/Type2 operator names\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.SubrsEscapeFuncs\">\r\n            The Strings in this array represent Type1/Type2 escape operator names\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.ENDCHAR_OP\">\r\n            Operator codes for unused  CharStrings and unused local and global Subrs\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.GlyphsUsed\">\r\n            A HashMap containing the glyphs used in the text after being converted\r\n            to glyph number by the CMap \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.glyphsInList\">\r\n            The GlyphsUsed keys as an ArrayList\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.FDArrayUsed\">\r\n            A HashMap for keeping the FDArrays being used by the font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.hSubrsUsed\">\r\n            A HashMaps array for keeping the subroutines used in each FontDict\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.lSubrsUsed\">\r\n            The SubroutinesUsed HashMaps as ArrayLists\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.hGSubrsUsed\">\r\n            A HashMap for keeping the Global subroutines used in the font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.lGSubrsUsed\">\r\n            The Global SubroutinesUsed HashMaps as ArrayLists\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.hSubrsUsedNonCID\">\r\n            A HashMap for keeping the subroutines used in a non-cid font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.lSubrsUsedNonCID\">\r\n            The SubroutinesUsed HashMap as ArrayList\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.NewLSubrsIndex\">\r\n            An array of the new Indexs for the local Subr. One index for each FontDict\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.NewSubrsIndexNonCID\">\r\n            The new subroutines index for a non-cid font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.NewGSubrsIndex\">\r\n            The new global subroutines index of the font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.NewCharStringsIndex\">\r\n            The new CharString of the font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.GBias\">\r\n            The bias for the global subroutines\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.OutputList\">\r\n            The linked list for generating the new font stream\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CFFFontSubset.NumOfHints\">\r\n            Number of arguments to the stem operators in a subroutine calculated recursivly\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Collections.Generic.Dictionary{System.Int32,System.Int32[]})\">\r\n            C'tor for CFFFontSubset\r\n            @param rf - The font file\r\n            @param GlyphsUsed - a HashMap that contains the glyph used in the subset \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CountCharset(System.Int32,System.Int32)\">\r\n            Calculates the length of the charset according to its format\r\n            @param Offset The Charset Offset\r\n            @param NumofGlyphs Number of glyphs in the font\r\n            @return the length of the Charset\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CountRange(System.Int32,System.Int32)\">\r\n            Function calculates the number of ranges in the Charset\r\n            @param NumofGlyphs The number of glyphs in the font\r\n            @param Type The format of the Charset\r\n            @return The number of ranges in the Charset data structure\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReadFDSelect(System.Int32)\">\r\n            Read the FDSelect of the font and compute the array and its length\r\n            @param Font The index of the font being processed\r\n            @return The Processed FDSelect of the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildFDArrayUsed(System.Int32)\">\r\n            Function reads the FDSelect and builds the FDArrayUsed HashMap According to the glyphs used\r\n            @param Font the Number of font being processed\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReadFDArray(System.Int32)\">\r\n            Read the FDArray count, offsize and Offset array\r\n            @param Font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.Process(System.String)\">\r\n            The Process function extracts one font out of the CFF file and returns a\r\n            subset version of the original.\r\n            @param fontName - The name of the font to be taken out of the CFF\r\n            @return The new font stream\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CalcBias(System.Int32,System.Int32)\">\r\n            Function calcs bias according to the CharString type and the count\r\n            of the subrs\r\n            @param Offset The offset to the relevent subrs index\r\n            @param Font the font\r\n            @return The calculated Bias\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildNewCharString(System.Int32)\">\r\n            Function uses BuildNewIndex to create the new index of the subset charstrings\r\n             @param FontIndex the font\r\n             @throws IOException\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.CFFFontSubset.BuildNewLGSubrs(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildFDSubrsOffsets(System.Int32,System.Int32)\">\r\n            The function finds for the FD array processed the local subr offset and its \r\n            offset array.  \r\n            @param Font the font\r\n            @param FD The FDARRAY processed\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.CFFFontSubset.BuildSubrUsed(System.Int32,System.Int32,System.Int32,System.Int32[],System.Collections.Generic.Dictionary{System.Int32,System.Int32[]},System.Collections.Generic.List{System.Int32})”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.CFFFontSubset.BuildGSubrsUsed(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReadASubr(System.Int32,System.Int32,System.Int32,System.Int32,System.Collections.Generic.Dictionary{System.Int32,System.Int32[]},System.Collections.Generic.List{System.Int32},System.Int32[])\">\r\n            The function reads a subrs (glyph info) between begin and end.\r\n            Adds calls to a Lsubr to the hSubr and lSubrs.\r\n            Adds calls to a Gsubr to the hGSubr and lGSubrs.\r\n            @param begin the start point of the subr\r\n            @param end the end point of the subr\r\n            @param GBias the bias of the Global Subrs\r\n            @param LBias the bias of the Local Subrs\r\n            @param hSubr the HashMap for the lSubrs\r\n            @param lSubr the ArrayList for the lSubrs\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.HandelStack\">\r\n            Function Checks how the current operator effects the run time stack after being run \r\n            An operator may increase or decrease the stack size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.StackOpp\">\r\n            Function checks the key and return the change to the stack after the operator\r\n            @return The change in the stack. 2-> flush the stack\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.EmptyStack\">\r\n             Empty the Type2 Stack\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.PopStack\">\r\n             Pop one element from the stack \r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.PushStack\">\r\n             Add an item to the stack\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReadCommand\">\r\n            The function reads the next command after the file pointer is set\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CalcHints(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32[])\">\r\n            The function reads the subroutine and returns the number of the hint in it.\r\n            If a call to another subroutine is found the function calls recursively.\r\n            @param begin the start point of the subr\r\n            @param end the end point of the subr\r\n            @param LBias the bias of the Local Subrs\r\n            @param GBias the bias of the Global Subrs\r\n            @param LSubrsOffsets The Offsets array of the subroutines\r\n            @return The number of hints in the subroutine read.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildNewIndex(System.Int32[],System.Collections.Generic.Dictionary{System.Int32,System.Int32[]},System.Byte)\">\r\n            Function builds the new offset array, object array and assembles the index.\r\n            used for creating the glyph and subrs subsetted index \r\n            @param Offsets the offset array of the original index  \r\n            @param Used the hashmap of the used objects\r\n            @param OperatorForUnusedEntries the operator inserted into the data stream for unused entries\r\n            @return the new index subset version \r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildNewIndexAndCopyAllGSubrs(System.Int32[],System.Byte)\">\r\n            Function builds the new offset array, object array and assembles the index.\r\n            used for creating the glyph and subrs subsetted index \r\n            @param Offsets the offset array of the original index  \r\n            @param OperatorForUnusedEntries the operator inserted into the data stream for unused entries\r\n            @return the new index subset version \r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.AssembleIndex(System.Int32[],System.Byte[])\">\r\n            Function creates the new index, inserting the count,offsetsize,offset array\r\n            and object array.\r\n            @param NewOffsets the subsetted offset array\r\n            @param NewObjects the subsetted object array\r\n            @return the new index created\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildNewFile(System.Int32)\">\r\n            The function builds the new output stream according to the subset process\r\n            @param Font the font\r\n            @return the subseted font stream\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CopyHeader\">\r\n            Function Copies the header from the original fileto the output list\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.BuildIndexHeader(System.Int32,System.Int32,System.Int32)\">\r\n            Function Build the header of an index\r\n            @param Count the count field of the index\r\n            @param Offsize the offsize field of the index\r\n            @param First the first offset of the index\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateKeys(iTextSharp.text.pdf.CFFFont.OffsetItem,iTextSharp.text.pdf.CFFFont.OffsetItem,iTextSharp.text.pdf.CFFFont.OffsetItem,iTextSharp.text.pdf.CFFFont.OffsetItem)\">\r\n            Function adds the keys into the TopDict\r\n            @param fdarrayRef OffsetItem for the FDArray\r\n            @param fdselectRef OffsetItem for the FDSelect\r\n            @param charsetRef OffsetItem for the CharSet\r\n            @param charstringsRef OffsetItem for the CharString\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateNewStringIndex(System.Int32)\">\r\n            Function takes the original string item and adds the new strings\r\n            to accomodate the CID rules\r\n            @param Font the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateFDSelect(iTextSharp.text.pdf.CFFFont.OffsetItem,System.Int32)\">\r\n            Function creates new FDSelect for non-CID fonts.\r\n            The FDSelect built uses a single range for all glyphs\r\n            @param fdselectRef OffsetItem for the FDSelect\r\n            @param nglyphs the number of glyphs in the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateCharset(iTextSharp.text.pdf.CFFFont.OffsetItem,System.Int32)\">\r\n            Function creates new CharSet for non-CID fonts.\r\n            The CharSet built uses a single range for all glyphs\r\n            @param charsetRef OffsetItem for the CharSet\r\n            @param nglyphs the number of glyphs in the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateFDArray(iTextSharp.text.pdf.CFFFont.OffsetItem,iTextSharp.text.pdf.CFFFont.OffsetItem,System.Int32)\">\r\n            Function creates new FDArray for non-CID fonts.\r\n            The FDArray built has only the \"Private\" operator that points to the font's\r\n            original private dict \r\n            @param fdarrayRef OffsetItem for the FDArray\r\n            @param privateRef OffsetItem for the Private Dict\r\n            @param Font the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.Reconstruct(System.Int32)\">\r\n            Function reconstructs the FDArray, PrivateDict and LSubr for CID fonts\r\n            @param Font the font\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReconstructFDArray(System.Int32,iTextSharp.text.pdf.CFFFont.OffsetItem[])\">\r\n            Function subsets the FDArray and builds the new one with new offsets\r\n            @param Font The font\r\n            @param fdPrivate OffsetItem Array (one for each FDArray)\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReconstructPrivateDict(System.Int32,iTextSharp.text.pdf.CFFFont.OffsetItem[],iTextSharp.text.pdf.CFFFont.IndexBaseItem[],iTextSharp.text.pdf.CFFFont.OffsetItem[])\">\r\n            Function Adds the new private dicts (only for the FDs used) to the list\r\n            @param Font the font\r\n            @param fdPrivate OffsetItem array one element for each private\r\n            @param fdPrivateBase IndexBaseItem array one element for each private\r\n            @param fdSubrs OffsetItem array one element for each private\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.ReconstructPrivateSubrs(System.Int32,iTextSharp.text.pdf.CFFFont.IndexBaseItem[],iTextSharp.text.pdf.CFFFont.OffsetItem[])\">\r\n            Function Adds the new LSubrs dicts (only for the FDs used) to the list\r\n            @param Font  The index of the font\r\n            @param fdPrivateBase The IndexBaseItem array for the linked list\r\n            @param fdSubrs OffsetItem array for the linked list\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CalcSubrOffsetSize(System.Int32,System.Int32)\">\r\n            Calculates how many byte it took to write the offset for the subrs in a specific\r\n            private dict.\r\n            @param Offset The Offset for the private dict\r\n            @param Size The size of the private dict\r\n            @return The size of the offset of the subrs in the private dict\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CountEntireIndexRange(System.Int32)\">\r\n            Function computes the size of an index\r\n            @param indexOffset The offset for the computed index\r\n            @return The size of the index\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateNonCIDPrivate(System.Int32,iTextSharp.text.pdf.CFFFont.OffsetItem)\">\r\n            The function creates a private dict for a font that was not CID\r\n            All the keys are copied as is except for the subrs key \r\n            @param Font the font\r\n            @param Subr The OffsetItem for the subrs of the private \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CFFFontSubset.CreateNonCIDSubrs(System.Int32,iTextSharp.text.pdf.CFFFont.IndexBaseItem,iTextSharp.text.pdf.CFFFont.OffsetItem)\">\r\n            the function marks the beginning of the subrs index and adds the subsetted subrs\r\n            index to the output list. \r\n            @param Font the font\r\n            @param PrivateBase IndexBaseItem for the private that's referencing to the subrs\r\n            @param Subrs OffsetItem for the subrs\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CJKFont\">\r\n             Creates a CJK font compatible with the fonts in the Adobe Asian font Pack.\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CJKFont.CJK_ENCODING\">\r\n            The encoding used in the PDF document for CJK fonts\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CJKFont.RESOURCE_PATH_CMAP\">\r\n            The path to the font resources. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CJKFont.fontName\">\r\n            The font name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CJKFont.style\">\r\n            The style modifier \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CJKFont.CMap\">\r\n            The CMap name associated with this font \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CJKFont.#ctor(System.String,System.String,System.Boolean)\">\r\n            Creates a CJK font.\r\n            @param fontName the name of the font\r\n            @param enc the encoding of the font\r\n            @param emb always <CODE>false</CODE>. CJK font and not embedded\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CJKFont.GetCompatibleFont(System.String)\">\r\n            Returns a font compatible with a CJK encoding or null if not found.\r\n            @param enc\r\n            @return \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CJKFont.IsCJKFont(System.String,System.String)\">\r\n            Checks if its a valid CJK font.\r\n            @param fontName the font name\r\n            @param enc the encoding\r\n            @return <CODE>true</CODE> if it is CJK font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CJKFont.GetWidth(System.Int32)\">\r\n            Gets the width of a <CODE>char</CODE> in normalized 1000 units.\r\n            @param char1 the unicode <CODE>char</CODE> to get the width of\r\n            @return the width in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CJKFont.GetFullFontStream\">\r\n            You can't get the FontStream of a CJK font (CJK fonts are never embedded),\r\n            so this method always returns null.\r\n            @return  null\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CJKFont.GetFontDescriptor(System.Int32,System.Single)\">\r\n            Gets the font parameter identified by <CODE>key</CODE>. Valid values\r\n            for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>\r\n            and <CODE>ITALICANGLE</CODE>.\r\n            @param key the parameter to be extracted\r\n            @param fontSize the font size in points\r\n            @return the parameter in points\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.CJKFont.FullFontName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.CJKFont.AllNameEntries”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.CJKFont.FamilyFontName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.CJKFont.ConvertToBytes(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.CJKFont.ConvertToBytes(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.CMapAwareDocumentFont\">\r\n            Implementation of DocumentFont used while parsing PDF streams.\r\n            @since 2.1.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CMapAwareDocumentFont.fontDic\">\r\n            The font dictionary. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CMapAwareDocumentFont.spaceWidth\">\r\n            the width of a space for this font, in normalized 1000 point units \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CMapAwareDocumentFont.toUnicodeCmap\">\r\n            The CMap constructed from the ToUnicode map from the font's dictionary, if present.\r\n            This CMap transforms CID values into unicode equivalent\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.CMapAwareDocumentFont.cidbyte2uni\">\r\n            Mapping between CID code (single byte only for now) and unicode equivalent\r\n            as derived by the font's encoding.  Only needed if the ToUnicode CMap is not provided.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.#ctor(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Creates an instance of a CMapAwareFont based on an indirect reference to a font.\r\n            @param refFont   the indirect reference to a font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.ProcessToUnicode\">\r\n            Parses the ToUnicode entry, if present, and constructs a CMap for it\r\n            @since 2.1.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.ProcessUni2Byte\">\r\n            Inverts DocumentFont's uni2byte mapping to obtain a cid-to-unicode mapping based\r\n            on the font's encoding\r\n            @since 2.1.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.ComputeAverageWidth\">\r\n            For all widths of all glyphs, compute the average width in normalized 1000 point units.\r\n            This is used to give some meaningful width in cases where we need an average font width \r\n            (such as if the width of a space isn't specified by a given font)\r\n            @return the average width of all non-zero width glyphs in the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.GetWidth(System.Int32)\">\r\n            @since 2.1.5\r\n            Override to allow special handling for fonts that don't specify width of space character\r\n            @see com.itextpdf.text.pdf.DocumentFont#getWidth(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.DecodeSingleCID(System.Byte[],System.Int32,System.Int32)\">\r\n            Decodes a single CID (represented by one or two bytes) to a unicode String.\r\n            @param bytes     the bytes making up the character code to convert\r\n            @param offset    an offset\r\n            @param len       a length\r\n            @return  a String containing the encoded form of the input bytes using the font's encoding.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.Decode(System.Byte[],System.Int32,System.Int32)\">\r\n            Decodes a string of bytes (encoded in the font's encoding) into a unicode string\r\n            This will use the ToUnicode map of the font, if available, otherwise it uses\r\n            the font's encoding\r\n            @param cidbytes    the bytes that need to be decoded\r\n            @return  the unicode String that results from decoding\r\n            @since 2.1.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.DecodeSingleCharacter(System.Byte[],System.Int32,System.Int32)\">\r\n            ! .NET SPECIFIC; this method is used to avoid unecessary using of StringBuilder because it is slow in .NET !\r\n            Decodes a single character string of bytes (encoded in the font's encoding) into a unicode string\r\n            This will use the ToUnicode map of the font, if available, otherwise it uses\r\n            the font's encoding\r\n            @param cidbytes    the bytes that need to be decoded\r\n            @return  the unicode String that results from decoding\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.CMapAwareDocumentFont.Encode(System.Byte[],System.Int32,System.Int32)\">\r\n            Encodes bytes to a String.\r\n            @param bytes     the bytes from a stream\r\n            @param offset    an offset\r\n            @param len       a length\r\n            @return  a String encoded taking into account if the bytes are in unicode or not.\r\n            @deprecated method name is not indicative of what it does.  Use <code>decode</code> instead.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.CMYKColor\">\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollection.DETAILS\">\r\n            A type of PDF Collection \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollection.TILE\">\r\n            A type of PDF Collection \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollection.HIDDEN\">\r\n            A type of PDF Collection \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollection.CUSTOM\">\r\n            A type of PDF Collection \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollection.#ctor(System.Int32)\">\r\n            Constructs a PDF Collection.\r\n            @param   type    the type of PDF collection.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfCollection.InitialDocument\">\r\n            Identifies the document that will be initially presented\r\n            in the user interface.\r\n            @param description   the description that was used when attaching the file to the document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfCollection.Schema\">\r\n            Sets the Collection schema dictionary.\r\n            @param schema    an overview of the collection fields\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfCollection.Sort\">\r\n            Sets the Collection sort dictionary.\r\n            @param sort  a collection sort dictionary\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.collection.PdfCollectionField\">\r\n             @author blowagie\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.TEXT\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.DATE\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.NUMBER\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.FILENAME\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.DESC\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.MODDATE\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.CREATIONDATE\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.SIZE\">\r\n            A possible type of collection field. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionField.fieldType\">\r\n            The type of the PDF collection field. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionField.#ctor(System.String,System.Int32)\">\r\n            Creates a PdfCollectionField.\r\n            @param name      the field name\r\n            @param type      the field type\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfCollectionField.Order\">\r\n            The relative order of the field name. Fields are sorted in ascending order.\r\n            @param i a number indicating the order of the field\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfCollectionField.Visible\">\r\n            Sets the initial visibility of the field.\r\n            @param visible   the default is true (visible)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfCollectionField.Editable\">\r\n            Indication if the field value should be editable in the viewer.\r\n            @param editable  the default is false (not editable)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionField.IsCollectionItem\">\r\n            Checks if the type of the field is suitable for a Collection Item.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionField.GetValue(System.String)\">\r\n            Returns a PdfObject that can be used as the value of a Collection Item.\r\n            @param String    value   the value that has to be changed into a PdfObject (PdfString, PdfDate or PdfNumber) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.collection.PdfCollectionItem.schema\">\r\n            The PdfCollectionSchema with the names and types of the items. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.#ctor(iTextSharp.text.pdf.collection.PdfCollectionSchema)\">\r\n            Constructs a Collection Item that can be added to a PdfFileSpecification.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,System.String)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,iTextSharp.text.pdf.PdfString)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,iTextSharp.text.pdf.PdfDate)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,iTextSharp.text.pdf.PdfNumber)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,System.DateTime)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,System.Int32)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,System.Single)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.AddItem(System.String,System.Double)\">\r\n            Sets the value of the collection item.\r\n            @param value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionItem.SetPrefix(System.String,System.String)\">\r\n            Adds a prefix for the Collection item.\r\n            You can only use this method after you have set the value of the item.\r\n            @param prefix    a prefix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionSchema.#ctor\">\r\n            Creates a Collection Schema dictionary.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionSchema.AddField(System.String,iTextSharp.text.pdf.collection.PdfCollectionField)\">\r\n            Adds a Collection field to the Schema.\r\n            @param name  the name of the collection field\r\n            @param field a Collection Field\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionSort.#ctor(System.String)\">\r\n            Constructs a PDF Collection Sort Dictionary.\r\n            @param key   the key of the field that will be used to sort entries\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionSort.#ctor(System.String[])\">\r\n            Constructs a PDF Collection Sort Dictionary.\r\n            @param keys  the keys of the fields that will be used to sort entries\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionSort.SetSortOrder(System.Boolean)\">\r\n            Defines the sort order of the field (ascending or descending).\r\n            @param ascending true is the default, use false for descending order\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfCollectionSort.SetSortOrder(System.Boolean[])\">\r\n            Defines the sort order of the field (ascending or descending).\r\n            @param ascending an array with every element corresponding with a name of a field.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfTargetDictionary.#ctor(iTextSharp.text.pdf.collection.PdfTargetDictionary)\">\r\n            Creates dictionary referring to a target document that is the parent of the current document.\r\n            @param nested    null if this is the actual target, another target if this is only an intermediate target.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.collection.PdfTargetDictionary.#ctor(System.Boolean)\">\r\n            Creates a dictionary referring to a target document.\r\n            @param child if false, this refers to the parent document; if true, this refers to a child document, and you'll have to specify where to find the child using the other methods of this class\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfTargetDictionary.EmbeddedFileName\">\r\n            If this dictionary refers to a child that is a document level attachment,\r\n            you need to specify the name that was used to attach the document.\r\n            @param   name    the name in the EmbeddedFiles name tree\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfTargetDictionary.FileAttachmentPagename\">\r\n            If this dictionary refers to a child that is a file attachment added to a page,\r\n            you need to specify the name of the page (or use setFileAttachmentPage to specify the page number).\r\n            Once you have specified the page, you still need to specify the attachment using another method.\r\n            @param name  the named destination referring to the page with the file attachment.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfTargetDictionary.FileAttachmentPage\">\r\n            If this dictionary refers to a child that is a file attachment added to a page,\r\n            you need to specify the page number (or use setFileAttachmentPagename to specify a named destination).\r\n            Once you have specified the page, you still need to specify the attachment using another method.\r\n            @param page  the page number of the page with the file attachment.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfTargetDictionary.FileAttachmentName\">\r\n            If this dictionary refers to a child that is a file attachment added to a page,\r\n            you need to specify the page with setFileAttachmentPage or setFileAttachmentPageName,\r\n            and then specify the name of the attachment added to this page (or use setFileAttachmentIndex).\r\n            @param name      the name of the attachment\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfTargetDictionary.FileAttachmentIndex\">\r\n            If this dictionary refers to a child that is a file attachment added to a page,\r\n            you need to specify the page with setFileAttachmentPage or setFileAttachmentPageName,\r\n            and then specify the index of the attachment added to this page (or use setFileAttachmentName).\r\n            @param name      the name of the attachment\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.collection.PdfTargetDictionary.AdditionalPath\">\r\n            If this dictionary refers to an intermediate target, you can\r\n            add the next target in the sequence.\r\n            @param nested    the next target in the sequence\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.ColorDetails\">\r\n            Each colorSpace in the document will have an instance of this class\r\n            \r\n             @author Phillip Pan (phillip@formstar.com)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColorDetails.indirectReference\">\r\n            The indirect reference to this color\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColorDetails.colorSpaceName\">\r\n            The color name that appears in the document body stream\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColorDetails.colorSpace\">\r\n            The color\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColorDetails.#ctor(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.ICachedColorSpace)\">\r\n            Each spot color used in a document has an instance of this class.\r\n            @param colorName the color name\r\n            @param indirectReference the indirect reference to the font\r\n            @param scolor the <CODE>PDfSpotColor</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColorDetails.IndirectReference\">\r\n            Gets the indirect reference to this color.\r\n            @return the indirect reference to this color\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColorDetails.ColorSpaceName\">\r\n            Gets the color name as it appears in the document body.\r\n            @return the color name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColorDetails.GetPdfObject(iTextSharp.text.pdf.PdfWriter)\">\r\n            Gets the <CODE>SpotColor</CODE> object.\r\n            @return the <CODE>PdfSpotColor</CODE>\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.ColumnText”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.AR_NOVOWEL\">\r\n            Eliminate the arabic vowels \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.AR_COMPOSEDTASHKEEL\">\r\n            Compose the tashkeel in the ligatures. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.AR_LIG\">\r\n            Do some extra double ligatures. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.DIGITS_EN2AN\">\r\n            Digit shaping option: Replace European digits (U+0030...U+0039) by Arabic-Indic digits.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.DIGITS_AN2EN\">\r\n            Digit shaping option: Replace Arabic-Indic digits by European digits (U+0030...U+0039).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.DIGITS_EN2AN_INIT_LR\">\r\n            Digit shaping option:\r\n            Replace European digits (U+0030...U+0039) by Arabic-Indic digits\r\n            if the most recent strongly directional character\r\n            is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).\r\n            The initial state at the start of the text is assumed to be not an Arabic,\r\n            letter, so European digits at the start of the text will not change.\r\n            Compare to DIGITS_ALEN2AN_INIT_AL.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.DIGITS_EN2AN_INIT_AL\">\r\n            Digit shaping option:\r\n            Replace European digits (U+0030...U+0039) by Arabic-Indic digits\r\n            if the most recent strongly directional character\r\n            is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).\r\n            The initial state at the start of the text is assumed to be an Arabic,\r\n            letter, so European digits at the start of the text will change.\r\n            Compare to DIGITS_ALEN2AN_INT_LR.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.DIGIT_TYPE_AN\">\r\n            Digit type option: Use Arabic-Indic digits (U+0660...U+0669).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.DIGIT_TYPE_AN_EXTENDED\">\r\n            Digit type option: Use Eastern (Extended) Arabic-Indic digits (U+06f0...U+06f9).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.NO_MORE_TEXT\">\r\n            Signals that there is no more text available. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.NO_MORE_COLUMN\">\r\n            Signals that there is no more column. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.LINE_STATUS_OK\">\r\n            The column is valid. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.LINE_STATUS_OFFLIMITS\">\r\n            The line is out the column limits. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.LINE_STATUS_NOLINE\">\r\n            The line cannot fit this column position. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.maxY\">\r\n            Upper bound of the column. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.minY\">\r\n            Lower bound of the column. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.alignment\">\r\n            The column Element. Default is left Element. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.leftWall\">\r\n            The left column bound. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.rightWall\">\r\n            The right column bound. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.bidiLine\">\r\n            The chunks that form the text. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.yLine\">\r\n            The current y line location. Text will be written at this line minus the leading. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.lastX\">\r\n            The X position after the last line that has been written.\r\n            @since 5.0.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.currentLeading\">\r\n            The leading for the current line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.fixedLeading\">\r\n            The fixed text leading. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.multipliedLeading\">\r\n            The text leading that is multiplied by the biggest font size in the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.canvas\">\r\n            The <CODE>PdfContent</CODE> where the text will be written to. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.lineStatus\">\r\n            The line status when trying to fit a line to a column. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.indent\">\r\n            The first paragraph line indent. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.followingIndent\">\r\n            The following paragraph lines indent. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.rightIndent\">\r\n            The right paragraph lines indent. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.extraParagraphSpace\">\r\n            The extra space between paragraphs. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.rectangularWidth\">\r\n            The width of the line when the column is defined as a simple rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.spaceCharRatio\">\r\n            Holds value of property spaceCharRatio. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.linesWritten\">\r\n            Holds value of property linesWritten. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.arabicOptions\">\r\n            Holds value of property arabicOptions. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.rowIdx\">\r\n            Pointer for the row in a table that is being dealt with\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.splittedRow\">\r\n            The index of the last row that needed to be splitted.\r\n            @since 5.0.1 changed a boolean into an int\r\n            -2 value mean it is the first attempt to split the first row.\r\n            -1 means that we try to avoid splitting current row.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.useAscender\">\r\n            if true, first line height is adjusted so that the max ascender touches the top \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.inheritGraphicState\">\r\n            @since 5.4.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.#ctor(iTextSharp.text.pdf.PdfContentByte)\">\r\n            Creates a <CODE>ColumnText</CODE>.\r\n            @param text the place where the text will be written to. Can\r\n            be a template.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.Duplicate(iTextSharp.text.pdf.ColumnText)\">\r\n            Creates an independent duplicated of the instance <CODE>org</CODE>.\r\n            @param org the original <CODE>ColumnText</CODE>\r\n            @return the duplicated\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetACopy(iTextSharp.text.pdf.ColumnText)\">\r\n            Makes this instance an independent copy of <CODE>org</CODE>.\r\n            @param org the original <CODE>ColumnText</CODE>\r\n            @return itself\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.AddText(iTextSharp.text.Phrase)\">\r\n            Adds a <CODE>Phrase</CODE> to the current text array.\r\n            @param phrase the text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetText(iTextSharp.text.Phrase)\">\r\n            Replaces the current text array with this <CODE>Phrase</CODE>.\r\n            Anything added previously with AddElement() is lost.\r\n            @param phrase the text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.AddText(iTextSharp.text.Chunk)\">\r\n            Adds a <CODE>Chunk</CODE> to the current text array.\r\n            Will not have any effect if AddElement() was called before.\r\n            @param chunk the text\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.ColumnText.AddElement(iTextSharp.text.IElement)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.ColumnText.ConvertColumn(System.Single[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.FindLimitsPoint(System.Collections.Generic.List{System.Single[]})\">\r\n            Finds the intersection between the <CODE>yLine</CODE> and the column. It will\r\n            set the <CODE>lineStatus</CODE> apropriatly.\r\n            @param wall the column to intersect\r\n            @return the x coordinate of the intersection\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.FindLimitsOneLine\">\r\n            Finds the intersection between the <CODE>yLine</CODE> and the two\r\n            column bounds. It will set the <CODE>lineStatus</CODE> apropriatly.\r\n            @return a <CODE>float[2]</CODE>with the x coordinates of the intersection\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.FindLimitsTwoLines\">\r\n            Finds the intersection between the <CODE>yLine</CODE>,\r\n            the <CODE>yLine-leading</CODE>and the two\r\n            column bounds. It will set the <CODE>lineStatus</CODE> apropriatly.\r\n            @return a <CODE>float[4]</CODE>with the x coordinates of the intersection\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetColumns(System.Single[],System.Single[])\">\r\n            Sets the columns bounds. Each column bound is described by a\r\n            <CODE>float[]</CODE> with the line points [x1,y1,x2,y2,...].\r\n            The array must have at least 4 elements.\r\n            @param leftLine the left column bound\r\n            @param rightLine the right column bound\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetSimpleColumn(iTextSharp.text.Phrase,System.Single,System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n            Simplified method for rectangular columns.\r\n            @param phrase a <CODE>Phrase</CODE>\r\n            @param llx the lower left x corner\r\n            @param lly the lower left y corner\r\n            @param urx the upper right x corner\r\n            @param ury the upper right y corner\r\n            @param leading the leading\r\n            @param alignment the column alignment\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetSimpleColumn(System.Single,System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n            Simplified method for rectangular columns.\r\n            @param llx the lower left x corner\r\n            @param lly the lower left y corner\r\n            @param urx the upper right x corner\r\n            @param ury the upper right y corner\r\n            @param leading the leading\r\n            @param alignment the column alignment\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetSimpleColumn(System.Single,System.Single,System.Single,System.Single)\">\r\n            Simplified method for rectangular columns.\r\n            @param llx\r\n            @param lly\r\n            @param urx\r\n            @param ury\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetSimpleColumn(iTextSharp.text.Rectangle)\">\r\n            Simplified method for rectangular columns.\r\n            @param rect  the rectangle for the column\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetLeading(System.Single,System.Single)\">\r\n            Sets the leading fixed and variable. The resultant leading will be\r\n            fixedLeading+multipliedLeading*maxFontSize where maxFontSize is the\r\n            size of the bigest font in the line.\r\n            @param fixedLeading the fixed leading\r\n            @param multipliedLeading the variable leading\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.Leading\">\r\n            Gets the fixed leading\r\n            @return the leading\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.MultipliedLeading\">\r\n            Gets the variable leading\r\n            @return the leading\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.YLine\">\r\n            Gets the yLine.\r\n            @return the yLine\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.RowsDrawn\">\r\n            Gets the number of rows that were drawn when a table is involved.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.Alignment\">\r\n            Gets the Element.\r\n            @return the alignment\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.Indent\">\r\n            Gets the first paragraph line indent.\r\n            @return the indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.SetIndent(System.Single,System.Boolean)\">\r\n             Sets the first paragraph line indent.\r\n            \r\n             @param indent the indent\r\n             @param\trepeatFirstLineIndent\tdo we need to repeat the indentation of the first line after a newline?\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.FollowingIndent\">\r\n            Gets the following paragraph lines indent.\r\n            @return the indent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.RightIndent\">\r\n            Gets the right paragraph lines indent.\r\n            @return the indent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.CurrentLeading\">\r\n             Gets the currentLeading.\r\n            \r\n             @return the currentLeading\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.Go\">\r\n            Outputs the lines to the document. It is equivalent to <CODE>go(false)</CODE>.\r\n            @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>\r\n            and/or <CODE>NO_MORE_COLUMN</CODE>\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.Go(System.Boolean)\">\r\n            Outputs the lines to the document. The output can be simulated.\r\n            @param simulate <CODE>true</CODE> to simulate the writting to the document\r\n            @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>\r\n            and/or <CODE>NO_MORE_COLUMN</CODE>\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.IsWordSplit\">\r\n            Call this after go() to know if any word was split into several lines.\r\n            @return\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.ExtraParagraphSpace\">\r\n            Sets the extra space between paragraphs.\r\n            @return the extra space between paragraphs\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.ClearChunks\">\r\n            Clears the chunk array. A call to <CODE>go()</CODE> will always return\r\n            NO_MORE_TEXT.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.SpaceCharRatio\">\r\n            Gets the space/character extra spacing ratio for\r\n            fully justified text.\r\n            @return the space/character extra spacing ratio\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.RunDirection\">\r\n            Gets the run direction.\r\n            @return the run direction\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.LinesWritten\">\r\n            Gets the number of lines written.\r\n            @return the number of lines written\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.LastX\">\r\n            Gets the X position of the end of the last line that has been written\r\n            (will not work in simulation mode!).\r\n            @since 5.0.3\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.ArabicOptions\">\r\n            Sets the arabic shaping options. The option can be AR_NOVOWEL,\r\n            AR_COMPOSEDTASHKEEL and AR_LIG.\r\n            @param arabicOptions the arabic shaping options\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.Descender\">\r\n            Gets the biggest descender value of the last line written.\r\n            @return the biggest descender value of the last line written\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.GetWidth(iTextSharp.text.Phrase,System.Int32,System.Int32)\">\r\n            Gets the width that the line will occupy after writing.\r\n            Only the width of the first line is returned.\r\n            @param phrase the <CODE>Phrase</CODE> containing the line\r\n            @param runDirection the run direction\r\n            @param arabicOptions the options for the arabic shaping\r\n            @return the width of the line\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.GetWidth(iTextSharp.text.Phrase)\">\r\n            Gets the width that the line will occupy after writing.\r\n            Only the width of the first line is returned.\r\n            @param phrase the <CODE>Phrase</CODE> containing the line\r\n            @return the width of the line\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.ShowTextAligned(iTextSharp.text.pdf.PdfContentByte,System.Int32,iTextSharp.text.Phrase,System.Single,System.Single,System.Single,System.Int32,System.Int32)\">\r\n            Shows a line of text. Only the first line is written.\r\n            @param canvas where the text is to be written to\r\n            @param alignment the alignment. It is not influenced by the run direction\r\n            @param phrase the <CODE>Phrase</CODE> with the text\r\n            @param x the x reference position\r\n            @param y the y reference position\r\n            @param rotation the rotation to be applied in degrees counterclockwise\r\n            @param runDirection the run direction\r\n            @param arabicOptions the options for the arabic shaping\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.ShowTextAligned(iTextSharp.text.pdf.PdfContentByte,System.Int32,iTextSharp.text.Phrase,System.Single,System.Single,System.Single)\">\r\n            Shows a line of text. Only the first line is written.\r\n            @param canvas where the text is to be written to\r\n            @param alignment the alignment\r\n            @param phrase the <CODE>Phrase</CODE> with the text\r\n            @param x the x reference position\r\n            @param y the y reference position\r\n            @param rotation the rotation to be applied in degrees counterclockwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.FitText(iTextSharp.text.Font,System.String,iTextSharp.text.Rectangle,System.Single,System.Int32)\">\r\n            Fits the text to some rectangle adjusting the font size as needed.\r\n            @param font the font to use\r\n            @param text the text\r\n            @param rect the rectangle where the text must fit\r\n            @param maxFontSize the maximum font size\r\n            @param runDirection the run direction\r\n            @return the calculated font size that makes the text fit\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.Canvas\">\r\n            Sets the canvas.\r\n            @param canvas\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.Canvases\">\r\n            Sets the canvases.\r\n            @param canvas\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.ZeroHeightElement\">\r\n            Checks if the element has a height of 0.\r\n            @return true or false\r\n            @since 2.1.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.UseAscender\">\r\n            Enables/Disables adjustment of first line height based on max ascender.\r\n            @param use enable adjustment if true\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.HasMoreText(System.Int32)\">\r\n            Checks the status variable and looks if there's still some text.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.ColumnText.filledWidth\">\r\n            Holds value of property filledWidth.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.FilledWidth\">\r\n            Sets the real width used by the largest line. Only used to set it\r\n            to zero to start another measurement.\r\n            @param filledWidth the real width used by the largest line\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ColumnText.UpdateFilledWidth(System.Single)\">\r\n            Replaces the <CODE>filledWidth</CODE> if greater than the existing one.\r\n            @param w the new <CODE>filledWidth</CODE> if greater than the existing one\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.ColumnText.AdjustFirstLine\">\r\n            Sets the first line adjustment. Some objects have properties, like spacing before, that\r\n            behave differently if the object is the first to be written after go() or not. The first line adjustment is \r\n            <CODE>true</CODE> by default but can be changed if several objects are to be placed one\r\n            after the other in the same column calling go() several times.\r\n            @param adjustFirstLine <CODE>true</CODE> to adjust the first line, <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.crypto.AESCipherCBCnoPad\">\r\n            Creates an AES Cipher with CBC and no padding.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.AESCipherCBCnoPad.#ctor(System.Boolean,System.Byte[])\">\r\n            Creates a new instance of AESCipher \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.ARCFOUREncryption.#ctor\">\r\n            Creates a new instance of ARCFOUREncryption \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.crypto.IVGenerator\">\r\n            An initialization vector generator for a CBC block encryption. It's a random generator based on RC4.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.IVGenerator.#ctor\">\r\n            Creates a new instance of IVGenerator \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.IVGenerator.GetIV\">\r\n            Gets a 16 byte random initialization vector.\r\n            @return a 16 byte random initialization vector\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.IVGenerator.GetIV(System.Int32)\">\r\n            Gets a random initialization vector.\r\n            @param len the length of the initialization vector\r\n            @return a random initialization vector\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.StandardDecryption.#ctor(System.Byte[],System.Int32,System.Int32,System.Int32)\">\r\n            Creates a new instance of StandardDecryption \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.crypto.AESCipher\">\r\n            Creates an AES Cipher with CBC and padding PKCS5/7.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.crypto.AESCipher.#ctor(System.Boolean,System.Byte[],System.Byte[])\">\r\n            Creates a new instance of AESCipher \r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.DefaultSplitCharacter”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.DefaultSplitCharacter.DEFAULT\">\r\n            An instance of the default SplitCharacter.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DefaultSplitCharacter.#ctor\">\r\n            Default constructor, has no custom characters to check.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DefaultSplitCharacter.#ctor(System.Char)\">\r\n             Constructor with one splittable character.\r\n            \r\n             @param character char\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DefaultSplitCharacter.#ctor(System.Char[])\">\r\n             Constructor with an array of splittable characters\r\n            \r\n             @param characters char[]\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.DefaultSplitCharacter.IsSplitCharacter(System.Int32,System.Int32,System.Int32,System.Char[],iTextSharp.text.pdf.PdfChunk[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.DefaultSplitCharacter.GetCurrentCharacter(System.Int32,System.Char[],iTextSharp.text.pdf.PdfChunk[])\">\r\n             Returns the current character\r\n            \r\n             @param current current position in the array\r\n             @param ck      chunk array\r\n             @param cc      the character array that has to be checked\r\n             @return the current character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.#ctor(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Creates a new instance of DocumentFont \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.#ctor(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Creates a new instance of DocumentFont \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.#ctor(iTextSharp.text.pdf.PRIndirectReference,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Creates a new instance of DocumentFont \r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.DocumentFont.FamilyFontName”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.GetFontDescriptor(System.Int32,System.Single)\">\r\n            Gets the font parameter identified by <CODE>key</CODE>. Valid values\r\n             for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,\r\n             <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>\r\n             and <CODE>BBOXURY</CODE>.\r\n             @param key the parameter to be extracted\r\n             @param fontSize the font size in points\r\n             @return the parameter in points\r\n            \r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.DocumentFont.FullFontName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.DocumentFont.AllNameEntries”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.GetKerning(System.Int32,System.Int32)\">\r\n            Gets the kerning between two Unicode chars.\r\n             @param char1 the first char\r\n             @param char2 the second char\r\n             @return the kerning to be applied\r\n            \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.DocumentFont.PostscriptFontName\">\r\n            Gets the postscript font name.\r\n             @return the postscript font name\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.GetRawWidth(System.Int32,System.String)\">\r\n            Gets the width from the font according to the Unicode char <CODE>c</CODE>\r\n             or the <CODE>name</CODE>. If the <CODE>name</CODE> is null it's a symbolic font.\r\n             @param c the unicode char\r\n             @param name the glyph name\r\n             @return the width of the char\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.HasKernPairs\">\r\n            Checks if the font has any kerning pairs.\r\n             @return <CODE>true</CODE> if the font has any kerning pairs\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.WriteFont(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfIndirectReference,System.Object[])\">\r\n            Outputs to the writer the font dictionaries and streams.\r\n             @param writer the writer for this document\r\n             @param ref the font indirect reference\r\n             @param params several parameters that depend on the font type\r\n             @throws IOException on error\r\n             @throws DocumentException error in generating the object\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.GetFullFontStream\">\r\n            Always returns null.\r\n            @return  null\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.DocumentFont.GetWidth(System.Int32)\">\r\n            Gets the width of a <CODE>char</CODE> in normalized 1000 units.\r\n            @param char1 the unicode <CODE>char</CODE> to get the width of\r\n            @return the width in normalized 1000 units\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.DocumentFont.Uni2Byte\">\r\n            Exposes the unicode - > CID map that is constructed from the font's encoding\r\n            @return the unicode to CID map\r\n            @since 2.1.7\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.DocumentFont.Byte2Uni\">\r\n            Exposes the CID - > unicode map that is constructed from the font's encoding\r\n            @return the CID to unicode map\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.DocumentFont.Diffmap\">\r\n            Gets the difference map\r\n            @return the difference map\r\n            @since 5.0.5\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.draw.DottedLineSeparator\">\r\n            Element that draws a dotted line from left to right.\r\n            Can be added directly to a document or column.\r\n            Can also be used to create a separator chunk.\r\n            @since   2.1.2 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.DottedLineSeparator.gap\">\r\n            the gap between the dots. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.DottedLineSeparator.Draw(iTextSharp.text.pdf.PdfContentByte,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.draw.DrawInterface#draw(com.lowagie.text.pdf.PdfContentByte, float, float, float, float, float)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.DottedLineSeparator.Gap\">\r\n            Setter for the gap between the center of the dots of the dotted line.\r\n            @param   gap the gap between the center of the dots\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.draw.IDrawInterface\">\r\n            Interface for an Element that allows you to draw something at the current\r\n            vertical position. Trivial implementations are LineSeparator and VerticalPositionMark.\r\n            It is also used to define what has to be drawn by a separator chunk.\r\n            @since 2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.IDrawInterface.Draw(iTextSharp.text.pdf.PdfContentByte,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implement this method if you want to draw something at the current Y position\r\n            (for instance a line).\r\n            @param   canvas  the canvas on which you can draw\r\n            @param   llx     the x coordinate of the left page margin\r\n            @param   lly     the y coordinate of the bottom page margin\r\n            @param   urx     the x coordinate of the right page margin\r\n            @param   ury     the y coordinate of the top page margin\r\n            @param   y       the current y position on the page\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.draw.LineSeparator\">\r\n            Element that draws a solid line from left to right.\r\n            Can be added directly to a document or column.\r\n            Can also be used to create a separator chunk.\r\n            @author   Paulo Soares\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.LineSeparator.lineWidth\">\r\n            The thickness of the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.LineSeparator.percentage\">\r\n            The width of the line as a percentage of the available page width. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.LineSeparator.lineColor\">\r\n            The color of the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.LineSeparator.alignment\">\r\n            The alignment of the line. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.LineSeparator.#ctor(System.Single,System.Single,iTextSharp.text.BaseColor,System.Int32,System.Single)\">\r\n            Creates a new instance of the LineSeparator class.\r\n            @param lineWidth      the thickness of the line\r\n            @param percentage the width of the line as a percentage of the available page width\r\n            @param color          the color of the line\r\n            @param align          the alignment\r\n            @param offset     the offset of the line relative to the current baseline (negative = under the baseline)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.LineSeparator.#ctor(iTextSharp.text.Font)\">\r\n            Creates a new instance of the LineSeparator class.\r\n            @param font\t\t\tthe font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.LineSeparator.#ctor\">\r\n            Creates a new instance of the LineSeparator class with\r\n            default values: lineWidth 1 user unit, width 100%, centered with offset 0.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.LineSeparator.Draw(iTextSharp.text.pdf.PdfContentByte,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.draw.DrawInterface#draw(com.lowagie.text.pdf.PdfContentByte, float, float, float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.LineSeparator.DrawLine(iTextSharp.text.pdf.PdfContentByte,System.Single,System.Single,System.Single)\">\r\n            Draws a horizontal line.\r\n            @param canvas the canvas to draw on\r\n            @param leftX      the left x coordinate\r\n            @param rightX the right x coordindate\r\n            @param y          the y coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.LineSeparator.LineWidth\">\r\n            Setter for the line width.\r\n            @param lineWidth  the thickness of the line that will be drawn.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.LineSeparator.Percentage\">\r\n            Setter for the width as a percentage of the available width.\r\n            @return   a width percentage\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.LineSeparator.LineColor\">\r\n            Setter for the color of the line that will be drawn.\r\n            @param color  a color\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.LineSeparator.Alignment\">\r\n            Setter for the alignment of the line.\r\n            @param align  an alignment value\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.draw.VerticalPositionMark\">\r\n            Helper class implementing the DrawInterface. Can be used to add\r\n            horizontal or vertical separators. Won't draw anything unless\r\n            you implement the draw method.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.VerticalPositionMark.drawInterface\">\r\n            Another implementation of the DrawInterface; its draw method will overrule LineSeparator.Draw(). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.draw.VerticalPositionMark.offset\">\r\n            The offset for the line. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.VerticalPositionMark.#ctor\">\r\n            Creates a vertical position mark that won't draw anything unless\r\n            you define a DrawInterface.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.VerticalPositionMark.#ctor(iTextSharp.text.pdf.draw.IDrawInterface,System.Single)\">\r\n            Creates a vertical position mark that won't draw anything unless\r\n            you define a DrawInterface.\r\n            @param   drawInterface   the drawInterface for this vertical position mark.\r\n            @param   offset          the offset for this vertical position mark.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.VerticalPositionMark.Draw(iTextSharp.text.pdf.PdfContentByte,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.draw.DrawInterface#draw(com.lowagie.text.pdf.PdfContentByte, float, float, float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.VerticalPositionMark.Process(iTextSharp.text.IElementListener)\">\r\n            @see com.lowagie.text.Element#process(com.lowagie.text.ElementListener)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.VerticalPositionMark.Type\">\r\n            @see com.lowagie.text.Element#type()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.VerticalPositionMark.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.draw.VerticalPositionMark.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.VerticalPositionMark.Chunks\">\r\n            @see com.lowagie.text.Element#getChunks()\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.VerticalPositionMark.DrawInterface\">\r\n            Setter for the interface with the overruling Draw() method.\r\n            @param drawInterface a DrawInterface implementation\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.draw.VerticalPositionMark.Offset\">\r\n            Setter for the offset. The offset is relative to the current\r\n            Y position. If you want to underline something, you have to\r\n            choose a negative offset.\r\n            @param offset    an offset\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.EnumerateTTC\">\r\n            Enumerates all the fonts inside a True Type Collection.\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.events.FieldPositioningEvents\">\r\n            Class for an index.\r\n            \r\n            @author Michael Niedermair\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.FieldPositioningEvents.genericChunkFields\">\r\n            Keeps a map with fields that are to be positioned in inGenericTag.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.FieldPositioningEvents.cellField\">\r\n            Keeps the form field that is to be positioned in a cellLayout event.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.FieldPositioningEvents.fieldWriter\">\r\n            The PdfWriter to use when a field has to added in a cell event. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.FieldPositioningEvents.parent\">\r\n            The PdfFormField that is the parent of the field added in a cell event. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.#ctor\">\r\n            Creates a new event. This constructor will be used if you need to position fields with Chunk objects. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.FieldPositioningEvents.padding\">\r\n            Some extra padding that will be taken into account when defining the widget. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.AddField(System.String,iTextSharp.text.pdf.PdfFormField)\">\r\n            Add a PdfFormField that has to be tied to a generic Chunk.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfFormField)\">\r\n            Creates a new event. This constructor will be used if you need to position fields with a Cell Event. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.#ctor(iTextSharp.text.pdf.PdfFormField,iTextSharp.text.pdf.PdfFormField)\">\r\n            Creates a new event. This constructor will be used if you need to position fields with a Cell Event. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.#ctor(iTextSharp.text.pdf.PdfWriter,System.String)\">\r\n            Creates a new event. This constructor will be used if you need to position fields with a Cell Event. \r\n            @throws DocumentException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfFormField,System.String)\">\r\n            Creates a new event. This constructor will be used if you need to position fields with a Cell Event. \r\n            @throws DocumentException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.events.FieldPositioningEvents.Padding\">\r\n            @param padding The padding to set.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.events.FieldPositioningEvents.Parent\">\r\n            @param parent The parent to set.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.OnGenericTag(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,iTextSharp.text.Rectangle,System.String)\">\r\n            @see com.lowagie.text.pdf.PdfPageEvent#onGenericTag(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document, com.lowagie.text.Rectangle, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.FieldPositioningEvents.CellLayout(iTextSharp.text.pdf.PdfPCell,iTextSharp.text.Rectangle,iTextSharp.text.pdf.PdfContentByte[])\">\r\n            @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[])\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.events.IndexEvents\">\r\n            Class for an index.\r\n            \r\n            @author Michael Niedermair\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.indextag\">\r\n            keeps the indextag with the pagenumber\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.OnGenericTag(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,iTextSharp.text.Rectangle,System.String)\">\r\n            All the text that is passed to this event, gets registered in the indexentry.\r\n            \r\n            @see com.lowagie.text.pdf.PdfPageEventHelper#onGenericTag(\r\n                 com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document,\r\n                 com.lowagie.text.Rectangle, java.lang.String)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.indexcounter\">\r\n            indexcounter\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.indexentry\">\r\n            the list for the index entry\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Create(System.String,System.String,System.String,System.String)\">\r\n             Create an index entry.\r\n            \r\n             @param text  The text for the Chunk.\r\n             @param in1   The first level.\r\n             @param in2   The second level.\r\n             @param in3   The third level.\r\n             @return Returns the Chunk.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Create(System.String,System.String)\">\r\n             Create an index entry.\r\n            \r\n             @param text  The text for the Chunk.\r\n             @param in1   The first level.\r\n             @return Returns the Chunk.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Create(System.String,System.String,System.String)\">\r\n             Create an index entry.\r\n            \r\n             @param text  The text for the Chunk.\r\n             @param in1   The first level.\r\n             @param in2   The second level.\r\n             @return Returns the Chunk.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Create(iTextSharp.text.Chunk,System.String,System.String,System.String)\">\r\n             Create an index entry.\r\n            \r\n             @param text  The text.\r\n             @param in1   The first level.\r\n             @param in2   The second level.\r\n             @param in3   The third level.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Create(iTextSharp.text.Chunk,System.String)\">\r\n             Create an index entry.\r\n            \r\n             @param text  The text.\r\n             @param in1   The first level.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Create(iTextSharp.text.Chunk,System.String,System.String)\">\r\n             Create an index entry.\r\n            \r\n             @param text  The text.\r\n             @param in1   The first level.\r\n             @param in2   The second level.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.comparator\">\r\n            Comparator for sorting the index\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.SetComparator(System.Collections.Generic.IComparer{iTextSharp.text.pdf.events.IndexEvents.Entry})\">\r\n            Set the comparator.\r\n            @param aComparator The comparator to set.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.GetSortedEntries\">\r\n            Returns the sorted list with the entries and the collected page numbers.\r\n            @return Returns the sorted list with the entries and teh collected page numbers.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.events.IndexEvents.Entry\">\r\n            Class for an index entry.\r\n            <p>\r\n            In the first step, only in1, in2,in3 and tag are used.\r\n            After the collections of the index entries, pagenumbers are used.\r\n            </p>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.Entry.in1\">\r\n            first level\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.Entry.in2\">\r\n            second level\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.Entry.in3\">\r\n            third level\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.Entry.tag\">\r\n            the tag\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.Entry.pagenumbers\">\r\n            the lsit of all page numbers.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.IndexEvents.Entry.tags\">\r\n            the lsit of all tags.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.#ctor(System.String,System.String,System.String,System.String,iTextSharp.text.pdf.events.IndexEvents)\">\r\n            Create a new object.\r\n            @param aIn1   The first level.\r\n            @param aIn2   The second level.\r\n            @param aIn3   The third level.\r\n            @param aTag   The tag.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetIn1\">\r\n            Returns the in1.\r\n            @return Returns the in1.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetIn2\">\r\n            Returns the in2.\r\n            @return Returns the in2.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetIn3\">\r\n            Returns the in3.\r\n            @return Returns the in3.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetTag\">\r\n            Returns the tag.\r\n            @return Returns the tag.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetPageNumber\">\r\n            Returns the pagenumer for this entry.\r\n            @return Returns the pagenumer for this entry.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.AddPageNumberAndTag(System.Int32,System.String)\">\r\n            Add a pagenumber.\r\n            @param number    The page number.\r\n            @param tag\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetKey\">\r\n            Returns the key for the map-entry.\r\n            @return Returns the key for the map-entry.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetPagenumbers\">\r\n            Returns the pagenumbers.\r\n            @return Returns the pagenumbers.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.GetTags\">\r\n            Returns the tags.\r\n            @return Returns the tags.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.IndexEvents.Entry.ToString\">\r\n            print the entry (only for test)\r\n            @return the toString implementation of the entry\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.events.PdfPageEventForwarder\">\r\n            If you want to add more than one page eventa to a PdfWriter,\r\n            you have to construct a PdfPageEventForwarder, add the\r\n            different events to this object and add the forwarder to\r\n            the PdfWriter.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.PdfPageEventForwarder.events\">\r\n            ArrayList containing all the PageEvents that have to be executed. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPageEventForwarder.AddPageEvent(iTextSharp.text.pdf.IPdfPageEvent)\">\r\n            Add a page eventa to the forwarder.\r\n            @param eventa an eventa that has to be added to the forwarder.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnOpenDocument(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n            Called when the document is opened.\r\n            \r\n            @param writer\r\n                       the <CODE>PdfWriter</CODE> for this document\r\n            @param document\r\n                       the document\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnStartPage(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnEndPage(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n            Called when a page is finished, just before being written to the\r\n            document.\r\n            \r\n            @param writer\r\n                       the <CODE>PdfWriter</CODE> for this document\r\n            @param document\r\n                       the document\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnCloseDocument(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnParagraph(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnParagraphEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnChapter(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnChapterEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnSection(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single,System.Int32,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnSectionEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.events.PdfPageEventForwarder.OnGenericTag(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,iTextSharp.text.Rectangle,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.events.PdfPCellEventForwarder\">\r\n            If you want to add more than one event to a cell,\r\n            you have to construct a PdfPCellEventForwarder, add the\r\n            different events to this object and add the forwarder to\r\n            the PdfPCell.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.PdfPCellEventForwarder.events\">\r\n            ArrayList containing all the PageEvents that have to be executed. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPCellEventForwarder.AddCellEvent(iTextSharp.text.pdf.IPdfPCellEvent)\">\r\n            Add a page event to the forwarder.\r\n            @param event an event that has to be added to the forwarder.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPCellEventForwarder.CellLayout(iTextSharp.text.pdf.PdfPCell,iTextSharp.text.Rectangle,iTextSharp.text.pdf.PdfContentByte[])\">\r\n            @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[])\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.events.PdfPTableEventForwarder\">\r\n            If you want to add more than one page event to a PdfPTable,\r\n            you have to construct a PdfPTableEventForwarder, add the\r\n            different events to this object and add the forwarder to\r\n            the PdfWriter.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.events.PdfPTableEventForwarder.events\">\r\n            ArrayList containing all the PageEvents that have to be executed. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPTableEventForwarder.AddTableEvent(iTextSharp.text.pdf.IPdfPTableEvent)\">\r\n            Add a page event to the forwarder.\r\n            @param event an event that has to be added to the forwarder.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPTableEventForwarder.TableLayout(iTextSharp.text.pdf.PdfPTable,System.Single[][],System.Single[],System.Int32,System.Int32,iTextSharp.text.pdf.PdfContentByte[])\">\r\n            @see com.lowagie.text.pdf.PdfPTableEvent#tableLayout(com.lowagie.text.pdf.PdfPTable, float[][], float[], int, int, com.lowagie.text.pdf.PdfContentByte[])\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.events.PdfPTableEventForwarder.AfterSplitTable(iTextSharp.text.pdf.PdfPTable,iTextSharp.text.pdf.PdfPRow,System.Int32)\">\r\n            @see com.itextpdf.text.pdf.PdfPTableEventAfterSplit#afterSplitTable(com.itextpdf.text.pdf.PdfPTable, com.itextpdf.text.pdf.PdfPRow, int)\r\n            @since iText 5.4.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.ExtendedColor\">\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.ExtendedColor.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            Constructs an extended color of a certain type and a certain color.\r\n            @param type\r\n            @param red\r\n            @param green\r\n            @param blue\r\n            @param alpha\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FdfReader\">\r\n            Reads an FDF form and makes the fields available\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.#ctor(System.String)\">\r\n            Reads an FDF form.\r\n            @param filename the file name of the form\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.#ctor(System.Byte[])\">\r\n            Reads an FDF form.\r\n            @param pdfIn the byte array with the form\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.#ctor(System.Uri)\">\r\n            Reads an FDF form.\r\n            @param url the URL of the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.#ctor(System.IO.Stream)\">\r\n            Reads an FDF form.\r\n            @param is the <CODE>InputStream</CODE> containing the document. The stream is read to the\r\n            end but is not closed\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FdfReader.Fields\">\r\n            Gets all the fields. The map is keyed by the fully qualified\r\n            field name and the value is a merged <CODE>PdfDictionary</CODE>\r\n            with the field content.\r\n            @return all the fields\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.GetField(System.String)\">\r\n            Gets the field dictionary.\r\n            @param name the fully qualified field name\r\n            @return the field dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.GetAttachedFile(System.String)\">\r\n            Gets a byte[] containing a file that is embedded in the FDF.\r\n            @param name the fully qualified field name\r\n            @return the bytes of the file\r\n            @throws IOException \r\n            @since 5.0.1 \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfReader.GetFieldValue(System.String)\">\r\n            Gets the field value or <CODE>null</CODE> if the field does not\r\n            exist or has no value defined.\r\n            @param name the fully qualified field name\r\n            @return the field value or <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FdfReader.FileSpec\">\r\n            Gets the PDF file specification contained in the FDF.\r\n            @return the PDF file specification contained in the FDF\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FdfWriter\">\r\n            Writes an FDF form.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FdfWriter.file\">\r\n            The PDF file associated with the FDF. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.#ctor\">\r\n            Creates a new FdfWriter. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.WriteTo(System.IO.Stream)\">\r\n            Writes the content to a stream.\r\n            @param os the stream\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.RemoveField(System.String)\">\r\n            Removes the field value.\r\n            @param field the field name\r\n            @return <CODE>true</CODE> if the field was found and removed,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.GetFields\">\r\n            Gets all the fields. The map is keyed by the fully qualified\r\n            field name and the values are <CODE>PdfObject</CODE>.\r\n            @return a map with all the fields\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.GetField(System.String)\">\r\n            Gets the field value.\r\n            @param field the field name\r\n            @return the field value or <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.SetFieldAsName(System.String,System.String)\">\r\n            Sets the field value as a name.\r\n            @param field the fully qualified field name\r\n            @param value the value\r\n            @return <CODE>true</CODE> if the value was inserted,\r\n            <CODE>false</CODE> if the name is incompatible with\r\n            an existing field\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.SetFieldAsString(System.String,System.String)\">\r\n            Sets the field value as a string.\r\n            @param field the fully qualified field name\r\n            @param value the value\r\n            @return <CODE>true</CODE> if the value was inserted,\r\n            <CODE>false</CODE> if the name is incompatible with\r\n            an existing field\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.SetFieldAsAction(System.String,iTextSharp.text.pdf.PdfAction)\">\r\n            Sets the field value as a <CODE>PDFAction</CODE>. \r\n            For example, this method allows setting a form submit button action using {@link PdfAction#createSubmitForm(String, Object[], int)}.\r\n            This method creates an <CODE>A</CODE> entry for the specified field in the underlying FDF file.\r\n            Method contributed by Philippe Laflamme (plaflamme)\r\n            @param field the fully qualified field name\r\n            @param action the field's action\r\n            @return <CODE>true</CODE> if the value was inserted,\r\n            <CODE>false</CODE> if the name is incompatible with\r\n            an existing field\r\n            @since\t2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.SetFields(iTextSharp.text.pdf.FdfReader)\">\r\n            Sets all the fields from this <CODE>FdfReader</CODE>\r\n            @param fdf the <CODE>FdfReader</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.SetFields(iTextSharp.text.pdf.PdfReader)\">\r\n            Sets all the fields from this <CODE>PdfReader</CODE>\r\n            @param pdf the <CODE>PdfReader</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FdfWriter.SetFields(iTextSharp.text.pdf.AcroFields)\">\r\n            Sets all the fields from this <CODE>AcroFields</CODE>\r\n            @param acro the <CODE>AcroFields</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FdfWriter.File\">\r\n            Gets the PDF file name associated with the FDF.\r\n            @return the PDF file name associated with the FDF\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FontDetails\">\r\n            Each font in the document will have an instance of this class\r\n             where the characters used will be represented.\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.indirectReference\">\r\n            The indirect reference to this font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.fontName\">\r\n            The font name that appears in the document body stream\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.baseFont\">\r\n            The font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.ttu\">\r\n            The font if its an instance of <CODE>TrueTypeFontUnicode</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.shortTag\">\r\n            The array used with single byte encodings\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.longTag\">\r\n            The map used with double byte encodings. The key is Int(glyph) and the\r\n            value is int[]{glyph, width, Unicode code}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.fontType\">\r\n            The font type\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.symbolic\">\r\n            <CODE>true</CODE> if the font is symbolic\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FontDetails.subset\">\r\n            Indicates if all the glyphs and widths for that particular\r\n            encoding should be included in the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FontDetails.#ctor(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.BaseFont)\">\r\n            Each font used in a document has an instance of this class.\r\n            This class stores the characters used in the document and other\r\n            specifics unique to the current working document.\r\n            @param fontName the font name\r\n            @param indirectReference the indirect reference to the font\r\n            @param baseFont the <CODE>BaseFont</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FontDetails.IndirectReference\">\r\n            Gets the indirect reference to this font.\r\n            @return the indirect reference to this font\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FontDetails.FontName\">\r\n            Gets the font name as it appears in the document body.\r\n            @return the font name\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FontDetails.BaseFont\">\r\n            Gets the <CODE>BaseFont</CODE> of this font.\r\n            @return the <CODE>BaseFont</CODE> of this font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FontDetails.ConvertToBytes(System.String)\">\r\n            Converts the text into bytes to be placed in the document.\r\n            The conversion is done according to the font and the encoding and the characters\r\n            used are stored.\r\n            @param text the text to convert\r\n            @return the conversion\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FontDetails.WriteFont(iTextSharp.text.pdf.PdfWriter)\">\r\n            Writes the font definition to the document.\r\n            @param writer the <CODE>PdfWriter</CODE> of this document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.FontDetails.Subset\">\r\n            Indicates if all the glyphs and widths for that particular\r\n            encoding should be included in the document. Set to <CODE>false</CODE>\r\n            to include all.\r\n            @param subset new value of property subset\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.FontSelector”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.FontSelector.AddFont(iTextSharp.text.Font)\">\r\n            Adds a <CODE>Font</CODE> to be searched for valid characters.\r\n            @param font the <CODE>Font</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FontSelector.Process(System.String)\">\r\n            Process the text so that it will render with a combination of fonts\r\n            if needed.\r\n            @param text the text\r\n            @return a <CODE>Phrase</CODE> with one or more chunks\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.GrayColor\">\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.HyphenationAuto\">\r\n            Hyphenates words automatically accordingly to the language and country.\r\n             The hyphenator engine was taken from FOP and uses the TEX patterns. If a language\r\n             is not provided and a TEX pattern for it exists, it can be easily adapted.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.HyphenationAuto.hyphenator\">\r\n            The hyphenator engine.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.HyphenationAuto.post\">\r\n            The second part of the hyphenated word.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.HyphenationAuto.#ctor(System.String,System.String,System.Int32,System.Int32)\">\r\n            Creates a new hyphenation instance usable in <CODE>Chunk</CODE>.\r\n            @param lang the language (\"en\" for english, for example)\r\n            @param country the country (\"GB\" for Great-Britain or \"none\" for no country, for example)\r\n            @param leftMin the minimun number of letters before the hyphen\r\n            @param rightMin the minimun number of letters after the hyphen\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.HyphenationAuto.HyphenSymbol\">\r\n            Gets the hyphen symbol.\r\n            @return the hyphen symbol\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.HyphenationAuto.GetHyphenatedWordPre(System.String,iTextSharp.text.pdf.BaseFont,System.Single,System.Single)\">\r\n            Hyphenates a word and returns the first part of it. To get\r\n            the second part of the hyphenated word call <CODE>getHyphenatedWordPost()</CODE>.\r\n            @param word the word to hyphenate\r\n            @param font the font used by this word\r\n            @param fontSize the font size used by this word\r\n            @param remainingWidth the width available to fit this word in\r\n            @return the first part of the hyphenated word including\r\n            the hyphen symbol, if any\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.HyphenationAuto.HyphenatedWordPost\">\r\n            Gets the second part of the hyphenated word. Must be called\r\n            after <CODE>getHyphenatedWordPre()</CODE>.\r\n            @return the second part of the hyphenated word\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.ByteVector”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.ByteVector.DEFAULT_BLOCK_SIZE\">\r\n            Capacity increment size\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.ByteVector.arr\">\r\n            The encapsulated array\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.ByteVector.n\">\r\n            Points to next free item\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.hyphenation.ByteVector.Length\">\r\n            return number of items in array\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.hyphenation.ByteVector.Capacity\">\r\n            returns current capacity of array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.ByteVector.Alloc(System.Int32)\">\r\n            This is to implement memory allocation in the array. Like Malloc().\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.CharVector”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.CharVector.DEFAULT_BLOCK_SIZE\">\r\n            Capacity increment size\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.CharVector.array\">\r\n            The encapsulated array\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.CharVector.n\">\r\n            Points to next free item\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.CharVector.Clear\">\r\n            Reset Vector but don't resize or clear elements\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.hyphenation.CharVector.Length\">\r\n            return number of items in array\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.hyphenation.CharVector.Capacity\">\r\n            returns current capacity of array\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.Hyphen”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.Hyphenation”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.Hyphenation.len\">\r\n            number of hyphenation points in word\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenation.#ctor(System.String,System.Int32[])\">\r\n            rawWord as made of alternating strings and {@link Hyphen Hyphen}\r\n            instances\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.hyphenation.Hyphenation.Length\">\r\n            @return the number of hyphenation points in the word\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenation.GetPreHyphenText(System.Int32)\">\r\n            @return the pre-break text, not including the hyphen character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenation.GetPostHyphenText(System.Int32)\">\r\n            @return the post-break text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.hyphenation.Hyphenation.HyphenationPoints\">\r\n            @return the hyphenation points\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.HyphenationException”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.HyphenationTree”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.HyphenationTree.vspace\">\r\n            value space: stores the inteletter values\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.HyphenationTree.stoplist\">\r\n            This map stores hyphenation exceptions\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.HyphenationTree.classmap\">\r\n            This map stores the character classes\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.HyphenationTree.ivalues\">\r\n            Temporary map to store interletter values on pattern loading.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.PackValues(System.String)\">\r\n            Packs the values by storing them in 4 bits, two values into a byte\r\n            Values range is from 0 to 9. We use zero as terminator,\r\n            so we'll add 1 to the value.\r\n            @param values a string of digits from '0' to '9' representing the\r\n            interletter values.\r\n            @return the index into the vspace array where the packed values\r\n            are stored.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.Hstrcmp(System.Char[],System.Int32,System.Char[],System.Int32)\">\r\n            String compare, returns 0 if equal or\r\n            t is a substring of s\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.hyphenation.HyphenationTree.SearchPatterns(System.Char[],System.Int32,System.Byte[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.Hyphenate(System.String,System.Int32,System.Int32)\">\r\n            Hyphenate word and return a Hyphenation object.\r\n            @param word the word to be hyphenated\r\n            @param remainCharCount Minimum number of characters allowed\r\n            before the hyphenation point.\r\n            @param pushCharCount Minimum number of characters allowed after\r\n            the hyphenation point.\r\n            @return a {@link Hyphenation Hyphenation} object representing\r\n            the hyphenated word or null if word is not hyphenated.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.Hyphenate(System.Char[],System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            w = \"****nnllllllnnn*****\",\r\n            where n is a non-letter, l is a letter,\r\n            all n may be absent, the first n is at offset,\r\n            the first l is at offset + iIgnoreAtBeginning;\r\n            word = \".llllll.'\\0'***\",\r\n            where all l in w are copied into word.\r\n            In the first part of the routine len = w.length,\r\n            in the second part of the routine len = word.length.\r\n            Three indices are used:\r\n            Index(w), the index in w,\r\n            Index(word), the index in word,\r\n            Letterindex(word), the index in the letter part of word.\r\n            The following relations exist:\r\n            Index(w) = offset + i - 1\r\n            Index(word) = i - iIgnoreAtBeginning\r\n            Letterindex(word) = Index(word) - 1\r\n            (see first loop).\r\n            It follows that:\r\n            Index(w) - Index(word) = offset - 1 + iIgnoreAtBeginning\r\n            Index(w) = Letterindex(word) + offset + iIgnoreAtBeginning\r\n            Hyphenate word and return an array of hyphenation points.\r\n            @param w char array that contains the word\r\n            @param offset Offset to first character in word\r\n            @param len Length of word\r\n            @param remainCharCount Minimum number of characters allowed\r\n            before the hyphenation point.\r\n            @param pushCharCount Minimum number of characters allowed after\r\n            the hyphenation point.\r\n            @return a {@link Hyphenation Hyphenation} object representing\r\n            the hyphenated word or null if word is not hyphenated.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.AddClass(System.String)\">\r\n            Add a character class to the tree. It is used by\r\n            {@link SimplePatternParser SimplePatternParser} as callback to\r\n            add character classes. Character classes define the\r\n            valid word characters for hyphenation. If a word contains\r\n            a character not defined in any of the classes, it is not hyphenated.\r\n            It also defines a way to normalize the characters in order\r\n            to compare them with the stored patterns. Usually pattern\r\n            files use only lower case characters, in this case a class\r\n            for letter 'a', for example, should be defined as \"aA\", the first\r\n            character being the normalization char.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.AddException(System.String,System.Collections.Generic.List{System.Object})\">\r\n            Add an exception to the tree. It is used by\r\n            {@link SimplePatternParser SimplePatternParser} class as callback to\r\n            store the hyphenation exceptions.\r\n            @param word normalized word\r\n            @param hyphenatedword a vector of alternating strings and\r\n            {@link Hyphen hyphen} objects.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.HyphenationTree.AddPattern(System.String,System.String)\">\r\n            Add a pattern to the tree. Mainly, to be used by\r\n            {@link SimplePatternParser SimplePatternParser} class as callback to\r\n            add a pattern to the tree.\r\n            @param pattern the hyphenation pattern\r\n            @param ivalue interletter weight values indicating the\r\n            desirability and priority of hyphenating at a given point\r\n            within the pattern. It should contain only digit characters.\r\n            (i.e. '0' to '9').\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.Hyphenator”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.Hyphenator.hyphenTrees\">\r\n            TODO: Don't use statics \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.#ctor(System.String,System.String,System.Int32,System.Int32)\">\r\n            @param lang\r\n            @param country\r\n            @param leftMin\r\n            @param rightMin\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.GetHyphenationTree(System.String,System.String)\">\r\n            @param lang\r\n            @param country\r\n            @return the hyphenation tree\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.GetResourceHyphenationTree(System.String)\">\r\n            @param key\r\n            @return a hyphenation tree\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.Hyphenate(System.String,System.String,System.String,System.Int32,System.Int32)\">\r\n            @param lang\r\n            @param country\r\n            @param word\r\n            @param leftMin\r\n            @param rightMin\r\n            @return a hyphenation object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.Hyphenate(System.String,System.String,System.Char[],System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            @param lang\r\n            @param country\r\n            @param word\r\n            @param offset\r\n            @param len\r\n            @param leftMin\r\n            @param rightMin\r\n            @return a hyphenation object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.SetMinRemainCharCount(System.Int32)\">\r\n            @param min\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.SetMinPushCharCount(System.Int32)\">\r\n            @param min\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.SetLanguage(System.String,System.String)\">\r\n            @param lang\r\n            @param country\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.Hyphenate(System.Char[],System.Int32,System.Int32)\">\r\n            @param word\r\n            @param offset\r\n            @param len\r\n            @return a hyphenation object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.Hyphenator.Hyphenate(System.String)\">\r\n            @param word\r\n            @return a hyphenation object\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.hyphenation.IPatternConsumer”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.IPatternConsumer.AddClass(System.String)\">\r\n            Add a character class.\r\n            A character class defines characters that are considered\r\n            equivalent for the purpose of hyphenation (e.g. \"aA\"). It\r\n            usually means to ignore case.\r\n            @param chargroup character group\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.IPatternConsumer.AddException(System.String,System.Collections.Generic.List{System.Object})\">\r\n            Add a hyphenation exception. An exception replaces the\r\n            result obtained by the algorithm for cases for which this\r\n            fails or the user wants to provide his own hyphenation.\r\n            A hyphenatedword is a vector of alternating String's and\r\n            {@link Hyphen Hyphen} instances\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.IPatternConsumer.AddPattern(System.String,System.String)\">\r\n            Add hyphenation patterns.\r\n            @param pattern the pattern\r\n            @param values interletter values expressed as a string of\r\n            digit characters.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.hyphenation.SimplePatternParser\">\r\n            Parses the xml hyphenation pattern.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.SimplePatternParser.#ctor\">\r\n            Creates a new instance of PatternParser2 \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.hyphenation.TernaryTree\">\r\n             <h2>Ternary Search Tree</h2>\r\n            \r\n             <p>A ternary search tree is a hibrid between a binary tree and\r\n             a digital search tree (trie). Keys are limited to strings.\r\n             A data value of type char is stored in each leaf node.\r\n             It can be used as an index (or pointer) to the data.\r\n             Branches that only contain one key are compressed to one node\r\n             by storing a pointer to the trailer substring of the key.\r\n             This class is intended to serve as base class or helper class\r\n             to implement Dictionary collections or the like. Ternary trees\r\n             have some nice properties as the following: the tree can be\r\n             traversed in sorted order, partial matches (wildcard) can be\r\n             implemented, retrieval of all keys within a given distance\r\n             from the target, etc. The storage requirements are higher than\r\n             a binary tree but a lot less than a trie. Performance is\r\n             comparable with a hash table, sometimes it outperforms a hash\r\n             function (most of the time can determine a miss faster than a hash).</p>\r\n            \r\n             <p>The main purpose of this java port is to serve as a base for\r\n             implementing TeX's hyphenation algorithm (see The TeXBook,\r\n             appendix H). Each language requires from 5000 to 15000 hyphenation\r\n             patterns which will be keys in this tree. The strings patterns\r\n             are usually small (from 2 to 5 characters), but each char in the\r\n             tree is stored in a node. Thus memory usage is the main concern.\r\n             We will sacrify 'elegance' to keep memory requirenments to the\r\n             minimum. Using java's char type as pointer (yes, I know pointer\r\n             it is a forbidden word in java) we can keep the size of the node\r\n             to be just 8 bytes (3 pointers and the data char). This gives\r\n             room for about 65000 nodes. In my tests the english patterns\r\n             took 7694 nodes and the german patterns 10055 nodes,\r\n             so I think we are safe.</p>\r\n            \r\n             <p>All said, this is a map with strings as keys and char as value.\r\n             Pretty limited!. It can be extended to a general map by\r\n             using the string representation of an object and using the\r\n             char value as an index to an array that contains the object\r\n             values.</p>\r\n            \r\n             @author cav@uniscope.co.jp\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.lo\">\r\n            We use 4 arrays to represent a node. I guess I should have created\r\n            a proper node class, but somehow Knuth's pascal code made me forget\r\n            we now have a portable language with memory management and\r\n            automatic garbage collection! And now is kind of late, furthermore,\r\n            if it ain't broken, don't fix it.\r\n            Pointer to low branch and to rest of the key when it is\r\n            stored directly in this node, we don't have unions in java!\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.hi\">\r\n            Pointer to high branch.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.eq\">\r\n            Pointer to equal branch and to data when this node is a string terminator.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.sc\">\r\n            <P>The character stored in this node: splitchar\r\n            Two special values are reserved:</P>\r\n            <ul><li>0x0000 as string terminator</li>\r\n            <li>0xFFFF to indicate that the branch starting at\r\n            this node is compressed</li></ul>\r\n            <p>This shouldn't be a problem if we give the usual semantics to\r\n            strings since 0xFFFF is garanteed not to be an Unicode character.</p>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.kv\">\r\n            This vector holds the trailing of the keys when the branch is compressed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Insert(System.String,System.Char)\">\r\n            Branches are initially compressed, needing\r\n            one node per key plus the size of the string\r\n            key. They are decompressed as needed when\r\n            another key with same prefix\r\n            is inserted. This saves a lot of space,\r\n            specially for long keys.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Insert(System.Char,System.Char[],System.Int32,System.Char)\">\r\n            The actual insertion function, recursive version.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Strcmp(System.Char[],System.Int32,System.Char[],System.Int32)\">\r\n            Compares 2 null terminated char arrays\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Strcmp(System.String,System.Char[],System.Int32)\">\r\n            Compares a string with null terminated char array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.InsertBalanced(System.String[],System.Char[],System.Int32,System.Int32)\">\r\n            Recursively insert the median first and then the median of the\r\n            lower and upper halves, and so on in order to get a balanced\r\n            tree. The array of keys is assumed to be sorted in ascending\r\n            order.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Balance\">\r\n            Balance the tree for best search performance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.TrimToSize\">\r\n             Each node stores a character (splitchar) which is part of\r\n             some Key(s). In a compressed branch (one that only contain\r\n             a single string key) the trailer of the key which is not\r\n             already in nodes is stored  externally in the kv array.\r\n             As items are inserted, key substrings decrease.\r\n             Some substrings may completely  disappear when the whole\r\n             branch is totally decompressed.\r\n             The tree is traversed to find the key substrings actually\r\n             used. In addition, duplicate substrings are removed using\r\n             a map (implemented with a TernaryTree!).\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.cur\">\r\n            current node index\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.curkey\">\r\n            current key\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.parent\">\r\n            TernaryTree parent\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.ns\">\r\n            Node stack\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.ks\">\r\n            key stack implemented with a StringBuilder\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.Up\">\r\n            traverse upwards\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.hyphenation.TernaryTree.Iterator.Run\">\r\n            traverse the tree to find next key\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.ICC_Profile\">\r\n            <summary>\r\n            Summary description for ICC_Profile.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.IExtraEncoding\">\r\n            Classes implementing this interface can create custom encodings or\r\n            replace existing ones. It is used in the context of <code>PdfEncoding</code>.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IExtraEncoding.CharToByte(System.String,System.String)\">\r\n            Converts an Unicode string to a byte array according to some encoding.\r\n            @param text the Unicode string\r\n            @param encoding the requested encoding. It's mainly of use if the same class\r\n            supports more than one encoding.\r\n            @return the conversion or <CODE>null</CODE> if no conversion is supported\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IExtraEncoding.CharToByte(System.Char,System.String)\">\r\n            Converts an Unicode char to a byte array according to some encoding.\r\n            @param char1 the Unicode char\r\n            @param encoding the requested encoding. It's mainly of use if the same class\r\n            supports more than one encoding.\r\n            @return the conversion or <CODE>null</CODE> if no conversion is supported\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IExtraEncoding.ByteToChar(System.Byte[],System.String)\">\r\n            Converts a byte array to an Unicode string according to some encoding.\r\n            @param b the input byte array\r\n            @param encoding the requested encoding. It's mainly of use if the same class\r\n            supports more than one encoding.\r\n            @return the conversion or <CODE>null</CODE> if no conversion is supported\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.IHyphenationEvent\">\r\n            Called by <code>Chunk</code> to hyphenate a word.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.IHyphenationEvent.HyphenSymbol\">\r\n            Gets the hyphen symbol.\r\n            @return the hyphen symbol\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IHyphenationEvent.GetHyphenatedWordPre(System.String,iTextSharp.text.pdf.BaseFont,System.Single,System.Single)\">\r\n            Hyphenates a word and returns the first part of it. To get\r\n            the second part of the hyphenated word call <CODE>getHyphenatedWordPost()</CODE>.\r\n            @param word the word to hyphenate\r\n            @param font the font used by this word\r\n            @param fontSize the font size used by this word\r\n            @param remainingWidth the width available to fit this word in\r\n            @return the first part of the hyphenated word including\r\n            the hyphen symbol, if any\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.IHyphenationEvent.HyphenatedWordPost\">\r\n            Gets the second part of the hyphenated word. Must be called\r\n            after <CODE>getHyphenatedWordPre()</CODE>.\r\n            @return the second part of the hyphenated word\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfAnnotationsImp.acroForm\">\r\n            This is the AcroForm object for the complete document.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfAnnotationsImp.annotations\">\r\n            This is the array containing the references to annotations\r\n            that were added to the document.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfAnnotationsImp.delayedAnnotations\">\r\n            This is an array containg references to some delayed annotations\r\n            (that were added for a page that doesn't exist yet).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfAnnotationsImp.HasValidAcroForm\">\r\n            Checks if the AcroForm is valid.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.intern.PdfAnnotationsImp.AcroForm\">\r\n            Gets the AcroForm object.\r\n            @return the PdfAcroform object of the PdfDocument\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.intern.PdfVersionImp\">\r\n            Stores the PDF version information,\r\n            knows how to write a PDF Header,\r\n            and how to add the version to the catalog (if necessary).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.HEADER\">\r\n            Contains different strings that are part of the header. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.headerWasWritten\">\r\n            Indicates if the header was already written. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.appendmode\">\r\n            Indicates if we are working in append mode. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.header_version\">\r\n            The version that was or will be written to the header. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.catalog_version\">\r\n            The version that will be written to the catalog. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.version\">\r\n            The version that user can use to get the actual version of PDF document *\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfVersionImp.extensions\">\r\n            The extensions dictionary.\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.intern.PdfVersionImp.PdfVersion\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#setPdfVersion(char)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.SetAtLeastPdfVersion(System.Char)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#setAtLeastPdfVersion(char)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.SetPdfVersion(iTextSharp.text.pdf.PdfName)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#setPdfVersion(com.lowagie.text.pdf.PdfName)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.SetAppendmode(System.Boolean)\">\r\n            Sets the append mode.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.WriteHeader(iTextSharp.text.pdf.OutputStreamCounter)\">\r\n            Writes the header to the OutputStreamCounter.\r\n            @throws IOException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.GetVersionAsName(System.Char)\">\r\n            Returns the PDF version as a name.\r\n            @param version    the version character.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.GetVersionAsByteArray(System.Char)\">\r\n            Returns the version as a byte[].\r\n            @param version the version character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.AddToCatalog(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Adds the version to the Catalog dictionary. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfVersionImp.AddDeveloperExtension(iTextSharp.text.pdf.PdfDeveloperExtension)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#addDeveloperExtension(com.lowagie.text.pdf.PdfDeveloperExtension)\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp\">\r\n            Stores the information concerning viewer preferences,\r\n            and contains the business logic that allows you to set viewer preferences.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.NONFULLSCREENPAGEMODE_PREFERENCES\">\r\n            A series of viewer preferences. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.DIRECTION_PREFERENCES\">\r\n            A series of viewer preferences. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.PAGE_BOUNDARIES\">\r\n            A series of viewer preferences. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.PRINTSCALING_PREFERENCES\">\r\n            A series of viewer preferences \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.DUPLEX_PREFERENCES\">\r\n            A series of viewer preferences. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.pageLayoutAndMode\">\r\n            This value will hold the viewer preferences for the page layout and page mode. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.viewerPreferences\">\r\n            This dictionary holds the viewer preferences (other than page layout and page mode). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.viewerPreferencesMask\">\r\n            The mask to decide if a ViewerPreferences dictionary is needed \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.PageLayoutAndMode\">\r\n            Returns the page layout and page mode value.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.GetViewerPreferences\">\r\n            Returns the viewer preferences.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.ViewerPreferences\">\r\n            Sets the viewer preferences as the sum of several constants.\r\n            \r\n            @param preferences\r\n                       the viewer preferences\r\n            @see PdfWriter#setViewerPreferences\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.GetIndex(iTextSharp.text.pdf.PdfName)\">\r\n            Given a key for a viewer preference (a PdfName object),\r\n            this method returns the index in the VIEWER_PREFERENCES array.\r\n            @param key    a PdfName referring to a viewer preference\r\n            @return   an index in the VIEWER_PREFERENCES array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.IsPossibleValue(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfName[])\">\r\n            Checks if some value is valid for a certain key.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Sets the viewer preferences for printing.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.AddToCatalog(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Adds the viewer preferences defined in the preferences parameter to a\r\n            PdfDictionary (more specifically the root or catalog of a PDF file).\r\n            \r\n            @param catalog\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfXConformanceImp.pdfxConformance\">\r\n            The value indicating if the PDF has to be in conformance with PDF/X.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.intern.PdfXConformanceImp.PDFXConformance\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfXConformance#setPDFXConformance(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfXConformanceImp.IsPdfIso\">\r\n            @see com.itextpdf.text.pdf.interfaces.PdfIsoConformance#isPdfIso()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfXConformanceImp.IsPdfX\">\r\n            Checks if the PDF/X Conformance is necessary.\r\n            @return true if the PDF has to be in conformance with any of the PDF/X specifications\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfXConformanceImp.IsPdfX1A2001\">\r\n            Checks if the PDF has to be in conformance with PDF/X-1a:2001\r\n            @return true of the PDF has to be in conformance with PDF/X-1a:2001\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfXConformanceImp.IsPdfX32002\">\r\n            Checks if the PDF has to be in conformance with PDF/X-3:2002\r\n            @return true of the PDF has to be in conformance with PDF/X-3:2002\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.intern.PdfXConformanceImp.CheckPdfIsoConformance(System.Int32,System.Object)\">\r\n            Business logic that checks if a certain object is in conformance with PDF/X.\r\n            @param writer    the writer that is supposed to write the PDF/X file\r\n            @param key       the type of PDF ISO conformance that has to be checked\r\n            @param obj1      the object that is checked for conformance\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_COLOR\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_CMYK\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_RGB\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_FONT\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_IMAGE\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_GSTATE\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_LAYER\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_TRAILER\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_STREAM\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_FILESPEC\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_OBJECT\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_CANVAS\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_ANNOTATION\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_ACTION\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_FORM\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_STRUCTELEM\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_INLINE_IMAGE\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_GRAY\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_OUTPUTINTENT\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.intern.PdfIsoKeys.PDFISOKEY_FORM_XOBJ\">\r\n            A key for an aspect that can be checked for PDF ISO Conformance. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.IntHashtable\">\r\n            A Hashtable that uses ints as the keys.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.IntHashtable.table\">\r\n            The hash table data.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.IntHashtable.count\">\r\n            The total number of entries in the hash table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.IntHashtable.threshold\">\r\n            Rehashes the table when count exceeds this threshold.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.IntHashtable.loadFactor\">\r\n            The load factor for the hashtable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.#ctor(System.Int32,System.Single)\">\r\n            Constructs a new, empty hashtable with the specified initial\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.#ctor(System.Int32)\">\r\n            Constructs a new, empty hashtable with the specified initial\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.#ctor\">\r\n            Constructs a new, empty hashtable. A default capacity and load factor\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.IntHashtable.Size\">\r\n            Returns the number of elements contained in the hashtable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.IsEmpty\">\r\n            Returns true if the hashtable contains no elements.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.Contains(System.Int32)\">\r\n            Returns true if the specified object is an element of the hashtable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.ContainsKey(System.Int32)\">\r\n            Returns true if the collection contains an element for the key.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.IntHashtable.Item(System.Int32)\">\r\n            Gets the object associated with the specified key in the\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.Rehash\">\r\n            Rehashes the content of the table into a bigger table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.Remove(System.Int32)\">\r\n            Removes the element corresponding to the key. Does nothing if the\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IntHashtable.Clear\">\r\n            Clears the hash table so that it has no more elements in it.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.IPdfOCG\">\r\n             The interface common to all layer types.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.IPdfOCG.Ref\">\r\n            Gets the <CODE>PdfIndirectReference</CODE> that represents this layer.\r\n            @return the <CODE>PdfIndirectReference</CODE> that represents this layer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.IPdfOCG.PdfObject\">\r\n            Gets the object representing the layer.\r\n            @return the object representing the layer\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.IPdfPageEvent\">\r\n             Allows a class to catch several document events.\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IPdfPageEvent.OnOpenDocument(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n             Called when the document is opened.\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE> for this document\r\n             @param document the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IPdfPageEvent.OnStartPage(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n             Called when a page is initialized.\r\n             <P>\r\n             Note that if even if a page is not written this method is still\r\n             called. It is preferable to use <CODE>onEndPage</CODE> to avoid\r\n             infinite loops.\r\n             </P>\r\n             <P>\r\n             Note that this method isn't called for the first page. You should apply modifications for the first\r\n             page either before opening the document or by using the onOpenDocument() method.\r\n             </P>\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE> for this document\r\n             @param document the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IPdfPageEvent.OnEndPage(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n             Called when a page is finished, just before being written to the document.\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE> for this document\r\n             @param document the document\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnCloseDocument(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnParagraph(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnParagraphEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnChapter(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnChapterEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnSection(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single,System.Int32,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnSectionEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPageEvent.OnGenericTag(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,iTextSharp.text.Rectangle,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.IPdfPCellEvent\">\r\n            <summary>\r\n            Summary description for IPdfPCellEvent.\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPCellEvent.CellLayout(iTextSharp.text.pdf.PdfPCell,iTextSharp.text.Rectangle,iTextSharp.text.pdf.PdfContentByte[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.IPdfPTableEvent\">\r\n            An interface that can be used to retrieve the position of cells in <CODE>PdfPTable</CODE>.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPTableEvent.TableLayout(iTextSharp.text.pdf.PdfPTable,System.Single[][],System.Single[],System.Int32,System.Int32,iTextSharp.text.pdf.PdfContentByte[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.languages.GujaratiLigaturizer\">\r\n            Implementation of the IndicLigaturizer for Gujarati.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.GujaratiLigaturizer.#ctor\">\r\n            Constructor for the IndicLigaturizer for Gujarati.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.HebrewProcessor.IsRTL\">\r\n            Hebrew is written from right to left.\r\n            @return true\r\n            @see com.itextpdf.text.pdf.languages.LanguageProcessor#isRTL()\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.languages.ILanguageProcessor\">\r\n            Interface that needs to be implemented by classes that process bytes\r\n            representing text in specific languages. Processing involves changing\r\n            order to Right to Left and/or applying ligatures.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.ILanguageProcessor.Process(System.String)\">\r\n            Processes a String\r\n            @param s\tthe original String\r\n            @return the processed String\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.ILanguageProcessor.IsRTL\">\r\n            Indicates if the rundirection is right-to-left.\r\n            @return true if text needs to be rendered from right to left.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.languages.IndicLigaturizer\">\r\n            Superclass for processors that can convert a String of bytes in an Indic\r\n            language to a String in the same language of which the bytes are reordered\r\n            for rendering using a font that contains the necessary glyphs.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.languages.IndicLigaturizer.langTable\">\r\n            The table mapping specific character indexes to the characters in a\r\n            specific language.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.IndicLigaturizer.Process(System.String)\">\r\n            Reorders the bytes in a String making Indic ligatures\r\n            \r\n            @param s\r\n                       the original String\r\n            @return the ligaturized String\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.IndicLigaturizer.IsRTL\">\r\n            Indic languages are written from right to left.\r\n            \r\n            @return false\r\n            @see com.itextpdf.text.pdf.languages.LanguageProcessor#isRTL()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.IndicLigaturizer.IsSwaraLetter(System.Char)\">\r\n            Checks if a character is vowel letter.\r\n            \r\n            @param ch\r\n                       the character that needs to be checked\r\n            @return true if the characters is a vowel letter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.IndicLigaturizer.IsSwaraMatra(System.Char)\">\r\n            Checks if a character is vowel sign.\r\n            \r\n            @param ch\r\n                       the character that needs to be checked\r\n            @return true if the characters is a vowel sign\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.IndicLigaturizer.IsVyanjana(System.Char)\">\r\n            Checks if a character is consonant letter.\r\n            \r\n            @param ch\r\n                       the character that needs to be checked\r\n            @return true if the chracter is a consonant letter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.languages.IndicLigaturizer.Swap(System.Text.StringBuilder,System.Int32,System.Int32)\">\r\n            Swaps two characters in a StringBuilder object\r\n            \r\n            @param s\r\n                       the StringBuilder\r\n            @param i\r\n                       the index of one character\r\n            @param j\r\n                       the index of the other character\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.LZWDecoder\">\r\n             A class for performing LZW decoding.\r\n            \r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LZWDecoder.Decode(System.Byte[],System.IO.Stream)\">\r\n             Method to decode LZW compressed data.\r\n            \r\n             @param data            The compressed data.\r\n             @param uncompData      Array to return the uncompressed data in.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LZWDecoder.InitializeStringTable\">\r\n            Initialize the string table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LZWDecoder.WriteString(System.Byte[])\">\r\n            Write out the string just uncompressed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LZWDecoder.AddStringToTable(System.Byte[],System.Byte)\">\r\n            Add a new string to the string table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LZWDecoder.AddStringToTable(System.Byte[])\">\r\n            Add a new string to the string table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LZWDecoder.ComposeString(System.Byte[],System.Byte)\">\r\n            Append <code>newstring</code> to the end of <code>oldstring</code>.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.BezierCurve\">\r\n             Represents a Bezier curve.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.BezierCurve.CurveCollinearityEpsilon\">\r\n            If the distance between a point and a line is less than\r\n            this constant, then we consider the point lies on the line.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.BezierCurve.DistanceToleranceSquare\">\r\n            In the case when neither the line ((x1, y1), (x4, y4)) passes\r\n            through both (x2, y2) and (x3, y3) nor (x1, y1) = (x4, y4) we\r\n            use the square of the sum of the distances mentioned below in \r\n            compare to this field as the criterion of good approximation.\r\n                1. The distance between the line and (x2, y2)\r\n                2. The distance between the line and (x3, y3)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.BezierCurve.DistanceToleranceManhattan\">\r\n            The Manhattan distance is used in the case when either the line \r\n            ((x1, y1), (x4, y4)) passes through both (x2, y2) and (x3, y3) \r\n            or (x1, y1) = (x4, y4). The essential observation is that when \r\n            the curve is a uniform speed straight line from end to end, the \r\n            control points are evenly spaced from beginning to end. Our measure \r\n            of how far we deviate from that ideal uses distance of the middle \r\n            controls: point 2 should be halfway between points 1 and 3; point 3 \r\n            should be halfway between points 2 and 4.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.BezierCurve.#ctor(System.Collections.Generic.IList{iTextSharp.awt.geom.Point2D})\">\r\n            Constructs new bezier curve.\r\n            @param controlPoints Curve's control points.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.BezierCurve.GetBasePoints\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.BezierCurve.GetPiecewiseLinearApproximation\">\r\n            You can adjust precision of the approximation by varying the following \r\n            parameters: {@link #curveCollinearityEpsilon}, {@link #distanceToleranceSquare}, \r\n            {@link #distanceToleranceManhattan}\r\n            \r\n            @return {@link java.util.List} containing points of piecewise linear approximation\r\n                    for this bezier curve.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.ContentByteUtils\">\r\n            @author kevin\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ContentByteUtils.GetContentBytesFromContentObject(iTextSharp.text.pdf.PdfObject)\">\r\n            Gets the content bytes from a content object, which may be a reference\r\n            a stream or an array.\r\n            @param contentObject the object to read bytes from\r\n            @return the content bytes\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ContentByteUtils.GetContentBytesForPage(iTextSharp.text.pdf.PdfReader,System.Int32)\">\r\n            Gets the content bytes of a page from a reader\r\n            @param reader  the reader to get content bytes from\r\n            @param pageNum   the page number of page you want get the content stream from\r\n            @return  a byte array with the effective content stream of a page\r\n            @throws IOException\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.IExtRenderListener\">\r\n             Simply extends the {@link com.itextpdf.text.pdf.parser.RenderListener} interface to provide\r\n             additional methods.\r\n            \r\n             {@inheritDoc}\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IExtRenderListener.ModifyPath(iTextSharp.text.pdf.parser.PathConstructionRenderInfo)\">\r\n             Called when the current path is being modified. E.g. new segment is being added,\r\n             new subpath is being started etc.\r\n            \r\n             @param renderInfo Contains information about the path segment being added to the current path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IExtRenderListener.RenderPath(iTextSharp.text.pdf.parser.PathPaintingRenderInfo)\">\r\n             Called when the current path should be rendered.\r\n            \r\n             @param renderInfo Contains information about the current path which should be rendered.\r\n             @return The path which can be used as a new clipping path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IExtRenderListener.ClipPath(System.Int32)\">\r\n             Called when the current path should be set as a new clipping path.\r\n            \r\n             @param rule Either {@link PathPaintingRenderInfo#EVEN_ODD_RULE} or {@link PathPaintingRenderInfo#NONZERO_WINDING_RULE}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.FilteredRenderListener\">\r\n            A text render listener that filters text operations before passing them on to a deleg\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.FilteredRenderListener.deleg\">\r\n            The deleg that will receive the text render operation if the filters all pass \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.FilteredRenderListener.filters\">\r\n            The filters to be applied \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredRenderListener.#ctor(iTextSharp.text.pdf.parser.IRenderListener,iTextSharp.text.pdf.parser.RenderFilter[])\">\r\n            Construction\r\n            @param deleg the deleg {@link RenderListener} that will receive filtered text operations\r\n            @param filters the Filter(s) to apply\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredRenderListener.RenderText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            Applies filters, then delegates to the deleg if all filters pass\r\n            @param renderInfo contains info to render text\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderText(com.itextpdf.text.pdf.parser.TextRenderInfo)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredRenderListener.BeginTextBlock\">\r\n            This class delegates this call\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredRenderListener.EndTextBlock\">\r\n            This class delegates this call\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredRenderListener.RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo)\">\r\n            Applies filters, then delegates to the deleg if all filters pass\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(com.itextpdf.text.pdf.parser.ImageRenderInfo)\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.FilteredTextRenderListener\">\r\n            A text render listener that filters text operations before passing them on to a deleg\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.FilteredTextRenderListener.deleg\">\r\n            The deleg that will receive the text render operation if the filters all pass \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredTextRenderListener.#ctor(iTextSharp.text.pdf.parser.ITextExtractionStrategy,iTextSharp.text.pdf.parser.RenderFilter[])\">\r\n            Construction\r\n            @param deleg the deleg {@link RenderListener} that will receive filtered text operations\r\n            @param filters the Filter(s) to apply\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.FilteredTextRenderListener.GetResultantText\">\r\n            This class delegates this call\r\n            @see com.itextpdf.text.pdf.parser.TextExtractionStrategy#getResultantText()\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.GraphicsState\">\r\n            Keeps all the parameters of the graphics state.\r\n            @since   2.1.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.ctm\">\r\n            The current transformation matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.characterSpacing\">\r\n            The current character spacing. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.wordSpacing\">\r\n            The current word spacing. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.horizontalScaling\">\r\n            The current horizontal scaling \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.leading\">\r\n            The current leading. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.font\">\r\n            The active font. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.fontSize\">\r\n            The current font size. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.renderMode\">\r\n            The current render mode. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.rise\">\r\n            The current text rise \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.knockout\">\r\n            The current knockout value. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.colorSpaceFill\">\r\n            The current color space for stroke. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.colorSpaceStroke\">\r\n            The current color space for stroke. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.fillColor\">\r\n            The current fill color. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.strokeColor\">\r\n            The current stroke color. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.lineWidth\">\r\n            The line width for stroking operations \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.lineCapStyle\">\r\n            The line cap style. For possible values\r\n            see {@link PdfContentByte}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.lineJoinStyle\">\r\n            The line join style. For possible values\r\n            see {@link PdfContentByte}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.miterLimit\">\r\n            The mitir limit value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.GraphicsState.lineDashPattern\">\r\n            The line dash pattern \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.#ctor\">\r\n            Constructs a new Graphics State object with the default values.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.#ctor(iTextSharp.text.pdf.parser.GraphicsState)\">\r\n            Copy constructor.\r\n            @param source    another GraphicsState object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetCtm\">\r\n            Getter for the current transformation matrix\r\n            @return the ctm\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetCharacterSpacing\">\r\n            Getter for the character spacing.\r\n            @return the character spacing\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetWordSpacing\">\r\n            Getter for the word spacing\r\n            @return the word spacing\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetHorizontalScaling\">\r\n            Getter for the horizontal scaling\r\n            @return the horizontal scaling\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetLeading\">\r\n            Getter for the leading\r\n            @return the leading\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetFont\">\r\n            Getter for the font\r\n            @return the font\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetFontSize\">\r\n            Getter for the font size\r\n            @return the font size\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetRenderMode\">\r\n            Getter for the render mode\r\n            @return the renderMode\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetRise\">\r\n            Getter for text rise\r\n            @return the text rise\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.IsKnockout\">\r\n            Getter for knockout\r\n            @return the knockout\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.ColorSpaceFill\">\r\n            Gets the current color space for fill operations\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.ColorSpaceStroke\">\r\n            Gets the current color space for stroke operations\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.FillColor\">\r\n            Gets the current fill color\r\n            @return a BaseColor\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.StrokeColor\">\r\n            Gets the current stroke color\r\n            @return a BaseColor\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.LineWidth\">\r\n            Getter  and setter for the line width.\r\n            @return The line width\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.LineCapStyle\">\r\n            Getter and setter for the line cap style.\r\n            For possible values see {@link PdfContentByte}\r\n            @return The line cap style.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.LineJoinStyle\">\r\n            Getter and setter for the line join style.\r\n            For possible values see {@link PdfContentByte}\r\n            @return The line join style.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.GraphicsState.MiterLimit\">\r\n            Getter and setter for the miter limit value.\r\n            @return The miter limit.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.GetLineDashPattern\">\r\n            Getter for the line dash pattern.\r\n            @return The line dash pattern.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.GraphicsState.SetLineDashPattern(iTextSharp.text.pdf.parser.LineDashPattern)\">\r\n            Setter for the line dash pattern.\r\n            @param lineDashPattern New line dash pattern.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.IContentOperator\">\r\n            Interface implemented by a series of content operators\r\n            @since 2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IContentOperator.Invoke(iTextSharp.text.pdf.parser.PdfContentStreamProcessor,iTextSharp.text.pdf.PdfLiteral,System.Collections.Generic.List{iTextSharp.text.pdf.PdfObject})\">\r\n            Invokes a content operator.\r\n            @param processor the processor that is dealing with the PDF content\r\n            @param operator  the literal PDF syntax of the operator\r\n            @param operands  the operands that come with the operator\r\n            @throws Exception any exception can be thrown - it will be re-packaged into a runtime exception and re-thrown by the {@link PdfContentStreamProcessor}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.ImageRenderInfo\">\r\n            Represents image data from a PDF\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.ImageRenderInfo.gs\">\r\n            The graphics state that was in effect when the image was rendered \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.ImageRenderInfo.refi\">\r\n            A reference to the image XObject \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.ImageRenderInfo.inlineImageInfo\">\r\n            A reference to an inline image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.ImageRenderInfo.colorSpaceDictionary\">\r\n            the color space associated with the image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.ImageRenderInfo.imageObject\">\r\n            the image object to be rendered, if it has been parsed already.  Null otherwise. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.ImageRenderInfo.markedContentInfos\">\r\n            Array containing marked content info for the text.\r\n            @since 5.5.11\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.CreateForXObject(iTextSharp.text.pdf.parser.GraphicsState,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Create an ImageRenderInfo object based on an XObject (this is the most common way of including an image in PDF)\r\n            @param ctm the coordinate transformation matrix at the time the image is rendered\r\n            @param ref a reference to the image XObject\r\n            @return the ImageRenderInfo representing the rendered XObject\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.CreateForXObject(iTextSharp.text.pdf.parser.GraphicsState,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfDictionary,System.Collections.ICollection)\">\r\n            Create an ImageRenderInfo object based on an XObject (this is the most common way of including an image in PDF)\r\n            @param ctm the coordinate transformation matrix at the time the image is rendered\r\n            @param ref a reference to the image XObject\r\n            @return the ImageRenderInfo representing the rendered XObject\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.CreateForEmbeddedImage(iTextSharp.text.pdf.parser.GraphicsState,iTextSharp.text.pdf.parser.InlineImageInfo,iTextSharp.text.pdf.PdfDictionary,System.Collections.ICollection)\">\r\n            Create an ImageRenderInfo object based on inline image data.  This is nowhere near completely thought through\r\n            and really just acts as a placeholder.\r\n            @param ctm the coordinate transformation matrix at the time the image is rendered\r\n            @param imageObject the image object representing the inline image\r\n            @return the ImageRenderInfo representing the rendered embedded image\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetImage\">\r\n            Gets an object containing the image dictionary and bytes.\r\n            @return an object containing the image dictionary and byte[]\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetStartPoint\">\r\n            @return a vector in User space representing the start point of the xobject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetImageCTM\">\r\n            @return The coordinate transformation matrix active when this image was rendered.  Coordinates are in User space.\r\n            @since 5.0.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetArea\">\r\n            @return the size of the image, in User space units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetRef\">\r\n            @return an indirect reference to the image\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetCurrentFillColor\">\r\n            @return the current fill color from the graphics state at the time this render operation occured\r\n            @since 5.5.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.HasMcid(System.Int32)\">\r\n            Checks if the image belongs to a marked content sequence\r\n            with a given mcid.\r\n            @param mcid a marked content id\r\n            @return true if the text is marked with this id\r\n            @since 5.5.11\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.HasMcid(System.Int32,System.Boolean)\">\r\n            \t     * Checks if the image belongs to a marked content sequence\r\n            \t     * with a given mcid.\r\n                     * @param mcid a marked content id\r\n                     * @param checkTheTopmostLevelOnly indicates whether to check the topmost level of marked content stack only\r\n                     * @return true if the text is marked with this id\r\n                     * @since 5.5.11\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ImageRenderInfo.GetMcid\">\r\n            @return the marked content associated with the ImageRenderInfo instance.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.parser.IRenderListener”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IRenderListener.BeginTextBlock\">\r\n            Called when a new text block is beginning (i.e. BT)\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IRenderListener.RenderText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            Called when text should be rendered\r\n            @param renderInfo information specifying what to render\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IRenderListener.EndTextBlock\">\r\n            Called when a text block has ended (i.e. ET)\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IRenderListener.RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo)\">\r\n            Called when image should be rendered\r\n            @param renderInfo information specifying what to render\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.ITextExtractionStrategy\">\r\n            Defines an interface for {@link RenderListener}s that can return text\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.ITextExtractionStrategy.GetResultantText\">\r\n            Returns the result so far.\r\n            @return  a String with the resulting text.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.Line\">\r\n             Represents a line.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Line.#ctor\">\r\n            Constructs a new zero-length line starting at zero.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Line.#ctor(System.Single,System.Single,System.Single,System.Single)\">\r\n            Constructs a new line based on the given coordinates.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Line.#ctor(iTextSharp.awt.geom.Point2D,iTextSharp.awt.geom.Point2D)\">\r\n            Constructs a new line based on the given coordinates.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.LineDashPattern\">\r\n             Represents the line dash pattern. The line dash pattern shall control the pattern\r\n             of dashes and gaps used to stroke paths. It shall be specified by a dash array and\r\n             a dash phase.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineDashPattern.#ctor(iTextSharp.text.pdf.PdfArray,System.Single)\">\r\n            Creates new {@link LineDashPattern} object.\r\n            @param dashArray The dash array. See {@link #getDashArray()}\r\n            @param dashPhase The dash phase. See {@link #getDashPhase()}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LineDashPattern.DashArray\">\r\n             Getter and setter for the dash array.\r\n            \r\n             The dash array’s elements is number that specify the lengths of\r\n             alternating dashes and gaps; the numbers are nonnegative. The\r\n             elements are expressed in user space units.\r\n            \r\n             @return The dash array.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LineDashPattern.DashPhase\">\r\n             Getter and setter for the dash phase.\r\n            \r\n             The dash phase shall specify the distance into the dash pattern at which\r\n             to start the dash. The elements are expressed in user space units.\r\n            \r\n             @return The dash phase.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineDashPattern.Next\">\r\n            Calculates and returns the next element which is either gap or dash.\r\n            @return The next dash array's element.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineDashPattern.IsSolid\">\r\n            Checks whether the dashed pattern is solid or not. It's solid when the\r\n            size of a dash array is even and sum of all the units off in the array\r\n            is 0.<br/>\r\n            For example: [3 0 4 0 5 0 6 0] (sum is 0), [3 0 4 0 5 1] (sum is 1).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineDashPattern.Reset\">\r\n            Resets the dash array so that the {@link #next()} method will start\r\n            from the beginning of the dash array.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.LineSegment\">\r\n            Represents a line segment in a particular coordinate system.  This class is immutable.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.LineSegment.startPoint\">\r\n            Start vector of the segment. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.LineSegment.endPoint\">\r\n            End vector of the segment. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineSegment.#ctor(iTextSharp.text.pdf.parser.Vector,iTextSharp.text.pdf.parser.Vector)\">\r\n            Creates a new line segment.\r\n            @param startPoint the start point of a line segment.\r\n            @param endPoint the end point of a line segment.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineSegment.GetStartPoint\">\r\n            @return the start point\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineSegment.GetEndPoint\">\r\n            @return the end point\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineSegment.GetLength\">\r\n            @return the length of this line segment\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineSegment.GetBoundingRectange\">\r\n            Computes the bounding rectangle for this line segment.  The rectangle has a rotation 0 degrees\r\n            with respect to the coordinate system that the line system is in.  For example, if a line segment\r\n            is 5 unit long and sits at a 37 degree angle from horizontal, the bounding rectangle will have\r\n            origin of the lower left hand end point of the segment, with width = 4 and height = 3. \r\n            @return the bounding rectangle\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LineSegment.TransformBy(iTextSharp.text.pdf.parser.Matrix)\">\r\n            Transforms the segment by the specified matrix\r\n            @param m the matrix for the transformation\r\n            @return the transformed segment\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.DUMP_STATE\">\r\n            set to true for debugging \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.locationalResult\">\r\n            a summary of all found text \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.#ctor\">\r\n            Creates a new text extraction renderer.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.#ctor(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocationStrategy)\">\r\n            Creates a new text extraction renderer, with a custom strategy for\r\n            creating new TextChunkLocation objects based on the input of the\r\n            TextRenderInfo.\r\n            @param strat the custom strategy\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.BeginTextBlock\">\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.EndTextBlock\">\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.StartsWithSpace(System.String)\">\r\n            @param str\r\n            @return true if the string starts with a space character, false if the string is empty or starts with a non-space character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.EndsWithSpace(System.String)\">\r\n            @param str\r\n            @return true if the string ends with a space character, false if the string is empty or ends with a non-space character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.filterTextChunks(System.Collections.Generic.List{iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk},iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkFilter)\">\r\n            Filters the provided list with the provided filter\r\n            @param textChunks a list of all TextChunks that this strategy found during processing\r\n            @param filter the filter to apply.  If null, filtering will be skipped.\r\n            @return the filtered list\r\n            @since 5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.IsChunkAtWordBoundary(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk,iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk)\">\r\n            Determines if a space character should be inserted between a previous chunk and the current chunk.\r\n            This method is exposed as a callback so subclasses can fine time the algorithm for determining whether a space should be inserted or not.\r\n            By default, this method will insert a space if the there is a gap of more than half the font space character width between the end of the\r\n            previous chunk and the beginning of the current chunk.  It will also indicate that a space is needed if the starting point of the new chunk \r\n            appears *before* the end of the previous chunk (i.e. overlapping text).\r\n            @param chunk the new chunk being evaluated\r\n            @param previousChunk the chunk that appeared immediately before the current chunk\r\n            @return true if the two chunks represent different words (i.e. should have a space between them).  False otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.GetResultantText(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkFilter)\">\r\n            Gets text that meets the specified filter\r\n            If multiple text extractions will be performed for the same page (i.e. for different physical regions of the page), \r\n            filtering at this level is more efficient than filtering using {@link FilteredRenderListener} - but not nearly as powerful\r\n            because most of the RenderInfo state is not captured in {@link TextChunk}\r\n            @param chunkFilter the filter to to apply\r\n            @return the text results so far, filtered using the specified filter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.GetResultantText\">\r\n            Returns the result so far.\r\n            @return  a String with the resulting text.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.DumpState\">\r\n            Used for debugging only \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.RenderText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            \r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderText(com.itextpdf.text.pdf.parser.TextRenderInfo)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.StartLocation\">\r\n            the starting location of the chunk \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.EndLocation\">\r\n            the ending location of the chunk \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.OrientationMagnitude\">\r\n            the orientation as a scalar for quick sorting \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.DistPerpendicular\">\r\n            perpendicular distance to the orientation unit vector (i.e. the Y position in an unrotated coordinate system)\r\n            we round to the nearest integer to handle the fuzziness of comparing floats \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.DistParallelStart\">\r\n            distance of the start of the chunk parallel to the orientation unit vector (i.e. the X position in an unrotated coordinate system) \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.DistParallelEnd\">\r\n            distance of the end of the chunk parallel to the orientation unit vector (i.e. the X position in an unrotated coordinate system) \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.CharSpaceWidth\">\r\n            the width of a single space character in the font of the chunk \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.SameLine(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation)\">\r\n            @param comparedLine the location to compare to\r\n            @return true is this location is on the the same line as the other\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation.DistanceFromEndOf(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation)\">\r\n            Computes the distance between the end of 'other' and the beginning of this chunk\r\n            in the direction of this chunk's orientation vector.  Note that it's a bad idea\r\n            to call this for chunks that aren't on the same line and orientation, but we don't\r\n            explicitly check for that condition for performance reasons.\r\n            @param other\r\n            @return the number of spaces between the end of 'other' and the beginning of this chunk\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunkLocationDefaultImp.orientationVector\">\r\n            unit vector in the orientation of the chunk \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunkLocationDefaultImp.CompareTo(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkLocation)\">\r\n            Compares based on orientation, perpendicular distance, then parallel distance\r\n            @see java.lang.Comparable#compareTo(java.lang.Object)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk\">\r\n            Represents a chunk of text, it's orientation, and location relative to the orientation vector\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.text\">\r\n            the text of the chunk \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.StartLocation\">\r\n            @return the start location of the text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.EndLocation\">\r\n            @return the end location of the text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.CharSpaceWidth\">\r\n            @return the width of a single space character as rendered by this chunk\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.DistanceFromEndOf(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk)\">\r\n            Computes the distance between the end of 'other' and the beginning of this chunk\r\n            in the direction of this chunk's orientation vector.  Note that it's a bad idea\r\n            to call this for chunks that aren't on the same line and orientation, but we don't\r\n            explicitly check for that condition for performance reasons.\r\n            @param other\r\n            @return the number of spaces between the end of 'other' and the beginning of this chunk\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.CompareTo(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk)\">\r\n            Compares based on orientation, perpendicular distance, then parallel distance\r\n            @see java.lang.Comparable#compareTo(java.lang.Object)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk.SameLine(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk)\">\r\n            @param as the location to compare to\r\n            @return true is this location is on the the same line as the other\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.CompareInts(System.Int32,System.Int32)\">\r\n            \r\n             @param int1\r\n             @param int2\r\n             @return comparison of the two integers\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo)\">\r\n            no-op method - this renderer isn't interested in image events\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(com.itextpdf.text.pdf.parser.ImageRenderInfo)\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkFilter\">\r\n            Specifies a filter for filtering {@link TextChunk} objects during text extraction \r\n            @see LocationTextExtractionStrategy#getResultantText(TextChunkFilter)\r\n            @since 5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.ITextChunkFilter.Accept(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy.TextChunk)\">\r\n            @param textChunk the chunk to check\r\n            @return true if the chunk should be allowed\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.MarkedContentInfo\">\r\n            Represents a Marked Content block in a PDF\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.MarkedContentInfo.GetTag\">\r\n            Get the tag of this marked content\r\n            @return the tag of this marked content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.MarkedContentInfo.HasMcid\">\r\n            Determine if an MCID is available\r\n            @return true if the MCID is available, false otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.MarkedContentInfo.GetMcid\">\r\n            Gets the MCID value  If the Marked Content contains\r\n            an MCID entry, returns that value.  Otherwise, a {@link NullPointerException} is thrown.\r\n            @return the MCID value\r\n            @throws NullPointerException if there is no MCID (see {@link MarkedContentInfo#hasMcid()})\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.MarkedContentRenderFilter\">\r\n            A {@link RenderFilter} that only allows text within a specified marked content sequence.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.MarkedContentRenderFilter.mcid\">\r\n            The MCID to match. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.MarkedContentRenderFilter.#ctor(System.Int32)\">\r\n            Constructs a filter\r\n            @param mcid the MCID to match\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.MarkedContentRenderFilter.AllowText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            @see com.itextpdf.text.pdf.parser.RenderFilter#allowText(com.itextpdf.text.pdf.parser.TextRenderInfo)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.Matrix\">\r\n            Keeps all the values of a 3 by 3 matrix\r\n            and allows you to do some math with matrices.\r\n            @since   2.1.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I11\">\r\n            the row=1, col=1 position ('a') in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I12\">\r\n            the row=1, col=2 position ('b') in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I13\">\r\n            the row=1, col=3 position (always 0 for 2-D) in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I21\">\r\n            the row=2, col=1 position ('c') in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I22\">\r\n            the row=2, col=2 position ('d') in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I23\">\r\n            the row=2, col=3 position (always 0 for 2-D) in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I31\">\r\n            the row=3, col=1 ('e', or X translation) position in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I32\">\r\n            the row=3, col=2 ('f', or Y translation) position in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.I33\">\r\n            the row=3, col=3 position (always 1 for 2-D) in the matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Matrix.vals\">\r\n            the values inside the matrix (the identity matrix by default).\r\n            default initialization is performed in the default constructor.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.#ctor\">\r\n            constructs a new Matrix with identity.\r\n            !shall be called from any other constructor!\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.#ctor(System.Single,System.Single)\">\r\n            Constructs a matrix that represents translation\r\n            @param tx\r\n            @param ty\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Creates a Matrix with 6 specified entries\r\n            @param a\r\n            @param b\r\n            @param c\r\n            @param d\r\n            @param e\r\n            @param f\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.Matrix.Item(System.Int32)\">\r\n            Gets a specific value inside the matrix.\r\n            @param   index   an array index corresponding with a value inside the matrix\r\n            @return  the value at that specific position.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.Multiply(iTextSharp.text.pdf.parser.Matrix)\">\r\n            multiplies this matrix by 'b' and returns the result\r\n            See http://en.wikipedia.org/wiki/Matrix_multiplication\r\n            @param by The matrix to multiply by\r\n            @return  the resulting matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.Subtract(iTextSharp.text.pdf.parser.Matrix)\">\r\n            Subtracts a matrix from this matrix and returns the results\r\n            @param arg the matrix to subtract from this matrix\r\n            @return a Matrix object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.GetDeterminant\">\r\n            Computes the determinant of the matrix.\r\n            @return the determinant of the matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.Equals(System.Object)\">\r\n            Checks equality of matrices.\r\n            @param obj   the other Matrix that needs to be compared with this matrix.\r\n            @return  true if both matrices are equal\r\n            @see java.lang.Object#equals(java.lang.Object)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.GetHashCode\">\r\n            Generates a hash code for this object.\r\n            @return  the hash code of this object\r\n            @see java.lang.Object#hashCode()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Matrix.ToString\">\r\n            Generates a String representation of the matrix.\r\n            @return  the values, delimited with tabs and newlines.\r\n            @see java.lang.Object#toString()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.MultiFilteredRenderListener.AttachRenderListener``1(``0,iTextSharp.text.pdf.parser.RenderFilter[])\">\r\n            Attaches a {@link RenderListener} for the corresponding filter set.\r\n            @param delegate RenderListener instance to be attached.\r\n            @param filterSet filter set to be attached. The delegate will be invoked if all the filters pass.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.Path\">\r\n             Paths define shapes, trajectories, and regions of all sorts. They shall be used\r\n             to draw lines, define the shapes of filled areas, and specify boundaries for clipping\r\n             other graphics. A path shall be composed of straight and curved line segments, which\r\n             may connect to one another or may be disconnected.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.Path.Subpaths\">\r\n            @return A {@link java.util.List} of subpaths forming this path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.AddSubpath(iTextSharp.text.pdf.parser.Subpath)\">\r\n             Adds the subpath to this path.\r\n            \r\n             @param subpath The subpath to be added to this path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.AddSubpaths(System.Collections.Generic.IList{iTextSharp.text.pdf.parser.Subpath})\">\r\n             Adds the subpaths to this path.\r\n            \r\n             @param subpaths {@link java.util.List} of subpaths to be added to this path.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.Path.CurrentPoint\">\r\n             The current point is the trailing endpoint of the segment most recently added to the current path.\r\n            \r\n             @return The current point.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.MoveTo(System.Single,System.Single)\">\r\n            Begins a new subpath by moving the current point to coordinates <CODE>(x, y)</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.LineTo(System.Single,System.Single)\">\r\n            Appends a straight line segment from the current point to the point <CODE>(x, y)</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.CurveTo(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Appends a cubic Bezier curve to the current path. The curve shall extend from\r\n            the current point to the point <CODE>(x3, y3)</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.CurveTo(System.Single,System.Single,System.Single,System.Single)\">\r\n            Appends a cubic Bezier curve to the current path. The curve shall extend from\r\n            the current point to the point <CODE>(x3, y3)</CODE> with the note that the current\r\n            point represents two control points.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.CurveFromTo(System.Single,System.Single,System.Single,System.Single)\">\r\n            Appends a cubic Bezier curve to the current path. The curve shall extend from\r\n            the current point to the point <CODE>(x3, y3)</CODE> with the note that the (x3, y3)\r\n            point represents two control points.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.Rectangle(System.Single,System.Single,System.Single,System.Single)\">\r\n            Appends a rectangle to the current path as a complete subpath.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.CloseSubpath\">\r\n            Closes the current subpath.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.CloseAllSubpaths\">\r\n            Closes all subpathes contained in this path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.ReplaceCloseWithLine\">\r\n            Adds additional line to each closed subpath and makes the subpath unclosed. \r\n            The line connects the last and the first points of the subpaths.\r\n            \r\n            @returns Indices of modified subpaths.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Path.IsEmpty\">\r\n            Path is empty if it contains no subpaths.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PathConstructionRenderInfo\">\r\n             Contains information relating to construction the current path.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.MOVETO\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#moveTo(float, float)}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.LINETO\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#lineTo(float, float)}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.CURVE_123\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#curveTo(float, float, float, float, float, float)}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.CURVE_23\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#curveTo(float, float, float, float)}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.CURVE_13\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#curveFromTo(float, float, float, float)}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.CLOSE\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#closeSubpath()}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.RECT\">\r\n            See {@link com.itextpdf.text.pdf.parser.Path#rectangle(float, float, float, float)}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.#ctor(System.Int32,System.Collections.Generic.IList{System.Single},iTextSharp.text.pdf.parser.Matrix)\">\r\n            @param operation   Indicates which path-construction operation should be performed.\r\n            @param segmentData Contains data of a new segment being added to the current path.\r\n                               E.g. x, y, w, h for rectangle; x, y for line etc.\r\n            @param ctm         Current transformation matrix.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.#ctor(System.Int32,iTextSharp.text.pdf.parser.Matrix)\">\r\n            See {@link #PathConstructionRenderInfo(int, java.util.List, Matrix)}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.Operation\">\r\n            @return construction operation should be performed on the current path.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.SegmentData\">\r\n            @return {@link java.util.List} containing data of a new segment (E.g. x, y, w, h for rectangle;\r\n                    x, y for line etc.) if the specified operation relates to adding the segment to the\r\n                    current path, <CODE>null</CODE> otherwise.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PathConstructionRenderInfo.Ctm\">\r\n            @return Current transformation matrix.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PathPaintingRenderInfo\">\r\n             Contains information relating to painting current path.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.NONZERO_WINDING_RULE\">\r\n             The nonzero winding number rule determines whether a given point is inside a path by\r\n             conceptually drawing a ray from that point to infinity in any direction and then examining\r\n             the places where a segment of the path crosses the ray. Starting with a count of 0, the rule\r\n             adds 1 each time a path segment crosses the ray from left to right and subtracts 1 each time a\r\n             segment crosses from right to left. After counting all the crossings, if the result is 0, the\r\n             point is outside the path; otherwise, it is inside.\r\n            \r\n             For more details see PDF spec.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.EVEN_ODD_RULE\">\r\n             The even-odd rule determines whether a point is inside a path by drawing a ray from that point in\r\n             any direction and simply counting the number of path segments that cross the ray, regardless of\r\n             direction. If this number is odd, the point is inside; if even, the point is outside.\r\n            \r\n             For more details see PDF spec.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.NO_OP\">\r\n            End the path object without filling or stroking it. This operator shall be a path-painting no-op,\r\n            used primarily for the side effect of changing the current clipping path\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.STROKE\">\r\n            Value specifying stroke operation to perform on the current path.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.FILL\">\r\n            Value specifying fill operation to perform on the current path. When the fill operation\r\n            is performed it should use either nonzero winding or even-odd rule.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.#ctor(System.Int32,System.Int32,iTextSharp.text.pdf.parser.GraphicsState)\">\r\n            @param operation One of the possible combinations of {@link #STROKE} and {@link #FILL} values or {@link #NO_OP}\r\n            @param rule      Either {@link #NONZERO_WINDING_RULE} or {@link #EVEN_ODD_RULE}.\r\n            @param gs        The graphics state.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.#ctor(System.Int32,iTextSharp.text.pdf.parser.GraphicsState)\">\r\n             If the operation is {@link #NO_OP} then the rule is ignored,\r\n             otherwise {@link #NONZERO_WINDING_RULE} is used by default.\r\n            \r\n             See {@link #PathPaintingRenderInfo(int, int, GraphicsState)}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.Operation\">\r\n            @return <CODE>int</CODE> value which is either {@link #NO_OP} or one of possible\r\n            combinations of {@link #STROKE} and {@link #FILL}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.Rule\">\r\n            @return Either {@link #NONZERO_WINDING_RULE} or {@link #EVEN_ODD_RULE}.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PathPaintingRenderInfo.Ctm\">\r\n            @return Current transformation matrix.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentReaderTool\">\r\n            Tool that parses the content of a PDF document.\r\n            @since   2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.GetDictionaryDetail(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Shows the detail of a dictionary.\r\n            This is similar to the PdfLister functionality.\r\n            @param dic   the dictionary of which you want the detail\r\n            @return  a String representation of the dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.GetDictionaryDetail(iTextSharp.text.pdf.PdfDictionary,System.Int32)\">\r\n            Shows the detail of a dictionary.\r\n            @param dic   the dictionary of which you want the detail\r\n            @param depth the depth of the current dictionary (for nested dictionaries)\r\n            @return  a String representation of the dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.GetXObjectDetail(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Displays a summary of the entries in the XObject dictionary for the stream\r\n            @param resourceDic the resource dictionary for the stream\r\n            @return a string with the summary of the entries\r\n            @throws IOException\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.ListContentStreamForPage(iTextSharp.text.pdf.PdfReader,System.Int32,System.IO.TextWriter)\">\r\n            Writes information about a specific page from PdfReader to the specified output stream.\r\n            @since 2.1.5\r\n            @param reader    the PdfReader to read the page content from\r\n            @param pageNum   the page number to read\r\n            @param out       the output stream to send the content to\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.ListContentStream(System.String,System.IO.TextWriter)\">\r\n            Writes information about each page in a PDF file to the specified output stream.\r\n            @since 2.1.5\r\n            @param pdfFile   a File instance referring to a PDF file\r\n            @param out       the output stream to send the content to\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.ListContentStream(System.String,System.Int32,System.IO.TextWriter)\">\r\n            Writes information about the specified page in a PDF file to the specified output stream.\r\n            @since 2.1.5\r\n            @param pdfFile   a File instance referring to a PDF file\r\n            @param pageNum   the page number to read\r\n            @param out       the output stream to send the content to\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentReaderTool.Main(System.String[])\">\r\n            Writes information about each page in a PDF file to the specified file, or System.out.\r\n            @param args\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor\">\r\n            Processor for a PDF content Stream.\r\n            @since   2.1.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.DEFAULTOPERATOR\">\r\n            Default oper\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.operators\">\r\n            A map with all supported operators (PDF syntax). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.resources\">\r\n            Resources for the content stream. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.gsStack\">\r\n            Stack keeping track of the graphics state. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.textMatrix\">\r\n            Text matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.textLineMatrix\">\r\n            Text line matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.renderListener\">\r\n            Listener that will be notified of render events \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.xobjectDoHandlers\">\r\n            A map with all supported XObject handlers \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.cachedFonts\">\r\n            The font cache.\r\n            @since 5.0.6\r\n             \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.markedContentStack\">\r\n            A stack containing marked content info.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.#ctor(iTextSharp.text.pdf.parser.IRenderListener)\">\r\n             Creates a new PDF Content Stream Processor that will send it's output to the\r\n             designated render listener.\r\n            \r\n             @param renderListener the {@link RenderListener} that will receive rendering notifications\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.RegisterXObjectDoHandler(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.parser.IXObjectDoHandler)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.GetFont(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Gets the font pointed to by the indirect reference. The font may have been cached.\r\n            @param ind the indirect reference ponting to the font\r\n            @return the font\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.PopulateOperators\">\r\n            Loads all the supported graphics and text state operators in a map.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.RegisterContentOperator(System.String,iTextSharp.text.pdf.parser.IContentOperator)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.RegisteredOperatorStrings\">\r\n            @return {@link java.util.Collection} containing all the registered operators strings\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.Reset\">\r\n            Resets the graphics state stack, matrices and resources.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.Gs\">\r\n            Returns the current graphics state.\r\n            @return  the graphics state\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.InvokeOperator(iTextSharp.text.pdf.PdfLiteral,System.Collections.Generic.List{iTextSharp.text.pdf.PdfObject})\">\r\n            Invokes an oper.\r\n            @param oper  the PDF Syntax of the oper\r\n            @param operands  a list with operands\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.BeginMarkedContent(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Add to the marked content stack\r\n            @param tag the tag of the marked content\r\n            @param dict the PdfDictionary associated with the marked content\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.EndMarkedContent\">\r\n            Remove the latest marked content from the stack.  Keeps track of the BMC, BDC and EMC operators.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.BeginText\">\r\n            Used to trigger beginTextBlock on the renderListener\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.EndText\">\r\n            Used to trigger endTextBlock on the renderListener\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.DisplayPdfString(iTextSharp.text.pdf.PdfString)\">\r\n            Displays text.\r\n            @param string    the text to display\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.DisplayXObject(iTextSharp.text.pdf.PdfName)\">\r\n            Displays an XObject using the registered handler for this XObject's subtype\r\n            @param xobjectName the name of the XObject to retrieve from the resource dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.PaintPath(System.Int32,System.Int32,System.Boolean)\">\r\n             Displays the current path.\r\n            \r\n             @param operation One of the possible combinations of {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#STROKE}\r\n                              and {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#FILL} values or\r\n                              {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#NO_OP}\r\n             @param rule      Either {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#NONZERO_WINDING_RULE} or\r\n                              {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#EVEN_ODD_RULE}\r\n                              In case it isn't applicable pass any <CODE>int</CODE> value.\r\n             @param close     Indicates whether the path should be closed or not.\r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ModifyPath(System.Int32,System.Collections.Generic.IList{System.Single})\">\r\n             Modifies the current path.\r\n            \r\n             @param operation   Indicates which path-construction operation should be performed.\r\n             @param segmentData Contains x, y components of points of a new segment being added to the current path.\r\n                                E.g. x1 y1 x2 y2 x3 y3 etc. It's ignored for \"close subpath\" operarion (h).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ApplyTextAdjust(System.Single)\">\r\n            Adjusts the text matrix for the specified adjustment value (see TJ oper in the PDF spec for information)\r\n            @param tj the text adjustment\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ProcessContent(System.Byte[],iTextSharp.text.pdf.PdfDictionary)\">\r\n            Processes PDF syntax.\r\n            <b>Note:</b> If you re-use a given {@link PdfContentStreamProcessor}, you must call {@link PdfContentStreamProcessor#reset()}\r\n            @param contentBytes  the bytes of a content stream\r\n            @param resources     the resources that come with the content stream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.HandleInlineImage(iTextSharp.text.pdf.parser.InlineImageInfo,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Callback when an inline image is found.  This requires special handling because inline images don't follow the standard operator syntax\r\n            @param info the inline image\r\n            @param colorSpaceDic the color space for the inline immage\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.RenderListener\">\r\n            Property for the RenderListener object maintained in this class.\r\n            Necessary for implementing custom ContentOperator implementations.\r\n            @return the renderListener\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ResourceDictionary\">\r\n            A resource dictionary that allows stack-like behavior to support resource dictionary inheritance\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.IgnoreOperatorContentOperator\">\r\n            A content oper implementation (unregistered).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ShowTextArray\">\r\n            A content oper implementation (TJ).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.MoveNextLineAndShowTextWithSpacing\">\r\n            A content oper implementation (\").\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.MoveNextLineAndShowText\">\r\n            A content oper implementation (').\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ShowText\">\r\n            A content oper implementation (Tj).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.TextMoveNextLine\">\r\n            A content oper implementation (T*).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.TextSetTextMatrix\">\r\n            A content oper implementation (Tm).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.TextMoveStartNextLineWithLeading\">\r\n            A content oper implementation (TD).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.TextMoveStartNextLine\">\r\n            A content oper implementation (Td).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextFont\">\r\n            A content oper implementation (Tf).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextRenderMode\">\r\n            A content oper implementation (Tr).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextRise\">\r\n            A content oper implementation (Ts).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextLeading\">\r\n            A content oper implementation (TL).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextHorizontalScaling\">\r\n            A content oper implementation (Tz).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextCharacterSpacing\">\r\n            A content oper implementation (Tc).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetTextWordSpacing\">\r\n            A content oper implementation (Tw).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ProcessGraphicsStateResource\">\r\n            A content oper implementation (gs).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.PushGraphicsState\">\r\n            A content oper implementation (q).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ModifyCurrentTransformationMatrix\">\r\n            A content oper implementation (cm).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.GetColor(iTextSharp.text.pdf.PdfName,System.Collections.Generic.List{iTextSharp.text.pdf.PdfObject})\">\r\n            Gets a color based on a list of operands.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.GetColor(System.Int32,System.Collections.Generic.List{iTextSharp.text.pdf.PdfObject})\">\r\n            Gets a color based on a list of operands.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetGrayFill\">\r\n            A content operator implementation (g).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetGrayStroke\">\r\n            A content operator implementation (G).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetRGBFill\">\r\n            A content operator implementation (rg).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetRGBStroke\">\r\n            A content operator implementation (RG).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetCMYKFill\">\r\n            A content operator implementation (rg).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetCMYKStroke\">\r\n            A content operator implementation (RG).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetColorSpaceFill\">\r\n            A content operator implementation (cs).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetColorSpaceStroke\">\r\n            A content operator implementation (CS).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetColorFill\">\r\n            A content operator implementation (sc / scn).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetColorStroke\">\r\n            A content operator implementation (SC / SCN).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.PopGraphicsState\">\r\n            A content oper implementation (Q).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.BeginTextC\">\r\n            A content oper implementation (BT).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.EndTextC\">\r\n            A content oper implementation (ET).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.BeginMarkedContentC\">\r\n            A content oper implementation (BMC).\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.BeginMarkedContentDictionary\">\r\n            A content oper implementation (BDC).\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.EndMarkedContentC\">\r\n            A content oper implementation (EMC).\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.Do\">\r\n            A content oper implementation (Do).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetLineWidth\">\r\n            A content operator implementation (w).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetLineCap\">\r\n            A content operator implementation (J).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetLineJoin\">\r\n            A content operator implementation (j).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetMiterLimit\">\r\n            A content operator implementation (M).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.SetLineDashPattern\">\r\n            A content operator implementation (d).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.MoveTo\">\r\n             A content operator implementation (m).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.LineTo\">\r\n             A content operator implementation (l).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.Curve\">\r\n             A content operator implementation (c).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.CurveFirstPointDuplicated\">\r\n             A content operator implementation (v).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.CurveFourhPointDuplicated\">\r\n             A content operator implementation (y).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.CloseSubpath\">\r\n             A content operator implementation (h).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.Rectangle\">\r\n             A content operator implementation (re).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.PaintPathOp\">\r\n             A content operator implementation (S, s, f, F, f*, B, B*, b, b*).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.PaintPathOp.#ctor(System.Int32,System.Int32,System.Boolean)\">\r\n             Constructs PainPath object.\r\n            \r\n             @param operation One of the possible combinations of {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#STROKE}\r\n                              and {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#FILL} values or\r\n                              {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#NO_OP}\r\n             @param rule      Either {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#NONZERO_WINDING_RULE} or\r\n                              {@link com.itextpdf.text.pdf.parser.PathPaintingRenderInfo#EVEN_ODD_RULE}\r\n                              In case it isn't applicable pass any value.\r\n             @param close     Indicates whether the path should be closed or not.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.EndPath\">\r\n             A content operator implementation (n).\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.FormXObjectDoHandler\">\r\n            An XObject subtype handler for FORM\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.ImageXObjectDoHandler\">\r\n            An XObject subtype handler for IMAGE\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfContentStreamProcessor.IgnoreXObjectDoHandler\">\r\n            An XObject subtype handler that does nothing\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfImageObject\">\r\n            An object that contains an image dictionary and image bytes.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfImageObject.ImageBytesType\">\r\n            Different types of data that can be stored in the bytes of a {@link PdfImageObject}\r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfImageObject.ImageBytesType.fileExtension\">\r\n            the recommended file extension for streams of this type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.ImageBytesType.#ctor(System.String)\">\r\n            @param fileExtension the recommended file extension for use with data of this type (for example, if the bytes were just saved to a file, what extension should the file have)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.PdfImageObject.ImageBytesType.FileExtension\">\r\n            @return the file extension registered when this type was created\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfImageObject.TrackingFilter\">\r\n            A filter that does nothing, but keeps track of the filter type that was used\r\n            @since 5.0.4 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfImageObject.dictionary\">\r\n            The image dictionary. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfImageObject.imageBytes\">\r\n            The decoded image bytes (after applying filters), or the raw image bytes if unable to decode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfImageObject.streamContentType\">\r\n            Tracks the type of data that is actually stored in the streamBytes member\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.GetImageBytesType\">\r\n            @return the type of image data that is returned by getImageBytes()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.#ctor(iTextSharp.text.pdf.PRStream)\">\r\n            Creates a PdfImage object.\r\n            @param stream a PRStream\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.#ctor(iTextSharp.text.pdf.PRStream,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Creates a PdfImage object.\r\n            @param stream a PRStream\r\n            @param colorSpaceDic a color space dictionary\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.#ctor(iTextSharp.text.pdf.PdfDictionary,System.Byte[],iTextSharp.text.pdf.PdfDictionary)\">\r\n            Creats a PdfImage object using an explicitly provided dictionary and image bytes\r\n            @param dictionary the dictionary for the image\r\n            @param samples the samples\r\n            @since 5.0.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.Get(iTextSharp.text.pdf.PdfName)\">\r\n            Returns an entry from the image dictionary.\r\n            @param key a key\r\n            @return the value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.GetDictionary\">\r\n            Returns the image dictionary.\r\n            @return the dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.FindColorspace(iTextSharp.text.pdf.PdfObject,System.Boolean)\">\r\n            Sets state of this object according to the color space \r\n            @param colorspace the colorspace to use\r\n            @param allowIndexed whether indexed color spaces will be resolved (used for recursive call)\r\n            @throws IOException if there is a problem with reading from the underlying stream  \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.DecodeImageBytes\">\r\n            decodes the bytes currently captured in the streamBytes and replaces it with an image representation of the bytes\r\n            (this will either be a png or a tiff, depending on the color depth of the image)\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfImageObject.GetImageAsBytes\">\r\n            @return the bytes of the image (the format will be as specified in {@link PdfImageObject#getImageBytesType()}\r\n            @throws IOException\r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfReaderContentParser\">\r\n            A utility class that makes it cleaner to process content from pages of a PdfReader\r\n            through a specified RenderListener.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.PdfReaderContentParser.reader\">\r\n            the reader this parser will process \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.parser.PdfReaderContentParser.ProcessContent``1(System.Int32,``0,System.Collections.Generic.IDictionary{System.String,iTextSharp.text.pdf.parser.IContentOperator})”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.parser.PdfReaderContentParser.ProcessContent``1(System.Int32,``0)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.parser.PdfTextExtractor\">\r\n            Extracts text from a PDF file.\r\n            @since   2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(iTextSharp.text.pdf.PdfReader,System.Int32,iTextSharp.text.pdf.parser.ITextExtractionStrategy,System.Collections.Generic.IDictionary{System.String,iTextSharp.text.pdf.parser.IContentOperator})\">\r\n            Extract text from a specified page using an extraction strategy.\r\n            Also allows registration of custom ContentOperators\r\n            @param reader the reader to extract text from\r\n            @param pageNumber the page to extract text from\r\n            @param strategy the strategy to use for extracting text\r\n            @param additionalContentOperators an optional dictionary of custom IContentOperators for rendering instructions\r\n            @return the extracted text\r\n            @throws IOException if any operation fails while reading from the provided PdfReader\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(iTextSharp.text.pdf.PdfReader,System.Int32,iTextSharp.text.pdf.parser.ITextExtractionStrategy)\">\r\n            Extract text from a specified page using an extraction strategy.\r\n            @param reader the reader to extract text from\r\n            @param pageNumber the page to extract text from\r\n            @param strategy the strategy to use for extracting text\r\n            @return the extracted text\r\n            @throws IOException if any operation fails while reading from the provided PdfReader\r\n            @since 5.0.2\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(iTextSharp.text.pdf.PdfReader,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.parser.RegionTextRenderFilter\">\r\n            A {@link RenderFilter} that only allows text within a specified rectangular region\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.RegionTextRenderFilter.filterRect\">\r\n            the region to allow text from \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.RegionTextRenderFilter.#ctor(System.util.RectangleJ)\">\r\n            Constructs a filter\r\n            @param filterRect the rectangle to filter text against.  Note that this is a java.awt.Rectangle !\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.RegionTextRenderFilter.#ctor(iTextSharp.text.Rectangle)\">\r\n            Constructs a filter\r\n            @param filterRect the rectangle to filter text against.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.RegionTextRenderFilter.AllowText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            @see com.itextpdf.text.pdf.parser.RenderFilter#allowText(com.itextpdf.text.pdf.parser.TextRenderInfo)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.RenderFilter\">\r\n            Interface for defining filters for use with {@link FilteredRenderListener}\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.RenderFilter.AllowText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            @param renderInfo\r\n            @return true if the text render operation should be performed\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.RenderFilter.AllowImage(iTextSharp.text.pdf.parser.ImageRenderInfo)\">\r\n            \r\n            @param renderInfo\r\n            @return true if the image render operation should be performed\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.IShape\">\r\n            Represents segment from a PDF path.\r\n            \r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.IShape.GetBasePoints\">\r\n             Treat base points as the points which are enough to construct a shape.\r\n             E.g. for a bezier curve they are control points, for a line segment - the start and the end points\r\n             of the segment.\r\n            \r\n             @return Ordered list consisting of shape's base points.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy\">\r\n            A simple text extraction renderer.\r\n            \r\n            This renderer keeps track of the current Y position of each string.  If it detects\r\n            that the y position has changed, it inserts a line break into the output.  If the\r\n            PDF renders text in a non-top-to-bottom fashion, this will result in the text not\r\n            being a true representation of how it appears in the PDF.\r\n            \r\n            This renderer also uses a simple strategy based on the font metrics to determine if\r\n            a blank space should be inserted into the output.\r\n            \r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.result\">\r\n            used to store the resulting String. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.#ctor\">\r\n            Creates a new text extraction renderer.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.BeginTextBlock\">\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.EndTextBlock\">\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.GetResultantText\">\r\n            Returns the result so far.\r\n            @return  a String with the resulting text.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.AppendTextChunk(System.String)\">\r\n            Used to actually append text to the text results.  Subclasses can use this to insert\r\n            text that wouldn't normally be included in text parsing (e.g. result of OCR performed against\r\n            image content)\r\n            @param text the text to append to the text results accumulated so far\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.RenderText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            Captures text using a simplified algorithm for inserting hard returns and spaces\r\n            @param   renderInfo  render info\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy.RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo)\">\r\n            no-op method - this renderer isn't interested in image events\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(com.itextpdf.text.pdf.parser.ImageRenderInfo)\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.Subpath\">\r\n             As subpath is a part of a path comprising a sequence of connected segments.\r\n            \r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.#ctor(iTextSharp.text.pdf.parser.Subpath)\">\r\n            Copy constuctor.\r\n            @param subpath\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.#ctor(iTextSharp.awt.geom.Point2D)\">\r\n            Constructs a new subpath starting at the given point.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.#ctor(System.Single,System.Single)\">\r\n            Constructs a new subpath starting at the given point.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.SetStartPoint(iTextSharp.awt.geom.Point2D)\">\r\n            Sets the start point of the subpath.\r\n            @param startPoint\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.SetStartPoint(System.Single,System.Single)\">\r\n            Sets the start point of the subpath.\r\n            @param x\r\n            @param y\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.GetStartPoint\">\r\n            @return The point this subpath starts at.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.GetLastPoint\">\r\n            @return The last point of the subpath.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.AddSegment(iTextSharp.text.pdf.parser.IShape)\">\r\n            Adds a segment to the subpath.\r\n            Note: each new segment shall start at the end of the previous segment.\r\n            @param segment new segment.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.GetSegments\">\r\n            @return {@link java.util.List} comprising all the segments\r\n                    the subpath made on.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.IsEmpty\">\r\n            Checks whether subpath is empty or not.\r\n            @return true if the subpath is empty, false otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.IsSinglePointOpen\">\r\n            @return <CODE>true</CODE> if this subpath contains only one point and it is not closed,\r\n                    <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.Subpath.Closed\">\r\n             Returns or sets a <CODE>bool</CODE> value indicating whether the subpath must be closed or not.\r\n             Ignore this value if the subpath is a rectangle because in this case it is already closed\r\n             (of course if you paint the path using <CODE>re</CODE> operator)\r\n            \r\n             @return <CODE>bool</CODE> value indicating whether the path must be closed or not.\r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.IsDegenerate\">\r\n             Returns a <CODE>bool</CODE> indicating whether the subpath is degenerate or not.\r\n             A degenerate subpath is the subpath consisting of a single-point closed path or of\r\n             two or more points at the same coordinates.\r\n            \r\n             @return <CODE>bool</CODE> value indicating whether the path is degenerate or not.\r\n             @since 5.5.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Subpath.GetPiecewiseLinearApproximation\">\r\n            @return {@link java.util.List} containing points of piecewise linear approximation\r\n                    for this subpath.\r\n            @since 5.5.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.TaggedPdfReaderTool\">\r\n            Converts a tagged PDF document into an XML file.\r\n            \r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.reader\">\r\n            The reader obj from which the content streams are read. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.outp\">\r\n            The writer obj to which the XML will be written \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.ConvertToXml(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Text.Encoding)\">\r\n            Parses a string with structured content.\r\n            \r\n            @param reader\r\n                       the PdfReader that has access to the PDF file\r\n            @param os\r\n                       the Stream to which the resulting xml will be written\r\n            @param charset\r\n                       the charset to encode the data\r\n            @since 5.0.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.ConvertToXml(iTextSharp.text.pdf.PdfReader,System.IO.Stream)\">\r\n            Parses a string with structured content.\r\n            \r\n            @param reader\r\n                       the PdfReader that has access to the PDF file\r\n            @param os\r\n                       the Stream to which the resulting xml will be written\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.InspectChild(iTextSharp.text.pdf.PdfObject)\">\r\n            Inspects a child of a structured element. This can be an array or a\r\n            dictionary.\r\n            \r\n            @param k\r\n                       the child to inspect\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.InspectChildArray(iTextSharp.text.pdf.PdfArray)\">\r\n            If the child of a structured element is an array, we need to loop over\r\n            the elements.\r\n            \r\n            @param k\r\n                       the child array to inspect\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.InspectChildDictionary(iTextSharp.text.pdf.PdfDictionary)\">\r\n             If the child of a structured element is a dictionary, we inspect the\r\n             child; we may also draw a tag.\r\n            \r\n             @param k\r\n                        the child dictionary to inspect\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.InspectChildDictionary(iTextSharp.text.pdf.PdfDictionary,System.Boolean)\">\r\n            If the child of a structured element is a dictionary, we inspect the\r\n            child; we may also draw a tag.\r\n            \r\n            @param k\r\n                       the child dictionary to inspect\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TaggedPdfReaderTool.ParseTag(System.String,iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Searches for a tag in a page.\r\n            \r\n            @param tag\r\n                       the name of the tag\r\n            @param obj\r\n                       an identifier to find the marked content\r\n            @param page\r\n                       a page dictionary\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.TextMarginFinder\">\r\n            Allows you to find the rectangle that contains all the text in a page.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.RenderText(iTextSharp.text.pdf.parser.TextRenderInfo)\">\r\n            Method invokes by the PdfContentStreamProcessor.\r\n            Passes a TextRenderInfo for every text chunk that is encountered.\r\n            We'll use this object to obtain coordinates.\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderText(com.itextpdf.text.pdf.parser.TextRenderInfo)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.GetLlx\">\r\n            Getter for the left margin.\r\n            @return the X position of the left margin\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.GetLly\">\r\n            Getter for the bottom margin.\r\n            @return the Y position of the bottom margin\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.GetUrx\">\r\n            Getter for the right margin.\r\n            @return the X position of the right margin\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.GetUry\">\r\n            Getter for the top margin.\r\n            @return the Y position of the top margin\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.GetWidth\">\r\n            Gets the width of the text block.\r\n            @return a width\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.GetHeight\">\r\n            Gets the height of the text block.\r\n            @return a height\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.BeginTextBlock\">\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.EndTextBlock\">\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextMarginFinder.RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo)\">\r\n            @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(com.itextpdf.text.pdf.parser.ImageRenderInfo)\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.parser.TextRenderInfo”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.parser.TextRenderInfo.utf_16BeEncoding\">\r\n            ! .NET SPECIFIC ! \r\n            is used for caching \"UTF-16BE\" encoding to improve performance\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.TextRenderInfo.markedContentInfos\">\r\n            Array containing marked content info for the text.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.#ctor(iTextSharp.text.pdf.PdfString,iTextSharp.text.pdf.parser.GraphicsState,iTextSharp.text.pdf.parser.Matrix,System.Collections.ICollection)\">\r\n            Creates a new TextRenderInfo object\r\n            @param string the PDF string that should be displayed\r\n            @param gs the graphics state (note: at this time, this is not immutable, so don't cache it)\r\n            @param textMatrix the text matrix at the time of the render operation\r\n            @param markedContentInfo the marked content sequence, if available\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.#ctor(iTextSharp.text.pdf.parser.TextRenderInfo,iTextSharp.text.pdf.PdfString,System.Single)\">\r\n            Used for creating sub-TextRenderInfos for each individual character\r\n            @param parent the parent TextRenderInfo\r\n            @param string the content of a TextRenderInfo\r\n            @param horizontalOffset the unscaled horizontal offset of the character that this TextRenderInfo represents\r\n            @since 5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetText\">\r\n            @return the text to render\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.TextRenderInfo.PdfString\">\r\n            @return original PDF string\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.HasMcid(System.Int32)\">\r\n            Checks if the text belongs to a marked content sequence\r\n            with a given mcid.\r\n            @param mcid a marked content id\r\n            @return true if the text is marked with this id\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.HasMcid(System.Int32,System.Boolean)\">\r\n            \t     * Checks if the text belongs to a marked content sequence\r\n            \t     * with a given mcid.\r\n                     * @param mcid a marked content id\r\n                     * @param checkTheTopmostLevelOnly indicates whether to check the topmost level of marked content stack only\r\n                     * @return true if the text is marked with this id\r\n                     * @since 5.3.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetMcid\">\r\n            @return the marked content associated with the TextRenderInfo instance.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetUnscaledWidth\">\r\n            @return the unscaled (i.e. in Text space) width of the text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetBaseline\">\r\n            Gets the baseline for the text (i.e. the line that the text 'sits' on)\r\n            This value includes the Rise of the draw operation - see {@link #getRise()} for the amount added by Rise\r\n            @return the baseline line segment\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetAscentLine\">\r\n            Gets the ascentline for the text (i.e. the line that represents the topmost extent that a string of the current font could have)\r\n            This value includes the Rise of the draw operation - see {@link #getRise()} for the amount added by Rise\r\n            @return the ascentline line segment\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetDescentLine\">\r\n            Gets the descentline for the text (i.e. the line that represents the bottom most extent that a string of the current font could have)\r\n            This value includes the Rise of the draw operation - see {@link #getRise()} for the amount added by Rise\r\n            @return the descentline line segment\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetFont\">\r\n            Getter for the font\r\n            @return the font\r\n            @since iText 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetRise\">\r\n            The rise represents how far above the nominal baseline the text should be rendered.  The {@link #getBaseline()}, {@link #getAscentLine()} and {@link #getDescentLine()} methods already include Rise.\r\n            This method is exposed to allow listeners to determine if an explicit rise was involved in the computation of the baseline (this might be useful, for example, for identifying superscript rendering)\r\n            @return The Rise for the text draw operation, in user space units (Ts value, scaled to user space)\r\n            @since 5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.ConvertWidthFromTextSpaceToUserSpace(System.Single)\">\r\n            \r\n             @param width the width, in text space\r\n             @return the width in user space\r\n             @since 5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.ConvertHeightFromTextSpaceToUserSpace(System.Single)\">\r\n            \r\n             @param height the height, in text space\r\n             @return the height in user space\r\n             @since 5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetSingleSpaceWidth\">\r\n            @return The width, in user space units, of a single space character in the current font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetTextRenderMode\">\r\n            @return the text render mode that should be used for the text.  From the\r\n            PDF specification, this means:\r\n            <ul>\r\n              <li>0 = Fill text</li>\r\n              <li>1 = Stroke text</li>\r\n              <li>2 = Fill, then stroke text</li>\r\n              <li>3 = Invisible</li>\r\n              <li>4 = Fill text and add to path for clipping</li>\r\n              <li>5 = Stroke text and add to path for clipping</li>\r\n              <li>6 = Fill, then stroke text and add to path for clipping</li>\r\n              <li>7 = Add text to padd for clipping</li>\r\n            </ul>\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetFillColor\">\r\n            @return the current fill color.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetStrokeColor\">\r\n            @return the current stroke color.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetUnscaledFontSpaceWidth\">\r\n            Calculates the width of a space character.  If the font does not define\r\n            a width for a standard space character \\u0020, we also attempt to use\r\n            the width of \\u00A0 (a non-breaking space in many fonts)\r\n            @return the width of a single space character in text space units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetStringWidth(System.String)\">\r\n            Gets the width of a String in text space units\r\n            @param string    the string that needs measuring\r\n            @return          the width of a String in text space units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetPdfStringWidth(iTextSharp.text.pdf.PdfString,System.Boolean)\">\r\n            Gets the width of a PDF string in text space units\r\n            @param string        the string that needs measuring\r\n            @return  the width of a String in text space units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetCharacterRenderInfos\">\r\n            Provides detail useful if a listener needs access to the position of each individual glyph in the text render operation\r\n            @return  A list of {@link TextRenderInfo} objects that represent each glyph used in the draw operation. The next effect is if there was a separate Tj opertion for each character in the rendered string\r\n            @since   5.3.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetWidthAndWordSpacing(iTextSharp.text.pdf.PdfString,System.Boolean)\">\r\n            Calculates width and word spacing of a single character PDF string.\r\n            @param string            a character to calculate width.\r\n            @param singleCharString  true if PDF string represents single character, false otherwise.\r\n            @return                  array of 2 items: first item is a character width, second item is a calculated word spacing.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.Decode(iTextSharp.text.pdf.PdfString)\">\r\n            Decodes a PdfString (which will contain glyph ids encoded in the font's encoding)\r\n            based on the active font, and determine the unicode equivalent\r\n            @param in\tthe String that needs to be encoded\r\n            @return\t    the encoded String\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.DecodeSingleCharacter(iTextSharp.text.pdf.PdfString)\">\r\n            ! .NET SPECIFIC; this method is used to avoid unecessary using of StringBuilder because it is slow in .NET !\r\n            Decodes a single character PdfString (which will contain glyph ids encoded in the font's encoding)\r\n            based on the active font, and determine the unicode equivalent\r\n            @param in\tthe String that needs to be encoded\r\n            @return\t    the encoded String\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.GetCharCode(System.String)\">\r\n             Converts a single character string to char code.\r\n            \r\n             @param string single character string to convert to.\r\n             @return char code.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.TextRenderInfo.SplitString(iTextSharp.text.pdf.PdfString)\">\r\n            Split PDF string into array of single character PDF strings.\r\n            @param string    PDF string to be splitted.\r\n            @return          splitted PDF string.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.parser.Vector”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Vector.I1\">\r\n            index of the X coordinate \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Vector.I2\">\r\n            index of the Y coordinate \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Vector.I3\">\r\n            index of the Z coordinate \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.Vector.vals\">\r\n            the values inside the vector \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.#ctor(System.Single,System.Single,System.Single)\">\r\n            Creates a new Vector\r\n            @param x the X coordinate\r\n            @param y the Y coordinate\r\n            @param z the Z coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.Vector.Item(System.Int32)\">\r\n            Gets the value from a coordinate of the vector\r\n            @param index the index of the value to get (I1, I2 or I3)\r\n            @return a coordinate value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Cross(iTextSharp.text.pdf.parser.Matrix)\">\r\n            Computes the cross product of this vector and the specified matrix\r\n            @param by the matrix to cross this vector with\r\n            @return the result of the cross product\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Subtract(iTextSharp.text.pdf.parser.Vector)\">\r\n            Computes the difference between this vector and the specified vector\r\n            @param v the vector to subtract from this one\r\n            @return the results of the subtraction\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Cross(iTextSharp.text.pdf.parser.Vector)\">\r\n            Computes the cross product of this vector and the specified vector\r\n            @param with the vector to cross this vector with\r\n            @return the cross product\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Normalize\">\r\n            Normalizes the vector (i.e. returns the unit vector in the same orientation as this vector)\r\n            @return the unit vector\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Multiply(System.Single)\">\r\n            Multiplies the vector by a scalar\r\n            @param by the scalar to multiply by\r\n            @return the result of the scalar multiplication\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Dot(iTextSharp.text.pdf.parser.Vector)\">\r\n            Computes the dot product of this vector with the specified vector\r\n            @param with the vector to dot product this vector with\r\n            @return the dot product\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.parser.Vector.Length”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.parser.Vector.LengthSquared”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.ToString\">\r\n            @see java.lang.Object#toString()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.Vector.Equals(System.Object)\">\r\n            @since 5.0.1\r\n            @see java.lang.Object#equals(java.lang.Object)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.IXObjectDoHandler\">\r\n            @author Kevin Day\r\n            @since iText 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.InlineImageInfo\">\r\n            Represents an inline image from a PDF\r\n            @since 5.1.4\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.InlineImageInfo.ImageDictionary\">\r\n            @return the image dictionary associated with this inline image\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.parser.InlineImageInfo.Samples\">\r\n            @return the raw samples associated with this inline image\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.InlineImageUtils\">\r\n            Utility methods to help with processing of inline images\r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.parser.InlineImageUtils.InlineImageParseException\">\r\n            Simple class in case users need to differentiate an exception from processing\r\n            inline images vs other exceptions \r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.InlineImageUtils.inlineImageEntryAbbreviationMap\">\r\n            Map between key abbreviations allowed in dictionary of inline images and their\r\n            equivalent image dictionary keys\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.InlineImageUtils.inlineImageColorSpaceAbbreviationMap\">\r\n            Map between value abbreviations allowed in dictionary of inline images for COLORSPACE\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.parser.InlineImageUtils.inlineImageFilterAbbreviationMap\">\r\n            Map between value abbreviations allowed in dictionary of inline images for FILTER\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.ParseInlineImage(iTextSharp.text.pdf.PdfContentParser,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Parses an inline image from the provided content parser.  The parser must be positioned immediately following the BI operator in the content stream.\r\n            The parser will be left with current position immediately following the EI operator that terminates the inline image\r\n            @param ps the content parser to use for reading the image. \r\n            @return the parsed image\r\n            @throws IOException if anything goes wring with the parsing\r\n            @throws InlineImageParseException if parsing of the inline image failed due to issues specific to inline image processing\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.ParseInlineImageDictionary(iTextSharp.text.pdf.PdfContentParser)\">\r\n            Parses the next inline image dictionary from the parser.  The parser must be positioned immediately following the EI operator.\r\n            The parser will be left with position immediately following the whitespace character that follows the ID operator that ends the inline image dictionary.\r\n            @param ps the parser to extract the embedded image information from\r\n            @return the dictionary for the inline image, with any abbreviations converted to regular image dictionary keys and values\r\n            @throws IOException if the parse fails\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.GetAlternateValue(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Transforms value abbreviations into their corresponding real value \r\n            @param key the key that the value is for\r\n            @param value the value that might be an abbreviation\r\n            @return if value is an allowed abbreviation for the key, the expanded value for that abbreviation.  Otherwise, value is returned without modification \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.GetComponentsPerPixel(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfDictionary)\">\r\n            @param colorSpaceName the name of the color space. If null, a bi-tonal (black and white) color space is assumed.\r\n            @return the components per pixel for the specified color space\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.ComputeBytesPerRow(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Computes the number of unfiltered bytes that each row of the image will contain.\r\n            If the number of bytes results in a partial terminating byte, this number is rounded up\r\n            per the PDF specification\r\n            @param imageDictionary the dictionary of the inline image\r\n            @return the number of bytes per row of the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.ParseUnfilteredSamples(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfContentParser)\">\r\n            Parses the samples of the image from the underlying content parser, ignoring all filters.\r\n            The parser must be positioned immediately after the ID operator that ends the inline image's dictionary.\r\n            The parser will be left positioned immediately following the EI operator.\r\n            This is primarily useful if no filters have been applied. \r\n            @param imageDictionary the dictionary of the inline image\r\n            @param ps the content parser\r\n            @return the samples of the image\r\n            @throws IOException if anything bad happens during parsing\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.parser.InlineImageUtils.ParseInlineImageSamples(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfContentParser)\">\r\n            Parses the samples of the image from the underlying content parser, accounting for filters\r\n            The parser must be positioned immediately after the ID operator that ends the inline image's dictionary.\r\n            The parser will be left positioned immediately following the EI operator.\r\n            <b>Note:</b>This implementation does not actually apply the filters at this time\r\n            @param imageDictionary the dictionary of the inline image\r\n            @param ps the content parser\r\n            @return the samples of the image\r\n            @throws IOException if anything bad happens during parsing\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PatternColor\">\r\n            Represents a pattern. Can be used in high-level constructs (Paragraph, Cell, etc.).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PatternColor.painter\">\r\n            The actual pattern.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PatternColor.#ctor(iTextSharp.text.pdf.PdfPatternPainter)\">\r\n            Creates a color representing a pattern.\r\n            @param painter the actual pattern\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PatternColor.Painter\">\r\n            Gets the pattern.\r\n            @return the pattern\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfAcroForm\">\r\n            Each PDF document can contain maximum 1 AcroForm.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAcroForm.fieldTemplates\">\r\n            This is a map containing FieldTemplates. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAcroForm.documentFields\">\r\n            This is an array containing DocumentFields. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAcroForm.calculationOrder\">\r\n            This is an array containing the calculationorder of the fields. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAcroForm.sigFlags\">\r\n            Contains the signature flags. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates new PdfAcroForm \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.AddFieldTemplates(System.Collections.Generic.Dictionary{iTextSharp.text.pdf.PdfTemplate,System.Object})\">\r\n            Adds fieldTemplates.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.AddDocumentField(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Adds documentFields.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.IsValid\">\r\n            Closes the AcroForm.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.AddCalculationOrder(iTextSharp.text.pdf.PdfFormField)\">\r\n            Adds an object to the calculationOrder.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfAcroForm.SigFlags\">\r\n            Sets the signature flags.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.AddFormField(iTextSharp.text.pdf.PdfFormField)\">\r\n            Adds a formfield to the AcroForm.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.SetSignatureParams(iTextSharp.text.pdf.PdfFormField,System.String,System.Single,System.Single,System.Single,System.Single)\">\r\n            @param field\r\n            @param name\r\n            @param llx\r\n            @param lly\r\n            @param urx\r\n            @param ury\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAcroForm.DrawSignatureAppearences(iTextSharp.text.pdf.PdfFormField,System.Single,System.Single,System.Single,System.Single)\">\r\n            @param field\r\n            @param llx\r\n            @param lly\r\n            @param urx\r\n            @param ury\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfAction\">\r\n             A <CODE>PdfAction</CODE> defines an action that can be triggered from a PDF file.\r\n            \r\n             @see     PdfDictionary\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.FIRSTPAGE\">\r\n            A named action to go to the first page.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.PREVPAGE\">\r\n            A named action to go to the previous page.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.NEXTPAGE\">\r\n            A named action to go to the next page.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.LASTPAGE\">\r\n            A named action to go to the last page.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.PRINTDIALOG\">\r\n            A named action to open a print dialog.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_XFDF\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_INCLUDE_APPEND_SAVES\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_INCLUDE_ANNOTATIONS\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_PDF\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_CANONICAL_FORMAT\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_EXCL_NON_USER_ANNOTS\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_EXCL_F_KEY\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.SUBMIT_EMBED_FORM\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAction.RESET_EXCLUDE\">\r\n            a possible submitvalue \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor\">\r\n            Create an empty action.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(System.Uri)\">\r\n             Constructs a new <CODE>PdfAction</CODE> of Subtype URI.\r\n            \r\n             @param url the Url to go to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(System.String)\">\r\n             Constructs a new <CODE>PdfAction</CODE> of Subtype URI.\r\n            \r\n             @param url the url to go to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Constructs a new <CODE>PdfAction</CODE> of Subtype GoTo.\r\n            @param destination the destination to go to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(System.String,System.String)\">\r\n            Constructs a new <CODE>PdfAction</CODE> of Subtype GoToR.\r\n            @param filename the file name to go to\r\n            @param name the named destination to go to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(System.String,System.Int32)\">\r\n            Constructs a new <CODE>PdfAction</CODE> of Subtype GoToR.\r\n            @param filename the file name to go to\r\n            @param page the page destination to go to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(System.Int32)\">\r\n            Implements name actions. The action can be FIRSTPAGE, LASTPAGE,\r\n            NEXTPAGE and PREVPAGE.\r\n            @param named the named action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.#ctor(System.String,System.String,System.String,System.String)\">\r\n            Launchs an application or a document.\r\n            @param application the application to be launched or the document to be opened or printed.\r\n            @param parameters (Windows-specific) A parameter string to be passed to the application.\r\n            It can be <CODE>null</CODE>.\r\n            @param operation (Windows-specific) the operation to perform: \"open\" - Open a document,\r\n            \"print\" - Print a document.\r\n            It can be <CODE>null</CODE>.\r\n            @param defaultDir (Windows-specific) the default directory in standard DOS syntax.\r\n            It can be <CODE>null</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.CreateLaunch(System.String,System.String,System.String,System.String)\">\r\n            Launchs an application or a document.\r\n            @param application the application to be launched or the document to be opened or printed.\r\n            @param parameters (Windows-specific) A parameter string to be passed to the application.\r\n            It can be <CODE>null</CODE>.\r\n            @param operation (Windows-specific) the operation to perform: \"open\" - Open a document,\r\n            \"print\" - Print a document.\r\n            It can be <CODE>null</CODE>.\r\n            @param defaultDir (Windows-specific) the default directory in standard DOS syntax.\r\n            It can be <CODE>null</CODE>.\r\n            @return a Launch action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.Rendition(System.String,iTextSharp.text.pdf.PdfFileSpecification,System.String,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Creates a Rendition action\r\n            @param file\r\n            @param fs\r\n            @param mimeType\r\n            @param ref\r\n            @return a Media Clip action\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.JavaScript(System.String,iTextSharp.text.pdf.PdfWriter,System.Boolean)\">\r\n            Creates a JavaScript action. If the JavaScript is smaller than\r\n            50 characters it will be placed as a string, otherwise it will\r\n            be placed as a compressed stream.\r\n            @param code the JavaScript code\r\n            @param writer the writer for this action\r\n            @param unicode select JavaScript unicode. Note that the internal\r\n            Acrobat JavaScript engine does not support unicode,\r\n            so this may or may not work for you\r\n            @return the JavaScript action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.JavaScript(System.String,iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a JavaScript action. If the JavaScript is smaller than\r\n            50 characters it will be place as a string, otherwise it will\r\n            be placed as a compressed stream.\r\n            @param code the JavaScript code\r\n            @param writer the writer for this action\r\n            @return the JavaScript action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.Next(iTextSharp.text.pdf.PdfAction)\">\r\n            Add a chained action.\r\n            @param na the next action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.GotoLocalPage(System.Int32,iTextSharp.text.pdf.PdfDestination,iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a GoTo action to an internal page.\r\n            @param page the page to go. First page is 1\r\n            @param dest the destination for the page\r\n            @param writer the writer for this action\r\n            @return a GoTo action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.GotoLocalPage(System.String,System.Boolean)\">\r\n            Creates a GoTo action to a named destination.\r\n            @param dest the named destination\r\n            @param isName if true sets the destination as a name, if false sets it as a String\r\n            @return a GoToR action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.GotoRemotePage(System.String,System.String,System.Boolean,System.Boolean)\">\r\n            Creates a GoToR action to a named destination.\r\n            @param filename the file name to go to\r\n            @param dest the destination name\r\n            @param isName if true sets the destination as a name, if false sets it as a String\r\n            @param newWindow open the document in a new window if <CODE>true</CODE>, if false the current document is replaced by the new document.\r\n            @return a GoToR action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.GotoEmbedded(System.String,iTextSharp.text.pdf.collection.PdfTargetDictionary,System.String,System.Boolean,System.Boolean)\">\r\n            Creates a GoToE action to an embedded file.\r\n            @param filename   the root document of the target (null if the target is in the same document)\r\n            @param dest the named destination\r\n            @param isName if true sets the destination as a name, if false sets it as a String\r\n            @return a GoToE action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAction.GotoEmbedded(System.String,iTextSharp.text.pdf.collection.PdfTargetDictionary,iTextSharp.text.pdf.PdfObject,System.Boolean)\">\r\n            Creates a GoToE action to an embedded file.\r\n            @param filename   the root document of the target (null if the target is in the same document)\r\n            @param target a path to the target document of this action\r\n            @param dest       the destination inside the target document, can be of type PdfDestination, PdfName, or PdfString\r\n            @param newWindow  if true, the destination document should be opened in a new window\r\n            @return a GoToE action\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfAction.SetOCGstate(System.Collections.Generic.List{System.Object},System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.PdfAnnotation\">\r\n             A <CODE>PdfAnnotation</CODE> is a note that is associated with a page.\r\n            \r\n             @see     PdfDictionary\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAnnotation.FLAGS_LOCKEDCONTENTS\">\r\n            flagvalue PDF 1.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAnnotation.MARKUP_SQUIGGLY\">\r\n            attributevalue \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAnnotation.used\">\r\n            Holds value of property used. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfAnnotation.placeInPage\">\r\n            Holds value of property placeInPage. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.#ctor(iTextSharp.text.pdf.PdfWriter,System.Single,System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfString,iTextSharp.text.pdf.PdfString)\">\r\n            Constructs a new <CODE>PdfAnnotation</CODE> of subtype text.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.#ctor(iTextSharp.text.pdf.PdfWriter,System.Single,System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfAction)\">\r\n            Constructs a new <CODE>PdfAnnotation</CODE> of subtype link (Action).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.CreateScreen(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String,iTextSharp.text.pdf.PdfFileSpecification,System.String,System.Boolean)\">\r\n            Creates a screen PdfAnnotation\r\n            @param writer\r\n            @param rect\r\n            @param clipTitle\r\n            @param fs\r\n            @param mimeType\r\n            @param playOnDisplay\r\n            @return a screen PdfAnnotation\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.CreateFileAttachment(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String,System.Byte[],System.String,System.String)\">\r\n            Creates a file attachment annotation.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param rect the dimensions in the page of the annotation\r\n            @param contents the file description\r\n            @param fileStore an array with the file. If it's <CODE>null</CODE>\r\n            the file will be read from the disk\r\n            @param file the path to the file. It will only be used if\r\n            <CODE>fileStore</CODE> is not <CODE>null</CODE>\r\n            @param fileDisplay the actual file name stored in the pdf\r\n            @throws IOException on error\r\n            @return the annotation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.CreateFileAttachment(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String,iTextSharp.text.pdf.PdfFileSpecification)\">\r\n            Creates a file attachment annotation\r\n            @param writer\r\n            @param rect\r\n            @param contents\r\n            @param fs\r\n            @return the annotation\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.CreatePolygonPolyline(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String,System.Boolean,iTextSharp.text.pdf.PdfArray)\">\r\n            Creates a polygon or -line annotation\r\n            @param writer the PdfWriter\r\n            @param rect the annotation position\r\n            @param contents the textual content of the annotation\r\n            @param polygon if true, the we're creating a polygon annotation, if false, a polyline\r\n            @param vertices an array with the vertices of the polygon or -line\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.SetHighlighting(iTextSharp.text.pdf.PdfName)\">\r\n            Sets the annotation's highlighting mode. The values can be\r\n            <CODE>HIGHLIGHT_NONE</CODE>, <CODE>HIGHLIGHT_INVERT</CODE>,\r\n            <CODE>HIGHLIGHT_OUTLINE</CODE> and <CODE>HIGHLIGHT_PUSH</CODE>;\r\n            @param highlight the annotation's highlighting mode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.IsForm\">\r\n            Getter for property form.\r\n            @return Value of property form.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.IsAnnotation\">\r\n            Getter for property annotation.\r\n            @return Value of property annotation.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfAnnotation.PlaceInPage\">\r\n            Getter for property placeInPage.\r\n            @return Value of property placeInPage.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfAnnotation.Layer\">\r\n            Sets the layer this annotation belongs to.\r\n            @param layer the layer this annotation belongs to\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfAnnotation.Name\">\r\n            Sets the name of the annotation.\r\n            With this name the annotation can be identified among\r\n            all the annotations on a page (it has to be unique).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfAnnotation.PdfImportedLink\">\r\n            This class processes links from imported pages so that they may be active. The following example code reads a group\r\n            of files and places them all on the output PDF, four pages in a single page, keeping the links active.\r\n            <pre>\r\n            String[] files = new String[] {&quot;input1.pdf&quot;, &quot;input2.pdf&quot;};\r\n            String outputFile = &quot;output.pdf&quot;;\r\n            int firstPage=1;\r\n            Document document = new Document();\r\n            PdfWriter writer = PdfWriter.GetInstance(document, new FileOutputStream(outputFile));\r\n            document.SetPageSize(PageSize.A4);\r\n            float W = PageSize.A4.GetWidth() / 2;\r\n            float H = PageSize.A4.GetHeight() / 2;\r\n            document.Open();\r\n            PdfContentByte cb = writer.GetDirectContent();\r\n            for (int i = 0; i &lt; files.length; i++) {\r\n               PdfReader currentReader = new PdfReader(files[i]);\r\n               currentReader.ConsolidateNamedDestinations();\r\n               for (int page = 1; page &lt;= currentReader.GetNumberOfPages(); page++) {\r\n                   PdfImportedPage importedPage = writer.GetImportedPage(currentReader, page);\r\n                   float a = 0.5f;\r\n                   float e = (page % 2 == 0) ? W : 0;\r\n                   float f = (page % 4 == 1 || page % 4 == 2) ? H : 0;\r\n                   ArrayList links = currentReader.GetLinks(page);\r\n                   cb.AddTemplate(importedPage, a, 0, 0, a, e, f);\r\n                   for (int j = 0; j &lt; links.Size(); j++) {\r\n                       PdfAnnotation.PdfImportedLink link = (PdfAnnotation.PdfImportedLink)links.Get(j);\r\n                       if (link.IsInternal()) {\r\n                           int dPage = link.GetDestinationPage();\r\n                           int newDestPage = (dPage-1)/4 + firstPage;\r\n                           float ee = (dPage % 2 == 0) ? W : 0;\r\n                           float ff = (dPage % 4 == 1 || dPage % 4 == 2) ? H : 0;\r\n                           link.SetDestinationPage(newDestPage);\r\n                           link.TransformDestination(a, 0, 0, a, ee, ff);\r\n                       }\r\n                       link.TransformRect(a, 0, 0, a, e, f);\r\n                       writer.AddAnnotation(link.CreateAnnotation(writer));\r\n                   }\r\n                   if (page % 4 == 0)\r\n                   document.NewPage();\r\n               }\r\n               if (i &lt; files.length - 1)\r\n               document.NewPage();\r\n               firstPage += (currentReader.GetNumberOfPages()+3)/4;\r\n            }\r\n            document.Close();\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAnnotation.PdfImportedLink.ToString\">\r\n            Returns a String representation of the link.\r\n            @return\ta String representation of the imported link\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfAppearance\">\r\n            Implements the appearance stream to be used with form fields..\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAppearance.#ctor\">\r\n            Creates a <CODE>PdfAppearance</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAppearance.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n             Creates new PdfTemplate\r\n            \r\n             @param wr the <CODE>PdfWriter</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAppearance.CreateAppearance(iTextSharp.text.pdf.PdfWriter,System.Single,System.Single)\">\r\n             Creates a new appearance to be used with form fields.\r\n            \r\n             @param width the bounding box width\r\n             @param height the bounding box height\r\n             @return the appearance created\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfAppearance.SetFontAndSize(iTextSharp.text.pdf.BaseFont,System.Single)\">\r\n             Set the font and the size for the subsequent text writing.\r\n            \r\n             @param bf the font\r\n             @param size the font size in points\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfArray”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfArray.arrayList\">\r\n            this is the actual array of PdfObjects \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.#ctor\">\r\n            Constructs an empty <CODE>PdfArray</CODE>-object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.#ctor(iTextSharp.text.pdf.PdfObject)\">\r\n             Constructs an <CODE>PdfArray</CODE>-object, containing 1 <CODE>PdfObject</CODE>.\r\n            \r\n             @param    object        a <CODE>PdfObject</CODE> that has to be added to the array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.#ctor(System.Collections.Generic.IList{iTextSharp.text.pdf.PdfObject})\">\r\n            Constructs a PdfArray with the elements of an ArrayList.\r\n            Throws a ClassCastException if the ArrayList contains something\r\n            that isn't a PdfObject.\r\n            @param   l   an ArrayList with PdfObjects\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.#ctor(iTextSharp.text.pdf.PdfArray)\">\r\n             Constructs an <CODE>PdfArray</CODE>-object, containing all the <CODE>PdfObject</CODE>s in a given <CODE>PdfArray</CODE>.\r\n            \r\n             @param    array        a <CODE>PdfArray</CODE> that has to be added to the array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n             Returns the PDF representation of this <CODE>PdfArray</CODE>.\r\n            \r\n             @return        an array of <CODE>byte</CODE>s\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfArray.Item(System.Int32)\">\r\n            Overwrites a specified location of the array.\r\n            \r\n            @param idx The index of the element to be overwritten\r\n            @param obj new value for the specified index\r\n            @throws IndexOutOfBoundsException if the specified position doesn't exist\r\n            @return the previous value\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.GetPdfObject(System.Int32)\">\r\n             Returns the <CODE>PdfObject</CODE> with the specified index.\r\n            \r\n             A possible indirect references is not resolved, so the returned\r\n             <CODE>PdfObject</CODE> may be either a direct object or an indirect\r\n             reference, depending on how the object is stored in the\r\n             <CODE>PdfArray</CODE>.\r\n            \r\n             @param idx The index of the <CODE>PdfObject</CODE> to be returned\r\n             @return A <CODE>PdfObject</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.Set(System.Int32,iTextSharp.text.pdf.PdfObject)\">\r\n             Overwrites a specified location of the array, returning the previous\r\n             value\r\n            \r\n             @param idx The index of the element to be overwritten\r\n             @param obj new value for the specified index\r\n             @throws IndexOutOfBoundsException if the specified position doesn't exist\r\n             @return the previous value\r\n             @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.Remove(System.Int32)\">\r\n            Remove the element at the specified position from the array.\r\n            \r\n            Shifts any subsequent elements to the left (subtracts one from their\r\n            indices).\r\n            \r\n            @param idx The index of the element to be removed.\r\n            @throws IndexOutOfBoundsException the specified position doesn't exist\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfArray.ArrayList\">\r\n             Returns an ArrayList containing <CODE>PdfObject</CODE>s.\r\n            \r\n             @return        an ArrayList\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfArray.Size\">\r\n             Returns the number of entries in the array.\r\n            \r\n             @return        the size of the ArrayList\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.IsEmpty\">\r\n            Returns <CODE>true</CODE> if the array is empty.\r\n            \r\n            @return <CODE>true</CODE> if the array is empty\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.Add(iTextSharp.text.pdf.PdfObject)\">\r\n             Adds a <CODE>PdfObject</CODE> to the <CODE>PdfArray</CODE>.\r\n            \r\n             @param        object            <CODE>PdfObject</CODE> to add\r\n             @return        <CODE>true</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.Add(System.Int32,iTextSharp.text.pdf.PdfObject)\">\r\n             Inserts the specified element at the specified position.\r\n             \r\n             Shifts the element currently at that position (if any) and\r\n             any subsequent elements to the right (adds one to their indices).\r\n            \r\n             @param index The index at which the specified element is to be inserted\r\n             @param element The element to be inserted\r\n             @throws IndexOutOfBoundsException if the specified index is larger than the\r\n               last position currently set, plus 1. \r\n             @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.AddFirst(iTextSharp.text.pdf.PdfObject)\">\r\n             Inserts a <CODE>PdfObject</CODE> at the beginning of the\r\n             <CODE>PdfArray</CODE>.\r\n             \r\n             The <CODE>PdfObject</CODE> will be the first element, any other elements\r\n             will be shifted to the right (adds one to their indices).\r\n            \r\n             @param object The <CODE>PdfObject</CODE> to add\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.Contains(iTextSharp.text.pdf.PdfObject)\">\r\n             Checks if the <CODE>PdfArray</CODE> already contains a certain <CODE>PdfObject</CODE>.\r\n            \r\n             @param        object            <CODE>PdfObject</CODE> to check\r\n             @return        <CODE>true</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.AsLongArray\">\r\n            \r\n            @return this PdfArray's values as a long[] \r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfArray.AsDoubleArray\">\r\n            \r\n             @return this PdfArray's values as a double[]\r\n             @since 5.5.6\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfBoolean”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfBoolean.TRUE\">\r\n            A possible value of <CODE>PdfBoolean</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfBoolean.FALSE\">\r\n            A possible value of <CODE>PdfBoolean</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfBoolean.value\">\r\n            the bool value of this object \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfBoolean.#ctor(System.Boolean)\">\r\n             Constructs a <CODE>PdfBoolean</CODE>-object.\r\n            \r\n             @param        value            the value of the new <CODE>PdfObject</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfBoolean.#ctor(System.String)\">\r\n             Constructs a <CODE>PdfBoolean</CODE>-object.\r\n            \r\n             @param        value            the value of the new <CODE>PdfObject</CODE>, represented as a <CODE>string</CODE>\r\n            \r\n             @throws        BadPdfFormatException    thrown if the <VAR>value</VAR> isn't '<CODE>true</CODE>' or '<CODE>false</CODE>'\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfBoolean.BooleanValue\">\r\n             Returns the primitive value of the <CODE>PdfBoolean</CODE>-object.\r\n            \r\n             @return        the actual value of the object.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfBorderArray\">\r\n             A <CODE>PdfBorderArray</CODE> defines the border of a <CODE>PdfAnnotation</CODE>.\r\n            \r\n             @see        PdfArray\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfBorderArray.#ctor(System.Single,System.Single,System.Single)\">\r\n            Constructs a new <CODE>PdfBorderArray</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfBorderArray.#ctor(System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfDashPattern)\">\r\n            Constructs a new <CODE>PdfBorderArray</CODE>.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfBorderDictionary\">\r\n             A <CODE>PdfBorderDictionary</CODE> define the appearance of a Border (Annotations).\r\n            \r\n             @see     PdfDictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfBorderDictionary.#ctor(System.Single,System.Int32,iTextSharp.text.pdf.PdfDashPattern)\">\r\n            Constructs a <CODE>PdfBorderDictionary</CODE>.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfChunk”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.keysAttributes\">\r\n            The allowed attributes in variable <CODE>attributes</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.keysNoStroke\">\r\n            The allowed attributes in variable <CODE>noStroke</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.value\">\r\n            The value of this object. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.encoding\">\r\n            The encoding. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.font\">\r\n            The font for this <CODE>PdfChunk</CODE>. \r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.text.pdf.PdfChunk.attributes”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“F:iTextSharp.text.pdf.PdfChunk.noStroke”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.newlineSplit\">\r\n            <CODE>true</CODE> if the chunk split was cause by a newline. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.image\">\r\n            The image in this <CODE>PdfChunk</CODE>, if it has one \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.offsetX\">\r\n            The offset in the x direction for the image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.offsetY\">\r\n            The offset in the y direction for the image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.changeLeading\">\r\n            Indicates if the height and offset of the Image has to be taken into account \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfChunk.leading\">\r\n            The leading that can overrule the existing leading. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.#ctor(System.String,iTextSharp.text.pdf.PdfChunk)\">\r\n             Constructs a <CODE>PdfChunk</CODE>-object.\r\n            \r\n             @param string the content of the <CODE>PdfChunk</CODE>-object\r\n             @param font the <CODE>PdfFont</CODE>\r\n             @param attributes the metrics attributes\r\n             @param noStroke the non metric attributes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.#ctor(iTextSharp.text.Chunk,iTextSharp.text.pdf.PdfAction)\">\r\n             Constructs a <CODE>PdfChunk</CODE>-object.\r\n            \r\n             @param chunk the original <CODE>Chunk</CODE>-object\r\n             @param action the <CODE>PdfAction</CODE> if the <CODE>Chunk</CODE> comes from an <CODE>Anchor</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.#ctor(iTextSharp.text.Chunk,iTextSharp.text.pdf.PdfAction,iTextSharp.text.TabSettings)\">\r\n             Constructs a <CODE>PdfChunk</CODE>-object.\r\n            \r\n             @param chunk     the original <CODE>Chunk</CODE>-object\r\n             @param action    the <CODE>PdfAction</CODE> if the <CODE>Chunk</CODE> comes from an <CODE>Anchor</CODE>\r\n             @param tabSettings  the Phrase tab settings\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfChunk.GetUnicodeEquivalent(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfChunk.Split(System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfChunk.Truncate(System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.Font\">\r\n             Returns the font of this <CODE>Chunk</CODE>.\r\n            \r\n             @return  a <CODE>PdfFont</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.Color\">\r\n             Returns the color of this <CODE>Chunk</CODE>.\r\n            \r\n             @return  a <CODE>BaseColor</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.Width\">\r\n             Returns the width of this <CODE>PdfChunk</CODE>.\r\n            \r\n             @return  a width\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsNewlineSplit\">\r\n            Checks if the <CODE>PdfChunk</CODE> split was caused by a newline.\r\n            @return <CODE>true</CODE> if the <CODE>PdfChunk</CODE> split was caused by a newline.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.GetWidthCorrected(System.Single,System.Single)\">\r\n            Gets the width of the <CODE>PdfChunk</CODE> taking into account the\r\n            extra character and word spacing.\r\n            @param charSpacing the extra character spacing\r\n            @param wordSpacing the extra word spacing\r\n            @return the calculated width\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.TextRise\">\r\n            Gets the text displacement relatiev to the baseline.\r\n            @return a displacement in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.TrimLastSpace\">\r\n            Trims the last space.\r\n            @return the width of the space trimmed, otherwise 0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.GetAttribute(System.String)\">\r\n            Gets an attribute. The search is made in <CODE>attributes</CODE>\r\n            and <CODE>noStroke</CODE>.\r\n            @param name the attribute key\r\n            @return the attribute value or null if not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsAttribute(System.String)\">\r\n            Checks if the attribute exists.\r\n             @param name the attribute key\r\n             @return <CODE>true</CODE> if the attribute exists\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsStroked\">\r\n            Checks if this <CODE>PdfChunk</CODE> needs some special metrics handling.\r\n            @return <CODE>true</CODE> if this <CODE>PdfChunk</CODE> needs some special metrics handling.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsSeparator\">\r\n            Checks if this <CODE>PdfChunk</CODE> is a Separator Chunk.\r\n            @return  true if this chunk is a separator.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsHorizontalSeparator\">\r\n            Checks if this <CODE>PdfChunk</CODE> is a horizontal Separator Chunk.\r\n            @return  true if this chunk is a horizontal separator.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsTab\">\r\n            Checks if this <CODE>PdfChunk</CODE> is a tab Chunk.\r\n            @return  true if this chunk is a separator.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.AdjustLeft(System.Single)\">\r\n            Correction for the tab position based on the left starting position.\r\n            @param   newValue    the new value for the left X.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsImage\">\r\n            Checks if there is an image in the <CODE>PdfChunk</CODE>.\r\n            @return <CODE>true</CODE> if an image is present\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.Image\">\r\n            Gets the image in the <CODE>PdfChunk</CODE>.\r\n            @return the image or <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.ImageScalePercentage\">\r\n            Returns a scalePercentage in case the image needs to be scaled.\r\n            Sets a scale percentage in case the image needs to be scaled.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.ImageOffsetX\">\r\n            Gets the image offset in the x direction\r\n            @return the image offset in the x direction\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.ImageOffsetY\">\r\n            Gets the image offset in the y direction\r\n            @return Gets the image offset in the y direction\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.Value\">\r\n            sets the value.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfChunk.IsSpecialEncoding\">\r\n            Tells you if this string is in Chinese, Japanese, Korean or Identity-H.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfChunk.Encoding\">\r\n             Gets the encoding of this string.\r\n            \r\n             @return      a <CODE>string</CODE>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfChunk.Trim(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.PdfColor\">\r\n             A <CODE>PdfColor</CODE> defines a Color (it's a <CODE>PdfArray</CODE> containing 3 values).\r\n            \r\n             @see        PdfDictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfColor.#ctor(System.Int32,System.Int32,System.Int32)\">\r\n             Constructs a new <CODE>PdfColor</CODE>.\r\n            \r\n             @param        red            a value between 0 and 255\r\n             @param        green        a value between 0 and 255\r\n             @param        blue        a value between 0 and 255\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfContentByte\">\r\n            <CODE>PdfContentByte</CODE> is an object containing the user positioned\r\n            text and graphic contents of a page. It knows how to apply the proper\r\n            font encoding.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfContentByte.GraphicState\">\r\n            This class keeps the graphic state of the current page\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.fontDetails\">\r\n            This is the font in use \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.colorDetails\">\r\n            This is the color in use \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.size\">\r\n            This is the font size in use \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.xTLM\">\r\n            The x position of the text line matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.yTLM\">\r\n            The y position of the text line matrix. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.leading\">\r\n            The current text leading. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.scale\">\r\n            The current horizontal scaling \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.charSpace\">\r\n            The current character spacing \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.GraphicState.wordSpace\">\r\n            The current word spacing \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.ALIGN_CENTER\">\r\n            The alignement is center \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.ALIGN_LEFT\">\r\n            The alignement is left \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.ALIGN_RIGHT\">\r\n            The alignement is right \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.LINE_CAP_BUTT\">\r\n            A possible line cap value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.LINE_CAP_ROUND\">\r\n            A possible line cap value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.LINE_CAP_PROJECTING_SQUARE\">\r\n            A possible line cap value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.LINE_JOIN_MITER\">\r\n            A possible line join value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.LINE_JOIN_ROUND\">\r\n            A possible line join value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.LINE_JOIN_BEVEL\">\r\n            A possible line join value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_FILL\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_STROKE\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_INVISIBLE\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_FILL_CLIP\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_STROKE_CLIP\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE_CLIP\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.TEXT_RENDER_MODE_CLIP\">\r\n            A possible text rendering value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.content\">\r\n            This is the actual content \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.writer\">\r\n            This is the writer \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.pdf\">\r\n            This is the PdfDocument \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.state\">\r\n            This is the GraphicState in use \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.layerDepth\">\r\n            The list were we save/restore the layer depth \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.stateList\">\r\n            The list were we save/restore the state \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentByte.separator\">\r\n            The separator between commands.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n             Constructs a new <CODE>PdfContentByte</CODE>-object.\r\n            \r\n             @param wr the writer associated to this content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ToString\">\r\n             Returns the <CODE>string</CODE> representation of this <CODE>PdfContentByte</CODE>-object.\r\n            \r\n             @return      a <CODE>string</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.SuppressTagging\">\r\n            [SUP-1395] If set, prevents iText from marking content and creating structure tags for items added to this content stream.\r\n            (By default, iText automatically marks content using BDC/EMC operators, and adds a structure tag for the new content\r\n            at the end of the page.)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.IsTagged\">\r\n            Checks if the content needs to be tagged.\r\n            @return false if no tags need to be added\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.InternalBuffer\">\r\n            Gets the internal buffer.\r\n            @return the internal buffer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ToPdf(iTextSharp.text.pdf.PdfWriter)\">\r\n            Returns the PDF representation of this <CODE>PdfContentByte</CODE>-object.\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE>\r\n             @return a <CODE>byte</CODE> array with the representation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Add(iTextSharp.text.pdf.PdfContentByte)\">\r\n             Adds the content of another <CODE>PdfContent</CODE>-object to this object.\r\n            \r\n             @param       other       another <CODE>PdfByteContent</CODE>-object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.XTLM\">\r\n             Gets the x position of the text line matrix.\r\n            \r\n             @return the x position of the text line matrix\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.YTLM\">\r\n             Gets the y position of the text line matrix.\r\n            \r\n             @return the y position of the text line matrix\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.CharacterSpacing\">\r\n             Gets the current character spacing.\r\n            \r\n             @return the current character spacing\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.WordSpacing\">\r\n             Gets the current word spacing.\r\n            \r\n             @return the current word spacing\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.HorizontalScaling\">\r\n             Gets the current character spacing.\r\n            \r\n             @return the current character spacing\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.Leading\">\r\n             Gets the current text leading.\r\n            \r\n             @return the current text leading\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetFlatness(System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetFlatness(System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineCap(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetRenderingIntent(iTextSharp.text.pdf.PdfName)\">\r\n            Set the rendering intent, possible values are: PdfName.ABSOLUTECOLORIMETRIC,\r\n            PdfName.RELATIVECOLORIMETRIC, PdfName.SATURATION, PdfName.PERCEPTUAL.\r\n            @param ri\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Double,System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Double,System.Double,System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Single[],System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineDash(System.Double[],System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineJoin(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineWidth(System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetLineWidth(System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetMiterLimit(System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetMiterLimit(System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Clip\">\r\n            Modify the current clipping path by intersecting it with the current path, using the\r\n            nonzero winding number rule to determine which regions lie inside the clipping\r\n            path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.EoClip\">\r\n            Modify the current clipping path by intersecting it with the current path, using the\r\n            even-odd rule to determine which regions lie inside the clipping path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetGrayFill(System.Single)\">\r\n             Changes the currentgray tint for filling paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceGray</B> (or the <B>DefaultGray</B> color space),\r\n             and sets the gray tint to use for filling paths.</P>\r\n            \r\n             @param   gray    a value between 0 (black) and 1 (white)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ResetGrayFill\">\r\n            Changes the current gray tint for filling paths to black.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetGrayStroke(System.Single)\">\r\n             Changes the currentgray tint for stroking paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceGray</B> (or the <B>DefaultGray</B> color space),\r\n             and sets the gray tint to use for stroking paths.</P>\r\n            \r\n             @param   gray    a value between 0 (black) and 1 (white)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ResetGrayStroke\">\r\n            Changes the current gray tint for stroking paths to black.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.HelperRGB(System.Single,System.Single,System.Single)\">\r\n            Helper to validate and write the RGB color components\r\n            @param   red     the intensity of red. A value between 0 and 1\r\n            @param   green   the intensity of green. A value between 0 and 1\r\n            @param   blue    the intensity of blue. A value between 0 and 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetRGBColorFillF(System.Single,System.Single,System.Single)\">\r\n             Changes the current color for filling paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),\r\n             and sets the color to use for filling paths.</P>\r\n             <P>\r\n             Following the PDF manual, each operand must be a number between 0 (minimum intensity) and\r\n             1 (maximum intensity).</P>\r\n            \r\n             @param   red     the intensity of red. A value between 0 and 1\r\n             @param   green   the intensity of green. A value between 0 and 1\r\n             @param   blue    the intensity of blue. A value between 0 and 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ResetRGBColorFill\">\r\n            Changes the current color for filling paths to black.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetRGBColorStrokeF(System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ResetRGBColorStroke\">\r\n             Changes the current color for stroking paths to black.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.HelperCMYK(System.Single,System.Single,System.Single,System.Single)\">\r\n             Helper to validate and write the CMYK color components.\r\n            \r\n             @param   cyan    the intensity of cyan. A value between 0 and 1\r\n             @param   magenta the intensity of magenta. A value between 0 and 1\r\n             @param   yellow  the intensity of yellow. A value between 0 and 1\r\n             @param   black   the intensity of black. A value between 0 and 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetCMYKColorFillF(System.Single,System.Single,System.Single,System.Single)\">\r\n             Changes the current color for filling paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),\r\n             and sets the color to use for filling paths.</P>\r\n             <P>\r\n             Following the PDF manual, each operand must be a number between 0 (no ink) and\r\n             1 (maximum ink).</P>\r\n            \r\n             @param   cyan    the intensity of cyan. A value between 0 and 1\r\n             @param   magenta the intensity of magenta. A value between 0 and 1\r\n             @param   yellow  the intensity of yellow. A value between 0 and 1\r\n             @param   black   the intensity of black. A value between 0 and 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ResetCMYKColorFill\">\r\n             Changes the current color for filling paths to black.\r\n            \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetCMYKColorStrokeF(System.Single,System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ResetCMYKColorStroke\">\r\n             Changes the current color for stroking paths to black.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.MoveTo(System.Single,System.Single)\">\r\n             Move the current point <I>(x, y)</I>, omitting any connecting line segment.\r\n            \r\n             @param       x               new x-coordinate\r\n             @param       y               new y-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.MoveTo(System.Double,System.Double)\">\r\n             Move the current point <I>(x, y)</I>, omitting any connecting line segment.\r\n            \r\n             @param       x               new x-coordinate\r\n             @param       y               new y-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.LineTo(System.Single,System.Single)\">\r\n             Appends a straight line segment from the current point <I>(x, y)</I>. The new current\r\n             point is <I>(x, y)</I>.\r\n            \r\n             @param       x               new x-coordinate\r\n             @param       y               new y-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.LineTo(System.Double,System.Double)\">\r\n             Appends a straight line segment from the current point <I>(x, y)</I>. The new current\r\n             point is <I>(x, y)</I>.\r\n            \r\n             @param       x               new x-coordinate\r\n             @param       y               new y-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CurveTo(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n             Appends a Bezier curve to the path, starting from the current point.\r\n            \r\n             @param       x1      x-coordinate of the first control point\r\n             @param       y1      y-coordinate of the first control point\r\n             @param       x2      x-coordinate of the second control point\r\n             @param       y2      y-coordinate of the second control point\r\n             @param       x3      x-coordinaat of the ending point (= new current point)\r\n             @param       y3      y-coordinaat of the ending point (= new current point)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CurveTo(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\r\n             Appends a Bezier curve to the path, starting from the current point.\r\n            \r\n             @param       x1      x-coordinate of the first control point\r\n             @param       y1      y-coordinate of the first control point\r\n             @param       x2      x-coordinate of the second control point\r\n             @param       y2      y-coordinate of the second control point\r\n             @param       x3      x-coordinaat of the ending point (= new current point)\r\n             @param       y3      y-coordinaat of the ending point (= new current point)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CurveTo(System.Single,System.Single,System.Single,System.Single)\">\r\n             Appends a Bezier curve to the path, starting from the current point.\r\n            \r\n             @param       x2      x-coordinate of the second control point\r\n             @param       y2      y-coordinate of the second control point\r\n             @param       x3      x-coordinaat of the ending point (= new current point)\r\n             @param       y3      y-coordinaat of the ending point (= new current point)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CurveTo(System.Double,System.Double,System.Double,System.Double)\">\r\n             Appends a Bezier curve to the path, starting from the current point.\r\n            \r\n             @param       x2      x-coordinate of the second control point\r\n             @param       y2      y-coordinate of the second control point\r\n             @param       x3      x-coordinaat of the ending point (= new current point)\r\n             @param       y3      y-coordinaat of the ending point (= new current point)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CurveFromTo(System.Single,System.Single,System.Single,System.Single)\">\r\n             Appends a Bezier curve to the path, starting from the current point.\r\n            \r\n             @param       x1      x-coordinate of the first control point\r\n             @param       y1      y-coordinate of the first control point\r\n             @param       x3      x-coordinaat of the ending point (= new current point)\r\n             @param       y3      y-coordinaat of the ending point (= new current point)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CurveFromTo(System.Double,System.Double,System.Double,System.Double)\">\r\n             Appends a Bezier curve to the path, starting from the current point.\r\n            \r\n             @param       x1      x-coordinate of the first control point\r\n             @param       y1      y-coordinate of the first control point\r\n             @param       x3      x-coordinaat of the ending point (= new current point)\r\n             @param       y3      y-coordinaat of the ending point (= new current point)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Circle(System.Single,System.Single,System.Single)\">\r\n            Draws a circle. The endpoint will (x+r, y).\r\n            \r\n             @param x x center of circle\r\n             @param y y center of circle\r\n             @param r radius of circle\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Circle(System.Double,System.Double,System.Double)\">\r\n            Draws a circle. The endpoint will (x+r, y).\r\n            \r\n             @param x x center of circle\r\n             @param y y center of circle\r\n             @param r radius of circle\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Rectangle(System.Single,System.Single,System.Single,System.Single)\">\r\n             Adds a rectangle to the current path.\r\n            \r\n             @param       x       x-coordinate of the starting point\r\n             @param       y       y-coordinate of the starting point\r\n             @param       w       width\r\n             @param       h       height\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Rectangle(System.Double,System.Double,System.Double,System.Double)\">\r\n             Adds a rectangle to the current path.\r\n            \r\n             @param       x       x-coordinate of the starting point\r\n             @param       y       y-coordinate of the starting point\r\n             @param       w       width\r\n             @param       h       height\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.VariableRectangle(iTextSharp.text.Rectangle)\">\r\n            Adds a variable width border to the current path.\r\n            Only use if {@link com.lowagie.text.Rectangle#isUseVariableBorders() Rectangle.isUseVariableBorders}\r\n            = true.\r\n            @param rect a <CODE>Rectangle</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Rectangle(iTextSharp.text.Rectangle)\">\r\n             Adds a border (complete or partially) to the current path..\r\n            \r\n             @param        rectangle        a <CODE>Rectangle</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ClosePath\">\r\n            Closes the current subpath by appending a straight line segment from the current point\r\n            to the starting point of the subpath.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.NewPath\">\r\n            Ends the path without filling or stroking it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Stroke\">\r\n            Strokes the path.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ClosePathStroke\">\r\n            Closes the path and strokes it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Fill\">\r\n            Fills the path, using the non-zero winding number rule to determine the region to fill.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.EoFill\">\r\n            Fills the path, using the even-odd rule to determine the region to fill.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.FillStroke\">\r\n            Fills the path using the non-zero winding number rule to determine the region to fill and strokes it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ClosePathFillStroke\">\r\n            Closes the path, fills it using the non-zero winding number rule to determine the region to fill and strokes it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.EoFillStroke\">\r\n            Fills the path, using the even-odd rule to determine the region to fill and strokes it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ClosePathEoFillStroke\">\r\n            Closes the path, fills it using the even-odd rule to determine the region to fill and strokes it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image)\">\r\n            Adds an <CODE>Image</CODE> to the page. The <CODE>Image</CODE> must have\r\n            absolute positioning.\r\n            @param image the <CODE>Image</CODE> object\r\n            @throws DocumentException if the <CODE>Image</CODE> does not have absolute positioning\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,System.Boolean)\">\r\n            Adds an <CODE>Image</CODE> to the page. The <CODE>Image</CODE> must have\r\n            absolute positioning. The image can be placed inline.\r\n            @param image the <CODE>Image</CODE> object\r\n            @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise\r\n            @throws DocumentException if the <CODE>Image</CODE> does not have absolute positioning\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>\r\n            is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)\r\n            use AddImage(image, image_width, 0, 0, image_height, x, y).\r\n            @param image the <CODE>Image</CODE> object\r\n            @param a an element of the transformation matrix\r\n            @param b an element of the transformation matrix\r\n            @param c an element of the transformation matrix\r\n            @param d an element of the transformation matrix\r\n            @param e an element of the transformation matrix\r\n            @param f an element of the transformation matrix\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\r\n            Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>\r\n            is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)\r\n            use AddImage(image, image_width, 0, 0, image_height, x, y).\r\n            @param image the <CODE>Image</CODE> object\r\n            @param a an element of the transformation matrix\r\n            @param b an element of the transformation matrix\r\n            @param c an element of the transformation matrix\r\n            @param d an element of the transformation matrix\r\n            @param e an element of the transformation matrix\r\n            @param f an element of the transformation matrix\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,iTextSharp.awt.geom.AffineTransform)\">\r\n            adds an image with the given matrix.\r\n            @param image image to add\r\n            @param transform transform to apply to the template prior to adding it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Boolean)\">\r\n            Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>\r\n            is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)\r\n            use AddImage(image, image_width, 0, 0, image_height, x, y). The image can be placed inline.\r\n            @param image the <CODE>Image</CODE> object\r\n            @param a an element of the transformation matrix\r\n            @param b an element of the transformation matrix\r\n            @param c an element of the transformation matrix\r\n            @param d an element of the transformation matrix\r\n            @param e an element of the transformation matrix\r\n            @param f an element of the transformation matrix\r\n            @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean)\">\r\n            Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>\r\n            is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)\r\n            use AddImage(image, image_width, 0, 0, image_height, x, y). The image can be placed inline.\r\n            @param image the <CODE>Image</CODE> object\r\n            @param a an element of the transformation matrix\r\n            @param b an element of the transformation matrix\r\n            @param c an element of the transformation matrix\r\n            @param d an element of the transformation matrix\r\n            @param e an element of the transformation matrix\r\n            @param f an element of the transformation matrix\r\n            @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddImage(iTextSharp.text.Image,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean,System.Boolean)\">\r\n            Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>\r\n            is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)\r\n            The image can be placed inline.\r\n            @param image the <CODE>Image</CODE> object\r\n            @param a an element of the transformation matrix\r\n            @param b an element of the transformation matrix\r\n            @param c an element of the transformation matrix\r\n            @param d an element of the transformation matrix\r\n            @param e an element of the transformation matrix\r\n            @param f an element of the transformation matrix\r\n            @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise\r\n            @param isMCBlockOpened <CODE>true</CODE> not to open MCBlock, <CODE>false</CODE> otherwise\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Reset\">\r\n            Makes this <CODE>PdfContentByte</CODE> empty.\r\n            Calls <code>reset( true )</code>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Reset(System.Boolean)\">\r\n            Makes this <CODE>PdfContentByte</CODE> empty.\r\n            @param validateContent will call <code>sanityCheck()</code> if true.\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.BeginText(System.Boolean)\">\r\n            Starts the writing of text.\r\n            @param restoreTM indicates if to restore text matrix of the previous text block.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.BeginText\">\r\n            Starts the writing of text.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.EndText\">\r\n            Ends the writing of text and makes the current font invalid.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SaveState\">\r\n            Saves the graphic state. <CODE>saveState</CODE> and\r\n            <CODE>restoreState</CODE> must be balanced.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.RestoreState\">\r\n            Restores the graphic state. <CODE>saveState</CODE> and\r\n            <CODE>restoreState</CODE> must be balanced.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetCharacterSpacing(System.Single)\">\r\n             Sets the character spacing parameter.\r\n            \r\n             @param       charSpace           a parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetWordSpacing(System.Single)\">\r\n             Sets the word spacing parameter.\r\n            \r\n             @param       wordSpace           a parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetHorizontalScaling(System.Single)\">\r\n             Sets the horizontal scaling parameter.\r\n            \r\n             @param       scale               a parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetFontAndSize(iTextSharp.text.pdf.BaseFont,System.Single)\">\r\n             Set the font and the size for the subsequent text writing.\r\n            \r\n             @param bf the font\r\n             @param size the font size in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetTextRenderingMode(System.Int32)\">\r\n             Sets the text rendering parameter.\r\n            \r\n             @param       rendering               a parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetTextRise(System.Single)\">\r\n             Sets the text rise parameter.\r\n             <P>\r\n             This allows to write text in subscript or basescript mode.</P>\r\n            \r\n             @param       rise                a parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetTextRise(System.Double)\">\r\n             Sets the text rise parameter.\r\n             <P>\r\n             This allows to write text in subscript or basescript mode.</P>\r\n            \r\n             @param       rise                a parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ShowText2(System.String)\">\r\n             A helper to insert into the content stream the <CODE>text</CODE>\r\n             converted to bytes according to the font's encoding.\r\n            \r\n             @param text the text to write\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ShowText(System.String)\">\r\n             Shows the <CODE>text</CODE>.\r\n            \r\n             @param text the text to write\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.GetKernArray(System.String,iTextSharp.text.pdf.BaseFont)\">\r\n            Constructs a kern array for a text in a certain font\r\n            @param text the text\r\n            @param font the font\r\n            @return a PdfTextArray\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ShowTextKerned(System.String)\">\r\n             Shows the <CODE>text</CODE> kerned.\r\n            \r\n             @param text the text to write\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.NewlineShowText(System.String)\">\r\n             Moves to the next line and shows <CODE>text</CODE>.\r\n            \r\n             @param text the text to write\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.NewlineShowText(System.Single,System.Single,System.String)\">\r\n             Moves to the next line and shows text string, using the given values of the character and word spacing parameters.\r\n            \r\n             @param       wordSpacing     a parameter\r\n             @param       charSpacing     a parameter\r\n             @param text the text to write\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetTextMatrix(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n             Changes the text matrix.\r\n             <P>\r\n             Remark: this operation also initializes the current point position.</P>\r\n            \r\n             @param       a           operand 1,1 in the matrix\r\n             @param       b           operand 1,2 in the matrix\r\n             @param       c           operand 2,1 in the matrix\r\n             @param       d           operand 2,2 in the matrix\r\n             @param       x           operand 3,1 in the matrix\r\n             @param       y           operand 3,2 in the matrix\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.SetTextMatrix(iTextSharp.awt.geom.AffineTransform)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetTextMatrix(System.Single,System.Single)\">\r\n             Changes the text matrix. The first four parameters are {1,0,0,1}.\r\n             <P>\r\n             Remark: this operation also initializes the current point position.</P>\r\n            \r\n             @param       x           operand 3,1 in the matrix\r\n             @param       y           operand 3,2 in the matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.MoveText(System.Single,System.Single)\">\r\n             Moves to the start of the next line, offset from the start of the current line.\r\n            \r\n             @param       x           x-coordinate of the new current point\r\n             @param       y           y-coordinate of the new current point\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.MoveTextWithLeading(System.Single,System.Single)\">\r\n             Moves to the start of the next line, offset from the start of the current line.\r\n             <P>\r\n             As a side effect, this sets the leading parameter in the text state.</P>\r\n            \r\n             @param       x           offset of the new current point\r\n             @param       y           y-coordinate of the new current point\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.NewlineText\">\r\n            Moves to the start of the next line.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.Size\">\r\n             Gets the size of this content.\r\n            \r\n             @return the size of the content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddOutline(iTextSharp.text.pdf.PdfOutline,System.String)\">\r\n             Adds a named outline to the document.\r\n            \r\n             @param outline the outline\r\n             @param name the name for the local destination\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.RootOutline\">\r\n             Gets the root outline.\r\n            \r\n             @return the root outline\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.GetEffectiveStringWidth(System.String,System.Boolean)\">\r\n            Computes the width of the given string taking in account\r\n            the current values of \"Character spacing\", \"Word Spacing\"\r\n            and \"Horizontal Scaling\".\r\n            The additional spacing is not computed for the last character\r\n            of the string.\r\n            @param text the string to get width of\r\n            @param kerned the kerning option\r\n            @return the width\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.GetEffectiveStringWidth(System.String,System.Boolean,System.Single)\">\r\n            Computes the width of the given string taking in account\r\n            the current values of \"Character spacing\", \"Word Spacing\"\r\n            and \"Horizontal Scaling\".\r\n            The spacing for the last character is also computed.\r\n            It also takes into account kerning that can be specified within TJ operator (e.g. [(Hello) 123 (World)] TJ)\r\n            @param text the string to get width of\r\n            @param kerned the kerning option\r\n            @param kerning the kerning option from TJ array\r\n            @return the width\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ShowTextAligned(System.Int32,System.String,System.Single,System.Single,System.Single)\">\r\n            Shows text right, left or center aligned with rotation.\r\n            @param alignment the alignment can be ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT\r\n            @param text the text to show\r\n            @param x the x pivot position\r\n            @param y the y pivot position\r\n            @param rotation the rotation to be applied in degrees counterclockwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ShowTextAlignedKerned(System.Int32,System.String,System.Single,System.Single,System.Single)\">\r\n            Shows text kerned right, left or center aligned with rotation.\r\n            @param alignment the alignment can be ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT\r\n            @param text the text to show\r\n            @param x the x pivot position\r\n            @param y the y pivot position\r\n            @param rotation the rotation to be applied in degrees counterclockwise\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.ConcatCTM(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.ConcatCTM(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ConcatCTM(iTextSharp.awt.geom.AffineTransform)\">\r\n            Concatenate a matrix to the current transformation matrix.\r\n            @param transform added to the Current Transformation Matrix\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.BezierArc(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.BezierArc(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Arc(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n             Draws a partial ellipse inscribed within the rectangle x1,y1,x2,y2,\r\n             starting at startAng degrees and covering extent degrees. Angles\r\n             start with 0 to the right (+x) and increase counter-clockwise.\r\n            \r\n             @param x1 a corner of the enclosing rectangle\r\n             @param y1 a corner of the enclosing rectangle\r\n             @param x2 a corner of the enclosing rectangle\r\n             @param y2 a corner of the enclosing rectangle\r\n             @param startAng starting angle in degrees\r\n             @param extent angle extent in degrees\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Arc(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\r\n             Draws a partial ellipse inscribed within the rectangle x1,y1,x2,y2,\r\n             starting at startAng degrees and covering extent degrees. Angles\r\n             start with 0 to the right (+x) and increase counter-clockwise.\r\n            \r\n             @param x1 a corner of the enclosing rectangle\r\n             @param y1 a corner of the enclosing rectangle\r\n             @param x2 a corner of the enclosing rectangle\r\n             @param y2 a corner of the enclosing rectangle\r\n             @param startAng starting angle in degrees\r\n             @param extent angle extent in degrees\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Ellipse(System.Double,System.Double,System.Double,System.Double)\">\r\n             Draws an ellipse inscribed within the rectangle x1,y1,x2,y2.\r\n            \r\n             @param x1 a corner of the enclosing rectangle\r\n             @param y1 a corner of the enclosing rectangle\r\n             @param x2 a corner of the enclosing rectangle\r\n             @param y2 a corner of the enclosing rectangle\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Ellipse(System.Single,System.Single,System.Single,System.Single)\">\r\n             Draws an ellipse inscribed within the rectangle x1,y1,x2,y2.\r\n            \r\n             @param x1 a corner of the enclosing rectangle\r\n             @param y1 a corner of the enclosing rectangle\r\n             @param x2 a corner of the enclosing rectangle\r\n             @param y2 a corner of the enclosing rectangle\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CreatePattern(System.Single,System.Single,System.Single,System.Single)\">\r\n             Create a new colored tiling pattern.\r\n            \r\n             @param width the width of the pattern\r\n             @param height the height of the pattern\r\n             @param xstep the desired horizontal spacing between pattern cells.\r\n             May be either positive or negative, but not zero.\r\n             @param ystep the desired vertical spacing between pattern cells.\r\n             May be either positive or negative, but not zero.\r\n             @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CreatePattern(System.Single,System.Single)\">\r\n            Create a new colored tiling pattern. Variables xstep and ystep are set to the same values\r\n            of width and height.\r\n            @param width the width of the pattern\r\n            @param height the height of the pattern\r\n            @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CreatePattern(System.Single,System.Single,System.Single,System.Single,iTextSharp.text.BaseColor)\">\r\n             Create a new uncolored tiling pattern.\r\n            \r\n             @param width the width of the pattern\r\n             @param height the height of the pattern\r\n             @param xstep the desired horizontal spacing between pattern cells.\r\n             May be either positive or negative, but not zero.\r\n             @param ystep the desired vertical spacing between pattern cells.\r\n             May be either positive or negative, but not zero.\r\n             @param color the default color. Can be <CODE>null</CODE>\r\n             @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CreatePattern(System.Single,System.Single,iTextSharp.text.BaseColor)\">\r\n            Create a new uncolored tiling pattern.\r\n            Variables xstep and ystep are set to the same values\r\n            of width and height.\r\n            @param width the width of the pattern\r\n            @param height the height of the pattern\r\n            @param color the default color. Can be <CODE>null</CODE>\r\n            @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.CreateTemplate(System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CreateAppearance(System.Single,System.Single)\">\r\n             Creates a new appearance to be used with form fields.\r\n            \r\n             @param width the bounding box width\r\n             @param height the bounding box height\r\n             @return the appearance created\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddPSXObject(iTextSharp.text.pdf.PdfPSXObject)\">\r\n             Adds a PostScript XObject to this content.\r\n            \r\n             @param psobject the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Boolean)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n             @param tagContent <code>true</code> - template content will be tagged(all that will be added after), <code>false</code> - only a Do operator will be tagged.\r\n                               taken into account only if <code>isTagged()</code> - <code>true</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n             @param tagContent <code>true</code> - template content will be tagged(all that will be added after), <code>false</code> - only a Do operator will be tagged.\r\n                               taken into account only if <code>isTagged()</code> - <code>true</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Boolean,System.Boolean)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n             @param tagContent <code>true</code> - template content will be tagged(all that will be added after), <code>false</code> - only a Do operator will be tagged.\r\n                               taken into account only if <code>isTagged()</code> - <code>true</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddFormXObj(iTextSharp.text.pdf.PdfStream,iTextSharp.text.pdf.PdfName,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n             Adds a form XObject to this content.\r\n            \r\n             @param formXObj the form XObject\r\n             @param name the name of form XObject in content stream. The name is changed, if if it already exists in page resources\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n             \r\n             @return Name under which XObject was stored in resources. See <code>name</code> parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddFormXObj(iTextSharp.text.pdf.PdfStream,iTextSharp.text.pdf.PdfName,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\r\n             Adds a form XObject to this content.\r\n            \r\n             @param formXObj the form XObject\r\n             @param name the name of form XObject in content stream. The name is changed, if if it already exists in page resources\r\n             @param a an element of the transformation matrix\r\n             @param b an element of the transformation matrix\r\n             @param c an element of the transformation matrix\r\n             @param d an element of the transformation matrix\r\n             @param e an element of the transformation matrix\r\n             @param f an element of the transformation matrix\r\n             \r\n             @return Name under which XObject was stored in resources. See <code>name</code> parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,iTextSharp.awt.geom.AffineTransform)\">\r\n            adds a template with the given matrix.\r\n            @param template template to add\r\n            @param transform transform to apply to the template prior to adding it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,iTextSharp.awt.geom.AffineTransform,System.Boolean)\">\r\n            adds a template with the given matrix.\r\n            @param template template to add\r\n            @param transform transform to apply to the template prior to adding it.\r\n            @param tagContent <code>true</code> - template content will be tagged(all that will be added after), <code>false</code> - only a Do operator will be tagged.\r\n                              taken into account only if <code>isTagged()</code> - <code>true</code>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Single,System.Single)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param x the x location of this template\r\n             @param y the y location of this template\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Double,System.Double)\">\r\n             Adds a template to this content.\r\n            \r\n             @param template the template\r\n             @param x the x location of this template\r\n             @param y the y location of this template\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetCMYKColorFill(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n             Changes the current color for filling paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),\r\n             and sets the color to use for filling paths.</P>\r\n             <P>\r\n             This method is described in the 'Portable Document Format Reference Manual version 1.3'\r\n             section 8.5.2.1 (page 331).</P>\r\n             <P>\r\n             Following the PDF manual, each operand must be a number between 0 (no ink) and\r\n             1 (maximum ink). This method however accepts only ints between 0x00 and 0xFF.</P>\r\n            \r\n             @param cyan the intensity of cyan\r\n             @param magenta the intensity of magenta\r\n             @param yellow the intensity of yellow\r\n             @param black the intensity of black\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetCMYKColorStroke(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n             Changes the current color for stroking paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),\r\n             and sets the color to use for stroking paths.</P>\r\n             <P>\r\n             This method is described in the 'Portable Document Format Reference Manual version 1.3'\r\n             section 8.5.2.1 (page 331).</P>\r\n             Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and\r\n             1 (maximum intensity). This method however accepts only ints between 0x00 and 0xFF.\r\n            \r\n             @param cyan the intensity of red\r\n             @param magenta the intensity of green\r\n             @param yellow the intensity of blue\r\n             @param black the intensity of black\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetRGBColorFill(System.Int32,System.Int32,System.Int32)\">\r\n             Changes the current color for filling paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),\r\n             and sets the color to use for filling paths.</P>\r\n             <P>\r\n             This method is described in the 'Portable Document Format Reference Manual version 1.3'\r\n             section 8.5.2.1 (page 331).</P>\r\n             <P>\r\n             Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and\r\n             1 (maximum intensity). This method however accepts only ints between 0x00 and 0xFF.</P>\r\n            \r\n             @param red the intensity of red\r\n             @param green the intensity of green\r\n             @param blue the intensity of blue\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetRGBColorStroke(System.Int32,System.Int32,System.Int32)\">\r\n             Changes the current color for stroking paths (device dependent colors!).\r\n             <P>\r\n             Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),\r\n             and sets the color to use for stroking paths.</P>\r\n             <P>\r\n             This method is described in the 'Portable Document Format Reference Manual version 1.3'\r\n             section 8.5.2.1 (page 331).</P>\r\n             Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and\r\n             1 (maximum intensity). This method however accepts only ints between 0x00 and 0xFF.\r\n            \r\n             @param red the intensity of red\r\n             @param green the intensity of green\r\n             @param blue the intensity of blue\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetColorStroke(iTextSharp.text.BaseColor)\">\r\n            Sets the stroke color. <CODE>color</CODE> can be an\r\n            <CODE>ExtendedColor</CODE>.\r\n            @param color the color\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetColorFill(iTextSharp.text.BaseColor)\">\r\n            Sets the fill color. <CODE>color</CODE> can be an\r\n            <CODE>ExtendedColor</CODE>.\r\n            @param color the color\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetColorFill(iTextSharp.text.pdf.PdfSpotColor,System.Single)\">\r\n            Sets the fill color to a spot color.\r\n            @param sp the spot color\r\n            @param tint the tint for the spot color. 0 is no color and 1\r\n            is 100% color\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetColorStroke(iTextSharp.text.pdf.PdfSpotColor,System.Single)\">\r\n            Sets the stroke color to a spot color.\r\n            @param sp the spot color\r\n            @param tint the tint for the spot color. 0 is no color and 1\r\n            is 100% color\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetPatternFill(iTextSharp.text.pdf.PdfPatternPainter)\">\r\n            Sets the fill color to a pattern. The pattern can be\r\n            colored or uncolored.\r\n            @param p the pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.OutputColorNumbers(iTextSharp.text.BaseColor,System.Single)\">\r\n            Outputs the color values to the content.\r\n            @param color The color\r\n            @param tint the tint if it is a spot color, ignored otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetPatternFill(iTextSharp.text.pdf.PdfPatternPainter,iTextSharp.text.BaseColor)\">\r\n            Sets the fill color to an uncolored pattern.\r\n            @param p the pattern\r\n            @param color the color of the pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetPatternFill(iTextSharp.text.pdf.PdfPatternPainter,iTextSharp.text.BaseColor,System.Single)\">\r\n            Sets the fill color to an uncolored pattern.\r\n            @param p the pattern\r\n            @param color the color of the pattern\r\n            @param tint the tint if the color is a spot color, ignored otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetPatternStroke(iTextSharp.text.pdf.PdfPatternPainter,iTextSharp.text.BaseColor)\">\r\n            Sets the stroke color to an uncolored pattern.\r\n            @param p the pattern\r\n            @param color the color of the pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetPatternStroke(iTextSharp.text.pdf.PdfPatternPainter,iTextSharp.text.BaseColor,System.Single)\">\r\n            Sets the stroke color to an uncolored pattern.\r\n            @param p the pattern\r\n            @param color the color of the pattern\r\n            @param tint the tint if the color is a spot color, ignored otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetPatternStroke(iTextSharp.text.pdf.PdfPatternPainter)\">\r\n            Sets the stroke color to a pattern. The pattern can be\r\n            colored or uncolored.\r\n            @param p the pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.PaintShading(iTextSharp.text.pdf.PdfShading)\">\r\n            Paints using a shading object. \r\n            @param shading the shading object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.PaintShading(iTextSharp.text.pdf.PdfShadingPattern)\">\r\n            Paints using a shading pattern. \r\n            @param shading the shading pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetShadingFill(iTextSharp.text.pdf.PdfShadingPattern)\">\r\n            Sets the shading fill pattern.\r\n            @param shading the shading pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetShadingStroke(iTextSharp.text.pdf.PdfShadingPattern)\">\r\n            Sets the shading stroke pattern\r\n            @param shading the shading pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CheckWriter\">\r\n            Check if we have a valid PdfWriter.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.ShowText(iTextSharp.text.pdf.PdfTextArray)\">\r\n            Show an array of text.\r\n            @param text array of text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.PdfWriter\">\r\n            Gets the <CODE>PdfWriter</CODE> in use by this object.\r\n            @return the <CODE>PdfWriter</CODE> in use by this object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.PdfDocument\">\r\n            Gets the <CODE>PdfDocument</CODE> in use by this object.\r\n            @return the <CODE>PdfDocument</CODE> in use by this object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.LocalGoto(System.String,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements a link to other part of the document. The jump will\r\n            be made to a local destination with the same name, that must exist.\r\n            @param name the name for this link\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.LocalDestination(System.String,iTextSharp.text.pdf.PdfDestination)\">\r\n            The local destination to where a local goto with the same\r\n            name will jump.\r\n            @param name the name of this local destination\r\n            @param destination the <CODE>PdfDestination</CODE> with the jump coordinates\r\n            @return <CODE>true</CODE> if the local destination was added,\r\n            <CODE>false</CODE> if a local destination with the same name\r\n            already exists\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentByte.Duplicate\">\r\n             Gets a duplicate of this <CODE>PdfContentByte</CODE>. All\r\n             the members are copied by reference but the buffer stays different.\r\n            \r\n             @return a copy of this <CODE>PdfContentByte</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.RemoteGoto(System.String,System.String,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements a link to another document.\r\n            @param filename the filename for the remote document\r\n            @param name the name to jump to\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.RemoteGoto(System.String,System.Int32,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements a link to another document.\r\n            @param filename the filename for the remote document\r\n            @param page the page to jump to\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.RoundRectangle(System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n             Adds a round rectangle to the current path.\r\n            \r\n             @param x x-coordinate of the starting point\r\n             @param y y-coordinate of the starting point\r\n             @param w width\r\n             @param h height\r\n             @param r radius of the arc corner\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.RoundRectangle(System.Double,System.Double,System.Double,System.Double,System.Double)\">\r\n             Adds a round rectangle to the current path.\r\n            \r\n             @param x x-coordinate of the starting point\r\n             @param y y-coordinate of the starting point\r\n             @param w width\r\n             @param h height\r\n             @param r radius of the arc corner\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetAction(iTextSharp.text.pdf.PdfAction,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements an action in an area.\r\n            @param action the <CODE>PdfAction</CODE>\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetLiteral(System.String)\">\r\n            Outputs a <CODE>string</CODE> directly to the content.\r\n            @param s the <CODE>string</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetLiteral(System.Char)\">\r\n            Outputs a <CODE>char</CODE> directly to the content.\r\n            @param c the <CODE>char</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetLiteral(System.Single)\">\r\n            Outputs a <CODE>float</CODE> directly to the content.\r\n            @param n the <CODE>float</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.CheckNoPattern(iTextSharp.text.pdf.PdfTemplate)\">\r\n            Throws an error if it is a pattern.\r\n            @param t the object to check\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.DrawRadioField(System.Single,System.Single,System.Single,System.Single,System.Boolean)\">\r\n            Draws a TextField.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.DrawRadioField(System.Double,System.Double,System.Double,System.Double,System.Boolean)\">\r\n            Draws a TextField.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.DrawTextField(System.Single,System.Single,System.Single,System.Single)\">\r\n            Draws a TextField.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.DrawTextField(System.Double,System.Double,System.Double,System.Double)\">\r\n            Draws a TextField.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.DrawButton(System.Single,System.Single,System.Single,System.Single,System.String,iTextSharp.text.pdf.BaseFont,System.Single)\">\r\n            Draws a button.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.DrawButton(System.Double,System.Double,System.Double,System.Double,System.String,iTextSharp.text.pdf.BaseFont,System.Single)\">\r\n            Draws a button.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetGState(iTextSharp.text.pdf.PdfGState)\">\r\n            Sets the graphic state\r\n            @param gstate the graphic state\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfContentByte.BeginLayer(iTextSharp.text.pdf.IPdfOCG)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.EndLayer\">\r\n            Ends a layer controled graphic block. It will end the most recent open block.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SetDefaultColorspace(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Sets the default colorspace.\r\n            @param name the name of the colorspace. It can be <CODE>PdfName.DEFAULTGRAY</CODE>, <CODE>PdfName.DEFAULTRGB</CODE>\r\n            or <CODE>PdfName.DEFAULTCMYK</CODE>\r\n            @param obj the colorspace. A <CODE>null</CODE> or <CODE>PdfNull</CODE> removes any colorspace with the same name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.Transform(iTextSharp.awt.geom.AffineTransform)\">\r\n            Concatenates a transformation to the current transformation\r\n            matrix.\r\n            @param af the transformation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.BeginMarkedContentSequence(iTextSharp.text.pdf.PdfStructureElement)\">\r\n            Begins a marked content sequence. This sequence will be tagged with the structure <CODE>struc</CODE>.\r\n            The same structure can be used several times to connect text that belongs to the same logical segment\r\n            but is in a different location, like the same paragraph crossing to another page, for example.\r\n            @param struc the tagging structure\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.BeginMarkedContentSequence(iTextSharp.text.pdf.PdfStructureElement,System.String)\">\r\n            Begins a marked content sequence. This sequence will be tagged with the structure <CODE>struc</CODE>.\r\n            The same structure can be used several times to connect text that belongs to the same logical segment\r\n            but is in a different location, like the same paragraph crossing to another page, for example.\r\n            @param struc the tagging structure\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.EndMarkedContentSequence\">\r\n            Ends a marked content sequence\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.BeginMarkedContentSequence(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfDictionary,System.Boolean)\">\r\n            Begins a marked content sequence. If property is <CODE>null</CODE> the mark will be of the type\r\n            <CODE>BMC</CODE> otherwise it will be <CODE>BDC</CODE>.\r\n            @param tag the tag\r\n            @param property the property\r\n            @param inline <CODE>true</CODE> to include the property in the content or <CODE>false</CODE>\r\n            to include the property in the resource dictionary with the possibility of reusing\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.BeginMarkedContentSequence(iTextSharp.text.pdf.PdfName)\">\r\n            This is just a shorthand to <CODE>beginMarkedContentSequence(tag, null, false)</CODE>.\r\n            @param tag the tag\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentByte.SanityCheck\">\r\n            Checks for any dangling state: Mismatched save/restore state, begin/end text,\r\n            begin/end layer, or begin/end marked content sequence.\r\n            If found, this function will throw.  This function is called automatically\r\n            during a Reset() (from Document.NewPage() for example), and before writing \r\n            itself out in ToPdf().\r\n            One possible cause: not calling myPdfGraphics2D.Dispose() will leave dangling\r\n                                SaveState() calls.\r\n            @since 2.1.6\r\n            @throws IllegalPdfSyntaxException (a runtime exception)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfContentParser\">\r\n            Parses the page or template content.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentParser.COMMAND_TYPE\">\r\n            Commands have this type.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfContentParser.tokeniser\">\r\n            Holds value of property tokeniser.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.#ctor(iTextSharp.text.pdf.PRTokeniser)\">\r\n            Creates a new instance of PdfContentParser\r\n            @param tokeniser the tokeniser with the content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.Parse(System.Collections.Generic.List{iTextSharp.text.pdf.PdfObject})\">\r\n            Parses a single command from the content. Each command is output as an array of arguments\r\n            having the command itself as the last element. The returned array will be empty if the\r\n            end of content was reached.\r\n            @param ls an <CODE>ArrayList</CODE> to use. It will be cleared before using. If it's\r\n            <CODE>null</CODE> will create a new <CODE>ArrayList</CODE>\r\n            @return the same <CODE>ArrayList</CODE> given as argument or a new one\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.GetTokeniser\">\r\n            Gets the tokeniser.\r\n            @return the tokeniser.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfContentParser.Tokeniser\">\r\n            Sets the tokeniser.\r\n            @param tokeniser the tokeniser\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.ReadDictionary\">\r\n            Reads a dictionary. The tokeniser must be positioned past the \"&lt;&lt;\" token.\r\n            @return the dictionary\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.ReadArray\">\r\n            Reads an array. The tokeniser must be positioned past the \"[\" token.\r\n            @return an array\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.ReadPRObject\">\r\n            Reads a pdf object.\r\n            @return the pdf object\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContentParser.NextValidToken\">\r\n            Reads the next token skipping over the comments.\r\n            @return <CODE>true</CODE> if a token was read, <CODE>false</CODE> if the end of content was reached\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfContents\">\r\n            <CODE>PdfContents</CODE> is a <CODE>PdfStream</CODE> containing the contents (text + graphics) of a <CODE>PdfPage</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfContents.#ctor(iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.Rectangle)\">\r\n             Constructs a <CODE>PdfContents</CODE>-object, containing text and general graphics.\r\n            \r\n             @param under the direct content that is under all others\r\n             @param content the graphics in a page\r\n             @param text the text in a page\r\n             @param secondContent the direct content that is over all others\r\n             @throws BadPdfFormatException on error\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfCopy\">\r\n            Make copies of PDF documents. Documents can be edited after reading and\r\n            before writing them out.\r\n            @author Mark Thompson\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfCopy.IndirectReferences\">\r\n            This class holds information about indirect references, since they are\r\n            renumbered by iText.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfCopy.rotateContents\">\r\n            Holds value of property rotateContents. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.#ctor(iTextSharp.text.Document,System.IO.Stream)\">\r\n            Constructor\r\n            @param document\r\n            @param os outputstream\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopy.PageEvent\">\r\n            Setting page events isn't possible with Pdf(Smart)Copy.\r\n            Use the PageStamp class if you want to add content to copied pages.\r\n            @see com.itextpdf.text.pdf.PdfWriter#setPageEvent(com.itextpdf.text.pdf.PdfPageEvent)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopy.RotateContents\">\r\n            Checks if the content is automatically adjusted to compensate\r\n            the original page rotation.\r\n            @return the auto-rotation status\r\n            Flags the content to be automatically adjusted to compensate\r\n            the original page rotation. The default is <CODE>true</CODE>.\r\n            @param rotateContents <CODE>true</CODE> to set auto-rotation, <CODE>false</CODE>\r\n            otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.GetImportedPage(iTextSharp.text.pdf.PdfReader,System.Int32)\">\r\n            Grabs a page from the input document\r\n            @param reader the reader of the document\r\n            @param pageNumber which page to get\r\n            @return the page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyIndirect(iTextSharp.text.pdf.PRIndirectReference,System.Boolean,System.Boolean)\">\r\n            Translate a PRIndirectReference to a PdfIndirectReference\r\n            In addition, translates the object numbers, and copies the\r\n            referenced object to the output file.\r\n            NB: PRIndirectReferences (and PRIndirectObjects) really need to know what\r\n            file they came from, because each file has its own namespace. The translation\r\n            we do from their namespace to ours is *at best* heuristic, and guaranteed to\r\n            fail under some circumstances.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyIndirect(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Translate a PRIndirectReference to a PdfIndirectReference\r\n            In addition, translates the object numbers, and copies the\r\n            referenced object to the output file.\r\n            NB: PRIndirectReferences (and PRIndirectObjects) really need to know what\r\n            file they came from, because each file has its own namespace. The translation\r\n            we do from their namespace to ours is *at best* heuristic, and guaranteed to\r\n            fail under some circumstances.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyDictionary(iTextSharp.text.pdf.PdfDictionary,System.Boolean,System.Boolean)\">\r\n            Translate a PRDictionary to a PdfDictionary. Also translate all of the\r\n            objects contained in it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyDictionary(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Translate a PRDictionary to a PdfDictionary. Also translate all of the\r\n            objects contained in it.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyStream(iTextSharp.text.pdf.PRStream)\">\r\n            Translate a PRStream to a PdfStream. The data part copies itself.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyArray(iTextSharp.text.pdf.PdfArray,System.Boolean,System.Boolean)\">\r\n            Translate a PRArray to a PdfArray. Also translate all of the objects contained\r\n            in it\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyArray(iTextSharp.text.pdf.PdfArray)\">\r\n            Translate a PRArray to a PdfArray. Also translate all of the objects contained\r\n            in it\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyObject(iTextSharp.text.pdf.PdfObject,System.Boolean,System.Boolean)\">\r\n            Translate a PR-object to a Pdf-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyObject(iTextSharp.text.pdf.PdfObject)\">\r\n            Translate a PR-object to a Pdf-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.SetFromIPage(iTextSharp.text.pdf.PdfImportedPage)\">\r\n            convenience method. Given an importedpage, set our \"globals\"\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.SetFromReader(iTextSharp.text.pdf.PdfReader)\">\r\n            convenience method. Given a reader, set our \"globals\"\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.AddPage(iTextSharp.text.pdf.PdfImportedPage)\">\r\n            Add an imported page to our output\r\n            @param iPage an imported page\r\n            @throws IOException, BadPdfFormatException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.AddPage(iTextSharp.text.Rectangle,System.Int32)\">\r\n            Adds a blank page.\r\n            @param\trect The page dimension\r\n            @param\trotation The rotation angle in degrees\r\n            @since\t2.1.5\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.CopyDocumentFields(iTextSharp.text.pdf.PdfReader)\">\r\n            Copy document fields to a destination document.\r\n            @param reader a document where fields are copied from.\r\n            @throws DocumentException\r\n            @throws IOException\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfCopy.Close”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfCopy.CreatePageStamp(iTextSharp.text.pdf.PdfImportedPage)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopy.StampContent.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PageResources)\">\r\n            Creates a new instance of StampContent \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopy.StampContent.Duplicate\">\r\n             Gets a duplicate of this <CODE>PdfContentByte</CODE>. All\r\n             the members are copied by reference but the buffer stays different.\r\n            \r\n             @return a copy of this <CODE>PdfContentByte</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfCopyFields\">\r\n            Concatenates PDF documents including form fields. The rules for the form field\r\n            concatenation are the same as in Acrobat. All the documents are kept in memory unlike\r\n            PdfCopy.\r\n            @author  Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.#ctor(System.IO.Stream)\">\r\n            Creates a new instance.\r\n            @param os the output stream\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.#ctor(System.IO.Stream,System.Char)\">\r\n            Creates a new instance.\r\n            @param os the output stream\r\n            @param pdfVersion the pdf version the output will have\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.AddDocument(iTextSharp.text.pdf.PdfReader)\">\r\n            Concatenates a PDF document.\r\n            @param reader the PDF document\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.AddDocument(iTextSharp.text.pdf.PdfReader,System.Collections.Generic.IList{System.Int32})\">\r\n            Concatenates a PDF document selecting the pages to keep. The pages are described as a\r\n            <CODE>List</CODE> of <CODE>Integer</CODE>. The page ordering can be changed but\r\n            no page repetitions are allowed.\r\n            @param reader the PDF document\r\n            @param pagesToKeep the pages to keep\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.AddDocument(iTextSharp.text.pdf.PdfReader,System.String)\">\r\n            Concatenates a PDF document selecting the pages to keep. The pages are described as\r\n            ranges. The page ordering can be changed but\r\n            no page repetitions are allowed.\r\n            @param reader the PDF document\r\n            @param ranges the comma separated ranges as described in {@link SequenceList}\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Boolean)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.SetEncryption(System.Boolean,System.String,System.String,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param strength true for 128 bit key length. false for 40 bit key length\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.Close\">\r\n            Closes the output document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.Open\">\r\n            Opens the document. This is usually not needed as AddDocument() will do it\r\n            automatically.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.AddJavaScript(System.String)\">\r\n            Adds JavaScript to the global document\r\n            @param js the JavaScript\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyFields.Outlines\">\r\n            Sets the bookmarks. The list structure is defined in\r\n            {@link SimpleBookmark}.\r\n            @param outlines the bookmarks or <CODE>null</CODE> to remove any\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyFields.Writer\">\r\n            Gets the underlying PdfWriter.\r\n            @return the underlying PdfWriter\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyFields.FullCompression\">\r\n            Gets the 1.5 compression status.\r\n            @return <code>true</code> if the 1.5 compression is on\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.SetFullCompression\">\r\n            Sets the document's compression to the new 1.5 mode with object streams and xref\r\n            streams. It can be set at any time but once set it can't be unset.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Int32)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfEncryptionSettings#setEncryption(byte[], byte[], int, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfViewerPreferences#addViewerPreference(com.lowagie.text.pdf.PdfName, com.lowagie.text.pdf.PdfObject)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyFields.ViewerPreferences\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfViewerPreferences#setViewerPreferences(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFields.SetEncryption(Org.BouncyCastle.X509.X509Certificate[],System.Int32[],System.Int32)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfEncryptionSettings#setEncryption(java.security.cert.Certificate[], int[], int)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfCopyFieldsImp\">\r\n            \r\n             @author  psoares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFieldsImp.SetVisited(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Sets a reference to \"visited\" in the copy process.\r\n            @param   ref the reference that needs to be set to \"visited\"\r\n            @return  true if the reference was set to visited\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFieldsImp.IsVisited(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Checks if a reference has already been \"visited\" in the copy process.\r\n            @param   ref the reference that needs to be checked\r\n            @return  true if the reference was already visited\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFieldsImp.IsPage(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Checks if a reference refers to a page object.\r\n            @param   ref the reference that needs to be checked\r\n            @return  true is the reference refers to a page object.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfCopyForms\">\r\n            Allows you to add one (or more) existing PDF document(s) to\r\n            create a new PDF and add the form of another PDF document to\r\n            this new PDF.\r\n            @since 2.1.5\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfCopyForms.fc\">\r\n            The class with the actual implementations. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.#ctor(System.IO.Stream)\">\r\n            Creates a new instance.\r\n            @param os the output stream\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.AddDocument(iTextSharp.text.pdf.PdfReader)\">\r\n            Concatenates a PDF document.\r\n            @param reader the PDF document\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.AddDocument(iTextSharp.text.pdf.PdfReader,System.Collections.Generic.ICollection{System.Int32})\">\r\n            Concatenates a PDF document selecting the pages to keep. The pages are described as a\r\n            <CODE>List</CODE> of <CODE>Integer</CODE>. The page ordering can be changed but\r\n            no page repetitions are allowed.\r\n            @param reader the PDF document\r\n            @param pagesToKeep the pages to keep\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.AddDocument(iTextSharp.text.pdf.PdfReader,System.String)\">\r\n            Concatenates a PDF document selecting the pages to keep. The pages are described as\r\n            ranges. The page ordering can be changed but\r\n            no page repetitions are allowed.\r\n            @param reader the PDF document\r\n            @param ranges the comma separated ranges as described in {@link SequenceList}\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.CopyDocumentFields(iTextSharp.text.pdf.PdfReader)\">\r\n            Copies the form fields of this PDFDocument onto the PDF-Document which was added\r\n             @param reader the PDF document\r\n             @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Boolean)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.SetEncryption(System.Boolean,System.String,System.String,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param strength true for 128 bit key length. false for 40 bit key length\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.Close\">\r\n            Closes the output document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.Open\">\r\n            Opens the document. This is usually not needed as addDocument() will do it\r\n            automatically.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.AddJavaScript(System.String)\">\r\n            Adds JavaScript to the global document\r\n            @param js the JavaScript\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyForms.Outlines\">\r\n            Sets the bookmarks. The list structure is defined in\r\n            <CODE>SimpleBookmark#</CODE>.\r\n            @param outlines the bookmarks or <CODE>null</CODE> to remove any\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyForms.Writer\">\r\n            Gets the underlying PdfWriter.\r\n            @return the underlying PdfWriter\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyForms.FullCompression\">\r\n            Gets the 1.5 compression status.\r\n            @return <code>true</code> if the 1.5 compression is on\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfCopyForms.SetFullCompression”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Int32)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfEncryptionSettings#setEncryption(byte[], byte[], int, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfViewerPreferences#addViewerPreference(com.lowagie.text.pdf.PdfName, com.lowagie.text.pdf.PdfObject)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfCopyForms.ViewerPreferences\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfViewerPreferences#setViewerPreferences(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyForms.SetEncryption(Org.BouncyCastle.X509.X509Certificate[],System.Int32[],System.Int32)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfEncryptionSettings#setEncryption(java.security.cert.Certificate[], int[], int)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfCopyFormsImp\">\r\n            Allows you to add one (or more) existing PDF document(s)\r\n            and add the form(s) of (an)other PDF document(s).\r\n            @since 2.1.5\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFormsImp.#ctor(System.IO.Stream)\">\r\n            This sets up the output document \r\n            @param os The Outputstream pointing to the output document\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFormsImp.CopyDocumentFields(iTextSharp.text.pdf.PdfReader)\">\r\n            This method feeds in the source document\r\n            @param reader The PDF reader containing the source document\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfCopyFormsImp.MergeFields\">\r\n            This merge fields is slightly different from the mergeFields method\r\n            of PdfCopyFields.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfDashPattern\">\r\n             A <CODE>PdfDashPattern</CODE> defines a dash pattern as described in\r\n             the PDF Reference Manual version 1.3 p 325 (section 8.4.3).\r\n            \r\n             @see        PdfArray\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDashPattern.dash\">\r\n            This is the length of a dash. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDashPattern.gap\">\r\n            This is the length of a gap. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDashPattern.phase\">\r\n            This is the phase. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDashPattern.#ctor\">\r\n            Constructs a new <CODE>PdfDashPattern</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDashPattern.#ctor(System.Single)\">\r\n            Constructs a new <CODE>PdfDashPattern</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDashPattern.#ctor(System.Single,System.Single)\">\r\n            Constructs a new <CODE>PdfDashPattern</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDashPattern.#ctor(System.Single,System.Single,System.Single)\">\r\n            Constructs a new <CODE>PdfDashPattern</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDashPattern.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n             Returns the PDF representation of this <CODE>PdfArray</CODE>.\r\n            \r\n             @return        an array of <CODE>byte</CODE>s\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfDate”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDate.#ctor(System.DateTime)\">\r\n             Constructs a <CODE>PdfDate</CODE>-object.\r\n            \r\n             @param       d           the date that has to be turned into a <CODE>PdfDate</CODE>-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDate.#ctor\">\r\n            Constructs a <CODE>PdfDate</CODE>-object, representing the current day and time.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDate.SetLength(System.Int32,System.Int32)\">\r\n             Adds a number of leading zeros to a given <CODE>string</CODE> in order to get a <CODE>string</CODE>\r\n             of a certain length.\r\n            \r\n             @param       i           a given number\r\n             @param       length      the length of the resulting <CODE>string</CODE>\r\n             @return      the resulting <CODE>string</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDate.GetW3CDate\">\r\n            Gives the W3C format of the PdfDate.\r\n            @return a formatted date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDate.GetW3CDate(System.String)\">\r\n            Gives the W3C format of the PdfDate.\r\n            @param d the date in the format D:YYYYMMDDHHmmSSOHH'mm'\r\n            @return a formatted date\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfDestination\">\r\n             A <CODE>PdfColor</CODE> defines a Color (it's a <CODE>PdfArray</CODE> containing 3 values).\r\n            \r\n             @see        PdfDictionary\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.XYZ\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FIT\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FITH\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FITV\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FITR\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FITB\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FITBH\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.FITBV\">\r\n            This is a possible destination type \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDestination.status\">\r\n            Is the indirect reference to a page already added? \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDestination.#ctor(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDestination.#ctor(System.Int32,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDestination.#ctor(System.Int32,System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDestination.#ctor(System.Int32,System.Single,System.Single,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDestination.#ctor(System.String)\">\r\n            Creates a PdfDestination based on a String.\r\n            Valid Strings are for instance the values returned by SimpleNamedDestination:\r\n            \"Fit\", \"XYZ 36 806 0\",...\r\n            @param    dest    a String notation of a destination.\r\n            @since    iText 5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDestination.HasPage\">\r\n             Checks if an indirect reference to a page has been added.\r\n            \r\n             @return    <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDestination.AddPage(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Adds the indirect reference of the destination page.\r\n            \r\n             @param page    an indirect reference\r\n             @return true if the page reference was added\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfDeveloperExtension\">\r\n            Beginning with BaseVersion 1.7, the extensions dictionary lets developers\r\n            designate that a given document contains extensions to PDF. The presence\r\n            of the extension dictionary in a document indicates that it may contain\r\n            developer-specific PDF properties that extend a particular base version\r\n            of the PDF specification.\r\n            The extensions dictionary enables developers to identify their own extensions\r\n            relative to a base version of PDF. Additionally, the convention identifies\r\n            extension levels relative to that base version. The intent of this dictionary\r\n            is to enable developers of PDF-producing applications to identify company-specific\r\n            specifications (such as this one) that PDF-consuming applications use to\r\n            interpret the extensions.\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDeveloperExtension.ADOBE_1_7_EXTENSIONLEVEL3\">\r\n            An instance of this class for Adobe 1.7 Extension level 3. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDeveloperExtension.ESIC_1_7_EXTENSIONLEVEL2\">\r\n            An instance of this class for ETSI 1.7 Extension level 2. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDeveloperExtension.ESIC_1_7_EXTENSIONLEVEL5\">\r\n            An instance of this class for ETSI 1.7 Extension level 5. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDeveloperExtension.prefix\">\r\n            The prefix used in the Extensions dictionary added to the Catalog. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDeveloperExtension.baseversion\">\r\n            The base version. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDeveloperExtension.extensionLevel\">\r\n            The extension level within the baseversion. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDeveloperExtension.#ctor(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfName,System.Int32)\">\r\n            Creates a PdfDeveloperExtension object.\r\n            @param prefix    the prefix referring to the developer\r\n            @param baseversion   the number of the base version\r\n            @param extensionLevel    the extension level within the baseverion.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDeveloperExtension.Prefix\">\r\n            Gets the prefix name.\r\n            @return  a PdfName\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDeveloperExtension.Baseversion\">\r\n            Gets the baseversion name.\r\n            @return  a PdfName\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDeveloperExtension.ExtensionLevel\">\r\n            Gets the extension level within the baseversion.\r\n            @return  an integer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDeveloperExtension.GetDeveloperExtensions\">\r\n            Generations the developer extension dictionary corresponding\r\n            with the prefix.\r\n            @return  a PdfDictionary\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfDictionary”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.FONT\">\r\n            This is a possible type of dictionary \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.OUTLINES\">\r\n            This is a possible type of dictionary \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.PAGE\">\r\n            This is a possible type of dictionary \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.PAGES\">\r\n            This is a possible type of dictionary \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.CATALOG\">\r\n            This is a possible type of dictionary \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.dictionaryType\">\r\n            This is the type of this dictionary \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDictionary.hashMap\">\r\n            This is the hashmap that contains all the values and keys of the dictionary \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.#ctor\">\r\n            Constructs an empty <CODE>PdfDictionary</CODE>-object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.#ctor(iTextSharp.text.pdf.PdfName)\">\r\n             Constructs a <CODE>PdfDictionary</CODE>-object of a certain type.\r\n            \r\n             @param        type    a <CODE>PdfName</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n             Returns the PDF representation of this <CODE>PdfDictionary</CODE>.\r\n            \r\n             @return        an array of <CODE>byte</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.Put(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n             Adds a <CODE>PdfObject</CODE> and its key to the <CODE>PdfDictionary</CODE>.\r\n             If the value is <CODE>null</CODE> or <CODE>PdfNull</CODE> the key is deleted.\r\n            \r\n             @param        key        key of the entry (a <CODE>PdfName</CODE>)\r\n             @param        value    value of the entry (a <CODE>PdfObject</CODE>)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.PutEx(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n             Adds a <CODE>PdfObject</CODE> and its key to the <CODE>PdfDictionary</CODE>.\r\n             If the value is null it does nothing.\r\n            \r\n             @param        key        key of the entry (a <CODE>PdfName</CODE>)\r\n             @param        value    value of the entry (a <CODE>PdfObject</CODE>)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.PutAll(iTextSharp.text.pdf.PdfDictionary)\">\r\n             Copies all of the mappings from the specified <CODE>PdfDictionary</CODE>\r\n             to this <CODE>PdfDictionary</CODE>.\r\n            \r\n             These mappings will replace any mappings previously contained in this\r\n             <CODE>PdfDictionary</CODE>.\r\n            \r\n             @param dic The <CODE>PdfDictionary</CODE> with the mappings to be\r\n               copied over\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.Remove(iTextSharp.text.pdf.PdfName)\">\r\n             Removes a <CODE>PdfObject</CODE> and its key from the <CODE>PdfDictionary</CODE>.\r\n            \r\n             @param        key        key of the entry (a <CODE>PdfName</CODE>)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.Clear\">\r\n            Removes all the <CODE>PdfObject</CODE>s and its <VAR>key</VAR>s from the\r\n            <CODE>PdfDictionary</CODE>.\r\n            @since 5.0.2\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDictionary.Get(iTextSharp.text.pdf.PdfName)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.IsFont\">\r\n              Checks if a <CODE>Dictionary</CODE> is of the type FONT.\r\n            \r\n             @return        <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.IsPage\">\r\n              Checks if a <CODE>Dictionary</CODE> is of the type PAGE.\r\n            \r\n             @return        <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.IsPages\">\r\n              Checks if a <CODE>Dictionary</CODE> is of the type PAGES.\r\n            \r\n             @return        <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.IsCatalog\">\r\n              Checks if a <CODE>Dictionary</CODE> is of the type CATALOG.\r\n            \r\n             @return        <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.IsOutlineTree\">\r\n              Checks if a <CODE>Dictionary</CODE> is of the type OUTLINES.\r\n            \r\n             @return        <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.CheckType(iTextSharp.text.pdf.PdfName)\">\r\n            Checks the type of the dictionary.\r\n            @param type the type you're looking for\r\n            @return true if the type of the dictionary corresponds with the type you're looking for\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.GetDirectObject(iTextSharp.text.pdf.PdfName)\">\r\n            This function behaves the same as 'get', but will never return an indirect reference,\r\n            it will always look such references up and return the actual object.\r\n            @param key \r\n            @return null, or a non-indirect object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDictionary.GetAsDict(iTextSharp.text.pdf.PdfName)\">\r\n            All the getAs functions will return either null, or the specified object type\r\n            This function will automatically look up indirect references. There's one obvious\r\n            exception, the one that will only return an indirect reference.  All direct objects\r\n            come back as a null.\r\n            Mark A Storer (2/17/06)\r\n            @param key\r\n            @return the appropriate object in its final type, or null\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfDocument”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfDocument.PdfInfo”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.#ctor\">\r\n            Construct a <CODE>PdfInfo</CODE>-object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.#ctor(System.String,System.String,System.String)\">\r\n             Constructs a <CODE>PdfInfo</CODE>-object.\r\n            \r\n             @param        author      name of the author of the document\r\n             @param        title       title of the document\r\n             @param        subject     subject of the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddTitle(System.String)\">\r\n             Adds the title of the document.\r\n            \r\n             @param    title       the title of the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddSubject(System.String)\">\r\n             Adds the subject to the document.\r\n            \r\n             @param    subject     the subject of the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddKeywords(System.String)\">\r\n             Adds some keywords to the document.\r\n            \r\n             @param    keywords        the keywords of the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddAuthor(System.String)\">\r\n             Adds the name of the author to the document.\r\n            \r\n             @param    author      the name of the author\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddCreator(System.String)\">\r\n             Adds the name of the creator to the document.\r\n            \r\n             @param    creator     the name of the creator\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddProducer\">\r\n            Adds the name of the producer to the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfInfo.AddCreationDate\">\r\n            Adds the date of creation to the document.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfDocument.PdfCatalog”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfCatalog.#ctor(iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfWriter)\">\r\n             Constructs a <CODE>PdfCatalog</CODE>.\r\n            \r\n             @param        pages       an indirect reference to the root of the document's Pages tree.\r\n             @param writer the writer the catalog applies to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PdfCatalog.AddNames(System.Collections.Generic.SortedDictionary{System.String,iTextSharp.text.pdf.PdfDocument.Destination},System.Collections.Generic.Dictionary{System.String,iTextSharp.text.pdf.PdfObject},System.Collections.Generic.Dictionary{System.String,iTextSharp.text.pdf.PdfObject},iTextSharp.text.pdf.PdfWriter)\">\r\n            Adds the names of the named destinations to the catalog.\r\n            @param localDestinations the local destinations\r\n            @param documentJavaScript the javascript used in the document\r\n            @param writer the writer the catalog applies to\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.PdfCatalog.AdditionalActions\">\r\n            Sets the document level additional actions.\r\n            @param actions   dictionary of actions\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.#ctor\">\r\n            Constructs a new PDF document.\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.writer\">\r\n            The <CODE>PdfWriter</CODE>. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.AddWriter(iTextSharp.text.pdf.PdfWriter)\">\r\n             Adds a <CODE>PdfWriter</CODE> to the <CODE>PdfDocument</CODE>.\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE> that writes everything\r\n                                 what is added to this document to an outputstream.\r\n             @throws DocumentException on error\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.text\">\r\n            This is the PdfContentByte object, containing the text. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.graphics\">\r\n            This is the PdfContentByte object, containing the borders and other Graphics. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.leading\">\r\n            This represents the leading of the lines. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.Leading\">\r\n            Getter for the current leading.\r\n            @return  the current leading\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.currentHeight\">\r\n            This is the current height of the document. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.isSectionTitle\">\r\n            Signals that onParagraph is valid (to avoid that a Chapter/Section title is treated as a Paragraph).\r\n            @since 2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.alignment\">\r\n            This represents the current alignment of the PDF Elements. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.anchorAction\">\r\n            The current active <CODE>PdfAction</CODE> when processing an <CODE>Anchor</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.tabSettings\">\r\n            The current tab settings.\r\n            @return\tthe current\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.leadingStack\">\r\n            Signals that the current leading has to be subtracted from a YMark object when positive\r\n            and save current leading\r\n            @since 2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PushLeading\">\r\n            Save current @leading\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.PopLeading\">\r\n            Restore @leading from leadingStack\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.TabSettings\">\r\n            Getter and setter for the current tab stops.\r\n            @since\t5.4.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.Add(iTextSharp.text.IElement)\">\r\n             Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.\r\n            \r\n             @param element the element to add\r\n             @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.\r\n             @throws DocumentException when a document isn't open yet, or has been closed\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDocument.Open”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDocument.Close”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.XmpMetadata\">\r\n            Use this method to set the XMP Metadata.\r\n            @param xmpMetadata The xmpMetadata to set.\r\n            @throws IOException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.NewPage\">\r\n             Makes a new page and sends it to the <CODE>PdfWriter</CODE>.\r\n            \r\n             @return true if new page was added\r\n             @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.SetPageSize(iTextSharp.text.Rectangle)\">\r\n             Sets the pagesize.\r\n            \r\n             @param pageSize the new pagesize\r\n             @return <CODE>true</CODE> if the page size was set\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.nextMarginLeft\">\r\n            margin in x direction starting from the left. Will be valid in the next page \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.nextMarginRight\">\r\n            margin in x direction starting from the right. Will be valid in the next page \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.nextMarginTop\">\r\n            margin in y direction starting from the top. Will be valid in the next page \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.nextMarginBottom\">\r\n            margin in y direction starting from the bottom. Will be valid in the next page \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.SetMargins(System.Single,System.Single,System.Single,System.Single)\">\r\n             Sets the margins.\r\n            \r\n             @param    marginLeft      the margin on the left\r\n             @param    marginRight     the margin on the right\r\n             @param    marginTop       the margin on the top\r\n             @param    marginBottom    the margin on the bottom\r\n             @return   a <CODE>bool</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.SetMarginMirroring(System.Boolean)\">\r\n            @see com.lowagie.text.DocListener#setMarginMirroring(bool)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.SetMarginMirroringTopBottom(System.Boolean)\">\r\n            @see com.lowagie.text.DocListener#setMarginMirroring(boolean)\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.PageCount\">\r\n             Sets the page number.\r\n            \r\n             @param    pageN       the new page number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.ResetPageCount\">\r\n            Sets the page number to 0.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.firstPageEvent\">\r\n            Signals that OnOpenDocument should be called. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDocument.InitPage”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.line\">\r\n            The line that is currently being written. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.lines\">\r\n            The lines that are written until now. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.NewLine\">\r\n            Adds the current line to the list of lines and also adds an empty line.\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.CalculateLineHeight\">\r\n             line.height() is usually the same as the leading\r\n             We should take leading into account if it is not the same as the line.height\r\n            \r\n             @return float combined height of the line\r\n             @since 5.5.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.CarriageReturn\">\r\n            If the current line is not empty or null, it is added to the arraylist\r\n            of lines and a new empty line is added.\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.GetVerticalPosition(System.Boolean)\">\r\n            Gets the current vertical page position.\r\n            @param ensureNewLine Tells whether a new line shall be enforced. This may cause side effects \r\n              for elements that do not terminate the lines they've started because those lines will get\r\n              terminated. \r\n            @return The current vertical page position.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.lastElementType\">\r\n            Holds the type of the last element, that has been added to the document. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.EnsureNewLine\">\r\n            Ensures that a new line has been started. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.FlushLines\">\r\n             Writes all the lines to the text-object.\r\n            \r\n             @return the displacement that was caused\r\n             @throws DocumentException on error\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.hangingPunctuation\">\r\n            The characters to be applied the hanging punctuation. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfDocument.WriteLineToContent(iTextSharp.text.pdf.PdfLine,iTextSharp.text.pdf.PdfContentByte,iTextSharp.text.pdf.PdfContentByte,System.Object[],System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.indentLeft\">\r\n            This represents the current indentation of the PDF Elements on the left side. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.sectionIndentLeft\">\r\n            Indentation to the left caused by a section. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.listIndentLeft\">\r\n            This represents the current indentation of the PDF Elements on the left side. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.imageIndentLeft\">\r\n            This is the indentation caused by an image on the left. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.indentRight\">\r\n            This represents the current indentation of the PDF Elements on the right side. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.sectionIndentRight\">\r\n            Indentation to the right caused by a section. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.imageIndentRight\">\r\n            This is the indentation caused by an image on the right. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.indentTop\">\r\n            This represents the current indentation of the PDF Elements on the top side. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.Indentation.indentBottom\">\r\n            This represents the current indentation of the PDF Elements on the bottom side. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.IndentLeft\">\r\n             Gets the indentation on the left side.\r\n            \r\n             @return   a margin\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.IndentRight\">\r\n             Gets the indentation on the right side.\r\n            \r\n             @return   a margin\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.IndentTop\">\r\n             Gets the indentation on the top side.\r\n            \r\n             @return   a margin\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.IndentBottom\">\r\n             Gets the indentation on the bottom side.\r\n            \r\n             @return   a margin\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.AddSpacing(System.Single,System.Single,iTextSharp.text.Font)\">\r\n            Calls addSpacing(float, float, Font, boolean (false)).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.AddSpacing(System.Single,System.Single,iTextSharp.text.Font,System.Boolean)\">\r\n            Adds extra space.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.info\">\r\n            some meta information about the Document. \r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.PdfDocument.Info”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.GetCatalog(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n             Gets the <CODE>PdfCatalog</CODE>-object.\r\n            \r\n             @param pages an indirect reference to this document pages\r\n             @return <CODE>PdfCatalog</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.rootOutline\">\r\n            This is the root outline of the document. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.currentOutline\">\r\n            This is the current <CODE>PdfOutline</CODE> in the hierarchy of outlines. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.AddOutline(iTextSharp.text.pdf.PdfOutline,System.String)\">\r\n            Adds a named outline to the document .\r\n            @param outline the outline to be added\r\n            @param name the name of this local destination\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.RootOutline\">\r\n            Gets the root outline. All the outlines must be created with a parent.\r\n            The first level is created with this outline.\r\n            @return the root outline\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.viewerPreferences\">\r\n            Contains the Viewer preferences of this PDF document. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.ViewerPreferences\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfViewerPreferences#setViewerPreferences(int) \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfViewerPreferences#addViewerPreference(com.lowagie.text.pdf.PdfName, com.lowagie.text.pdf.PdfObject) \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.LocalGoto(System.String,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements a link to other part of the document. The jump will\r\n            be made to a local destination with the same name, that must exist.\r\n            @param name the name for this link\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.RemoteGoto(System.String,System.String,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements a link to another document.\r\n            @param filename the filename for the remote document\r\n            @param name the name to jump to\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.RemoteGoto(System.String,System.Int32,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements a link to another document.\r\n            @param filename the filename for the remote document\r\n            @param page the page to jump to\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.SetAction(iTextSharp.text.pdf.PdfAction,System.Single,System.Single,System.Single,System.Single)\">\r\n            Implements an action in an area.\r\n            @param action the <CODE>PdfAction</CODE>\r\n            @param llx the lower left x corner of the activation area\r\n            @param lly the lower left y corner of the activation area\r\n            @param urx the upper right x corner of the activation area\r\n            @param ury the upper right y corner of the activation area\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.localDestinations\">\r\n            Stores the destinations keyed by name. Value is\r\n            <CODE>Object[]{PdfAction,PdfIndirectReference,PdfDestintion}</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.LocalDestination(System.String,iTextSharp.text.pdf.PdfDestination)\">\r\n            The local destination to where a local goto with the same\r\n            name will jump to.\r\n            @param name the name of this local destination\r\n            @param destination the <CODE>PdfDestination</CODE> with the jump coordinates\r\n            @return <CODE>true</CODE> if the local destination was added,\r\n            <CODE>false</CODE> if a local destination with the same name\r\n            already existed\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.jsCounter\">\r\n            Stores a list of document level JavaScript actions.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.Collection\">\r\n            Sets the collection dictionary.\r\n            @param collection a dictionary of type PdfCollection\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.AcroForm\">\r\n            Gets the AcroForm object.\r\n            @return the PdfAcroform object of the PdfDocument\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.nextPageSize\">\r\n            This is the size of the next page. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.thisBoxSize\">\r\n            This is the size of the several boxes of the current Page. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.boxSize\">\r\n            This is the size of the several boxes that will be used in\r\n            the next page. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.GetBoxSize(System.String)\">\r\n            Gives the size of a trim, art, crop or bleed box, or null if not defined.\r\n            @param boxName crop, trim, art or bleed\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.pageEmpty\">\r\n            This checks if the page is empty. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.Duration\">\r\n            Sets the display duration for the page (for presentations)\r\n            @param seconds   the number of seconds to display the page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.Transition\">\r\n            Sets the transition for the page\r\n            @param transition   the PdfTransition object\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.pageResources\">\r\n            This are the page resources of the current Page. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.strictImageSequence\">\r\n            Holds value of property strictImageSequence. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDocument.StrictImageSequence\">\r\n            Setter for property strictImageSequence.\r\n             @param strictImageSequence New value of property strictImageSequence.\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.imageEnd\">\r\n            This is the position where the image ends. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.ClearTextWrap\">\r\n            Method added by Pelikan Stephan\r\n            @see com.lowagie.text.DocListener#clearTextWrap()\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDocument.imageWait\">\r\n            This is the image that could not be shown on a previous page. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.Add(iTextSharp.text.Image)\">\r\n            Adds an image to the document.\r\n            @param image the <CODE>Image</CODE> to add\r\n            @throws PdfException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDocument.AddPTable(iTextSharp.text.pdf.PdfPTable)\">\r\n            Adds a <CODE>PdfPTable</CODE> to the document.\r\n            @param ptable the <CODE>PdfPTable</CODE> to be added to the document.\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfDocument.Destination\">\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfEFStream\">\r\n            Extends PdfStream and should be used to create Streams for Embedded Files\r\n            (file attachments).\r\n            @since\t2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEFStream.#ctor(System.IO.Stream,iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a Stream object using an InputStream and a PdfWriter object\r\n            @param\tin\tthe InputStream that will be read to get the Stream object\r\n            @param\twriter\tthe writer to which the stream will be added\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEFStream.#ctor(System.Byte[])\">\r\n            Creates a Stream object using a byte array\r\n            @param\tfileStore\tthe bytes for the stream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEFStream.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n            @see com.lowagie.text.pdf.PdfDictionary#toPdf(com.lowagie.text.pdf.PdfWriter, java.io.OutputStream)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfEncodings\">\r\n            Supports fast encodings for winansi and PDFDocEncoding.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfEncodings.ConvertToBytes(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfEncodings.ConvertToBytes(System.Char,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncodings.IsPdfDocEncoding(System.String)\">\r\n            Checks is <CODE>text</CODE> only has PdfDocEncoding characters.\r\n            @param text the <CODE>String</CODE> to test\r\n            @return <CODE>true</CODE> if only PdfDocEncoding characters are present\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncodings.AddExtraEncoding(System.String,iTextSharp.text.pdf.IExtraEncoding)\">\r\n            Adds an extra encoding.\r\n            @param name the name of the encoding. The encoding recognition is case insensitive\r\n            @param enc the conversion class\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfEncryption\">\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.key\">\r\n            The encryption key for a particular object/generation \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.keySize\">\r\n            The encryption key length for a particular object/generation \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.mkey\">\r\n            The global encryption key \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.extra\">\r\n            Work area to prepare the object/generation bytes \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.md5\">\r\n            The message digest algorithm MD5 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.ownerKey\">\r\n            The encryption key for the owner \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.userKey\">\r\n            The encryption key for the user \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.publicKeyHandler\">\r\n            The public key security handler for certificate encryption \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.keyLength\">\r\n            The generic key length. It may be 40 or 128. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfEncryption.embeddedFilesOnly\">\r\n            Indicates if the encryption is only necessary for embedded files.\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.IsEmbeddedFilesOnly\">\r\n            Indicates if only the embedded files have to be encrypted.\r\n            @return  if true only the embedded files will be encrypted\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.ComputeOwnerKey(System.Byte[],System.Byte[])\">\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.SetupGlobalEncryptionKey(System.Byte[],System.Byte[],System.Byte[],System.Int64)\">\r\n            \r\n             ownerKey, documentID must be setuped\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.SetupUserKey\">\r\n            \r\n             mkey must be setuped\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.SetupByUserPad(System.Byte[],System.Byte[],System.Byte[],System.Int64)\">\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.SetupByOwnerPassword(System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Int64)\">\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryption.ComputeUserPassword(System.Byte[])\">\r\n             Computes user password if standard encryption handler is used with Standard40, Standard128 or AES128 algorithm (Revision 2 - 4).\r\n            \r\n             @param ownerPassword owner password of the encrypted document.\r\n             @return user password, or null if revision 5 (AES256) or greater of standard encryption handler was used.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfEncryptor\">\r\n            This class takes any PDF and returns exactly the same but\r\n            encrypted. All the content, links, outlines, etc, are kept.\r\n            It is also possible to change the info dictionary.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.Encrypt(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Byte[],System.Byte[],System.Int32,System.Boolean)\">\r\n            Entry point to encrypt a PDF document. The encryption parameters are the same as in\r\n            <code>PdfWriter</code>. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @throws DocumentException on error\r\n            @throws IOException on error \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.Encrypt(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Byte[],System.Byte[],System.Int32,System.Boolean,System.Collections.Generic.Dictionary{System.String,System.String})\">\r\n            Entry point to encrypt a PDF document. The encryption parameters are the same as in\r\n            <code>PdfWriter</code>. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @param newInfo an optional <CODE>String</CODE> map to add or change\r\n            the info dictionary. Entries with <CODE>null</CODE>\r\n            values delete the key in the original info dictionary\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.Encrypt(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Boolean,System.String,System.String,System.Int32)\">\r\n            Entry point to encrypt a PDF document. The encryption parameters are the same as in\r\n            <code>PdfWriter</code>. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException on error\r\n            @throws IOException on error \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.Encrypt(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Boolean,System.String,System.String,System.Int32,System.Collections.Generic.Dictionary{System.String,System.String})\">\r\n            Entry point to encrypt a PDF document. The encryption parameters are the same as in\r\n            <code>PdfWriter</code>. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param newInfo an optional <CODE>String</CODE> map to add or change\r\n            the info dictionary. Entries with <CODE>null</CODE>\r\n            values delete the key in the original info dictionary\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.Encrypt(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Int32,System.String,System.String,System.Int32,System.Collections.Generic.Dictionary{System.String,System.String})\">\r\n            Entry point to encrypt a PDF document. The encryption parameters are the same as in\r\n            <code>PdfWriter</code>. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param type the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param newInfo an optional <CODE>String</CODE> map to add or change\r\n            the info dictionary. Entries with <CODE>null</CODE>\r\n            values delete the key in the original info dictionary\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.Encrypt(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Int32,System.String,System.String,System.Int32)\">\r\n            Entry point to encrypt a PDF document. The encryption parameters are the same as in\r\n            <code>PdfWriter</code>. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param type the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            values delete the key in the original info dictionary\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.GetPermissionsVerbose(System.Int32)\">\r\n            Give you a verbose analysis of the permissions.\r\n            @param permissions the permissions value of a PDF file\r\n            @return a String that explains the meaning of the permissions value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsPrintingAllowed(System.Int32)\">\r\n             Tells you if printing is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if printing is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsModifyContentsAllowed(System.Int32)\">\r\n             Tells you if modifying content is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if modifying content is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsCopyAllowed(System.Int32)\">\r\n             Tells you if copying is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if copying is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsModifyAnnotationsAllowed(System.Int32)\">\r\n             Tells you if modifying annotations is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if modifying annotations is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsFillInAllowed(System.Int32)\">\r\n             Tells you if filling in fields is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if filling in fields is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsScreenReadersAllowed(System.Int32)\">\r\n             Tells you if repurposing for screenreaders is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if repurposing for screenreaders is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsAssemblyAllowed(System.Int32)\">\r\n             Tells you if document assembly is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if document assembly is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfEncryptor.IsDegradedPrintingAllowed(System.Int32)\">\r\n             Tells you if degraded printing is allowed.\r\n             @param permissions the permissions value of a PDF file\r\n             @return  true if degraded printing is allowed\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfException\">\r\n             Signals that an unspecified problem while constructing a PDF document.\r\n            \r\n             @see        BadPdfFormatException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfFileSpecification\">\r\n            Specifies a file or an URL. The file can be extern or embedded.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.#ctor\">\r\n            Creates a new instance of PdfFileSpecification. The static methods are preferred. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.Url(iTextSharp.text.pdf.PdfWriter,System.String)\">\r\n            Creates a file specification of type URL.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param url the URL\r\n            @return the file specification\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.FileEmbedded(iTextSharp.text.pdf.PdfWriter,System.String,System.String,System.Byte[])\">\r\n            Creates a file specification with the file embedded. The file may\r\n            come from the file system or from a byte array. The data is flate compressed.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param filePath the file path\r\n            @param fileDisplay the file information that is presented to the user\r\n            @param fileStore the byte array with the file. If it is not <CODE>null</CODE>\r\n            it takes precedence over <CODE>filePath</CODE>\r\n            @throws IOException on error\r\n            @return the file specification\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.FileEmbedded(iTextSharp.text.pdf.PdfWriter,System.String,System.String,System.Byte[],System.Int32)\">\r\n            Creates a file specification with the file embedded. The file may\r\n            come from the file system or from a byte array. The data is flate compressed.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param filePath the file path\r\n            @param fileDisplay the file information that is presented to the user\r\n            @param fileStore the byte array with the file. If it is not <CODE>null</CODE>\r\n            it takes precedence over <CODE>filePath</CODE>\r\n            @param compressionLevel   the compression level to be used for compressing the file\r\n            it takes precedence over <CODE>filePath</CODE>\r\n            @throws IOException on error\r\n            @return the file specification\r\n            @since    2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.FileEmbedded(iTextSharp.text.pdf.PdfWriter,System.String,System.String,System.Byte[],System.Boolean)\">\r\n            Creates a file specification with the file embedded. The file may\r\n            come from the file system or from a byte array.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param filePath the file path\r\n            @param fileDisplay the file information that is presented to the user\r\n            @param fileStore the byte array with the file. If it is not <CODE>null</CODE>\r\n            it takes precedence over <CODE>filePath</CODE>\r\n            @param compress sets the compression on the data. Multimedia content will benefit little\r\n            from compression\r\n            @throws IOException on error\r\n            @return the file specification\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.FileEmbedded(iTextSharp.text.pdf.PdfWriter,System.String,System.String,System.Byte[],System.Boolean,System.String,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Creates a file specification with the file embedded. The file may\r\n            come from the file system or from a byte array.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param filePath the file path\r\n            @param fileDisplay the file information that is presented to the user\r\n            @param fileStore the byte array with the file. If it is not <CODE>null</CODE>\r\n            it takes precedence over <CODE>filePath</CODE>\r\n            @param compress sets the compression on the data. Multimedia content will benefit little\r\n            from compression\r\n            @param mimeType the optional mimeType\r\n            @param fileParameter the optional extra file parameters such as the creation or modification date\r\n            @throws IOException on error\r\n            @return the file specification\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.FileEmbedded(iTextSharp.text.pdf.PdfWriter,System.String,System.String,System.Byte[],System.String,iTextSharp.text.pdf.PdfDictionary,System.Int32)\">\r\n            Creates a file specification with the file embedded. The file may\r\n            come from the file system or from a byte array.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param filePath the file path\r\n            @param fileDisplay the file information that is presented to the user\r\n            @param fileStore the byte array with the file. If it is not <CODE>null</CODE>\r\n            it takes precedence over <CODE>filePath</CODE>\r\n            @param mimeType the optional mimeType\r\n            @param fileParameter the optional extra file parameters such as the creation or modification date\r\n            @param compressionLevel the level of compression\r\n            @throws IOException on error\r\n            @return the file specification\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.FileExtern(iTextSharp.text.pdf.PdfWriter,System.String)\">\r\n            Creates a file specification for an external file.\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @param filePath the file path\r\n            @return the file specification\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfFileSpecification.Reference\">\r\n            Gets the indirect reference to this file specification.\r\n            Multiple invocations will retrieve the same value.\r\n            @throws IOException on error\r\n            @return the indirect reference\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfFileSpecification.MultiByteFileName\">\r\n            Sets the file name (the key /F) string as an hex representation\r\n            to support multi byte file names. The name must have the slash and\r\n            backslash escaped according to the file specification rules\r\n            @param fileName the file name as a byte array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.SetUnicodeFileName(System.String,System.Boolean)\">\r\n            Adds the unicode file name (the key /UF). This entry was introduced\r\n            in PDF 1.7. The filename must have the slash and backslash escaped\r\n            according to the file specification rules.\r\n            @param filename  the filename\r\n            @param unicode   if true, the filename is UTF-16BE encoded; otherwise PDFDocEncoding is used;\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfFileSpecification.Volatile\">\r\n            Sets a flag that indicates whether an external file referenced by the file\r\n            specification is volatile. If the value is true, applications should never\r\n            cache a copy of the file.\r\n            @param volatile_file if true, the external file should not be cached\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.AddDescription(System.String,System.Boolean)\">\r\n            Adds a description for the file that is specified here.\r\n            @param description   some text\r\n            @param unicode       if true, the text is added as a unicode string\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFileSpecification.AddCollectionItem(iTextSharp.text.pdf.collection.PdfCollectionItem)\">\r\n            Adds the Collection item dictionary.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfFont”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFont.font\">\r\n            the font metrics. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFont.size\">\r\n            the size. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFont.CompareTo(iTextSharp.text.pdf.PdfFont)\">\r\n             Compares this <CODE>PdfFont</CODE> with another\r\n            \r\n             @param    object    the other <CODE>PdfFont</CODE>\r\n             @return    a value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfFont.Size\">\r\n             Returns the size of this font.\r\n            \r\n             @return        a size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFont.Width\">\r\n             Returns the approximative width of 1 character of this font.\r\n            \r\n             @return        a width in Text Space\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFont.Width(System.Int32)\">\r\n             Returns the width of a certain character of this font.\r\n            \r\n             @param        character    a certain character\r\n             @return        a width in Text Space\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfFormField\">\r\n            Implements form fields.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFormField.FF_RICHTEXT\">\r\n            Allows text fields to support rich text.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFormField.parent\">\r\n            Holds value of property parent. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFormField.#ctor(iTextSharp.text.pdf.PdfWriter,System.Single,System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfAction)\">\r\n            Constructs a new <CODE>PdfAnnotation</CODE> of subtype link (Action).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFormField.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates new PdfFormField \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfFormField.Parent\">\r\n            Getter for property parent.\r\n            @return Value of property parent.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfFormField.RichValue\">\r\n            Sets the rich value for this field.  \r\n            It is suggested that the regular value of this field be set to an \r\n            equivalent value.  Rich text values are only supported since PDF 1.5,\r\n            and require that the FF_RV flag be set.  See PDF Reference chapter \r\n            12.7.3.4 for details.\r\n            @param rv HTML markup for the rich value of this field\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfFormXObject\">\r\n            <CODE>PdfFormObject</CODE> is a type of XObject containing a template-object.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFormXObject.ZERO\">\r\n            This is a PdfNumber representing 0. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFormXObject.ONE\">\r\n            This is a PdfNumber representing 1. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfFormXObject.MATRIX\">\r\n            This is the 1 - matrix. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFormXObject.#ctor(iTextSharp.text.pdf.PdfTemplate,System.Int32)\">\r\n             Constructs a <CODE>PdfFormXObject</CODE>-object.\r\n            \r\n             @param        template        the template\r\n             @param   compressionLevel    the compression level for the stream\r\n             @since   2.1.3 (Replacing the existing constructor with param compressionLevel)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfFunction\">\r\n            Implements PDF functions.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfFunction.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates new PdfFunction \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfGState\">\r\n            The graphic state dictionary.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_NORMAL\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_COMPATIBLE\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_MULTIPLY\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_SCREEN\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_OVERLAY\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_DARKEN\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_LIGHTEN\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_COLORDODGE\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_COLORBURN\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_HARDLIGHT\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_SOFTLIGHT\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_DIFFERENCE\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfGState.BM_EXCLUSION\">\r\n            A possible blend mode \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.OverPrintStroking\">\r\n            Sets the flag whether to apply overprint for stroking.\r\n            @param ov\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.OverPrintNonStroking\">\r\n            Sets the flag whether to apply overprint for non stroking painting operations.\r\n            @param ov\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.OverPrintMode\">\r\n            Sets the flag whether to toggle knockout behavior for overprinted objects.\r\n            @param ov - accepts 0 or 1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.StrokeOpacity\">\r\n            Sets the current stroking alpha constant, specifying the constant shape or\r\n            constant opacity value to be used for stroking operations in the transparent\r\n            imaging model.\r\n            @param n\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.FillOpacity\">\r\n            Sets the current stroking alpha constant, specifying the constant shape or\r\n            constant opacity value to be used for nonstroking operations in the transparent\r\n            imaging model.\r\n            @param n\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.AlphaIsShape\">\r\n            The alpha source flag specifying whether the current soft mask\r\n            and alpha constant are to be interpreted as shape values (true)\r\n            or opacity values (false). \r\n            @param v\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.TextKnockout\">\r\n            Determines the behaviour of overlapping glyphs within a text object\r\n            in the transparent imaging model.\r\n            @param v\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.BlendMode\">\r\n            The current blend mode to be used in the transparent imaging model.\r\n            @param bm\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfGState.RenderingIntent\">\r\n            Set the rendering intent, possible values are: PdfName.ABSOLUTECOLORIMETRIC,\r\n            PdfName.RELATIVECOLORIMETRIC, PdfName.SATURATION, PdfName.PERCEPTUAL.\r\n            @param ri\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfICCBased\">\r\n             A <CODE>PdfICCBased</CODE> defines a ColorSpace\r\n            \r\n             @see        PdfStream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfICCBased.#ctor(iTextSharp.text.pdf.ICC_Profile)\">\r\n            Creates an ICC stream.\r\n            @param   profile an ICC profile\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfICCBased.#ctor(iTextSharp.text.pdf.ICC_Profile,System.Int32)\">\r\n             Creates an ICC stream.\r\n            \r\n             @param   compressionLevel    the compressionLevel\r\n            \r\n             @param   profile an ICC profile\r\n             @since   2.1.3   (replacing the constructor without param compressionLevel)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfImage\">\r\n            <CODE>PdfImage</CODE> is a <CODE>PdfStream</CODE> containing an image-<CODE>Dictionary</CODE> and -stream.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfImage.name\">\r\n            This is the <CODE>PdfName</CODE> of the image. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImage.#ctor(iTextSharp.text.Image,System.String,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n             Constructs a <CODE>PdfImage</CODE>-object.\r\n            \r\n             @param image the <CODE>Image</CODE>-object\r\n             @param name the <CODE>PdfName</CODE> for this image\r\n             @throws BadPdfFormatException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfImage.Name\">\r\n             Returns the <CODE>PdfName</CODE> of the image.\r\n            \r\n             @return        the name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImage.GenerateImgResName(iTextSharp.text.Image)\">\r\n            Called when no resource name is provided in our constructor.  This generates a \r\n            name that is required to be unique within a given resource dictionary.\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfImportedPage\">\r\n            Represents an imported page.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfImportedPage.toCopy\">\r\n            True if the imported page has been copied to a writer.\r\n            @since iText 5.0.4\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfImportedPage.FromReader\">\r\n            Reads the content from this <CODE>PdfImportedPage</CODE>-object from a reader.\r\n            \r\n             @return self\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImportedPage.AddImage(iTextSharp.text.Image,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Always throws an error. This operation is not allowed.\r\n            @param image dummy\r\n            @param a dummy\r\n            @param b dummy\r\n            @param c dummy\r\n            @param d dummy\r\n            @param e dummy\r\n            @param f dummy\r\n            @throws DocumentException  dummy \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImportedPage.AddTemplate(iTextSharp.text.pdf.PdfTemplate,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Always throws an error. This operation is not allowed.\r\n            @param template dummy\r\n            @param a dummy\r\n            @param b dummy\r\n            @param c dummy\r\n            @param d dummy\r\n            @param e dummy\r\n            @param f  dummy \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfImportedPage.Duplicate\">\r\n            Always throws an error. This operation is not allowed.\r\n            @return  dummy \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImportedPage.GetFormXObject(System.Int32)\">\r\n             Gets the stream representing this page.\r\n            \r\n             @param   compressionLevel    the compressionLevel\r\n             @return the stream representing this page\r\n             @since   2.1.3   (replacing the method without param compressionLevel)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImportedPage.SetFontAndSize(iTextSharp.text.pdf.BaseFont,System.Single)\">\r\n            Always throws an error. This operation is not allowed.\r\n            @param bf dummy\r\n            @param size dummy \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImportedPage.IsToCopy\">\r\n            Checks if the page has to be copied.\r\n            @return true if the page has to be copied.\r\n            @since iText 5.0.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfImportedPage.SetCopied\">\r\n            Indicate that the resources of the imported page have been copied.\r\n            @since iText 5.0.4\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfIndirectObject”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfIndirectObject.number\">\r\n            The object number \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfIndirectObject.generation\">\r\n            the generation number \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIndirectObject.#ctor(System.Int32,iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfWriter)\">\r\n             Constructs a <CODE>PdfIndirectObject</CODE>.\r\n            \r\n             @param        number            the objecti number\r\n             @param        objecti            the direct objecti\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIndirectObject.#ctor(System.Int32,System.Int32,iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfWriter)\">\r\n             Constructs a <CODE>PdfIndirectObject</CODE>.\r\n            \r\n             @param        number            the objecti number\r\n             @param        generation        the generation number\r\n             @param        objecti            the direct objecti\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfIndirectObject.IndirectReference\">\r\n             Returns a <CODE>PdfIndirectReference</CODE> to this <CODE>PdfIndirectObject</CODE>.\r\n            \r\n             @return        a <CODE>PdfIndirectReference</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIndirectObject.WriteTo(System.IO.Stream)\">\r\n             Writes eficiently to a stream\r\n            \r\n             @param os the stream to write to\r\n             @throws IOException on write error\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfIndirectReference”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfIndirectReference.number\">\r\n            the object number \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfIndirectReference.generation\">\r\n            the generation number \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIndirectReference.#ctor(System.Int32,System.Int32,System.Int32)\">\r\n             Constructs a <CODE>PdfIndirectReference</CODE>.\r\n            \r\n             @param        type            the type of the <CODE>PdfObject</CODE> that is referenced to\r\n             @param        number            the object number.\r\n             @param        generation        the generation number.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIndirectReference.#ctor(System.Int32,System.Int32)\">\r\n             Constructs a <CODE>PdfIndirectReference</CODE>.\r\n            \r\n             @param        type            the type of the <CODE>PdfObject</CODE> that is referenced to\r\n             @param        number            the object number.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfIndirectReference.Number\">\r\n             Returns the number of the object.\r\n            \r\n             @return        a number.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfIndirectReference.Generation\">\r\n             Returns the generation of the object.\r\n            \r\n             @return        a number.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfLayer\">\r\n             An optional content group is a dictionary representing a collection of graphics\r\n             that can be made visible or invisible dynamically by users of viewer applications.\r\n             In iText they are referenced as layers.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLayer.on\">\r\n            Holds value of property on.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLayer.onPanel\">\r\n            Holds value of property onPanel.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.CreateTitle(System.String,iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a title layer. A title layer is not really a layer but a collection of layers\r\n            under the same title heading.\r\n            @param title the title text\r\n            @param writer the <CODE>PdfWriter</CODE>\r\n            @return the title layer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.#ctor(System.String,iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a new layer.\r\n            @param name the name of the layer\r\n            @param writer the writer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.AddChild(iTextSharp.text.pdf.PdfLayer)\">\r\n            Adds a child layer. Nested layers can only have one parent.\r\n            @param child the child layer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.Parent\">\r\n            Gets the parent layer.\r\n            @return the parent layer or <CODE>null</CODE> if the layer has no parent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.Children\">\r\n            Gets the children layers.\r\n            @return the children layers or <CODE>null</CODE> if the layer has no children\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.Ref\">\r\n            Gets the <CODE>PdfIndirectReference</CODE> that represents this layer.\r\n            @return the <CODE>PdfIndirectReference</CODE> that represents this layer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.Name\">\r\n            Sets the name of this layer.\r\n            @param name the name of this layer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.PdfObject\">\r\n            Gets the dictionary representing the layer. It just returns <CODE>this</CODE>.\r\n            @return the dictionary representing the layer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.On\">\r\n            Gets the initial visibility of the layer.\r\n            @return the initial visibility of the layer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.SetCreatorInfo(System.String,System.String)\">\r\n            Used by the creating application to store application-specific\r\n            data associated with this optional content group.\r\n            @param creator a text string specifying the application that created the group\r\n            @param subtype a string defining the type of content controlled by the group. Suggested\r\n            values include but are not limited to <B>Artwork</B>, for graphic-design or publishing\r\n            applications, and <B>Technical</B>, for technical designs such as building plans or\r\n            schematics\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.SetLanguage(System.String,System.Boolean)\">\r\n            Specifies the language of the content controlled by this\r\n            optional content group\r\n            @param lang a language string which specifies a language and possibly a locale\r\n            (for example, <B>es-MX</B> represents Mexican Spanish)\r\n            @param preferred used by viewer applications when there is a partial match but no exact\r\n            match between the system language and the language strings in all usage dictionaries\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.Export\">\r\n            Specifies the recommended state for content in this\r\n            group when the document (or part of it) is saved by a viewer application to a format\r\n            that does not support optional content (for example, an earlier version of\r\n            PDF or a raster image format).\r\n            @param export the export state\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.SetZoom(System.Single,System.Single)\">\r\n            Specifies a range of magnifications at which the content\r\n            in this optional content group is best viewed.\r\n            @param min the minimum recommended magnification factors at which the group\r\n            should be ON. A negative value will set the default to 0\r\n            @param max the maximum recommended magnification factor at which the group\r\n            should be ON. A negative value will set the largest possible magnification supported by the\r\n            viewer application\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.SetPrint(System.String,System.Boolean)\">\r\n            Specifies that the content in this group is intended for\r\n            use in printing\r\n            @param subtype a name specifying the kind of content controlled by the group;\r\n            for example, <B>Trapping</B>, <B>PrintersMarks</B> and <B>Watermark</B>\r\n            @param printstate indicates that the group should be\r\n            set to that state when the document is printed from a viewer application\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.View\">\r\n            Indicates that the group should be set to that state when the\r\n            document is opened in a viewer application.\r\n            @param view the view state\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.PageElement\">\r\n            Indicates that the group contains a pagination artifact.\r\n            @param pe one of the following names: \"HF\" (Header Footer),\r\n            \"FG\" (Foreground), \"BG\" (Background), or \"L\" (Logo).\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayer.SetUser(System.String,System.String[])\">\r\n            One of more users for whom this optional content group is primarily intended.\r\n            @param type should be \"Ind\" (Individual), \"Ttl\" (Title), or \"Org\" (Organization).\r\n            @param names one or more names\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayer.OnPanel\">\r\n            Gets the layer visibility in Acrobat's layer panel\r\n            @return the layer visibility in Acrobat's layer panel\r\n            Sets the visibility of the layer in Acrobat's layer panel. If <CODE>false</CODE>\r\n            the layer cannot be directly manipulated by the user. Note that any children layers will\r\n            also be absent from the panel.\r\n            @param onPanel the visibility of the layer in Acrobat's layer panel\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfLayerMembership\">\r\n             Content typically belongs to a single optional content group,\r\n             and is visible when the group is <B>ON</B> and invisible when it is <B>OFF</B>. To express more\r\n             complex visibility policies, content should not declare itself to belong to an optional\r\n             content group directly, but rather to an optional content membership dictionary\r\n             represented by this class.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLayerMembership.ALLON\">\r\n            Visible only if all of the entries are <B>ON</B>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLayerMembership.ANYON\">\r\n            Visible if any of the entries are <B>ON</B>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLayerMembership.ANYOFF\">\r\n            Visible if any of the entries are <B>OFF</B>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLayerMembership.ALLOFF\">\r\n            Visible only if all of the entries are <B>OFF</B>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayerMembership.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a new, empty, membership layer.\r\n            @param writer the writer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayerMembership.Ref\">\r\n            Gets the <CODE>PdfIndirectReference</CODE> that represents this membership layer.\r\n            @return the <CODE>PdfIndirectReference</CODE> that represents this layer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLayerMembership.AddMember(iTextSharp.text.pdf.PdfLayer)\">\r\n            Adds a new member to the layer.\r\n            @param layer the new member to the layer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayerMembership.Layers\">\r\n            Gets the member layers.\r\n            @return the member layers\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayerMembership.VisibilityPolicy\">\r\n            Sets the visibility policy for content belonging to this\r\n            membership dictionary. Possible values are ALLON, ANYON, ANYOFF and ALLOFF.\r\n            The default value is ANYON.\r\n            @param type the visibility policy\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayerMembership.VisibilityExpression\">\r\n            Sets the visibility expression for content belonging to this\r\n            membership dictionary.\r\n            @param ve A (nested) array of which the first value is /And, /Or, or /Not\r\n            followed by a series of indirect references to OCGs or other visibility\r\n            expressions.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLayerMembership.PdfObject\">\r\n            Gets the dictionary representing the membership layer. It just returns <CODE>this</CODE>.\r\n            @return the dictionary representing the layer\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfLine\">\r\n            <CODE>PdfLine</CODE> defines an array with <CODE>PdfChunk</CODE>-objects\r\n            that fit into 1 line.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.line\">\r\n            The arraylist containing the chunks. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.left\">\r\n            The left indentation of the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.width\">\r\n            The width of the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.alignment\">\r\n            The alignment of the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.height\">\r\n            The heigth of the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.newlineSplit\">\r\n            <CODE>true</CODE> if the chunk splitting was caused by a newline. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfLine.originalWidth\">\r\n            The original width. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.#ctor(System.Single,System.Single,System.Int32,System.Single)\">\r\n             Constructs a new <CODE>PdfLine</CODE>-object.\r\n            \r\n             @param    left        the limit of the line at the left\r\n             @param    right        the limit of the line at the right\r\n             @param    alignment    the alignment of the line\r\n             @param    height        the height of the line\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.#ctor(System.Single,System.Single,System.Single,System.Int32,System.Boolean,System.Collections.Generic.List{iTextSharp.text.pdf.PdfChunk},System.Boolean)\">\r\n            Creates a PdfLine object.\r\n            @param left              the left offset\r\n            @param originalWidth     the original width of the line\r\n            @param remainingWidth    bigger than 0 if the line isn't completely filled\r\n            @param alignment         the alignment of the line\r\n            @param newlineSplit      was the line splitted (or does the paragraph end with this line)\r\n            @param line              an array of PdfChunk objects\r\n            @param isRTL             do you have to read the line from Right to Left?\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.Add(iTextSharp.text.pdf.PdfChunk,System.Single)\">\r\n             Adds a <CODE>PdfChunk</CODE> to the <CODE>PdfLine</CODE>.\r\n            \r\n             @param\t\tchunk\t\t        the <CODE>PdfChunk</CODE> to add\r\n             @param\t\tcurrentLeading\t\tnew value for the height of the line\r\n             @return\t\t<CODE>null</CODE> if the chunk could be added completely; if not\r\n            \t\t\t\ta <CODE>PdfChunk</CODE> containing the part of the chunk that could\r\n            \t\t\t\tnot be added is returned\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.Add(iTextSharp.text.pdf.PdfChunk)\">\r\n             Adds a <CODE>PdfChunk</CODE> to the <CODE>PdfLine</CODE>.\r\n            \r\n             @param        chunk        the <CODE>PdfChunk</CODE> to add\r\n             @return        <CODE>null</CODE> if the chunk could be added completely; if not\r\n                            a <CODE>PdfChunk</CODE> containing the part of the chunk that could\r\n                            not be added is returned\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.Size\">\r\n             Returns the number of chunks in the line.\r\n            \r\n             @return    a value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.GetEnumerator\">\r\n             Returns an iterator of <CODE>PdfChunk</CODE>s.\r\n            \r\n             @return    an <CODE>Iterator</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.Height\">\r\n             Returns the height of the line.\r\n            \r\n             @return    a value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.IndentLeft\">\r\n             Returns the left indentation of the line taking the alignment of the line into account.\r\n            \r\n             @return    a value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.HasToBeJustified\">\r\n             Checks if this line has to be justified.\r\n            \r\n             @return    <CODE>true</CODE> if the alignment equals <VAR>ALIGN_JUSTIFIED</VAR> and there is some width left.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfLine.ResetAlignment”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.SetExtraIndent(System.Single)\">\r\n            Adds extra indentation to the left (for Paragraph.setFirstLineIndent). \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.WidthLeft\">\r\n             Returns the width that is left, after a maximum of characters is added to the line.\r\n            \r\n             @return    a value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.NumberOfSpaces\">\r\n             Returns the number of space-characters in this line.\r\n            \r\n             @return    a value\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.PdfLine.ListItem”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.ListSymbol\">\r\n             Returns the listsymbol of this line.\r\n            \r\n             @return    a <CODE>PdfChunk</CODE> if the line has a listsymbol; <CODE>null</CODE> otherwise\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.ListIndent\">\r\n             Return the indentation needed to show the listsymbol.\r\n            \r\n             @return    a value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.ToString\">\r\n             Get the string representation of what is in this line.\r\n            \r\n             @return    a <CODE>string</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.NewlineSplit\">\r\n            Checks if a newline caused the line split.\r\n            @return <CODE>true</CODE> if a newline caused the line split\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.LastStrokeChunk\">\r\n            Gets the index of the last <CODE>PdfChunk</CODE> with metric attributes\r\n            @return the last <CODE>PdfChunk</CODE> with metric attributes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.GetChunk(System.Int32)\">\r\n            Gets a <CODE>PdfChunk</CODE> by index.\r\n            @param idx the index\r\n            @return the <CODE>PdfChunk</CODE> or null if beyond the array\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.OriginalWidth\">\r\n            Gets the original width of the line.\r\n            @return the original width of the line\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.GetMaxSize(System.Single,System.Single)\">\r\n            Gets the difference between the \"normal\" leading and the maximum\r\n            size (for instance when there are images in the chunk and the leading\r\n            has to be taken into account).\r\n            @return  an extra leading for images\r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfLine.GetSeparatorCount\">\r\n            Gets the number of separators in the line.\r\n            Returns -1 if there's a tab in the line.\r\n            @return  the number of separators in the line\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.Ascender\">\r\n            Gets the maximum size of the ascender for all the fonts used\r\n            in this line.\r\n            @return maximum size of all the ascenders used in this line\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfLine.Descender\">\r\n            Gets the biggest descender for all the fonts used \r\n            in this line.  Note that this is a negative number.\r\n            @return maximum size of all the ascenders used in this line\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfLiteral\">\r\n            a Literal\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfName”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName._3D\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.A\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.A85\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ABSOLUTECOLORIMETRIC\">\r\n            A name\r\n            @since 2.1.5 renamed from ABSOLUTECALORIMETRIC\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ACROFORM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ACTION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ACTIVATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADBE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ACTUALTEXT\">\r\n            a name used in PDF structure\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADBE_PKCS7_DETACHED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADBE_PKCS7_S4\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADBE_PKCS7_S5\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADBE_PKCS7_SHA1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADBE_X509_RSA_SHA1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADOBE_PPKLITE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ADOBE_PPKMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AESV2\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AESV3\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AFRELATIONSHIP\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AHX\">\r\n            A name\r\n            @since 5.0.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AIS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ALL\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ALLPAGES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ALT\">\r\n            Use ALT to specify alternate texts in Tagged PDF.\r\n            For alternate ICC profiles, use {@link #ALTERNATE}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ALTERNATE\">\r\n            Use ALTERNATE only in ICC profiles. It specifies an alternative color\r\n            space, in case the primary one is not supported, for legacy purposes.\r\n            For various types of alternate texts in Tagged PDF, use {@link #ALT}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AF\">\r\n            A name\r\n            @since 5.5.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ALTERNATEPRESENTATION\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ALTERNATES\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ANIMATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ANNOT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ANNOTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ANTIALIAS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.APP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.APPDEFAULT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ART\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ARTBOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ARTIFACT\">\r\n            A name\r\n            @since 5.4.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ASCENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ASCII85DECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ASCIIHEXDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ASSET\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ASSETS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ATTACHED\">\r\n            A name\r\n            @since 5.4.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AUTHEVENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.AUTHOR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.B\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BACKGROUND\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BACKGROUNDCOLOR\">\r\n            A name\r\n            @since\t5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BASEENCODING\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BASEFONT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BASEVERSION\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BBOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BG\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BIBENTRY\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BIGFIVE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BINDING\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BINDINGMATERIALNAME\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BITSPERCOMPONENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BITSPERSAMPLE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BL\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BLACKIS1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BLACKPOINT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BLOCKQUOTE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BLEEDBOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BLINDS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BORDER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BOTH\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BOUNDS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BTN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.BYTERANGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.C\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.C0\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.C1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ca\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CALGRAY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CALRGB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CAPHEIGHT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CARET\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CAPTION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CATALOG\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CATEGORY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CB\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CCITTFAXDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CENTER\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CENTERWINDOW\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CERT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CFM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CH\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CHARPROCS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CHECKSUM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CIDFONTTYPE0\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CIDFONTTYPE2\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CIDSET\">\r\n            A name\r\n            @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CIDSYSTEMINFO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CIDTOGIDMAP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CIRCLE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CLASSMAP\">\r\n            A name\r\n            @since 5.3.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CLOUD\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CMD\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CODE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLOR\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLORS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLORSPACE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLORTRANSFORM\">\r\n            A name\r\n            @since 5.4.4 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLLECTION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLLECTIONFIELD\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLLECTIONITEM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLLECTIONSCHEMA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLLECTIONSORT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLLECTIONSUBITEM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLSPAN\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLUMN\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COLUMNS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONDITION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONFIGS\">\r\n            A name\r\n            @since 5.4.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONFIGURATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONFIGURATIONS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONTACTINFO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONTENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CONTENTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COORDS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COUNT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COURIER\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COURIER_BOLD\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COURIER_OBLIQUE\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.COURIER_BOLDOBLIQUE\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CREATIONDATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CREATOR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CREATORINFO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CROPBOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CRYPT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CUEPOINT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CUEPOINTS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.CYX\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.D\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DATA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DCS\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DCTDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DECIMAL\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEACTIVATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DECODEPARMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEFAULT\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEFAULTCRYPTFILTER\">\r\n            A name\r\n            @since\t2.1.5 renamed from DEFAULTCRYPTFILER\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEFAULTCMYK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEFAULTGRAY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEFAULTRGB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DESC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DESCENDANTFONTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DESCENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEST\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DESTOUTPUTPROFILE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DESTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEVICEGRAY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEVICERGB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEVICECMYK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DEVICEN\">\r\n            A name\r\n            @since 5.2.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DIFFERENCES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DISSOLVE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DIRECTION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DISPLAYDOCTITLE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DIV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DL\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DOS\">\r\n            A name\r\n            @since 5.2.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DOCMDP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DOCOPEN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DOCTIMESTAMP\">\r\n            A name\r\n            @since 5.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DOCUMENT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DOMAIN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DUR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DUPLEX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DUPLEXFLIPSHORTEDGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DUPLEXFLIPLONGEDGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.DW\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.E\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EARLYCHANGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EFF\">\r\n            A name\r\n            @since\t2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EFOPEN\">\r\n            A name\r\n            @since\t2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EMBEDDED\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EMBEDDEDFILE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EMBEDDEDFILES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENCODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENCODEDBYTEALIGN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENCODING\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENCRYPT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENCRYPTMETADATA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.END\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENDINDENT\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENDOFBLOCK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ENDOFLINE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EPSG\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ESIC\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXCLUDE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXTEND\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXTENSIONS\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXTENSIONLEVEL\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXTGSTATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXPORT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EXPORTSTATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.EVENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.F\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FAR\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FD\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FDECODEPARMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FDF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FFILTER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIELDMDP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIELDS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIGURE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FILEATTACHMENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FILESPEC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FILTER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIRST\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIRSTCHAR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIRSTPAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FIT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITH\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITBH\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITBV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FITWINDOW\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FL\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FLAGS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FLASH\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FLASHVARS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FLATEDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTBBOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTDESCRIPTOR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTFAMILY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTFILE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTFILE2\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTFILE3\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTMATRIX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTNAME\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FONTWEIGHT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FOREGROUND\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FORM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FORMTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FORMULA\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FREETEXT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FRM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FULLSCREEN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FUNCTION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FUNCTIONS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.FUNCTIONTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GAMMA\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GBK\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GCS\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GEO\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GEOGCS\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GLITTER\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GOTO\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GOTO3DVIEW\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GOTOE\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GOTOR\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GPTS\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GROUP\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GTS_PDFA1\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GTS_PDFX\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.GTS_PDFXVERSION\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H1\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H2\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H3\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H4\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H5\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.H6\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HALFTONENAME\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HALFTONETYPE\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HALIGN\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HEADERS\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HEIGHT\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HELV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HELVETICA\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HELVETICA_BOLD\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HELVETICA_OBLIQUE\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HELVETICA_BOLDOBLIQUE\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HID\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HIDE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HIDEMENUBAR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HIDETOOLBAR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HIDEWINDOWUI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HIGHLIGHT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HOFFSET\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HT\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.HTP\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.I\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IC\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ICCBASED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ID\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IDENTITY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IDTREE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IM\">\r\n            A name\r\n            @since 5.5.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IMAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IMAGEB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IMAGEC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IMAGEI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IMAGEMASK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INCLUDE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INDEX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INDEXED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INFO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INKLIST\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INSTANCES\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IMPORTDATA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INTENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.INTERPOLATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ISMAP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IRT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ITALICANGLE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ITXT\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.IX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.JAVASCRIPT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.JBIG2DECODE\">\r\n            A name\r\n            @since\t2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.JBIG2GLOBALS\">\r\n            A name\r\n            @since\t2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.JPXDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.JS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.JUSTIFY\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.K\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.KEYWORDS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.KIDS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.L\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.L2R\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LAB\">\r\n            A name\r\n            @since 5.1.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LANG\">\r\n            An entry specifying the natural language, and optionally locale. Use this\r\n            to specify the Language attribute on a Tagged Pdf element.\r\n            For the content usage dictionary, use {@link #LANGUAGE}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LANGUAGE\">\r\n            A dictionary type, strictly for use in the content usage dictionary. For\r\n            dictionary entries in Tagged Pdf, use {@link #LANG}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LAST\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LASTCHAR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LASTPAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LAUNCH\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LAYOUT\">\r\n            A name\r\n            @since 5.5.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LBL\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LBODY\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LENGTH\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LENGTH1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LI\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LIMITS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LINE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LINEAR\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LINEHEIGHT\">\r\n            A name\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LINK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LIST\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LISTMODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LISTNUMBERING\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LOCATION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LOCK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LOCKED\">\r\n            A name\r\n            @since\t2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LOWERALPHA\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LOWERROMAN\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LPTS\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.LZWDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.M\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MAC\">\r\n            A name\r\n            @since 5.2.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MATERIAL\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MATRIX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MAC_EXPERT_ENCODING\">\r\n            A name of an encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MAC_ROMAN_ENCODING\">\r\n            A name of an encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MARKED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MARKINFO\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MASK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MAX_LOWER_CASE\">\r\n            A name\r\n            @since\t2.1.6 renamed from MAX\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MAX_CAMEL_CASE\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MAXLEN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MEDIABOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MCID\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MCR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MEASURE\">\r\n            A name\r\n            @since   5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.METADATA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MIN_LOWER_CASE\">\r\n            A name\r\n            @since\t2.1.6 renamed from MIN\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MIN_CAMEL_CASE\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MMTYPE1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MODDATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.MOVIE\">\r\n            A name\r\n            @since\t5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.N\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.N0\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.N1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.N2\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.N3\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.N4\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NAME\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NAMED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NAMES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NAVIGATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NAVIGATIONPANE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NEAR\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NEEDAPPEARANCES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NEEDRENDERING\">\r\n            A name.\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NEWWINDOW\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NEXT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NEXTPAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NONE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NONFULLSCREENPAGEMODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NONSTRUCT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NOTE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NUMBERFORMAT\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NUMCOPIES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.NUMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.O\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OBJ\">\r\n            A name used with Document Structure\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OBJR\">\r\n            a name used with Document Structure\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OBJSTM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OCG\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OCGS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OCMD\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OCPROPERTIES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.Off_\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OFF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ON\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ONECOLUMN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OPEN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OPENACTION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.op_\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OPI\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OPM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OPT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ORDER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ORDERING\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OSCILLATING\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OUTLINES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OUTPUTCONDITION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OUTPUTCONDITIONIDENTIFIER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OUTPUTINTENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OUTPUTINTENTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.OVERLAYTEXT\">\r\n            A name\r\n            @since 5.5.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.P\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PAGELABELS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PAGELAYOUT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PAGEMODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PAGES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PAINTTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PANOSE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PARAMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PARENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PARENTTREE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PARENTTREENEXTKEY\">\r\n            A name used in defining Document Structure.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PART\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PASSCONTEXTCLICK\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PATTERN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PATTERNTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PB\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PC\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PDF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PDFDOCENCODING\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PDU\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PERCEPTUAL\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PERMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PG\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PI\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PICKTRAYBYPDFSIZE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PIECEINFO\">\r\n            A name\r\n            @since 5.5.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PLAYCOUNT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PO\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.POLYGON\">\r\n            A name\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.POLYLINE\">\r\n            A name\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.POPUP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.POSITION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PREDICTOR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PREFERRED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRESENTATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRESERVERB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRESSTEPS\">\r\n            A name.\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PREV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PREVPAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTAREA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTCLIP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTERMARK\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTFIELD\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTPAGERANGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTSCALING\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRINTSTATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRIVATE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PROCSET\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PRODUCER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PROJCS\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PROP_BUILD\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PROPERTIES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PTDATA\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PUBSEC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.PV\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.Q\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.QUADPOINTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.QUOTE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.R\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.R2L\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RANGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RB\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.rb\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RBGROUPS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RD\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.REASON\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RECIPIENTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RECT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.REDACT\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.REFERENCE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.REGISTRY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.REGISTRYNAME\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RELATIVECOLORIMETRIC\">\r\n            A name\r\n            @since\t2.1.5 renamed from RELATIVECALORIMETRIC\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RENDITION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.REPEAT\">\r\n            A name\r\n            @since 5.5.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RESETFORM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RESOURCES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIA\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAACTIVATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAANIMATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIACOMMAND\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIACONFIGURATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIACONTENT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIADEACTIVATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAEXECUTE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAINSTANCE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAPARAMS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAPOSITION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAPRESENTATION\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIASETTINGS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RICHMEDIAWINDOW\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RL\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROLE\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RO\">\r\n            A name\r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROLEMAP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROOT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROTATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROW\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROWS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ROWSPAN\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RP\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RT\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RUBY\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RUNLENGTHDECODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.RV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.S\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SATURATION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SCHEMA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SCOPE\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SCREEN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SCRIPTS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SECT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SEPARATION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SETOCGSTATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SETTINGS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SHADING\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SHADINGTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SHIFT_JIS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SIG\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SIGFIELDLOCK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SIGFLAGS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SIGREF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SIMPLEX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SINGLEPAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SIZE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SMASK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SORT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SOUND\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SPACEAFTER\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SPACEBEFORE\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SPAN\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SPEED\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SPLIT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SQUARE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SQUIGGLY\">\r\n            A name\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SS\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ST\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STAMP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STANDARD\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.START\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STARTINDENT\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STATUS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STDCF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STEMV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STMF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STRF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STRIKEOUT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STRUCTELEM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STRUCTPARENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STRUCTPARENTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STRUCTTREEROOT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.STYLE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SUBFILTER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SUBJECT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SUBMITFORM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SUBTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SUMMARY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SUPPLEMENT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SV\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SW\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.SYMBOL\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.T\">\r\n            T is very commonly used for various dictionary entries, including title\r\n            entries in a Tagged PDF element dictionary, and target dictionaries.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TA\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TABLE\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TABS\">\r\n            A name\r\n            @since\t2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TBODY\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TD\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TR\">\r\n            A name\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TR2\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TEXT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TEXTALIGN\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TEXTDECORATIONCOLOR\">\r\n            A name\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TEXTDECORATIONTHICKNESS\">\r\n            A name\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TEXTDECORATIONTYPE\">\r\n            A name\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TEXTINDENT\">\r\n            A name\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TFOOT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TH\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.THEAD\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.THUMB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.THREADS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TIME\">\r\n            A name\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TILINGTYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TIMES_ROMAN\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TIMES_BOLD\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TIMES_ITALIC\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TIMES_BOLDITALIC\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TITLE\">\r\n            Use Title for the document's top level title (optional), and for document\r\n            outline dictionaries, which can store bookmarks.\r\n            For all other uses of a title entry, including Tagged PDF, use {@link #T}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TK\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TOC\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TOCI\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TOGGLE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TOOLBAR\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TOUNICODE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TABLEROW\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRANS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRANSFORMPARAMS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRANSFORMMETHOD\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRANSPARENCY\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRANSPARENT\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRAPNET\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRAPPED\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRIMBOX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TRUETYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TU\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TV\">\r\n            A name \r\n            @since 5.4.4\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TWOCOLUMNLEFT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TWOCOLUMNRIGHT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TWOPAGELEFT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TWOPAGERIGHT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TX\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TYPE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TYPE0\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TYPE1\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.TYPE3\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.U\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UF\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UHC\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UNDERLINE\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UNIX\">\r\n            A name\r\n            @since 5.2.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UPPERALPHA\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UPPERROMAN\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UR\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UR3\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.URI\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.URL\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USAGE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USEATTACHMENTS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USENONE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USEOC\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USEOUTLINES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USER\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USERPROPERTIES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USERUNIT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.USETHUMBS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.UTF_8\">\r\n            A name\r\n            @since 5.4.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.V\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.V2\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VALIGN\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VERISIGN_PPKVS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VERSION\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VERTICES\">\r\n            A name\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIDEO\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEW\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEWS\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEWAREA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEWCLIP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEWERPREFERENCES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEWPORT\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VIEWSTATE\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VISIBLEPAGES\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VOFFSET\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.VP\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.W\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.W2\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WARICHU\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WATERMARK\">\r\n            A name\r\n            @since 5.4.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WC\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WIDGET\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WIDTH\">\r\n            A name of an attribute. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WIDTHS\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WIN\">\r\n            A name of an encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WIN_ANSI_ENCODING\">\r\n            A name of an encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WINDOW\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WINDOWED\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WIPE\">\r\n            A name of an encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WHITEPOINT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WKT\">\r\n            A name of an attribute.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WS\">\r\n            A name of an encoding \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.WT\">\r\n            A name\r\n            @since 5.4.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.X\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XA\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XD\">\r\n            A name\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XFA\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XML\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XOBJECT\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XPTS\">\r\n            A name\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XREF\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XREFSTM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XSTEP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.XYZ\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.YSTEP\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ZADB\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ZAPFDINGBATS\">\r\n            A name of a base 14 type 1 font \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.ZOOM\">\r\n            A name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfName.staticNames\">\r\n            map strings to all known static names\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.#cctor\">\r\n            Use reflection to cache all the static public readonly names so\r\n            future <code>PdfName</code> additions don't have to be \"added twice\".\r\n            A bit less efficient (around 50ms spent here on a 2.2ghz machine),\r\n             but Much Less error prone.\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.#ctor(System.String)\">\r\n            Constructs a new <CODE>PdfName</CODE>. The name length will be checked.\r\n            @param name the new name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.#ctor(System.String,System.Boolean)\">\r\n            Constructs a new <CODE>PdfName</CODE>.\r\n            @param name the new name\r\n            @param lengthCheck if <CODE>true</CODE> check the lenght validity, if <CODE>false</CODE> the name can\r\n            have any length\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfName.CompareTo(iTextSharp.text.pdf.PdfName)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.Equals(System.Object)\">\r\n             Indicates whether some other object is \"equal to\" this one.\r\n            \r\n             @param   obj   the reference object with which to compare.\r\n             @return  <code>true</code> if this object is the same as the obj\r\n                      argument; <code>false</code> otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.GetHashCode\">\r\n             Returns a hash code value for the object. This method is\r\n             supported for the benefit of hashtables such as those provided by\r\n             <code>java.util.Hashtable</code>.\r\n            \r\n             @return  a hash code value for this object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.EncodeName(System.String)\">\r\n             Encodes a plain name given in the unescaped form \"AB CD\" into \"/AB#20CD\".\r\n            \r\n             @param name the name to encode\r\n             @return the encoded name\r\n             @since\t2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfName.DecodeName(System.String)\">\r\n            Decodes an escaped name in the form \"/AB#20CD\" into \"AB CD\".\r\n            @param name the name to decode\r\n            @return the decoded name\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfNameTree\">\r\n            Creates a name tree.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNameTree.WriteTree``1(System.Collections.Generic.Dictionary{System.String,``0},iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a name tree.\r\n            @param items the item of the name tree. The key is a <CODE>String</CODE>\r\n            and the value is a <CODE>PdfObject</CODE>. Note that although the\r\n            keys are strings only the lower byte is used and no check is made for chars\r\n            with the same lower byte and different upper byte. This will generate a wrong\r\n            tree name.\r\n            @param writer the writer\r\n            @throws IOException on error\r\n            @return the dictionary with the name tree. This dictionary is the one\r\n            generally pointed to by the key /Dests, for example\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfNull”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfNull.PDFNULL\">\r\n            This is an instance of the <CODE>PdfNull</CODE>-object. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfNull.#ctor”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfNumber”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfNumber.value\">\r\n            actual value of this <CODE>PdfNumber</CODE>, represented as a <CODE>double</CODE> \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumber.#ctor(System.String)\">\r\n             Constructs a <CODE>PdfNumber</CODE>-object.\r\n            \r\n             @param        content            value of the new <CODE>PdfNumber</CODE>-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumber.#ctor(System.Int32)\">\r\n             Constructs a new int <CODE>PdfNumber</CODE>-object.\r\n            \r\n             @param        value                value of the new <CODE>PdfNumber</CODE>-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumber.#ctor(System.Int64)\">\r\n             Constructs a new long <CODE>PdfNumber</CODE>-object.\r\n            \r\n             @param        value                value of the new <CODE>PdfNumber</CODE>-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumber.#ctor(System.Double)\">\r\n             Constructs a new REAL <CODE>PdfNumber</CODE>-object.\r\n            \r\n             @param        value                value of the new <CODE>PdfNumber</CODE>-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumber.#ctor(System.Single)\">\r\n             Constructs a new REAL <CODE>PdfNumber</CODE>-object.\r\n            \r\n             @param        value                value of the new <CODE>PdfNumber</CODE>-object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfNumber.IntValue\">\r\n             Returns the primitive <CODE>int</CODE> value of this object.\r\n            \r\n             @return        a value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfNumber.LongValue\">\r\n             Returns the primitive <CODE>long</CODE> value of this object.\r\n            \r\n             @return        a value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfNumber.DoubleValue\">\r\n             Returns the primitive <CODE>double</CODE> value of this object.\r\n            \r\n             @return        a value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumber.Increment\">\r\n            Increments the value of the <CODE>PdfNumber</CODE>-object with 1.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfNumberTree\">\r\n            Creates a number tree.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfNumberTree.WriteTree``1(System.Collections.Generic.Dictionary{System.Int32,``0},iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a number tree.\r\n            @param items the item of the number tree. The key is an <CODE>Integer</CODE>\r\n            and the value is a <CODE>PdfObject</CODE>.\r\n            @param writer the writer\r\n            @throws IOException on error\r\n            @return the dictionary with the number tree.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfObject”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.BOOLEAN\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.NUMBER\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.STRING\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.NAME\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.ARRAY\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.DICTIONARY\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.STREAM\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.NULL\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.INDIRECT\">\r\n            a possible type of <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.NOTHING\">\r\n            This is an empty string used for the <CODE>PdfNull</CODE>-object and for an empty <CODE>PdfString</CODE>-object. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.TEXT_PDFDOCENCODING\">\r\n            This is the default encoding to be used for converting strings into bytes and vice versa.\r\n            The default encoding is PdfDocEcoding.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.TEXT_UNICODE\">\r\n            This is the encoding to be used to output text in Unicode. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.bytes\">\r\n            the content of this <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.type\">\r\n            the type of this <CODE>PdfObject</CODE> \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.indRef\">\r\n            Holds value of property indRef.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.hashCode\">\r\n            Hash code of the PdfObject instance. \r\n            Unfortunately, default C# behavior does not generate unique hash code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.objCounter\">\r\n            Used for generating hash code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfObject.locker\">\r\n            Making hash code generation thread safe.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.#ctor(System.Int32)\">\r\n             Constructs a <CODE>PdfObject</CODE> of a certain <VAR>type</VAR> without any <VAR>content</VAR>.\r\n            \r\n             @param        type            type of the new <CODE>PdfObject</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.#ctor(System.Int32,System.String)\">\r\n             Constructs a <CODE>PdfObject</CODE> of a certain <VAR>type</VAR> with a certain <VAR>content</VAR>.\r\n            \r\n             @param        type            type of the new <CODE>PdfObject</CODE>\r\n             @param        content            content of the new <CODE>PdfObject</CODE> as a <CODE>String</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.#ctor(System.Int32,System.Byte[])\">\r\n             Constructs a <CODE>PdfObject</CODE> of a certain <VAR>type</VAR> with a certain <VAR>content</VAR>.\r\n            \r\n             @param        type            type of the new <CODE>PdfObject</CODE>\r\n             @param        bytes            content of the new <CODE>PdfObject</CODE> as an array of <CODE>byte</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n            Writes the PDF representation of this <CODE>PdfObject</CODE> as an array of <CODE>byte</CODE>s to the writer.\r\n            @param writer for backwards compatibility\r\n            @param os the outputstream to write the bytes to.\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.GetBytes\">\r\n            Gets the presentation of this object in a byte array\r\n            @return a byte array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.CanBeInObjStm\">\r\n            Can this object be in an object stream?\r\n            @return true if this object can be in an object stream.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.ToString\">\r\n             Returns the <CODE>String</CODE>-representation of this <CODE>PdfObject</CODE>.\r\n            \r\n             @return        a <CODE>String</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfObject.Length\">\r\n             Returns the length of the actual content of the <CODE>PdfObject</CODE>.\r\n             <P>\r\n             In some cases, namely for <CODE>PdfString</CODE> and <CODE>PdfStream</CODE>,\r\n             this method differs from the method <CODE>pdfLength</CODE> because <CODE>pdfLength</CODE>\r\n             returns the length of the PDF representation of the object, not of the actual content\r\n             as does the method <CODE>length</CODE>.</P>\r\n             <P>\r\n             Remark: the actual content of an object is in some cases identical to its representation.\r\n             The following statement is always true: Length() &gt;= PdfLength().</P>\r\n            \r\n             @return        a length\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfObject.Content\">\r\n             Changes the content of this <CODE>PdfObject</CODE>.\r\n            \r\n             @param        content            the new content of this <CODE>PdfObject</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfObject.Type\">\r\n             Returns the type of this <CODE>PdfObject</CODE>.\r\n            \r\n             @return        a type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsNull\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfNull</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsBoolean\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfBoolean</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsNumber\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfNumber</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsString\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfString</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsName\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfName</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsArray\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfArray</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsDictionary\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfDictionary</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsStream\">\r\n             Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfStream</CODE>.\r\n            \r\n             @return        <CODE>true</CODE> or <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfObject.IsIndirect\">\r\n            Checks if this is an indirect object.\r\n            @return true if this is an indirect object\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfOutline”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.reference\">\r\n            the <CODE>PdfIndirectReference</CODE> of this object \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.count\">\r\n            value of the <B>Count</B>-key \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.parent\">\r\n            value of the <B>Parent</B>-key \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.destination\">\r\n            value of the <B>Destination</B>-key \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.action\">\r\n            The <CODE>PdfAction</CODE> for this outline.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.tag\">\r\n            Holds value of property tag. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.open\">\r\n            Holds value of property open. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.color\">\r\n            Holds value of property color. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfOutline.style\">\r\n            Holds value of property style. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfWriter)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfAction,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfAction,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfDestination,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfDestination,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfAction,iTextSharp.text.pdf.PdfString)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfAction,iTextSharp.text.pdf.PdfString,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfDestination,iTextSharp.text.pdf.PdfString)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfDestination,iTextSharp.text.pdf.PdfString,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfAction,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfAction,iTextSharp.text.Paragraph,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfDestination,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfOutline.#ctor(iTextSharp.text.pdf.PdfOutline,iTextSharp.text.pdf.PdfDestination,iTextSharp.text.Paragraph,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfOutline.InitOutline(iTextSharp.text.pdf.PdfOutline,System.String,System.Boolean)\">\r\n            Helper for the constructors.\r\n            @param parent the parent outline\r\n            @param title the title for this outline\r\n            @param open <CODE>true</CODE> if the children are visible\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfOutline.IndirectReference\">\r\n             Gets the indirect reference of this <CODE>PdfOutline</CODE>.\r\n            \r\n             @return      the <CODE>PdfIndirectReference</CODE> to this outline.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfOutline.Parent\">\r\n             Gets the parent of this <CODE>PdfOutline</CODE>.\r\n            \r\n             @return      the <CODE>PdfOutline</CODE> that is the parent of this outline.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfOutline.SetDestinationPage(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n             Set the page of the <CODE>PdfDestination</CODE>-object.\r\n            \r\n             @param pageReference indirect reference to the page\r\n             @return <CODE>true</CODE> if this page was set as the <CODE>PdfDestination</CODE>-page.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfOutline.PdfDestination\">\r\n            Gets the destination for this outline.\r\n            @return the destination\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfOutline.Level\">\r\n             returns the level of this outline.\r\n            \r\n             @return      a level\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfOutline.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n             Returns the PDF representation of this <CODE>PdfOutline</CODE>.\r\n            \r\n             @param writer the encryption information\r\n             @param os\r\n             @throws IOException\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfOutline.Tag\">\r\n            Getter for property tag.\r\n            @return Value of property tag.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfOutline.Open\">\r\n            Setter for property open.\r\n            @param open New value of property open.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfPage”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPage.PORTRAIT\">\r\n            value of the <B>Rotate</B> key for a page in PORTRAIT \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPage.LANDSCAPE\">\r\n            value of the <B>Rotate</B> key for a page in LANDSCAPE \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPage.INVERTEDPORTRAIT\">\r\n            value of the <B>Rotate</B> key for a page in INVERTEDPORTRAIT \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPage.SEASCAPE\">\r\n            value of the <B>Rotate</B> key for a page in SEASCAPE \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPage.mediaBox\">\r\n            value of the <B>MediaBox</B> key \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPage.#ctor(iTextSharp.text.pdf.PdfRectangle,System.Collections.Generic.Dictionary{System.String,iTextSharp.text.pdf.PdfRectangle},iTextSharp.text.pdf.PdfDictionary,System.Int32)\">\r\n             Constructs a <CODE>PdfPage</CODE>.\r\n            \r\n             @param\t\tmediaBox\t\ta value for the <B>MediaBox</B> key\r\n             @param\t\tresources\t\tan indirect reference to a <CODE>PdfResources</CODE>-object\r\n             @param\t\trotate\t\t\ta value for the <B>Rotate</B> key\r\n             @throws DocumentException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPage.#ctor(iTextSharp.text.pdf.PdfRectangle,System.Collections.Generic.Dictionary{System.String,iTextSharp.text.pdf.PdfRectangle},iTextSharp.text.pdf.PdfDictionary)\">\r\n             Constructs a <CODE>PdfPage</CODE>.\r\n            \r\n             @param\t\tmediaBox\t\ta value for the <B>MediaBox</B> key\r\n             @param\t\tresources\t\tan indirect reference to a <CODE>PdfResources</CODE>-object\r\n             @throws DocumentException \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPage.IsParent”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPage.Add(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n             Adds an indirect reference pointing to a <CODE>PdfContents</CODE>-object.\r\n            \r\n             @param       contents        an indirect reference to a <CODE>PdfContents</CODE>-object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPage.RotateMediaBox\">\r\n             Rotates the mediabox, but not the text in it.\r\n            \r\n             @return      a <CODE>PdfRectangle</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPage.MediaBox\">\r\n             Returns the MediaBox of this Page.\r\n            \r\n             @return      a <CODE>PdfRectangle</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPageEventHelper\">\r\n             Helps the use of <CODE>PdfPageEvent</CODE> by implementing all the interface methods.\r\n             A class can extend <CODE>PdfPageEventHelper</CODE> and only implement the\r\n             needed methods.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageEventHelper.OnOpenDocument(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n             Called when the document is opened.\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE> for this document\r\n             @param document the document\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnStartPage(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageEventHelper.OnEndPage(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n             Called when a page is finished, just before being written to the document.\r\n            \r\n             @param writer the <CODE>PdfWriter</CODE> for this document\r\n             @param document the document\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnCloseDocument(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnParagraph(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnParagraphEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnChapter(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnChapterEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnSection(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single,System.Int32,iTextSharp.text.Paragraph)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnSectionEnd(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPageEventHelper.OnGenericTag(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document,iTextSharp.text.Rectangle,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPageLabels\">\r\n            Page labels are used to identify each\r\n            page visually on the screen or in print.\r\n            @author  Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.DECIMAL_ARABIC_NUMERALS\">\r\n            Logical pages will have the form 1,2,3,...\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.UPPERCASE_ROMAN_NUMERALS\">\r\n            Logical pages will have the form I,II,III,IV,...\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.LOWERCASE_ROMAN_NUMERALS\">\r\n            Logical pages will have the form i,ii,iii,iv,...\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.UPPERCASE_LETTERS\">\r\n            Logical pages will have the form of uppercase letters\r\n            (A to Z for the first 26 pages, AA to ZZ for the next 26, and so on)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.LOWERCASE_LETTERS\">\r\n            Logical pages will have the form of uppercase letters\r\n            (a to z for the first 26 pages, aa to zz for the next 26, and so on)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.EMPTY\">\r\n            No logical page numbers are generated but fixed text may\r\n            still exist\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.numberingStyle\">\r\n            Dictionary values to set the logical page styles\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPageLabels.map\">\r\n            The sequence of logical pages. Will contain at least a value for page 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.#ctor\">\r\n            Creates a new PdfPageLabel with a default logical page 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.AddPageLabel(System.Int32,System.Int32,System.String,System.Int32)\">\r\n            Adds or replaces a page label.\r\n            @param page the real page to start the numbering. First page is 1\r\n            @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS\r\n            @param text the text to prefix the number. Can be <CODE>null</CODE> or empty\r\n            @param firstPage the first logical page number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.AddPageLabel(System.Int32,System.Int32,System.String,System.Int32,System.Boolean)\">\r\n            Adds or replaces a page label.\r\n            @param page the real page to start the numbering. First page is 1\r\n            @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS\r\n            @param text the text to prefix the number. Can be <CODE>null</CODE> or empty\r\n            @param firstPage the first logical page number\r\n            @param includeFirstPage If true, the page label will be added to the first page if it is page 1.  \r\n            \t If the first page is not page 1 or this value is false, the value will not be added to the dictionary.  \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.AddPageLabel(System.Int32,System.Int32,System.String)\">\r\n            Adds or replaces a page label. The first logical page has the default\r\n            of 1.\r\n            @param page the real page to start the numbering. First page is 1\r\n            @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS\r\n            @param text the text to prefix the number. Can be <CODE>null</CODE> or empty\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.AddPageLabel(System.Int32,System.Int32)\">\r\n            Adds or replaces a page label. There is no text prefix and the first\r\n            logical page has the default of 1.\r\n            @param page the real page to start the numbering. First page is 1\r\n            @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.AddPageLabel(iTextSharp.text.pdf.PdfPageLabels.PdfPageLabelFormat)\">\r\n            Adds or replaces a page label.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.RemovePageLabel(System.Int32)\">\r\n            Removes a page label. The first page lagel can not be removed, only changed.\r\n            @param page the real page to remove\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.GetDictionary(iTextSharp.text.pdf.PdfWriter)\">\r\n            Gets the page label dictionary to insert into the document.\r\n            @return the page label dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.GetPageLabels(iTextSharp.text.pdf.PdfReader)\">\r\n            Retrieves the page labels from a PDF as an array of String objects.\r\n            @param reader a PdfReader object that has the page labels you want to retrieve\r\n            @return  a String array or <code>null</code> if no page labels are present\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.GetPageLabelFormats(iTextSharp.text.pdf.PdfReader)\">\r\n            Retrieves the page labels from a PDF as an array of {@link PdfPageLabelFormat} objects.\r\n            @param reader a PdfReader object that has the page labels you want to retrieve\r\n            @return  a PdfPageLabelEntry array, containing an entry for each format change\r\n            or <code>null</code> if no page labels are present\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPageLabels.PdfPageLabelFormat.#ctor(System.Int32,System.Int32,System.String,System.Int32)\">\r\n            Creates a page label format.\r\n            @param physicalPage the real page to start the numbering. First page is 1\r\n            @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS\r\n            @param prefix the text to prefix the number. Can be <CODE>null</CODE> or empty\r\n            @param logicalPage the first logical page number\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfPages”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPages.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Constructs a <CODE>PdfPages</CODE>-object.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPattern\">\r\n             A <CODE>PdfPattern</CODE> defines a ColorSpace\r\n            \r\n             @see     PdfStream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPattern.#ctor(iTextSharp.text.pdf.PdfPatternPainter)\">\r\n            Creates a PdfPattern object.\r\n            @param   painter a pattern painter instance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPattern.#ctor(iTextSharp.text.pdf.PdfPatternPainter,System.Int32)\">\r\n            Creates a PdfPattern object.\r\n            @param   painter a pattern painter instance\r\n            @param   compressionLevel the compressionLevel for the stream\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPatternPainter\">\r\n            Implements the pattern.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.#ctor\">\r\n            Creates a <CODE>PdfPattern</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n             Creates new PdfPattern\r\n            \r\n             @param wr the <CODE>PdfWriter</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.GetPattern\">\r\n            Gets the stream representing this pattern\r\n            @return the stream representing this pattern\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.GetPattern(System.Int32)\">\r\n            Gets the stream representing this pattern\r\n            @param   compressionLevel    the compression level of the stream\r\n            @return the stream representing this pattern\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPatternPainter.Duplicate\">\r\n            Gets a duplicate of this <CODE>PdfPatternPainter</CODE>. All\r\n            the members are copied by reference but the buffer stays different.\r\n            @return a copy of this <CODE>PdfPatternPainter</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetGrayFill(System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setGrayFill(float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.ResetGrayFill\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#resetGrayFill()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetGrayStroke(System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setGrayStroke(float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.ResetGrayStroke\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#resetGrayStroke()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetRGBColorFillF(System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setRGBColorFillF(float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.ResetRGBColorFill\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#resetRGBColorFill()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetRGBColorStrokeF(System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setRGBColorStrokeF(float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.ResetRGBColorStroke\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#resetRGBColorStroke()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetCMYKColorFillF(System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorFillF(float, float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.ResetCMYKColorFill\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#resetCMYKColorFill()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetCMYKColorStrokeF(System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorStrokeF(float, float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.ResetCMYKColorStroke\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#resetCMYKColorStroke()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.AddImage(iTextSharp.text.Image,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#addImage(com.lowagie.text.Image, float, float, float, float, float, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetCMYKColorFill(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorFill(int, int, int, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetCMYKColorStroke(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorStroke(int, int, int, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetRGBColorFill(System.Int32,System.Int32,System.Int32)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setRGBColorFill(int, int, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetRGBColorStroke(System.Int32,System.Int32,System.Int32)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setRGBColorStroke(int, int, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetColorStroke(iTextSharp.text.BaseColor)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setColorStroke(java.awt.Color)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetColorFill(iTextSharp.text.BaseColor)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setColorFill(java.awt.Color)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetColorFill(iTextSharp.text.pdf.PdfSpotColor,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setColorFill(com.lowagie.text.pdf.PdfSpotColor, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetColorStroke(iTextSharp.text.pdf.PdfSpotColor,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setColorStroke(com.lowagie.text.pdf.PdfSpotColor, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetPatternFill(iTextSharp.text.pdf.PdfPatternPainter)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setPatternFill(com.lowagie.text.pdf.PdfPatternPainter)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetPatternFill(iTextSharp.text.pdf.PdfPatternPainter,iTextSharp.text.BaseColor,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setPatternFill(com.lowagie.text.pdf.PdfPatternPainter, java.awt.Color, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetPatternStroke(iTextSharp.text.pdf.PdfPatternPainter,iTextSharp.text.BaseColor,System.Single)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setPatternStroke(com.lowagie.text.pdf.PdfPatternPainter, java.awt.Color, float)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPatternPainter.SetPatternStroke(iTextSharp.text.pdf.PdfPatternPainter)\">\r\n            @see com.lowagie.text.pdf.PdfContentByte#setPatternStroke(com.lowagie.text.pdf.PdfPatternPainter)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPCell\">\r\n            A cell in a PdfPTable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.verticalAlignment\">\r\n            Holds value of property verticalAlignment. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.paddingLeft\">\r\n            Holds value of property paddingLeft. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.paddingRight\">\r\n            Holds value of property paddingLeft. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.paddingTop\">\r\n            Holds value of property paddingTop. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.paddingBottom\">\r\n            Holds value of property paddingBottom. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.fixedHeight\">\r\n            Holds value of property fixedHeight. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.calculatedHeight\">\r\n            Fixed height of the cell.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.noWrap\">\r\n            Holds value of property noWrap. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.table\">\r\n            Holds value of property table. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.minimumHeight\">\r\n            Holds value of property minimumHeight. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.cachedMaxHeight\">\r\n            This field is used to cache the height which is calculated on getMaxHeight() method call;\r\n            this helps to avoid unnecessary recalculations on table drawing.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.colspan\">\r\n            Holds value of property colspan. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.rowspan\">\r\n            Holds value of property rowspan.\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.image\">\r\n            Holds value of property image. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.cellEvent\">\r\n            Holds value of property cellEvent. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.useDescender\">\r\n            Holds value of property useDescender. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.useBorderPadding\">\r\n            Increases padding to include border if true \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.phrase\">\r\n            The text in the cell. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPCell.rotation\">\r\n            The rotation of the cell. Possible values are\r\n            0, 90, 180 and 270.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor\">\r\n            Constructs an empty <CODE>PdfPCell</CODE>.\r\n            The default padding is 2.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor(iTextSharp.text.Phrase)\">\r\n            Constructs a <CODE>PdfPCell</CODE> with a <CODE>Phrase</CODE>.\r\n            The default padding is 2.\r\n            @param phrase the text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor(iTextSharp.text.Image)\">\r\n            Constructs a <CODE>PdfPCell</CODE> with an <CODE>Image</CODE>.\r\n            The default padding is 0.\r\n            @param image the <CODE>Image</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor(iTextSharp.text.Image,System.Boolean)\">\r\n            Constructs a <CODE>PdfPCell</CODE> with an <CODE>Image</CODE>.\r\n            The default padding is 0.25 for a border width of 0.5.\r\n            @param image the <CODE>Image</CODE>\r\n            @param fit <CODE>true</CODE> to fit the image to the cell\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor(iTextSharp.text.pdf.PdfPTable)\">\r\n            Constructs a <CODE>PdfPCell</CODE> with a <CODE>PdfPtable</CODE>.\r\n            This constructor allows nested tables.\r\n            The default padding is 0.\r\n            @param table The <CODE>PdfPTable</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor(iTextSharp.text.pdf.PdfPTable,iTextSharp.text.pdf.PdfPCell)\">\r\n            Constructs a <CODE>PdfPCell</CODE> with a <CODE>PdfPtable</CODE>.\r\n            This constructor allows nested tables.\r\n            \r\n            @param table The <CODE>PdfPTable</CODE>\r\n            @param style  The style to apply to the cell (you could use getDefaultCell())\r\n            @since 2.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.#ctor(iTextSharp.text.pdf.PdfPCell)\">\r\n            Constructs a deep copy of a <CODE>PdfPCell</CODE>.\r\n            @param cell the <CODE>PdfPCell</CODE> to duplicate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.AddElement(iTextSharp.text.IElement)\">\r\n            Adds an iText element to the cell.\r\n            @param element\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Phrase\">\r\n            Gets the <CODE>Phrase</CODE> from this cell.\r\n            @return the <CODE>Phrase</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.HorizontalAlignment\">\r\n            Gets the horizontal alignment for the cell.\r\n            @return the horizontal alignment for the cell\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.VerticalAlignment\">\r\n            Gets the vertical alignment for the cell.\r\n            @return the vertical alignment for the cell\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.EffectivePaddingLeft\">\r\n            Gets the effective left padding.  This will include\r\n             the left border width if {@link #UseBorderPadding} is true.\r\n            @return effective value of property paddingLeft.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.PaddingLeft\">\r\n            @return Value of property paddingLeft.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.EffectivePaddingRight\">\r\n            Gets the effective right padding.  This will include\r\n             the right border width if {@link #UseBorderPadding} is true.\r\n            @return effective value of property paddingRight.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.PaddingRight\">\r\n            Getter for property paddingRight.\r\n            @return Value of property paddingRight.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.EffectivePaddingTop\">\r\n            Gets the effective top padding.  This will include\r\n             the top border width if {@link #isUseBorderPadding()} is true.\r\n            @return effective value of property paddingTop.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.PaddingTop\">\r\n            Getter for property paddingTop.\r\n            @return Value of property paddingTop.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.EffectivePaddingBottom\">\r\n                    /** Gets the effective bottom padding.  This will include\r\n                    *  the bottom border width if {@link #UseBorderPadding} is true.\r\n                    * @return effective value of property paddingBottom.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.PaddingBottom\">\r\n            Getter for property paddingBottom.\r\n            @return Value of property paddingBottom.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Padding\">\r\n            Sets the padding of the contents in the cell (space between content and border).\r\n            @param padding\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.UseBorderPadding\">\r\n            Adjusts effective padding to include border widths.\r\n            @param use adjust effective padding if true\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.SetLeading(System.Single,System.Single)\">\r\n            Sets the leading fixed and variable. The resultant leading will be\r\n            fixedLeading+multipliedLeading*maxFontSize where maxFontSize is the\r\n            size of the bigest font in the line.\r\n            @param fixedLeading the fixed leading\r\n            @param multipliedLeading the variable leading\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Leading\">\r\n            Gets the fixed leading\r\n            @return the leading\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.MultipliedLeading\">\r\n            Gets the variable leading\r\n            @return the leading\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Indent\">\r\n            Gets the first paragraph line indent.\r\n            @return the indent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.ExtraParagraphSpace\">\r\n            Gets the extra space between paragraphs.\r\n            @return the extra space between paragraphs\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.FixedHeight\">\r\n            Getter for property fixedHeight.\r\n            @return Value of property fixedHeight.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.HasFixedHeight\">\r\n            Tells you whether the cell has a fixed height.\r\n            \r\n            @return   true is a fixed height was set.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.CachedMaxHeight\">\r\n            Gets the height which was calculated on last call of getMaxHeight().\r\n            If cell's bBox and content wasn't changed this value is actual maxHeight of the cell.\r\n            @return max height which was calculated on last call of getMaxHeight(); if getMaxHeight() wasn't called the return value is 0\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.NoWrap\">\r\n            Setter for property noWrap.\r\n            @param noWrap New value of property noWrap.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Table\">\r\n            Getter for property table.\r\n            @return Value of property table.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.MinimumHeight\">\r\n            Getter for property minimumHeight.\r\n            @return Value of property minimumHeight.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.HasMinimumHeight\">\r\n            Tells you whether the cell has a minimum height.\r\n            \r\n            @return   true if a minimum height was set.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Colspan\">\r\n            Getter for property colspan.\r\n            @return Value of property colspan.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Rowspan\">\r\n            Getter for property rowspan.\r\n            @return Value of property rowspan.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.FollowingIndent\">\r\n            Gets the following paragraph lines indent.\r\n            @return the indent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.RightIndent\">\r\n            Gets the right paragraph lines indent.\r\n            @return the indent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.SpaceCharRatio\">\r\n            Gets the space/character extra spacing ratio for\r\n            fully justified text.\r\n            @return the space/character extra spacing ratio\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.RunDirection\">\r\n            Gets the run direction of the text content in the cell\r\n            @return One of the following values: PdfWriter.RUN_DIRECTION_DEFAULT, PdfWriter.RUN_DIRECTION_NO_BIDI, PdfWriter.RUN_DIRECTION_LTR or PdfWriter.RUN_DIRECTION_RTL.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Image\">\r\n            Getter for property image.\r\n             @return Value of property image.\r\n            \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.CellEvent\">\r\n            Gets the cell event for this cell.\r\n             @return the cell event\r\n            \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.ArabicOptions\">\r\n            Gets the arabic shaping options.\r\n            @return the arabic shaping options\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.UseAscender\">\r\n            Gets state of first line height based on max ascender\r\n            @return true if an ascender is to be used.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.UseDescender\">\r\n            Getter for property useDescender.\r\n             @return Value of property useDescender.\r\n            \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Column\">\r\n            Gets the ColumnText with the content of the cell.\r\n            @return a columntext object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.CompositeElements\">\r\n            Returns the list of composite elements of the column.\r\n            @return   a List object.\r\n            @since    2.1.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPCell.Rotation\">\r\n            Sets the rotation of the cell. Possible values are\r\n            0, 90, 180 and 270.\r\n            @param rotation the rotation of the cell\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPCell.GetMaxHeight\">\r\n            Returns the height of the cell.\r\n            @return  the height of the cell\r\n            @since   3.0.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPHeaderCell.NONE\">\r\n            this is a possible style. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPHeaderCell.ROW\">\r\n            this is a possible style. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPHeaderCell.COLUMN\">\r\n            this is a possible style. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPHeaderCell.BOTH\">\r\n            this is a possible style. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPRow\">\r\n            A row in a PdfPTable.\r\n            \r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPRow.mayNotBreak\">\r\n            True if the table may not break after this row. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPRow.BOTTOM_LIMIT\">\r\n            the bottom limit (bottom right y) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPRow.RIGHT_LIMIT\">\r\n            the right limit\r\n            @since    2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPRow.extraHeights\">\r\n            extra heights that needs to be added to a cell because of rowspans.\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.#ctor(iTextSharp.text.pdf.PdfPCell[])\">\r\n            Constructs a new PdfPRow with the cells in the array that was passed\r\n            as a parameter.\r\n            \r\n            @param cells\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.#ctor(iTextSharp.text.pdf.PdfPRow)\">\r\n            Makes a copy of an existing row.\r\n            \r\n            @param row\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.SetWidths(System.Single[])\">\r\n            Sets the widths of the columns in the row.\r\n            \r\n            @param widths\r\n            @return true if everything went right\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.InitExtraHeights\">\r\n            Initializes the extra heights array.\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.SetExtraHeight(System.Int32,System.Single)\">\r\n            Sets an extra height for a cell.\r\n            @param    cell    the index of the cell that needs an extra height\r\n            @param    height  the extra height\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.CalculateHeights\">\r\n            Calculates the heights of each cell in the row.\r\n            \r\n            @return the maximum height of the row.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.WriteBorderAndBackground(System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfPCell,iTextSharp.text.pdf.PdfContentByte[])\">\r\n            Writes the border and background of one cell in the row.\r\n            \r\n            @param xPos The x-coordinate where the table starts on the canvas\r\n            @param yPos The y-coordinate where the table starts on the canvas\r\n            @param currentMaxHeight The height of the cell to be drawn.\r\n            @param cell\r\n            @param canvases\r\n            @since    2.1.6   extra parameter currentMaxHeight\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.SaveAndRotateCanvases(iTextSharp.text.pdf.PdfContentByte[],System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            @since    2.1.6 private is now protected\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.RestoreCanvases(iTextSharp.text.pdf.PdfContentByte[])\">\r\n            @since    2.1.6 private is now protected\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.SetColumn(iTextSharp.text.pdf.ColumnText,System.Single,System.Single,System.Single,System.Single)\">\r\n            @since\t3.0.0 protected is now public static\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.WriteCells(System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte[],System.Boolean)\">\r\n                    * Writes a number of cells (not necessarily all cells).\r\n                    * \r\n                    * @param    colStart The first column to be written.\r\n                    * Remember that the column index starts with 0.\r\n                    * @param    colEnd The last column to be written.\r\n                    * Remember that the column index starts with 0.\r\n                    * If -1, all the columns to the end are written.\r\n                    * @param    xPos The x-coordinate where the table starts on the canvas\r\n                    * @param    yPos The y-coordinate where the table starts on the canvas\r\n                     * @param   reusable if set to false, the content in the cells is \"consumed\";\r\n                     * if true, you can reuse the cells, the row, the parent table as many times you want.\r\n                     * @since 5.1.0 added the reusable parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.IsCalculated\">\r\n            Checks if the dimensions of the columns were calculated.\r\n            \r\n            @return true if the dimensions of the columns were calculated\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPRow.MaxHeights\">\r\n            Gets the maximum height of the row (i.e. of the 'highest' cell).\r\n            @return the maximum height of the row\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.CopyRowContent(iTextSharp.text.pdf.PdfPTable,System.Int32)\">\r\n            Copies the content of a specific row in a table to this row.\r\n            Don't do this if the rows have a different number of cells.\r\n            @param table the table from which you want to copy a row\r\n            @param idx   the index of the row that needs to be copied\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.SplitRow(iTextSharp.text.pdf.PdfPTable,System.Int32,System.Single)\">\r\n            Splits a row to newHeight.\r\n            The returned row is the remainder. It will return null if the newHeight\r\n            was so small that only an empty row would result.\r\n            \r\n            @param new_height the new height\r\n            @return the remainder row or null if the newHeight was so small that only\r\n            an empty row would result\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.SplitRowspans(iTextSharp.text.pdf.PdfPTable,System.Int32,iTextSharp.text.pdf.PdfPTable,System.Int32)\">\r\n            Split rowspan of cells with rowspan on next page by inserting copies with the remaining rowspan\r\n            and reducing the previous rowspan appropriately, i.e. if a cell with rowspan 7 gets split after 3 rows\r\n            of that rowspan have been laid out, its column on the next page should start with an empty cell\r\n            having the same attributes and rowspan 7 - 3 = 4.\r\n            \r\n            @since iText 5.4.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.GetCells\">\r\n            Returns the array of cells in the row.\r\n            Please be extremely careful with this method.\r\n            Use the cells as read only objects.\r\n            \r\n            @return   an array of cells\r\n            @since    2.1.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPRow.HasRowspan\">\r\n            Checks if a cell in the row has a rowspan greater than 1.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPSXObject\">\r\n            Implements the PostScript XObject.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPSXObject.#ctor\">\r\n            Creates a new instance of PdfPSXObject \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPSXObject.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Constructs a PSXObject\r\n            @param wr\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPSXObject.GetFormXObject(System.Int32)\">\r\n             Gets the stream representing this object.\r\n            \r\n             @param   compressionLevel    the compressionLevel\r\n             @return the stream representing this template\r\n             @since   2.1.3   (replacing the method without param compressionLevel)\r\n             @throws IOException\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPSXObject.Duplicate\">\r\n            Gets a duplicate of this <CODE>PdfPSXObject</CODE>. All\r\n            the members are copied by reference but the buffer stays different.\r\n            @return a copy of this <CODE>PdfPSXObject</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPTable\">\r\n            This is a table that can be put at an absolute position but can also\r\n            be added to the document as the class <CODE>Table</CODE>.\r\n            In the last case when crossing pages the table always break at full rows; if a\r\n            row is bigger than the page it is dropped silently to avoid infinite loops.\r\n            <p/>\r\n            A PdfPTableEvent can be associated to the table to do custom drawing\r\n            when the table is rendered.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.BASECANVAS\">\r\n            The index of the original <CODE>PdfcontentByte</CODE>.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.BACKGROUNDCANVAS\">\r\n            The index of the duplicate <CODE>PdfContentByte</CODE> where the background will be drawn.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.LINECANVAS\">\r\n            The index of the duplicate <CODE>PdfContentByte</CODE> where the border lines will be drawn.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.TEXTCANVAS\">\r\n            The index of the duplicate <CODE>PdfContentByte</CODE> where the text will be drawn.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.currentColIdx\">\r\n            The current column index.\r\n            \r\n            @since 5.1.0 renamed from currentColIdx\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.headerRows\">\r\n            Holds value of property headerRows. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.widthPercentage\">\r\n            Holds value of property widthPercentage. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.horizontalAlignment\">\r\n            Holds value of property horizontalAlignment. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.skipFirstHeader\">\r\n            Holds value of property skipFirstHeader. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.skipLastFooter\">\r\n            Holds value of property skipLastFooter.\r\n            \r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.lockedWidth\">\r\n            Holds value of property lockedWidth.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.splitRows\">\r\n            Holds value of property splitRows.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.spacingBefore\">\r\n            The spacing before the table. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.spacingAfter\">\r\n            The spacing after the table. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.extendLastRow\">\r\n            Holds value of property extendLastRow.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.headersInEvent\">\r\n            Holds value of property headersInEvent.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.splitLate\">\r\n            Holds value of property splitLate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.keepTogether\">\r\n            Defines if the table should be kept\r\n            on one page if possible\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.complete\">\r\n            Indicates if the PdfPTable is complete once added to the document.\r\n            @since iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfPTable.rowCompleted\">\r\n            Keeps track of the completeness of the current row.\r\n            \r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.#ctor(System.Single[])\">\r\n            Constructs a <CODE>PdfPTable</CODE> with the relative column widths.\r\n            @param relativeWidths the relative column widths\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.#ctor(System.Int32)\">\r\n            Constructs a <CODE>PdfPTable</CODE> with <CODE>numColumns</CODE> columns.\r\n            @param numColumns the number of columns\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.#ctor(iTextSharp.text.pdf.PdfPTable)\">\r\n            Constructs a copy of a <CODE>PdfPTable</CODE>.\r\n            @param table the <CODE>PdfPTable</CODE> to be copied\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.ShallowCopy(iTextSharp.text.pdf.PdfPTable)\">\r\n            Makes a shallow copy of a table (format without content).\r\n            @param table\r\n            @return a shallow copy of the table\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.CopyFormat(iTextSharp.text.pdf.PdfPTable)\">\r\n            Copies the format of the sourceTable without copying the content. \r\n            @param sourceTable\r\n            @since 2.1.6 private is now protected\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SetWidths(System.Single[])\">\r\n            Sets the relative widths of the table.\r\n            @param relativeWidths the relative widths of the table.\r\n            @throws DocumentException if the number of widths is different than the number\r\n                                      of columns\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SetWidths(System.Int32[])\">\r\n            Sets the relative widths of the table.\r\n            @param relativeWidths the relative widths of the table.\r\n            @throws DocumentException if the number of widths is different than the number\r\n                                      of columns\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.CalculateWidths\">\r\n            @since 2.1.6 private is now protected\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SetTotalWidth(System.Single[])\">\r\n            Sets the full width of the table from the absolute column width.\r\n            @param columnWidth the absolute width of each column\r\n            @throws DocumentException if the number of widths is different than the number\r\n                                      of columns\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SetWidthPercentage(System.Single[],iTextSharp.text.Rectangle)\">\r\n            Sets the percentage width of the table from the absolute column width.  Warning: Don't use this with setLockedWidth(true). These two settings don't mix.\r\n            @param columnWidth the absolute width of each column\r\n            @param pageSize    the page size\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.TotalWidth\">\r\n            Gets the full width of the table.\r\n            @return the full width of the table\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.CalculateHeights\">\r\n             Calculates the heights of the table.\r\n            \r\n             @return the total height of the table. Note that it will be 0 if you didn't\r\n             specify the width of the table with SetTotalWidth().\r\n             and made it public\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.ResetColumnCount(System.Int32)\">\r\n            Changes the number of columns. Any existing rows will be deleted.\r\n            \r\n            @param the new number of columns\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.DefaultCell\">\r\n            Gets the default <CODE>PdfPCell</CODE> that will be used as\r\n            reference for all the <CODE>addCell</CODE> methods except\r\n            <CODE>addCell(PdfPCell)</CODE>.\r\n            @return default <CODE>PdfPCell</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.AddCell(iTextSharp.text.pdf.PdfPCell)\">\r\n            Adds a cell element.\r\n            \r\n            @param cell the cell element\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SkipColsWithRowspanAbove\">\r\n            When updating the row index, cells with rowspan should be taken into account.\r\n            This is what happens in this method.\r\n            \r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.CellAt(System.Int32,System.Int32)\">\r\n             Added by timmo3.  This will return the correct cell taking it's cellspan into account\r\n            \r\n             @param row the row index\r\n             @param col the column index\r\n             @return PdfPCell at the given row and position or null otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.RowSpanAbove(System.Int32,System.Int32)\">\r\n            Checks if there are rows above belonging to a rowspan.\r\n            @param    currRow the current row to check\r\n            @param    currCol the current column to check\r\n            @return   true if there's a cell above that belongs to a rowspan\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.AddCell(System.String)\">\r\n            Adds a cell element.\r\n            @param text the text for the cell\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.AddCell(iTextSharp.text.pdf.PdfPTable)\">\r\n            Adds a nested table.\r\n            @param table the table to be added to the cell\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.AddCell(iTextSharp.text.Image)\">\r\n            Adds an Image as Cell.\r\n            @param image the <CODE>Image</CODE> to add to the table.\r\n                         This image will fit in the cell\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.AddCell(iTextSharp.text.Phrase)\">\r\n            Adds a cell element.\r\n            @param phrase the <CODE>Phrase</CODE> to be added to the cell\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPTable.WriteSelectedRows(System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPTable.WriteSelectedRows(System.Int32,System.Int32,System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.WriteSelectedRows(System.Int32,System.Int32,System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte[],System.Boolean)\">\r\n             Writes the selected rows and columns to the document.\r\n             This method does not clip the columns; this is only important\r\n             if there are columns with colspan at boundaries.\r\n             <CODE>canvases</CODE> is obtained from <CODE>beginWritingRows()</CODE>.\r\n             The table event is only fired for complete rows.\r\n            \r\n             @param colStart  the first column to be written, zero index\r\n             @param colEnd    the last column to be written + 1. If it is -1 all the\r\n                              columns to the end are written\r\n             @param rowStart  the first row to be written, zero index\r\n             @param rowEnd    the last row to be written + 1. If it is -1 all the\r\n                              rows to the end are written\r\n             @param xPos      the x write coordinate\r\n             @param yPos      the y write coordinate\r\n             @param canvases  an array of 4 <CODE>PdfContentByte</CODE> obtained from\r\n                              <CODE>beginWritingRows()</CODE>\r\n             @param   reusable if set to false, the content in the cells is \"consumed\";\r\n             if true, you can reuse the cells, the row, the parent table as many times you want.\r\n             @return the y coordinate position of the bottom of the last row\r\n             @see #beginWritingRows(com.itextpdf.text.pdf.PdfContentByte)\r\n             @since 5.1.0 added the reusable parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.WriteSelectedRows(System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte)\">\r\n            Writes the selected rows to the document.\r\n            \r\n            @param rowStart   the first row to be written, zero index\r\n            @param rowEnd     the last row to be written + 1. If it is -1 all the\r\n                              rows to the end are written\r\n            @param xPos       the x write coodinate\r\n            @param yPos       the y write coodinate\r\n            @param canvas     the <CODE>PdfContentByte</CODE> where the rows will\r\n                              be written to\r\n            @return the y coordinate position of the bottom of the last row\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPTable.WriteSelectedRows(System.Int32,System.Int32,System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.WriteSelectedRows(System.Int32,System.Int32,System.Int32,System.Int32,System.Single,System.Single,iTextSharp.text.pdf.PdfContentByte,System.Boolean)\">\r\n             Writes the selected rows and columns to the document.\r\n             This method clips the columns; this is only important\r\n             if there are columns with colspan at boundaries.\r\n             The table event is only fired for complete rows.\r\n            \r\n             @param colStart  the first column to be written, zero index\r\n             @param colEnd    the last column to be written + 1. If it is -1 all the\r\n                              columns to the end are written\r\n             @param rowStart  the first row to be written, zero index\r\n             @param rowEnd    the last row to be written + 1. If it is -1 all the\r\n                              rows to the end are written\r\n             @param xPos      the x write coordinate\r\n             @param yPos      the y write coordinate\r\n             @param canvas    the <CODE>PdfContentByte</CODE> where the rows will\r\n                              be written to     \r\n             @return the y coordinate position of the bottom of the last row\r\n             @param   reusable if set to false, the content in the cells is \"consumed\";\r\n             if true, you can reuse the cells, the row, the parent table as many times you want.\r\n             @since 5.1.0 added the reusable parameter\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfPTable.BeginWritingRows(iTextSharp.text.pdf.PdfContentByte)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.EndWritingRows(iTextSharp.text.pdf.PdfContentByte[])\">\r\n            Finishes writing the table.\r\n            @param canvases the array returned by <CODE>beginWritingRows()</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.Size\">\r\n            Gets the number of rows in this table.\r\n            @return the number of rows in this table\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.TotalHeight\">\r\n            Gets the total height of the table.\r\n            @return the total height of the table\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetRowHeight(System.Int32)\">\r\n            Gets the height of a particular row.\r\n            @param idx the row index (starts at 0)\r\n            @return the height of a particular row\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetRowHeight(System.Int32,System.Boolean)\">\r\n            Gets the height of a particular row.\r\n            \r\n            @param idx        the row index (starts at 0)\r\n            @param firsttime  is this the first time the row heigh is calculated?\r\n            @return the height of a particular row\r\n            @since 5.0.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetRowspanHeight(System.Int32,System.Int32)\">\r\n            Gets the maximum height of a cell in a particular row (will only be different\r\n            from getRowHeight is one of the cells in the row has a rowspan > 1).\r\n            \r\n            @param rowIndex    the row index\r\n            @param cellIndex   the cell index\r\n            @return the height of a particular row including rowspan\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.HasRowspan(System.Int32)\">\r\n            Checks if a cell in a row has a rowspan greater than 1.\r\n            \r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.NormalizeHeadersFooters\">\r\n            Makes sure the footers value is lower than the headers value.\r\n            \r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.HeaderHeight\">\r\n            Gets the height of the rows that constitute the header as defined by\r\n            <CODE>setHeaderRows()</CODE>.\r\n            @return the height of the rows that constitute the header and footer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.FooterHeight\">\r\n            Gets the height of the rows that constitute the header as defined by\r\n            <CODE>setFooterRows()</CODE>.\r\n            @return the height of the rows that constitute the footer\r\n            @since 2.1.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.DeleteRow(System.Int32)\">\r\n            Deletes a row from the table.\r\n            @param rowNumber the row to be deleted\r\n            @return <CODE>true</CODE> if the row was deleted\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.DeleteLastRow\">\r\n            Deletes the last row in the table.\r\n            @return <CODE>true</CODE> if the last row was deleted\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.DeleteBodyRows\">\r\n            Removes all of the rows except headers\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.NumberOfColumns\">\r\n            Returns the number of columns.\r\n            @return  the number of columns.\r\n            @since   2.1.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.Chunks\">\r\n             Gets all the chunks in this element.\r\n            \r\n             @return    an <CODE>List</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.Type\">\r\n             Gets the type of the text element.\r\n            \r\n             @return    a type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.IsContent\">\r\n            @since   iText 2.0.8\r\n            @see com.lowagie.text.Element#isContent()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.IsNestable\">\r\n            @since   iText 2.0.8\r\n            @see com.lowagie.text.Element#isNestable()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.Process(iTextSharp.text.IElementListener)\">\r\n             Processes the element by adding it (or the different parts) to an\r\n             <CODE>ElementListener</CODE>.\r\n            \r\n             @param    listener    an <CODE>ElementListener</CODE>\r\n             @return    <CODE>true</CODE> if the element was processed successfully\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetRow(System.Int32)\">\r\n             Gets a row with a given index.\r\n            \r\n             @param idx\r\n             @return the row at position idx\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.getLastCompletedRowIndex\">\r\n             Returns the index of the last completed row.\r\n            \r\n             @return the index of a row\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SetBreakPoints(System.Int32[])\">\r\n             Defines where the table may be broken (if necessary).\r\n            \r\n             @param breakPoints int[]\r\n             @throws System.IndexOutOfRangeException if a row index is passed that is out of bounds\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.KeepRowsTogether(System.Int32[])\">\r\n             Defines which rows should not allow a page break (if possible).\r\n            \r\n             @param rows int[]\r\n             @throws System.IndexOutOfRangeException if a row index is passed that is out of bounds\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.KeepRowsTogether(System.Int32,System.Int32)\">\r\n             Defines a range of rows that should not allow a page break (if possible).\r\n            \r\n             @param start int\r\n             @param end int\r\n             @throws System.IndexOutOfRangeException if a row index is passed that is out of bounds\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.KeepRowsTogether(System.Int32)\">\r\n             Defines a range of rows (from the parameter to the last row) that should not allow a page break (if possible).\r\n             The equivalent of calling {@link #keepRowsTogether(int,int) keepRowsTogether(start, rows.size()}.\r\n            \r\n             @param start int\r\n             @throws System.IndexOutOfRangeException if a row index is passed that is out of bounds\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.Rows\">\r\n            Gets an arraylist with all the rows in the table.\r\n            @return an arraylist\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetRows(System.Int32,System.Int32)\">\r\n            Gets an arraylist with a selection of rows.\r\n            @param    start   the first row in the selection\r\n            @param    end     the first row that isn't part of the selection\r\n            @return a selection of rows\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.AdjustCellsInRow(System.Int32,System.Int32)\">\r\n            Calculates the extra height needed in a row because of rowspans.\r\n            @param    start   the index of the start row (the one to adjust)\r\n            @param    end     the index of the end row on the page\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.TableEvent\">\r\n             Sets the table event for this table.\r\n            \r\n             @param event the table event for this table\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.AbsoluteWidths\">\r\n            Gets the absolute sizes of each column width.\r\n            @return he absolute sizes of each column width\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.SkipLastFooter\">\r\n            Tells you if the last footer needs to be skipped\r\n            (for instance if the footer says \"continued on the next page\")\r\n            \r\n            @return Value of property skipLastFooter.\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.SetExtendLastRow(System.Boolean,System.Boolean)\">\r\n            When set the last row on every page will be extended to fill\r\n            all the remaining space to the bottom boundary; except maybe the\r\n            row.\r\n            \r\n            @param extendLastRows true to extend the last row on each page; false otherwise\r\n            @param extendFinalRow false if you don't want to extend the row of the complete table\r\n            @since iText 5.0.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.IsExtendLastRow(System.Boolean)\">\r\n                    * Gets the value of the last row extension, taking into account\r\n                    * if the row is reached or not.\r\n                    * \r\n                    * @return true if the last row will extend; \r\n                     *        false otherwise\r\n                    * @since iText 5.0.0\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.KeepTogether\">\r\n             If true the table will be kept on one page if it fits, by forcing a \r\n             new page if it doesn't fit on the current page. The default is to\r\n             split the table over multiple pages.\r\n            \r\n             @param p_KeepTogether whether to try to keep the table on one page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.CompleteRow\">\r\n            Completes the current row with the default cell. An incomplete row will be dropped\r\n            but calling this method will make sure that it will be present in the table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.FlushContent\">\r\n            @since   iText 2.0.8\r\n            @see com.lowagie.text.LargeElement#flushContent()\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfPTable.ElementComplete\">\r\n            @since   iText 2.0.8\r\n            @see com.lowagie.text.LargeElement#isComplete()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetCellStartRowIndex(System.Int32,System.Int32)\">\r\n            Gets row index where cell overlapping (rowIdx, colIdx) starts\r\n            @param rowIdx\r\n            @param colIdx\r\n            @return row index\r\n            @since iText 5.4.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPTable.FittingRows\">\r\n            \r\n            @since iText 5.4.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.FittingRows.CorrectLastRowChosen(iTextSharp.text.pdf.PdfPTable,System.Int32)\">\r\n             Correct chosen last fitting row so that the content of all cells with open rowspans will fit on the page,\r\n             i.e. the cell content won't be split.\r\n            (Only to be used with splitLate == true)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPTable.ColumnMeasurementState\">\r\n            \r\n            @since iText 5.4.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfPTable.GetFittingRows(System.Single,System.Int32)\">\r\n            Determine which rows fit on the page, respecting isSplitLate().\r\n            Note: sets max heights of the inspected rows as a side effect,\r\n            just like PdfPTable.getRowHeight(int, boolean) does.\r\n            Respect row.getMaxHeights() if it has been previously set (which might be independent of the height of\r\n            individual cells).\r\n            The last row written on the page will be chosen by the caller who might choose not\r\n            the calculated one but an earlier one (due to mayNotBreak settings on the rows).\r\n            The height of the chosen last row has to be corrected if splitLate == true\r\n            by calling FittingRows.correctLastRowChosen() by the caller to avoid splitting the content of\r\n            cells with open rowspans.\r\n            \r\n            @since iText 5.4.3\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.IPdfPTableEventAfterSplit.AfterSplitTable(iTextSharp.text.pdf.PdfPTable,iTextSharp.text.pdf.PdfPRow,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.PdfPublicKeySecurityHandler\">\r\n            @author Aiken Sam (aikensam@ieee.org)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfReader\">\r\n            Reads a PDF document.\r\n            @author Paulo Soares\r\n            @author Kazuya Ujihara\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfReader.unethicalreading\">\r\n            The iText developers are not responsible if you decide to change the\r\n            value of this static parameter.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfReader.memoryLimitsAwareHandler\">\r\n            Handler which will be used for decompression of pdf streams.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfReader.appendable\">\r\n            Holds value of property appendable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.io.IRandomAccessSource,System.Boolean,System.Byte[],Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Crypto.ICipherParameters,System.Boolean)\">\r\n            Constructs a new PdfReader.  This is the master constructor.\r\n            @param byteSource source of bytes for the reader\r\n            @param partialRead if true, the reader is opened in partial mode (PDF is parsed on demand), if false, the entire PDF is parsed into memory as the reader opens\r\n            @param ownerPassword the password or null if no password is required\r\n            @param certificate the certificate or null if no certificate is required\r\n            @param certificateKey the key or null if no certificate key is required\r\n            @param certificateKeyProvider the name of the key provider, or null if no key is required\r\n            @param closeSourceOnConstructorError if true, the byteSource will be closed if there is an error during construction of this reader\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.pdf.ReaderProperties,iTextSharp.text.io.IRandomAccessSource)\">\r\n            Constructs a new PdfReader.  This is the master constructor.\r\n            @param byteSource source of bytes for the reader\r\n            @param properties the properties which will be used to create the reader\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.String)\">\r\n            Reads and parses a PDF document.\r\n            @param filename the file name of the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.pdf.ReaderProperties,System.String)\">\r\n            Reads and parses a PDF document.\r\n            @param filename the file name of the document\r\n            @param properties the properties which will be used to create the reader\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.String,System.Byte[])\">\r\n            Reads and parses a PDF document.\r\n            @param filename the file name of the document\r\n            @param ownerPassword the password to read the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.String,System.Byte[],System.Boolean)\">\r\n            Reads and parses a PDF document.\r\n            @param filename the file name of the document\r\n            @param ownerPassword the password to read the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.Byte[])\">\r\n            Reads and parses a PDF document.\r\n            @param pdfIn the byte array with the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.Byte[],System.Byte[])\">\r\n            Reads and parses a PDF document.\r\n            @param pdfIn the byte array with the document\r\n            @param ownerPassword the password to read the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.String,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            Reads and parses a PDF document.\r\n            @param filename the file name of the document\r\n            @param certificate the certificate to read the document\r\n            @param certificateKey the private key of the certificate\r\n            @param certificateKeyProvider the security provider for certificateKey\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.Uri)\">\r\n            Reads and parses a PDF document.\r\n            @param url the Uri of the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.Uri,System.Byte[])\">\r\n            Reads and parses a PDF document.\r\n            @param url the Uri of the document\r\n            @param ownerPassword the password to read the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.IO.Stream,System.Byte[])\">\r\n            Reads and parses a PDF document.\r\n            @param is the <CODE>InputStream</CODE> containing the document. The stream is read to the\r\n            end but is not closed\r\n            @param ownerPassword the password to read the document\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.pdf.ReaderProperties,System.IO.Stream)\">\r\n            Reads and parses a PDF document.\r\n            @param properties the properties which will be used to create the reader\r\n            @param isp the <CODE>InputStream</CODE> containing the document. The stream is read to the\r\n            end but is not closed\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(System.IO.Stream)\">\r\n            Reads and parses a PDF document.\r\n            @param isp the <CODE>InputStream</CODE> containing the document. The stream is read to the\r\n            end but is not closed\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Byte[])\">\r\n            Reads and parses a pdf document. Contrary to the other constructors only the xref is read\r\n            into memory. The reader is said to be working in \"partial\" mode as only parts of the pdf\r\n            are read as needed.\r\n            @param raf the document location\r\n            @param ownerPassword the password or <CODE>null</CODE> for no password\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray,System.Byte[],System.Boolean)\">\r\n            Reads and parses a pdf document.\r\n            @param raf the document location\r\n            @param ownerPassword the password or <CODE>null</CODE> for no password\r\n            @param partial indicates if the reader needs to read the document only partially. See {@link PdfReader#PdfReader(RandomAccessFileOrArray, byte[])}\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.#ctor(iTextSharp.text.pdf.PdfReader)\">\r\n            Creates an independent duplicate.\r\n            @param reader the <CODE>PdfReader</CODE> to duplicate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetOffsetTokeniser(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Utility method that checks the provided byte source to see if it has junk bytes at the beginning.  If junk bytes\r\n            are found, construct a tokeniser that ignores the junk.  Otherwise, construct a tokeniser for the byte source as it is\r\n            @param byteSource the source to check\r\n            @return a tokeniser that is guaranteed to start at the PDF header\r\n            @throws IOException if there is a problem reading the byte source\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.SafeFile\">\r\n            Gets a new file instance of the original PDF\r\n            document.\r\n            @return a new file instance of the original PDF document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.NumberOfPages\">\r\n            Gets the number of pages in the document.\r\n            @return the number of pages in the document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.Catalog\">\r\n            Returns the document's catalog. This dictionary is not a copy,\r\n            any changes will be reflected in the catalog.\r\n            @return the document's catalog\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.AcroForm\">\r\n            Returns the document's acroform, if it has one.\r\n            @return the document's acroform\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageRotation(System.Int32)\">\r\n            Gets the page rotation. This value can be 0, 90, 180 or 270.\r\n            @param index the page number. The first page is 1\r\n            @return the page rotation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageSizeWithRotation(System.Int32)\">\r\n            Gets the page size, taking rotation into account. This\r\n            is a <CODE>Rectangle</CODE> with the value of the /MediaBox and the /Rotate key.\r\n            @param index the page number. The first page is 1\r\n            @return a <CODE>Rectangle</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageSizeWithRotation(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Gets the rotated page from a page dictionary.\r\n            @param page the page dictionary\r\n            @return the rotated page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageSize(System.Int32)\">\r\n            Gets the page size without taking rotation into account. This\r\n            is the value of the /MediaBox key.\r\n            @param index the page number. The first page is 1\r\n            @return the page size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageSize(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Gets the page from a page dictionary\r\n            @param page the page dictionary\r\n            @return the page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetCropBox(System.Int32)\">\r\n            Gets the crop box without taking rotation into account. This\r\n            is the value of the /CropBox key. The crop box is the part\r\n            of the document to be displayed or printed. It usually is the same\r\n            as the media box but may be smaller. If the page doesn't have a crop\r\n            box the page size will be returned.\r\n            @param index the page number. The first page is 1\r\n            @return the crop box\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetBoxSize(System.Int32,System.String)\">\r\n            Gets the box size. Allowed names are: \"crop\", \"trim\", \"art\", \"bleed\" and \"media\".\r\n            @param index the page number. The first page is 1\r\n            @param boxName the box name\r\n            @return the box rectangle or null\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.Info\">\r\n            Returns the content of the document information dictionary as a <CODE>Hashtable</CODE>\r\n            of <CODE>String</CODE>.\r\n            @return content of the document information dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetNormalizedRectangle(iTextSharp.text.pdf.PdfArray)\">\r\n            Normalizes a <CODE>Rectangle</CODE> so that llx and lly are smaller than urx and ury.\r\n            @param box the original rectangle\r\n            @return a normalized <CODE>Rectangle</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.IsTagged\">\r\n            Checks if the PDF is a tagged PDF.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ReadPdf\">\r\n            Parses the entire PDF\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ReadDecryptedDocObj\">\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPdfObjectRelease(iTextSharp.text.pdf.PdfObject)\">\r\n            @param obj\r\n            @return a PdfObject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPdfObject(iTextSharp.text.pdf.PdfObject)\">\r\n            Reads a <CODE>PdfObject</CODE> resolving an indirect reference\r\n            if needed.\r\n            @param obj the <CODE>PdfObject</CODE> to read\r\n            @return the resolved <CODE>PdfObject</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPdfObjectRelease(iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfObject)\">\r\n            Reads a <CODE>PdfObject</CODE> resolving an indirect reference\r\n            if needed. If the reader was opened in partial mode the object will be released\r\n            to save memory.\r\n            @param obj the <CODE>PdfObject</CODE> to read\r\n            @param parent\r\n            @return a PdfObject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPdfObject(iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfObject)\">\r\n            @param obj\r\n            @param parent\r\n            @return a PdfObject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPdfObjectRelease(System.Int32)\">\r\n            @param idx\r\n            @return a PdfObject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPdfObject(System.Int32)\">\r\n            @param idx\r\n            @return aPdfObject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ResetLastXrefPartial\">\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ReleaseLastXrefPartial\">\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ReleaseLastXrefPartial(iTextSharp.text.pdf.PdfObject)\">\r\n            @param obj\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.AddPdfObject(iTextSharp.text.pdf.PdfObject)\">\r\n            @param obj\r\n            @return an indirect reference\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.DumpPerc\">\r\n            @return the percentage of the cross reference table that has been read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.KillIndirect(iTextSharp.text.pdf.PdfObject)\">\r\n            Eliminates the reference to the object freeing the memory used by it and clearing\r\n            the xref entry.\r\n            @param obj the object. If it's an indirect reference it will be eliminated\r\n            @return the object or the already erased dereferenced object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.FlateDecode(System.Byte[])\">\r\n            Decodes a stream that has the FlateDecode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.FlateDecode(System.Byte[],System.IO.MemoryStream)\">\r\n            Decodes a stream that has the FlateDecode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.DecodePredictor(System.Byte[],iTextSharp.text.pdf.PdfObject)\">\r\n            @param in\r\n            @param dicPar\r\n            @return a byte array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.FlateDecode(System.Byte[],System.Boolean)\">\r\n            A helper to FlateDecode.\r\n            @param in the input data\r\n            @param strict <CODE>true</CODE> to read a correct stream. <CODE>false</CODE>\r\n            to try to read a corrupted stream\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.FlateDecode(System.Byte[],System.Boolean,System.IO.MemoryStream)\">\r\n            A helper to FlateDecode.\r\n            @param in the input data\r\n            @param strict <CODE>true</CODE> to read a correct stream. <CODE>false</CODE>\r\n            to try to read a corrupted stream\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ASCIIHexDecode(System.Byte[])\">\r\n            Decodes a stream that has the ASCIIHexDecode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ASCIIHexDecode(System.Byte[],System.IO.MemoryStream)\">\r\n            Decodes a stream that has the ASCIIHexDecode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ASCII85Decode(System.Byte[])\">\r\n            Decodes a stream that has the ASCII85Decode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ASCII85Decode(System.Byte[],System.IO.MemoryStream)\">\r\n            Decodes a stream that has the ASCII85Decode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.LZWDecode(System.Byte[])\">\r\n            Decodes a stream that has the LZWDecode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.LZWDecode(System.Byte[],System.IO.MemoryStream)\">\r\n            Decodes a stream that has the LZWDecode filter.\r\n            @param in the input data\r\n            @return the decoded data\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.IsRebuilt\">\r\n            Checks if the document had errors and was rebuilt.\r\n             @return true if rebuilt.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageN(System.Int32)\">\r\n            Gets the dictionary that represents a page.\r\n            @param pageNum the page number. 1 is the first\r\n            @return the page dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageNRelease(System.Int32)\">\r\n            @param pageNum\r\n            @return a Dictionary object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ReleasePage(System.Int32)\">\r\n            @param pageNum\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ResetReleasePage\">\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageOrigRef(System.Int32)\">\r\n            Gets the page reference to this page.\r\n            @param pageNum the page number. 1 is the first\r\n            @return the page reference\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageContent(System.Int32,iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Gets the contents of the page.\r\n            @param pageNum the page number. 1 is the first\r\n            @param file the location of the PDF document\r\n            @throws IOException on error\r\n            @return the content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageContent(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Gets the content from the page dictionary.\r\n            @param page the page dictionary\r\n            @throws IOException on error\r\n            @return the content\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageResources(System.Int32)\">\r\n            Retrieve the given page's resource dictionary\r\n            @param pageNum 1-based page number from which to retrieve the resource dictionary\r\n            @return The page's resources, or 'null' if the page has none.\r\n            @since 5.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageResources(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Retrieve the given page's resource dictionary\r\n            @param pageDict the given page\r\n            @return The page's resources, or 'null' if the page has none.\r\n            @since 5.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetPageContent(System.Int32)\">\r\n            Gets the contents of the page.\r\n            @param pageNum the page number. 1 is the first\r\n            @throws IOException on error\r\n            @return the content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.SetPageContent(System.Int32,System.Byte[])\">\r\n            Sets the contents of the page.\r\n            @param content the new page content\r\n            @param pageNum the page number. 1 is the first\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.SetPageContent(System.Int32,System.Byte[],System.Int32,System.Boolean)\">\r\n            Sets the contents of the page.\r\n            @param content the new page content\r\n            @param pageNum the page number. 1 is the first\r\n            @since   2.1.3   (the method already existed without param compressionLevel)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.DecodeBytes(System.Byte[],iTextSharp.text.pdf.PdfDictionary)\">\r\n            Decode a byte[] applying the filters specified in the provided dictionary using default filter handlers.\r\n            @param b the bytes to decode\r\n            @param streamDictionary the dictionary that contains filter information\r\n            @return the decoded bytes\r\n            @throws IOException if there are any problems decoding the bytes\r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.DecodeBytes(System.Byte[],iTextSharp.text.pdf.PdfDictionary,System.Collections.Generic.IDictionary{iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.FilterHandlers.IFilterHandler})\">\r\n            Decode a byte[] applying the filters specified in the provided dictionary using the provided filter handlers.\r\n            @param b the bytes to decode\r\n            @param streamDictionary the dictionary that contains filter information\r\n            @param filterHandlers the map used to look up a handler for each type of filter\r\n            @return the decoded bytes\r\n            @throws IOException if there are any problems decoding the bytes\r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetStreamBytes(iTextSharp.text.pdf.PRStream,iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Get the content from a stream applying the required filters.\r\n            @param stream the stream\r\n            @param file the location where the stream is\r\n            @throws IOException on error\r\n            @return the stream content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetStreamBytes(iTextSharp.text.pdf.PRStream)\">\r\n            Get the content from a stream applying the required filters.\r\n            @param stream the stream\r\n            @throws IOException on error\r\n            @return the stream content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetStreamBytesRaw(iTextSharp.text.pdf.PRStream,iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Get the content from a stream as it is without applying any filter.\r\n            @param stream the stream\r\n            @param file the location where the stream is\r\n            @throws IOException on error\r\n            @return the stream content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetStreamBytesRaw(iTextSharp.text.pdf.PRStream)\">\r\n            Get the content from a stream as it is without applying any filter.\r\n            @param stream the stream\r\n            @throws IOException on error\r\n            @return the stream content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.EliminateSharedStreams\">\r\n            Eliminates shared streams if they exist. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.Tampered\">\r\n            Sets the tampered state. A tampered PdfReader cannot be reused in PdfStamper.\r\n            @param tampered the tampered state\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.Metadata\">\r\n            Gets the XML metadata.\r\n            @throws IOException on error\r\n            @return the XML metadata\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.LastXref\">\r\n            Gets the byte address of the last xref table.\r\n            @return the byte address of the last xref table\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.XrefSize\">\r\n            Gets the number of xref objects.\r\n            @return the number of xref objects\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.EofPos\">\r\n            Gets the byte address of the %%EOF marker.\r\n            @return the byte address of the %%EOF marker\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.PdfVersion\">\r\n            Gets the PDF version. Only the last version char is returned. For example\r\n            version 1.4 is returned as '4'.\r\n            @return the PDF version\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.IsEncrypted\">\r\n            Returns <CODE>true</CODE> if the PDF is encrypted.\r\n            @return <CODE>true</CODE> if the PDF is encrypted\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.Permissions\">\r\n            Gets the encryption permissions. It can be used directly in\r\n            <CODE>PdfWriter.SetEncryption()</CODE>.\r\n            @return the encryption permissions\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.Is128Key\">\r\n            Returns <CODE>true</CODE> if the PDF has a 128 bit key encryption.\r\n            @return <CODE>true</CODE> if the PDF has a 128 bit key encryption\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.Trailer\">\r\n            Gets the trailer dictionary\r\n            @return the trailer dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ShuffleSubsetNames\">\r\n            Finds all the font subsets and changes the prefixes to some\r\n            random values.\r\n            @return the number of font subsets altered\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.CreateFakeFontSubsets\">\r\n            Finds all the fonts not subset but embedded and marks them as subset.\r\n            @return the number of fonts altered\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetNamedDestination\">\r\n            Gets all the named destinations as an <CODE>Hashtable</CODE>. The key is the name\r\n            and the value is the destinations array.\r\n            @return gets all the named destinations\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetNamedDestination(System.Boolean)\">\r\n            Gets all the named destinations as an <CODE>HashMap</CODE>. The key is the name\r\n            and the value is the destinations array.\r\n            @param   keepNames   true if you want the keys to be real PdfNames instead of Strings\r\n            @return gets all the named destinations\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetNamedDestinationFromNames\">\r\n            Gets the named destinations from the /Dests key in the catalog as an <CODE>Hashtable</CODE>. The key is the name\r\n            and the value is the destinations array.\r\n            @return gets the named destinations\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetNamedDestinationFromNames(System.Boolean)\">\r\n            Gets the named destinations from the /Dests key in the catalog as an <CODE>HashMap</CODE>. The key is the name\r\n            and the value is the destinations array.\r\n            @param   keepNames   true if you want the keys to be real PdfNames instead of Strings\r\n            @return gets the named destinations\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetNamedDestinationFromStrings\">\r\n            Gets the named destinations from the /Names key in the catalog as an <CODE>Hashtable</CODE>. The key is the name\r\n            and the value is the destinations array.\r\n            @return gets the named destinations\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.RemoveFields\">\r\n            Removes all the fields from the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.RemoveAnnotations\">\r\n            Removes all the annotations and fields from the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.MakeRemoteNamedDestinationsLocal\">\r\n            Replaces remote named links with local destinations that have the same name.\r\n            @since   5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ConvertNamedDestination(iTextSharp.text.pdf.PdfObject,System.Collections.Generic.Dictionary{System.Object,iTextSharp.text.pdf.PdfObject})\">\r\n            Converts a remote named destination GoToR with a local named destination\r\n            if there's a corresponding name.\r\n            @param   obj an annotation that needs to be screened for links to external named destinations.\r\n            @param   names   a map with names of local named destinations\r\n            @since   iText 5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ConsolidateNamedDestinations\">\r\n            Replaces all the local named links with the actual destinations. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.Close\">\r\n            Closes the reader, and any underlying stream or data source used to create the reader\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.RemoveUnusedObjects\">\r\n            Removes all the unreachable objects.\r\n            @return the number of indirect objects removed\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.AcroFields\">\r\n            Gets a read-only version of <CODE>AcroFields</CODE>.\r\n            @return a read-only version of <CODE>AcroFields</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetJavaScript(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Gets the global document JavaScript.\r\n            @param file the document file\r\n            @throws IOException on error\r\n            @return the global document JavaScript\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.JavaScript\">\r\n            Gets the global document JavaScript.\r\n            @throws IOException on error\r\n            @return the global document JavaScript\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.SelectPages(System.String)\">\r\n            Selects the pages to keep in the document. The pages are described as\r\n            ranges. The page ordering can be changed but\r\n            no page repetitions are allowed. Note that it may be very slow in partial mode.\r\n            @param ranges the comma separated ranges as described in {@link SequenceList}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.SelectPages(System.Collections.Generic.ICollection{System.Int32})\">\r\n            Selects the pages to keep in the document. The pages are described as a\r\n            <CODE>List</CODE> of <CODE>Integer</CODE>. The page ordering can be changed but\r\n            no page repetitions are allowed. Note that it may be very slow in partial mode.\r\n            @param pagesToKeep the pages to keep in the document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.SelectPages(System.Collections.Generic.ICollection{System.Int32},System.Boolean)\">\r\n            Selects the pages to keep in the document. The pages are described as a\r\n            <CODE>List</CODE> of <CODE>Integer</CODE>. The page ordering can be changed but\r\n            no page repetitions are allowed. Note that it may be very slow in partial mode.\r\n            @param pagesToKeep the pages to keep in the document\r\n            @param removeUnused indicate if to remove unsed objects. @see removeUnusedObjects\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.ViewerPreferences\">\r\n            Sets the viewer preferences as the sum of several constants.\r\n            @param preferences the viewer preferences\r\n            @see PdfViewerPreferences#setViewerPreferences\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Adds a viewer preference\r\n            @param key a key for a viewer preference\r\n            @param value a value for the viewer preference\r\n            @see PdfViewerPreferences#addViewerPreference\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.SimpleViewerPreferences\">\r\n            Returns a bitset representing the PageMode and PageLayout viewer preferences.\r\n            Doesn't return any information about the ViewerPreferences dictionary.\r\n            @return an int that contains the Viewer Preferences.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.IsNewXrefType\">\r\n            Getter for property newXrefType.\r\n            @return Value of property newXrefType.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.FileLength\">\r\n            Getter for property fileLength.\r\n            @return Value of property fileLength.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.IsHybridXref\">\r\n            Getter for property hybridXref.\r\n            @return Value of property hybridXref.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfReader.PageRefs.pagesNodes\">\r\n            Keeps track of all pages nodes to avoid circular references.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.PageRefs.GetPageN(System.Int32)\">\r\n            Gets the dictionary that represents a page.\r\n            @param pageNum the page number. 1 is the first\r\n            @return the page dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.PageRefs.GetPageNRelease(System.Int32)\">\r\n            @param pageNum\r\n            @return a dictionary object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.PageRefs.GetPageOrigRefRelease(System.Int32)\">\r\n            @param pageNum\r\n            @return an indirect reference\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.PageRefs.GetPageOrigRef(System.Int32)\">\r\n            Gets the page reference to this page.\r\n            @param pageNum the page number. 1 is the first\r\n            @return the page reference\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.PageRefs.ReleasePage(System.Int32)\">\r\n            @param pageNum\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.PageRefs.ResetReleasePage\">\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.HasUsageRights\">\r\n             Checks if this PDF has usage rights enabled.\r\n            \r\n             @return <code>true</code> if usage rights are present; <code>false</code> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.RemoveUsageRights\">\r\n            Removes any usage rights that this PDF may have. Only Adobe can grant usage rights\r\n            and any PDF modification with iText will invalidate them. Invalidated usage rights may\r\n            confuse Acrobat and it's advisabe to remove them altogether.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.GetCertificationLevel\">\r\n            Gets the certification level for this document. The return values can be <code>PdfSignatureAppearance.NOT_CERTIFIED</code>, \r\n            <code>PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED</code>,\r\n            <code>PdfSignatureAppearance.CERTIFIED_FORM_FILLING</code> and\r\n            <code>PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS</code>.\r\n            <p>\r\n            No signature validation is made, use the methods availabe for that in <CODE>AcroFields</CODE>.\r\n            </p>\r\n            @return gets the certification level for this document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfReader.IsOpenedWithFullPermissions\">\r\n            Checks if the document was opened with the owner password so that the end application\r\n            can decide what level of access restrictions to apply. If the document is not encrypted\r\n            it will return <CODE>true</CODE>.\r\n            @return <CODE>true</CODE> if the document was opened with the owner password or if it's not encrypted,\r\n            <CODE>false</CODE> if the document was opened with the user password\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReader.ComputeUserPassword\">\r\n             Computes user password if standard encryption handler is used with Standard40, Standard128 or AES128 encryption algorithm.\r\n            \r\n             @return user password, or null if not a standard encryption handler was used,\r\n                     if standard encryption handler was used with AES256 encryption algorithm,\r\n                     or if ownerPasswordUsed wasn't use to open the document.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfReaderInstance\">\r\n             Instance of PdfReader in each output document.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfReaderInstance.GetFormXObject(System.Int32,System.Int32)\">\r\n            Gets the content stream of a page as a PdfStream object.\r\n            @param   pageNumber          the page of which you want the stream\r\n            @param   compressionLevel    the compression level you want to apply to the stream\r\n            @return  a PdfStream object\r\n            @since   2.1.3 (the method already existed without param compressionLevel)\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfRectangle”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfRectangle.llx\">\r\n            lower left x \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfRectangle.lly\">\r\n            lower left y \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfRectangle.urx\">\r\n            upper right x \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfRectangle.ury\">\r\n            upper right y \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.#ctor(System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n             Constructs a <CODE>PdfRectangle</CODE>-object.\r\n            \r\n             @param       llx         lower left x\r\n             @param       lly         lower left y\r\n             @param       urx         upper right x\r\n             @param       ury         upper right y\r\n            \r\n             @since       rugPdf0.10\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.#ctor(System.Single,System.Single,System.Int32)\">\r\n             Constructs a <CODE>PdfRectangle</CODE>-object starting from the origin (0, 0).\r\n            \r\n             @param       urx         upper right x\r\n             @param       ury         upper right y\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.#ctor(iTextSharp.text.Rectangle,System.Int32)\">\r\n             Constructs a <CODE>PdfRectangle</CODE>-object with a <CODE>Rectangle</CODE>-object.\r\n            \r\n             @param   rectangle   a <CODE>Rectangle</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Rectangle\">\r\n            Returns the high level version of this PdfRectangle\r\n            @return this PdfRectangle translated to class Rectangle\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.Add(iTextSharp.text.pdf.PdfObject)\">\r\n             Overrides the <CODE>add</CODE>-method in <CODE>PdfArray</CODE> in order to prevent the adding of extra object to the array.\r\n            \r\n             @param       object          <CODE>PdfObject</CODE> to add (will not be added here)\r\n             @return      <CODE>false</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.Add(System.Single[])\">\r\n            Block changes to the underlying PdfArray\r\n            @param values stuff we'll ignore.  Ha!\r\n            @return false.  You can't add anything to a PdfRectangle\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.Add(System.Int32[])\">\r\n            Block changes to the underlying PdfArray\r\n            @param values stuff we'll ignore.  Ha!\r\n            @return false.  You can't add anything to a PdfRectangle\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.AddFirst(iTextSharp.text.pdf.PdfObject)\">\r\n            Block changes to the underlying PdfArray\r\n            @param object Ignored.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Left\">\r\n             Returns the lower left x-coordinate.\r\n            \r\n             @return      the lower left x-coordinaat\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Right\">\r\n             Returns the upper right x-coordinate.\r\n            \r\n             @return      the upper right x-coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Top\">\r\n             Returns the upper right y-coordinate.\r\n            \r\n             @return      the upper right y-coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Bottom\">\r\n             Returns the lower left y-coordinate.\r\n            \r\n             @return      the lower left y-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.GetLeft(System.Int32)\">\r\n             Returns the lower left x-coordinate, considering a given margin.\r\n            \r\n             @param       margin      a margin\r\n             @return      the lower left x-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.GetRight(System.Int32)\">\r\n             Returns the upper right x-coordinate, considering a given margin.\r\n            \r\n             @param       margin      a margin\r\n             @return      the upper right x-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.GetTop(System.Int32)\">\r\n             Returns the upper right y-coordinate, considering a given margin.\r\n            \r\n             @param       margin      a margin\r\n             @return      the upper right y-coordinate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfRectangle.GetBottom(System.Int32)\">\r\n             Returns the lower left y-coordinate, considering a given margin.\r\n            \r\n             @param       margin      a margin\r\n             @return      the lower left y-coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Width\">\r\n             Returns the width of the rectangle.\r\n            \r\n             @return      a width\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Height\">\r\n             Returns the height of the rectangle.\r\n            \r\n             @return      a height\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfRectangle.Rotate\">\r\n             Swaps the values of urx and ury and of lly and llx in order to rotate the rectangle.\r\n            \r\n             @return a <CODE>PdfRectangle</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfRendition\">\r\n            A Rendition dictionary (pdf spec 1.5)\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfResources”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfResources.#ctor\">\r\n            Constructs a PDF ResourcesDictionary.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfShading\">\r\n            Implements the shading dictionary (or stream).\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfShading.bBox\">\r\n            Holds value of property bBox. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfShading.antiAlias\">\r\n            Holds value of property antiAlias. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfShading.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates new PdfShading \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfShadingPattern\">\r\n            Implements the shading pattern dictionary.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfShadingPattern.#ctor(iTextSharp.text.pdf.PdfShading)\">\r\n            Creates new PdfShadingPattern \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSignature\">\r\n            Implements the signature dictionary.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignature.#ctor(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfName)\">\r\n            Creates new PdfSignature \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignature.SignatureCreator\">\r\n            Sets the signature creator name in the\r\n            {@link PdfSignatureBuildProperties} dictionary.\r\n            \r\n            @param name\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignature.PdfSignatureBuildProperties\">\r\n            Gets the {@link PdfSignatureBuildProperties} instance if it exists, if\r\n            not it adds a new one and returns this.\r\n            \r\n            @return {@link PdfSignatureBuildProperties}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSignatureAppearance\">\r\n            Class that takes care of the cryptographic options\r\n            and appearances that form a signature.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.#ctor(iTextSharp.text.pdf.PdfStamperImp)\">\r\n            Constructs a PdfSignatureAppearance object.\r\n            @param writer    the writer to which the signature will be written.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.NOT_CERTIFIED\">\r\n            Approval signature \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED\">\r\n            Author signature, no changes allowed \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.CERTIFIED_FORM_FILLING\">\r\n            Author signature, form filling allowed \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS\">\r\n            Author signature, form filling and annotations allowed \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.certificationLevel\">\r\n            The certification level \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.CertificationLevel\">\r\n            Sets the document type to certified instead of simply signed.\r\n            @param certificationLevel the values can be: <code>NOT_CERTIFIED</code>, <code>CERTIFIED_NO_CHANGES_ALLOWED</code>,\r\n            <code>CERTIFIED_FORM_FILLING</code> and <code>CERTIFIED_FORM_FILLING_AND_ANNOTATIONS</code>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.reasonCaption\">\r\n            The caption for the reason for signing. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.locationCaption\">\r\n            The caption for the location of signing. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.reason\">\r\n            The reason for signing. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.location\">\r\n            Holds value of property location. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.signDate\">\r\n            Holds value of property signDate. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Reason\">\r\n            Gets and setsthe signing reason.\r\n            @return the signing reason\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.ReasonCaption\">\r\n            Sets the caption for signing reason.\r\n            @param reasonCaption the signing reason caption\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Location\">\r\n            Gets and sets the signing location.\r\n            @return the signing location\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.LocationCaption\">\r\n            Sets the caption for the signing location.\r\n            @param locationCaption the signing location caption\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.signatureCreator\">\r\n            Holds value of the application that creates the signature \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.SignatureCreator\">\r\n             Gets the signature creator.\r\n             @return the signature creator\r\n            \r\n             Sets the name of the application used to create the signature.\r\n             @param signatureCreator the name of the signature creating application\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.contact\">\r\n            The contact name of the signer. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Contact\">\r\n            Gets the signing contact.\r\n            @return the signing contact\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.SignDate\">\r\n            Gets the signature date.\r\n            @return the signature date\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.raf\">\r\n            The file right before the signature is added (can be null). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.bout\">\r\n            The bytes of the file right before the signature is added (if raf is null) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.range\">\r\n            Array containing the byte positions of the bytes that need to be hashed. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfSignatureAppearance.GetRangeStream”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.GetUnderlyingSource\">\r\n            @return the underlying source\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.signCertificate\">\r\n            The signing certificate \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.AddDeveloperExtension(iTextSharp.text.pdf.PdfDeveloperExtension)\">\r\n            Adds the appropriate developer extension.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.cryptoDictionary\">\r\n            The crypto dictionary \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.CryptoDictionary\">\r\n            Gets the user made signature dictionary. This is the dictionary at the /V key.\r\n            @return the user made signature dictionary\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Certificate\">\r\n            Sets the certificate used to provide the text in the appearance.\r\n            This certificate doesn't take part in the actual signing process.\r\n            @param signCertificate the certificate \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSignatureAppearance.ISignatureEvent\">\r\n            An interface to retrieve the signature dictionary for modification.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.ISignatureEvent.GetSignatureDictionary(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Allows modification of the signature dictionary.\r\n            @param sig the signature dictionary\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.signatureEvent\">\r\n            Holds value of property signatureEvent.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.SignatureEvent\">\r\n            Sets the signature event to allow modification of the signature dictionary.\r\n            @param signatureEvent the signature event\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.fieldName\">\r\n            The name of the field \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.FieldName\">\r\n            Gets the field name.\r\n            @return the field name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.GetNewSigName\">\r\n            Gets a new signature field name that\r\n            doesn't clash with any existing name.\r\n            @return a new signature field name\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.page\">\r\n            The page where the signature will appear.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Page\">\r\n            Gets the page number of the field.\r\n            @return the page number of the field\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.rect\">\r\n            The coordinates of the rectangle for a visible signature,\r\n            or a zero-width, zero-height rectangle for an invisible signature.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Rect\">\r\n            Gets the rectangle representing the signature dimensions.\r\n            @return the rectangle representing the signature dimensions. It may be <CODE>null</CODE>\r\n            or have zero width or height for invisible signatures\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.pageRect\">\r\n            rectangle that represent the position and dimension of the signature in the page. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.PageRect\">\r\n            Gets the rectangle that represent the position and dimension of the signature in the page.\r\n            @return the rectangle that represent the position and dimension of the signature in the page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.IsInvisible\">\r\n            Gets the visibility status of the signature.\r\n            @return the visibility status of the signature\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.SetVisibleSignature(iTextSharp.text.Rectangle,System.Int32,System.String)\">\r\n            Sets the signature to be visible. It creates a new visible signature field.\r\n            @param pageRect the position and dimension of the field in the page\r\n            @param page the page to place the field. The fist page is 1\r\n            @param fieldName the field name or <CODE>null</CODE> to generate automatically a new field name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.SetVisibleSignature(System.String)\">\r\n            Sets the signature to be visible. An empty signature field with the same name must already exist.\r\n            @param fieldName the existing empty signature field name\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode\">\r\n            Signature rendering modes\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode.DESCRIPTION\">\r\n            The rendering mode is just the description.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION\">\r\n            The rendering mode is the name of the signer and the description.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION\">\r\n            The rendering mode is an image and the description.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode.GRAPHIC\">\r\n            The rendering mode is just an image.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.renderingMode\">\r\n            The rendering mode chosen for visible signatures \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.SignatureRenderingMode\">\r\n            Gets the rendering mode for this signature.\r\n            @return the rendering mode for this signature\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.signatureGraphic\">\r\n            The image that needs to be used for a visible signature \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.SignatureGraphic\">\r\n            Sets the Image object to render when Render is set to <CODE>RenderingMode.GRAPHIC</CODE>\r\n            or <CODE>RenderingMode.GRAPHIC_AND_DESCRIPTION</CODE>.\r\n            @param signatureGraphic image rendered. If <CODE>null</CODE> the mode is defaulted\r\n            to <CODE>RenderingMode.DESCRIPTION</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.acro6Layers\">\r\n            Appearance compliant with the recommendations introduced in Acrobat 6? \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Acro6Layers\">\r\n            Acrobat 6.0 and higher recommends that only layer n0 and n2 be present.\r\n            Use this method with value <code>false</code> if you want to ignore this recommendation.\r\n            @param acro6Layers if <code>true</code> only the layers n0 and n2 will be present\r\n            @deprecated Adobe no longer supports Adobe Acrobat / Reader versions older than 9\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.app\">\r\n            Layers for a visible signature. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfSignatureAppearance.GetLayer(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.reuseAppearance\">\r\n            Indicates if we need to reuse the existing appearance as layer 0. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.ReuseAppearance\">\r\n            Indicates that the existing appearances needs to be reused as layer 0.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.questionMark\">\r\n            An appearance that can be used for layer 1 (if acro6Layers is false). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.image\">\r\n            A background image for the text in layer 2. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Image\">\r\n            Gets the background image for the layer 2.\r\n            @return the background image for the layer 2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.imageScale\">\r\n            the scaling to be applied to the background image.t  \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.ImageScale\">\r\n            Sets the scaling to be applied to the background image. If it's zero the image\r\n            will fully fill the rectangle. If it's less than zero the image will fill the rectangle but\r\n            will keep the proportions. If it's greater than zero that scaling will be applied.\r\n            In any of the cases the image will always be centered. It's zero by default.\r\n            @param imageScale the scaling to be applied to the background image\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.layer2Text\">\r\n            The text that goes in Layer 2 of the signature appearance. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Layer2Text\">\r\n            Sets the signature text identifying the signer.\r\n            @param text the signature text identifying the signer. If <CODE>null</CODE> or not set\r\n            a standard description will be used\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.layer2Font\">\r\n            Font for the text in Layer 2. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Layer2Font\">\r\n            Sets the n2 and n4 layer font. If the font size is zero, auto-fit will be used.\r\n            @param layer2Font the n2 and n4 font\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.runDirection\">\r\n            Run direction for the text in layers 2 and 4. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.RunDirection\">\r\n            Sets the run direction in the n2 and n4 layer.\r\n            @param runDirection the run direction\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.layer4Text\">\r\n            The text that goes in Layer 4 of the appearance. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Layer4Text\">\r\n            Sets the text identifying the signature status. Will be ignored if acro6Layers is true.\r\n            @param text the text identifying the signature status. If <CODE>null</CODE> or not set\r\n            the description \"Signature Not Verified\" will be used\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.frm\">\r\n            Template containing all layers drawn on top of each other. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfSignatureAppearance.GetTopLayer”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.TOP_SECTION\">\r\n            extra space at the top. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.MARGIN\">\r\n            margin for the content inside the signature rectangle. \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfSignatureAppearance.GetAppearance”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.stamper\">\r\n            The PdfStamper that creates the signed PDF. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Stamper\">\r\n            Gets the <CODE>PdfStamper</CODE> associated with this instance.\r\n            @return the <CODE>PdfStamper</CODE> associated with this instance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.SetStamper(iTextSharp.text.pdf.PdfStamper)\">\r\n            Sets the PdfStamper\r\n            @param stamper PdfStamper\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.writer\">\r\n            The PdfStamperImp object corresponding with the stamper. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.sigout\">\r\n            A byte buffer containing the bytes of the Stamper. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.Sigout\">\r\n            Getter for the byte buffer.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.originalout\">\r\n            OutputStream for the bytes of the stamper. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.tempFile\">\r\n            Temporary file in case you don't want to sign in memory. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.TempFile\">\r\n            Gets the temporary file.\r\n            @return the temporary file or <CODE>null</CODE> is the document is created in memory\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.exclusionLocations\">\r\n            Name and content of keys that can only be added in the close() method. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.boutLen\">\r\n            Length of the output. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.preClosed\">\r\n            Indicates if the stamper has already been pre-closed. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSignatureAppearance.fieldLock\">\r\n            <summary>\r\n            Signature field lock dictionary.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfSignatureAppearance.FieldLockDict\">\r\n            <summary>\r\n            Signature field lock dictionary.\r\n            </summary>\r\n            <remarks>\r\n            If a signature is created on an existing signature field, then its /Lock dictionary \r\n            takes the precedence (if it exists).\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.IsPreClosed\">\r\n            Checks if the document is in the process of closing.\r\n            @return <CODE>true</CODE> if the document is in the process of closing,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfSignatureAppearance.PreClose(System.Collections.Generic.Dictionary{iTextSharp.text.pdf.PdfName,System.Int32})”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.AddDocMDP(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Adds keys to the signature dictionary that define\r\n            the certification level and the permissions.\r\n            This method is only used for Certifying signatures.\r\n            @param crypto the signature dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSignatureAppearance.AddFieldMDP(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfDictionary)\">\r\n            Adds keys to the signature dictionary that define\r\n            the field permissions.\r\n            This method is only used for signatures that lock fields.\r\n            @param crypto the signature dictionary\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfSignatureAppearance.Close(iTextSharp.text.pdf.PdfDictionary)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSmartCopy\">\r\n            PdfSmartCopy has the same functionality as PdfCopy,\r\n            but when resources (such as fonts, images,...) are\r\n            encountered, a reference to these resources is saved\r\n            in a cache, so that they can be reused.\r\n            This requires more memory, but reduces the file size\r\n            of the resulting PDF document.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfSmartCopy.streamMap\">\r\n            the cache with the streams and references. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSmartCopy.#ctor(iTextSharp.text.Document,System.IO.Stream)\">\r\n            Creates a PdfSmartCopy instance. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSmartCopy.CopyIndirect(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Translate a PRIndirectReference to a PdfIndirectReference\r\n            In addition, translates the object numbers, and copies the\r\n            referenced object to the output file if it wasn't available\r\n            in the cache yet. If it's in the cache, the reference to\r\n            the already used stream is returned.\r\n            \r\n            NB: PRIndirectReferences (and PRIndirectObjects) really need to know what\r\n            file they came from, because each file has its own namespace. The translation\r\n            we do from their namespace to ours is *at best* heuristic, and guaranteed to\r\n            fail under some circumstances.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSpotColor\">\r\n             A <CODE>PdfSpotColor</CODE> defines a ColorSpace\r\n            \r\n             @see     PdfDictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSpotColor.#ctor(System.String,iTextSharp.text.BaseColor)\">\r\n             Constructs a new <CODE>PdfSpotColor</CODE>.\r\n            \r\n             @param       name        a string value\r\n             @param       tint        a tint value between 0 and 1\r\n             @param       altcs       a altnative colorspace value\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfStamper”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStamper.stamper\">\r\n            The writer\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.#ctor(iTextSharp.text.pdf.PdfReader,System.IO.Stream)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.#ctor(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Char)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.#ctor(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Char,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.MoreInfo\">\r\n            Gets the optional <CODE>String</CODE> map to add or change values in\r\n             the info dictionary.\r\n             @return the map or <CODE>null</CODE>\r\n            \r\n            An optional <CODE>String</CODE> map to add or change values in\r\n             the info dictionary. Entries with <CODE>null</CODE>\r\n             values delete the key in the original info dictionary\r\n             @param moreInfo additional entries to the info dictionary\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.ReplacePage(iTextSharp.text.pdf.PdfReader,System.Int32,System.Int32)\">\r\n            Replaces a page from this document with a page from other document. Only the content\r\n            is replaced not the fields and annotations. This method must be called before \r\n            getOverContent() or getUndercontent() are called for the same page.\r\n            @param r the <CODE>PdfReader</CODE> from where the new page will be imported\r\n            @param pageImported the page number of the imported page\r\n            @param pageReplaced the page to replace in this document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.InsertPage(System.Int32,iTextSharp.text.Rectangle)\">\r\n            Inserts a blank page. All the pages above and including <CODE>pageNumber</CODE> will\r\n            be shifted up. If <CODE>pageNumber</CODE> is bigger than the total number of pages\r\n            the new page will be the last one.\r\n            @param pageNumber the page number position where the new page will be inserted\r\n            @param mediabox the size of the new page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.SignatureAppearance\">\r\n            Gets the signing instance. The appearances and other parameters can the be set.\r\n            @return the signing instance\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.XmlSignatureAppearance\">\r\n            Gets the xml signing instance. The appearances and other parameters can the be set.\r\n            @return the signing instance\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.Close”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.GetUnderContent(System.Int32)\">\r\n            Gets a <CODE>PdfContentByte</CODE> to write under the page of\r\n            the original document.\r\n            @param pageNum the page number where the extra content is written\r\n            @return a <CODE>PdfContentByte</CODE> to write under the page of\r\n            the original document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.GetOverContent(System.Int32)\">\r\n            Gets a <CODE>PdfContentByte</CODE> to write over the page of\r\n            the original document.\r\n            @param pageNum the page number where the extra content is written\r\n            @return a <CODE>PdfContentByte</CODE> to write over the page of\r\n            the original document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.RotateContents\">\r\n            Checks if the content is automatically adjusted to compensate\r\n            the original page rotation.\r\n            @return the auto-rotation status\r\n            Flags the content to be automatically adjusted to compensate\r\n            the original page rotation. The default is <CODE>true</CODE>.\r\n            @param rotateContents <CODE>true</CODE> to set auto-rotation, <CODE>false</CODE>\r\n            otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Boolean)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @throws DocumentException if anything was already written to the output\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetEncryption(System.Boolean,System.String,System.String,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException if anything was already written to the output\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetEncryption(System.Int32,System.String,System.String,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetEncryption(Org.BouncyCastle.X509.X509Certificate[],System.Int32[],System.Int32)\">\r\n            Sets the certificate encryption options for this document. An array of one or more public certificates\r\n            must be provided together with an array of the same size for the permissions for each certificate.\r\n             The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param certs the public certificates to be used for the encryption\r\n            @param permissions the user permissions for each of the certicates\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            @throws DocumentException if the encryption was set too late\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.GetImportedPage(iTextSharp.text.pdf.PdfReader,System.Int32)\">\r\n            Gets a page from other PDF document. Note that calling this method more than\r\n            once with the same parameters will retrieve the same object.\r\n            @param reader the PDF document where the page is\r\n            @param pageNumber the page number. The first page is 1\r\n            @return the template representing the imported page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.Writer\">\r\n            Gets the underlying PdfWriter.\r\n            @return the underlying PdfWriter\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.Reader\">\r\n            Gets the underlying PdfReader.\r\n            @return the underlying PdfReader\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.AcroFields\">\r\n            Gets the <CODE>AcroFields</CODE> object that allows to get and set field values\r\n            and to merge FDF forms.\r\n            @return the <CODE>AcroFields</CODE> object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.FormFlattening\">\r\n            Determines if the fields are flattened on close. The fields added with\r\n            {@link #addAnnotation(PdfAnnotation,int)} will never be flattened.\r\n            @param flat <CODE>true</CODE> to flatten the fields, <CODE>false</CODE>\r\n            to keep the fields\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.FreeTextFlattening\">\r\n            Determines if the FreeText annotations are flattened on close. \r\n            @param flat <CODE>true</CODE> to flatten the FreeText annotations, <CODE>false</CODE>\r\n            (the default) to keep the FreeText annotations as active content.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.AnnotationFlattening\">\r\n             Flatten annotations with an appearance stream on close().\r\n            \r\n             @param flat boolean to indicate whether iText should flatten annotations or not.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddAnnotation(iTextSharp.text.pdf.PdfAnnotation,System.Int32)\">\r\n            Adds an annotation of form field in a specific page. This page number\r\n            can be overridden with {@link PdfAnnotation#setPlaceInPage(int)}.\r\n            @param annot the annotation\r\n            @param page the page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddSignature(System.String,System.Int32,System.Single,System.Single,System.Single,System.Single)\">\r\n            Adds an empty signature.\r\n            @param name   the name of the signature\r\n            @param page   the page number\r\n            @param llx    lower left x coordinate of the signature's position\r\n            @param lly    lower left y coordinate of the signature's position\r\n            @param urx    upper right x coordinate of the signature's position\r\n            @param ury    upper right y coordinate of the signature's position\r\n            @return   a signature form field\r\n            @since    2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddComments(iTextSharp.text.pdf.FdfReader)\">\r\n            Adds the comments present in an FDF file.\r\n            @param fdf the FDF file\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.Outlines\">\r\n            Sets the bookmarks. The list structure is defined in\r\n            {@link SimpleBookmark}.\r\n            @param outlines the bookmarks or <CODE>null</CODE> to remove any\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetThumbnail(iTextSharp.text.Image,System.Int32)\">\r\n            Sets the thumbnail image for a page.\r\n            @param image the image\r\n            @param page the page\r\n            @throws PdfException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.PartialFormFlattening(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.JavaScript\">\r\n            Adds a JavaScript action at the document level. When the document\r\n            opens all this JavaScript runs. The existing JavaScript will be replaced.\r\n            @param js the JavaScript code\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddJavaScript(System.String,System.String)\">\r\n            Adds a JavaScript action at the document level. When the document\r\n            opens all this JavaScript runs. The existing JavaScript will be replaced.\r\n            @param name the name for the JavaScript snippet in the name tree\r\n            @param js the JavaScript code\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddFileAttachment(System.String,System.Byte[],System.String,System.String)\">\r\n            Adds a file attachment at the document level. Existing attachments will be kept.\r\n            @param description the file description\r\n            @param fileStore an array with the file. If it's <CODE>null</CODE>\r\n            the file will be read from the disk\r\n            @param file the path to the file. It will only be used if\r\n            <CODE>fileStore</CODE> is not <CODE>null</CODE>\r\n            @param fileDisplay the actual file name stored in the pdf\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddFileAttachment(System.String,iTextSharp.text.pdf.PdfFileSpecification)\">\r\n            Adds a file attachment at the document level. Existing attachments will be kept.\r\n            @param description the file description\r\n            @param fs the file specification\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.MakePackage(iTextSharp.text.pdf.PdfName)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.MakePackage(iTextSharp.text.pdf.collection.PdfCollection)\">\r\n            Adds or replaces the Collection Dictionary in the Catalog.\r\n            @param    collection  the new collection dictionary.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.ViewerPreferences\">\r\n            Sets the viewer preferences.\r\n            @param preferences the viewer preferences\r\n            @see PdfViewerPreferences#setViewerPreferences(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Adds a viewer preference\r\n            @param preferences the viewer preferences\r\n            @see PdfViewerPreferences#addViewerPreference\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.XmpMetadata\">\r\n            Sets the XMP metadata.\r\n            @param xmp\r\n            @see PdfWriter#setXmpMetadata(byte[])\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamper.FullCompression\">\r\n            Gets the 1.5 compression status.\r\n            @return <code>true</code> if the 1.5 compression is on\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetFullCompression\">\r\n            Sets the document's compression to the new 1.5 mode with object streams and xref\r\n            streams. Be attentive!!! If you want set full compression , you should set immediately after creating PdfStamper,\r\n            before editing the document.It can be set once and it can't be unset.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetPageAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction,System.Int32)\">\r\n            Sets the open and close page additional action.\r\n            @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>\r\n            or <CODE>PdfWriter.PAGE_CLOSE</CODE>\r\n            @param action the action to perform\r\n            @param page the page where the action will be applied. The first page is 1\r\n            @throws PdfException if the action type is invalid\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetDuration(System.Int32,System.Int32)\">\r\n            Sets the display duration for the page (for presentations)\r\n            @param seconds   the number of seconds to display the page. A negative value removes the entry\r\n            @param page the page where the duration will be applied. The first page is 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.SetTransition(iTextSharp.text.pdf.PdfTransition,System.Int32)\">\r\n            Sets the transition for the page\r\n            @param transition   the transition object. A <code>null</code> removes the transition\r\n            @param page the page where the transition will be applied. The first page is 1\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.CreateSignature(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Char,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.CreateSignature(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Char)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfStamper.CreateSignature(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Char,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamper.GetPdfLayers\">\r\n            Gets the PdfLayer objects in an existing document as a Map\r\n            with the names/titles of the layers as keys.\r\n            @return   a Map with all the PdfLayers in the document (and the name/title of the layer as key)\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStamperImp.pagesToContent\">\r\n            Integer(page number) -> PageStamp \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStamperImp.rotateContents\">\r\n            Holds value of property rotateContents. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.#ctor(iTextSharp.text.pdf.PdfReader,System.IO.Stream,System.Char,System.Boolean)\">\r\n            Creates new PdfStamperImp.\r\n            @param reader the read PDF\r\n            @param os the output destination\r\n            @param pdfVersion the new pdf version or '\\0' to keep the same version as the original\r\n            document\r\n            @param append\r\n            @throws DocumentException on error\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.RegisterReader(iTextSharp.text.pdf.PdfReader,System.Boolean)\">\r\n            @param reader\r\n            @param openFile\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.UnRegisterReader(iTextSharp.text.pdf.PdfReader)\">\r\n            @param reader\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.AddComments(iTextSharp.text.pdf.FdfReader)\">\r\n            @param fdf\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamperImp.FlatAnnotations\">\r\n             If true, annotations with an appearance stream will be flattened.\r\n            \r\n             @since 5.5.3\r\n             @param flatAnnotations boolean\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.GetPageReference(System.Int32)\">\r\n            @see com.lowagie.text.pdf.PdfWriter#getPageReference(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.AddAnnotation(iTextSharp.text.pdf.PdfAnnotation)\">\r\n            @see com.lowagie.text.pdf.PdfWriter#addAnnotation(com.lowagie.text.pdf.PdfAnnotation)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.MakePackage(iTextSharp.text.pdf.collection.PdfCollection)\">\r\n            Adds or replaces the Collection Dictionary in the Catalog.\r\n            @param   collection  the new collection dictionary.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamperImp.ViewerPreferences\">\r\n            Sets the viewer preferences.\r\n            @param preferences the viewer preferences\r\n            @see PdfWriter#setViewerPreferences(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Adds a viewer preference\r\n            @param preferences the viewer preferences\r\n            @see PdfViewerPreferences#addViewerPreference\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamperImp.SigFlags\">\r\n            Set the signature flags.\r\n            @param f the flags. This flags are ORed with current ones\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetPageAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction)\">\r\n            Always throws an <code>UnsupportedOperationException</code>.\r\n            @param actionType ignore\r\n            @param action ignore\r\n            @throws PdfException ignore\r\n            @see PdfStamper#setPageAction(PdfName, PdfAction, int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetPageAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction,System.Int32)\">\r\n            Sets the open and close page additional action.\r\n            @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>\r\n            or <CODE>PdfWriter.PAGE_CLOSE</CODE>\r\n            @param action the action to perform\r\n            @param page the page where the action will be applied. The first page is 1\r\n            @throws PdfException if the action type is invalid\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamperImp.Duration\">\r\n            Always throws an <code>UnsupportedOperationException</code>.\r\n            @param seconds ignore\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamperImp.Transition\">\r\n            Always throws an <code>UnsupportedOperationException</code>.\r\n            @param transition ignore\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetDuration(System.Int32,System.Int32)\">\r\n            Sets the display duration for the page (for presentations)\r\n            @param seconds   the number of seconds to display the page. A negative value removes the entry\r\n            @param page the page where the duration will be applied. The first page is 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetTransition(iTextSharp.text.pdf.PdfTransition,System.Int32)\">\r\n            Sets the transition for the page\r\n            @param transition   the transition object. A <code>null</code> removes the transition\r\n            @param page the page where the transition will be applied. The first page is 1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.IsAppend\">\r\n            Getter for property append.\r\n            @return Value of property append.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetAdditionalAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction)\">\r\n            Additional-actions defining the actions to be taken in\r\n             response to various trigger events affecting the document\r\n             as a whole. The actions types allowed are: <CODE>DOCUMENT_CLOSE</CODE>,\r\n             <CODE>WILL_SAVE</CODE>, <CODE>DID_SAVE</CODE>, <CODE>WILL_PRINT</CODE>\r\n             and <CODE>DID_PRINT</CODE>.\r\n            \r\n             @param actionType the action type\r\n             @param action the action to execute in response to the trigger\r\n             @throws PdfException on invalid action type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetOpenAction(iTextSharp.text.pdf.PdfAction)\">\r\n            @see com.lowagie.text.pdf.PdfWriter#setOpenAction(com.lowagie.text.pdf.PdfAction)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.SetOpenAction(System.String)\">\r\n            @see com.lowagie.text.pdf.PdfWriter#setOpenAction(java.lang.String)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStamperImp.Thumbnail\">\r\n            @see com.lowagie.text.pdf.PdfWriter#setThumbnail(com.lowagie.text.Image)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.ReadOCProperties\">\r\n            Reads the OCProperties dictionary from the catalog of the existing document\r\n            and fills the documentOCG, documentOCGorder and OCGRadioGroup variables in PdfWriter.\r\n            Note that the original OCProperties of the existing document can contain more information.\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.AddOrder(iTextSharp.text.pdf.PdfLayer,iTextSharp.text.pdf.PdfArray,System.Collections.Generic.Dictionary{System.String,iTextSharp.text.pdf.PdfLayer})\">\r\n            Recursive method to reconstruct the documentOCGorder variable in the writer.\r\n            @param    parent  a parent PdfLayer (can be null)\r\n            @param    arr     an array possibly containing children for the parent PdfLayer\r\n            @param    ocgmap  a Hashtable with indirect reference Strings as keys and PdfLayer objects as values.\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStamperImp.GetPdfLayers\">\r\n            Gets the PdfLayer objects in an existing document as a Map\r\n            with the names/titles of the layers as keys.\r\n            @return   a Map with all the PdfLayers in the document (and the name/title of the layer as key)\r\n            @since    2.1.2\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfStream”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStream.DEFAULT_COMPRESSION\">\r\n            A possible compression level.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStream.NO_COMPRESSION\">\r\n            A possible compression level.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStream.BEST_SPEED\">\r\n            A possible compression level.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStream.BEST_COMPRESSION\">\r\n            A possible compression level.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStream.compressed\">\r\n            is the stream compressed? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStream.compressionLevel\">\r\n            The level of compression.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.#ctor(System.Byte[])\">\r\n             Constructs a <CODE>PdfStream</CODE>-object.\r\n            \r\n             @param        bytes            content of the new <CODE>PdfObject</CODE> as an array of <CODE>byte</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.#ctor(System.IO.Stream,iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates an efficient stream. No temporary array is ever created. The <CODE>InputStream</CODE>\r\n            is totally consumed but is not closed. The general usage is:\r\n            <pre>\r\n            InputStream in = ...;\r\n            PdfStream stream = new PdfStream(in, writer);\r\n            stream.FlateCompress();\r\n            writer.AddToBody(stream);\r\n            stream.WriteLength();\r\n            in.Close();\r\n            </pre>\r\n            @param inputStream the data to write to this stream\r\n            @param writer the <CODE>PdfWriter</CODE> for this stream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.#ctor\">\r\n            Constructs a <CODE>PdfStream</CODE>-object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.WriteLength\">\r\n            Writes the stream length to the <CODE>PdfWriter</CODE>.\r\n            <p>\r\n            This method must be called and can only be called if the contructor {@link #PdfStream(InputStream,PdfWriter)}\r\n            is used to create the stream.\r\n            </p>\r\n            @throws IOException on error\r\n            @see #PdfStream(InputStream,PdfWriter)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.FlateCompress\">\r\n            Compresses the stream.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.FlateCompress(System.Int32)\">\r\n            Compresses the stream.\r\n            @param compressionLevel the compression level (0 = best speed, 9 = best compression, -1 is default)\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.WriteContent(System.IO.Stream)\">\r\n            Writes the data content to an <CODE>Stream</CODE>.\r\n            @param os the destination to write to\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStream.ToString\">\r\n            @see com.lowagie.text.pdf.PdfObject#toString()\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfString”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfString.value\">\r\n            The value of this object. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfString.encoding\">\r\n            The encoding. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfString.#ctor\">\r\n            Constructs an empty <CODE>PdfString</CODE>-object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfString.#ctor(System.String)\">\r\n             Constructs a <CODE>PdfString</CODE>-object.\r\n            \r\n             @param        value        the content of the string\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfString.#ctor(System.String,System.String)\">\r\n             Constructs a <CODE>PdfString</CODE>-object.\r\n            \r\n             @param        value        the content of the string\r\n             @param        encoding    an encoding\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfString.#ctor(System.Byte[])\">\r\n             Constructs a <CODE>PdfString</CODE>-object.\r\n            \r\n             @param        bytes    an array of <CODE>byte</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfString.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n             Returns the PDF representation of this <CODE>PdfString</CODE>.\r\n            \r\n             @return        an array of <CODE>byte</CODE>s\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfString.ToString\">\r\n             Returns the <CODE>string</CODE> value of the <CODE>PdfString</CODE>-object.\r\n            \r\n             @return        a <CODE>string</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfString.Encoding\">\r\n             Gets the encoding of this string.\r\n            \r\n             @return        a <CODE>string</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfStructureElement\">\r\n            This is a node in a document logical structure. It may contain a mark point or it may contain\r\n            other nodes.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStructureElement.parent\">\r\n            Holds value of property kids.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStructureElement.reference\">\r\n            Holds value of property reference.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureElement.#ctor(iTextSharp.text.pdf.PdfStructureElement,iTextSharp.text.pdf.PdfName)\">\r\n            Creates a new instance of PdfStructureElement.\r\n            @param parent the parent of this node\r\n            @param structureType the type of structure. It may be a standard type or a user type mapped by the role map\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureElement.#ctor(iTextSharp.text.pdf.PdfStructureTreeRoot,iTextSharp.text.pdf.PdfName)\">\r\n            Creates a new instance of PdfStructureElement.\r\n            @param root the structure tree root\r\n            @param structureType the type of structure. It may be a standard type or a user type mapped by the role map\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStructureElement.Parent\">\r\n            Gets the parent of this node.\r\n            @return the parent of this node\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStructureElement.Reference\">\r\n            Gets the reference this object will be written to.\r\n            @return the reference this object will be written to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureElement.GetAttribute(iTextSharp.text.pdf.PdfName)\">\r\n            Gets the first entarance of attribute.\r\n            @returns PdfObject\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureElement.SetAttribute(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Sets the attribute value.\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfStructureTreeRoot\">\r\n            The structure tree root corresponds to the highest hierarchy level in a tagged PDF.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfStructureTreeRoot.writer\">\r\n            Holds value of property writer.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureTreeRoot.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Creates a new instance of PdfStructureTreeRoot \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureTreeRoot.MapRole(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfName)\">\r\n            Maps the user tags to the standard tags. The mapping will allow a standard application to make some sense of the tagged\r\n            document whatever the user tags may be.\r\n            @param used the user tag\r\n            @param standard the standard tag\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStructureTreeRoot.Writer\">\r\n            Gets the writer.\r\n            @return the writer\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfStructureTreeRoot.Reference\">\r\n            Gets the reference this object will be written to.\r\n            @return the reference this object will be written to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureTreeRoot.GetAttribute(iTextSharp.text.pdf.PdfName)\">\r\n            Gets the first entarance of attribute.\r\n            @returns PdfObject\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructureTreeRoot.SetAttribute(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Sets the attribute value.\r\n            @since 5.3.4\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfTemplate\">\r\n            Implements the form XObject.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTemplate.thisReference\">\r\n            The indirect reference to this template \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTemplate.pageResources\">\r\n            The resources used by this template \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTemplate.bBox\">\r\n            The bounding box of this template \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTemplate.additional\">\r\n            A dictionary with additional information\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTemplate.#ctor\">\r\n            Creates a <CODE>PdfTemplate</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTemplate.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n             Creates new PdfTemplate\r\n            \r\n             @param wr the <CODE>PdfWriter</CODE>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfTemplate.CreateTemplate(iTextSharp.text.pdf.PdfWriter,System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.Width\">\r\n             Gets the bounding width of this template.\r\n            \r\n             @return width the bounding width\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.Height\">\r\n             Gets the bounding heigth of this template.\r\n            \r\n             @return heigth the bounding height\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.Layer\">\r\n            Gets the layer this template belongs to.\r\n            @return the layer this template belongs to or <code>null</code> for no layer defined\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.IndirectReference\">\r\n             Gets the indirect reference to this template.\r\n            \r\n             @return the indirect reference to this template\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.Resources\">\r\n             Constructs the resources used by this template.\r\n            \r\n             @return the resources used by this template\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTemplate.GetFormXObject(System.Int32)\">\r\n             Gets the stream representing this template.\r\n            \r\n             @param   compressionLevel    the compressionLevel\r\n             @return the stream representing this template\r\n             @since   2.1.3   (replacing the method without param compressionLevel)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.Duplicate\">\r\n            Gets a duplicate of this <CODE>PdfTemplate</CODE>. All\r\n            the members are copied by reference but the buffer stays different.\r\n            @return a copy of this <CODE>PdfTemplate</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTemplate.Additional\">\r\n             Sets/gets a dictionary with extra entries, for instance /Measure.\r\n            \r\n             @param additional\r\n                        a PdfDictionary with additional information.\r\n             @since 5.1.0\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfTextArray”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTextArray.Add(iTextSharp.text.pdf.PdfNumber)\">\r\n             Adds a <CODE>PdfNumber</CODE> to the <CODE>PdfArray</CODE>.\r\n            \r\n             @param  number   displacement of the string\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.SPLITVOUT\">\r\n            Out Vertical Split\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.SPLITHOUT\">\r\n            Out Horizontal Split\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.SPLITVIN\">\r\n            In Vertical Split\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.SPLITHIN\">\r\n            IN Horizontal Split\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.BLINDV\">\r\n            Vertical Blinds\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.BLINDH\">\r\n            Vertical Blinds\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.INBOX\">\r\n            Inward Box\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.OUTBOX\">\r\n            Outward Box\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.LRWIPE\">\r\n            Left-Right Wipe\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.RLWIPE\">\r\n            Right-Left Wipe\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.BTWIPE\">\r\n            Bottom-Top Wipe\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.TBWIPE\">\r\n            Top-Bottom Wipe\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.DISSOLVE\">\r\n            Dissolve\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.LRGLITTER\">\r\n            Left-Right Glitter\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.TBGLITTER\">\r\n            Top-Bottom Glitter\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.DGLITTER\">\r\n            Diagonal Glitter\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.duration\">\r\n            duration of the transition effect\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfTransition.type\">\r\n            type of the transition effect\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTransition.#ctor\">\r\n              Constructs a <CODE>Transition</CODE>.\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTransition.#ctor(System.Int32)\">\r\n              Constructs a <CODE>Transition</CODE>.\r\n            \r\n            @param  type      type of the transition effect\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTransition.#ctor(System.Int32,System.Int32)\">\r\n              Constructs a <CODE>Transition</CODE>.\r\n            \r\n            @param  type      type of the transition effect\r\n            @param  duration  duration of the transition effect\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfTransparencyGroup\">\r\n            The transparency group dictionary.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfTransparencyGroup.#ctor\">\r\n            Constructs a transparencyGroup.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTransparencyGroup.Isolated\">\r\n            Determining the initial backdrop against which its stack is composited.\r\n            @param isolated\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfTransparencyGroup.Knockout\">\r\n            Determining whether the objects within the stack are composited with one another or only with the group's backdrop.\r\n            @param knockout\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfVisibilityExpression\">\r\n            An array specifying a visibility expression, used to compute visibility\r\n            of content based on a set of optional content groups.\r\n            @since 5.0.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfVisibilityExpression.OR\">\r\n            A boolean operator. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfVisibilityExpression.AND\">\r\n            A boolean operator. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfVisibilityExpression.NOT\">\r\n            A boolean operator. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfVisibilityExpression.#ctor(System.Int32)\">\r\n            Creates a visibility expression.\r\n            @param type should be AND, OR, or NOT\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfVisibilityExpression.Add(System.Int32,iTextSharp.text.pdf.PdfObject)\">\r\n            @see com.itextpdf.text.pdf.PdfArray#add(int, com.itextpdf.text.pdf.PdfObject)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfVisibilityExpression.Add(iTextSharp.text.pdf.PdfObject)\">\r\n            @see com.itextpdf.text.pdf.PdfArray#add(com.itextpdf.text.pdf.PdfObject)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfVisibilityExpression.AddFirst(iTextSharp.text.pdf.PdfObject)\">\r\n            @see com.itextpdf.text.pdf.PdfArray#addFirst(com.itextpdf.text.pdf.PdfObject)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfVisibilityExpression.Add(System.Single[])\">\r\n            @see com.itextpdf.text.pdf.PdfArray#add(float[])\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfVisibilityExpression.Add(System.Int32[])\">\r\n            @see com.itextpdf.text.pdf.PdfArray#add(int[])\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfWriter\">\r\n            A <CODE>DocWriter</CODE> class for PDF.\r\n            <P>\r\n            When this <CODE>PdfWriter</CODE> is added\r\n            to a certain <CODE>PdfDocument</CODE>, the PDF representation of every Element\r\n            added to this Document will be written to the outputstream.</P>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.GENERATION_MAX\">\r\n            The highest generation number possible.\r\n            @since   iText 2.1.6\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfWriter.PdfBody”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference\">\r\n            <CODE>PdfCrossReference</CODE> is an entry in the PDF Cross-Reference table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.offset\">\r\n            Byte offset in the PDF file. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.generation\">\r\n            generation of the object. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.#ctor(System.Int32,System.Int64,System.Int32)\">\r\n            Constructs a cross-reference element for a PdfIndirectObject.\r\n            @param refnum\r\n            @param    offset      byte offset of the object\r\n            @param    generation  generationnumber of the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.#ctor(System.Int32,System.Int64)\">\r\n            Constructs a cross-reference element for a PdfIndirectObject.\r\n            @param refnum\r\n            @param    offset      byte offset of the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.ToPdf(System.IO.Stream)\">\r\n            Returns the PDF representation of this <CODE>PdfObject</CODE>.\r\n            @param os\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.ToPdf(System.Int32,System.IO.Stream)\">\r\n            Writes PDF syntax to the Stream\r\n            @param midSize\r\n            @param os\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.CompareTo(System.Object)\">\r\n            @see java.lang.Comparable#compareTo(java.lang.Object)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfCrossReference.Equals(System.Object)\">\r\n            @see java.lang.Object#equals(java.lang.Object)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PdfBody.xrefs\">\r\n            array containing the cross-reference table of the normal objects. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PdfBody.position\">\r\n            the current byteposition in the body. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.#ctor(iTextSharp.text.pdf.PdfWriter)\">\r\n            Constructs a new <CODE>PdfBody</CODE>.\r\n            @param writer\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.PdfBody.Add(iTextSharp.text.pdf.PdfObject)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PdfBody.PdfIndirectReference\">\r\n            Gets a PdfIndirectReference for an object that will be created in the future.\r\n            @return a PdfIndirectReference\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.PdfBody.Add(iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfIndirectReference)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PdfBody.Offset\">\r\n             Returns the offset of the Cross-Reference table.\r\n            \r\n             @return       an offset\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PdfBody.Size\">\r\n             Returns the total number of objects contained in the CrossReferenceTable of this <CODE>Body</CODE>.\r\n            \r\n             @return   a number of objects\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfBody.WriteCrossReferenceTable(System.IO.Stream,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfObject,System.Int64)\">\r\n            Returns the CrossReferenceTable of the <CODE>Body</CODE>.\r\n            @param os\r\n            @param root\r\n            @param info\r\n            @param encryption\r\n            @param fileID\r\n            @param prevxref\r\n            @throws IOException\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PdfWriter.PdfTrailer”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfTrailer.#ctor(System.Int32,System.Int64,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfIndirectReference,iTextSharp.text.pdf.PdfObject,System.Int64)\">\r\n             Constructs a PDF-Trailer.\r\n            \r\n             @param        size        the number of entries in the <CODE>PdfCrossReferenceTable</CODE>\r\n             @param        offset      offset of the <CODE>PdfCrossReferenceTable</CODE>\r\n             @param        root        an indirect reference to the root of the PDF document\r\n             @param        info        an indirect reference to the info object of the PDF document\r\n             @param encryption\r\n             @param fileID\r\n             @param prevxref\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.PdfTrailer.ToPdf(iTextSharp.text.pdf.PdfWriter,System.IO.Stream)\">\r\n            Returns the PDF representation of this <CODE>PdfObject</CODE>.\r\n            @param writer\r\n            @param os\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.#ctor\">\r\n            Constructs a <CODE>PdfWriter</CODE>.\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.#ctor(iTextSharp.text.pdf.PdfDocument,System.IO.Stream)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetInstance(iTextSharp.text.Document,System.IO.Stream)\">\r\n             Use this method to get an instance of the <CODE>PdfWriter</CODE>.\r\n            \r\n             @param    document    The <CODE>Document</CODE> that has to be written\r\n             @param    os  The <CODE>Stream</CODE> the writer has to write to.\r\n             @return   a new <CODE>PdfWriter</CODE>\r\n            \r\n             @throws   DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetInstance(iTextSharp.text.Document,System.IO.Stream,iTextSharp.text.IDocListener)\">\r\n             Use this method to get an instance of the <CODE>PdfWriter</CODE>.\r\n            \r\n             @return a new <CODE>PdfWriter</CODE>\r\n             @param document The <CODE>Document</CODE> that has to be written\r\n             @param os The <CODE>Stream</CODE> the writer has to write to.\r\n             @param listener A <CODE>DocListener</CODE> to pass to the PdfDocument.\r\n             @throws DocumentException on error\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.pdf\">\r\n            the pdfdocument object. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PdfDocument\">\r\n            Gets the <CODE>PdfDocument</CODE> associated with this writer.\r\n            @return the <CODE>PdfDocument</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Info\">\r\n            Use this method to get the info dictionary if you want to\r\n            change it directly (add keys and values to the info dictionary).\r\n            @return the info dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetVerticalPosition(System.Boolean)\">\r\n            Use this method to get the current vertical page position.\r\n            @param ensureNewLine Tells whether a new line shall be enforced. This may cause side effects \r\n              for elements that do not terminate the lines they've started because those lines will get\r\n              terminated. \r\n            @return The current vertical page position.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.InitialLeading\">\r\n            Sets the initial leading for the PDF document.\r\n            This has to be done before the document is opened.\r\n            @param   leading the initial leading\r\n            @since   2.1.6\r\n            @throws  DocumentException       if you try setting the leading after the document was opened.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.directContent\">\r\n            The direct content in this document. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.directContentUnder\">\r\n            The direct content under in this document. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.DirectContent\">\r\n            Use this method to get the direct content for this document.\r\n            There is only one direct content, multiple calls to this method\r\n            will allways retrieve the same object.\r\n            @return the direct content\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.DirectContentUnder\">\r\n            Use this method to get the direct content under for this document.\r\n            There is only one direct content, multiple calls to this method\r\n            will allways retrieve the same object.\r\n            @return the direct content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.ResetContent\">\r\n            Resets all the direct contents to empty.\r\n            This happens when a new page is started.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.body\">\r\n            body of the PDF document \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddLocalDestinations(System.Collections.Generic.SortedDictionary{System.String,iTextSharp.text.pdf.PdfDocument.Destination})\">\r\n            Adds the local destinations to the body of the document.\r\n            @param dest the <CODE>Hashtable</CODE> containing the destinations\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddToBody(iTextSharp.text.pdf.PdfObject)\">\r\n            Adds an object to the PDF body.\r\n            @param object\r\n            @return a PdfIndirectObject\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddToBody(iTextSharp.text.pdf.PdfObject,System.Boolean)\">\r\n            Adds an object to the PDF body.\r\n            @param object\r\n            @param inObjStm\r\n            @return a PdfIndirectObject\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddToBody(iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Adds an object to the PDF body.\r\n            @param object\r\n            @param ref\r\n            @return a PdfIndirectObject\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddToBody(iTextSharp.text.pdf.PdfObject,iTextSharp.text.pdf.PdfIndirectReference,System.Boolean)\">\r\n            Adds an object to the PDF body.\r\n            @param object\r\n            @param ref\r\n            @param inObjStm\r\n            @return a PdfIndirectObject\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddToBody(iTextSharp.text.pdf.PdfObject,System.Int32)\">\r\n            Adds an object to the PDF body.\r\n            @param object\r\n            @param refNumber\r\n            @return a PdfIndirectObject\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddToBody(iTextSharp.text.pdf.PdfObject,System.Int32,System.Boolean)\">\r\n            Adds an object to the PDF body.\r\n            @param object\r\n            @param refNumber\r\n            @param inObjStm\r\n            @return a PdfIndirectObject\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.CacheObject(iTextSharp.text.pdf.PdfIndirectObject)\">\r\n            Use this method for caching objects.\r\n            @param iobj @see PdfIndirectObject\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PdfIndirectReference\">\r\n            Gets a <CODE>PdfIndirectReference</CODE> for an object that\r\n            will be created in the future.\r\n            @return the <CODE>PdfIndirectReference</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Os\">\r\n            Returns the outputStreamCounter.\r\n            @return the outputStreamCounter\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.extraCatalog\">\r\n            Holds value of property extraCatalog. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.ExtraCatalog\">\r\n            Sets extra keys to the catalog.\r\n            @return the catalog to change\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.root\">\r\n            The root of the page tree. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.pageReferences\">\r\n            The PdfIndirectReference to the pages. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.currentPageNumber\">\r\n            The current page number. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.tabs\">\r\n            The value of the Tabs entry in the page dictionary.\r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.pageDictEntries\">\r\n            Additional page dictionary entries.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddPageDictEntry(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Adds an additional entry for the page dictionary.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageDictEntries\">\r\n            Gets the additional pageDictEntries.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.ResetPageDictEntries\">\r\n            Resets the additional pageDictEntries.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetLinearPageMode\">\r\n            Use this method to make sure the page tree has a lineair structure\r\n            (every leave is attached directly to the root).\r\n            Use this method to allow page reordering with method reorderPages.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.ReorderPages(System.Int32[])\">\r\n            Use this method to reorder the pages in the document.\r\n            A <CODE>null</CODE> argument value only returns the number of pages to process.\r\n            It is advisable to issue a <CODE>Document.NewPage()</CODE> before using this method.\r\n            @return the total number of pages\r\n            @param order an array with the new page sequence. It must have the\r\n            same size as the number of pages.\r\n            @throws DocumentException if all the pages are not present in the array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetPageReference(System.Int32)\">\r\n            Use this method to get a reference to a page existing or not.\r\n            If the page does not exist yet the reference will be created\r\n            in advance. If on closing the document, a page number greater\r\n            than the total number of pages was requested, an exception\r\n            is thrown.\r\n            @param page the page number. The first page is 1\r\n            @return the reference to the page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageNumber\">\r\n            Gets the pagenumber of this document.\r\n            This number can be different from the real pagenumber,\r\n            if you have (re)set the page number previously.\r\n            @return a page number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetPageViewport(iTextSharp.text.pdf.PdfArray)\">\r\n            Sets the Viewport for the next page.\r\n            @param viewport an array consisting of Viewport dictionaries.\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Tabs\">\r\n            Sets the value for the Tabs entry in the page tree.\r\n            @param\ttabs\tCan be PdfName.R, PdfName.C or PdfName.S.\r\n            Since the Adobe Extensions Level 3, it can also be PdfName.A\r\n            or PdfName.W\r\n            @since\t2.1.5\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.Add(iTextSharp.text.pdf.PdfPage,iTextSharp.text.pdf.PdfContents)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.pageEvent\">\r\n            The <CODE>PdfPageEvent</CODE> for this document. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageEvent\">\r\n            Gets the <CODE>PdfPageEvent</CODE> for this document or <CODE>null</CODE>\r\n            if none is set.\r\n            @return the <CODE>PdfPageEvent</CODE> for this document or <CODE>null</CODE>\r\n            if none is set\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.prevxref\">\r\n            A number refering to the previous Cross-Reference Table. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.originalFileID\">\r\n            The original file ID (if present). \r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.Open”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.Close”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.RootOutline\">\r\n            Use this method to get the root outline\r\n            and construct bookmarks.\r\n            @return the root outline\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Outlines\">\r\n            Sets the bookmarks. The list structure is defined in\r\n            {@link SimpleBookmark}.\r\n            @param outlines the bookmarks or <CODE>null</CODE> to remove any\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.VERSION_1_2\">\r\n            possible PDF version (header) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.VERSION_1_3\">\r\n            possible PDF version (header) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.VERSION_1_4\">\r\n            possible PDF version (header) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.VERSION_1_5\">\r\n            possible PDF version (header) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.VERSION_1_6\">\r\n            possible PDF version (header) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.VERSION_1_7\">\r\n            possible PDF version (header) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_2\">\r\n            possible PDF version (catalog) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_3\">\r\n            possible PDF version (catalog) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_4\">\r\n            possible PDF version (catalog) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_5\">\r\n            possible PDF version (catalog) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_6\">\r\n            possible PDF version (catalog) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_7\">\r\n            possible PDF version (catalog) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.pdf_version\">\r\n            Stores the version information for the header and the catalog. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PdfVersion\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#setPdfVersion(char)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetAtLeastPdfVersion(System.Char)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#setAtLeastPdfVersion(char)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetPdfVersion(iTextSharp.text.pdf.PdfName)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#setPdfVersion(com.lowagie.text.pdf.PdfName)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddDeveloperExtension(iTextSharp.text.pdf.PdfDeveloperExtension)\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfVersion#addDeveloperExtension(com.lowagie.text.pdf.PdfDeveloperExtension)\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetPdfVersion\">\r\n            Returns the version information.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageLayoutSinglePage\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageLayoutOneColumn\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageLayoutTwoColumnLeft\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageLayoutTwoColumnRight\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageLayoutTwoPageLeft\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageLayoutTwoPageRight\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageModeUseNone\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageModeUseOutlines\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageModeUseThumbs\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageModeFullScreen\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageModeUseOC\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PageModeUseAttachments\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.HideToolbar\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.HideMenubar\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.HideWindowUI\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.FitWindow\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.CenterWindow\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DisplayDocTitle\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.NonFullScreenPageModeUseNone\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.NonFullScreenPageModeUseOutlines\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.NonFullScreenPageModeUseThumbs\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.NonFullScreenPageModeUseOC\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DirectionL2R\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DirectionR2L\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PrintScalingNone\">\r\n            A viewer preference \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.ViewerPreferences\">\r\n            Sets the viewer preferences as the sum of several constants.\r\n            @param preferences the viewer preferences\r\n            @see PdfViewerPreferences#setViewerPreferences\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddViewerPreference(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)\">\r\n            Adds a viewer preference\r\n            @param preferences the viewer preferences\r\n            @see PdfViewerPreferences#addViewerPreference\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageLabels\">\r\n            Use this method to add page labels\r\n            @param pageLabels the page labels\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddNamedDestinations(System.Collections.Generic.IDictionary{System.String,System.String},System.Int32)\">\r\n            Adds named destinations in bulk.\r\n            Valid keys and values of the map can be found in the map\r\n            that is created by SimpleNamedDestination.\r\n            @param    map a map with strings as keys for the names,\r\n                      and structured strings as values for the destinations\r\n            @param    page_offset number of pages that has to be added to\r\n                      the page numbers in the destinations (useful if you\r\n                     use this method in combination with PdfCopy).\r\n            @since    iText 5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddNamedDestination(System.String,System.Int32,iTextSharp.text.pdf.PdfDestination)\">\r\n            Adds one named destination.\r\n            @param    name    the name for the destination\r\n            @param    page    the page number where you want to jump to\r\n            @param    dest    an explicit destination\r\n            @since    iText 5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddJavaScript(iTextSharp.text.pdf.PdfAction)\">\r\n            Use this method to add a JavaScript action at the document level.\r\n            When the document opens, all this JavaScript runs.\r\n            @param js The JavaScript action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddJavaScript(System.String,System.Boolean)\">\r\n            Adds a JavaScript action at the document level. When the document\r\n            opens all this JavaScript runs.\r\n            @param code the JavaScript code\r\n            @param unicode select JavaScript unicode. Note that the internal\r\n            Acrobat JavaScript engine does not support unicode,\r\n            so this may or may not work for you\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddJavaScript(System.String)\">\r\n            Adds a JavaScript action at the document level. When the document\r\n            opens all this JavaScript runs.\r\n            @param code the JavaScript code\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddJavaScript(System.String,iTextSharp.text.pdf.PdfAction)\">\r\n            Use this method to add a JavaScript action at the document level.\r\n            When the document opens, all this JavaScript runs.\r\n            @param name The name of the JS Action in the name tree\r\n            @param js The JavaScript action\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddJavaScript(System.String,System.String,System.Boolean)\">\r\n            Use this method to add a JavaScript action at the document level.\r\n            When the document opens, all this JavaScript runs.\r\n            @param name The name of the JS Action in the name tree\r\n            @param code the JavaScript code\r\n            @param unicode select JavaScript unicode. Note that the internal\r\n            Acrobat JavaScript engine does not support unicode,\r\n            so this may or may not work for you\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddJavaScript(System.String,System.String)\">\r\n            Use this method to adds a JavaScript action at the document level.\r\n            When the document opens, all this JavaScript runs.\r\n            @param name The name of the JS Action in the name tree\r\n            @param code the JavaScript code\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddFileAttachment(System.String,System.Byte[],System.String,System.String)\">\r\n            Adds a file attachment at the document level.\r\n            @param description the file description\r\n            @param fileStore an array with the file. If it's <CODE>null</CODE>\r\n            the file will be read from the disk\r\n            @param file the path to the file. It will only be used if\r\n            <CODE>fileStore</CODE> is not <CODE>null</CODE>\r\n            @param fileDisplay the actual file name stored in the pdf\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddFileAttachment(System.String,iTextSharp.text.pdf.PdfFileSpecification)\">\r\n            Adds a file attachment at the document level.\r\n            @param description the file description\r\n            @param fs the file specification\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddFileAttachment(iTextSharp.text.pdf.PdfFileSpecification)\">\r\n            Adds a file attachment at the document level.\r\n            @param fs the file specification\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DOCUMENT_CLOSE\">\r\n            action value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.WILL_SAVE\">\r\n            action value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DID_SAVE\">\r\n            action value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.WILL_PRINT\">\r\n            action value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DID_PRINT\">\r\n            action value \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetOpenAction(System.String)\">\r\n            When the document opens it will jump to the destination with\r\n            this name.\r\n            @param name the name of the destination to jump to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetOpenAction(iTextSharp.text.pdf.PdfAction)\">\r\n            When the document opens this <CODE>action</CODE> will be\r\n            invoked.\r\n            @param action the action to be invoked\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetAdditionalAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction)\">\r\n            Additional-actions defining the actions to be taken in\r\n             response to various trigger events affecting the document\r\n             as a whole. The actions types allowed are: <CODE>DOCUMENT_CLOSE</CODE>,\r\n             <CODE>WILL_SAVE</CODE>, <CODE>DID_SAVE</CODE>, <CODE>WILL_PRINT</CODE>\r\n             and <CODE>DID_PRINT</CODE>.\r\n            \r\n             @param actionType the action type\r\n             @param action the action to execute in response to the trigger\r\n             @throws PdfException on invalid action type\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Collection\">\r\n            Sets the Collection dictionary.\r\n            @param collection a dictionary of type PdfCollection\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.SIGNATURE_EXISTS\">\r\n            signature value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.SIGNATURE_APPEND_ONLY\">\r\n            signature value \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.AcroForm\">\r\n            Gets the AcroForm object.\r\n            @return the <CODE>PdfAcroForm</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddAnnotation(iTextSharp.text.pdf.PdfAnnotation)\">\r\n            Adds a <CODE>PdfAnnotation</CODE> or a <CODE>PdfFormField</CODE>\r\n            to the document. Only the top parent of a <CODE>PdfFormField</CODE>\r\n            needs to be added.\r\n            @param annot the <CODE>PdfAnnotation</CODE> or the <CODE>PdfFormField</CODE> to add\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddCalculationOrder(iTextSharp.text.pdf.PdfFormField)\">\r\n            Adds the <CODE>PdfAnnotation</CODE> to the calculation order\r\n            array.\r\n            @param annot the <CODE>PdfAnnotation</CODE> to be added\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.SigFlags\">\r\n            Set the signature flags.\r\n            @param f the flags. This flags are ORed with current ones\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.xmpMetadata\">\r\n            XMP Metadata for the document. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.XmpMetadata\">\r\n            Sets XMP Metadata.\r\n            @param xmpMetadata The xmpMetadata to set.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageXmpMetadata\">\r\n            Use this method to set the XMP Metadata for each page.\r\n            @param xmpMetadata The xmpMetadata to set.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.CreateXmpMetadata\">\r\n            Use this method to creates XMP Metadata based\r\n            on the metadata in the PdfDocument.\r\n            @since 5.4.4 just creates XmpWriter instance which will be serialized in close.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDFXNONE\">\r\n            PDF/X level \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDFX1A2001\">\r\n            PDF/X level \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PDFX32002\">\r\n            PDF/X level \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.pdfIsoConformance\">\r\n            Stores the PDF ISO conformance. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PDFXConformance\">\r\n            Sets the PDFX conformance level. Allowed values are PDFX1A2001 and PDFX32002. It\r\n            must be called before opening the document.\r\n            @param pdfxConformance the conformance level\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.IsPdfIso\">\r\n            Checks if any PDF ISO conformance is necessary.\r\n            @return <code>true</code> if the PDF has to be in conformance with any of the PDF ISO specifications\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.IsPdfX\">\r\n            @see com.lowagie.text.pdf.interfaces.PdfXConformance#isPdfX() \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetOutputIntents(System.String,System.String,System.String,System.String,iTextSharp.text.pdf.ICC_Profile)\">\r\n            Sets the values of the output intent dictionary. Null values are allowed to\r\n            suppress any key.\r\n            @param outputConditionIdentifier a value\r\n            @param outputCondition a value\r\n            @param registryName a value\r\n            @param info a value\r\n            @param destOutputProfile a value\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetOutputIntents(System.String,System.String,System.String,System.String,System.Byte[])\">\r\n             Sets the values of the output intent dictionary. Null values are allowed to\r\n             suppress any key.\r\n            \r\n             Prefer the <CODE>ICC_Profile</CODE>-based version of this method.\r\n             @param outputConditionIdentifier a value\r\n             @param outputCondition           a value, \"PDFA/A\" to force GTS_PDFA1, otherwise cued by pdfxConformance.\r\n             @param registryName              a value\r\n             @param info                      a value\r\n             @param destOutputProfile         a value\r\n             @since 1.x\r\n            \r\n             @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetOutputIntents(iTextSharp.text.pdf.PdfReader,System.Boolean)\">\r\n            Copies the output intent dictionary from other document to this one.\r\n            @param reader the other document\r\n            @param checkExistence <CODE>true</CODE> to just check for the existence of a valid output intent\r\n            dictionary, <CODE>false</CODE> to insert the dictionary if it exists\r\n            @throws IOException on error\r\n            @return <CODE>true</CODE> if the output intent dictionary exists, <CODE>false</CODE>\r\n            otherwise\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.STANDARD_ENCRYPTION_40\">\r\n            Type of encryption \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.STANDARD_ENCRYPTION_128\">\r\n            Type of encryption \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ENCRYPTION_AES_128\">\r\n            Type of encryption \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ENCRYPTION_AES_256\">\r\n            Type of encryption \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ENCRYPTION_MASK\">\r\n            Mask to separate the encryption type from the encryption mode. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.DO_NOT_ENCRYPT_METADATA\">\r\n            Add this to the mode to keep the metadata in clear text \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.EMBEDDED_FILES_ONLY\">\r\n            Add this to the mode to keep encrypt only the embedded files.\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_PRINTING\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_MODIFY_CONTENTS\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_COPY\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_MODIFY_ANNOTATIONS\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_FILL_IN\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_SCREENREADERS\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_ASSEMBLY\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.ALLOW_DEGRADED_PRINTING\">\r\n            The operation permitted when the document is opened with the user password\r\n            \r\n             @since 2.0.7\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowPrinting\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_PRINTING} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowModifyContents\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_MODIFY_CONTENTS} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowCopy\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_COPY} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowModifyAnnotations\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_MODIFY_ANNOTATIONS} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowFillIn\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_FILL_IN} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowScreenReaders\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_SCREENREADERS} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowAssembly\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_ASSEMBLY} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.AllowDegradedPrinting\">\r\n            @deprecated As of iText 2.0.7, use {@link #ALLOW_DEGRADED_PRINTING} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.STRENGTH40BITS\">\r\n            @deprecated As of iText 2.0.7, use {@link #STANDARD_ENCRYPTION_40} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.STRENGTH128BITS\">\r\n            @deprecated As of iText 2.0.7, use {@link #STANDARD_ENCRYPTION_128} instead. Scheduled for removal at or after 2.2.0 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.crypto\">\r\n            Contains the business logic for cryptography. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetEncryption(Org.BouncyCastle.X509.X509Certificate[],System.Int32[],System.Int32)\">\r\n            Sets the certificate encryption options for this document. An array of one or more public certificates\r\n            must be provided together with an array of the same size for the permissions for each certificate.\r\n             The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param certs the public certificates to be used for the encryption\r\n            @param permissions the user permissions for each of the certicates\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetEncryption(System.Byte[],System.Byte[],System.Int32,System.Boolean)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetEncryption(System.Boolean,System.String,System.String,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetEncryption(System.Int32,System.String,System.String,System.Int32)\">\r\n            Sets the encryption options for this document. The userPassword and the\r\n             ownerPassword can be null or have zero length. In this case the ownerPassword\r\n             is replaced by a random string. The open permissions for the document can be\r\n             AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,\r\n             AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.\r\n             The permissions can be combined by ORing them.\r\n            @param encryptionType the type of encryption. It can be one of STANDARD_ENCRYPTION_40, STANDARD_ENCRYPTION_128 or ENCRYPTION_AES128.\r\n            Optionally DO_NOT_ENCRYPT_METADATA can be ored to output the metadata in cleartext\r\n            @param userPassword the user password. Can be null or empty\r\n            @param ownerPassword the owner password. Can be null or empty\r\n            @param permissions the user permissions\r\n            @throws DocumentException if the document is already open\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.fullCompression\">\r\n            Holds value of property fullCompression.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.FullCompression\">\r\n            Gets the 1.5 compression status.\r\n            @return <code>true</code> if the 1.5 compression is on\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetFullCompression\">\r\n            Sets the document's compression to the new 1.5 mode with object streams and xref\r\n            streams. It can be set at any time but once set it can't be unset.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.compressionLevel\">\r\n            The compression level of the content streams.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.CompressionLevel\">\r\n            Sets the compression level to be used for streams written by this writer.\r\n            @param compressionLevel a value between 0 (best speed) and 9 (best compression)\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.documentFonts\">\r\n            The fonts of this document \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.fontNumber\">\r\n            The font number counter for the fonts in the document. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddSimple(iTextSharp.text.pdf.BaseFont)\">\r\n            Adds a <CODE>BaseFont</CODE> to the document but not to the page resources.\r\n            It is used for templates.\r\n            @param bf the <CODE>BaseFont</CODE> to add\r\n            @return an <CODE>Object[]</CODE> where position 0 is a <CODE>PdfName</CODE>\r\n            and position 1 is an <CODE>PdfIndirectReference</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.formXObjects\">\r\n            The form XObjects in this document. The key is the xref and the value\r\n                        is Object[]{PdfName, template}.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.formXObjectsCounter\">\r\n            The name counter for the form XObjects name. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddDirectTemplateSimple(iTextSharp.text.pdf.PdfTemplate,iTextSharp.text.pdf.PdfName)\">\r\n            Adds a template to the document but not to the page resources.\r\n            @param template the template to add\r\n            @param forcedName the template name, rather than a generated one. Can be null\r\n            @return the <CODE>PdfName</CODE> for this template\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.ReleaseTemplate(iTextSharp.text.pdf.PdfTemplate)\">\r\n            Releases the memory used by a template by writing it to the output. The template\r\n            can still be added to any content but changes to the template itself won't have\r\n            any effect.\r\n            @param tp the template to release\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetImportedPage(iTextSharp.text.pdf.PdfReader,System.Int32)\">\r\n            Gets a page from other PDF document. The page can be used as\r\n            any other PdfTemplate. Note that calling this method more than\r\n            once with the same parameters will retrieve the same object.\r\n            @param reader the PDF document where the page is\r\n            @param pageNumber the page number. The first page is 1\r\n            @return the template representing the imported page\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetPdfReaderInstance(iTextSharp.text.pdf.PdfReader)\">\r\n            Returns the PdfReaderInstance associated with the specified reader.\r\n            Multiple calls with the same reader object will return the same\r\n            PdfReaderInstance.\r\n            @param reader the PDF reader that you want an instance for\r\n            @return the instance for the provided reader\r\n            @since 5.0.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.FreeReader(iTextSharp.text.pdf.PdfReader)\">\r\n            Writes the reader to the document and frees the memory used by it.\r\n            The main use is when concatenating multiple documents to keep the\r\n            memory usage restricted to the current appending document.\r\n            @param reader the <CODE>PdfReader</CODE> to free\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.CurrentDocumentSize\">\r\n            Gets the current document size. This size only includes\r\n            the data already writen to the output stream, it does not\r\n            include templates or fonts. It is usefull if used with\r\n            <CODE>freeReader()</CODE> when concatenating many documents\r\n            and an idea of the current size is needed.\r\n            @return the approximate size without fonts or templates\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.documentColors\">\r\n            The colors of this document \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.colorNumber\">\r\n            The color number counter for the colors in the document. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddSimple(iTextSharp.text.pdf.ICachedColorSpace)\">\r\n            Adds a <CODE>SpotColor</CODE> to the document but not to the page resources.\r\n            @param spc the <CODE>SpotColor</CODE> to add\r\n            @return an <CODE>Object[]</CODE> where position 0 is a <CODE>PdfName</CODE>\r\n            and position 1 is an <CODE>PdfIndirectReference</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.documentPatterns\">\r\n            The patterns of this document \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.patternNumber\">\r\n            The patten number counter for the colors in the document. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetTagged\">\r\n            Mark this document for tagging. It must be called before open.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.IsTagged\">\r\n            Check if the document is marked for tagging.\r\n            @return <CODE>true</CODE> if the document is marked for tagging\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.FlushTaggedObjects\">\r\n            Fix structure of tagged document: remove unused objects, remove unused items from class map,\r\n            fix xref table due to removed objects.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.FlushAcroFields\">\r\n            Flushes merged AcroFields to document (if any). \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.StructureTreeRoot\">\r\n            Gets the structure tree root. If the document is not marked for tagging it will return <CODE>null</CODE>.\r\n            @return the structure tree root\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.OCProperties\">\r\n            Gets the <B>Optional Content Properties Dictionary</B>. Each call fills the dictionary with the current layer\r\n            state. It's advisable to only call this method right before close and do any modifications\r\n            at that time.\r\n            @return the Optional Content Properties Dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddOCGRadioGroup(System.Collections.Generic.List{iTextSharp.text.pdf.PdfLayer})\">\r\n            Sets a collection of optional content groups whose states are intended to follow\r\n            a \"radio button\" paradigm. That is, the state of at most one optional\r\n            content group in the array should be ON at a time: if one group is turned\r\n            ON, all others must be turned OFF.\r\n            @param group the radio group\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.LockLayer(iTextSharp.text.pdf.PdfLayer)\">\r\n            Use this method to lock an optional content group.\r\n            The state of a locked group cannot be changed through the user interface\r\n            of a viewer application. Producers can use this entry to prevent the visibility\r\n            of content that depends on these groups from being changed by users.\r\n            @param layer the layer that needs to be added to the array of locked OCGs\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageSize\">\r\n            Gives the size of the media box.\r\n            @return a Rectangle\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.CropBoxSize\">\r\n            Sets the crop box. The crop box should not be rotated even if the\r\n            page is rotated. This change only takes effect in the next\r\n            page.\r\n            @param crop the crop box\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetBoxSize(System.String,iTextSharp.text.Rectangle)\">\r\n            Sets the page box sizes. Allowed names are: \"crop\", \"trim\", \"art\" and \"bleed\".\r\n            @param boxName the box size\r\n            @param size the size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetBoxSize(System.String)\">\r\n            Gives the size of a trim, art, crop or bleed box, or null if not defined.\r\n            @param boxName crop, trim, art or bleed\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetBoxSize(System.String,iTextSharp.text.Rectangle)\">\r\n             Returns the intersection between the crop, trim art or bleed box and the parameter intersectingRectangle.\r\n             This method returns null when\r\n             - there is no intersection\r\n             - any of the above boxes are not defined\r\n             - the parameter intersectingRectangle is null\r\n            \r\n             @param boxName crop, trim, art, bleed\r\n             @param intersectingRectangle the rectangle that intersects the rectangle associated to the boxName\r\n             @return the intersection of the two rectangles\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.PageEmpty\">\r\n            Use this method to make sure a page is added,\r\n            even if it's empty. If you use SetPageEmpty(false),\r\n            invoking NewPage() after a blank page will add a newPage.\r\n            SetPageEmpty(true) won't have any effect.\r\n            @param pageEmpty the state\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PAGE_OPEN\">\r\n            action value \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.PAGE_CLOSE\">\r\n            action value \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.SetPageAction(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfAction)\">\r\n            Sets the open and close page additional action.\r\n            @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>\r\n            or <CODE>PdfWriter.PAGE_CLOSE</CODE>\r\n            @param action the action to perform\r\n            @throws PdfException if the action type is invalid\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Duration\">\r\n            Sets the display duration for the page (for presentations)\r\n            @param seconds   the number of seconds to display the page\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Transition\">\r\n            Sets the transition for the page\r\n            @param transition   the Transition object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Thumbnail\">\r\n            Sets the the thumbnail image for the current page.\r\n            @param image the image\r\n            @throws PdfException on error\r\n            @throws DocumentException or error\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.group\">\r\n            A group attributes dictionary specifying the attributes\r\n            of the page�s page group for use in the transparent\r\n            imaging model\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.SPACE_CHAR_RATIO_DEFAULT\">\r\n            The default space-char ratio. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.NO_SPACE_CHAR_RATIO\">\r\n            Disable the inter-character spacing. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.spaceCharRatio\">\r\n            The ratio between the extra word spacing and the extra character spacing.\r\n            Extra word spacing will grow <CODE>ratio</CODE> times more than extra character spacing.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.SpaceCharRatio\">\r\n            Sets the ratio between the extra word spacing and the extra character spacing\r\n            when the text is fully justified.\r\n            Extra word spacing will grow <CODE>spaceCharRatio</CODE> times more than extra character spacing.\r\n            If the ratio is <CODE>PdfWriter.NO_SPACE_CHAR_RATIO</CODE> then the extra character spacing\r\n            will be zero.\r\n            @param spaceCharRatio the ratio between the extra word spacing and the extra character spacing\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.RUN_DIRECTION_DEFAULT\">\r\n            Use the default run direction. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.RUN_DIRECTION_NO_BIDI\">\r\n            Do not use bidirectional reordering. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.RUN_DIRECTION_LTR\">\r\n            Use bidirectional reordering with left-to-right\r\n            preferential run direction.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.RUN_DIRECTION_RTL\">\r\n            Use bidirectional reordering with right-to-left\r\n            preferential run direction.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.RunDirection\">\r\n            Sets the run direction. This is only used as a placeholder\r\n            as it does not affect anything.\r\n            @param runDirection the run direction\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.Userunit\">\r\n            A UserUnit is a value that defines the default user space unit.\r\n            The minimum UserUnit is 1 (1 unit = 1/72 inch).\r\n            The maximum UserUnit is 75,000.\r\n            Remark that this userunit only works starting with PDF1.6!\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.DefaultColorspace\">\r\n            Gets the default colorspaces.\r\n            @return the default colorspaces\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.PdfWriter.SetDefaultColorspace(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfObject)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.StrictImageSequence\">\r\n            Sets the image sequence to follow the text in strict order.\r\n             @param strictImageSequence new value of property strictImageSequence\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.ClearTextWrap\">\r\n            Clears text wrapping around images (if applicable).\r\n            Method suggested by Pelikan Stephan\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.imageDictionary\">\r\n            Dictionary, containing all the images of the PDF document \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.images\">\r\n            This is the list with all the images in the document. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddDirectImageSimple(iTextSharp.text.Image)\">\r\n            Adds an image to the document but not to the page resources. It is used with\r\n            templates and <CODE>Document.Add(Image)</CODE>.\r\n            @param image the <CODE>Image</CODE> to add\r\n            @return the name of the image added\r\n            @throws PdfException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.AddDirectImageSimple(iTextSharp.text.Image,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Adds an image to the document but not to the page resources. It is used with\r\n            templates and <CODE>Document.Add(Image)</CODE>.\r\n            @param image the <CODE>Image</CODE> to add\r\n            @param fixedRef the reference to used. It may be <CODE>null</CODE>,\r\n            a <CODE>PdfIndirectReference</CODE> or a <CODE>PRIndirectReference</CODE>.\r\n            @return the name of the image added\r\n            @throws PdfException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.Add(iTextSharp.text.pdf.PdfImage,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n             Writes a <CODE>PdfImage</CODE> to the outputstream.\r\n            \r\n             @param pdfImage the image to be added\r\n             @return a <CODE>PdfIndirectReference</CODE> to the encapsulated image\r\n             @throws PdfException when a document isn't open yet, or has been closed\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetImageReference(iTextSharp.text.pdf.PdfName)\">\r\n             return the <CODE>PdfIndirectReference</CODE> to the image with a given name.\r\n            \r\n             @param name the name of the image\r\n             @return a <CODE>PdfIndirectReference</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.JBIG2Globals\">\r\n            A Hashtable with Stream objects containing JBIG2 Globals\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetReferenceJBIG2Globals(System.Byte[])\">\r\n            Gets an indirect reference to a JBIG2 Globals stream.\r\n            Adds the stream if it hasn't already been added to the writer.\r\n            @param   content a byte array that may already been added to the writer inside a stream object.\r\n            @since  2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.userProperties\">\r\n            A flag indicating the presence of structure elements that contain user properties attributes.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.UserProperties\">\r\n            Sets the flag indicating the presence of structure elements that contain user properties attributes.\r\n            @param userProperties the user properties flag\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfWriter.rgbTransparencyBlending\">\r\n            Holds value of property RGBTranparency.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfWriter.RgbTransparencyBlending\">\r\n            Sets the transparency blending colorspace to RGB. The default blending colorspace is\r\n            CMYK and will result in faded colors in the screen and in printing. Calling this method\r\n            will return the RGB colors to what is expected. The RGB blending will be applied to all subsequent pages\r\n            until other value is set.\r\n            Note that this is a generic solution that may not work in all cases.\r\n            @param rgbTransparencyBlending <code>true</code> to set the transparency blending colorspace to RGB, <code>false</code>\r\n            to use the default blending colorspace\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.CreateAnnotation(iTextSharp.text.Rectangle,iTextSharp.text.pdf.PdfName)\">\r\n             A wrapper around PdfAnnotation constructor.\r\n             It is recommended to use this wrapper instead of direct constructor as this is a convenient way to override PdfAnnotation construction when needed.\r\n            \r\n             @param rect\r\n             @param subtype\r\n             @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.CreateAnnotation(System.Single,System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfString,iTextSharp.text.pdf.PdfString,iTextSharp.text.pdf.PdfName)\">\r\n             A wrapper around PdfAnnotation constructor.\r\n             It is recommended to use this wrapper instead of direct constructor as this is a convenient way to override PdfAnnotation construction when needed.\r\n            \r\n             @param llx\r\n             @param lly\r\n             @param urx\r\n             @param ury\r\n             @param title\r\n             @param content\r\n             @param subtype\r\n             @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.CreateAnnotation(System.Single,System.Single,System.Single,System.Single,iTextSharp.text.pdf.PdfAction,iTextSharp.text.pdf.PdfName)\">\r\n             A wrapper around PdfAnnotation constructor.\r\n             It is recommended to use this wrapper instead of direct constructor as this is a convenient way to override PdfAnnotation construction when needed.\r\n            \r\n             @param llx\r\n             @param lly\r\n             @param urx\r\n             @param ury\r\n             @param action\r\n             @param subtype\r\n             @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfWriter.GetStandardStructElems\">\r\n            Gets the list of the standard structure element names (roles).\r\n            @return\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfXConformanceException\">\r\n            \r\n             @author  psoares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfXConformanceException.#ctor\">\r\n            Creates a new instance of PdfXConformanceException. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfXConformanceException.#ctor(System.String)\">\r\n            Creates a new instance of PdfXConformanceException.\r\n            @param s\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.Pfm2afm\">\r\n            Converts a PFM file into an AFM file.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Pfm2afm.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray,System.IO.Stream)\">\r\n            Creates a new instance of Pfm2afm \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Pfm2afm.Convert(iTextSharp.text.pdf.RandomAccessFileOrArray,System.IO.Stream)\">\r\n            Converts a PFM file into an AFM file.\r\n            @param inp the PFM file\r\n            @param outp the AFM file\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Pfm2afm.Win2PSStd\">\r\n            Translate table from 1004 to psstd.  1004 is an extension of the\r\n            Windows translate table used in PM.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Pfm2afm.WinClass\">\r\n            Character class.  This is a minor attempt to overcome the problem that\r\n            in the pfm file, all unused characters are given the width of space.\r\n            Note that this array isn't used in iText.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Pfm2afm.WinChars\">\r\n            Windows character names.  Give a name to the used locations\r\n            for when the all flag is specified.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PRAcroForm\">\r\n            This class captures an AcroForm on input. Basically, it extends Dictionary\r\n            by indexing the fields of an AcroForm\r\n            @author Mark Thompson\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PRAcroForm.FieldInformation\">\r\n            This class holds the information for a single field\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PRAcroForm.FieldInformation.WidgetName\">\r\n            Returns the name of the widget annotation (the /NM entry).\r\n            @return\ta String or null (if there's no /NM key)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRAcroForm.#ctor(iTextSharp.text.pdf.PdfReader)\">\r\n            Constructor\r\n            @param reader reader of the input file\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PRAcroForm.Size\">\r\n            Number of fields found\r\n            @return size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRAcroForm.GetRefByName(System.String)\">\r\n            Given the title (/T) of a reference, return the associated reference\r\n            @param name a string containing the path\r\n            @return a reference to the field, or null\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRAcroForm.ReadAcroForm(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Read, and comprehend the acroform\r\n            @param root the docment root\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRAcroForm.IterateFields(iTextSharp.text.pdf.PdfArray,iTextSharp.text.pdf.PRIndirectReference,System.String)\">\r\n            After reading, we index all of the fields. Recursive.\r\n            @param fieldlist An array of fields\r\n            @param fieldDict the last field dictionary we encountered (recursively)\r\n            @param parentPath the pathname of the field, up to this point or null\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRAcroForm.MergeAttrib(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.PdfDictionary)\">\r\n            merge field attributes from two dictionaries\r\n            @param parent one dictionary\r\n            @param child the other dictionary\r\n            @return a merged dictionary\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRAcroForm.PushAttrib(iTextSharp.text.pdf.PdfDictionary)\">\r\n            stack a level of dictionary. Merge in a dictionary from this level\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRIndirectReference.#ctor(iTextSharp.text.pdf.PdfReader,System.Int32,System.Int32)\">\r\n             Constructs a <CODE>PdfIndirectReference</CODE>.\r\n            \r\n             @param        reader            a <CODE>PdfReader</CODE>\r\n             @param        number            the object number.\r\n             @param        generation        the generation number.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRIndirectReference.#ctor(iTextSharp.text.pdf.PdfReader,System.Int32)\">\r\n             Constructs a <CODE>PdfIndirectReference</CODE>.\r\n            \r\n             @param        reader            a <CODE>PdfReader</CODE>\r\n             @param        number            the object number.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRStream.#ctor(iTextSharp.text.pdf.PdfReader,System.Byte[],System.Int32)\">\r\n            Creates a new PDF stream object that will replace a stream\r\n            in a existing PDF file.\r\n            @param   reader  the reader that holds the existing PDF\r\n            @param   conts   the new content\r\n            @param   compressionLevel    the compression level for the content\r\n            @since   2.1.3 (replacing the existing constructor without param compressionLevel)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRStream.SetData(System.Byte[],System.Boolean)\">\r\n            Sets the data associated with the stream, either compressed or\r\n            uncompressed. Note that the data will never be compressed if\r\n            Document.compress is set to false.\r\n            \r\n            @param data raw data, decrypted and uncompressed.\r\n            @param compress true if you want the stream to be compresssed.\r\n            @since   iText 2.1.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRStream.SetData(System.Byte[],System.Boolean,System.Int32)\">\r\n            Sets the data associated with the stream, either compressed or\r\n            uncompressed. Note that the data will never be compressed if\r\n            Document.compress is set to false.\r\n            \r\n            @param data raw data, decrypted and uncompressed.\r\n            @param compress true if you want the stream to be compresssed.\r\n            @param compressionLevel  a value between -1 and 9 (ignored if compress == false)\r\n            @since   iText 2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRStream.SetDataRaw(System.Byte[])\">\r\n             Sets the data associated with the stream, as-is.  This method will not\r\n             remove or change any existing filter: the data has to match an existing\r\n             filter or an appropriate filter has to be set.\r\n            \r\n             @param data data, possibly encrypted and/or compressed\r\n             @since 5.5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRStream.SetData(System.Byte[])\">\r\n            Sets the data associated with the stream\r\n            @param data raw data, decrypted and uncompressed.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PRTokeniser\">\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRTokeniser.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Creates a PRTokeniser for the specified {@link RandomAccessSource}.\r\n            The beginning of the file is read to determine the location of the header, and the data source is adjusted\r\n            as necessary to account for any junk that occurs in the byte source before the header\r\n            @param file the source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRTokeniser.IsWhitespace(System.Int32)\">\r\n            Is a certain character a whitespace? Currently checks on the following: '0', '9', '10', '12', '13', '32'.\r\n            <br />The same as calling {@link #isWhitespace(int, boolean) isWhiteSpace(ch, true)}.\r\n            @param ch int\r\n            @return boolean\r\n            @since 5.5.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRTokeniser.IsWhitespace(System.Int32,System.Boolean)\">\r\n            Checks whether a character is a whitespace. Currently checks on the following: '0', '9', '10', '12', '13', '32'.\r\n            @param ch int\r\n            @param isWhitespace boolean\r\n            @return boolean\r\n            @since 5.5.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PRTokeniser.Reference\">\r\n            Gets current reference number. If parsing was failed with NumberFormatException -1 will be return.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRTokeniser.ReadLineSegment(System.Byte[])\">\r\n             Reads data into the provided byte[]. Checks on leading whitespace.\r\n             See {@link #isWhitespace(int) isWhiteSpace(int)} or {@link #isWhitespace(int, boolean) isWhiteSpace(int, boolean)}\r\n             for a list of whitespace characters.\r\n             <br />The same as calling {@link #readLineSegment(byte[], boolean) readLineSegment(input, true)}.\r\n            \r\n             @param input byte[]\r\n             @return boolean\r\n             @throws IOException\r\n             @since 5.5.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PRTokeniser.ReadLineSegment(System.Byte[],System.Boolean)\">\r\n             Reads data into the provided byte[]. Checks on leading whitespace.\r\n             See {@link #isWhitespace(int) isWhiteSpace(int)} or {@link #isWhitespace(int, boolean) isWhiteSpace(int, boolean)}\r\n             for a list of whitespace characters.\r\n            \r\n             @param input byte[]\r\n             @param isNullWhitespace boolean to indicate whether '0' is whitespace or not.\r\n                                     If in doubt, use true or overloaded method {@link #readLineSegment(byte[]) readLineSegment(input)}\r\n             @return boolean\r\n             @throws IOException\r\n             @since 5.5.1\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.PushbuttonField”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_LABEL_ONLY\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_ICON_ONLY\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_ICON_TOP_LABEL_BOTTOM\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_LABEL_TOP_ICON_BOTTOM\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_ICON_LEFT_LABEL_RIGHT\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_LABEL_LEFT_ICON_RIGHT\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.LAYOUT_LABEL_OVER_ICON\">\r\n            A layout option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.SCALE_ICON_ALWAYS\">\r\n            An icon scaling option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.SCALE_ICON_NEVER\">\r\n            An icon scaling option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.SCALE_ICON_IS_TOO_BIG\">\r\n            An icon scaling option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.SCALE_ICON_IS_TOO_SMALL\">\r\n            An icon scaling option \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.layout\">\r\n            Holds value of property layout.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.image\">\r\n            Holds value of property image.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.template\">\r\n            Holds value of property template.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.scaleIcon\">\r\n            Holds value of property scaleIcon.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.proportionalIcon\">\r\n            Holds value of property proportionalIcon.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.iconVerticalAdjustment\">\r\n            Holds value of property iconVerticalAdjustment.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.iconHorizontalAdjustment\">\r\n            Holds value of property iconHorizontalAdjustment.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.iconFitToBounds\">\r\n            Holds value of property iconFitToBounds.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PushbuttonField.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String)\">\r\n            Creates a new instance of PushbuttonField\r\n            @param writer the document <CODE>PdfWriter</CODE>\r\n            @param box the field location and dimensions\r\n            @param fieldName the field name. If <CODE>null</CODE> only the widget keys\r\n            will be included in the field allowing it to be used as a kid field.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.Layout\">\r\n            Sets the icon and label layout. Possible values are <CODE>LAYOUT_LABEL_ONLY</CODE>,\r\n            <CODE>LAYOUT_ICON_ONLY</CODE>, <CODE>LAYOUT_ICON_TOP_LABEL_BOTTOM</CODE>,\r\n            <CODE>LAYOUT_LABEL_TOP_ICON_BOTTOM</CODE>, <CODE>LAYOUT_ICON_LEFT_LABEL_RIGHT</CODE>,\r\n            <CODE>LAYOUT_LABEL_LEFT_ICON_RIGHT</CODE> and <CODE>LAYOUT_LABEL_OVER_ICON</CODE>.\r\n            The default is <CODE>LAYOUT_LABEL_ONLY</CODE>.\r\n            @param layout New value of property layout.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.Image\">\r\n            Sets the icon as an image.\r\n            @param image the image\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.Template\">\r\n            Sets the icon as a template.\r\n            @param template the template\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.ScaleIcon\">\r\n            Sets the way the icon will be scaled. Possible values are\r\n            <CODE>SCALE_ICON_ALWAYS</CODE>, <CODE>SCALE_ICON_NEVER</CODE>,\r\n            <CODE>SCALE_ICON_IS_TOO_BIG</CODE> and <CODE>SCALE_ICON_IS_TOO_SMALL</CODE>.\r\n            The default is <CODE>SCALE_ICON_ALWAYS</CODE>.\r\n            @param scaleIcon the way the icon will be scaled\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.ProportionalIcon\">\r\n            Sets the way the icon is scaled. If <CODE>true</CODE> the icon is scaled proportionally,\r\n            if <CODE>false</CODE> the scaling is done anamorphicaly.\r\n            @param proportionalIcon the way the icon is scaled\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.IconVerticalAdjustment\">\r\n            A number between 0 and 1 indicating the fraction of leftover space to allocate at the bottom of the icon.\r\n            A value of 0 positions the icon at the bottom of the annotation rectangle.\r\n            A value of 0.5 centers it within the rectangle. The default is 0.5.\r\n            @param iconVerticalAdjustment a number between 0 and 1 indicating the fraction of leftover space to allocate at the bottom of the icon\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.IconHorizontalAdjustment\">\r\n            A number between 0 and 1 indicating the fraction of leftover space to allocate at the left of the icon.\r\n            A value of 0 positions the icon at the left of the annotation rectangle.\r\n            A value of 0.5 centers it within the rectangle. The default is 0.5.\r\n            @param iconHorizontalAdjustment a number between 0 and 1 indicating the fraction of leftover space to allocate at the left of the icon\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PushbuttonField.GetAppearance\">\r\n            Gets the button appearance.\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return the button appearance\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.Field\">\r\n            Gets the pushbutton field.\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return the pushbutton field\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.IconFitToBounds\">\r\n            If <CODE>true</CODE> the icon will be scaled to fit fully within the bounds of the annotation,\r\n            if <CODE>false</CODE> the border width will be taken into account. The default\r\n            is <CODE>false</CODE>.\r\n            @param iconFitToBounds if <CODE>true</CODE> the icon will be scaled to fit fully within the bounds of the annotation,\r\n            if <CODE>false</CODE> the border width will be taken into account\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PushbuttonField.iconReference\">\r\n            Holds value of property iconReference.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PushbuttonField.IconReference\">\r\n            Sets the reference to an existing icon.\r\n            @param iconReference the reference to an existing icon\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.BitArray\">\r\n             <p>A simple, fast array of bits, represented compactly by an array of ints internally.</p>\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.Get(System.Int32)\">\r\n            @param i bit to get\r\n            @return true iff bit i is set\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.Set(System.Int32)\">\r\n             Sets bit i.\r\n            \r\n             @param i bit to set\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.Flip(System.Int32)\">\r\n             Flips bit i.\r\n            \r\n             @param i bit to set\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.SetBulk(System.Int32,System.Int32)\">\r\n             Sets a block of 32 bits, starting at bit i.\r\n            \r\n             @param i first bit to set\r\n             @param newBits the new value of the next 32 bits. Note again that the least-significant bit\r\n             corresponds to bit i, the next-least-significant to i+1, and so on.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.Clear\">\r\n            Clears all bits (sets to false).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.IsRange(System.Int32,System.Int32,System.Boolean)\">\r\n             Efficient method to check if a range of bits is set, or not set.\r\n            \r\n             @param start start of range, inclusive.\r\n             @param end end of range, exclusive\r\n             @param value if true, checks that bits in range are set, otherwise checks that they are not set\r\n             @return true iff all bits are set or not set in range, according to value argument\r\n             @throws IllegalArgumentException if end is less than or equal to start\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.GetBitArray\">\r\n            @return underlying array of ints. The first element holds the first 32 bits, and the least\r\n                    significant bit is bit 0.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitArray.Reverse\">\r\n            Reverses all bits in the array.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.BitMatrix\">\r\n             <p>Represents a 2D matrix of bits. In function arguments below, and throughout the common\r\n             module, x is the column position, and y is the row position. The ordering is always x, y.\r\n             The origin is at the top-left.</p>\r\n            \r\n             <p>Internally the bits are represented in a 1-D array of 32-bit ints. However, each row begins\r\n             with a new int. This is done intentionally so that we can copy out a row into a BitArray very\r\n             efficiently.</p>\r\n            \r\n             <p>The ordering of bits is row-major. Within each int, the least significant bits are used first,\r\n             meaning they represent lower x values. This is compatible with BitArray's implementation.</p>\r\n            \r\n             @author Sean Owen\r\n             @author dswitkin@google.com (Daniel Switkin)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.Get(System.Int32,System.Int32)\">\r\n             <p>Gets the requested bit, where true means black.</p>\r\n            \r\n             @param x The horizontal component (i.e. which column)\r\n             @param y The vertical component (i.e. which row)\r\n             @return value of given bit in matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.Set(System.Int32,System.Int32)\">\r\n             <p>Sets the given bit to true.</p>\r\n            \r\n             @param x The horizontal component (i.e. which column)\r\n             @param y The vertical component (i.e. which row)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.Flip(System.Int32,System.Int32)\">\r\n             <p>Flips the given bit.</p>\r\n            \r\n             @param x The horizontal component (i.e. which column)\r\n             @param y The vertical component (i.e. which row)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.Clear\">\r\n            Clears all bits (sets to false).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.SetRegion(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n             <p>Sets a square region of the bit matrix to true.</p>\r\n            \r\n             @param left The horizontal position to begin at (inclusive)\r\n             @param top The vertical position to begin at (inclusive)\r\n             @param width The width of the region\r\n             @param height The height of the region\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.GetRow(System.Int32,iTextSharp.text.pdf.qrcode.BitArray)\">\r\n             A fast method to retrieve one row of data from the matrix as a BitArray.\r\n            \r\n             @param y The row to retrieve\r\n             @param row An optional caller-allocated BitArray, will be allocated if null or too small\r\n             @return The resulting BitArray - this reference should always be used even when passing\r\n                     your own row\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.GetWidth\">\r\n            @return The width of the matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.GetHeight\">\r\n            @return The height of the matrix\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.BitMatrix.GetDimension\">\r\n             This method is for compatibility with older code. It's only logical to call if the matrix\r\n             is square, so I'm throwing if that's not the case.\r\n            \r\n             @return row/column dimension of this matrix\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.BitVector\">\r\n             JAVAPORT: This should be combined with BitArray in the future, although that class is not yet\r\n             dynamically resizeable. This implementation is reasonable but there is a lot of function calling\r\n             in loops I'd like to get rid of.\r\n            \r\n             @author satorux@google.com (Satoru Takabayashi) - creator\r\n             @author dswitkin@google.com (Daniel Switkin) - ported from C++\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.ByteArray\">\r\n             This class implements an array of unsigned bytes.\r\n            \r\n             @author dswitkin@google.com (Daniel Switkin)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.ByteArray.At(System.Int32)\">\r\n            Access an unsigned byte at location index.\r\n            @param index The index in the array to access.\r\n            @return The unsigned value of the byte as an int.\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.qrcode.ByteMatrix”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.CharacterSetECI\">\r\n             Encapsulates a Character Set ECI, according to \"Extended Channel Interpretations\" 5.3.1.1\r\n             of ISO 18004.\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.CharacterSetECI.GetCharacterSetECIByName(System.String)\">\r\n            @param name character set ECI encoding name\r\n            @return {@link CharacterSetECI} representing ECI for character encoding, or null if it is legal\r\n              but unsupported\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.EncodeHintType\">\r\n             These are a set of hints that you may pass to Writers to specify their behavior.\r\n            \r\n             @author dswitkin@google.com (Daniel Switkin)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.EncodeHintType.ERROR_CORRECTION\">\r\n            Specifies what degree of error correction to use, for example in QR Codes (type Integer).\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.EncodeHintType.CHARACTER_SET\">\r\n            Specifies what character encoding to use where applicable (type String)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.Encoder\">\r\n            @author satorux@google.com (Satoru Takabayashi) - creator\r\n            @author dswitkin@google.com (Daniel Switkin) - ported from C++\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.Encode(System.String,iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel,iTextSharp.text.pdf.qrcode.QRCode)\">\r\n              Encode \"bytes\" with the error correction level \"ecLevel\". The encoding mode will be chosen\r\n             internally by ChooseMode(). On success, store the result in \"qrCode\".\r\n            \r\n             We recommend you to use QRCode.EC_LEVEL_L (the lowest level) for\r\n             \"getECLevel\" since our primary use is to show QR code on desktop screens. We don't need very\r\n             strong error correction for this purpose.\r\n            \r\n             Note that there is no way to encode bytes in MODE_KANJI. We might want to add EncodeWithMode()\r\n             with which clients can specify the encoding mode. For now, we don't need the functionality.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.GetAlphanumericCode(System.Int32)\">\r\n            @return the code point of the table used in alphanumeric mode or\r\n             -1 if there is no corresponding code in the table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.ChooseMode(System.String,System.String)\">\r\n            Choose the best mode by examining the content. Note that 'encoding' is used as a hint;\r\n            if it is Shift_JIS, and the input is only double-byte Kanji, then we return {@link Mode#KANJI}.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.InitQRCode(System.Int32,iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel,iTextSharp.text.pdf.qrcode.Mode,iTextSharp.text.pdf.qrcode.QRCode)\">\r\n            Initialize \"qrCode\" according to \"numInputBytes\", \"ecLevel\", and \"mode\". On success,\r\n            modify \"qrCode\".\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.TerminateBits(System.Int32,iTextSharp.text.pdf.qrcode.BitVector)\">\r\n            Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.GetNumDataBytesAndNumECBytesForBlockID(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32[],System.Int32[])\">\r\n            Get number of data bytes and number of error correction bytes for block id \"blockID\". Store\r\n            the result in \"numDataBytesInBlock\", and \"numECBytesInBlock\". See table 12 in 8.5.1 of\r\n            JISX0510:2004 (p.30)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.InterleaveWithECBytes(iTextSharp.text.pdf.qrcode.BitVector,System.Int32,System.Int32,System.Int32,iTextSharp.text.pdf.qrcode.BitVector)\">\r\n            Interleave \"bits\" with corresponding error correction bytes. On success, store the result in\r\n            \"result\". The interleave rule is complicated. See 8.6 of JISX0510:2004 (p.37) for details.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.AppendModeInfo(iTextSharp.text.pdf.qrcode.Mode,iTextSharp.text.pdf.qrcode.BitVector)\">\r\n            Append mode info. On success, store the result in \"bits\".\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.AppendLengthInfo(System.Int32,System.Int32,iTextSharp.text.pdf.qrcode.Mode,iTextSharp.text.pdf.qrcode.BitVector)\">\r\n            Append length info. On success, store the result in \"bits\".\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Encoder.AppendBytes(System.String,iTextSharp.text.pdf.qrcode.Mode,iTextSharp.text.pdf.qrcode.BitVector,System.String)\">\r\n            Append \"bytes\" in \"mode\" mode (encoding) into \"bits\". On success, store the result in \"bits\".\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel\">\r\n             <p>See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels\r\n             defined by the QR code standard.</p>\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel.L\">\r\n            L = ~7% correction\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel.M\">\r\n            M = ~15% correction\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel.Q\">\r\n            Q = ~25% correction\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel.H\">\r\n            H = ~30% correction\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel.ForBits(System.Int32)\">\r\n            @param bits int containing the two bits encoding a QR Code's error correction level\r\n            @return {@link ErrorCorrectionLevel} representing the encoded error correction level\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.FormatInformation\">\r\n             <p>Encapsulates a QR Code's format information, including the data mask used and\r\n             error correction level.</p>\r\n            \r\n             @author Sean Owen\r\n             @see ErrorCorrectionLevel\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.FormatInformation.FORMAT_INFO_DECODE_LOOKUP\">\r\n            See ISO 18004:2006, Annex C, Table C.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.FormatInformation.BITS_SET_IN_HALF_BYTE\">\r\n            Offset i holds the number of 1 bits in the binary representation of i\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.FormatInformation.DecodeFormatInformation(System.Int32,System.Int32)\">\r\n            @param maskedFormatInfo1 format info indicator, with mask still applied\r\n            @param maskedFormatInfo2 second copy of same info; both are checked at the same time\r\n             to establish best match\r\n            @return information about the format it specifies, or <code>null</code>\r\n             if doesn't seem to match any known pattern\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.GF256\">\r\n             <p>This class contains utility methods for performing mathematical operations over\r\n             the Galois Field GF(256). Operations use a given primitive polynomial in calculations.</p>\r\n            \r\n             <p>Throughout this package, elements of GF(256) are represented as an <code>int</code>\r\n             for convenience and speed (but at the cost of memory).\r\n             Only the bottom 8 bits are really used.</p>\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.#ctor(System.Int32)\">\r\n             Create a representation of GF(256) using the given primitive polynomial.\r\n            \r\n             @param primitive irreducible polynomial whose coefficients are represented by\r\n              the bits of an int, where the least-significant bit represents the constant\r\n              coefficient\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.BuildMonomial(System.Int32,System.Int32)\">\r\n            @return the monomial representing coefficient * x^degree\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.AddOrSubtract(System.Int32,System.Int32)\">\r\n             Implements both addition and subtraction -- they are the same in GF(256).\r\n            \r\n             @return sum/difference of a and b\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.Exp(System.Int32)\">\r\n            @return 2 to the power of a in GF(256)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.Log(System.Int32)\">\r\n            @return base 2 log of a in GF(256)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.Inverse(System.Int32)\">\r\n            @return multiplicative inverse of a\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256.Multiply(System.Int32,System.Int32)\">\r\n            @param a\r\n            @param b\r\n            @return product of a and b in GF(256)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.GF256Poly\">\r\n             <p>Represents a polynomial whose coefficients are elements of GF(256).\r\n             Instances of this class are immutable.</p>\r\n            \r\n             <p>Much credit is due to William Rucklidge since portions of this code are an indirect\r\n             port of his C++ Reed-Solomon implementation.</p>\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256Poly.#ctor(iTextSharp.text.pdf.qrcode.GF256,System.Int32[])\">\r\n            @param field the {@link GF256} instance representing the field to use\r\n            to perform computations\r\n            @param coefficients coefficients as ints representing elements of GF(256), arranged\r\n            from most significant (highest-power term) coefficient to least significant\r\n            @throws IllegalArgumentException if argument is null or empty,\r\n            or if leading coefficient is 0 and this is not a\r\n            constant polynomial (that is, it is not the monomial \"0\")\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256Poly.GetDegree\">\r\n            @return degree of this polynomial\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256Poly.IsZero\">\r\n            @return true iff this polynomial is the monomial \"0\"\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256Poly.GetCoefficient(System.Int32)\">\r\n            @return coefficient of x^degree term in this polynomial\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.GF256Poly.EvaluateAt(System.Int32)\">\r\n            @return evaluation of this polynomial at a given point\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.MaskUtil\">\r\n            @author satorux@google.com (Satoru Takabayashi) - creator\r\n            @author dswitkin@google.com (Daniel Switkin) - ported from C++\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.MatrixUtil\">\r\n            @author satorux@google.com (Satoru Takabayashi) - creator\r\n            @author dswitkin@google.com (Daniel Switkin) - ported from C++\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.Mode\">\r\n             <p>See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which\r\n             data can be encoded to bits in the QR code standard.</p>\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Mode.ForBits(System.Int32)\">\r\n            @param bits four bits encoding a QR Code data mode\r\n            @return {@link Mode} encoded by these bits\r\n            @throws IllegalArgumentException if bits do not correspond to a known mode\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Mode.GetCharacterCountBits(iTextSharp.text.pdf.qrcode.Version)\">\r\n            @param version version in question\r\n            @return number of bits used, in this QR Code symbol {@link Version}, to encode the\r\n                    count of characters that will follow encoded in this {@link Mode}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.QRCode\">\r\n            @author satorux@google.com (Satoru Takabayashi) - creator\r\n            @author dswitkin@google.com (Daniel Switkin) - ported from C++\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.QRCodeWriter\">\r\n             This object renders a QR Code as a ByteMatrix 2D array of greyscale values.\r\n            \r\n             @author dswitkin@google.com (Daniel Switkin)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.ReedSolomonEncoder\">\r\n             <p>Implements Reed-Solomon enbcoding, as the name implies.</p>\r\n            \r\n             @author Sean Owen\r\n             @author William Rucklidge\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.ReedSolomonException\">\r\n             <p>Thrown when an exception occurs during Reed-Solomon decoding, such as when\r\n             there are too many errors to correct.</p>\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.Version\">\r\n             See ISO 18004:2006 Annex D\r\n            \r\n             @author Sean Owen\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.qrcode.Version.VERSION_DECODE_INFO\">\r\n            See ISO 18004:2006 Annex D.\r\n            Element i represents the raw version bits that specify version i + 7\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Version.GetProvisionalVersionForDimension(System.Int32)\">\r\n             <p>Deduces version information purely from QR Code dimensions.</p>\r\n            \r\n             @param dimension dimension in modules\r\n             @return {@link Version} for a QR Code of that dimension\r\n             @throws FormatException if dimension is not 1 mod 4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Version.BuildFunctionPattern\">\r\n            See ISO 18004:2006 Annex E\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.Version.ECBlocks\">\r\n            <p>Encapsulates a set of error-correction blocks in one symbol version. Most versions will\r\n            use blocks of differing sizes within one version, so, this encapsulates the parameters for\r\n            each set of blocks. It also holds the number of error-correction codewords per block since it\r\n            will be the same across all blocks within one version.</p>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.Version.ECB\">\r\n            <p>Encapsualtes the parameters for one error-correction block in one symbol version.\r\n            This includes the number of data codewords, and the number of times a block with these\r\n            parameters is used consecutively in the QR code version's format.</p>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.qrcode.Version.BuildVersions\">\r\n            See ISO 18004:2006 6.5.1 Table 9\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.qrcode.WriterException\">\r\n             A base class which covers the range of exceptions which may occur when encoding a barcode using\r\n             the Writer framework.\r\n            \r\n             @author dswitkin@google.com (Daniel Switkin)\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.RadioCheckField”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.TYPE_CHECK\">\r\n            A field with the symbol check \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.TYPE_CIRCLE\">\r\n            A field with the symbol circle \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.TYPE_CROSS\">\r\n            A field with the symbol cross \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.TYPE_DIAMOND\">\r\n            A field with the symbol diamond \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.TYPE_SQUARE\">\r\n            A field with the symbol square \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.TYPE_STAR\">\r\n            A field with the symbol star \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.checkType\">\r\n            Holds value of property checkType.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.onValue\">\r\n            Holds value of property onValue.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RadioCheckField.vchecked\">\r\n            Holds value of property checked.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RadioCheckField.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String,System.String)\">\r\n            Creates a new instance of RadioCheckField\r\n            @param writer the document <CODE>PdfWriter</CODE>\r\n            @param box the field location and dimensions\r\n            @param fieldName the field name. It must not be <CODE>null</CODE>\r\n            @param onValue the value when the field is checked\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.RadioCheckField.CheckType\">\r\n            Sets the checked symbol. It can be\r\n            <CODE>TYPE_CHECK</CODE>,\r\n            <CODE>TYPE_CIRCLE</CODE>,\r\n            <CODE>TYPE_CROSS</CODE>,\r\n            <CODE>TYPE_DIAMOND</CODE>,\r\n            <CODE>TYPE_SQUARE</CODE> and\r\n            <CODE>TYPE_STAR</CODE>.\r\n            @param checkType the checked symbol\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.RadioCheckField.OnValue\">\r\n            Sets the value when the field is checked.\r\n            @param onValue the value when the field is checked\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.RadioCheckField.Checked\">\r\n            Sets the state of the field to checked or unchecked.\r\n            @param checked the state of the field, <CODE>true</CODE> for checked\r\n            and <CODE>false</CODE> for unchecked\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RadioCheckField.GetAppearance(System.Boolean,System.Boolean)\">\r\n            Gets the field appearance.\r\n            @param isRadio <CODE>true</CODE> for a radio field and <CODE>false</CODE>\r\n            for a check field\r\n            @param on <CODE>true</CODE> for the checked state, <CODE>false</CODE>\r\n            otherwise\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return the appearance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RadioCheckField.GetAppearanceRadioCircle(System.Boolean)\">\r\n            Gets the special field appearance for the radio circle.\r\n            @param on <CODE>true</CODE> for the checked state, <CODE>false</CODE>\r\n            otherwise\r\n            @return the appearance\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RadioCheckField.GetRadioGroup(System.Boolean,System.Boolean)\">\r\n            Gets a radio group. It's composed of the field specific keys, without the widget\r\n            ones. This field is to be used as a field aggregator with {@link PdfFormField#addKid(PdfFormField) AddKid()}.\r\n            @param noToggleToOff if <CODE>true</CODE>, exactly one radio button must be selected at all\r\n            times; clicking the currently selected button has no effect.\r\n            If <CODE>false</CODE>, clicking\r\n            the selected button deselects it, leaving no button selected.\r\n            @param radiosInUnison if <CODE>true</CODE>, a group of radio buttons within a radio button field that\r\n            use the same value for the on state will turn on and off in unison; that is if\r\n            one is checked, they are all checked. If <CODE>false</CODE>, the buttons are mutually exclusive\r\n            (the same behavior as HTML radio buttons)\r\n            @return the radio group\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.RadioCheckField.RadioField\">\r\n            Gets the radio field. It's only composed of the widget keys and must be used\r\n            with {@link #getRadioGroup(bool,bool)}.\r\n            @return the radio field\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.RadioCheckField.CheckField\">\r\n            Gets the check field.\r\n            @return the check field\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RadioCheckField.GetField(System.Boolean)\">\r\n            Gets a radio or check field.\r\n            @param isRadio <CODE>true</CODE> to get a radio field, <CODE>false</CODE> to get\r\n            a check field\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return the field\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.RandomAccessFileOrArray\">\r\n            Intended to be layered on top of a low level RandomAccessSource object.  Provides\r\n            functionality useful during parsing:\r\n            <ul>\r\n            \t<li>tracks current position in the file</li>\r\n            \t<li>allows single byte pushback</li>\r\n            \t<li>allows reading of multi-byte data structures (int, long, String) for both Big and Little Endian representations</li>\r\n            \t<li>allows creation of independent 'views' of the underlying data source</li>\r\n            </ul> \r\n            \r\n            @author Paulo Soares, Kevin Day\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RandomAccessFileOrArray.byteSource\">\r\n            The source that backs this object\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RandomAccessFileOrArray.byteSourcePosition\">\r\n            The physical location in the underlying byte source.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RandomAccessFileOrArray.back\">\r\n            the pushed  back byte, if any\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.RandomAccessFileOrArray.isBack\">\r\n            Whether there is a pushed back byte\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(System.String)\">\r\n            @deprecated use {@link RandomAccessFileOrArray#RandomAccessFileOrArray(RandomAccessSource)} instead\r\n            @param filename\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Creates an independent view of the specified source.  Closing the new object will not close the source.\r\n            Closing the source will have adverse effect on the behavior of the new view.\r\n            @deprecated use {@link RandomAccessFileOrArray#createView()} instead\r\n            @param source the source for the new independent view\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.CreateView\">\r\n            Creates an independent view of this object (with it's own file pointer and pushback queue).  Closing the new object will not close this object.\r\n            Closing this object will have adverse effect on the view.\r\n            @return the new view\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Creates a RandomAccessFileOrArray that wraps the specified byte source.  The byte source will be closed when\r\n            this RandomAccessFileOrArray is closed.\r\n            @param byteSource the byte source to wrap\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(System.String,System.Boolean)\">\r\n            Constructs a new RandomAccessFileOrArrayObject\r\n            @param filename the file to open (can be a file system file or one of the following url strings: file://, http://, https://, jar:, wsjar:, vfszip:\r\n            @param forceRead if true, the entire file will be read into memory\r\n            @param plainRandomAccess if true, a regular RandomAccessFile is used to access the file contents.  If false, a memory mapped file will be used, unless the file cannot be mapped into memory, in which case regular RandomAccessFile will be used\r\n            @throws IOException if there is a failure opening or reading the file\r\n            @deprecated use {@link RandomAccessSourceFactory#createBestSource(String)} and {@link RandomAccessFileOrArray#RandomAccessFileOrArray(RandomAccessSource)} instead\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(System.Uri)\">\r\n            @param url\r\n            @throws IOException\r\n            @deprecated use {@link RandomAccessSourceFactory#createSource(URL)} and {@link RandomAccessFileOrArray#RandomAccessFileOrArray(RandomAccessSource)} instead\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(System.IO.Stream)\">\r\n            @param is\r\n            @throws IOException\r\n            @deprecated use {@link RandomAccessSourceFactory#createSource(InputStream)} and {@link RandomAccessFileOrArray#RandomAccessFileOrArray(RandomAccessSource)} instead\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.#ctor(System.Byte[])\">\r\n            @param arrayIn\r\n            @throws IOException\r\n            @deprecated use {@link RandomAccessSourceFactory#createSource(byte[])} and {@link RandomAccessFileOrArray#RandomAccessFileOrArray(RandomAccessSource)} instead\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.PushBack(System.Byte)\">\r\n            Pushes a byte back.  The next get() will return this byte instead of the value from the underlying data source\r\n            @param b the byte to push\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.RandomAccessFileOrArray.Read\">\r\n            Reads a single byte\r\n            @return the byte, or -1 if EOF is reached\r\n            @throws IOException\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.RandomAccessFileOrArray.ReadShortLE”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.RandomAccessFileOrArray.ReadUnsignedShortLE”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.RandomAccessFileOrArray.ReadCharLE”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.RandomAccessFileOrArray.ReadIntLE”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.RandomAccessFileOrArray.ReadUnsignedInt”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.pdf.security.AsymmetricAlgorithmSignature\">\r\n             <summary>\r\n             This class allows you to sign with either an RSACryptoServiceProvider/DSACryptoServiceProvider from a X509Certificate2,\r\n             or from manually created RSACryptoServiceProvider/DSACryptoServiceProvider.\r\n             Depending on the certificate's CSP, sometimes you will not be able to sign with SHA-256/SHA-512 hash algorithm with \r\n             RSACryptoServiceProvider taken directly from the certificate.\r\n             This class allows you to use a workaround in this case and sign with certificate's private key and SHA-256/SHA-512 anyway.\r\n             \r\n             An example of a workaround for CSP that does not support SHA-256/SHA-512:\r\n             <code>\r\n                        if (certificate.PrivateKey is RSACryptoServiceProvider)\r\n                        {                \r\n                            RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certificate.PrivateKey;\r\n            \r\n                            // Modified by J. Arturo\r\n                            // Workaround for SHA-256 and SHA-512\r\n            \r\n                            if (rsa.CspKeyContainerInfo.ProviderName == \"Microsoft Strong Cryptographic Provider\" ||\r\n                                            rsa.CspKeyContainerInfo.ProviderName == \"Microsoft Enhanced Cryptographic Provider v1.0\" ||\r\n                                            rsa.CspKeyContainerInfo.ProviderName == \"Microsoft Base Cryptographic Provider v1.0\")\r\n                            {\r\n                                string providerName = \"Microsoft Enhanced RSA and AES Cryptographic Provider\";\r\n                                int providerType = 24;\r\n            \r\n                                Type CspKeyContainerInfo_Type = typeof(CspKeyContainerInfo);\r\n            \r\n                                FieldInfo CspKeyContainerInfo_m_parameters = CspKeyContainerInfo_Type.GetField(\"m_parameters\", BindingFlags.NonPublic | BindingFlags.Instance);\r\n                                CspParameters parameters = (CspParameters)CspKeyContainerInfo_m_parameters.GetValue(rsa.CspKeyContainerInfo);\r\n            \r\n                                var cspparams = new CspParameters(providerType, providerName, rsa.CspKeyContainerInfo.KeyContainerName);\r\n                                cspparams.Flags = parameters.Flags;\r\n            \r\n                                using (var rsaKey = new RSACryptoServiceProvider(cspparams))\r\n                                {\r\n                                    // use rsaKey now\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                // Use rsa directly\r\n                            }\r\n                        }\r\n             </code>\r\n             \r\n             </summary>\r\n             <see cref=\"!:https://blogs.msdn.microsoft.com/shawnfa/2008/08/25/using-rsacryptoserviceprovider-for-rsa-sha256-signatures/\"/>\r\n             <see cref=\"!:http://stackoverflow.com/questions/7444586/how-can-i-sign-a-file-using-rsa-and-sha256-with-net\"/>\r\n             <see cref=\"!:http://stackoverflow.com/questions/5113498/can-rsacryptoserviceprovider-nets-rsa-use-sha256-for-encryption-not-signing\"/>\r\n             <see cref=\"!:http://stackoverflow.com/questions/31553523/how-can-i-properly-verify-a-file-using-rsa-and-sha256-with-net\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.AsymmetricAlgorithmSignature.hashAlgorithm\">\r\n            The hash algorithm. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.AsymmetricAlgorithmSignature.encryptionAlgorithm\">\r\n            The encryption algorithm (obtained from the private key) \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.AsymmetricAlgorithmSignature.GetEncryptionAlgorithm\">\r\n            Returns the encryption algorithm used for signing.\r\n            @return the encryption algorithm (\"RSA\" or \"DSA\")\r\n            @see com.itextpdf.text.pdf.security.ExternalSignature#getEncryptionAlgorithm()\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.IExternalSignatureContainer\">\r\n            Interface to sign a document. The signing is fully done externally, including the container composition.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IExternalSignatureContainer.Sign(System.IO.Stream)\">\r\n            Produces the container with the signature.\r\n            @param data the data to sign\r\n            @return a container with the signature and other objects, like CRL and OCSP. The container will generally be a PKCS7 one.\r\n            @throws GeneralSecurityException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IExternalSignatureContainer.ModifySigningDictionary(iTextSharp.text.pdf.PdfDictionary)\">\r\n            Modifies the signature dictionary to suit the container. At least the keys PdfName.FILTER and \r\n            PdfName.SUBFILTER will have to be set.\r\n            @param signDic the signature dictionary\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.IXmlLocator\">\r\n            Helps to locate xml stream\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.IXpathConstructor\">\r\n            Constructor for XPath2 expression\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IXpathConstructor.GetXpathExpression\">\r\n            Get XPath2 expression\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IXpathConstructor.GetNamespaceManager\">\r\n            Get XmlNamespaceManager to resolve namespace conflicts\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.MakeXmlSignature\">\r\n            Class that signs your XML.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeXmlSignature.SignXmlDSig(iTextSharp.text.pdf.XmlSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,System.Security.Cryptography.Xml.KeyInfoClause)\">\r\n            Signs the xml using the enveloped mode, with optional xpath transform (see XmlSignatureAppearance).\r\n            @param sap the XmlSignatureAppearance\r\n            @param externalSignature  the interface providing the actual signing\r\n            @param keyInfo KeyInfo for verification\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeXmlSignature.SignXades(iTextSharp.text.pdf.XmlSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,Org.BouncyCastle.X509.X509Certificate[],System.Boolean)\">\r\n            Signs the xml with XAdES BES using the enveloped mode, with optional xpath transform (see XmlSignatureAppearance).\r\n            @param sap the XmlSignatureAppearance\r\n            @param externalSignature  the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @param includeSignaturePolicy if true SignaturePolicyIdentifier will be included (XAdES-EPES)\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeXmlSignature.SignXadesBes(iTextSharp.text.pdf.XmlSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,Org.BouncyCastle.X509.X509Certificate[])\">\r\n            Signs the xml with XAdES BES using the enveloped mode, with optional xpath transform (see XmlSignatureAppearance).\r\n            @param sap the XmlSignatureAppearance\r\n            @param externalSignature  the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeXmlSignature.SignXadesEpes(iTextSharp.text.pdf.XmlSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,Org.BouncyCastle.X509.X509Certificate[])\">\r\n            Signs the xml with XAdES BES using the enveloped mode, with optional xpath transform (see XmlSignatureAppearance).\r\n            @param sap the XmlSignatureAppearance\r\n            @param externalSignature  the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeXmlSignature.SignXmlDSig(iTextSharp.text.pdf.XmlSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,Org.BouncyCastle.X509.X509Certificate[])\">\r\n            Signs the xml using the enveloped mode, with optional xpath transform (see XmlSignatureAppearance).\r\n            @param sap the XmlSignatureAppearance\r\n            @param externalSignature  the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeXmlSignature.SignXmlDSig(iTextSharp.text.pdf.XmlSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,System.Security.Cryptography.AsymmetricAlgorithm)\">\r\n            Signs the xml using the enveloped mode, with optional xpath transform (see XmlSignatureAppearance).\r\n            @param sap the XmlSignatureAppearance\r\n            @param externalSignature  the interface providing the actual signing\r\n            @param publicKey PublicKey for verification\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.PdfSignatureAppDictionary\">\r\n            A dictionary that stores the name of the application that signs the PDF.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfSignatureAppDictionary.#ctor\">\r\n            Creates new PdfSignatureAppDictionary \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfSignatureAppDictionary.SignatureCreator\">\r\n            Sets the signature created property in the Prop_Build dictionary's App\r\n            dictionary\r\n            \r\n            @param name\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.PdfSignatureBuildProperties\">\r\n            Dictionary that stores signature build properties.\r\n            @author Kwinten Pisman\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfSignatureBuildProperties.#ctor\">\r\n            Creates new PdfSignatureBuildProperties \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfSignatureBuildProperties.SignatureCreator\">\r\n            Sets the signatureCreator property in the underlying\r\n            {@link PdfSignatureAppDictionary} dictionary.\r\n            \r\n            @param name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfSignatureBuildProperties.GetPdfSignatureAppProperty\">\r\n            Gets the {@link PdfSignatureAppDictionary} from this dictionary. If it\r\n            does not exist, it adds a new {@link PdfSignatureAppDictionary} and\r\n            returns this instance.\r\n            \r\n            @return {@link PdfSignatureAppDictionary}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.SignaturePolicyInfo\">\r\n            Class that encapsulates the signature policy information\r\n            @author J. Arturo\r\n            \r\n            Sample:\r\n            \r\n                 SignaturePolicyInfo spi = new SignaturePolicyInfo(\"2.16.724.1.3.1.1.2.1.9\", \r\n                 \"G7roucf600+f03r/o0bAOQ6WAs0=\", \"SHA-1\", \"https://sede.060.gob.es/politica_de_firma_anexo_1.pdf\");\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CertificateInfo\">\r\n            Class containing static methods that allow you to get information from\r\n            an X509 Certificate: the issuer and the subject.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CertificateInfo.X509Name\">\r\n            a class that holds an X509 name\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.C\">\r\n            country code - StringType(SIZE(2))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.O\">\r\n            organization - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.OU\">\r\n            organizational unit name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.T\">\r\n            Title\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.CN\">\r\n            common name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.SN\">\r\n            device serial number name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.L\">\r\n            locality name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.ST\">\r\n            state, or province name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.SURNAME\">\r\n            Naming attribute of type X520name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.GIVENNAME\">\r\n            Naming attribute of type X520name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.INITIALS\">\r\n            Naming attribute of type X520name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.GENERATION\">\r\n            Naming attribute of type X520name \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.UNIQUE_IDENTIFIER\">\r\n            Naming attribute of type X520name \r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.EmailAddress”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.E\">\r\n            email address in Verisign certificates\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.DC\">\r\n            object identifier \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.UID\">\r\n            LDAP User id. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.DefaultSymbols\">\r\n            A Hashtable with default symbols \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateInfo.X509Name.values\">\r\n            A Hashtable with values \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.X509Name.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Constructs an X509 name\r\n            @param seq an Asn1 Sequence\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.X509Name.#ctor(System.String)\">\r\n            Constructs an X509 name\r\n            @param dirName a directory name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.X509Name.GetFieldArray(System.String)\">\r\n            gets a field array from the values Hashmap\r\n            @param name\r\n            @return an ArrayList\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.X509Name.GetFields\">\r\n            getter for values\r\n            @return a Hashtable with the fields of the X509 name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.X509Name.ToString\">\r\n            @see java.lang.Object#toString()\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CertificateInfo.X509NameTokenizer\">\r\n            class for breaking up an X500 Name into it's component tokens, ala\r\n            java.util.StringTokenizer. We need this class as some of the\r\n            lightweight Java environment don't support classes like\r\n            StringTokenizer.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.GetIssuerFields(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Get the issuer fields from an X509 Certificate\r\n            @param cert an X509Certificate\r\n            @return an X509Name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.GetIssuer(System.Byte[])\">\r\n            Get the \"issuer\" from the TBSCertificate bytes that are passed in\r\n            @param enc a TBSCertificate in a byte array\r\n            @return a DERObject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.GetSubjectFields(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Get the subject fields from an X509 Certificate\r\n            @param cert an X509Certificate\r\n            @return an X509Name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateInfo.GetSubject(System.Byte[])\">\r\n            Get the \"subject\" from the TBSCertificate bytes that are passed in\r\n            @param enc A TBSCertificate in a byte array\r\n            @return a DERObject\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CertificateUtil\">\r\n            This class contains a series of static methods that\r\n            allow you to retrieve information from a Certificate.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateUtil.GetCRLURL(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Gets the URL of the Certificate Revocation List for a Certificate\r\n            @param certificate   the Certificate\r\n            @return  the String where you can check if the certificate was revoked\r\n            @throws CertificateParsingException\r\n            @throws IOException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateUtil.GetOCSPURL(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Retrieves the OCSP URL from the given certificate.\r\n            @param certificate the certificate\r\n            @return the URL or null\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateUtil.GetTSAURL(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Gets the URL of the TSA if it's available on the certificate\r\n            @param certificate   a certificate\r\n            @return  a TSA URL\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateUtil.GetExtensionValue(Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            @param certificate   the certificate from which we need the ExtensionValue\r\n            @param oid the Object Identifier value for the extension.\r\n            @return  the extension value as an ASN1Primitive object\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateUtil.GetStringFromGeneralName(Org.BouncyCastle.Asn1.Asn1Object)\">\r\n            Gets a String from an ASN1Primitive\r\n            @param names the ASN1Primitive\r\n            @return  a human-readable String\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CertificateVerification\">\r\n            This class consists of some methods that allow you to verify certificates.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerification.VerifyCertificate(Org.BouncyCastle.X509.X509Certificate,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Crl},System.DateTime)\">\r\n            Verifies a single certificate.\r\n            @param cert the certificate to verify\r\n            @param crls the certificate revocation list or <CODE>null</CODE>\r\n            @param calendar the date or <CODE>null</CODE> for the current date\r\n            @return a <CODE>String</CODE> with the error description or <CODE>null</CODE>\r\n            if no error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerification.VerifyCertificates(System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Crl},System.DateTime)\">\r\n            Verifies a certificate chain against a KeyStore.\r\n            @param certs the certificate chain\r\n            @param keystore the <CODE>KeyStore</CODE>\r\n            @param crls the certificate revocation list or <CODE>null</CODE>\r\n            @param calendar the date or <CODE>null</CODE> for the current date\r\n            @return <CODE>null</CODE> if the certificate chain could be validated or a\r\n            <CODE>Object[]{cert,error}</CODE> where <CODE>cert</CODE> is the\r\n            failed certificate and <CODE>error</CODE> is the error message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerification.VerifyCertificates(System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.DateTime)\">\r\n            Verifies a certificate chain against a KeyStore.\r\n            @param certs the certificate chain\r\n            @param keystore the <CODE>KeyStore</CODE>\r\n            @param calendar the date or <CODE>null</CODE> for the current date\r\n            @return <CODE>null</CODE> if the certificate chain could be validated or a\r\n            <CODE>Object[]{cert,error}</CODE> where <CODE>cert</CODE> is the\r\n            failed certificate and <CODE>error</CODE> is the error message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerification.VerifyOcspCertificates(Org.BouncyCastle.Ocsp.BasicOcspResp,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate})\">\r\n            Verifies an OCSP response against a KeyStore.\r\n            @param ocsp the OCSP response\r\n            @param keystore the <CODE>KeyStore</CODE>\r\n            @param provider the provider or <CODE>null</CODE> to use the BouncyCastle provider\r\n            @return <CODE>true</CODE> is a certificate was found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerification.VerifyTimestampCertificates(Org.BouncyCastle.Tsp.TimeStampToken,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate})\">\r\n            Verifies a time stamp against a KeyStore.\r\n            @param ts the time stamp\r\n            @param keystore the <CODE>KeyStore</CODE>\r\n            @param provider the provider or <CODE>null</CODE> to use the BouncyCastle provider\r\n            @return <CODE>true</CODE> is a certificate was found\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateVerifier.verifier\">\r\n            The previous CertificateVerifier in the chain of verifiers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CertificateVerifier.onlineCheckingAllowed\">\r\n            Indicates if going online to verify a certificate is allowed. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerifier.#ctor(iTextSharp.text.pdf.security.CertificateVerifier)\">\r\n            Creates the CertificateVerifier in a chain of verifiers.\r\n            @param verifier\tthe previous verifier in the chain\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.CertificateVerifier.OnlineCheckingAllowed\">\r\n            Decide whether or not online checking is allowed.\r\n            @param onlineCheckingAllowed\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CertificateVerifier.Verify(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Checks the validity of the certificate, and calls the next\r\n            verifier in the chain, if any.\r\n            @param signCert\tthe certificate that needs to be checked\r\n            @param issuerCert\tits issuer\r\n            @param signDate\t\tthe date the certificate needs to be valid\r\n            @return a list of <code>VerificationOK</code> objects.\r\n            The list will be empty if the certificate couldn't be verified.\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CrlClientOffline\">\r\n            An implementation of the CrlClient that handles offline\r\n            Certificate Revocation Lists.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CrlClientOffline.crls\">\r\n            The CRL as a byte array. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOffline.#ctor(System.Byte[])\">\r\n            Creates an instance of a CrlClient in case you\r\n            have a local cache of the Certificate Revocation List.\r\n            @param crlEncoded    the CRL bytes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOffline.GetEncoded(Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            Returns the CRL bytes (the parameters are ignored).\r\n            @see com.itextpdf.text.pdf.security.CrlClient#getEncoded(java.security.cert.X509Certificate, java.lang.String)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.CrlClientOnline\">\r\n            An implementation of the CrlClient that fetches the CRL bytes\r\n            from an URL.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CrlClientOnline.LOGGER\">\r\n            The Logger instance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CrlClientOnline.urls\">\r\n            The URLs of the CRLs. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOnline.#ctor\">\r\n            Creates a CrlClientOnline instance that will try to find\r\n            a single CRL by walking through the certificate chain.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOnline.#ctor(System.String[])\">\r\n            Creates a CrlClientOnline instance using one or more URLs.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOnline.#ctor(System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate})\">\r\n            Creates a CrlClientOnline instance using a certificate chain.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOnline.AddUrl(System.String)\">\r\n            Adds an URL to the list of CRL URLs\r\n            @param url\tan URL in the form of a String\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlClientOnline.GetEncoded(Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            Fetches the CRL bytes from an URL.\r\n            If no url is passed as parameter, the url will be obtained from the certificate.\r\n            If you want to load a CRL from a local file, subclass this method and pass an\r\n            URL with the path to the local file to this method. An other option is to use\r\n            the CrlClientOffline class.\r\n            @see com.itextpdf.text.pdf.security.CrlClient#getEncoded(java.security.cert.X509Certificate, java.lang.String)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CrlVerifier.LOGGER\">\r\n            The Logger instance \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.CrlVerifier.crls\">\r\n            The list of CRLs to check for revocation date. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlVerifier.#ctor(iTextSharp.text.pdf.security.CertificateVerifier,System.Collections.Generic.List{Org.BouncyCastle.X509.X509Crl})\">\r\n            Creates a CRLVerifier instance.\r\n            @param verifier\tthe next verifier in the chain\r\n            @param crls a list of CRLs\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlVerifier.Verify(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Verifies if a a valid CRL is found for the certificate.\r\n            If this method returns false, it doesn't mean the certificate isn't valid.\r\n            It means we couldn't verify it against any CRL that was available.\r\n            @param signCert\tthe certificate that needs to be checked\r\n            @param issuerCert\tits issuer\r\n            @return a list of <code>VerificationOK</code> objects.\r\n            The list will be empty if the certificate couldn't be verified.\r\n            @see com.itextpdf.text.pdf.security.RootStoreVerifier#verify(java.security.cert.X509Certificate, java.security.cert.X509Certificate, java.util.Date)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlVerifier.Verify(Org.BouncyCastle.X509.X509Crl,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Verifies a certificate against a single CRL.\r\n            @param crl\tthe Certificate Revocation List\r\n            @param signCert\ta certificate that needs to be verified\r\n            @param issuerCert\tits issuer\r\n            @param signDate\t\tthe sign date\r\n            @return true if the verification succeeded\r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlVerifier.GetCrl(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate)\">\r\n            Fetches a CRL for a specific certificate online (without further checking).\r\n            @param signCert\tthe certificate\r\n            @param issuerCert\tits issuer\r\n            @return\tan X509CRL object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.CrlVerifier.IsSignatureValid(Org.BouncyCastle.X509.X509Crl,Org.BouncyCastle.X509.X509Certificate)\">\r\n            Checks if a CRL verifies against the issuer certificate or a trusted anchor.\r\n            @param crl\tthe CRL\r\n            @param crlIssuer\tthe trusted anchor\r\n            @return\ttrue if the CRL can be trusted\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.DigestAlgorithms\">\r\n            Class that contains a map with the different message digest algorithms.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.SHA1\">\r\n            Algorithm available for signatures since PDF 1.3 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.SHA256\">\r\n            Algorithm available for signatures since PDF 1.6 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.SHA384\">\r\n            Algorithm available for signatures since PDF 1.7 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.SHA512\">\r\n            Algorithm available for signatures since PDF 1.7 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.RIPEMD160\">\r\n            Algorithm available for signatures since PDF 1.7 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.digestNames\">\r\n            Maps the digest IDs with the human-readable name of the digest algorithm. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.DigestAlgorithms.allowedDigests\">\r\n            Maps the name of a digest algorithm with its ID. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.DigestAlgorithms.GetMessageDigest(System.String)\">\r\n            Creates a MessageDigest object that can be used to create a hash.\r\n            @param hashAlgorithm the algorithm you want to use to create a hash\r\n            @param provider  the provider you want to use to create the hash\r\n            @return  a MessageDigest object\r\n            @throws NoSuchAlgorithmException \r\n            @throws NoSuchProviderException \r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.DigestAlgorithms.Digest(System.IO.Stream,System.String)\">\r\n            Creates a hash using a specific digest algorithm and a provider. \r\n            @param data  the message of which you want to create a hash\r\n            @param hashAlgorithm the algorithm used to create the hash\r\n            @param provider  the provider used to create the hash\r\n            @return  the hash\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.DigestAlgorithms.GetDigest(System.String)\">\r\n            Gets the digest name for a certain id\r\n            @param oid   an id (for instance \"1.2.840.113549.2.5\")\r\n            @return  a digest name (for instance \"MD5\")\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.DigestAlgorithms.GetAllowedDigests(System.String)\">\r\n            Returns the id of a digest algorithms that is allowed in PDF,\r\n            or null if it isn't allowed. \r\n            @param name  the name of the digest algorithm\r\n            @return  an oid\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.EncryptionAlgorithms\">\r\n            Class that contains a map with the different encryption algorithms.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.EncryptionAlgorithms.algorithmNames\">\r\n            Maps IDs of encryption algorithms with its human-readable name. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.EncryptionAlgorithms.GetAlgorithm(System.String)\">\r\n            Gets the algorithm name for a certain id.\r\n            @param oid    an id (for instance \"1.2.840.113549.1.1.1\")\r\n            @return   an algorithm name (for instance \"RSA\")\r\n            @since    2.1.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.ICrlClient\">\r\n            Interface that needs to be implemented if you want to embed\r\n            Certificate Revocation Lists into your PDF.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.ICrlClient.GetEncoded(Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            Gets a collection of byte array each representing a crl.\r\n            @param\tcheckCert\tthe certificate from which a CRL URL can be obtained\r\n            @param\turl\t\ta CRL url if you don't want to obtain it from the certificate\r\n            @return\ta collection of byte array each representing a crl. It may return null or an empty collection\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.IExternalSignature\">\r\n            Interface that needs to be implemented to do the actual signing.\r\n            For instance: you'll have to implement this interface if you want\r\n            to sign a PDF using a smart card.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IExternalSignature.GetHashAlgorithm\">\r\n            Returns the hash algorithm.\r\n            @return  the hash algorithm (e.g. \"SHA-1\", \"SHA-256,...\")\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IExternalSignature.GetEncryptionAlgorithm\">\r\n            Returns the encryption algorithm used for signing.\r\n            @return the encryption algorithm (\"RSA\" or \"DSA\")\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IExternalSignature.Sign(System.Byte[])\">\r\n            Signs it using the encryption algorithm in combination with\r\n            the digest algorithm.\r\n            @param message   the message you want to be hashed and signed\r\n            @return  a signed message digest\r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.IOcspClient\">\r\n            Interface for the OCSP Client.\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.IOcspClient.GetEncoded(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            \t     * Gets an encoded byte array with OCSP validation. The method should not throw an exception.\r\n                     * @param checkCert to certificate to check\r\n                     * @param rootCert the parent certificate\r\n                     * @param url the url to get the verification. It it's null it will be taken\r\n                     * from the check cert or from other implementation specific source\r\n            \t     * @return\ta byte array with the validation or null if the validation could not be obtained\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.security.ITSAClient”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.security.ITSAClient.GetTokenSizeEstimate\">\r\n            Get the time stamp token size estimate.\r\n            Implementation must return value large enough to accomodate the entire token\r\n            returned by getTimeStampToken() _prior_ to actual getTimeStampToken() call.\r\n            @return   an estimate of the token size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.ITSAClient.GetMessageDigest\">\r\n            Gets the MessageDigest to digest the data imprint\r\n            @return the digest algorithm name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.ITSAClient.GetTimeStampToken(System.Byte[])\">\r\n            Get RFC 3161 timeStampToken.\r\n            Method may return null indicating that timestamp should be skipped.\r\n            @param imprint byte[] - data imprint to be time-stamped\r\n            @return byte[] - encoded, TSA signed data of the timeStampToken\r\n            @throws Exception - TSA request failed\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.LtvTimestamp\">\r\n            PAdES-LTV Timestamp\r\n            @author Pulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvTimestamp.Timestamp(iTextSharp.text.pdf.PdfSignatureAppearance,iTextSharp.text.pdf.security.ITSAClient,System.String)\">\r\n            Signs a document with a PAdES-LTV Timestamp. The document is closed at the end.\r\n            @param sap the signature appearance\r\n            @param tsa the timestamp generator\r\n            @param signatureName the signature name or null to have a name generated\r\n            automatically\r\n            @throws Exception\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.LtvVerification\">\r\n            Add verification according to PAdES-LTV (part 4)\r\n            @author psoares\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.LtvVerification.Level\">\r\n            What type of verification to include \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.Level.OCSP\">\r\n            Include only OCSP\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.Level.CRL\">\r\n            Include only CRL\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.Level.OCSP_CRL\">\r\n            Include both OCSP and CRL\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.Level.OCSP_OPTIONAL_CRL\">\r\n            Include CRL only if OCSP can't be read\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.LtvVerification.CertificateOption\">\r\n            Options for how many certificates to include\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.CertificateOption.SIGNING_CERTIFICATE\">\r\n            Include verification just for the signing certificate\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.CertificateOption.WHOLE_CHAIN\">\r\n            Include verification for the whole chain of certificates\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.LtvVerification.CertificateInclusion\">\r\n            Certificate inclusion in the DSS and VRI dictionaries in the CERT and CERTS\r\n            keys\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.CertificateInclusion.YES\">\r\n            Include certificates in the DSS and VRI dictionaries\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerification.CertificateInclusion.NO\">\r\n            Do not include certificates in the DSS and VRI dictionaries\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerification.#ctor(iTextSharp.text.pdf.PdfStamper)\">\r\n            The verification constructor. This class should only be created with\r\n            PdfStamper.getLtvVerification() otherwise the information will not be\r\n            added to the Pdf.\r\n            @param stp the PdfStamper to apply the validation to\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerification.AddVerification(System.String,iTextSharp.text.pdf.security.IOcspClient,iTextSharp.text.pdf.security.ICrlClient,iTextSharp.text.pdf.security.LtvVerification.CertificateOption,iTextSharp.text.pdf.security.LtvVerification.Level,iTextSharp.text.pdf.security.LtvVerification.CertificateInclusion)\">\r\n            Add verification for a particular signature\r\n            @param signatureName the signature to validate (it may be a timestamp)\r\n            @param ocsp the interface to get the OCSP\r\n            @param crl the interface to get the CRL\r\n            @param certOption\r\n            @param level the validation options to include\r\n            @param certInclude\r\n            @return true if a validation was generated, false otherwise\r\n            @throws Exception\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerification.GetParent(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate[])\">\r\n            Returns the issuing certificate for a child certificate.\r\n            @param cert  the certificate for which we search the parent\r\n            @param certs an array with certificates that contains the parent\r\n            @return  the partent certificate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerification.AddVerification(System.String,System.Collections.Generic.ICollection{System.Byte[]},System.Collections.Generic.ICollection{System.Byte[]},System.Collections.Generic.ICollection{System.Byte[]})\">\r\n             Alternative addVerification.\r\n             I assume that inputs are deduplicated.\r\n            \r\n             @throws IOException\r\n             @throws GeneralSecurityException\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerification.Merge\">\r\n            Merges the validation with any validation already in the document or creates\r\n            a new one.\r\n            @throws IOException \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.LOGGER\">\r\n            The Logger instance \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.option\">\r\n            Do we need to check all certificate, or only the signing certificate? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.verifyRootCertificate\">\r\n            Verify root. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.reader\">\r\n            A reader object for the revision that is being verified. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.fields\">\r\n            The fields in the revision that is being verified. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.signDate\">\r\n            The date the revision was signed, or <code>null</code> for the highest revision. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.signatureName\">\r\n            The signature that covers the revision. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.pkcs7\">\r\n            The PdfPKCS7 object for the signature. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.latestRevision\">\r\n            Indicates if we're working with the latest revision. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.LtvVerifier.dss\">\r\n            The document security store for the revision that is being verified \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.#ctor(iTextSharp.text.pdf.PdfReader)\">\r\n            Creates a VerificationData object for a PdfReader\r\n            @param reader\ta reader for the document we want to verify.\r\n            @throws GeneralSecurityException \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.LtvVerifier.Verifier\">\r\n            Sets an extra verifier.\r\n            @param verifier the verifier to set\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.LtvVerifier.CertificateOption\">\r\n            Sets the certificate option.\r\n            @param\toption\tEither CertificateOption.SIGNING_CERTIFICATE (default) or CertificateOption.WHOLE_CHAIN\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.LtvVerifier.VerifyRootCertificate\">\r\n            Set the verifyRootCertificate to false if you can't verify the root certificate.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.CoversWholeDocument\">\r\n            Checks if the signature covers the whole document\r\n            and throws an exception if the document was altered\r\n            @return a PdfPKCS7 object\r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.Verify(System.Collections.Generic.List{iTextSharp.text.pdf.security.VerificationOK})\">\r\n            Verifies all the document-level timestamps and all the signatures in the document.\r\n            @throws IOException\r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.VerifySignature\">\r\n            Verifies a document level timestamp.\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.VerifyChain(Org.BouncyCastle.X509.X509Certificate[])\">\r\n            Checks the certificates in a certificate chain:\r\n            are they valid on a specific date, and\r\n            do they chain up correctly?\r\n            @param chain\r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.Verify(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Verifies certificates against a list of CRLs and OCSP responses.\r\n            @param signingCert\r\n            @param issuerCert\r\n            @return a list of <code>VerificationOK</code> objects.\r\n            The list will be empty if the certificate couldn't be verified.\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @see com.itextpdf.text.pdf.security.RootStoreVerifier#verify(java.security.cert.X509Certificate, java.security.cert.X509Certificate)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.SwitchToPreviousRevision\">\r\n            Switches to the previous revision.\r\n            @throws IOException\r\n            @throws GeneralSecurityException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.GetCRLsFromDSS\">\r\n            Gets a list of X509CRL objects from a Document Security Store.\r\n            @return\ta list of CRLs\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.LtvVerifier.GetOCSPResponsesFromDSS\">\r\n            Gets OCSP responses from the Document Security Store.\r\n            @return\ta list of BasicOCSPResp objects\r\n            @throws IOException\r\n            @throws GeneralSecurityException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.MakeSignature\">\r\n            Class that signs your PDF.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.MakeSignature.LOGGER\">\r\n            The Logger instance. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeSignature.SignDetached(iTextSharp.text.pdf.PdfSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.Collections.Generic.ICollection{iTextSharp.text.pdf.security.ICrlClient},iTextSharp.text.pdf.security.IOcspClient,iTextSharp.text.pdf.security.ITSAClient,System.Int32,iTextSharp.text.pdf.security.CryptoStandard)\">\r\n            Signs the document using the detached mode, CMS or CAdES equivalent.\r\n            @param sap the PdfSignatureAppearance\r\n            @param externalSignature the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @param crlList the CRL list\r\n            @param ocspClient the OCSP client\r\n            @param tsaClient the Timestamp client\r\n            @param provider the provider or null\r\n            @param estimatedSize the reserved size for the signature. It will be estimated if 0\r\n            @param cades true to sign CAdES equivalent PAdES-BES, false to sign CMS\r\n            @throws DocumentException \r\n            @throws IOException \r\n            @throws GeneralSecurityException \r\n            @throws NoSuchAlgorithmException \r\n            @throws Exception \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeSignature.SignDetached(iTextSharp.text.pdf.PdfSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.Collections.Generic.ICollection{iTextSharp.text.pdf.security.ICrlClient},iTextSharp.text.pdf.security.IOcspClient,iTextSharp.text.pdf.security.ITSAClient,System.Int32,iTextSharp.text.pdf.security.CryptoStandard,iTextSharp.text.pdf.security.SignaturePolicyInfo)\">\r\n            Signs the document using the detached mode, CMS or CAdES equivalent.\r\n            @param sap the PdfSignatureAppearance\r\n            @param externalSignature the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @param crlList the CRL list\r\n            @param ocspClient the OCSP client\r\n            @param tsaClient the Timestamp client\r\n            @param provider the provider or null\r\n            @param estimatedSize the reserved size for the signature. It will be estimated if 0\r\n            @param cades true to sign CAdES equivalent PAdES-BES, false to sign CMS\r\n            @param signaturePolicy the signature policy (for EPES signatures)\r\n            @throws DocumentException \r\n            @throws IOException \r\n            @throws GeneralSecurityException \r\n            @throws NoSuchAlgorithmException \r\n            @throws Exception \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeSignature.SignDetached(iTextSharp.text.pdf.PdfSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignature,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.Collections.Generic.ICollection{iTextSharp.text.pdf.security.ICrlClient},iTextSharp.text.pdf.security.IOcspClient,iTextSharp.text.pdf.security.ITSAClient,System.Int32,iTextSharp.text.pdf.security.CryptoStandard,Org.BouncyCastle.Asn1.Esf.SignaturePolicyIdentifier)\">\r\n            Signs the document using the detached mode, CMS or CAdES equivalent.\r\n            @param sap the PdfSignatureAppearance\r\n            @param externalSignature the interface providing the actual signing\r\n            @param chain the certificate chain\r\n            @param crlList the CRL list\r\n            @param ocspClient the OCSP client\r\n            @param tsaClient the Timestamp client\r\n            @param provider the provider or null\r\n            @param estimatedSize the reserved size for the signature. It will be estimated if 0\r\n            @param cades true to sign CAdES equivalent PAdES-BES, false to sign CMS\r\n            @param signaturePolicy the signature policy (for EPES signatures)\r\n            @throws DocumentException \r\n            @throws IOException \r\n            @throws GeneralSecurityException \r\n            @throws NoSuchAlgorithmException \r\n            @throws Exception \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeSignature.ProcessCrl(Org.BouncyCastle.X509.X509Certificate,System.Collections.Generic.ICollection{iTextSharp.text.pdf.security.ICrlClient})\">\r\n            Processes a CRL list.\r\n            @param cert\ta Certificate if one of the CrlList implementations needs to retrieve the CRL URL from it.\r\n            @param crlList\ta list of CrlClient implementations\r\n            @return\ta collection of CRL bytes that can be embedded in a PDF.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeSignature.SignExternalContainer(iTextSharp.text.pdf.PdfSignatureAppearance,iTextSharp.text.pdf.security.IExternalSignatureContainer,System.Int32)\">\r\n            Sign the document using an external container, usually a PKCS7. The signature is fully composed\r\n            externally, iText will just put the container inside the document.\r\n            @param sap the PdfSignatureAppearance\r\n            @param externalSignatureContainer the interface providing the actual signing\r\n            @param estimatedSize the reserved size for the signature\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n            @throws DocumentException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.MakeSignature.SignDeferred(iTextSharp.text.pdf.PdfReader,System.String,System.IO.Stream,iTextSharp.text.pdf.security.IExternalSignatureContainer)\">\r\n            Signs a PDF where space was already reserved.\r\n            @param reader the original PDF\r\n            @param fieldName the field to sign. It must be the last field\r\n            @param outs the output PDF\r\n            @param externalSignatureContainer the signature container doing the actual signing. Only the \r\n            method ExternalSignatureContainer.sign is used\r\n            @throws DocumentException\r\n            @throws IOException\r\n            @throws GeneralSecurityException \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.OcspClientBouncyCastle\">\r\n            OcspClient implementation using BouncyCastle.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspClientBouncyCastle.#ctor\">\r\n            Create default implemention of {@code OcspClient}.\r\n            Note, if you use this constructor, OCSP response will not be verified.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspClientBouncyCastle.#ctor(iTextSharp.text.pdf.security.OcspVerifier)\">\r\n            Create {@code OcspClient}\r\n            @param verifier will be used for response verification. {@see OCSPVerifier}.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspClientBouncyCastle.GetBasicOCSPResp(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            Gets OCSP response. If {@see OCSPVerifier} was set, the response will be checked.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspClientBouncyCastle.GetEncoded(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n             Gets an encoded byte array with OCSP validation. The method should not throw an exception.\r\n            \r\n             @param checkCert to certificate to check\r\n             @param rootCert  the parent certificate\r\n             @param url       to get the verification. It it's null it will be taken\r\n                              from the check cert or from other implementation specific source\r\n             @return a byte array with the validation or null if the validation could not be obtained\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspClientBouncyCastle.GenerateOCSPRequest(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Math.BigInteger)\">\r\n            Generates an OCSP request using BouncyCastle.\r\n            @param issuerCert\tcertificate of the issues\r\n            @param serialNumber\tserial number\r\n            @return\tan OCSP request\r\n            @throws OCSPException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.OcspVerifier.LOGGER\">\r\n            The Logger instance \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.OcspVerifier.ocsps\">\r\n            The list of OCSP responses. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.#ctor(iTextSharp.text.pdf.security.CertificateVerifier,System.Collections.Generic.List{Org.BouncyCastle.Ocsp.BasicOcspResp})\">\r\n            Creates an OCSPVerifier instance.\r\n            @param verifier\tthe next verifier in the chain\r\n            @param ocsps a list of OCSP responses\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.Verify(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Verifies if a a valid OCSP response is found for the certificate.\r\n            If this method returns false, it doesn't mean the certificate isn't valid.\r\n            It means we couldn't verify it against any OCSP response that was available.\r\n            @param signCert\tthe certificate that needs to be checked\r\n            @param issuerCert\tits issuer\r\n            @return a list of <code>VerificationOK</code> objects.\r\n            The list will be empty if the certificate couldn't be verified.\r\n            @see com.itextpdf.text.pdf.security.RootStoreVerifier#verify(java.security.cert.X509Certificate, java.security.cert.X509Certificate, java.util.Date)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.Verify(Org.BouncyCastle.Ocsp.BasicOcspResp,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Verifies a certificate against a single OCSP response\r\n            @param ocspResp\tthe OCSP response\r\n            @param signCert  the certificate that needs to be checked\r\n            @param issuerCert  the certificate of CA\r\n            @param signDate  sign date\r\n            @return {@code true}, in case successful check, otherwise false.\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.IsValidResponse(Org.BouncyCastle.Ocsp.BasicOcspResp,Org.BouncyCastle.X509.X509Certificate)\">\r\n            Verifies if an OCSP response is genuine\r\n             If it doesn't verify against the issuer certificate and response's certificates, it may verify\r\n            using a trusted anchor or cert.\r\n            @param ocspResp\tthe OCSP response\r\n            @param issuerCert\tthe issuer certificate\r\n            @throws GeneralSecurityException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.VerifyResponse(Org.BouncyCastle.Ocsp.BasicOcspResp,Org.BouncyCastle.X509.X509Certificate)\">\r\n            Verifies if the response is valid.\r\n            If it doesn't verify against the issuer certificate and response's certificates, it may verify\r\n            using a trusted anchor or cert.\r\n            NOTE. Use {@code isValidResponse()} instead.\r\n            @param ocspResp\tthe response object\r\n            @param issuerCert the issuer certificate\r\n            @return\ttrue if the response can be trusted\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.IsSignatureValid(Org.BouncyCastle.Ocsp.BasicOcspResp,Org.BouncyCastle.X509.X509Certificate)\">\r\n            Checks if an OCSP response is genuine\r\n            @param ocspResp\tthe OCSP response\r\n            @param responderCert\tthe responder certificate\r\n            @return\ttrue if the OCSP response verifies against the responder certificate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.OcspVerifier.GetOcspResponse(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate)\">\r\n            Gets an OCSP response online and returns it if the status is GOOD\r\n            (without further checking).\r\n            @param signCert\tthe signing certificate\r\n            @param issuerCert\tthe issuer certificate\r\n            @return an OCSP response\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.PdfPKCS7\">\r\n            This class does all the processing related to signing\r\n            and verifying a PKCS#7 signature.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.#ctor(Org.BouncyCastle.Crypto.ICipherParameters,System.Collections.Generic.ICollection{Org.BouncyCastle.X509.X509Certificate},System.String,System.Boolean)\">\r\n            Assembles all the elements needed to create a signature, except for the data.\r\n            @param privKey the private key\r\n            @param certChain the certificate chain\r\n            @param interfaceDigest the interface digest\r\n            @param hashAlgorithm the hash algorithm\r\n            @param provider the provider or <code>null</code> for the default provider\r\n            @param hasRSAdata <CODE>true</CODE> if the sub-filter is adbe.pkcs7.sha1\r\n            @throws InvalidKeyException on error\r\n            @throws NoSuchProviderException on error\r\n            @throws NoSuchAlgorithmException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.#ctor(System.Byte[],System.Byte[])\">\r\n            Use this constructor if you want to verify a signature using the sub-filter adbe.x509.rsa_sha1.\r\n            @param contentsKey the /Contents key\r\n            @param certsKey the /Cert key\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.#ctor(System.Byte[],iTextSharp.text.pdf.PdfName)\">\r\n            Use this constructor if you want to verify a signature.\r\n            @param contentsKey the /Contents key\r\n            @param filterSubtype the filtersubtype\r\n            @param provider the provider or <code>null</code> for the default provider\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.signName\">\r\n            Holds value of property signName. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.reason\">\r\n            Holds value of property reason. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.location\">\r\n            Holds value of property location. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.signDate\">\r\n            Holds value of property signDate. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.SignName\">\r\n            Getter/setter for property sigName.\r\n            @return Value of property sigName.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.Reason\">\r\n            Getter for property reason.\r\n            @return Value of property reason.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.Location\">\r\n            Getter for property location.\r\n            @return Value of property location.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.SignDate\">\r\n            Getter for property signDate.\r\n            @return Value of property signDate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.version\">\r\n            Version of the PKCS#7 object \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.signerversion\">\r\n            Version of the PKCS#7 \"SignerInfo\" object. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.Version\">\r\n            Get the version of the PKCS#7 object.\r\n            @return the version of the PKCS#7 object.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.SigningInfoVersion\">\r\n            Get the version of the PKCS#7 \"SignerInfo\" object.\r\n            @return the version of the PKCS#7 \"SignerInfo\" object.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.digestAlgorithmOid\">\r\n            The ID of the digest algorithm, e.g. \"2.16.840.1.101.3.4.2.1\". \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.messageDigest\">\r\n            The object that will create the digest \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.digestalgos\">\r\n            The digest algorithms \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.digestAttr\">\r\n            The digest attributes \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.DigestAlgorithmOid\">\r\n            Getter for the ID of the digest algorithm, e.g. \"2.16.840.1.101.3.4.2.1\"\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetHashAlgorithm\">\r\n            Returns the name of the digest algorithm, e.g. \"SHA256\".\r\n            @return the digest algorithm name, e.g. \"SHA256\"\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.digestEncryptionAlgorithmOid\">\r\n            The encryption algorithm. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.DigestEncryptionAlgorithmOid\">\r\n            Getter for the digest encryption algorithm\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetDigestAlgorithm\">\r\n            Get the algorithm used to calculate the message digest, e.g. \"SHA1withRSA\".\r\n            @return the algorithm used to calculate the message digest\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.externalDigest\">\r\n            The signed digest if created outside this class \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.externalRSAdata\">\r\n            External RSA data \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.SetExternalDigest(System.Byte[],System.Byte[],System.String)\">\r\n            Sets the digest/signature to an external calculated value.\r\n            @param digest the digest. This is the actual signature\r\n            @param RSAdata the extra data that goes into the data tag in PKCS#7\r\n            @param digestEncryptionAlgorithm the encryption algorithm. It may must be <CODE>null</CODE> if the <CODE>digest</CODE>\r\n            is also <CODE>null</CODE>. If the <CODE>digest</CODE> is not <CODE>null</CODE>\r\n            then it may be \"RSA\" or \"DSA\"\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.sig\">\r\n            Class from the Java SDK that provides the functionality of a digital signature algorithm. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.digest\">\r\n            The signed digest as calculated by this class (or extracted from an existing PDF) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.RSAdata\">\r\n            The RSA data \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.Update(System.Byte[],System.Int32,System.Int32)\">\r\n            Update the digest with the specified bytes.\r\n            This method is used both for signing and verifying\r\n            @param buf the data buffer\r\n            @param off the offset in the data buffer\r\n            @param len the data length\r\n            @throws SignatureException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetEncodedPKCS1\">\r\n            Gets the bytes for the PKCS#1 object.\r\n            @return a byte array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetEncodedPKCS7\">\r\n            Gets the bytes for the PKCS7SignedData object.\r\n            @return the bytes for the PKCS7SignedData object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetEncodedPKCS7(System.Byte[])\">\r\n            Gets the bytes for the PKCS7SignedData object. Optionally the authenticatedAttributes\r\n            in the signerInfo can also be set. If either of the parameters is <CODE>null</CODE>, none will be used.\r\n            @param secondDigest the digest in the authenticatedAttributes\r\n            @return the bytes for the PKCS7SignedData object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetEncodedPKCS7(System.Byte[],iTextSharp.text.pdf.security.ITSAClient,System.Byte[],System.Collections.Generic.ICollection{System.Byte[]},iTextSharp.text.pdf.security.CryptoStandard)\">\r\n            Gets the bytes for the PKCS7SignedData object. Optionally the authenticatedAttributes\r\n            in the signerInfo can also be set, OR a time-stamp-authority client\r\n            may be provided.\r\n            @param secondDigest the digest in the authenticatedAttributes\r\n            @param tsaClient TSAClient - null or an optional time stamp authority client\r\n            @return byte[] the bytes for the PKCS7SignedData object\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.BuildUnauthenticatedAttributes(System.Byte[])\">\r\n            Added by Aiken Sam, 2006-11-15, modifed by Martin Brunecky 07/12/2007\r\n            to start with the timeStampToken (signedData 1.2.840.113549.1.7.2).\r\n            Token is the TSA response without response status, which is usually\r\n            handled by the (vendor supplied) TSA request/response interface).\r\n            @param timeStampToken byte[] - time stamp token, DER encoded signedData\r\n            @return ASN1EncodableVector\r\n            @throws IOException\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.security.PdfPKCS7.getAuthenticatedAttributeBytes(System.Byte[],System.Byte[],System.Collections.Generic.ICollection{System.Byte[]},iTextSharp.text.pdf.security.CryptoStandard)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetAuthenticatedAttributeSet(System.Byte[],System.Byte[],System.Collections.Generic.ICollection{System.Byte[]},iTextSharp.text.pdf.security.CryptoStandard)\">\r\n            This method provides that encoding and the parameters must be\r\n            exactly the same as in {@link #getEncodedPKCS7(byte[],Calendar)}.\r\n            \r\n            @param secondDigest the content digest\r\n            @return the byte array representation of the authenticatedAttributes ready to be signed\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.sigAttr\">\r\n            Signature attributes \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.sigAttrDer\">\r\n            Signature attributes (maybe not necessary, but we use it as fallback) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.encContDigest\">\r\n            encrypted digest \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.verified\">\r\n            Indicates if a signature has already been verified \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.verifyResult\">\r\n            The result of the verification \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.Verify\">\r\n            Verify the digest.\r\n            @throws SignatureException on error\r\n            @return <CODE>true</CODE> if the signature checks out, <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.VerifyTimestampImprint\">\r\n            Checks if the timestamp refers to this document.\r\n            @throws java.security.NoSuchAlgorithmException on error\r\n            @return true if it checks false otherwise\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.certs\">\r\n            All the X.509 certificates in no particular order. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.signCerts\">\r\n            All the X.509 certificates used for the main signature. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.signCert\">\r\n            The X.509 certificate that is used to sign the digest. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.Certificates\">\r\n            Get all the X.509 certificates associated with this PKCS#7 object in no particular order.\r\n            Other certificates, from OCSP for example, will also be included.\r\n            @return the X.509 certificates associated with this PKCS#7 object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.SignCertificateChain\">\r\n            Get the X.509 sign certificate chain associated with this PKCS#7 object.\r\n            Only the certificates used for the main signature will be returned, with\r\n            the signing certificate first.\r\n            @return the X.509 certificates associated with this PKCS#7 object\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.SigningCertificate\">\r\n            Get the X.509 certificate actually used to sign the digest.\r\n            @return the X.509 certificate actually used to sign the digest\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.CalcSignCertificateChain\">\r\n            Helper method that creates the collection of certificates\r\n            used for the main signature based on the complete list\r\n            of certificates and the sign certificate.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.CRLs\">\r\n            Get the X.509 certificate revocation lists associated with this PKCS#7 object\r\n            @return the X.509 certificate revocation lists associated with this PKCS#7 object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.FindCRL(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Helper method that tries to construct the CRLs.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.basicResp\">\r\n            BouncyCastle BasicOCSPResp \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.Ocsp\">\r\n            Gets the OCSP basic response if there is one.\r\n            @return the OCSP basic response or null\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.IsRevocationValid\">\r\n            Checks if OCSP revocation refers to the document signing certificate.\r\n            @return true if it checks, false otherwise\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.FindOcsp(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Helper method that creates the BasicOCSPResp object.\r\n            @param seq\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.isTsp\">\r\n            True if there's a PAdES LTV time stamp. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PdfPKCS7.timeStampToken\">\r\n            BouncyCastle TimeStampToken. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.IsTsp\">\r\n            Check if it's a PAdES-LTV time stamp.\r\n            @return true if it's a PAdES-LTV time stamp, false otherwise\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.TimeStampToken\">\r\n            Gets the timestamp token if there is one.\r\n            @return the timestamp token or null\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.PdfPKCS7.TimeStampDate\">\r\n            Gets the timestamp date\r\n            @return  a date\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetFilterSubtype\">\r\n            Returns the filter subtype.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PdfPKCS7.GetEncryptionAlgorithm\">\r\n            Returns the encryption algorithm\r\n            @return\tthe name of an encryption algorithm\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.PrivateKeySignature\">\r\n            Implementation of the ExternalSignature interface that can be used\r\n            when you have a PrivateKey object.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PrivateKeySignature.pk\">\r\n            The private key object. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PrivateKeySignature.hashAlgorithm\">\r\n            The hash algorithm. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.PrivateKeySignature.encryptionAlgorithm\">\r\n            The encryption algorithm (obtained from the private key) \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PrivateKeySignature.#ctor(Org.BouncyCastle.Crypto.ICipherParameters,System.String)\">\r\n            Creates an ExternalSignature instance\r\n            @param pk    a PrivateKey object\r\n            @param hashAlgorithm the hash algorithm (e.g. \"SHA-1\", \"SHA-256\",...)\r\n            @param provider  the security provider (e.g. \"BC\")\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PrivateKeySignature.Sign(System.Byte[])\">\r\n            Creates a message digest using the hash algorithm\r\n            and signs it using the encryption algorithm.\r\n            @param message   the message you want to be hashed and signed\r\n            @return  a signed message digest\r\n            @see com.itextpdf.text.pdf.security.ExternalSignature#sign(byte[])\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PrivateKeySignature.GetHashAlgorithm\">\r\n            Returns the hash algorithm.\r\n            @return  the hash algorithm (e.g. \"SHA-1\", \"SHA-256,...\")\r\n            @see com.itextpdf.text.pdf.security.ExternalSignature#getHashAlgorithm()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.PrivateKeySignature.GetEncryptionAlgorithm\">\r\n            Returns the encryption algorithm used for signing.\r\n            @return the encryption algorithm (\"RSA\" or \"DSA\")\r\n            @see com.itextpdf.text.pdf.security.ExternalSignature#getEncryptionAlgorithm()\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.RootStoreVerifier.LOGGER\">\r\n            The Logger instance \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.RootStoreVerifier.certificates\">\r\n            A key store against which certificates can be verified. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.RootStoreVerifier.#ctor(iTextSharp.text.pdf.security.CertificateVerifier)\">\r\n            Creates a RootStoreVerifier in a chain of verifiers.\r\n            \r\n            @param verifier\r\n                       the next verifier in the chain\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.RootStoreVerifier.Certificates\">\r\n            Sets the Key Store against which a certificate can be checked.\r\n            \r\n            @param keyStore\r\n                       a root store\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.RootStoreVerifier.Verify(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate,System.DateTime)\">\r\n            Verifies a single certificate against a key store (if present).\r\n            \r\n            @param signCert\r\n                       the certificate to verify\r\n            @param issuerCert\r\n                       the issuer certificate\r\n            @param signDate\r\n                       the date the certificate needs to be valid\r\n            @return a list of <code>VerificationOK</code> objects.\r\n            The list will be empty if the certificate couldn't be verified.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.SecurityIDs\">\r\n            A list of IDs that are used by the security classes\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock\">\r\n            Class that contains a field lock action and\r\n            an array of the fields that are involved.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock.action\">\r\n            Can be /All, /Exclude or /Include \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock.fields\">\r\n            An array of PdfString values with fieldnames \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock.#ctor(iTextSharp.text.pdf.PdfName,iTextSharp.text.pdf.PdfArray)\">\r\n            Creates a FieldLock instance \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock.Action\">\r\n            Getter for the field lock action. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock.Fields\">\r\n            Getter for the fields involved in the lock action. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.SignaturePermissions.FieldLock.ToString\">\r\n            toString method \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.SignaturePermissions.certification\">\r\n            Is the signature a cerification signature (true) or an approval signature (false)? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.SignaturePermissions.fillInAllowed\">\r\n            Is form filling allowed by this signature? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.SignaturePermissions.annotationsAllowed\">\r\n            Is adding annotations allowed by this signature? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.SignaturePermissions.fieldLocks\">\r\n            Does this signature lock specific fields? \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.SignaturePermissions.#ctor(iTextSharp.text.pdf.PdfDictionary,iTextSharp.text.pdf.security.SignaturePermissions)\">\r\n            Creates an object that can inform you about the type of signature\r\n            in a signature dictionary as well as some of the permissions\r\n            defined by the signature.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.SignaturePermissions.Certification\">\r\n            Getter to find out if the signature is a certification signature.\r\n            @return true if the signature is a certification signature, false for an approval signature.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.SignaturePermissions.FillInAllowed\">\r\n            Getter to find out if filling out fields is allowed after signing.\r\n            @return true if filling out fields is allowed\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.SignaturePermissions.AnnotationsAllowed\">\r\n            Getter to find out if adding annotations is allowed after signing.\r\n            @return true if adding annotations is allowed\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.security.SignaturePermissions.FieldLocks\">\r\n            Getter for the field lock actions, and fields that are impacted by the action\r\n            @return an Array with field names\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.TSAClientBouncyCastle\">\r\n            Time Stamp Authority Client interface implementation using Bouncy Castle\r\n            org.bouncycastle.tsp package.\r\n            <p>\r\n            Created by Aiken Sam, 2006-11-15, refactored by Martin Brunecky, 07/15/2007\r\n            for ease of subclassing.\r\n            </p>\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.LOGGER\">\r\n            The Logger instance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.tsaURL\">\r\n            URL of the Time Stamp Authority \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.tsaUsername\">\r\n            TSA Username \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.tsaPassword\">\r\n            TSA password \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.tsaInfo\">\r\n            An interface that allows you to inspect the timestamp info. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.DEFAULTTOKENSIZE\">\r\n            The default value for the hash algorithm \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.tokenSizeEstimate\">\r\n            Estimate of the received time stamp token \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.DEFAULTHASHALGORITHM\">\r\n            The default value for the hash algorithm \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.digestAlgorithm\">\r\n            Hash algorithm \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.TSAClientBouncyCastle.tsaReqPolicy\">\r\n            TSA request policy \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.#ctor(System.String)\">\r\n            Creates an instance of a TSAClient that will use BouncyCastle.\r\n            @param url String - Time Stamp Authority URL (i.e. \"http://tsatest1.digistamp.com/TSA\")\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.#ctor(System.String,System.String,System.String)\">\r\n            Creates an instance of a TSAClient that will use BouncyCastle.\r\n            @param url String - Time Stamp Authority URL (i.e. \"http://tsatest1.digistamp.com/TSA\")\r\n            @param username String - user(account) name\r\n            @param password String - password\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.#ctor(System.String,System.String,System.String,System.Int32,System.String)\">\r\n            Constructor.\r\n            Note the token size estimate is updated by each call, as the token\r\n            size is not likely to change (as long as we call the same TSA using\r\n            the same imprint length).\r\n            @param url String - Time Stamp Authority URL (i.e. \"http://tsatest1.digistamp.com/TSA\")\r\n            @param username String - user(account) name\r\n            @param password String - password\r\n            @param tokSzEstimate int - estimated size of received time stamp token (DER encoded)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.SetTSAInfo(iTextSharp.text.pdf.security.ITSAInfoBouncyCastle)\">\r\n            @param tsaInfo the tsaInfo to set\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.GetTokenSizeEstimate\">\r\n            Get the token size estimate.\r\n            Returned value reflects the result of the last succesfull call, padded\r\n            @return an estimate of the token size\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.GetMessageDigest\">\r\n            Gets the MessageDigest to digest the data imprint\r\n            @return the digest algorithm name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.GetTimeStampToken(System.Byte[])\">\r\n            Get RFC 3161 timeStampToken.\r\n            Method may return null indicating that timestamp should be skipped.\r\n            @param imprint data imprint to be time-stamped\r\n            @return encoded, TSA signed data of the timeStampToken\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.TSAClientBouncyCastle.GetTSAResponse(System.Byte[])\">\r\n            Get timestamp token - communications layer\r\n            @return - byte[] - TSA response, raw bytes (RFC 3161 encoded)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.ITSAInfoBouncyCastle\">\r\n            Interface you can implement and pass to TSAClientBouncyCastle in case\r\n            you want to do something with the information returned\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.ITSAInfoBouncyCastle.InspectTimeStampTokenInfo(Org.BouncyCastle.Tsp.TimeStampTokenInfo)\">\r\n            When a timestamp is created using TSAClientBouncyCastle,\r\n            this method is triggered passing an object that contains\r\n            info about the timestamp and the time stamping authority.\r\n            @param info a TimeStampTokenInfo object\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.VerificationException\">\r\n            An exception that is thrown when something is wrong with a certificate.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.VerificationException.#ctor(Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            Creates a VerificationException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.VerificationOK.certificate\">\r\n            The certificate that was verified successfully. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.VerificationOK.verifierClass\">\r\n            The CertificateVerifier that was used for verifying. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.VerificationOK.message\">\r\n            The reason why the certificate verified successfully. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.VerificationOK.#ctor(Org.BouncyCastle.X509.X509Certificate,iTextSharp.text.pdf.security.CertificateVerifier,System.String)\">\r\n            Creates a VerificationOK object\r\n            @param certificate\tthe certificate that was successfully verified\r\n            @param verifierClass\tthe class that was used for verification\r\n            @param message\t\tthe reason why the certificate could be verified\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.VerificationOK.ToString\">\r\n            A single String explaining which certificate was verified, how and why.\r\n            @see java.lang.Object#toString()\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.security.X509Certificate2Signature\">\r\n            <summary>\r\n            Creates a signature using a X509Certificate2. It supports smartcards without \r\n            exportable private keys.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.X509Certificate2Signature.certificate\">\r\n            <summary>\r\n            The certificate with the private key\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.X509Certificate2Signature.hashAlgorithm\">\r\n            The hash algorithm. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.security.X509Certificate2Signature.encryptionAlgorithm\">\r\n            The encryption algorithm (obtained from the private key) \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.X509Certificate2Signature.#ctor(System.Security.Cryptography.X509Certificates.X509Certificate2,System.String)\">\r\n            <summary>\r\n            Creates a signature using a X509Certificate2. It supports smartcards without \r\n            exportable private keys.\r\n            </summary>\r\n            <param name=\"certificate\">The certificate with the private key</param>\r\n            <param name=\"hashAlgorithm\">The hash algorithm for the signature. As the Windows CAPI is used\r\n            to do the signature the only hash guaranteed to exist is SHA-1</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.X509Certificate2Signature.GetHashAlgorithm\">\r\n            Returns the hash algorithm.\r\n            @return  the hash algorithm (e.g. \"SHA-1\", \"SHA-256,...\")\r\n            @see com.itextpdf.text.pdf.security.ExternalSignature#getHashAlgorithm()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.security.X509Certificate2Signature.GetEncryptionAlgorithm\">\r\n            Returns the encryption algorithm used for signing.\r\n            @return the encryption algorithm (\"RSA\" or \"DSA\")\r\n            @see com.itextpdf.text.pdf.security.ExternalSignature#getEncryptionAlgorithm()\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.SequenceList”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.SequenceList.Expand(System.String,System.Int32)\">\r\n            Generates a list of numbers from a string.\r\n            @param ranges the comma separated ranges\r\n            @param maxNumber the maximum number in the range\r\n            @return a list with the numbers as <CODE>Integer</CODE>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.ShadingColor\">\r\n            Implements a shading pattern as a <code>Color</code>.\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.pdf.SimpleBookmark”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.#ctor\">\r\n            Creates a new instance of SimpleBookmark \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.GetNumber(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Gets number of indirect. If type of directed indirect is PAGES, it refers PAGE object through KIDS.\r\n            (Contributed by Kazuya Ujihara)\r\n            @param indirect \r\n            2004-06-13\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.GetBookmark(iTextSharp.text.pdf.PdfReader)\">\r\n            Gets a <CODE>List</CODE> with the bookmarks. It returns <CODE>null</CODE> if\r\n            the document doesn't have any bookmarks.\r\n            @param reader the document\r\n            @return a <CODE>List</CODE> with the bookmarks or <CODE>null</CODE> if the\r\n            document doesn't have any\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.GetBookmark(iTextSharp.text.pdf.PdfReader,iTextSharp.text.pdf.PdfDictionary,System.Boolean)\">\r\n            Gets a <CODE>List</CODE> with the bookmarks that are children of <CODE>outline</CODE>. It returns <CODE>null</CODE> if\r\n            the document doesn't have any bookmarks.\r\n            @param reader the document\r\n            @param outline the outline dictionary to get bookmarks from\r\n            @param includeRoot indicates if to include <CODE>outline</CODE> parameter itself into returned list of bookmarks\r\n            @return a <CODE>List</CODE> with the bookmarks or <CODE>null</CODE> if the\r\n            document doesn't have any\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.EliminatePages(System.Collections.Generic.IList{System.Collections.Generic.Dictionary{System.String,System.Object}},System.Int32[])\">\r\n            Removes the bookmark entries for a number of page ranges. The page ranges\r\n            consists of a number of pairs with the start/end page range. The page numbers\r\n            are inclusive.\r\n            @param list the bookmarks\r\n            @param pageRange the page ranges, always in pairs.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.ShiftPageNumbers(System.Collections.Generic.IList{System.Collections.Generic.Dictionary{System.String,System.Object}},System.Int32,System.Int32[])\">\r\n            For the pages in range add the <CODE>pageShift</CODE> to the page number.\r\n            The page ranges\r\n            consists of a number of pairs with the start/end page range. The page numbers\r\n            are inclusive.\r\n            @param list the bookmarks\r\n            @param pageShift the number to add to the pages in range\r\n            @param pageRange the page ranges, always in pairs. It can be <CODE>null</CODE>\r\n            to include all the pages\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.ExportToXMLNode(System.Collections.Generic.IList{System.Collections.Generic.Dictionary{System.String,System.Object}},System.IO.TextWriter,System.Int32,System.Boolean)\">\r\n            Exports the bookmarks to XML. Only of use if the generation is to be include in\r\n            some other XML document.\r\n            @param list the bookmarks\r\n            @param out the export destination. The writer is not closed\r\n            @param indent the indentation level. Pretty printing significant only. Use <CODE>-1</CODE> for no indents.\r\n            @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,\r\n            whatever the encoding\r\n            @throws IOException on error\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.SimpleBookmark.ExportToXML(System.Collections.Generic.IList{System.Collections.Generic.Dictionary{System.String,System.Object}},System.IO.Stream,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.ExportToXML(System.Collections.Generic.IList{System.Collections.Generic.Dictionary{System.String,System.Object}},System.IO.TextWriter,System.String,System.Boolean)\">\r\n            Exports the bookmarks to XML.\r\n            @param list the bookmarks\r\n            @param wrt the export destination. The writer is not closed\r\n            @param encoding the encoding according to IANA conventions\r\n            @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,\r\n            whatever the encoding\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.ImportFromXML(System.IO.Stream)\">\r\n            Import the bookmarks from XML.\r\n            @param in the XML source. The stream is not closed\r\n            @throws IOException on error\r\n            @return the bookmarks\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleBookmark.ImportFromXML(System.IO.TextReader)\">\r\n            Import the bookmarks from XML.\r\n            @param in the XML source. The reader is not closed\r\n            @throws IOException on error\r\n            @return the bookmarks\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.SimpleNamedDestination\">\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.SimpleNamedDestination.ExportToXML(System.Collections.Generic.Dictionary{System.String,System.String},System.IO.Stream,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleNamedDestination.ExportToXML(System.Collections.Generic.Dictionary{System.String,System.String},System.IO.TextWriter,System.String,System.Boolean)\">\r\n            Exports the bookmarks to XML.\r\n            @param names the names\r\n            @param wrt the export destination. The writer is not closed\r\n            @param encoding the encoding according to IANA conventions\r\n            @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,\r\n            whatever the encoding\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleNamedDestination.ImportFromXML(System.IO.Stream)\">\r\n            Import the names from XML.\r\n            @param inp the XML source. The stream is not closed\r\n            @throws IOException on error\r\n            @return the names\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.SimpleNamedDestination.ImportFromXML(System.IO.TextReader)\">\r\n            Import the names from XML.\r\n            @param inp the XML source. The reader is not closed\r\n            @throws IOException on error\r\n            @return the names\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.SpotColor\">\r\n            \r\n             @author  psoares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.StampContent.#ctor(iTextSharp.text.pdf.PdfStamperImp,iTextSharp.text.pdf.PdfStamperImp.PageStamp)\">\r\n            Creates a new instance of StampContent \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.StampContent.Duplicate\">\r\n             Gets a duplicate of this <CODE>PdfContentByte</CODE>. All\r\n             the members are copied by reference but the buffer stays different.\r\n            \r\n             @return a copy of this <CODE>PdfContentByte</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.StringUtils.EscapeString(System.Byte[])\">\r\n             Escapes a <CODE>byte</CODE> array according to the PDF conventions.\r\n            \r\n             @param b the <CODE>byte</CODE> array to escape\r\n             @return an escaped <CODE>byte</CODE> array\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.StringUtils.EscapeString(System.Byte[],iTextSharp.text.pdf.ByteBuffer)\">\r\n             Escapes a <CODE>byte</CODE> array according to the PDF conventions.\r\n            \r\n             @param b the <CODE>byte</CODE> array to escape\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.StringUtils.ConvertCharsToBytes(System.Char[])\">\r\n            Converts an array of unsigned 16bit numbers to an array of bytes.\r\n            The input values are presented as chars for convenience.\r\n            \r\n            @param chars the array of 16bit numbers that should be converted\r\n            @return the resulting byte array, twice as large as the input\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TextField\">\r\n            Supports text, combo and list fields generating the correct appearances.\r\n            All the option in the Acrobat GUI are supported in an easy to use API.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.defaultText\">\r\n            Holds value of property defaultText. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.choices\">\r\n            Holds value of property choices. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.choiceExports\">\r\n            Holds value of property choiceExports. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.choiceSelections\">\r\n            Holds value of property choiceSelection. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.visibleTopChoice\">\r\n            Represents the /TI value \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.#ctor(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Rectangle,System.String)\">\r\n            Creates a new <CODE>TextField</CODE>.\r\n            @param writer the document <CODE>PdfWriter</CODE>\r\n            @param box the field location and dimensions\r\n            @param fieldName the field name. If <CODE>null</CODE> only the widget keys\r\n            will be included in the field allowing it to be used as a kid field.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.ObfuscatePassword(System.String)\">\r\n            Obfuscates a password <code>String</code>.\r\n            Every character is replaced by an asterisk (*).\r\n            \r\n            @param text \r\n            @return String\r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.GetAppearance\">\r\n            Get the <code>PdfAppearance</code> of a text or combo field\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return A <code>PdfAppearance</code>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.GetListAppearance\">\r\n            Get the <code>PdfAppearance</code> of a list field\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return A <code>PdfAppearance</code>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.GetTextField\">\r\n            Gets a new text field.\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return a new text field\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.GetComboField\">\r\n            Gets a new combo field.\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return a new combo field\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.GetListField\">\r\n            Gets a new list field.\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return a new list field\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.DefaultText\">\r\n            Sets the default text. It is only meaningful for text fields.\r\n            @param defaultText the default text\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.Choices\">\r\n            Sets the choices to be presented to the user in list/combo\r\n            fields.\r\n            @param choices the choices to be presented to the user\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.ChoiceExports\">\r\n            Sets the export values in list/combo fields. If this array\r\n            is <CODE>null</CODE> then the choice values will also be used\r\n            as the export values.\r\n            @param choiceExports the export values in list/combo fields\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.ChoiceSelection\">\r\n            Sets the zero based index of the selected item.\r\n            @param choiceSelection the zero based index of the selected item\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.VisibleTopChoice\">\r\n             Sets the top visible choice for lists;\r\n            \r\n             @since 5.5.3\r\n             @param visibleTopChoice index of the first visible item (zero-based array)\r\n            Returns the index of the top visible choice of a list. Default is -1.\r\n            @return the index of the top visible choice\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.TextField.AddChoiceSelection(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.TextField.SetExtraMargin(System.Single,System.Single)\">\r\n            Sets extra margins in text fields to better mimic the Acrobat layout.\r\n            @param extraMarginLeft the extra marging left\r\n            @param extraMarginTop the extra margin top\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.substitutionFonts\">\r\n            Holds value of property substitutionFonts.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.SubstitutionFonts\">\r\n            Sets a list of substitution fonts. The list is composed of <CODE>BaseFont</CODE> and can also be <CODE>null</CODE>. The fonts in this list will be used if the original\r\n            font doesn't contain the needed glyphs.\r\n            @param substitutionFonts the list\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TextField.extensionFont\">\r\n            Holds value of property extensionFont.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TextField.ExtensionFont\">\r\n            Sets the extensionFont. This font will be searched before the\r\n            substitution fonts. It may be <code>null</code>.\r\n            @param extensionFont New value of property extensionFont.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TrueTypeFont\">\r\n            Reads a Truetype font\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.codePages\">\r\n            The code pages possible for a True Type font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.tables\">\r\n            Contains the location of the several tables. The key is the name of\r\n            the table and the value is an <CODE>int[2]</CODE> where position 0\r\n            is the offset from the start of the file and position 1 is the length\r\n            of the table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.rf\">\r\n            The file in use.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.fileName\">\r\n            The file name.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.directoryOffset\">\r\n            The offset from the start of the file to the table directory.\r\n            It is 0 for TTF and may vary for TTC depending on the chosen font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.ttcIndex\">\r\n            The index for the TTC font. It is an empty <CODE>string</CODE> for a\r\n            TTF file.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.style\">\r\n            The style modifier \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.head\">\r\n            The content of table 'head'.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.hhea\">\r\n            The content of table 'hhea'.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.os_2\">\r\n            The content of table 'OS/2'.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.glyphWidthsByIndex\">\r\n            The width of the glyphs. This is essentially the content of table\r\n            'hmtx' normalized to 1000 units.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.cmap10\">\r\n            The map containing the code information for the table 'cmap', encoding 1.0.\r\n            The key is the code and the value is an <CODE>int[2]</CODE> where position 0\r\n            is the glyph number and position 1 is the glyph width normalized to 1000\r\n            units.\r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.text.pdf.TrueTypeFont.cmap31”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.cmapExt\">\r\n            <summary>\r\n            By James for unicode Ext.B\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.kerning\">\r\n            The map containing the kerning information. It represents the content of\r\n            table 'kern'. The key is an <CODE>Integer</CODE> where the top 16 bits\r\n            are the glyph number for the first character and the lower 16 bits are the\r\n            glyph number for the second character. The value is the amount of kerning in\r\n            normalized 1000 units as an <CODE>Integer</CODE>. This value is usually negative.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.fontName\">\r\n            The font name.\r\n            This name is usually extracted from the table 'name' with\r\n            the 'Name ID' 6.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.subFamily\">\r\n            The font subfamily\r\n            This subFamily name is usually extracted from the table 'name' with\r\n            the 'Name ID' 2 or 'Name ID' 17.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.fullName\">\r\n            The full name of the font 'Name ID' 1 or 'Name ID' 16 \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.allNameEntries\">\r\n            All the names auf the Names-Table\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.familyName\">\r\n            The family name of the font\r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.text.pdf.TrueTypeFont.italicAngle”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.isFixedPitch\">\r\n            <CODE>true</CODE> if all the glyphs have the same width.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TrueTypeFont.FontHeader\">\r\n            The components of table 'head'.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.flags\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.unitsPerEm\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.xMin\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.yMin\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.xMax\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.yMax\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.FontHeader.macStyle\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader\">\r\n            The components of table 'hhea'.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.Ascender\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.Descender\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.LineGap\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.advanceWidthMax\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.minLeftSideBearing\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.minRightSideBearing\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.xMaxExtent\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.caretSlopeRise\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.caretSlopeRun\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.HorizontalHeader.numberOfHMetrics\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics\">\r\n            The components of table 'OS/2'.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.xAvgCharWidth\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.usWeightClass\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.usWidthClass\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.fsType\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySubscriptXSize\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySubscriptYSize\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySubscriptXOffset\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySubscriptYOffset\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySuperscriptXSize\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySuperscriptYSize\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySuperscriptXOffset\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ySuperscriptYOffset\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.yStrikeoutSize\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.yStrikeoutPosition\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.sFamilyClass\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.panose\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.achVendID\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.fsSelection\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.usFirstCharIndex\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.usLastCharIndex\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.sTypoAscender\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.sTypoDescender\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.sTypoLineGap\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.usWinAscent\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.usWinDescent\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ulCodePageRange1\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.ulCodePageRange2\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFont.WindowsMetrics.sCapHeight\">\r\n            A variable. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.#ctor\">\r\n            This constructor is present to allow extending the class.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.#ctor(System.String,System.String,System.Boolean,System.Byte[],System.Boolean,System.Boolean)\">\r\n            Creates a new TrueType font.\r\n            @param ttFile the location of the font on file. The file must end in '.ttf' or\r\n            '.ttc' but can have modifiers after the name\r\n            @param enc the encoding to be applied to this font\r\n            @param emb true if the font is to be embedded in the PDF\r\n            @param ttfAfm the font as a <CODE>byte</CODE> array\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetTTCName(System.String)\">\r\n            Gets the name from a composed TTC file name.\r\n            If I have for input \"myfont.ttc,2\" the return will\r\n            be \"myfont.ttc\".\r\n            @param name the full name\r\n            @return the simple file name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.FillTables\">\r\n            Reads the tables 'head', 'hhea', 'OS/2', 'post' and 'maxp' filling several variables.\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TrueTypeFont.BaseFont\">\r\n            Gets the Postscript font name.\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n            @return the Postscript font name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetNames(System.Int32)\">\r\n            Extracts the names of the font in all the languages available.\r\n            @param id the name id to retrieve\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetAllNames\">\r\n            Extracts all the names of the names-Table\r\n            @param id the name id to retrieve\r\n            @throws DocumentException on error\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.Process(System.Byte[],System.Boolean)\">\r\n            Reads the font data.\r\n            @param ttfAfm the font as a <CODE>byte</CODE> array, possibly <CODE>null</CODE>\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadStandardString(System.Int32)\">\r\n            Reads a <CODE>string</CODE> from the font file as bytes using the Cp1252\r\n             encoding.\r\n            @param length the length of bytes to read\r\n            @return the <CODE>string</CODE> read\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadUnicodeString(System.Int32)\">\r\n            Reads a Unicode <CODE>string</CODE> from the font file. Each character is\r\n             represented by two bytes.\r\n            @param length the length of bytes to read. The <CODE>string</CODE> will have <CODE>length</CODE>/2\r\n            characters\r\n            @return the <CODE>string</CODE> read\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadGlyphWidths\">\r\n            Reads the glyphs widths. The widths are extracted from the table 'hmtx'.\r\n             The glyphs are normalized to 1000 units.\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetGlyphWidth(System.Int32)\">\r\n            Gets a glyph width.\r\n            @param glyph the glyph to get the width of\r\n            @return the width of the glyph in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadCMaps\">\r\n            Reads the several maps from the table 'cmap'. The maps of interest are 1.0 for symbolic\r\n             fonts and 3.1 for all others. A symbolic font is defined as having the map 3.0.\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadFormat0\">\r\n            The information in the maps of the table 'cmap' is coded in several formats.\r\n             Format 0 is the Apple standard character to glyph index mapping table.\r\n            @return a <CODE>Hashtable</CODE> representing this map\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadFormat4\">\r\n            The information in the maps of the table 'cmap' is coded in several formats.\r\n             Format 4 is the Microsoft standard character to glyph index mapping table.\r\n            @return a <CODE>Hashtable</CODE> representing this map\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadFormat6\">\r\n            The information in the maps of the table 'cmap' is coded in several formats.\r\n             Format 6 is a trimmed table mapping. It is similar to format 0 but can have\r\n             less than 256 entries.\r\n            @return a <CODE>Hashtable</CODE> representing this map\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadKerning\">\r\n            Reads the kerning information from the 'kern' table.\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetKerning(System.Int32,System.Int32)\">\r\n            Gets the kerning between two Unicode chars.\r\n            @param char1 the first char\r\n            @param char2 the second char\r\n            @return the kerning to be applied\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetRawWidth(System.Int32,System.String)\">\r\n            Gets the width from the font according to the unicode char <CODE>c</CODE>.\r\n            If the <CODE>name</CODE> is null it's a symbolic font.\r\n            @param c the unicode char\r\n            @param name the glyph name\r\n            @return the width of the char\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetFontDescriptor(iTextSharp.text.pdf.PdfIndirectReference,System.String,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Generates the font descriptor for this font.\r\n            @return the PdfDictionary containing the font descriptor or <CODE>null</CODE>\r\n            @param subsetPrefix the subset prefix\r\n            @param fontStream the indirect reference to a PdfStream containing the font or <CODE>null</CODE>\r\n            @throws DocumentException if there is an error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetFontBaseType(iTextSharp.text.pdf.PdfIndirectReference,System.String,System.Int32,System.Int32,System.Byte[])\">\r\n            Generates the font dictionary for this font.\r\n            @return the PdfDictionary containing the font dictionary\r\n            @param subsetPrefix the subset prefx\r\n            @param firstChar the first valid character\r\n            @param lastChar the last valid character\r\n            @param shortTag a 256 bytes long <CODE>byte</CODE> array where each unused byte is represented by 0\r\n            @param fontDescriptor the indirect reference to a PdfDictionary containing the font descriptor or <CODE>null</CODE>\r\n            @throws DocumentException if there is an error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.WriteFont(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfIndirectReference,System.Object[])\">\r\n            Outputs to the writer the font dictionaries and streams.\r\n            @param writer the writer for this document\r\n            @param ref the font indirect reference\r\n            @param params several parameters that depend on the font type\r\n            @throws IOException on error\r\n            @throws DocumentException error in generating the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.ReadCffFont\">\r\n            If this font file is using the Compact Font File Format, then this method\r\n            will return the raw bytes needed for the font stream. If this method is\r\n            ever made public: make sure to add a test if (cff == true).\r\n            @return  a byte array\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetFullFontStream\">\r\n            Returns a PdfStream object with the full font program.\r\n            @return  a PdfStream with the font program\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetFontDescriptor(System.Int32,System.Single)\">\r\n            Gets the font parameter identified by <CODE>key</CODE>. Valid values\r\n            for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>\r\n            and <CODE>ITALICANGLE</CODE>.\r\n            @param key the parameter to be extracted\r\n            @param fontSize the font size in points\r\n            @return the parameter in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.GetMetricsTT(System.Int32)\">\r\n            Gets the glyph index and metrics for a character.\r\n            @param c the character\r\n            @return an <CODE>int</CODE> array with {glyph index, width}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TrueTypeFont.PostscriptFontName\">\r\n            Gets the postscript font name.\r\n            @return the postscript font name\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.TrueTypeFont.CodePagesSupported\">\r\n            Gets the code pages supported by the font.\r\n            @return the code pages supported by the font\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.TrueTypeFont.FullFontName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.TrueTypeFont.Subfamily”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.TrueTypeFont.AllNameEntries”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.TrueTypeFont.FamilyFontName”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.HasKernPairs\">\r\n            Checks if the font has any kerning pairs.\r\n            @return <CODE>true</CODE> if the font has any kerning pairs\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.SetKerning(System.Int32,System.Int32,System.Int32)\">\r\n            Sets the kerning between two Unicode chars.\r\n            @param char1 the first char\r\n            @param char2 the second char\r\n            @param kern the kerning to apply in normalized 1000 units\r\n            @return <code>true</code> if the kerning was applied, <code>false</code> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFont.IsWinAnsiSupported\">\r\n             Checks whether this font may be used with winansi encoding.\r\n            \r\n             @return <CODE>true</CODE> if the font can be correctly used with winansi encodings\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TrueTypeFontSubSet\">\r\n            Subsets a True Type font by removing the unneeded glyphs from\r\n             the font.\r\n            \r\n             @author  Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFontSubSet.tableDirectory\">\r\n            Contains the location of the several tables. The key is the name of\r\n            the table and the value is an <CODE>int[3]</CODE> where position 0\r\n            is the checksum, position 1 is the offset from the start of the file\r\n            and position 2 is the length of the table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFontSubSet.rf\">\r\n            The file in use.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.TrueTypeFontSubSet.fileName\">\r\n            The file name.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontSubSet.#ctor(System.String,iTextSharp.text.pdf.RandomAccessFileOrArray,System.util.collections.HashSet2{System.Int32},System.Int32,System.Boolean,System.Boolean)\">\r\n            Creates a new TrueTypeFontSubSet\r\n            @param directoryOffset The offset from the start of the file to the table directory\r\n            @param fileName the file name of the font\r\n            @param glyphsUsed the glyphs used\r\n            @param includeCmap <CODE>true</CODE> if the table cmap is to be included in the generated font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontSubSet.Process\">\r\n            Does the actual work of subsetting the font.\r\n            @throws IOException on error\r\n            @throws DocumentException on error\r\n            @return the subset font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontSubSet.ReadStandardString(System.Int32)\">\r\n            Reads a <CODE>string</CODE> from the font file as bytes using the Cp1252\r\n             encoding.\r\n            @param length the length of bytes to read\r\n            @return the <CODE>string</CODE> read\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.TrueTypeFontUnicode\">\r\n            Represents a True Type font with Unicode encoding. All the character\r\n            in the font can be used directly by using the encoding Identity-H or\r\n            Identity-V. This is the only way to represent some character sets such\r\n            as Thai.\r\n            @author  Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.#ctor(System.String,System.String,System.Boolean,System.Byte[],System.Boolean)\">\r\n            Creates a new TrueType font addressed by Unicode characters. The font\r\n            will always be embedded.\r\n            @param ttFile the location of the font on file. The file must end in '.ttf'.\r\n            The modifiers after the name are ignored.\r\n            @param enc the encoding to be applied to this font\r\n            @param emb true if the font is to be embedded in the PDF\r\n            @param ttfAfm the font as a <CODE>byte</CODE> array\r\n            @throws DocumentException the font is invalid\r\n            @throws IOException the font file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetWidth(System.Int32)\">\r\n            Gets the width of a <CODE>char</CODE> in normalized 1000 units.\r\n            @param char1 the unicode <CODE>char</CODE> to get the width of\r\n            @return the width in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetWidth(System.String)\">\r\n            Gets the width of a <CODE>string</CODE> in normalized 1000 units.\r\n            @param text the <CODE>string</CODE> to get the witdth of\r\n            @return the width in normalized 1000 units\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetToUnicode(System.Object[])\">\r\n            Creates a ToUnicode CMap to allow copy and paste from Acrobat.\r\n            @param metrics metrics[0] contains the glyph index and metrics[2]\r\n            contains the Unicode code\r\n            @throws DocumentException on error\r\n            @return the stream representing this CMap or <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.ToHex(System.Int32)\">\r\n            Gets an hex string in the format \"&lt;HHHH&gt;\".\r\n            @param n the number\r\n            @return the hex string\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetCIDFontType2(iTextSharp.text.pdf.PdfIndirectReference,System.String,System.Object[])\">\r\n            Generates the CIDFontTyte2 dictionary.\r\n            @param fontDescriptor the indirect reference to the font descriptor\r\n            @param subsetPrefix the subset prefix\r\n            @param metrics the horizontal width metrics\r\n            @return a stream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetFontBaseType(iTextSharp.text.pdf.PdfIndirectReference,System.String,iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Generates the font dictionary.\r\n            @param descendant the descendant dictionary\r\n            @param subsetPrefix the subset prefix\r\n            @param toUnicode the ToUnicode stream\r\n            @return the stream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.Compare(System.Int32[],System.Int32[])\">\r\n            The method used to sort the metrics array.\r\n            @param o1 the first element\r\n            @param o2 the second element\r\n            @return the comparisation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.WriteFont(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfIndirectReference,System.Object[])\">\r\n            Outputs to the writer the font dictionaries and streams.\r\n            @param writer the writer for this document\r\n            @param ref the font indirect reference\r\n            @param parms several parameters that depend on the font type\r\n            @throws IOException on error\r\n            @throws DocumentException error in generating the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetFullFontStream\">\r\n            Returns a PdfStream object with the full font program.\r\n            @return  a PdfStream with the font program\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.ConvertToBytes(System.String)\">\r\n            A forbidden operation. Will throw a null pointer exception.\r\n            @param text the text\r\n            @return always <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.GetMetricsTT(System.Int32)\">\r\n            Gets the glyph index and metrics for a character.\r\n            @param c the character\r\n            @return an <CODE>int</CODE> array with {glyph index, width}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.CharExists(System.Int32)\">\r\n            Checks if a character exists in this font.\r\n            @param c the character to check\r\n            @return <CODE>true</CODE> if the character has a glyph,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.TrueTypeFontUnicode.SetCharAdvance(System.Int32,System.Int32)\">\r\n            Sets the character advance.\r\n            @param c the character\r\n            @param advance the character advance normalized to 1000 units\r\n            @return <CODE>true</CODE> if the advance was set,\r\n            <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.Type1Font\">\r\n            Reads a Type1 font\r\n            \r\n             @author Paulo Soares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.pfb\">\r\n            The PFB file if the input was made with a <CODE>byte</CODE> array.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.FontName\">\r\n            The Postscript font name.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.FullName\">\r\n            The full name of the font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.FamilyName\">\r\n            The family name of the font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.Weight\">\r\n            The weight of the font: normal, bold, etc.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.ItalicAngle\">\r\n            The italic angle of the font, usually 0.0 or negative.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.IsFixedPitch\">\r\n            <CODE>true</CODE> if all the characters have the same\r\n            width.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.CharacterSet\">\r\n            The character set of the font.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.llx\">\r\n            The llx of the FontBox.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.lly\">\r\n            The lly of the FontBox.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.urx\">\r\n            The lurx of the FontBox.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.ury\">\r\n            The ury of the FontBox.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.UnderlinePosition\">\r\n            The underline position.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.UnderlineThickness\">\r\n            The underline thickness.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.EncodingScheme\">\r\n            The font's encoding name. This encoding is 'StandardEncoding' or\r\n            'AdobeStandardEncoding' for a font that can be totally encoded\r\n            according to the characters names. For all other names the\r\n            font is treated as symbolic.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.CapHeight\">\r\n            A variable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.XHeight\">\r\n            A variable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.Ascender\">\r\n            A variable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.Descender\">\r\n            A variable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.StdHW\">\r\n            A variable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.StdVW\">\r\n            A variable.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.CharMetrics\">\r\n            Represents the section CharMetrics in the AFM file. Each\r\n            value of this array contains a <CODE>Object[4]</CODE> with an\r\n            Integer, Integer, String and int[]. This is the code, width, name and char bbox.\r\n            The key is the name of the char and also an Integer with the char number.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.KernPairs\">\r\n            Represents the section KernPairs in the AFM file. The key is\r\n            the name of the first character and the value is a <CODE>Object[]</CODE>\r\n            with 2 elements for each kern pair. Position 0 is the name of\r\n            the second character and position 1 is the kerning distance. This is\r\n            repeated for all the pairs.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.fileName\">\r\n            The file in use.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.builtinFont\">\r\n            <CODE>true</CODE> if this font is one of the 14 built in fonts.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.Type1Font.PFB_TYPES\">\r\n            Types of records in a PFB file. ASCII is 1 and BINARY is 2.\r\n            They have to appear in the PFB file in this sequence.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.#ctor(System.String,System.String,System.Boolean,System.Byte[],System.Byte[],System.Boolean)\">\r\n            Creates a new Type1 font.\r\n            @param ttfAfm the AFM file if the input is made with a <CODE>byte</CODE> array\r\n            @param pfb the PFB file if the input is made with a <CODE>byte</CODE> array\r\n            @param afmFile the name of one of the 14 built-in fonts or the location of an AFM file. The file must end in '.afm'\r\n            @param enc the encoding to be applied to this font\r\n            @param emb true if the font is to be embedded in the PDF\r\n            @throws DocumentException the AFM file is invalid\r\n            @throws IOException the AFM file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.GetRawWidth(System.Int32,System.String)\">\r\n            Gets the width from the font according to the <CODE>name</CODE> or,\r\n            if the <CODE>name</CODE> is null, meaning it is a symbolic font,\r\n            the char <CODE>c</CODE>.\r\n            @param c the char if the font is symbolic\r\n            @param name the glyph name\r\n            @return the width of the char\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.GetKerning(System.Int32,System.Int32)\">\r\n            Gets the kerning between two Unicode characters. The characters\r\n            are converted to names and this names are used to find the kerning\r\n            pairs in the <CODE>Hashtable</CODE> <CODE>KernPairs</CODE>.\r\n            @param char1 the first char\r\n            @param char2 the second char\r\n            @return the kerning to be applied\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.Process(iTextSharp.text.pdf.RandomAccessFileOrArray)\">\r\n            Reads the font metrics\r\n            @param rf the AFM file\r\n            @throws DocumentException the AFM file is invalid\r\n            @throws IOException the AFM file could not be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.GetFullFontStream\">\r\n            If the embedded flag is <CODE>false</CODE> or if the font is\r\n             one of the 14 built in types, it returns <CODE>null</CODE>,\r\n            otherwise the font is read and output in a PdfStream object.\r\n            @return the PdfStream containing the font or <CODE>null</CODE>\r\n            @throws DocumentException if there is an error reading the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.GetFontDescriptor(iTextSharp.text.pdf.PdfIndirectReference)\">\r\n            Generates the font descriptor for this font or <CODE>null</CODE> if it is\r\n            one of the 14 built in fonts.\r\n            @param fontStream the indirect reference to a PdfStream containing the font or <CODE>null</CODE>\r\n            @return the PdfDictionary containing the font descriptor or <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.GetFontBaseType(iTextSharp.text.pdf.PdfIndirectReference,System.Int32,System.Int32,System.Byte[])\">\r\n            Generates the font dictionary for this font.\r\n            @return the PdfDictionary containing the font dictionary\r\n            @param firstChar the first valid character\r\n            @param lastChar the last valid character\r\n            @param shortTag a 256 bytes long <CODE>byte</CODE> array where each unused byte is represented by 0\r\n            @param fontDescriptor the indirect reference to a PdfDictionary containing the font descriptor or <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.WriteFont(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.pdf.PdfIndirectReference,System.Object[])\">\r\n            Outputs to the writer the font dictionaries and streams.\r\n            @param writer the writer for this document\r\n            @param ref the font indirect reference\r\n            @param parms several parameters that depend on the font type\r\n            @throws IOException on error\r\n            @throws DocumentException error in generating the object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.GetFontDescriptor(System.Int32,System.Single)\">\r\n            Gets the font parameter identified by <CODE>key</CODE>. Valid values\r\n            for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,\r\n            <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>\r\n            and <CODE>BBOXURY</CODE>.\r\n            @param key the parameter to be extracted\r\n            @param fontSize the font size in points\r\n            @return the parameter in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.SetFontDescriptor(System.Int32,System.Single)\">\r\n            Sets the font parameter identified by <CODE>key</CODE>. Valid values\r\n            for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,\r\n            <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>\r\n            and <CODE>BBOXURY</CODE>.\r\n            @param key the parameter to be updated\r\n            @param value the parameter value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.Type1Font.PostscriptFontName\">\r\n            Gets the postscript font name.\r\n            @return the postscript font name\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.Type1Font.FullFontName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.Type1Font.AllNameEntries”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.pdf.Type1Font.FamilyFontName”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.HasKernPairs\">\r\n            Checks if the font has any kerning pairs.\r\n            @return <CODE>true</CODE> if the font has any kerning pairs\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type1Font.SetKerning(System.Int32,System.Int32,System.Int32)\">\r\n            Sets the kerning between two Unicode chars.\r\n            @param char1 the first char\r\n            @param char2 the second char\r\n            @param kern the kerning to apply in normalized 1000 units\r\n            @return <code>true</code> if the kerning was applied, <code>false</code> otherwise\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.Type3Font\">\r\n            A class to support Type3 fonts.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type3Font.#ctor(iTextSharp.text.pdf.PdfWriter,System.Char[],System.Boolean)\">\r\n            Creates a Type3 font.\r\n            @param writer the writer\r\n            @param chars an array of chars corresponding to the glyphs used (not used, prisent for compability only)\r\n            @param colorized if <CODE>true</CODE> the font may specify color, if <CODE>false</CODE> no color commands are allowed\r\n            and only images as masks can be used\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.pdf.Type3Font.#ctor(iTextSharp.text.pdf.PdfWriter,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.pdf.Type3Font.DefineGlyph(System.Char,System.Single,System.Single,System.Single,System.Single,System.Single)\">\r\n            Defines a glyph. If the character was already defined it will return the same content\r\n            @param c the character to match this glyph.\r\n            @param wx the advance this character will have\r\n            @param llx the X lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is\r\n            <CODE>true</CODE> the value is ignored\r\n            @param lly the Y lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is\r\n            <CODE>true</CODE> the value is ignored\r\n            @param urx the X upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is\r\n            <CODE>true</CODE> the value is ignored\r\n            @param ury the Y upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is\r\n            <CODE>true</CODE> the value is ignored\r\n            @return a content where the glyph can be defined\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.Type3Font.GetFullFontStream\">\r\n            Always returns null, because you can't get the FontStream of a Type3 font.\r\n            @return  null\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.Type3Glyph\">\r\n            The content where Type3 glyphs are written to.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.VerticalText\">\r\n            Writes text vertically. Note that the naming is done according\r\n            to horizontal text although it referrs to vertical text.\r\n            A line with the alignment Element.LEFT_ALIGN will actually\r\n            be top aligned.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.NO_MORE_TEXT\">\r\n            Signals that there are no more text available. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.NO_MORE_COLUMN\">\r\n            Signals that there is no more column. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.chunks\">\r\n            The chunks that form the text. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.text\">\r\n            The <CODE>PdfContent</CODE> where the text will be written to. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.alignment\">\r\n            The column Element. Default is left Element. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.currentChunkMarker\">\r\n            Marks the chunks to be eliminated when the line is written. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.currentStandbyChunk\">\r\n            The chunk created by the splitting. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.splittedChunkText\">\r\n            The chunk created by the splitting. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.leading\">\r\n            The leading\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.startX\">\r\n            The X coordinate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.startY\">\r\n            The Y coordinate.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.maxLines\">\r\n            The maximum number of vertical lines.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.VerticalText.height\">\r\n            The height of the text.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.#ctor(iTextSharp.text.pdf.PdfContentByte)\">\r\n            Creates new VerticalText\r\n            @param text the place where the text will be written to. Can\r\n            be a template.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.AddText(iTextSharp.text.Phrase)\">\r\n            Adds a <CODE>Phrase</CODE> to the current text array.\r\n            @param phrase the text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.AddText(iTextSharp.text.Chunk)\">\r\n            Adds a <CODE>Chunk</CODE> to the current text array.\r\n            @param chunk the text\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.SetVerticalLayout(System.Single,System.Single,System.Single,System.Int32,System.Single)\">\r\n            Sets the layout.\r\n            @param startX the top right X line position\r\n            @param startY the top right Y line position\r\n            @param height the height of the lines\r\n            @param maxLines the maximum number of lines\r\n            @param leading the separation between the lines\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.VerticalText.Leading\">\r\n            Gets the separation between the vertical lines.\r\n            @return the vertical line separation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.CreateLine(System.Single)\">\r\n            Creates a line from the chunk array.\r\n            @param width the width of the line\r\n            @return the line or null if no more chunks\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.ShortenChunkArray\">\r\n            Normalizes the list of chunks when the line is accepted.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.Go\">\r\n            Outputs the lines to the document. It is equivalent to <CODE>go(false)</CODE>.\r\n            @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>\r\n            and/or <CODE>NO_MORE_COLUMN</CODE>\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.Go(System.Boolean)\">\r\n            Outputs the lines to the document. The output can be simulated.\r\n            @param simulate <CODE>true</CODE> to simulate the writting to the document\r\n            @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>\r\n            and/or <CODE>NO_MORE_COLUMN</CODE>\r\n            @throws DocumentException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.VerticalText.SetOrigin(System.Single,System.Single)\">\r\n            Sets the new text origin.\r\n            @param startX the X coordinate\r\n            @param startY the Y coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.VerticalText.OriginX\">\r\n            Gets the X coordinate where the next line will be writen. This value will change\r\n            after each call to <code>go()</code>.\r\n            @return  the X coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.VerticalText.OriginY\">\r\n            Gets the Y coordinate where the next line will be writen.\r\n            @return  the Y coordinate\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.VerticalText.MaxLines\">\r\n            Gets the maximum number of available lines. This value will change\r\n            after each call to <code>go()</code>.\r\n            @return Value of property maxLines.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.VerticalText.Height\">\r\n            Gets the height of the line\r\n            @return the height\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.VerticalText.Alignment\">\r\n            Gets the Element.\r\n            @return the alignment\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm\">\r\n            Processes XFA forms.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.#ctor\">\r\n            An empty constructor to build on.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.GetXfaObject(iTextSharp.text.pdf.PdfReader)\">\r\n            Return the XFA Object, could be an array, could be a Stream.\r\n            Returns null f no XFA Object is present.\r\n            @param    reader  a PdfReader instance\r\n            @return   the XFA object\r\n            @since    2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.#ctor(iTextSharp.text.pdf.PdfReader)\">\r\n            A constructor from a <CODE>PdfReader</CODE>. It basically does everything\r\n            from finding the XFA stream to the XML parsing.\r\n            @param reader the reader\r\n            @throws java.io.IOException on error\r\n            @throws javax.xml.parsers.ParserConfigurationException on error\r\n            @throws org.xml.sax.SAXException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.ExtractNodes\">\r\n            Extracts the nodes from the domDocument.\r\n            @since    2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.CreateDatasetsNode(System.Xml.XmlNode)\">\r\n            Some XFA forms don't have a datasets node.\r\n            If this is the case, we have to add one.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.SetXfa(iTextSharp.text.pdf.XfaForm,iTextSharp.text.pdf.PdfReader,iTextSharp.text.pdf.PdfWriter)\">\r\n            Sets the XFA key from a byte array. The old XFA is erased.\r\n            @param form the data\r\n            @param reader the reader\r\n            @param writer the writer\r\n            @throws java.io.IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.SetXfa(iTextSharp.text.pdf.PdfWriter)\">\r\n            Sets the XFA key from the instance data. The old XFA is erased.\r\n            @param writer the writer\r\n            @throws java.io.IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.SerializeDoc(System.Xml.XmlNode)\">\r\n            Serializes a XML document to a byte array.\r\n            @param n the XML document\r\n            @throws java.io.IOException on error\r\n            @return the serialized XML document\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.XfaPresent\">\r\n            Returns <CODE>true</CODE> if it is a XFA form.\r\n            @return <CODE>true</CODE> if it is a XFA form\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.DomDocument\">\r\n            Gets the top level DOM document.\r\n            @return the top level DOM document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.FindFieldName(System.String,iTextSharp.text.pdf.AcroFields)\">\r\n            Finds the complete field name contained in the \"classic\" forms from a partial\r\n            name.\r\n            @param name the complete or partial name\r\n            @param af the fields\r\n            @return the complete name or <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.FindDatasetsName(System.String)\">\r\n            Finds the complete SOM name contained in the datasets section from a \r\n            possibly partial name.\r\n            @param name the complete or partial name\r\n            @return the complete name or <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.FindDatasetsNode(System.String)\">\r\n            Finds the <CODE>Node</CODE> contained in the datasets section from a \r\n            possibly partial name.\r\n            @param name the complete or partial name\r\n            @return the <CODE>Node</CODE> or <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.GetNodeText(System.Xml.XmlNode)\">\r\n            Gets all the text contained in the child nodes of this node.\r\n            @param n the <CODE>Node</CODE>\r\n            @return the text found or \"\" if no text was found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.SetNodeText(System.Xml.XmlNode,System.String)\">\r\n            Sets the text of this node. All the child's node are deleted and a new\r\n            child text node is created.\r\n            @param n the <CODE>Node</CODE> to add the text to\r\n            @param text the text to add\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.Reader\">\r\n            Sets the <CODE>PdfReader</CODE> to be used by this instance.\r\n            @param reader the <CODE>PdfReader</CODE> to be used by this instance\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.Changed\">\r\n            Checks if this XFA form was changed.\r\n            @return <CODE>true</CODE> if this XFA form was changed\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm.InverseStore\">\r\n            A structure to store each part of a SOM name and link it to the next part\r\n            beginning from the lower hierarchie.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.InverseStore.DefaultName\">\r\n            Gets the full name by traversing the hiearchie using only the\r\n            index 0.\r\n            @return the full name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.InverseStore.IsSimilar(System.String)\">\r\n            Search the current node for a similar name. A similar name starts\r\n            with the same name but has a differnt index. For example, \"detail[3]\" \r\n            is similar to \"detail[9]\". The main use is to discard names that\r\n            correspond to out of bounds records.\r\n            @param name the name to search\r\n            @return <CODE>true</CODE> if a similitude was found\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm.Stack2`1\">\r\n            Another stack implementation. The main use is to facilitate\r\n            the porting to other languages.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Stack2`1.Peek\">\r\n            Looks at the object at the top of this stack without removing it from the stack.\r\n            @return the object at the top of this stack\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Stack2`1.Pop\">\r\n            Removes the object at the top of this stack and returns that object as the value of this function.\r\n            @return the object at the top of this stack \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Stack2`1.Push(`0)\">\r\n            Pushes an item onto the top of this stack.\r\n            @param item the item to be pushed onto this stack\r\n            @return the <CODE>item</CODE> argument\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Stack2`1.Empty\">\r\n            Tests if this stack is empty.\r\n            @return <CODE>true</CODE> if and only if this stack contains no items; <CODE>false</CODE> otherwise\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm.Xml2Som\">\r\n            A class for some basic SOM processing.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XfaForm.Xml2Som.order\">\r\n            The order the names appear in the XML, depth first.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XfaForm.Xml2Som.name2Node\">\r\n            The mapping of full names to nodes.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XfaForm.Xml2Som.inverseSearch\">\r\n            The data to do a search from the bottom hierarchie.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XfaForm.Xml2Som.stack\">\r\n            A stack to be used when parsing.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XfaForm.Xml2Som.anform\">\r\n            A temporary store for the repetition count.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.EscapeSom(System.String)\">\r\n            Escapes a SOM string fragment replacing \".\" with \"\\.\".\r\n            @param s the unescaped string\r\n            @return the escaped string\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.UnescapeSom(System.String)\">\r\n            Unescapes a SOM string fragment replacing \"\\.\" with \".\".\r\n            @param s the escaped string\r\n            @return the unescaped string\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.PrintStack\">\r\n            Outputs the stack as the sequence of elements separated\r\n            by '.'.\r\n            @return the stack as the sequence of elements separated by '.'\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.GetShortName(System.String)\">\r\n            Gets the name with the <CODE>#subform</CODE> removed.\r\n            @param s the long name\r\n            @return the short name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.InverseSearchAdd(System.String)\">\r\n            Adds a SOM name to the search node chain.\r\n            @param unstack the SOM name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.InverseSearchAdd(System.Collections.Generic.Dictionary{System.String,iTextSharp.text.pdf.XfaForm.InverseStore},iTextSharp.text.pdf.XfaForm.Stack2{System.String},System.String)\">\r\n            Adds a SOM name to the search node chain.\r\n            @param inverseSearch the start point\r\n            @param stack the stack with the separeted SOM parts\r\n            @param unstack the full name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.InverseSearchGlobal(System.Collections.Generic.List{System.String})\">\r\n            Searchs the SOM hiearchie from the bottom.\r\n            @param parts the SOM parts\r\n            @return the full name or <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2Som.SplitParts(System.String)\">\r\n            Splits a SOM name in the individual parts.\r\n            @param name the full SOM name\r\n            @return the split name\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.Xml2Som.Order\">\r\n            Gets the order the names appear in the XML, depth first.\r\n            @return the order the names appear in the XML, depth first\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.Xml2Som.Name2Node\">\r\n            Gets the mapping of full names to nodes.\r\n            @return the mapping of full names to nodes\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.Xml2Som.InverseSearch\">\r\n            Gets the data to do a search from the bottom hierarchie.\r\n            @return the data to do a search from the bottom hierarchie\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm.Xml2SomDatasets\">\r\n            Processes the datasets section in the XFA form.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2SomDatasets.#ctor(System.Xml.XmlNode)\">\r\n            Creates a new instance from the datasets node. This expects\r\n            not the datasets but the data node that comes below.\r\n            @param n the datasets node\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2SomDatasets.InsertNode(System.Xml.XmlNode,System.String)\">\r\n            Inserts a new <CODE>Node</CODE> that will match the short name.\r\n            @param n the datasets top <CODE>Node</CODE>\r\n            @param shortName the short name\r\n            @return the new <CODE>Node</CODE> of the inserted name\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm.AcroFieldsSearch\">\r\n            A class to process \"classic\" fields.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.AcroFieldsSearch.#ctor(System.Collections.Generic.ICollection{System.String})\">\r\n            Creates a new instance from a Collection with the full names.\r\n            @param items the Collection\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.AcroFieldsSearch.AcroShort2LongName\">\r\n            Gets the mapping from short names to long names. A long \r\n            name may contain the #subform name part.\r\n            @return the mapping from short names to long names\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaForm.Xml2SomTemplate\">\r\n            Processes the template section in the XFA form.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2SomTemplate.#ctor(System.Xml.XmlNode)\">\r\n            Creates a new instance from the datasets node.\r\n            @param n the template node\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.Xml2SomTemplate.GetFieldType(System.String)\">\r\n            Gets the field type as described in the <CODE>template</CODE> section of the XFA.\r\n            @param s the exact template name\r\n            @return the field type or <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.Xml2SomTemplate.DynamicForm\">\r\n            <CODE>true</CODE> if it's a dynamic form; <CODE>false</CODE>\r\n            if it's a static form.\r\n            @return <CODE>true</CODE> if it's a dynamic form; <CODE>false</CODE>\r\n            if it's a static form\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.TemplateSom\">\r\n            Gets the class that contains the template processing section of the XFA.\r\n            @return the class that contains the template processing section of the XFA\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.DatasetsSom\">\r\n            Gets the class that contains the datasets processing section of the XFA.\r\n            @return the class that contains the datasets processing section of the XFA\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.AcroFieldsSom\">\r\n            Gets the class that contains the \"classic\" fields processing.\r\n            @return the class that contains the \"classic\" fields processing\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfaForm.DatasetsNode\">\r\n            Gets the <CODE>Node</CODE> that corresponds to the datasets part.\r\n            @return the <CODE>Node</CODE> that corresponds to the datasets part\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaForm.FillXfaForm(System.Xml.XmlNode,System.Boolean)\">\r\n            Replaces the data under datasets/data.\r\n            @since\tiText 5.0.0\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaXmlLocator\">\r\n            Helps to locate xml stream inside PDF document with Xfa form.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaXmlLocator.GetDocument\">\r\n            Gets Document to sign\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaXmlLocator.SetDocument(System.Xml.XmlDocument)\">\r\n            Save document as single XML stream in AcroForm.\r\n            @param document signed document\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaXpathConstructor\">\r\n            Constructor for xpath expression for signing XfaForm\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfaXpathConstructor.XdpPackage\">\r\n            Possible xdp packages to sign\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaXpathConstructor.#ctor\">\r\n            Empty constructor, no transform.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaXpathConstructor.#ctor(iTextSharp.text.pdf.XfaXpathConstructor.XdpPackage)\">\r\n            Construct for Xpath expression. Depends from selected xdp package.\r\n            @param xdpPackage\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfaXpathConstructor.GetXpathExpression\">\r\n            Get XPath expression\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.XfdfReader\">\r\n            Reads a XFDF.\r\n            @author Leonard Rosenthol (leonardr@pdfsages.com)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XfdfReader.listFields\">\r\n            Storage for field values if there's more than one value for a field.\r\n            @since    2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.#ctor(System.String)\">\r\n            Reads an XFDF form.\r\n            @param filename the file name of the form\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.#ctor(System.Byte[])\">\r\n            Reads an XFDF form.\r\n            @param xfdfIn the byte array with the form\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.#ctor(System.IO.Stream)\">\r\n            Reads an XFDF form.\r\n            @param is an InputStream to read the form\r\n            @throws IOException on error\r\n            @since 5.0.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfdfReader.Fields\">\r\n            Gets all the fields. The map is keyed by the fully qualified\r\n            field name and the value is a merged <CODE>PdfDictionary</CODE>\r\n            with the field content.\r\n            @return all the fields\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.GetField(System.String)\">\r\n            Gets the field value.\r\n            @param name the fully qualified field name\r\n            @return the field's value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.GetFieldValue(System.String)\">\r\n            Gets the field value or <CODE>null</CODE> if the field does not\r\n            exist or has no value defined.\r\n            @param name the fully qualified field name\r\n            @return the field value or <CODE>null</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.GetListValues(System.String)\">\r\n            Gets the field values for a list or <CODE>null</CODE> if the field does not\r\n            exist or has no value defined.\r\n            @param name the fully qualified field name\r\n            @return the field values or <CODE>null</CODE>\r\n            @since   2.1.4\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.XfdfReader.FileSpec\">\r\n            Gets the PDF file specification contained in the FDF.\r\n            @return the PDF file specification contained in the FDF\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.StartElement(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Called when a start tag is found.\r\n            @param tag the tag name\r\n            @param h the tag's attributes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.EndElement(System.String)\">\r\n            Called when an end tag is found.\r\n            @param tag the tag name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.StartDocument\">\r\n            Called when the document starts to be parsed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.EndDocument\">\r\n            Called after the document is parsed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XfdfReader.Text(System.String)\">\r\n            Called when a text element is found.\r\n            @param str the text element, probably a fragment.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.#ctor(iTextSharp.text.pdf.PdfStamperImp)\">\r\n            Constructs XmlSignatureAppearance object.\r\n            @param writer the writer to which the signature will be written.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XmlSignatureAppearance.signDate\">\r\n            Holds value of property xades:SigningTime. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XmlSignatureAppearance.description\">\r\n            Holds value of property xades:Description. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.XmlSignatureAppearance.mimeType\">\r\n            Holds value of property xades:MimeType. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.SetCertificate(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Sets the certificate used to provide the text in the appearance.\r\n            This certificate doesn't take part in the actual signing process.\r\n            @param signCertificate the certificate\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.GetSignDate\">\r\n            Gets the signature date.\r\n            @return the signature date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.SetSignDate(System.DateTime)\">\r\n            Sets the signature date.\r\n            @param signDate the signature date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.GetXmlLocator\">\r\n            Helps to locate xml stream\r\n            @return XmlLocator, cannot be null.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.GetXpathConstructor\">\r\n            Constructor for xpath expression in case signing only part of XML document.\r\n            @return XpathConstructor, can be null\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.XmlSignatureAppearance.Close\">\r\n            Close PdfStamper\r\n            @throws IOException\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.LongHashtable\">\r\n            A Hashtable that uses ints as the keys.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.LongHashtable.table\">\r\n            The hash table data.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.LongHashtable.count\">\r\n            The total number of entries in the hash table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.LongHashtable.threshold\">\r\n            Rehashes the table when count exceeds this threshold.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.LongHashtable.loadFactor\">\r\n            The load factor for the hashtable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.#ctor(System.Int32,System.Single)\">\r\n            Constructs a new, empty hashtable with the specified initial\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.#ctor(System.Int32)\">\r\n            Constructs a new, empty hashtable with the specified initial\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.#ctor\">\r\n            Constructs a new, empty hashtable. A default capacity and load factor\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.LongHashtable.Size\">\r\n            Returns the number of elements contained in the hashtable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.IsEmpty\">\r\n            Returns true if the hashtable contains no elements.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.Contains(System.Int64)\">\r\n            Returns true if the specified object is an element of the hashtable.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.ContainsKey(System.Int64)\">\r\n            Returns true if the collection contains an element for the key.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.LongHashtable.Item(System.Int64)\">\r\n            Gets the object associated with the specified key in the\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.Rehash\">\r\n            Rehashes the content of the table into a bigger table.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.Remove(System.Int64)\">\r\n            Removes the element corresponding to the key. Does nothing if the\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.LongHashtable.Clear\">\r\n            Clears the hash table so that it has no more elements in it.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers\">\r\n            Encapsulates filter behavior for PDF streams.  Classes generally interace with this\r\n            using the static GetDefaultFilterHandlers() method, then obtain the desired {@link IFilterHandler}\r\n            via a lookup.\r\n            @since 5.0.4\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.IFilterHandler\">\r\n            The main interface for creating a new {@link IFilterHandler}\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.FilterHandlers.defaults\">\r\n            The default {@link IFilterHandler}s used by iText \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FilterHandlers.GetDefaultFilterHandlers\">\r\n            @return the default {@link IFilterHandler}s used by iText\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.FilterHandlers.EnableMemoryLimitsAwareHandler(iTextSharp.text.pdf.PdfDictionary)\">\r\n             Creates a {@link MemoryLimitsAwareOutputStream} which will be used for decompression of the passed pdf stream.\r\n            \r\n             @param streamDictionary the pdf stream which is going to be decompressed.\r\n             @return the {@link ByteArrayOutputStream} which will be used for decompression of the passed pdf stream\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_FLATEDECODE\">\r\n            Handles FLATEDECODE filter\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_ASCIIHEXDECODE\">\r\n            Handles ASCIIHEXDECODE filter\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_ASCII85DECODE\">\r\n            Handles ASCIIHEXDECODE filter\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_LZWDECODE\">\r\n            Handles LZWDECODE filter\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_CCITTFAXDECODE\">\r\n            Handles CCITTFAXDECODE filter\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_DoNothing\">\r\n            A filter that doesn't modify the stream at all\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.FilterHandlers.Filter_RUNLENGTHDECODE\">\r\n            Handles RUNLENGTHDECODE filter\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.NumberArray\">\r\n            A PdfArray object consisting of nothing but PdfNumber objects\r\n            @since 5.1.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.NumberArray.#ctor\">\r\n            Creates a PdfArray consisting of PdfNumber objects.\r\n            @param numbers float values\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.NumberArray.#ctor(System.Collections.Generic.IList{iTextSharp.text.pdf.PdfNumber})\">\r\n            Creates a PdfArray consisting of PdfNumber objects.\r\n            @param numbers a List containing PdfNumber objects\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.IPdfPTableEventSplit\">\r\n            Signals that a table will continue in the next page.\r\n            \r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.IPdfPTableEventSplit.SplitTable(iTextSharp.text.pdf.PdfPTable)\">\r\n             This method is called to indicate that table is being split. It's called\r\n             before the <CODE>tableLayout</CODE> method and before the table is drawn.\r\n            \r\n             @param table the <CODE>PdfPTable</CODE> in use\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfConcatenate\">\r\n            Wrapper class for PdfCopy and PdfSmartCopy.\r\n            Allows you to concatenate existing PDF documents with much less code.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfConcatenate.document\">\r\n            The Document object for PdfCopy. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfConcatenate.copy\">\r\n            The actual PdfWriter \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfConcatenate.#ctor(System.IO.Stream)\">\r\n            Creates an instance of the concatenation class.\r\n            @param os    the Stream for the PDF document\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfConcatenate.#ctor(System.IO.Stream,System.Boolean)\">\r\n            Creates an instance of the concatenation class.\r\n            @param os    the Stream for the PDF document\r\n            @param smart do we want PdfCopy to detect redundant content?\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfConcatenate.AddPages(iTextSharp.text.pdf.PdfReader)\">\r\n            Adds the pages from an existing PDF document.\r\n            @param reader    the reader for the existing PDF document\r\n            @return          the number of pages that were added\r\n            @throws DocumentException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfConcatenate.Writer\">\r\n            Gets the PdfCopy instance so that you can add bookmarks or change preferences before you close PdfConcatenate.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfConcatenate.Open\">\r\n            Opens the document (if it isn't open already).\r\n            Opening the document is done implicitly.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfConcatenate.Close\">\r\n            We've finished writing the concatenated document.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDiv.spacingBefore\">\r\n            The spacing before the table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDiv.spacingAfter\">\r\n            The spacing after the table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfDiv.keepTogether\">\r\n            Defines if the div should be kept on one page if possible\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDiv.getActualHeight\">\r\n            IMPROTANT NOTE: be careful with this method because it would return correct result\r\n            only in case if {@link PdfDiv#layout(PdfContentByte, boolean, boolean, float, float, float, float)}\r\n            was already called.\r\n            @return the actual height the div would require to layout it's content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDiv.getActualWidth\">\r\n            IMPROTANT NOTE: be careful with this method because it would return correct result\r\n            only in case if {@link PdfDiv#layout(PdfContentByte, boolean, boolean, float, float, float, float)}\r\n            was already called.\r\n            @return the actual width the div would require to layout it's content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDiv.SetBackgroundImage(iTextSharp.text.Image,System.Single,System.Single)\">\r\n            Image will be scaled to fit in the div occupied area.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDiv.Chunks\">\r\n             Gets all the chunks in this element.\r\n            \r\n             @return\tan <CODE>ArrayList</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.pdf.PdfDiv.Type\">\r\n             Gets the type of the text element.\r\n            \r\n             @return\ta type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDiv.IsContent\">\r\n            @see com.itextpdf.text.Element#isContent()\r\n            @since\tiText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDiv.IsNestable\">\r\n            @see com.itextpdf.text.Element#isNestable()\r\n            @since\tiText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfDiv.Process(iTextSharp.text.IElementListener)\">\r\n             Processes the element by adding it (or the different parts) to an\r\n             <CODE>ElementListener</CODE>.\r\n            \r\n             @param\tlistener\tan <CODE>ElementListener</CODE>\r\n             @return\t<CODE>true</CODE> if the element was processed successfully\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.pdf.PdfIsoConformanceException.serialVersionUID\">\r\n            Serial version UID \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIsoConformanceException.#ctor\">\r\n            Creates a new instance of PdfIsoConformanceException. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfIsoConformanceException.#ctor(System.String)\">\r\n            Creates a new instance of PdfIsoConformanceException.\r\n            @param s\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSigLockDictionary\">\r\n            A signature field lock dictionary.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSigLockDictionary.LockAction\">\r\n            Enumerates the different actions of a signature lock.\r\n            Indicates the set of fields that should be locked:\r\n            all the fields in the document,\r\n            all the fields specified in the /Fields array\r\n            all the fields except those specified in the /Fields array\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.pdf.PdfSigLockDictionary.LockPermissions\">\r\n            Enumerates the different levels of permissions.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSigLockDictionary.#ctor\">\r\n            Creates a signature lock valid for all fields in the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSigLockDictionary.#ctor(iTextSharp.text.pdf.PdfSigLockDictionary.LockPermissions)\">\r\n            Creates a signature lock for all fields in the document,\r\n            setting specific permissions.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSigLockDictionary.#ctor(iTextSharp.text.pdf.PdfSigLockDictionary.LockAction,System.String[])\">\r\n            Creates a signature lock for specific fields in the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfSigLockDictionary.#ctor(iTextSharp.text.pdf.PdfSigLockDictionary.LockAction,iTextSharp.text.pdf.PdfSigLockDictionary.LockPermissions,System.String[])\">\r\n            Creates a signature lock for specific fields in the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.pdf.PdfStructTreeController.AttachStructTreeRootKids(iTextSharp.text.pdf.PdfObject)\">\r\n            Add kid to structureTreeRoot from structTreeRoot\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Anchor\">\r\n            <summary>\r\n            An Anchor can be a reference or a destination of a reference.\r\n            </summary>\r\n            <remarks>\r\n            An Anchor is a special kind of <see cref=\"T:iTextSharp.text.Phrase\"/>.\r\n            It is constructed in the same way.\r\n            </remarks>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Phrase\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Anchor.name\">\r\n            <summary>\r\n            This is the name of the Anchor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Anchor.reference\">\r\n            <summary>\r\n            This is the reference of the Anchor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor\">\r\n            <summary>\r\n            Constructs an Anchor without specifying a leading.\r\n            </summary>\r\n            <overloads>\r\n            Has nine overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(System.Single)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain Chunk.\r\n            </summary>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(System.String)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain string.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain string\r\n            and a certain Font.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a Font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(System.Single,iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain Chunk\r\n            and a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(System.Single,System.String)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain leading\r\n            and a certain string.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(System.Single,System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs an Anchor with a certain leading,\r\n            a certain string and a certain Font.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a Font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.#ctor(iTextSharp.text.Phrase)\">\r\n             Constructs an <CODE>Anchor</CODE> with a certain <CODE>Phrase</CODE>.\r\n            \r\n             @param   phrase      a <CODE>Phrase</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            <see cref=\"T:iTextSharp.text.IElementListener\"/>\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Anchor.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Anchor.ApplyAnchor(iTextSharp.text.Chunk,System.Boolean,System.Boolean)\">\r\n            Applies the properties of the Anchor to a Chunk.\r\n            @param chunk\t\t\tthe Chunk (part of the Anchor)\r\n            @param notGotoOK\t\tif true, this chunk will determine the local destination\r\n            @param localDestination\ttrue if the chunk is a local goto and the reference a local destination\r\n            @return\tthe value of notGotoOK or false, if a previous Chunk was used to determine the local destination\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Anchor.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Anchor.Name\">\r\n            <summary>\r\n            Name of this Anchor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Anchor.Reference\">\r\n            <summary>\r\n            reference of this Anchor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Anchor.Url\">\r\n            <summary>\r\n            reference of this Anchor.\r\n            </summary>\r\n            <value>an Uri</value>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Annotation\">\r\n            <summary>\r\n            An Annotation is a little note that can be added to a page\r\n            on a document.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Anchor\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.TEXT\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.URL_NET\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.URL_AS_STRING\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.FILE_DEST\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.FILE_PAGE\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.NAMED_DEST\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.LAUNCH\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.SCREEN\">\r\n            <summary>This is a possible annotation type.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.TITLE\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.CONTENT\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.URL\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.FILE\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.DESTINATION\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.PAGE\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.NAMED\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.APPLICATION\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.PARAMETERS\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.OPERATION\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.DEFAULTDIR\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.LLX\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.LLY\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.URX\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.URY\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.MIMETYPE\">\r\n            <summary>This is a possible attribute.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.annotationtype\">\r\n            <summary>This is the type of annotation.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.annotationAttributes\">\r\n            <summary>This is the title of the Annotation.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.llx\">\r\n            <summary>This is the lower left x-value</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.lly\">\r\n            <summary>This is the lower left y-value</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.urx\">\r\n            <summary>This is the upper right x-value</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Annotation.ury\">\r\n            <summary>This is the upper right y-value</summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs an Annotation with a certain title and some text.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.String,System.String)\">\r\n            <summary>\r\n            Constructs an Annotation with a certain title and some text.\r\n            </summary>\r\n            <param name=\"title\">the title of the annotation</param>\r\n            <param name=\"text\">the content of the annotation</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.String,System.String,System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs an Annotation with a certain title and some text.\r\n            </summary>\r\n            <param name=\"title\">the title of the annotation</param>\r\n            <param name=\"text\">the content of the annotation</param>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.Uri)\">\r\n            <summary>\r\n            Constructs an Annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"url\">the external reference</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.String)\">\r\n            <summary>\r\n            Constructs an Annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"url\">the external reference</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.String,System.String)\">\r\n            <summary>\r\n            Constructs an Annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"file\">an external PDF file</param>\r\n            <param name=\"dest\">the destination in this file</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.String,System.String,System.Boolean)\">\r\n            <summary>\r\n            Creates a Screen anotation to embed media clips\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"moviePath\">path to the media clip file</param>\r\n            <param name=\"mimeType\">mime type of the media</param>\r\n            <param name=\"showOnDisplay\">if true play on display of the page</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.String,System.Int32)\">\r\n            <summary>\r\n            Constructs an Annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"file\">an external PDF file</param>\r\n            <param name=\"page\">a page number in this file</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs an Annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"named\">a named destination in this file</param>\r\n            <overloads>\r\n            Has nine overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.#ctor(System.Single,System.Single,System.Single,System.Single,System.String,System.String,System.String,System.String)\">\r\n            <summary>\r\n            Constructs an Annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n            <param name=\"application\">an external application</param>\r\n            <param name=\"parameters\">parameters to pass to this application</param>\r\n            <param name=\"operation\">the operation to pass to this application</param>\r\n            <param name=\"defaultdir\">the default directory to run this application in</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Annotation.Type\">\r\n            <summary>\r\n            Gets the type of the text element\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was process successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Annotation.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.SetDimensions(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Sets the dimensions of this annotation.\r\n            </summary>\r\n            <param name=\"llx\">the lower left x-value</param>\r\n            <param name=\"lly\">the lower left y-value</param>\r\n            <param name=\"urx\">the upper right x-value</param>\r\n            <param name=\"ury\">the upper right y-value</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetLlx\">\r\n            <summary>\r\n            Returns the lower left x-value.\r\n            </summary>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetLly\">\r\n            <summary>\r\n            Returns the lower left y-value.\r\n            </summary>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetUrx\">\r\n            <summary>\r\n            Returns the uppper right x-value.\r\n            </summary>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetUry\">\r\n            <summary>\r\n            Returns the uppper right y-value.\r\n            </summary>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetLlx(System.Single)\">\r\n            <summary>\r\n            Returns the lower left x-value.\r\n            </summary>\r\n            <param name=\"def\">the default value</param>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetLly(System.Single)\">\r\n            <summary>\r\n            Returns the lower left y-value.\r\n            </summary>\r\n            <param name=\"def\">the default value</param>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetUrx(System.Single)\">\r\n            <summary>\r\n            Returns the upper right x-value.\r\n            </summary>\r\n            <param name=\"def\">the default value</param>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.GetUry(System.Single)\">\r\n            <summary>\r\n            Returns the upper right y-value.\r\n            </summary>\r\n            <param name=\"def\">the default value</param>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Annotation.AnnotationType\">\r\n            <summary>\r\n            Returns the type of this Annotation.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Annotation.Title\">\r\n            <summary>\r\n            Returns the title of this Annotation.\r\n            </summary>\r\n            <value>a name</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Annotation.Content\">\r\n            <summary>\r\n            Gets the content of this Annotation.\r\n            </summary>\r\n            <value>a reference</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Annotation.Attributes\">\r\n            <summary>\r\n            Gets the content of this Annotation.\r\n            </summary>\r\n            <value>a reference</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Annotation.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.BadElementException\">\r\n            <summary>\r\n            Signals an attempt to create an Element that hasn't got the right form.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Cell\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Table\"/>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.BaseColor\">\r\n            <summary>\r\n            Base class for Color, serves as wrapper class for <see cref=\"T:System.Drawing.Color\"/>\r\n            to allow extension.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            Construct a new BaseColor.\r\n            @param red the value for the red gamma\r\n            @param green the value for the green gamma\r\n            @param blue the value for the blue gamma\r\n            @param alpha the value for the alpha gamma\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.#ctor(System.Int32,System.Int32,System.Int32)\">\r\n            @param red\r\n            @param green\r\n            @param blue\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.#ctor(System.Single,System.Single,System.Single,System.Single)\">\r\n            Construct a BaseColor with float values.\r\n            @param red\r\n            @param green\r\n            @param blue\r\n            @param alpha\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.#ctor(System.Single,System.Single,System.Single)\">\r\n            Construct a BaseColor with float values.\r\n            @param red\r\n            @param green\r\n            @param blue\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.#ctor(System.Int32)\">\r\n            Construct a BaseColor by setting the combined value.\r\n            @param argb\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.BaseColor.RGB\">\r\n            @return the combined color value\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.BaseColor.R\">\r\n            \r\n             @return the value for red\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.BaseColor.G\">\r\n            \r\n             @return the value for green\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.BaseColor.B\">\r\n            \r\n             @return the value for blue\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.BaseColor.A\">\r\n            \r\n             @return the value for the alpha channel\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.Brighter\">\r\n            Make this BaseColor brighter. Factor used is 0.7.\r\n            @return the new BaseColor\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.BaseColor.Darker\">\r\n            Make this color darker. Factor used is 0.7\r\n            @return the new BaseColor\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Chapter\">\r\n            <summary>\r\n            A Chapter is a special Section.\r\n            </summary>\r\n            <remarks>\r\n            A chapter number has to be created using a Paragraph as title\r\n            and an int as chapter number. The chapter number is shown be\r\n            default. If you don't want to see the chapter number, you have to set the\r\n            numberdepth to 0.\r\n            </remarks>\r\n            <example>\r\n            <code>\r\n            Paragraph title2 = new Paragraph(\"This is Chapter 2\", FontFactory.GetFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new BaseColor(0, 0, 255)));\r\n            <strong>Chapter chapter2 = new Chapter(title2, 2);\r\n            chapter2.SetNumberDepth(0);</strong>\r\n            Paragraph someText = new Paragraph(\"This is some text\");\r\n            <strong>chapter2.Add(someText);</strong>\r\n            Paragraph title21 = new Paragraph(\"This is Section 1 in Chapter 2\", FontFactory.GetFont(FontFactory.HELVETICA, 16, Font.BOLD, new BaseColor(255, 0, 0)));\r\n            Section section1 = <strong>chapter2.AddSection(title21);</strong>\r\n            Paragraph someSectionText = new Paragraph(\"This is some silly paragraph in a chapter and/or section. It contains some text to test the functionality of Chapters and Section.\");\r\n            section1.Add(someSectionText);\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chapter.#ctor(System.Int32)\">\r\n            Constructs a new <CODE>Chapter</CODE>.\r\n            @param   number      the Chapter number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chapter.#ctor(iTextSharp.text.Paragraph,System.Int32)\">\r\n            <summary>\r\n            Constructs a new Chapter.\r\n            </summary>\r\n            <param name=\"title\">the Chapter title (as a Paragraph)</param>\r\n            <param name=\"number\">the Chapter number</param>\r\n            <overoads>\r\n            Has three overloads.\r\n            </overoads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chapter.#ctor(System.String,System.Int32)\">\r\n            <summary>\r\n            Constructs a new Chapter.\r\n            </summary>\r\n            <param name=\"title\">the Chapter title (as a string)</param>\r\n            <param name=\"number\">the Chapter number</param>\r\n            <overoads>\r\n            Has three overloads.\r\n            </overoads>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chapter.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chapter.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ChapterAutoNumber\">\r\n             Chapter with auto numbering.\r\n            \r\n             @author Michael Niedermair\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.ChapterAutoNumber.numberSet\">\r\n            Is the chapter number already set?\r\n            @since\t2.1.4\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ChapterAutoNumber.#ctor(iTextSharp.text.Paragraph)\">\r\n             Create a new object.\r\n            \r\n             @param para     the Chapter title (as a <CODE>Paragraph</CODE>)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ChapterAutoNumber.#ctor(System.String)\">\r\n            Create a new objet.\r\n            \r\n            @param title     the Chapter title (as a <CODE>String</CODE>)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ChapterAutoNumber.AddSection(System.String)\">\r\n             Create a new section for this chapter and ad it.\r\n            \r\n             @param title  the Section title (as a <CODE>String</CODE>)\r\n             @return Returns the new section.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ChapterAutoNumber.AddSection(iTextSharp.text.Paragraph)\">\r\n             Create a new section for this chapter and add it.\r\n            \r\n             @param title  the Section title (as a <CODE>Paragraph</CODE>)\r\n             @return Returns the new section.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ChapterAutoNumber.SetAutomaticNumber(System.Int32)\">\r\n            Changes the Chapter number.\r\n            @param\tnumber\tthe new chapter number\r\n            @since 2.1.4\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Chunk\">\r\n            <summary>\r\n            This is the smallest significant part of text that can be added to a document.\r\n            </summary>\r\n            <remarks>\r\n            Most elements can be divided in one or more Chunks.\r\n            A chunk is a string with a certain Font.\r\n            all other layoutparameters should be defined in the object to which\r\n            this chunk of text is added.\r\n            </remarks>\r\n            <example>\r\n            <code>\r\n            <strong>Chunk chunk = new Chunk(\"Hello world\", FontFactory.GetFont(FontFactory.COURIER, 20, Font.ITALIC, new BaseColor(255, 0, 0)));</strong>\r\n            document.Add(chunk);\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.OBJECT_REPLACEMENT_CHARACTER\">\r\n            The character stand in for an image or a separator. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.NEWLINE\">\r\n            <summary> This is a Chunk containing a newline. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.NEXTPAGE\">\r\n            This is a Chunk containing a newpage. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.content\">\r\n            <summary> This is the content of this chunk of text. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.font\">\r\n            <summary> This is the Font of this chunk of text. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.attributes\">\r\n            <summary> Contains some of the attributes for this Chunk. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor\">\r\n            <summary>\r\n            Empty constructor.\r\n            </summary>\r\n            <overloads>\r\n            Has six overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.Chunk)\">\r\n            A <CODE>Chunk</CODE> copy constructor.\r\n            @param ck the <CODE>Chunk</CODE> to be copied\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs a chunk of text with a certain content and a certain Font.\r\n            </summary>\r\n            <param name=\"content\">the content</param>\r\n            <param name=\"font\">the font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(System.String)\">\r\n            <summary>\r\n            Constructs a chunk of text with a certain content, without specifying a Font.\r\n            </summary>\r\n            <param name=\"content\">the content</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(System.Char,iTextSharp.text.Font)\">\r\n             Constructs a chunk of text with a char and a certain <CODE>Font</CODE>.\r\n            \r\n             @param    c        the content\r\n             @param    font        the font\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(System.Char)\">\r\n             Constructs a chunk of text with a char, without specifying a <CODE>Font</CODE>.\r\n            \r\n             @param    c        the content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.Image,System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a chunk containing an Image.\r\n            </summary>\r\n            <param name=\"image\">the image</param>\r\n            <param name=\"offsetX\">the image offset in the x direction</param>\r\n            <param name=\"offsetY\">the image offset in the y direction</param>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.SEPARATOR\">\r\n            Key for drawInterface of the Separator.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.pdf.draw.IDrawInterface)\">\r\n            Creates a separator Chunk.\r\n            Note that separator chunks can't be used in combination with tab chunks!\r\n            @param   separator   the drawInterface to use to draw the separator.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.pdf.draw.IDrawInterface,System.Boolean)\">\r\n            Creates a separator Chunk.\r\n            Note that separator chunks can't be used in combination with tab chunks!\r\n            @param   separator   the drawInterface to use to draw the separator.\r\n            @param   vertical    true if this is a vertical separator\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.TAB\">\r\n            Key for drawInterface of the tab.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.TABSETTINGS\">\r\n            Key for tab stops of the tab.\r\n            @since\t5.4.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.pdf.draw.IDrawInterface,System.Single)\">\r\n            Creates a tab Chunk.\r\n            Note that separator chunks can't be used in combination with tab chunks!\r\n            @param   separator   the drawInterface to use to draw the tab.\r\n            @param   tabPosition an X coordinate that will be used as start position for the next Chunk.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.pdf.draw.IDrawInterface,System.Single,System.Boolean)\">\r\n            Creates a tab Chunk.\r\n            Note that separator chunks can't be used in combination with tab chunks!\r\n            @param   separator   the drawInterface to use to draw the tab.\r\n            @param   tabPosition an X coordinate that will be used as start position for the next Chunk.\r\n            @param   newline     if true, a newline will be added if the tabPosition has already been reached.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(System.Single,System.Boolean)\">\r\n             Creates a tab Chunk.\r\n            \r\n             @param   tabInterval     an interval that will be used if tab stops are omitted.\r\n             @param   isWhitespace    if true, the current tab is treated as white space.\r\n             @since 5.4.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.#ctor(iTextSharp.text.Image,System.Single,System.Single,System.Boolean)\">\r\n            <summary>\r\n            Constructs a chunk containing an Image.\r\n            </summary>\r\n            <param name=\"image\">the image</param>\r\n            <param name=\"offsetX\">the image offset in the x direction</param>\r\n            <param name=\"offsetY\">the image offset in the y direction</param>\r\n            <param name=\"changeLeading\">true if the leading has to be adapted to the image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chunk.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chunk.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.Append(System.String)\">\r\n            <summary>\r\n            appends some text to this Chunk.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n            <returns>a StringBuilder</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chunk.Font\">\r\n            <summary>\r\n            Get/set the font of this Chunk.\r\n            </summary>\r\n            <value>a Font</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chunk.Content\">\r\n            <summary>\r\n            Returns the content of this Chunk.\r\n            </summary>\r\n            <value>a string</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.IsEmpty\">\r\n            <summary>\r\n            Checks is this Chunk is empty.\r\n            </summary>\r\n            <returns>false if the Chunk contains other characters than space.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.GetWidthPoint\">\r\n            Gets the width of the Chunk in points.\r\n            @return a width in points\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.HasAttributes\">\r\n            <summary>\r\n            Checks the attributes of this Chunk.\r\n            </summary>\r\n            <returns>false if there aren't any.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.HasAccessibleAttributes\">\r\n             Checks  the accessible attributes of this <CODE>Chunk</CODE>.\r\n            \r\n             @return false if there aren't any.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chunk.Attributes\">\r\n            <summary>\r\n            Sets/Gets the attributes for this Chunk.\r\n            </summary>\r\n            <remarks>\r\n            It may be null.\r\n            </remarks>\r\n            <value>a Hashtable</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetAttribute(System.String,System.Object)\">\r\n            <summary>\r\n            Sets an arbitrary attribute.\r\n            </summary>\r\n            <param name=\"name\">the key for the attribute</param>\r\n            <param name=\"obj\">the value of the attribute</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.HSCALE\">\r\n            Key for text horizontal scaling. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetHorizontalScaling(System.Single)\">\r\n            Sets the text horizontal scaling. A value of 1 is normal and a value of 0.5f\r\n            shrinks the text to half it's width.\r\n            @param scale the horizontal scaling factor\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Chunk.HorizontalScaling\">\r\n            Gets the horizontal scaling.\r\n            @return a percentage in float\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.UNDERLINE\">\r\n            <summary> Key for underline. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetUnderline(System.Single,System.Single)\">\r\n            Sets an horizontal line that can be an underline or a strikethrough.\r\n            Actually, the line can be anywhere vertically and has always the\r\n            <CODE>Chunk</CODE> width. Multiple call to this method will\r\n            produce multiple lines.\r\n            @param thickness the absolute thickness of the line\r\n            @param yPosition the absolute y position relative to the baseline\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetUnderline(iTextSharp.text.BaseColor,System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n            Sets an horizontal line that can be an underline or a strikethrough.\r\n            Actually, the line can be anywhere vertically and has always the\r\n            <CODE>Chunk</CODE> width. Multiple call to this method will\r\n            produce multiple lines.\r\n            @param color the color of the line or <CODE>null</CODE> to follow\r\n            the text color\r\n            @param thickness the absolute thickness of the line\r\n            @param thicknessMul the thickness multiplication factor with the font size\r\n            @param yPosition the absolute y position relative to the baseline\r\n            @param yPositionMul the position multiplication factor with the font size\r\n            @param cap the end line cap. Allowed values are\r\n            PdfContentByte.LINE_CAP_BUTT, PdfContentByte.LINE_CAP_ROUND and\r\n            PdfContentByte.LINE_CAP_PROJECTING_SQUARE\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.SUBSUPSCRIPT\">\r\n            <summary> Key for sub/basescript. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetTextRise(System.Single)\">\r\n            <summary>\r\n            Sets the text displacement relative to the baseline. Positive values rise the text,\r\n            negative values lower the text.\r\n            </summary>\r\n            <remarks>\r\n            It can be used to implement sub/basescript.\r\n            </remarks>\r\n            <param name=\"rise\">the displacement in points</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.SKEW\">\r\n            <summary> Key for text skewing. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetSkew(System.Single,System.Single)\">\r\n            Skews the text to simulate italic and other effects.\r\n            Try <CODE>alpha=0</CODE> and <CODE>beta=12</CODE>.\r\n            @param alpha the first angle in degrees\r\n            @param beta the second angle in degrees\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.BACKGROUND\">\r\n            <summary> Key for background. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetBackground(iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Sets the color of the background Chunk.\r\n            </summary>\r\n            <param name=\"color\">the color of the background</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetBackground(iTextSharp.text.BaseColor,System.Single,System.Single,System.Single,System.Single)\">\r\n            Sets the color and the size of the background <CODE>Chunk</CODE>.\r\n            @param color the color of the background\r\n            @param extraLeft increase the size of the rectangle in the left\r\n            @param extraBottom increase the size of the rectangle in the bottom\r\n            @param extraRight increase the size of the rectangle in the right\r\n            @param extraTop increase the size of the rectangle in the top\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.TEXTRENDERMODE\">\r\n            <summary> Key for text rendering mode.</summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetTextRenderMode(System.Int32,System.Single,iTextSharp.text.BaseColor)\">\r\n            Sets the text rendering mode. It can outline text, simulate bold and make\r\n            text invisible.\r\n            @param mode the text rendering mode. It can be <CODE>PdfContentByte.TEXT_RENDER_MODE_FILL</CODE>,\r\n            <CODE>PdfContentByte.TEXT_RENDER_MODE_STROKE</CODE>, <CODE>PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE</CODE>\r\n            and <CODE>PdfContentByte.TEXT_RENDER_MODE_INVISIBLE</CODE>.\r\n            @param strokeWidth the stroke line width for the modes <CODE>PdfContentByte.TEXT_RENDER_MODE_STROKE</CODE> and\r\n            <CODE>PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE</CODE>.\r\n            @param strokeColor the stroke color or <CODE>null</CODE> to follow the text color\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.SPLITCHARACTER\">\r\n            <summary> Key for split character. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetSplitCharacter(iTextSharp.text.ISplitCharacter)\">\r\n            <summary>\r\n            Sets the split characters.\r\n            </summary>\r\n            <param name=\"splitCharacter\">the SplitCharacter interface</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.HYPHENATION\">\r\n            <summary> Key for hyphenation. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetHyphenation(iTextSharp.text.pdf.IHyphenationEvent)\">\r\n            <summary>\r\n            sets the hyphenation engine to this Chunk.\r\n            </summary>\r\n            <param name=\"hyphenation\">the hyphenation engine</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.REMOTEGOTO\">\r\n            <summary> Key for remote goto. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetRemoteGoto(System.String,System.String)\">\r\n            <summary>\r\n            Sets a goto for a remote destination for this Chunk.\r\n            </summary>\r\n            <param name=\"filename\">the file name of the destination document</param>\r\n            <param name=\"name\">the name of the destination to go to</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetRemoteGoto(System.String,System.Int32)\">\r\n            <summary>\r\n            Sets a goto for a remote destination for this Chunk.\r\n            </summary>\r\n            <param name=\"filename\">the file name of the destination document</param>\r\n            <param name=\"page\">the page of the destination to go to. First page is 1</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.LOCALGOTO\">\r\n            <summary> Key for local goto. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetLocalGoto(System.String)\">\r\n            <summary>\r\n            Sets a local goto for this Chunk.\r\n            </summary>\r\n            <remarks>\r\n            There must be a local destination matching the name.\r\n            </remarks>\r\n            <param name=\"name\">the name of the destination to go to</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.LOCALDESTINATION\">\r\n            <summary> Key for local destination. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetLocalDestination(System.String)\">\r\n            <summary>\r\n            Sets a local destination for this Chunk.\r\n            </summary>\r\n            <param name=\"name\">the name for this destination</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.GENERICTAG\">\r\n            <summary> Key for generic tag. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetGenericTag(System.String)\">\r\n            <summary>\r\n            Sets the generic tag Chunk.\r\n            </summary>\r\n            <remarks>\r\n            The text for this tag can be retrieved with PdfPageEvent.\r\n            </remarks>\r\n            <param name=\"text\">the text for the tag</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.LINEHEIGHT\">\r\n            Key for line-height (alternative for leading in Phrase). \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.setLineHeight(System.Single)\">\r\n             Sets a line height tag.\r\n            \r\n             @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.IMAGE\">\r\n            <summary> Key for image. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.GetImage\">\r\n            <summary>\r\n            Returns the image.\r\n            </summary>\r\n            <value>an Image</value>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.ACTION\">\r\n            <summary> Key for Action. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetAction(iTextSharp.text.pdf.PdfAction)\">\r\n            <summary>\r\n            Sets an action for this Chunk.\r\n            </summary>\r\n            <param name=\"action\">the action</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetAnchor(System.Uri)\">\r\n            <summary>\r\n            Sets an anchor for this Chunk.\r\n            </summary>\r\n            <param name=\"url\">the Uri to link to</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetAnchor(System.String)\">\r\n            <summary>\r\n            Sets an anchor for this Chunk.\r\n            </summary>\r\n            <param name=\"url\">the url to link to</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.NEWPAGE\">\r\n            <summary> Key for newpage. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetNewPage\">\r\n            <summary>\r\n            Sets a new page tag.\r\n            </summary>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.PDFANNOTATION\">\r\n            <summary> Key for annotation. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetAnnotation(iTextSharp.text.pdf.PdfAnnotation)\">\r\n            <summary>\r\n            Sets a generic annotation to this Chunk.\r\n            </summary>\r\n            <param name=\"annotation\">the annotation</param>\r\n            <returns>this Chunk</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.GetHyphenation\">\r\n            Returns the hyphenation (if present).\r\n            @param    hyphenation a HyphenationEvent instance\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.COLOR\">\r\n            <summary> Key for color. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.ENCODING\">\r\n            <summary> Key for encoding. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.CHAR_SPACING\">\r\n            Key for character spacing.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetCharacterSpacing(System.Single)\">\r\n            Sets the character spacing.\r\n            \r\n            @param charSpace the character spacing value\r\n            @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.GetCharacterSpacing\">\r\n            Gets the character spacing.\r\n            \r\n            @return a value in float\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Chunk.WORD_SPACING\">\r\n            Key for word spacing.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetWordSpacing(System.Single)\">\r\n             Sets the word spacing.\r\n            \r\n             @param wordSpace the word spacing value\r\n             @return this <CODE>Chunk</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.GetWordSpacing\">\r\n             Gets the word spacing.\r\n            \r\n             @return a value in float\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Chunk.SetTextExpansion(System.String)\">\r\n            Sets the textual expansion of the abbreviation or acronym.\r\n            It is highly recommend to set textuual expansion when generating PDF/UA documents.\r\n            @param value\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Document\">\r\n            <summary>\r\n            A generic Document class.\r\n            </summary>\r\n            <remarks>\r\n            All kinds of Text-elements can be added to a HTMLDocument.\r\n            The Document signals all the listeners when an element\r\n            has been added.<p/>\r\n            <OL>\r\n                <LI/>Once a document is created you can add some meta information.\r\n                <LI/>You can also set the headers/footers.\r\n                <LI/>You have to open the document before you can write content.\r\n                <LI/>You can only write content (no more meta-formation!) once a document is opened.\r\n                <LI/>When you change the header/footer on a certain page, this will be effective starting on the next page.\r\n                <LI/>Ater closing the document, every listener (as well as its OutputStream) is closed too.\r\n            </OL>\r\n            </remarks>\r\n            <example>\r\n            <code>\r\n            // creation of the document with a certain size and certain margins\r\n            <strong>Document document = new Document(PageSize.A4, 50, 50, 50, 50);</strong>\r\n            try {\r\n                // creation of the different writers\r\n                HtmlWriter.GetInstance(<strong>document</strong>, System.out);\r\n                PdfWriter.GetInstance(<strong>document</strong>, new FileOutputStream(\"text.pdf\"));\r\n                // we add some meta information to the document\r\n                <strong>document.AddAuthor(\"Bruno Lowagie\");\r\n                document.AddSubject(\"This is the result of a Test.\");</strong>\r\n                \r\n                // we define a header and a footer\r\n                HeaderFooter header = new HeaderFooter(new Phrase(\"This is a header.\"), false);\r\n                HeaderFooter footer = new HeaderFooter(new Phrase(\"This is page \"), new Phrase(\".\"));\r\n                footer.SetAlignment(Element.ALIGN_CENTER);\r\n                <strong>document.SetHeader(header);\r\n                document.SetFooter(footer);</strong>\r\n                // we open the document for writing\r\n                <strong>document.Open();\r\n                document.Add(new Paragraph(\"Hello world\"));</strong>\r\n            }\r\n            catch (DocumentException de) {\r\n                Console.Error.WriteLine(de.Message);\r\n            }\r\n            <strong>document.Close();</strong>\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.Compress\">\r\n            <summary> Allows the pdf documents to be produced without compression for debugging purposes. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.WmfFontCorrection\">\r\n            <summary> Scales the WMF font size. The default value is 0.86.  </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.listeners\">\r\n            <summary> The IDocListener. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.open\">\r\n            <summary> Is the document open or not? </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.close\">\r\n            <summary> Has the document already been closed? </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.pageSize\">\r\n            <summary> The size of the page. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.marginLeft\">\r\n            <summary> margin in x direction starting from the left </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.marginRight\">\r\n            <summary> margin in x direction starting from the right </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.marginTop\">\r\n            <summary> margin in y direction starting from the top </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.marginBottom\">\r\n            <summary> margin in y direction starting from the bottom </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.marginMirroringTopBottom\">\r\n            mirroring of the top/bottom margins\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.javaScript_onLoad\">\r\n            <summary> Content of JavaScript onLoad function </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.javaScript_onUnLoad\">\r\n            <summary> Content of JavaScript onUnLoad function  </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.htmlStyleClass\">\r\n            <summary> Style class in HTML body tag </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.pageN\">\r\n            <summary> Current pagenumber </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Document.chapternumber\">\r\n            This is a chapter number in case ChapterAutoNumber is used. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.#ctor\">\r\n            <summary>\r\n            Constructs a new Document-object.\r\n            </summary>\r\n            <overloads>\r\n            Has three overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.#ctor(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Constructs a new Document-object.\r\n            </summary>\r\n            <param name=\"pageSize\">the pageSize</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.#ctor(iTextSharp.text.Rectangle,System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a new Document-object.\r\n            </summary>\r\n            <param name=\"pageSize\">the pageSize</param>\r\n            <param name=\"marginLeft\">the margin on the left</param>\r\n            <param name=\"marginRight\">the margin on the right</param>\r\n            <param name=\"marginTop\">the margin on the top</param>\r\n            <param name=\"marginBottom\">the margin on the bottom</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddDocListener(iTextSharp.text.IDocListener)\">\r\n            <summary>\r\n            Adds a IDocListener to the Document.\r\n            </summary>\r\n            <param name=\"listener\">the new IDocListener</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.RemoveIDocListener(iTextSharp.text.IDocListener)\">\r\n            <summary>\r\n            Removes a IDocListener from the Document.\r\n            </summary>\r\n            <param name=\"listener\">the IDocListener that has to be removed.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds an Element to the Document.\r\n            </summary>\r\n            <param name=\"element\">the Element to add</param>\r\n            <returns>true if the element was added, false if not</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.Open\">\r\n            <summary>\r\n            Opens the document.\r\n            </summary>\r\n            <remarks>\r\n            Once the document is opened, you can't write any Header- or Meta-information\r\n            anymore. You have to open the document before you can begin to add content\r\n            to the body of the document.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.OpenDocument\">\r\n            <summary>\r\n            Opens the document.\r\n            </summary>\r\n            <remarks>\r\n            Version for languages that are not case-dependant.\r\n            Once the document is opened, you can't write any Header- or Meta-information\r\n            anymore. You have to open the document before you can begin to add content\r\n            to the body of the document.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.SetPageSize(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Sets the pagesize.\r\n            </summary>\r\n            <param name=\"pageSize\">the new pagesize</param>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.SetMargins(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Sets the margins.\r\n            </summary>\r\n            <param name=\"marginLeft\">the margin on the left</param>\r\n            <param name=\"marginRight\">the margin on the right</param>\r\n            <param name=\"marginTop\">the margin on the top</param>\r\n            <param name=\"marginBottom\">the margin on the bottom</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.NewPage\">\r\n            <summary>\r\n            Signals that an new page has to be started.\r\n            </summary>\r\n            <returns>true if the page was added, false if not.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.ResetPageCount\">\r\n            <summary>\r\n            Sets the page number to 0.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.PageCount\">\r\n            <summary>\r\n            Sets the page number.\r\n            </summary>\r\n            <value>an int</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.PageNumber\">\r\n            <summary>\r\n            Returns the current page number.\r\n            </summary>\r\n            <value>an int</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.Close\">\r\n            <summary>\r\n            Closes the document.\r\n            </summary>\r\n            <remarks>\r\n            Once all the content has been written in the body, you have to close\r\n            the body. After that nothing can be written to the body anymore.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.CloseDocument\">\r\n            <summary>\r\n            Closes the document.\r\n            </summary>\r\n            <remarks>\r\n            Version for languages that are not case-dependant.\r\n            Once all the content has been written in the body, you have to close\r\n            the body. After that nothing can be written to the body anymore.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddHeader(System.String,System.String)\">\r\n            <summary>\r\n            Adds a user defined header to the document.\r\n            </summary>\r\n            <param name=\"name\">the name of the header</param>\r\n            <param name=\"content\">the content of the header</param>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddTitle(System.String)\">\r\n            <summary>\r\n            Adds the title to a Document.\r\n            </summary>\r\n            <param name=\"title\">the title</param>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddSubject(System.String)\">\r\n            <summary>\r\n            Adds the subject to a Document.\r\n            </summary>\r\n            <param name=\"subject\">the subject</param>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddKeywords(System.String)\">\r\n            <summary>\r\n            Adds the keywords to a Document.\r\n            </summary>\r\n            <param name=\"keywords\">keywords to add</param>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddAuthor(System.String)\">\r\n            <summary>\r\n            Adds the author to a Document.\r\n            </summary>\r\n            <param name=\"author\">the name of the author</param>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddCreator(System.String)\">\r\n            <summary>\r\n            Adds the creator to a Document.\r\n            </summary>\r\n            <param name=\"creator\">the name of the creator</param>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddProducer\">\r\n            <summary>\r\n            Adds the producer to a Document.\r\n            </summary>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddLanguage(System.String)\">\r\n            Adds a language to th document. Required for PDF/UA compatible documents.\r\n            @param language\r\n            @return <code>true</code> if successfull, <code>false</code> otherwise\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.AddCreationDate\">\r\n            <summary>\r\n            Adds the current date and time to a Document.\r\n            </summary>\r\n            <returns>true if successful, false otherwise</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.LeftMargin\">\r\n            <summary>\r\n            Returns the left margin.\r\n            </summary>\r\n            <value>the left margin</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.RightMargin\">\r\n            <summary>\r\n            Return the right margin.\r\n            </summary>\r\n            <value>the right margin</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.TopMargin\">\r\n            <summary>\r\n            Returns the top margin.\r\n            </summary>\r\n            <value>the top margin</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.BottomMargin\">\r\n            <summary>\r\n            Returns the bottom margin.\r\n            </summary>\r\n            <value>the bottom margin</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.Left\">\r\n            <summary>\r\n            Returns the lower left x-coordinate.\r\n            </summary>\r\n            <value>the lower left x-coordinate</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.Right\">\r\n            <summary>\r\n            Returns the upper right x-coordinate.\r\n            </summary>\r\n            <value>the upper right x-coordinate.</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.Top\">\r\n            <summary>\r\n            Returns the upper right y-coordinate.\r\n            </summary>\r\n            <value>the upper right y-coordinate.</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.Bottom\">\r\n            <summary>\r\n            Returns the lower left y-coordinate.\r\n            </summary>\r\n            <value>the lower left y-coordinate.</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.GetLeft(System.Single)\">\r\n            <summary>\r\n            Returns the lower left x-coordinate considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the lower left x-coordinate</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.GetRight(System.Single)\">\r\n            <summary>\r\n            Returns the upper right x-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the upper right x-coordinate</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.GetTop(System.Single)\">\r\n            <summary>\r\n            Returns the upper right y-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the upper right y-coordinate</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.GetBottom(System.Single)\">\r\n            <summary>\r\n            Returns the lower left y-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the lower left y-coordinate</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.PageSize\">\r\n            <summary>\r\n            Gets the pagesize.\r\n            </summary>\r\n            <value>the page size</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Document.IsOpen\">\r\n            <summary>\r\n            Checks if the document is open.\r\n            </summary>\r\n            <returns>true if the document is open</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.JavaScript_onLoad\">\r\n            <summary>\r\n            Gets the JavaScript onLoad command.\r\n            </summary>\r\n            <value>the JavaScript onLoad command.</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.JavaScript_onUnLoad\">\r\n            <summary>\r\n            Gets the JavaScript onUnLoad command.\r\n            </summary>\r\n            <value>the JavaScript onUnLoad command</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Document.HtmlStyleClass\">\r\n            <summary>\r\n            Gets the style class of the HTML body tag\r\n            </summary>\r\n            <value>the style class of the HTML body tag</value>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.Document.SetMarginMirroring(System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.text.Document.SetMarginMirroringTopBottom(System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.Document.IsMarginMirroring\">\r\n            Gets the margin mirroring flag.\r\n            \r\n            @return the margin mirroring flag\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.DocumentException\">\r\n            <summary>\r\n            Signals that an error has occurred in a Document.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.BadElementException\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Document\"/>\r\n            <seealso cref=\"T:iTextSharp.text.DocWriter\"/>\r\n            <seealso cref=\"T:iTextSharp.text.IDocListener\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocumentException.#ctor\">\r\n            <summary>\r\n            Constructs a new DocumentException\r\n            </summary>\r\n            <overloads>\r\n            Has two overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocumentException.#ctor(System.String)\">\r\n            <summary>\r\n            Construct a new DocumentException\r\n            </summary>\r\n            <param name=\"message\">error message</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocumentException.#ctor(System.String,System.Exception)\">\r\n            <summary>\r\n            Constructs a DocumentException with a message and a Exception.\r\n            </summary>\r\n            <param name=\"message\">a message describing the exception</param>\r\n            <param name=\"ex\">an exception that has to be turned into a DocumentException</param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.DocWriter\">\r\n            <summary>\r\n            An abstract Writer class for documents.\r\n            </summary>\r\n            <remarks>\r\n            DocWriter is the abstract class of several writers such\r\n            as PdfWriter and HtmlWriter.\r\n            A DocWriter can be added as a DocListener\r\n            to a certain Document by getting an instance (see method\r\n            GetInstance() in the specific writer-classes).\r\n            Every Element added to the original Document\r\n            will be written to the stream of the listening\r\n            DocWriter.\r\n            </remarks>\r\n            <seealso cref=\"T:iTextSharp.text.Document\"/>\r\n            <seealso cref=\"T:iTextSharp.text.IDocListener\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.NEWLINE\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.TAB\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.LT\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.SPACE\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.EQUALS\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.QUOTE\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.GT\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.FORWARD\">\r\n            <summary> This is some byte that is often used. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.pageSize\">\r\n            <summary> The pageSize. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.document\">\r\n            <summary> This is the document that has to be written. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.os\">\r\n            <summary> The stream of this writer. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.open\">\r\n            <summary> Is the writer open for writing? </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.pause\">\r\n            <summary> Do we have to pause all writing actions? </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.DocWriter.closeStream\">\r\n            Closes the stream on document close \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.#ctor(iTextSharp.text.Document,System.IO.Stream)\">\r\n            <summary>\r\n            Constructs a DocWriter.\r\n            </summary>\r\n            <param name=\"document\">The Document that has to be written</param>\r\n            <param name=\"os\">The Stream the writer has to write to.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Signals that an Element was added to the Document.\r\n            </summary>\r\n            <remarks>\r\n            This method should be overriden in the specific DocWriter classes\r\n            derived from this abstract class.\r\n            </remarks>\r\n            <param name=\"element\"></param>\r\n            <returns>false</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Open\">\r\n            <summary>\r\n            Signals that the Document was opened.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.SetPageSize(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Sets the pagesize.\r\n            </summary>\r\n            <param name=\"pageSize\">the new pagesize</param>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.SetMargins(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Sets the margins.\r\n            </summary>\r\n            <remarks>\r\n            This does nothing. Has to be overridden if needed.\r\n            </remarks>\r\n            <param name=\"marginLeft\">the margin on the left</param>\r\n            <param name=\"marginRight\">the margin on the right</param>\r\n            <param name=\"marginTop\">the margin on the top</param>\r\n            <param name=\"marginBottom\">the margin on the bottom</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.NewPage\">\r\n            <summary>\r\n            Signals that an new page has to be started.\r\n            </summary>\r\n            <remarks>\r\n            This does nothing. Has to be overridden if needed.\r\n            </remarks>\r\n            <returns>true if the page was added, false if not.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.ResetPageCount\">\r\n            <summary>\r\n            Sets the page number to 0.\r\n            </summary>\r\n            <remarks>\r\n            This method should be overriden in the specific DocWriter classes\r\n            derived from this abstract class if they actually support the use of\r\n            pagenumbers.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.DocWriter.PageCount\">\r\n            <summary>\r\n            Sets the page number.\r\n            </summary>\r\n            <remarks>\r\n            This method should be overriden in the specific DocWriter classes\r\n            derived from this abstract class if they actually support the use of\r\n            pagenumbers.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Close\">\r\n            <summary>\r\n            Signals that the Document was closed and that no other\r\n            Elements will be added.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.GetISOBytes(System.String)\">\r\n            <summary>\r\n            Converts a string into a Byte array\r\n            according to the ISO-8859-1 codepage.\r\n            </summary>\r\n            <param name=\"text\">the text to be converted</param>\r\n            <returns>the conversion result</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Pause\">\r\n            <summary>\r\n            Let the writer know that all writing has to be paused.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.IsPaused\">\r\n             Checks if writing is paused.\r\n            \r\n             @return       <CODE>true</CODE> if writing temporarely has to be paused, <CODE>false</CODE> otherwise.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Resume\">\r\n            <summary>\r\n            Let the writer know that writing may be resumed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Flush\">\r\n            <summary>\r\n            Flushes the Stream.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Write(System.String)\">\r\n            <summary>\r\n            Writes a string to the stream.\r\n            </summary>\r\n            <param name=\"str\">the string to write</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.AddTabs(System.Int32)\">\r\n            <summary>\r\n            Writes a number of tabs.\r\n            </summary>\r\n            <param name=\"indent\">the number of tabs to add</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.Write(System.String,System.String)\">\r\n            <summary>\r\n            Writes a key-value pair to the stream.\r\n            </summary>\r\n            <param name=\"key\">the name of an attribute</param>\r\n            <param name=\"value\">the value of an attribute</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.WriteStart(System.String)\">\r\n            <summary>\r\n            Writes a starttag to the stream.\r\n            </summary>\r\n            <param name=\"tag\">the name of the tag</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.WriteEnd(System.String)\">\r\n            <summary>\r\n            Writes an endtag to the stream.\r\n            </summary>\r\n            <param name=\"tag\">the name of the tag</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.WriteEnd\">\r\n            <summary>\r\n            Writes an endtag to the stream.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.WriteMarkupAttributes(System.util.Properties)\">\r\n            <summary>\r\n            Writes the markup attributes of the specified MarkupAttributes\r\n            object to the stream.\r\n            </summary>\r\n            <param name=\"mAtt\">the MarkupAttributes to write.</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.DocWriter.SetMarginMirroringTopBottom(System.Boolean)\">\r\n            @see com.lowagie.text.DocListener#setMarginMirroring(boolean)\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Element\">\r\n            <summary>\r\n            Interface for a text element.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Anchor\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Cell\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Chapter\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Chunk\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Gif\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Graphic\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Header\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Image\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Jpeg\"/>\r\n            <seealso cref=\"T:iTextSharp.text.List\"/>\r\n            <seealso cref=\"T:iTextSharp.text.ListItem\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Meta\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Paragraph\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Phrase\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Rectangle\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Row\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Section\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Table\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.HEADER\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.TITLE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.SUBJECT\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.KEYWORDS\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.AUTHOR\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.PRODUCER\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CREATIONDATE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CREATOR\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.LANGUAGE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CHUNK\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.PHRASE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.PARAGRAPH\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.SECTION\">\r\n            <summary> This is a possible type of Element </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.LIST\">\r\n            <summary> This is a possible type of Element </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.LISTITEM\">\r\n            <summary> This is a possible type of Element </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CHAPTER\">\r\n            <summary> This is a possible type of Element </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ANCHOR\">\r\n            <summary> This is a possible type of Element </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.PTABLE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ANNOTATION\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.RECTANGLE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.JPEG\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.JPEG2000\">\r\n            This is a possible type of <CODE>Element</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.IMGRAW\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.IMGTEMPLATE\">\r\n            <summary> This is a possible type of Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.JBIG2\">\r\n            This is a possible type of <CODE>Element</CODE>.\r\n            @since\t2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.DIV\">\r\n            This is a possible type of <CODE>Element</CODE>.\r\n            @since\t5.3.0\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.MARKED\">\r\n            This is a possible type of <CODE>Element</CODE>. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.YMARK\">\r\n            This is a possible type of <CODE>Element</CODE>.\r\n            @since 2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.WRITABLE_DIRECT\">\r\n            This is an element thats not an element.\r\n            @see WritableDirectElement\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_UNDEFINED\">\r\n            <summary>\r\n            A possible value for paragraph Element.  This\r\n            specifies that the text is aligned to the left\r\n            indent and extra whitespace should be placed on\r\n            the right.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_LEFT\">\r\n            <summary>\r\n            A possible value for paragraph Element.  This\r\n            specifies that the text is aligned to the left\r\n            indent and extra whitespace should be placed on\r\n            the right.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_CENTER\">\r\n            <summary>\r\n            A possible value for paragraph Element.  This\r\n            specifies that the text is aligned to the center\r\n            and extra whitespace should be placed equally on\r\n            the left and right.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_RIGHT\">\r\n            <summary>\r\n            A possible value for paragraph Element.  This\r\n            specifies that the text is aligned to the right\r\n            indent and extra whitespace should be placed on\r\n            the left.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_JUSTIFIED\">\r\n            <summary>\r\n            A possible value for paragraph Element.  This\r\n            specifies that extra whitespace should be spread\r\n            out through the rows of the paragraph with the\r\n            text lined up with the left and right indent\r\n            except on the last line which should be aligned\r\n            to the left.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_TOP\">\r\n            <summary>\r\n            A possible value for vertical Element.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_MIDDLE\">\r\n            <summary>\r\n            A possible value for vertical Element.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_BOTTOM\">\r\n            <summary>\r\n            A possible value for vertical Element.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_BASELINE\">\r\n            <summary>\r\n            A possible value for vertical Element.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.ALIGN_JUSTIFIED_ALL\">\r\n            <summary>\r\n            Does the same as ALIGN_JUSTIFIED but the last line is also spread out.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITTG4\">\r\n            <summary>\r\n            Pure two-dimensional encoding (Group 4)\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITTG3_1D\">\r\n            <summary>\r\n            Pure one-dimensional encoding (Group 3, 1-D)\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITTG3_2D\">\r\n            <summary>\r\n            Mixed one- and two-dimensional encoding (Group 3, 2-D)\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITT_BLACKIS1\">\r\n            <summary>\r\n            A flag indicating whether 1-bits are to be interpreted as black pixels\r\n            and 0-bits as white pixels,\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITT_ENCODEDBYTEALIGN\">\r\n            <summary>\r\n            A flag indicating whether the filter expects extra 0-bits before each\r\n            encoded line so that the line begins on a byte boundary.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITT_ENDOFLINE\">\r\n            <summary>\r\n            A flag indicating whether end-of-line bit patterns are required to be\r\n             present in the encoding.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Element.CCITT_ENDOFBLOCK\">\r\n            <summary>\r\n            A flag indicating whether the filter expects the encoded data to be\r\n            terminated by an end-of-block pattern, overriding the Rows\r\n            parameter. The use of this flag will set the key /EndOfBlock to false.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.error_messages.MessageLocalization\">\r\n            Localizes error messages. The messages are located in the package\r\n            com.lowagie.text.error_messages in the form language_country.lng.\r\n            The internal file encoding is UTF-8 without any escape chars, it's not a\r\n            normal property file. See en.lng for more information on the internal format.\r\n            @author Paulo Soares (psoares@glintt.com)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.error_messages.MessageLocalization.GetMessage(System.String)\">\r\n            Get a message without parameters.\r\n            @param key the key to the message\r\n            @return the message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.error_messages.MessageLocalization.GetComposedMessage(System.String,System.Object[])\">\r\n            Get a message with parameters. The parameters will replace the strings\r\n            \"{1}\", \"{2}\", ..., \"{n}\" found in the message.\r\n            @param key the key to the message\r\n            @param p the variable parameter\r\n            @return the message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.error_messages.MessageLocalization.SetLanguage(System.String,System.String)\">\r\n            Sets the language to be used globally for the error messages. The language\r\n            is a two letter lowercase country designation like \"en\" or \"pt\". The country\r\n            is an optional two letter uppercase code like \"US\" or \"PT\".\r\n            @param language the language\r\n            @param country the country\r\n            @return true if the language was found, false otherwise\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.error_messages.MessageLocalization.SetMessages(System.IO.TextReader)\">\r\n            Sets the error messages directly from a Reader.\r\n            @param r the Reader\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.exceptions.BadPasswordException\">\r\n            Typed exception used when opening an existing PDF document.\r\n            Gets thrown when the document isn't a valid PDF document.\r\n            @since 2.1.5 It was written for iText 2.0.8, but moved to another package\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.exceptions.BadPasswordException.#ctor(System.String)\">\r\n            Creates an exception saying the user password was incorrect.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.exceptions.IllegalPdfSyntaxException\">\r\n            Typed exception used when creating PDF syntax that isn't valid.\r\n            @since 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.exceptions.IllegalPdfSyntaxException.#ctor(System.String)\">\r\n            Creates an exception saying the PDF syntax isn't correct.\r\n            @param\tmessage\tsome extra info about the exception\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.exceptions.InvalidImageException\">\r\n            RuntimeException to indicate that the provided Image is invalid/corrupted.\r\n            Should only be thrown/not caught when ignoring invalid images.\r\n            @since 5.4.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.exceptions.InvalidPdfException\">\r\n            Typed exception used when opening an existing PDF document.\r\n            Gets thrown when the document isn't a valid PDF document.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.exceptions.InvalidPdfException.#ctor(System.String)\">\r\n            Creates an instance of  with a message and no cause\r\n            @param\tmessage\tthe reason why the document isn't a PDF document according to iText.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.exceptions.InvalidPdfException.#ctor(System.String,System.Exception)\">\r\n            Creates an exception with a message and a cause\r\n            @param message\tthe reason why the document isn't a PDF document according to iText. \r\n            @param cause the cause of the exception, if any\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.exceptions.UnsupportedPdfException\">\r\n            Typed exception used when opening an existing PDF document.\r\n            Gets thrown when the document isn't a valid PDF document according to iText,\r\n            but it's different from the InvalidPdfException in the sense that it may\r\n            be an iText limitation (most of the times it isn't but you might have\r\n            bumped into something that has been added to the PDF specs, but that isn't\r\n            supported in iText yet).\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.exceptions.UnsupportedPdfException.#ctor(System.String)\">\r\n            Creates an instance of an UnsupportedPdfException.\r\n            @param\tmessage\tthe reason why the document isn't a PDF document according to iText.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.factories.GreekAlphabetFactory\">\r\n            This class can produce String combinations representing a number built with\r\n            Greek letters (from alpha to omega, then alpha alpha, alpha beta, alpha gamma).\r\n            We are aware of the fact that the original Greek numbering is different;\r\n            See http://www.cogsci.indiana.edu/farg/harry/lan/grknum.htm#ancient\r\n            but this isn't implemented yet; the main reason being the fact that we\r\n            need a font that has the obsolete Greek characters qoppa and sampi.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.GreekAlphabetFactory.GetString(System.Int32)\">\r\n            Changes an int into a lower case Greek letter combination.\r\n            @param index the original number\r\n            @return the letter combination\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.GreekAlphabetFactory.GetLowerCaseString(System.Int32)\">\r\n            Changes an int into a lower case Greek letter combination.\r\n            @param index the original number\r\n            @return the letter combination\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.GreekAlphabetFactory.GetUpperCaseString(System.Int32)\">\r\n            Changes an int into a upper case Greek letter combination.\r\n            @param index the original number\r\n            @return the letter combination\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.GreekAlphabetFactory.GetString(System.Int32,System.Boolean)\">\r\n            Changes an int into a Greek letter combination.\r\n            @param index the original number\r\n            @return the letter combination\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.factories.RomanAlphabetFactory\">\r\n            This class can produce String combinations representing a number.\r\n            \"a\" to \"z\" represent 1 to 26, \"AA\" represents 27, \"AB\" represents 28,\r\n            and so on; \"ZZ\" is followed by \"AAA\".\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanAlphabetFactory.GetString(System.Int32)\">\r\n            Translates a positive integer (not equal to zero)\r\n            into a String using the letters 'a' to 'z';\r\n            1 = a, 2 = b, ..., 26 = z, 27 = aa, 28 = ab,...\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanAlphabetFactory.GetLowerCaseString(System.Int32)\">\r\n            Translates a positive integer (not equal to zero)\r\n            into a String using the letters 'a' to 'z';\r\n            1 = a, 2 = b, ..., 26 = z, 27 = aa, 28 = ab,...\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanAlphabetFactory.GetUpperCaseString(System.Int32)\">\r\n            Translates a positive integer (not equal to zero)\r\n            into a String using the letters 'A' to 'Z';\r\n            1 = A, 2 = B, ..., 26 = Z, 27 = AA, 28 = AB,...\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanAlphabetFactory.GetString(System.Int32,System.Boolean)\">\r\n            Translates a positive integer (not equal to zero)\r\n            into a String using the letters 'a' to 'z'\r\n            (a = 1, b = 2, ..., z = 26, aa = 27, ab = 28,...).\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.factories.RomanNumberFactory\">\r\n            This class can produce String combinations representing a roman number.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.factories.RomanNumberFactory.RomanDigit\">\r\n            Helper class for Roman Digits\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.factories.RomanNumberFactory.RomanDigit.digit\">\r\n            part of a roman number \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.factories.RomanNumberFactory.RomanDigit.value\">\r\n            value of the roman digit \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.factories.RomanNumberFactory.RomanDigit.pre\">\r\n            can the digit be used as a prefix \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanNumberFactory.RomanDigit.#ctor(System.Char,System.Int32,System.Boolean)\">\r\n            Constructs a roman digit\r\n            @param digit the roman digit\r\n            @param value the value\r\n            @param pre can it be used as a prefix\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.factories.RomanNumberFactory.roman\">\r\n            Array with Roman digits.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanNumberFactory.GetString(System.Int32)\">\r\n            Changes an int into a lower case roman number.\r\n            @param index the original number\r\n            @return the roman number (lower case)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanNumberFactory.GetLowerCaseString(System.Int32)\">\r\n            Changes an int into a lower case roman number.\r\n            @param index the original number\r\n            @return the roman number (lower case)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanNumberFactory.GetUpperCaseString(System.Int32)\">\r\n            Changes an int into an upper case roman number.\r\n            @param index the original number\r\n            @return the roman number (lower case)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.factories.RomanNumberFactory.GetString(System.Int32,System.Boolean)\">\r\n            Changes an int into a roman number.\r\n            @param index the original number\r\n            @return the roman number (lower case)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Font\">\r\n            <summary>\r\n            Contains all the specifications of a font: fontfamily, size, style and color.\r\n            </summary>\r\n            <example>\r\n            <code>\r\n            Paragraph p = new Paragraph(\"This is a paragraph\",\r\n                          <strong>new Font(Font.HELVETICA, 18, Font.BOLDITALIC, new BaseColor(0, 0, 255))</strong>);\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.NORMAL\">\r\n            <summary> this is a possible style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.BOLD\">\r\n            <summary> this is a possible style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.ITALIC\">\r\n            <summary> this is a possible style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.UNDERLINE\">\r\n            <summary> this is a possible style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.STRIKETHRU\">\r\n            <summary> this is a possible style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.BOLDITALIC\">\r\n            <summary> this is a possible style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.UNDEFINED\">\r\n            <summary> the value of an undefined attribute. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.DEFAULTSIZE\">\r\n            <summary> the value of the default size. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.family\">\r\n            <summary> the value of the fontfamily. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.size\">\r\n            <summary> the value of the fontsize. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.style\">\r\n            <summary> the value of the style. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.color\">\r\n            <summary> the value of the color. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Font.baseFont\">\r\n            <summary> the external font </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.Font)\">\r\n            Copy constructor of a Font\r\n            @param other the font that has to be copied\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.Font.FontFamily,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"family\">the family to which this font belongs</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.pdf.BaseFont,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"bf\">the external font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.pdf.BaseFont,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"bf\">the external font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.pdf.BaseFont,System.Single)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"bf\">the external font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.pdf.BaseFont)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"bf\">the external font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.Font.FontFamily,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"family\">the family to which this font belongs</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.Font.FontFamily,System.Single)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"family\">the family to which this font belongs</param>\r\n            <param name=\"size\">the size of this font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor(iTextSharp.text.Font.FontFamily)\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <param name=\"family\">the family to which this font belongs</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.#ctor\">\r\n            <summary>\r\n            Constructs a Font.\r\n            </summary>\r\n            <overloads>\r\n            Has nine overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.CompareTo(iTextSharp.text.Font)\">\r\n            <summary>\r\n            Compares this Font with another\r\n            </summary>\r\n            <param name=\"obj\">the other Font</param>\r\n            <returns>a value</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.Family\">\r\n            <summary>\r\n            Gets the family of this font.\r\n            </summary>\r\n            <value>the value of the family</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.Familyname\">\r\n            <summary>\r\n            Gets the familyname as a string.\r\n            </summary>\r\n            <value>the familyname</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.SetFamily(System.String)\">\r\n            <summary>\r\n            Sets the family using a String (\"Courier\",\r\n            \"Helvetica\", \"Times New Roman\", \"Symbol\" or \"ZapfDingbats\").\r\n            </summary>\r\n            <param name=\"family\">A String representing a certain font-family.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.GetFamilyIndex(System.String)\">\r\n            <summary>\r\n            Translates a string-value of a certain family\r\n            into the index that is used for this family in this class.\r\n            </summary>\r\n            <param name=\"family\">A string representing a certain font-family</param>\r\n            <returns>the corresponding index</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.Size\">\r\n            <summary>\r\n            Get/set the size of this font.\r\n            </summary>\r\n            <value>the size of this font</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.CalculatedSize\">\r\n            Gets the size that can be used with the calculated <CODE>BaseFont</CODE>.\r\n            @return the size that can be used with the calculated <CODE>BaseFont</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.GetCalculatedLeading(System.Single)\">\r\n            Gets the leading that can be used with this font.\r\n            \r\n            @param multipliedLeading\r\n                       a certain multipliedLeading\r\n            @return the height of a line\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.Style\">\r\n            <summary>\r\n            Gets the style of this font.\r\n            </summary>\r\n            <value>the style of this font</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.CalculatedStyle\">\r\n            Gets the style that can be used with the calculated <CODE>BaseFont</CODE>.\r\n            @return the style that can be used with the calculated <CODE>BaseFont</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.IsBold\">\r\n            <summary>\r\n            checks if this font is Bold.\r\n            </summary>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.IsItalic\">\r\n            <summary>\r\n            checks if this font is Bold.\r\n            </summary>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.IsUnderlined\">\r\n            <summary>\r\n            checks if this font is underlined.\r\n            </summary>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.IsStrikethru\">\r\n            <summary>\r\n            checks if the style of this font is STRIKETHRU.\r\n            </summary>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.SetStyle(System.String)\">\r\n            <summary>\r\n            Sets the style using a String containing one of\r\n            more of the following values: normal, bold, italic, underline, strike.\r\n            </summary>\r\n            <param name=\"style\">A String representing a certain style.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.SetStyle(System.Int32)\">\r\n            Sets the style.\r\n            @param    style    the style.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.GetStyleValue(System.String)\">\r\n            <summary>\r\n            Translates a string-value of a certain style\r\n            into the index value is used for this style in this class.\r\n            </summary>\r\n            <param name=\"style\">a string</param>\r\n            <returns>the corresponding value</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.Color\">\r\n            <summary>\r\n            Get/set the color of this font.\r\n            </summary>\r\n            <value>the color of this font</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.SetColor(System.Int32,System.Int32,System.Int32)\">\r\n            <summary>\r\n            Sets the color.\r\n            </summary>\r\n            <param name=\"red\">the red-value of the new color</param>\r\n            <param name=\"green\">the green-value of the new color</param>\r\n            <param name=\"blue\">the blue-value of the new color</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Font.BaseFont\">\r\n            <summary>\r\n            Gets the BaseFont inside this object.\r\n            </summary>\r\n            <value>the BaseFont</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.GetCalculatedBaseFont(System.Boolean)\">\r\n            Gets the <CODE>BaseFont</CODE> this class represents.\r\n            For the built-in fonts a <CODE>BaseFont</CODE> is calculated.\r\n            @param specialEncoding <CODE>true</CODE> to use the special encoding for Symbol and ZapfDingbats,\r\n            <CODE>false</CODE> to always use <CODE>Cp1252</CODE>\r\n            @return the <CODE>BaseFont</CODE> this class represents\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Font.IsStandardFont\">\r\n            <summary>\r\n            Checks if the properties of this font are undefined or null.\r\n            <p/>\r\n            If so, the standard should be used.\r\n            </summary>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.Font.Difference(iTextSharp.text.Font)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.FontFactory\">\r\n            <summary>\r\n            If you are using True Type fonts, you can declare the paths of the different ttf- and ttc-files\r\n            to this static class first and then create fonts in your code using one of the static getFont-method\r\n            without having to enter a path as parameter.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.COURIER\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.COURIER_BOLD\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.COURIER_OBLIQUE\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.COURIER_BOLDOBLIQUE\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.HELVETICA\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.HELVETICA_BOLD\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.HELVETICA_OBLIQUE\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.HELVETICA_BOLDOBLIQUE\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.SYMBOL\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.TIMES\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.TIMES_ROMAN\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.TIMES_BOLD\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.TIMES_ITALIC\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.TIMES_BOLDITALIC\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.ZAPFDINGBATS\">\r\n            <summary> This is a possible value of a base 14 type 1 font </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.defaultEncoding\">\r\n            <summary> This is the default encoding to use. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactory.defaultEmbedding\">\r\n            <summary> This is the default value of the <VAR>embedded</VAR> variable. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.#ctor\">\r\n            <summary> Creates new FontFactory </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32,iTextSharp.text.BaseColor,System.Boolean)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <param name=\"cached\">true if the font comes from the cache or is added to the cache if new, false if the font is always created new</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Boolean,System.Single)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Boolean)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String,System.Single)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.String)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.Single,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String,System.Single)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.GetFont(System.String)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.RegisterFamily(System.String,System.String,System.String)\">\r\n            Register a font by giving explicitly the font family and name.\r\n            @param familyName the font family\r\n            @param fullName the font name\r\n            @param path the font path\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.Register(System.String)\">\r\n            <summary>\r\n            Register a ttf- or a ttc-file.\r\n            </summary>\r\n            <param name=\"path\">the path to a ttf- or ttc-file</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.Register(System.String,System.String)\">\r\n            <summary>\r\n            Register a ttf- or a ttc-file and use an alias for the font contained in the ttf-file.\r\n            </summary>\r\n            <param name=\"path\">the path to a ttf- or ttc-file</param>\r\n            <param name=\"alias\">the alias you want to use for the font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.RegisterDirectory(System.String)\">\r\n            Register all the fonts in a directory.\r\n            @param dir the directory\r\n            @return the number of fonts registered\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.FontFactory.RegisterDirectory(System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.FontFactory.RegisterDirectories\">\r\n            Register fonts in some probable directories. It usually works in Windows,\r\n            Linux and Solaris.\r\n            @return the number of fonts registered\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.FontFactory.RegisteredFonts\">\r\n            <summary>\r\n            Gets a set of registered fontnames.\r\n            </summary>\r\n            <value>a set of registered fontnames</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.FontFactory.RegisteredFamilies\">\r\n            <summary>\r\n            Gets a set of registered font families.\r\n            </summary>\r\n            <value>a set of registered font families</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.Contains(System.String)\">\r\n            <summary>\r\n            Checks whether the given font is contained within the object\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <returns>true if font is contained within the object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactory.IsRegistered(System.String)\">\r\n            <summary>\r\n            Checks if a certain font is registered.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font that has to be checked</param>\r\n            <returns>true if the font is found</returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.FontFactoryImp\">\r\n            <summary>\r\n            If you are using True Type fonts, you can declare the paths of the different ttf- and ttc-files\r\n            to this class first and then create fonts in your code using one of the getFont method\r\n            without having to enter a path as parameter.\r\n            </summary>\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactoryImp.trueTypeFonts\">\r\n            <summary> This is a map of postscriptfontnames of True Type fonts and the path of their ttf- or ttc-file. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactoryImp.fontFamilies\">\r\n            <summary> This is a map of fontfamilies. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactoryImp.defaultEncoding\">\r\n            <summary> This is the default encoding to use. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.FontFactoryImp.defaultEmbedding\">\r\n            <summary> This is the default value of the <VAR>embedded</VAR> variable. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.#ctor\">\r\n            <summary> Creates new FontFactory </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32,iTextSharp.text.BaseColor,System.Boolean)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <param name=\"cached\">true if the font comes from the cache or is added to the cache if new, false if the font is always created new</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Boolean,System.Single)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Boolean)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"embedded\">true if the font is to be embedded in the PDF</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String,System.Single)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.String)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"encoding\">the encoding of the font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.Single,iTextSharp.text.BaseColor)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"color\">the BaseColor of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.Single,System.Int32)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <param name=\"style\">the style of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String,System.Single)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <param name=\"size\">the size of this font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.GetFont(System.String)\">\r\n            <summary>\r\n            Constructs a Font-object.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font</param>\r\n            <returns>a Font object</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.RegisterFamily(System.String,System.String,System.String)\">\r\n            Register a font by giving explicitly the font family and name.\r\n            @param familyName the font family\r\n            @param fullName the font name\r\n            @param path the font path\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.Register(System.String)\">\r\n            <summary>\r\n            Register a ttf- or a ttc-file.\r\n            </summary>\r\n            <param name=\"path\">the path to a ttf- or ttc-file</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.Register(System.String,System.String)\">\r\n            <summary>\r\n            Register a ttf- or a ttc-file and use an alias for the font contained in the ttf-file.\r\n            </summary>\r\n            <param name=\"path\">the path to a ttf- or ttc-file</param>\r\n            <param name=\"alias\">the alias you want to use for the font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.RegisterDirectory(System.String)\">\r\n            Register all the fonts in a directory.\r\n            @param dir the directory\r\n            @return the number of fonts registered\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.FontFactoryImp.RegisterDirectory(System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.RegisterDirectories\">\r\n            Register fonts in windows\r\n            @return the number of fonts registered\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.FontFactoryImp.RegisteredFonts\">\r\n            <summary>\r\n            Gets a set of registered fontnames.\r\n            </summary>\r\n            <value>a set of registered fontnames</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.FontFactoryImp.RegisteredFamilies\">\r\n            <summary>\r\n            Gets a set of registered font families.\r\n            </summary>\r\n            <value>a set of registered font families</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.FontFactoryImp.IsRegistered(System.String)\">\r\n            <summary>\r\n            Checks if a certain font is registered.\r\n            </summary>\r\n            <param name=\"fontname\">the name of the font that has to be checked</param>\r\n            <returns>true if the font is found</returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.GreekList\">\r\n            \r\n            A special-version of <CODE>LIST</CODE> whitch use greek-letters.\r\n            \r\n            @see com.lowagie.text.List\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.GreekList.#ctor\">\r\n            Initialization\r\n            \r\n            @param symbolIndent   indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.GreekList.#ctor(System.Int32)\">\r\n            Initialisierung\r\n            \r\n            @param symbolIndent   indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.GreekList.#ctor(System.Boolean,System.Int32)\">\r\n            Initialisierung \r\n            @param    greeklower      greek-char in lowercase   \r\n            @param    symbolIndent    indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.GreekList.SetGreekFont\">\r\n            change the font to SYMBOL\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.GreekList.Add(iTextSharp.text.IElement)\">\r\n             Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.\r\n            \r\n             @param    o   the object to add.\r\n             @return true if adding the object succeeded\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Header\">\r\n            <summary>\r\n            This is an Element that contains\r\n            some userdefined meta information about the document.\r\n            </summary>\r\n            <example>\r\n            <code>\r\n            <strong>Header header = new Header(\"inspired by\", \"William Shakespeare\");</strong>\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Header.name\">\r\n            <summary> This is the content of this chunk of text. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Header.#ctor(System.String,System.String)\">\r\n            <summary>\r\n            Constructs a Header.\r\n            </summary>\r\n            <param name=\"name\">the name of the meta-information</param>\r\n            <param name=\"content\">the content</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Header.Name\">\r\n            <summary>\r\n            Returns the name of the meta information.\r\n            </summary>\r\n            <value>a string</value>\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.html.HtmlEncoder”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.html.HtmlEncoder.HTML_CODE\">\r\n            List with the HTML translation of all the characters. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlEncoder.NEWLINETAGS\">\r\n            Set containing tags that trigger a new line.\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlEncoder.Encode(System.String)\">\r\n             Converts a <CODE>String</CODE> to the HTML-format of this <CODE>String</CODE>.\r\n            \r\n             @param   string  The <CODE>String</CODE> to convert\r\n             @return  a <CODE>String</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlEncoder.Encode(iTextSharp.text.BaseColor)\">\r\n             Converts a <CODE>BaseColor</CODE> into a HTML representation of this <CODE>BaseColor</CODE>.\r\n            \r\n             @param   color   the <CODE>BaseColor</CODE> that has to be converted.\r\n             @return  the HTML representation of this <COLOR>BaseColor</COLOR>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlEncoder.GetAlignment(System.Int32)\">\r\n             Translates the alignment value.\r\n            \r\n             @param   alignment   the alignment value\r\n             @return  the translated value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlEncoder.IsNewLineTag(System.String)\">\r\n            Returns true if the tag causes a new line like p, br etc.\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.HtmlTags\">\r\n            Static final values of supported HTML tags and attributes.\r\n            @since 5.0.6\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.A\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.B\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BODY\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BLOCKQUOTE\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BR\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.DIV\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.EM\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.FONT\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.H1\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.H2\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.H3\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.H4\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.H5\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.H6\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.HR\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.I\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.IMG\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.LI\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.OL\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.P\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.PRE\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.S\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.SPAN\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.STRIKE\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.STRONG\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.SUB\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.SUP\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.TABLE\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.TD\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.TH\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.TR\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.U\">\r\n            name of a tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.UL\">\r\n            name of a tag.\r\n            @since 5.0.6 (reorganized all constants)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN\">\r\n            name of an attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BGCOLOR\">\r\n            name of an attribute\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BORDER\">\r\n            name of an attribute\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.CELLPADDING\">\r\n            name of an attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.COLSPAN\">\r\n            name of an attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.EXTRAPARASPACE\">\r\n            name of an attribute\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ENCODING\">\r\n            name of an attribute\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.FACE\">\r\n            name of an attribute\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.HEIGHT\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.HREF\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.HYPHENATION\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.IMAGEPATH\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.INDENT\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.LEADING\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ROWSPAN\">\r\n            name of an attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.SIZE\">\r\n            name of an attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.SRC\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.VALIGN\">\r\n            Name of an attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.WIDTH\">\r\n            name of an attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_LEFT\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_CENTER\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_RIGHT\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_JUSTIFY\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_JUSTIFIED_ALL\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_TOP\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_MIDDLE\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_BOTTOM\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ALIGN_BASELINE\">\r\n            the possible value of an alignment attribute \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.STYLE\">\r\n            This is used for inline css style information \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.CLASS\">\r\n            Attribute for specifying externally defined CSS class.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.COLOR\">\r\n            the CSS tag for text color \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.FONTFAMILY\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.FONTSIZE\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.FONTSTYLE\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.FONTWEIGHT\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.LINEHEIGHT\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.PADDINGLEFT\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.TEXTALIGN\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.TEXTDECORATION\">\r\n            The CSS tag for the font size.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.VERTICALALIGN\">\r\n            the CSS tag for text decorations \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BOLD\">\r\n            a CSS value for text decoration\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.ITALIC\">\r\n            a CSS value for text decoration\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.LINETHROUGH\">\r\n            a CSS value for text decoration\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.NORMAL\">\r\n            a CSS value for text decoration\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.OBLIQUE\">\r\n            a CSS value for text decoration\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.UNDERLINE\">\r\n            a CSS value for text decoration\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.AFTER\">\r\n            A possible attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlTags.BEFORE\">\r\n            A possible attribute.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.ChainedProperties\">\r\n            Stores the hierarchy of tags along with the attributes of each tag.\r\n            @since 5.0.6 renamed from ChainedProperties\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.ChainedProperties.TagAttributes\">\r\n            Class that stores the info about one tag in the chain.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.ChainedProperties.TagAttributes.tag\">\r\n            A possible tag \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.ChainedProperties.TagAttributes.attrs\">\r\n            The styles corresponding with the tag \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ChainedProperties.TagAttributes.#ctor(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Constructs a chained property.\r\n            @param   tag     an XML/HTML tag\r\n            @param   attrs   the tag's attributes\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.ChainedProperties.chain\">\r\n            A list of chained properties representing the tag hierarchy. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ChainedProperties.#ctor\">\r\n            Creates a new instance of ChainedProperties \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.html.simpleparser.ChainedProperties.Item(System.String)\">\r\n            Walks through the hierarchy (bottom-up) looking for\r\n            a property key. Returns a value as soon as a match\r\n            is found or null if the key can't be found.\r\n            @param\tkey\tthe key of the property\r\n            @return\tthe value of the property\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ChainedProperties.HasProperty(System.String)\">\r\n            Walks through the hierarchy (bottom-up) looking for\r\n            a property key. Returns true as soon as a match is\r\n            found or false if the key can't be found.\r\n            @param\tkey\tthe key of the property\r\n            @return\ttrue if the key is found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ChainedProperties.AddToChain(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Adds a tag and its corresponding properties to the chain.\r\n            @param tag\tthe tags that needs to be added to the chain\r\n            @param props\tthe tag's attributes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ChainedProperties.AdjustFontSize(System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            If the properties contain a font size, the size may need to\r\n            be adjusted based on font sizes higher in the hierarchy.\r\n            @param   attrs the attributes that may have to be updated\r\n            @since 5.0.6 (renamed)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.HTMLWorker\">\r\n            Old iText class that allows you to convert HTML to PDF.\r\n            We've completely rewritten HTML to PDF conversion and we made it a separate project named XML Worker.\r\n            @deprecated since 5.5.2; please switch to XML Worker instead (this is a separate project)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.document\">\r\n            DocListener that will listen to the Elements\r\n            produced by parsing the HTML.\r\n            This can be a com.lowagie.text.Document adding\r\n            the elements to a Document directly, or an\r\n            HTMLWorker instance strong the objects in a List\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.tags\">\r\n            The map with all the supported tags.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.style\">\r\n            The object defining all the styles. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.#ctor(iTextSharp.text.IDocListener)\">\r\n            Creates a new instance of HTMLWorker\r\n            @param document A class that implements <CODE>DocListener</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.#ctor(iTextSharp.text.IDocListener,System.Collections.Generic.IDictionary{System.String,iTextSharp.text.html.simpleparser.IHTMLTagProcessor},iTextSharp.text.html.simpleparser.StyleSheet)\">\r\n            Creates a new instance of HTMLWorker\r\n            @param document  A class that implements <CODE>DocListener</CODE>\r\n            @param tags      A map containing the supported tags\r\n            @param style     A StyleSheet\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetSupportedTags(System.Collections.Generic.IDictionary{System.String,iTextSharp.text.html.simpleparser.IHTMLTagProcessor})\">\r\n            Sets the map with supported tags.\r\n            @param tags\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetStyleSheet(iTextSharp.text.html.simpleparser.StyleSheet)\">\r\n            Setter for the StyleSheet\r\n            @param style the StyleSheet\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.Parse(System.IO.TextReader)\">\r\n            Parses content read from a java.io.Reader object.\r\n            @param reader    the content\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.stack\">\r\n            Stack with the Elements that already have been processed.\r\n            @since iText 5.0.6 (private => protected)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.currentParagraph\">\r\n            Keeps the content of the current paragraph\r\n            @since iText 5.0.6 (private => protected)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.chain\">\r\n            The current hierarchy chain of tags.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.StartDocument\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#startDocument()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.StartElement(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#startElement(java.lang.String, java.util.Dictionary)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.Text(System.String)\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#text(java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.EndElement(System.String)\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#endElement(java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.EndDocument\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#endDocument()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.NewLine\">\r\n            Adds a new line to the currentParagraph.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CarriageReturn\">\r\n            Flushes the current paragraph, indicating that we're starting\r\n            a new block.\r\n            If the stack is empty, the paragraph is added to the document.\r\n            Otherwise the Paragraph is added to the stack.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.FlushContent\">\r\n            Stacks the current paragraph, indicating that we're starting\r\n            a new span.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.PushToStack(iTextSharp.text.IElement)\">\r\n            Pushes an element to the Stack.\r\n            @param element\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.UpdateChain(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Updates the chain with a new tag and new attributes.\r\n            @param tag   the new tag\r\n            @param attrs the corresponding attributes\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.UpdateChain(System.String)\">\r\n            Updates the chain by removing a tag.\r\n            @param tag   the new tag\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.IMG_PROVIDER\">\r\n            Key used to store the image provider in the providers map.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.IMG_PROCESSOR\">\r\n            Key used to store the image processor in the providers map.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.IMG_STORE\">\r\n            Key used to store the image store in the providers map.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.IMG_BASEURL\">\r\n            Key used to store the image baseurl provider in the providers map.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.FONT_PROVIDER\">\r\n            Key used to store the font provider in the providers map.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.LINK_PROVIDER\">\r\n            Key used to store the link provider in the providers map.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.providers\">\r\n            IDictionary containing providers such as a FontProvider or ImageProvider.\r\n            @since 5.0.6 (renamed from interfaceProps)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetProviders(System.Collections.Generic.IDictionary{System.String,System.Object})\">\r\n            Setter for the providers.\r\n            If a FontProvider is added, the ElementFactory is updated.\r\n            @param providers a IDictionary with different providers\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.factory\">\r\n            Factory that is able to create iText Element objects.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateChunk(System.String)\">\r\n            Creates a Chunk using the factory.\r\n            @param content   the content of the chunk\r\n            @return  a Chunk with content\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateParagraph\">\r\n            Creates a Paragraph using the factory.\r\n            @return  a Paragraph without any content\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateList(System.String)\">\r\n            Creates a List object.\r\n            @param tag should be \"ol\" or \"ul\"\r\n            @return  a List object\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateListItem\">\r\n            Creates a ListItem object.\r\n            @return a ListItem object\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateLineSeparator(System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Creates a LineSeparator object.\r\n            @param attrs properties of the LineSeparator\r\n            @return a LineSeparator object\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateImage(System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Creates an Image object.\r\n            @param attrs properties of the Image\r\n            @return an Image object (or null if the Image couldn't be found)\r\n            @throws DocumentException\r\n            @throws IOException\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.CreateCell(System.String)\">\r\n            Creates a Cell.\r\n            @param tag   the tag\r\n            @return  a CellWrapper object\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ProcessLink\">\r\n            Adds a link to the current paragraph.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ProcessList\">\r\n            Fetches the List from the Stack and adds it to\r\n            the TextElementArray on top of the Stack,\r\n            or to the Document if the Stack is empty.\r\n            @throws DocumentException\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ProcessListItem\">\r\n            Looks for the List object on the Stack,\r\n            and adds the ListItem to the List.\r\n            @throws DocumentException\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ProcessImage(iTextSharp.text.Image,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Processes an Image.\r\n            @param img\r\n            @param attrs\r\n            @throws DocumentException\r\n            @since   5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ProcessTable\">\r\n            Processes the Table.\r\n            @throws DocumentException\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ProcessRow\">\r\n            Gets the TableWrapper from the Stack and adds a new row.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.tableState\">\r\n            Stack to keep track of table tags. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.pendingTR\">\r\n            Boolean to keep track of TR tags. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.pendingTD\">\r\n            Boolean to keep track of TD and TH tags \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.pendingLI\">\r\n            Boolean to keep track of LI tags \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.insidePRE\">\r\n            Boolean to keep track of PRE tags\r\n            @since 5.0.6 renamed from isPRE\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.skipText\">\r\n            Indicates if text needs to be skipped.\r\n            @since iText 5.0.6 (private => protected)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.PushTableState\">\r\n            Pushes the values of pendingTR and pendingTD\r\n            to a state stack.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.PopTableState\">\r\n            Pops the values of pendingTR and pendingTD\r\n            from a state stack.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.IsPendingTR\">\r\n            @return the pendingTR\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetPendingTR(System.Boolean)\">\r\n            @param pendingTR the pendingTR to set\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.IsPendingTD\">\r\n            @return the pendingTD\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetPendingTD(System.Boolean)\">\r\n            @param pendingTD the pendingTD to set\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.IsPendingLI\">\r\n            @return the pendingLI\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetPendingLI(System.Boolean)\">\r\n            @param pendingLI the pendingLI to set\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.IsInsidePRE\">\r\n            @return the insidePRE\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetInsidePRE(System.Boolean)\">\r\n            @param insidePRE the insidePRE to set\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.IsSkipText\">\r\n            @return the skipText\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetSkipText(System.Boolean)\">\r\n            @param skipText the skipText to set\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLWorker.objectList\">\r\n            The resulting list of elements. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(System.IO.TextReader,iTextSharp.text.html.simpleparser.StyleSheet)\">\r\n            Parses an HTML source to a List of Element objects\r\n            @param reader    the HTML source\r\n            @param style     a StyleSheet object\r\n            @return a List of Element objects\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(System.IO.TextReader,iTextSharp.text.html.simpleparser.StyleSheet,System.Collections.Generic.Dictionary{System.String,System.Object})\">\r\n            Parses an HTML source to a List of Element objects\r\n            @param reader    the HTML source\r\n            @param style     a StyleSheet object\r\n            @param providers map containing classes with extra info\r\n            @return a List of Element objects\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(System.IO.TextReader,iTextSharp.text.html.simpleparser.StyleSheet,System.Collections.Generic.IDictionary{System.String,iTextSharp.text.html.simpleparser.IHTMLTagProcessor},System.Collections.Generic.Dictionary{System.String,System.Object})\">\r\n            Parses an HTML source to a List of Element objects\r\n            @param reader    the HTML source\r\n            @param style     a StyleSheet object\r\n            @param tags      a map containing supported tags and their processors\r\n            @param providers map containing classes with extra info\r\n            @return a List of Element objects\r\n            @throws IOException\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.Add(iTextSharp.text.IElement)\">\r\n            @see com.itextpdf.text.ElementListener#add(com.itextpdf.text.Element)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.Close\">\r\n            @see com.itextpdf.text.DocListener#close()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.NewPage\">\r\n            @see com.itextpdf.text.DocListener#newPage()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.Open\">\r\n            @see com.itextpdf.text.DocListener#open()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.ResetPageCount\">\r\n            @see com.itextpdf.text.DocListener#resetPageCount()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetMarginMirroring(System.Boolean)\">\r\n            @see com.itextpdf.text.DocListener#setMarginMirroring(bool)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetMarginMirroringTopBottom(System.Boolean)\">\r\n            @see com.itextpdf.text.DocListener#setMarginMirroring(bool)\r\n            @since   2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetMargins(System.Single,System.Single,System.Single,System.Single)\">\r\n            @see com.itextpdf.text.DocListener#setMargins(float, float, float, float)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.html.simpleparser.HTMLWorker.PageCount\">\r\n            @see com.itextpdf.text.DocListener#setPageCount(int)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetPageSize(iTextSharp.text.Rectangle)\">\r\n            @see com.itextpdf.text.DocListener#setPageSize(com.itextpdf.text.Rectangle)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.SetInterfaceProps(System.Collections.Generic.Dictionary{System.String,System.Object})\">\r\n            Sets the providers.\r\n            @deprecated use SetProviders() instead\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLWorker.GetInterfaceProps\">\r\n            Gets the providers\r\n            @deprecated use GetProviders() instead\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.IImageProvider\">\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.StyleSheet\">\r\n            Old class to define styles for HTMLWorker.\r\n            We've completely rewritten HTML to PDF functionality; see project XML Worker.\r\n            XML Worker is able to parse CSS files and \"style\" attribute values.\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.StyleSheet.tagMap\">\r\n            IDictionary storing tags and their corresponding styles.\r\n            @since 5.0.6 (changed Dictionary => IDictionary)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.StyleSheet.classMap\">\r\n            IDictionary storing possible names of the \"class\" attribute\r\n            and their corresponding styles.\r\n            @since 5.0.6 (changed Dictionary => IDictionary)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.#ctor\">\r\n            Creates a new instance of StyleSheet\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.LoadTagStyle(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Associates a IDictionary containing styles with a tag.\r\n            @param   tag     the name of the HTML/XML tag\r\n            @param   attrs   a map containing styles\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.LoadTagStyle(System.String,System.String,System.String)\">\r\n            Adds an extra style key-value pair to the styles IDictionary\r\n            of a specific tag\r\n            @param   tag     the name of the HTML/XML tag\r\n            @param   key     the key specifying a specific style\r\n            @param   value   the value defining the style\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.LoadStyle(System.String,System.Collections.Generic.Dictionary{System.String,System.String})\">\r\n            Associates a IDictionary containing styles with a class name.\r\n            @param   className   the value of the class attribute\r\n            @param   attrs       a map containing styles\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.LoadStyle(System.String,System.String,System.String)\">\r\n            Adds an extra style key-value pair to the styles IDictionary\r\n            of a specific tag\r\n            @param   className   the name of the HTML/XML tag\r\n            @param   key         the key specifying a specific style\r\n            @param   value       the value defining the style\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.ApplyStyle(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Resolves the styles based on the tag name and the value\r\n            of the class attribute.\r\n            @param   tag     the tag that needs to be resolved\r\n            @param   attrs   existing style map that will be updated\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.StyleSheet.ResolveStyleAttribute(System.Collections.Generic.IDictionary{System.String,System.String},iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Method contributed by Lubos Strapko\r\n            @param h\r\n            @param chain\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.CellWrapper\">\r\n            We use a CellWrapper because we need some extra info\r\n            that isn't available in PdfPCell.\r\n            @author  psoares\r\n            @since 5.0.6 (renamed)\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.CellWrapper.cell\">\r\n            The cell that is wrapped in this stub. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.CellWrapper.width\">\r\n            The width of the cell.\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.CellWrapper.percentage\">\r\n            Indicates if the width is a percentage.\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.CellWrapper.#ctor(System.String,iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Creates a new instance of IncCell.\r\n            @param\ttag\t\tthe cell that is wrapped in this object.\r\n            @param\tchain\tproperties such as width\r\n            @since\t5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.CellWrapper.CreatePdfPCell(System.String,iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Creates a PdfPCell element based on a tag and its properties.\r\n            @param\ttag\t\ta cell tag\r\n            @param\tchain\tthe hierarchy chain\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.CellWrapper.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.CellWrapper.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.ElementFactory\">\r\n            Factory that produces iText Element objects,\r\n            based on tags and their properties.\r\n            @author blowagie\r\n            @author psoares\r\n            @since 5.0.6 (renamed)\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.ElementFactory.provider\">\r\n            The font provider that will be used to fetch fonts.\r\n            @since   iText 5.0   This used to be a FontFactoryImp\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.#ctor\">\r\n            Creates a new instance of FactoryProperties.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.html.simpleparser.ElementFactory.FontProvider\">\r\n            Setter for the font provider\r\n            @param provider\r\n            @since   5.0.6 renamed from setFontImp\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.GetFont(iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Creates a Font object based on a chain of properties.\r\n            @param   chain   chain of properties\r\n            @return  an iText Font object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.CreateChunk(System.String,iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Creates an iText Chunk\r\n            @param content the content of the Chunk\r\n            @param chain the hierarchy chain\r\n            @return a Chunk\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.CreateParagraph(iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Creates an iText Paragraph object using the properties\r\n            of the different tags and properties in the hierarchy chain.\r\n            @param   chain   the hierarchy chain\r\n            @return  a Paragraph without any content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.CreateListItem(iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Creates an iText Paragraph object using the properties\r\n            of the different tags and properties in the hierarchy chain.\r\n            @param   chain   the hierarchy chain\r\n            @return  a ListItem without any content\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.UpdateElement(iTextSharp.text.Paragraph,iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Method that does the actual Element creating for\r\n            the createParagraph and createListItem method.\r\n            @param paragraph\r\n            @param chain\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.SetParagraphLeading(iTextSharp.text.Paragraph,System.String)\">\r\n            Sets the leading of a Paragraph object.\r\n            @param   paragraph   the Paragraph for which we set the leading\r\n            @param   leading     the String value of the leading\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.GetHyphenation(iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Gets a HyphenationEvent based on the hyphenation entry in\r\n            the hierarchy chain.\r\n            @param   chain   the hierarchy chain\r\n            @return  a HyphenationEvent\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ElementFactory.CreateLineSeparator(System.Collections.Generic.IDictionary{System.String,System.String},System.Single)\">\r\n            Creates a LineSeparator.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.HTMLTagProcessors\">\r\n            This class maps tags such as div and span to their corresponding\r\n            TagProcessor classes.\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.#ctor\">\r\n            Creates a Map containing supported tags.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLTagProcessors.EM_STRONG_STRIKE_SUP_SUP\">\r\n            Object that processes the following tags:\r\n            i, em, b, strong, s, strike, u, sup, sub\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_EM_STRONG_STRIKE_SUP_SUP.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_EM_STRONG_STRIKE_SUP_SUP.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_EM_STRONG_STRIKE_SUP_SUP.MapTag(System.String)\">\r\n            Maps em to i, strong to b, and strike to s.\r\n            This is a convention: the style parser expects i, b and s.\r\n            @param tag the original tag\r\n            @return the mapped tag\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLTagProcessors.A\">\r\n            Object that processes the a tag.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_A.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_A.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.HTMLTagProcessors.BR\">\r\n            Object that processes the br tag.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_BR.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_BR.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_UL_OL.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_UL_OL.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_SPAN.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_SPAN.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_H.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_H.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_LI.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_LI.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_PRE.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_PRE.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_DIV.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_DIV.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_TABLE.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @throws DocumentException\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_TABLE.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_TR.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @throws DocumentException\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_TR.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_TD.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @throws DocumentException\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_TD.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_IMG.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#startElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.HTMLTagProcessors.HTMLTagProcessor_IMG.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            @see com.itextpdf.text.html.simpleparser.HTMLTagProcessors#endElement(com.itextpdf.text.html.simpleparser.HTMLWorker, java.lang.String)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.IHTMLTagProcessor\">\r\n            Interface that needs to be implemented by every tag that is supported by HTMLWorker.\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.IHTMLTagProcessor.StartElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Implement this class to tell the HTMLWorker what to do\r\n            when an open tag is encountered.\r\n            @param worker    the HTMLWorker\r\n            @param tag       the tag that was encountered\r\n            @param attrs     the current attributes of the tag\r\n            @throws DocumentException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.IHTMLTagProcessor.EndElement(iTextSharp.text.html.simpleparser.HTMLWorker,System.String)\">\r\n            Implement this class to tell the HTMLWorker what to do\r\n            when an close tag is encountered.\r\n            @param worker    the HTMLWorker\r\n            @param tag       the tag that was encountered\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.IImageProcessor\">\r\n            Implement this interface to process images and\r\n            to indicate if the image needs to be added or\r\n            skipped.\r\n            @since 5.0.6 (renamed)\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.IImageProcessor.Process(iTextSharp.text.Image,System.Collections.Generic.IDictionary{System.String,System.String},iTextSharp.text.html.simpleparser.ChainedProperties,iTextSharp.text.IDocListener)\">\r\n            Allows you to (pre)process the image before (or instead of)\r\n            adding it to the DocListener with HTMLWorker.\r\n            @param img   the Image object\r\n            @param attrs attributes of the image\r\n            @param chain hierarchy of attributes\r\n            @param doc   the DocListener to which the Image needs to be added\r\n            @return  false if you still want HTMLWorker to add the Image\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.ILinkProcessor\">\r\n            Allows you to do additional processing on a Paragraph that contains a link.\r\n            @author  psoares\r\n            @since 5.0.6 (renamed)\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.ILinkProcessor.Process(iTextSharp.text.Paragraph,iTextSharp.text.html.simpleparser.ChainedProperties)\">\r\n            Does additional processing on a link paragraph\r\n            @param current   the Paragraph that has the link\r\n            @param attrs     the attributes\r\n            @return  false if the Paragraph no longer needs processing\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.ImageStore\">\r\n            @since 5.0.6\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.simpleparser.TableWrapper\">\r\n            We use a TableWrapper because PdfPTable is rather complex\r\n            to put on the HTMLWorker stack.\r\n            @author  psoares\r\n            @since 5.0.6 (renamed)\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.TableWrapper.styles\">\r\n            The styles that need to be applied to the table\r\n            @since 5.0.6 renamed from props\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.TableWrapper.rows\">\r\n            Nested list containing the PdfPCell elements that are part of this table.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.simpleparser.TableWrapper.colWidths\">\r\n            Array containing the widths of the columns.\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.TableWrapper.#ctor(System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Creates a new instance of IncTable.\r\n            @param   attrs   a Map containing attributes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.TableWrapper.AddRow(System.Collections.Generic.IList{iTextSharp.text.pdf.PdfPCell})\">\r\n            Adds a new row to the table.\r\n            @param row a list of PdfPCell elements\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.html.simpleparser.TableWrapper.ColWidths\">\r\n            Setter for the column widths\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.simpleparser.TableWrapper.CreateTable\">\r\n            Creates a new PdfPTable based on the info assembled\r\n            in the table stub.\r\n            @return  a PdfPTable\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.WebColors\">\r\n            This class is a HashMap that contains the names of colors as a key and the\r\n            corresponding Color as value. (Source: Wikipedia\r\n            http://en.wikipedia.org/wiki/Web_colors )\r\n            \r\n            @author blowagie\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.WebColors.MissingHashColorFormat(System.String)\">\r\n            A web color string without the leading # will be 3 or 6 characters long\r\n            and all those characters will be hex digits. NOTE: colStr must be all\r\n            lower case or the current hex letter test will fail.\r\n            \r\n            @param colStr\r\n                       A non-null, lower case string that might describe an RGB color\r\n                       in hex.\r\n            @return Is this a web color hex string without the leading #?\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.WebColors.GetRGBColor(System.String)\">\r\n             Gives you a BaseColor based on a name.\r\n            \r\n             @param name\r\n                        a name such as black, violet, cornflowerblue or #RGB or\r\n                        #RRGGBB or RGB or RRGGBB or rgb(R,G,B)\r\n             @return the corresponding BaseColor object. Never returns null.\r\n             @throws IllegalArgumentException\r\n                         if the String isn't a know representation of a color.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.html.HtmlUtilities\">\r\n            A class that contains some utilities to parse HTML attributes and content.\r\n            @since 5.0.6 (some of these methods used to be in the Markup class)\r\n            @deprecated since 5.5.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlUtilities.DEFAULT_FONT_SIZE\">\r\n            a default value for font-size \r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.ParseLength(System.String)\">\r\n            Parses a length.\r\n            \r\n            @param str\r\n                       a length in the form of an optional + or -, followed by a\r\n                       number and a unit.\r\n            @return a float\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.ParseLength(System.String,System.Single)\">\r\n            New method contributed by: Lubos Strapko\r\n            \r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.DecodeColor(System.String)\">\r\n            Converts a <CODE>BaseColor</CODE> into a HTML representation of this <CODE>\r\n            BaseColor</CODE>.\r\n            \r\n            @param s\r\n                       the <CODE>BaseColor</CODE> that has to be converted.\r\n            @return the HTML representation of this <COLOR>BaseColor </COLOR>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.ParseAttributes(System.String)\">\r\n            This method parses a String with attributes and returns a Properties\r\n            object.\r\n            \r\n            @param str\r\n                       a String of this form: 'key1=\"value1\"; key2=\"value2\";...\r\n                       keyN=\"valueN\" '\r\n            @return a Properties object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.RemoveComment(System.String,System.String,System.String)\">\r\n            Removes the comments sections of a String.\r\n            \r\n            @param str\r\n                       the original String\r\n            @param startComment\r\n                       the String that marks the start of a Comment section\r\n            @param endComment\r\n                       the String that marks the end of a Comment section.\r\n            @return the String stripped of its comment section\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.EliminateWhiteSpace(System.String)\">\r\n            Helper class that reduces the white space in a String\r\n            @param content content containing whitespace\r\n            @return the content without all unnecessary whitespace\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.html.HtmlUtilities.FONTSIZES\">\r\n            A series of predefined font sizes.\r\n            @since 5.0.6 (renamed)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.GetIndexedFontSize(System.String,System.String)\">\r\n            Picks a font size from a series of predefined font sizes.\r\n            @param value     the new value of a font, expressed as an index\r\n            @param previous  the previous value of the font size\r\n            @return  a new font size.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.html.HtmlUtilities.AlignmentValue(System.String)\">\r\n            Translates a String value to an alignment value.\r\n            (written by Norman Richards, integrated into iText by Bruno)\r\n            @param   alignment a String (one of the ALIGN_ constants of this class)\r\n            @return  an alignment value (one of the ALIGN_ constants of the Element interface) \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.IDocListener\">\r\n            <summary>\r\n            A class that implements DocListener will perform some\r\n            actions when some actions are performed on a Document.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.IElementListener\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Document\"/>\r\n            <seealso cref=\"T:iTextSharp.text.DocWriter\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.Open\">\r\n            <summary>\r\n            Signals that the Document has been opened and that\r\n            Elements can be added.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.Close\">\r\n            <summary>\r\n            Signals that the Document was closed and that no other\r\n            Elements will be added.\r\n            </summary>\r\n            <remarks>\r\n            The output stream of every writer implementing IDocListener will be closed.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.NewPage\">\r\n            <summary>\r\n            Signals that an new page has to be started.\r\n            </summary>\r\n            <returns>true if the page was added, false if not.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.SetPageSize(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Sets the pagesize.\r\n            </summary>\r\n            <param name=\"pageSize\">the new pagesize</param>\r\n            <returns>a boolean</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.SetMargins(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Sets the margins.\r\n            </summary>\r\n            <param name=\"marginLeft\">the margin on the left</param>\r\n            <param name=\"marginRight\">the margin on the right</param>\r\n            <param name=\"marginTop\">the margin on the top</param>\r\n            <param name=\"marginBottom\">the margin on the bottom</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.SetMarginMirroring(System.Boolean)\">\r\n            Parameter that allows you to do margin mirroring (odd/even pages)\r\n            @param marginMirroring\r\n            @return true if succesfull\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.SetMarginMirroringTopBottom(System.Boolean)\">\r\n            Parameter that allows you to do top/bottom margin mirroring (odd/even pages)\r\n            @param marginMirroringTopBottom\r\n            @return true if successful\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.IDocListener.PageCount\">\r\n            <summary>\r\n            Sets the page number.\r\n            </summary>\r\n            <value>the new page number</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IDocListener.ResetPageCount\">\r\n            <summary>\r\n            Sets the page number to 0.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.IElement\">\r\n            <summary>\r\n            Interface for a text element.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Anchor\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Cell\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Chapter\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Chunk\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Gif\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Graphic\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Header\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Image\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Jpeg\"/>\r\n            <seealso cref=\"T:iTextSharp.text.List\"/>\r\n            <seealso cref=\"T:iTextSharp.text.ListItem\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Meta\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Paragraph\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Phrase\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Rectangle\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Row\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Section\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Table\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IElement.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.IElement.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IElement.IsContent\">\r\n            Checks if this element is a content object.\r\n            If not, it's a metadata object.\r\n            @since    iText 2.0.8\r\n            @return   true if this is a 'content' element; false if this is a 'medadata' element\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IElement.IsNestable\">\r\n            Checks if this element is nestable.\r\n            @since    iText 2.0.8\r\n            @return   true if this element can be nested inside other elements.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.IElement.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IElement.ToString\">\r\n            <summary>\r\n            Gets the content of the text element.\r\n            </summary>\r\n            <returns>the content of the text element</returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.IElementListener\">\r\n            <summary>\r\n            A class that implements ElementListener will perform some\r\n            actions when an Element is added.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IElementListener.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Signals that an Element was added to the Document.\r\n            </summary>\r\n            <param name=\"element\">Element added</param>\r\n            <returns>true if the element was added, false if not.</returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.IFontProvider\">\r\n            These two methods are used by FactoryProperties (for HTMLWorker).\r\n            It's implemented by FontFactoryImp.\r\n            @since   iText 5.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IFontProvider.IsRegistered(System.String)\">\r\n             Checks if a certain font is registered.\r\n            \r\n             @param   fontname    the name of the font that has to be checked.\r\n             @return  true if the font is found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.IFontProvider.GetFont(System.String,System.String,System.Boolean,System.Single,System.Int32,iTextSharp.text.BaseColor)\">\r\n             Constructs a <CODE>Font</CODE>-object.\r\n            \r\n             @param   fontname    the name of the font\r\n             @param   encoding    the encoding of the font\r\n             @param       embedded    true if the font is to be embedded in the PDF\r\n             @param   size        the size of this font\r\n             @param   style       the style of this font\r\n             @param   color       the <CODE>BaseColor</CODE> of this font.\r\n             @return the Font constructed based on the parameters\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ILargeElement\">\r\n            Interface implemented by Element objects that can potentially consume\r\n            a lot of memory. Objects implementing the LargeElement interface can\r\n            be added to a Document more than once. If you have invoked setCompleted(false),\r\n            they will be added partially and the content that was added will be\r\n            removed until you've invoked setCompleted(true);\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ILargeElement.ElementComplete\">\r\n            If you invoke setCompleted(false), you indicate that the content\r\n            of the object isn't complete yet; it can be added to the document\r\n            partially, but more will follow. If you invoke setCompleted(true),\r\n            you indicate that you won't add any more data to the object.\r\n            @since   iText 2.0.8\r\n            @param   complete    false if you'll be adding more data after\r\n                                 adding the object to the document.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ILargeElement.FlushContent\">\r\n            Flushes the content that has been added.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Image\">\r\n            <summary>\r\n            An Image is the representation of a graphic element (JPEG, PNG or GIF)\r\n            that has to be inserted into the document\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Rectangle\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.DEFAULT\">\r\n            <summary> this is a kind of image Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.RIGHT_ALIGN\">\r\n            <summary> this is a kind of image Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.LEFT_ALIGN\">\r\n            <summary> this is a kind of image Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.MIDDLE_ALIGN\">\r\n            <summary> this is a kind of image Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.TEXTWRAP\">\r\n            <summary> this is a kind of image Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.UNDERLYING\">\r\n            <summary> this is a kind of image Element. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.AX\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.AY\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.BX\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.BY\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.CX\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.CY\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.DX\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.DY\">\r\n            <summary> This represents a coordinate in the transformation matrix. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_NONE\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_JPEG\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_PNG\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_GIF\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_BMP\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_TIFF\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_WMF\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_JPEG2000\">\r\n            type of image \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.ORIGINAL_JBIG2\">\r\n            type of image\r\n            @since\t2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.invert\">\r\n            Image color inversion \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.type\">\r\n            <summary> The imagetype. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.url\">\r\n            <summary> The URL of the image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.rawData\">\r\n            <summary> The raw data of the image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.template\">\r\n            <summary> The template to be treated as an image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.alignment\">\r\n            <summary> The alignment of the Image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.alt\">\r\n            <summary> Text that can be shown instead of the image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.absoluteX\">\r\n            <summary> This is the absolute X-position of the image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.absoluteY\">\r\n            <summary> This is the absolute Y-position of the image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.plainWidth\">\r\n            <summary> This is the width of the image without rotation. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.plainHeight\">\r\n            <summary> This is the width of the image without rotation. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.scaledWidth\">\r\n            <summary> This is the scaled width of the image taking rotation into account. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.scaledHeight\">\r\n            <summary> This is the original height of the image taking rotation into account. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.compressionLevel\">\r\n            The compression level of the content streams.\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.rotationRadians\">\r\n            <summary> This is the rotation of the image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.colorspace\">\r\n            <summary> this is the colorspace of a jpeg-image. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.bpc\">\r\n            <summary> this is the bits per component of the raw image. It also flags a CCITT image.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.transparency\">\r\n            <summary> this is the transparency information of the raw image</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.indentationLeft\">\r\n            the indentation to the left. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.indentationRight\">\r\n            the indentation to the right. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.dpiX\">\r\n            <summary> Holds value of property dpiX. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.dpiY\">\r\n            <summary> Holds value of property dpiY. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.interpolation\">\r\n            <summary> Holds value of property interpolation. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.annotation\">\r\n            <summary> if the annotation is not null the image will be clickable. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.profile\">\r\n            <summary> ICC Profile attached </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.deflated\">\r\n            Holds value of property deflated. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.smask\">\r\n            Holds value of property smask. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.xyRatio\">\r\n            Holds value of property XYRatio. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.originalType\">\r\n            Holds value of property originalType. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.originalData\">\r\n            Holds value of property originalData. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.spacingBefore\">\r\n            The spacing before the image. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.spacingAfter\">\r\n            The spacing after the image. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.widthPercentage\">\r\n            Holds value of property widthPercentage.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.initialRotation\">\r\n            Holds value of property initialRotation.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.#ctor(System.Uri)\">\r\n            <summary>\r\n            Constructs an Image-object, using an url.\r\n            </summary>\r\n            <param name=\"url\">the URL where the image can be found.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.#ctor(iTextSharp.text.Image)\">\r\n            <summary>\r\n            Constructs an Image object duplicate.\r\n            </summary>\r\n            <param name=\"image\">another Image object.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(iTextSharp.text.Image)\">\r\n            <summary>\r\n            Gets an instance of an Image.\r\n            </summary>\r\n            <param name=\"image\">an Image</param>\r\n            <returns>an object of type Gif, Jpeg or Png</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Uri)\">\r\n            <summary>\r\n            Gets an instance of an Image.\r\n            </summary>\r\n            <param name=\"url\">an URL</param>\r\n            <returns>an object of type Gif, Jpeg or Png</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Uri,System.Boolean)\">\r\n            <summary>\r\n            Gets an instance of an Image.\r\n            </summary>\r\n            <param name=\"url\">an URL</param>\r\n            <returns>an object of type Gif, Jpeg or Png</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Byte[],System.Boolean)\">\r\n            <summary>\r\n            Gets an instance of an Image.\r\n            </summary>\r\n            <param name=\"img\">a byte array</param>\r\n            <returns>an object of type Gif, Jpeg or Png</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.String)\">\r\n            <summary>\r\n            Gets an instance of an Image.\r\n            </summary>\r\n            <param name=\"filename\">a filename</param>\r\n            <returns>an object of type Gif, Jpeg or Png</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Int32,System.Int32,System.Int32,System.Int32,System.Byte[])\">\r\n            <summary>\r\n            Gets an instance of an Image in raw mode.\r\n            </summary>\r\n            <param name=\"width\">the width of the image in pixels</param>\r\n            <param name=\"height\">the height of the image in pixels</param>\r\n            <param name=\"components\">1,3 or 4 for GrayScale, RGB and CMYK</param>\r\n            <param name=\"bpc\">bits per component</param>\r\n            <param name=\"data\">the image data</param>\r\n            <returns>an object of type ImgRaw</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Int32,System.Int32,System.Byte[],System.Byte[])\">\r\n            Creates a JBIG2 Image.\r\n            @param   width   the width of the image\r\n            @param   height  the height of the image\r\n            @param   data    the raw image data\r\n            @param   globals JBIG2 globals\r\n            @since   2.1.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(iTextSharp.text.pdf.PRIndirectReference)\">\r\n            Reuses an existing image.\r\n            @param ref the reference to the image dictionary\r\n            @throws BadElementException on error\r\n            @return the image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(iTextSharp.text.pdf.PdfTemplate)\">\r\n            <summary>\r\n            Gets an instance of an Image in raw mode.\r\n            </summary>\r\n            <param name=\"template\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Int32,System.Int32,System.Boolean,System.Int32,System.Int32,System.Byte[])\">\r\n            <summary>\r\n            Gets an instance of an Image in raw mode.\r\n            </summary>\r\n            <param name=\"width\">the width of the image in pixels</param>\r\n            <param name=\"height\">the height of the image in pixels</param>\r\n            <param name=\"reverseBits\"></param>\r\n            <param name=\"typeCCITT\"></param>\r\n            <param name=\"parameters\"></param>\r\n            <param name=\"data\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Int32,System.Int32,System.Boolean,System.Int32,System.Int32,System.Byte[],System.Int32[])\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <param name=\"width\"></param>\r\n            <param name=\"height\"></param>\r\n            <param name=\"reverseBits\"></param>\r\n            <param name=\"typeCCITT\"></param>\r\n            <param name=\"parameters\"></param>\r\n            <param name=\"data\"></param>\r\n            <param name=\"transparency\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetInstance(System.Int32,System.Int32,System.Int32,System.Int32,System.Byte[],System.Int32[])\">\r\n            <summary>\r\n            Gets an instance of an Image in raw mode.\r\n            </summary>\r\n            <param name=\"width\">the width of the image in pixels</param>\r\n            <param name=\"height\">the height of the image in pixels</param>\r\n            <param name=\"components\">1,3 or 4 for GrayScale, RGB and CMYK</param>\r\n            <param name=\"bpc\">bits per component</param>\r\n            <param name=\"data\">the image data</param>\r\n            <param name=\"transparency\">\r\n            transparency information in the Mask format of the\r\n            image dictionary\r\n            </param>\r\n            <returns>an object of type ImgRaw</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.SetAbsolutePosition(System.Single,System.Single)\">\r\n            <summary>\r\n            Sets the absolute position of the Image.\r\n            </summary>\r\n            <param name=\"absoluteX\"></param>\r\n            <param name=\"absoluteY\"></param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScaleAbsolute(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Scale the image to the dimensions of the rectangle\r\n            </summary>\r\n            <param name=\"rectangle\">dimensions to scale the Image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScaleAbsolute(System.Single,System.Single)\">\r\n            <summary>\r\n            Scale the image to an absolute width and an absolute height.\r\n            </summary>\r\n            <param name=\"newWidth\">the new width</param>\r\n            <param name=\"newHeight\">the new height</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScaleAbsoluteWidth(System.Single)\">\r\n            <summary>\r\n            Scale the image to an absolute width.\r\n            </summary>\r\n            <param name=\"newWidth\">the new width</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScaleAbsoluteHeight(System.Single)\">\r\n            <summary>\r\n            Scale the image to an absolute height.\r\n            </summary>\r\n            <param name=\"newHeight\">the new height</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScalePercent(System.Single)\">\r\n            <summary>\r\n            Scale the image to a certain percentage.\r\n            </summary>\r\n            <param name=\"percent\">the scaling percentage</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScalePercent(System.Single,System.Single)\">\r\n            <summary>\r\n            Scale the width and height of an image to a certain percentage.\r\n            </summary>\r\n            <param name=\"percentX\">the scaling percentage of the width</param>\r\n            <param name=\"percentY\">the scaling percentage of the height</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScaleToFit(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Scales the images to the dimensions of the rectangle.\r\n            </summary>\r\n            <param name=\"rectangle\">the dimensions to fit</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.ScaleToFit(System.Single,System.Single)\">\r\n            <summary>\r\n            Scales the image so that it fits a certain width and height.\r\n            </summary>\r\n            <param name=\"fitWidth\">the width to fit</param>\r\n            <param name=\"fitHeight\">the height to fit</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetImageRotation\">\r\n            Gets the current image rotation in radians.\r\n            @return the current image rotation in radians\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Rotation\">\r\n            <summary>\r\n            Sets the rotation of the image in radians.\r\n            </summary>\r\n            <param name=\"r\">rotation in radians</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.RotationDegrees\">\r\n            <summary>\r\n            Sets the rotation of the image in degrees.\r\n            </summary>\r\n            <param name=\"deg\">rotation in degrees</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Annotation\">\r\n            <summary>\r\n            Get/set the annotation.\r\n            </summary>\r\n            <value>the Annotation</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Bpc\">\r\n            <summary>\r\n            Gets the bpc for the image.\r\n            </summary>\r\n            <remarks>\r\n            this only makes sense for Images of the type RawImage.\r\n            </remarks>\r\n            <value>a bpc value</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.RawData\">\r\n            <summary>\r\n            Gets the raw data for the image.\r\n            </summary>\r\n            <remarks>\r\n            this only makes sense for Images of the type RawImage.\r\n            </remarks>\r\n            <value>the raw data</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.TemplateData\">\r\n            <summary>\r\n            Get/set the template to be used as an image.\r\n            </summary>\r\n            <remarks>\r\n            this only makes sense for Images of the type ImgTemplate.\r\n            </remarks>\r\n            <value>the template</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.HasAbsolutePosition\">\r\n            <summary>\r\n            Checks if the Images has to be added at an absolute position.\r\n            </summary>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.HasAbsoluteX\">\r\n            <summary>\r\n            Checks if the Images has to be added at an absolute X position.\r\n            </summary>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.AbsoluteX\">\r\n            <summary>\r\n            Returns the absolute X position.\r\n            </summary>\r\n            <value>a position</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.AbsoluteY\">\r\n            <summary>\r\n            Returns the absolute Y position.\r\n            </summary>\r\n            <value>a position</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Type\">\r\n            <summary>\r\n            Returns the type.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.IsJpeg\">\r\n            <summary>\r\n            Returns true if the image is a Jpeg-object.\r\n            </summary>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.IsImgRaw\">\r\n            <summary>\r\n            Returns true if the image is a ImgRaw-object.\r\n            </summary>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.IsImgTemplate\">\r\n            <summary>\r\n            Returns true if the image is an ImgTemplate-object.\r\n            </summary>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Url\">\r\n            <summary>\r\n            Gets the string-representation of the reference to the image.\r\n            </summary>\r\n            <value>a string</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Alignment\">\r\n            <summary>\r\n            Get/set the alignment for the image.\r\n            </summary>\r\n            <value>a value</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Alt\">\r\n            <summary>\r\n            Get/set the alternative text for the image.\r\n            </summary>\r\n            <value>a string</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.ScaledWidth\">\r\n            <summary>\r\n            Gets the scaled width of the image.\r\n            </summary>\r\n            <value>a value</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.ScaledHeight\">\r\n            <summary>\r\n            Gets the scaled height of the image.\r\n            </summary>\r\n            <value>a value</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Colorspace\">\r\n            <summary>\r\n            Gets the colorspace for the image.\r\n            </summary>\r\n            <remarks>\r\n            this only makes sense for Images of the type Jpeg.\r\n            </remarks>\r\n            <value>a colorspace value</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetMatrix\">\r\n            <summary>\r\n            Returns the transformation matrix of the image.\r\n            </summary>\r\n            <value>an array [AX, AY, BX, BY, CX, CY, DX, DY]</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetMatrix(System.Single)\">\r\n             Returns the transformation matrix of the image.\r\n            \r\n             @return an array [AX, AY, BX, BY, CX, CY, DX, DY]\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Transparency\">\r\n            <summary>\r\n            Returns the transparency.\r\n            </summary>\r\n            <value>the transparency</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.PlainWidth\">\r\n            <summary>\r\n            Gets the plain width of the image.\r\n            </summary>\r\n            <value>a value</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.PlainHeight\">\r\n            <summary>\r\n            Gets the plain height of the image.\r\n            </summary>\r\n            <value>a value</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.GetSerialId\">\r\n            <summary>\r\n            generates new serial id\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.MySerialId\">\r\n            <summary>\r\n            returns serial id for this object\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.DpiX\">\r\n            <summary>\r\n            Gets the dots-per-inch in the X direction. Returns 0 if not available.\r\n            </summary>\r\n            <value>the dots-per-inch in the X direction</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.DpiY\">\r\n            <summary>\r\n            Gets the dots-per-inch in the Y direction. Returns 0 if not available.\r\n            </summary>\r\n            <value>the dots-per-inch in the Y direction</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.SetDpi(System.Int32,System.Int32)\">\r\n            Sets the dots per inch value\r\n            \r\n            @param dpiX\r\n                       dpi for x coordinates\r\n            @param dpiY\r\n                       dpi for y coordinates\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.IsMaskCandidate\">\r\n            <summary>\r\n            Returns true if this Image has the\r\n            requisites to be a mask.\r\n            </summary>\r\n            <returns>true if this Image can be a mask</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.MakeMask\">\r\n            <summary>\r\n            Make this Image a mask.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.ImageMask\">\r\n            <summary>\r\n            Get/set the explicit masking.\r\n            </summary>\r\n            <value>the explicit masking</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.IsMask\">\r\n            <summary>\r\n            Returns true if this Image is a mask.\r\n            </summary>\r\n            <returns>true if this Image is a mask</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Inverted\">\r\n            <summary>\r\n            Inverts the meaning of the bits of a mask.\r\n            </summary>\r\n            <value>true to invert the meaning of the bits of a mask</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.Interpolation\">\r\n            <summary>\r\n            Sets the image interpolation. Image interpolation attempts to\r\n            produce a smooth transition between adjacent sample values.\r\n            </summary>\r\n            <value>New value of property interpolation.</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.TagICC\">\r\n            Tags this image with an ICC profile.\r\n            @param profile the profile\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.HasICCProfile\">\r\n            Checks is the image has an ICC profile.\r\n            @return the ICC profile or null\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.scaleToFitLineWhenOverflow\">\r\n            Indicates if the image should be scaled to fit the line\r\n            when the image exceeds the available width.\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Image.scaleToFitHeight\">\r\n            Indicates if the image should be scaled to fit\r\n            when the image exceeds the available height.\r\n            @since iText 5.4.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.ScaleToFitHeight\">\r\n            Gets and sets the value of scaleToFitHeight.\r\n            @return true if the image size has to scale to the available height\r\n            @since iText 5.4.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Image.SimplifyColorspace\">\r\n            Replaces CalRGB and CalGray colorspaces with DeviceRGB and DeviceGray.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.InitialRotation\">\r\n            Some image formats, like TIFF may present the images rotated that have\r\n            to be compensated.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Image.CompressionLevel\">\r\n            Sets the compression level to be used if the image is written as a compressed stream.\r\n            @param compressionLevel a value between 0 (best speed) and 9 (best compression)\r\n            @since   2.1.3\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ImgCCITT\">\r\n             CCITT Image data that has to be inserted into the document\r\n            \r\n             @see        Element\r\n             @see        Image\r\n            \r\n             @author  Paulo Soares\r\n            <summary>\r\n            CCITT Image data that has to be inserted into the document\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Image\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgCCITT.#ctor(System.Int32,System.Int32,System.Boolean,System.Int32,System.Int32,System.Byte[])\">\r\n            <summary>\r\n            Creats an Image in CCITT mode.\r\n            </summary>\r\n            <param name=\"width\">the exact width of the image</param>\r\n            <param name=\"height\">the exact height of the image</param>\r\n            <param name=\"reverseBits\">\r\n            reverses the bits in data.\r\n            Bit 0 is swapped with bit 7 and so on\r\n            </param>\r\n            <param name=\"typeCCITT\">\r\n            the type of compression in data. It can be\r\n            CCITTG4, CCITTG31D, CCITTG32D\r\n            </param>\r\n            <param name=\"parameters\">\r\n            parameters associated with this stream. Possible values are\r\n            CCITT_BLACKIS1, CCITT_ENCODEDBYTEALIGN, CCITT_ENDOFLINE and CCITT_ENDOFBLOCK or a\r\n            combination of them\r\n            </param>\r\n            <param name=\"data\">the image data</param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ImgJBIG2\">\r\n            Support for JBIG2 images.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.ImgJBIG2.global\">\r\n            JBIG2 globals \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.ImgJBIG2.globalHash\">\r\n            A unique hash \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgJBIG2.#ctor(iTextSharp.text.Image)\">\r\n            Copy contstructor.\r\n            @param    image another Image\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgJBIG2.#ctor\">\r\n            Empty constructor.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgJBIG2.#ctor(System.Int32,System.Int32,System.Byte[],System.Byte[])\">\r\n            Actual constructor for ImgJBIG2 images.\r\n            @param    width   the width of the image\r\n            @param    height  the height of the image\r\n            @param    data    the raw image data\r\n            @param    globals JBIG2 globals\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ImgJBIG2.GlobalBytes\">\r\n            Getter for the JBIG2 global data.\r\n            @return   an array of bytes\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ImgJBIG2.GlobalHash\">\r\n            Getter for the unique hash.\r\n            @return   an array of bytes\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ImgRaw\">\r\n            <summary>\r\n            Raw Image data that has to be inserted into the document\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Image\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgRaw.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Byte[])\">\r\n            <summary>\r\n            Creats an Image in raw mode.\r\n            </summary>\r\n            <param name=\"width\">the exact width of the image</param>\r\n            <param name=\"height\">the exact height of the image</param>\r\n            <param name=\"components\">1,3 or 4 for GrayScale, RGB and CMYK</param>\r\n            <param name=\"bpc\">bits per component. Must be 1,2,4 or 8</param>\r\n            <param name=\"data\">data the image data</param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ImgTemplate\">\r\n            <summary>\r\n            PdfTemplate that has to be inserted into the document\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Image\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgTemplate.#ctor(iTextSharp.text.Image)\">\r\n            <summary>\r\n            Creats an Image from a PdfTemplate.\r\n            </summary>\r\n            <param name=\"image\">the Image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgTemplate.#ctor(iTextSharp.text.pdf.PdfTemplate)\">\r\n            <summary>\r\n            Creats an Image from a PdfTemplate.\r\n            </summary>\r\n            <param name=\"template\">the PdfTemplate</param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ImgWMF\">\r\n             An ImgWMF is the representation of a windows metafile\r\n             that has to be inserted into the document\r\n            \r\n             @see        Element\r\n             @see        Image\r\n             @see        Gif\r\n             @see        Png\r\n            <summary>\r\n            An ImgWMF is the representation of a windows metafile\r\n            that has to be inserted into the document\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgWMF.#ctor(iTextSharp.text.Image)\">\r\n            <summary>\r\n            Constructs an ImgWMF-object\r\n            </summary>\r\n            <param name=\"image\">a Image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgWMF.#ctor(System.Uri)\">\r\n            <summary>\r\n            Constructs an ImgWMF-object, using an url.\r\n            </summary>\r\n            <param name=\"url\">the URL where the image can be found</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgWMF.#ctor(System.String)\">\r\n            <summary>\r\n            Constructs an ImgWMF-object, using a filename.\r\n            </summary>\r\n            <param name=\"filename\">a string-representation of the file that contains the image.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgWMF.#ctor(System.Byte[])\">\r\n            <summary>\r\n            Constructs an ImgWMF-object from memory.\r\n            </summary>\r\n            <param name=\"img\">the memory image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgWMF.ProcessParameters\">\r\n            <summary>\r\n            This method checks if the image is a valid WMF and processes some parameters.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ImgWMF.ReadWMF(iTextSharp.text.pdf.PdfTemplate)\">\r\n            <summary>\r\n            Reads the WMF into a template.\r\n            </summary>\r\n            <param name=\"template\">the template to read to</param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.ArrayRandomAccessSource\">\r\n            A RandomAccessSource that is based on an underlying byte array \r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.GetBufferedRandomAccessSource\">\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GetBufferedRandomAccessSource.source\">\r\n            The source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GetBufferedRandomAccessSource.#ctor(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Constructs a new OffsetRandomAccessSource\r\n            @param source the source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GetBufferedRandomAccessSource.Get(System.Int64)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GetBufferedRandomAccessSource.Get(System.Int64,System.Byte[],System.Int32,System.Int32)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.io.GetBufferedRandomAccessSource.Length\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GetBufferedRandomAccessSource.Close\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.GroupedRandomAccessSource\">\r\n            A RandomAccessSource that is based on a set of underlying sources, treating the sources as if they were a contiguous block of data.\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.sources\">\r\n            The underlying sources (along with some meta data to quickly determine where each source begins and ends)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.currentSourceEntry\">\r\n            Cached value to make multiple reads from the same underlying source more efficient\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.size\">\r\n            Cached size of the underlying channel\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.#ctor(System.Collections.Generic.ICollection{iTextSharp.text.io.IRandomAccessSource})\">\r\n            Constructs a new {@link GroupedRandomAccessSource} based on the specified set of sources\r\n            @param sources the sources used to build this group\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.GetStartingSourceIndex(System.Int64)\">\r\n            For a given offset, return the index of the source that contains the specified offset.\r\n            This is an optimization feature to help optimize the access of the correct source without having to iterate\r\n            through every single source each time.  It is safe to always return 0, in which case the full set of sources will be searched.\r\n            Subclasses should override this method if they are able to compute the source index more efficiently (for example {@link FileChannelRandomAccessSource} takes advantage of fixed size page buffers to compute the index) \r\n            @param offset the offset\r\n            @return the index of the input source that contains the specified offset, or 0 if unknown\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.GetSourceEntryForOffset(System.Int64)\">\r\n            Returns the SourceEntry that contains the byte at the specified offset  \r\n            sourceReleased is called as a notification callback so subclasses can take care of cleanup when the source is no longer the active source\r\n            @param offset the offset of the byte to look for\r\n            @return the SourceEntry that contains the byte at the specified offset\r\n            @throws IOException if there is a problem with IO (usually the result of the sourceReleased() call)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.SourceReleased(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Called when a given source is no longer the active source.  This gives subclasses the abilty to release resources, if appropriate. \r\n            @param source the source that is no longer the active source\r\n            @throws IOException if there are any problems\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.SourceInUse(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Called when a given source is about to become the active source.  This gives subclasses the abilty to retrieve resources, if appropriate. \r\n            @param source the source that is about to become the active source\r\n            @throws IOException if there are any problems\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.Get(System.Int64)\">\r\n            {@inheritDoc} \r\n            The source that contains the byte at position is retrieved, the correct offset into that source computed, then the value\r\n            from that offset in the underlying source is returned.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.Get(System.Int64,System.Byte[],System.Int32,System.Int32)\">\r\n            {@inheritDoc} \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.io.GroupedRandomAccessSource.Length\">\r\n            {@inheritDoc} \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.Close\">\r\n            {@inheritDoc}\r\n            Closes all of the underlying sources\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry\">\r\n            Used to track each source, along with useful meta data \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry.source\">\r\n            The underlying source\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry.firstByte\">\r\n            The first byte (in the coordinates of the GroupedRandomAccessSource) that this source contains\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry.lastByte\">\r\n            The last byte (in the coordinates of the GroupedRandomAccessSource) that this source contains\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry.index\">\r\n            The index of this source in the GroupedRandomAccessSource\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry.#ctor(System.Int32,iTextSharp.text.io.IRandomAccessSource,System.Int64)\">\r\n            Standard constructor\r\n            @param index the index\r\n            @param source the source\r\n            @param offset the offset of the source in the GroupedRandomAccessSource\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.GroupedRandomAccessSource.SourceEntry.OffsetN(System.Int64)\">\r\n            Given an absolute offset (in the GroupedRandomAccessSource coordinates), calculate the effective offset in the underlying source\r\n            @param absoluteOffset the offset in the parent GroupedRandomAccessSource\r\n            @return the effective offset in the underlying source\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.IndependentRandomAccessSource\">\r\n            A RandomAccessSource that is wraps another RandomAccessSouce but does not propagate close().  This is useful when\r\n            passing a RandomAccessSource to a method that would normally close the source.\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.IndependentRandomAccessSource.source\">\r\n            The source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IndependentRandomAccessSource.#ctor(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Constructs a new OffsetRandomAccessSource\r\n            @param source the source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IndependentRandomAccessSource.Get(System.Int64)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IndependentRandomAccessSource.Get(System.Int64,System.Byte[],System.Int32,System.Int32)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.io.IndependentRandomAccessSource.Length\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IndependentRandomAccessSource.Close\">\r\n            Does nothing - the underlying source is not closed\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.IRandomAccessSource\">\r\n            Represents an abstract source that bytes can be read from.  This class forms the foundation for all byte input in iText. \r\n            Implementations do not keep track of a current 'position', but rather provide absolute get methods.  Tracking position\r\n            should be handled in classes that use RandomAccessSource internally (via composition).\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IRandomAccessSource.Get(System.Int64)\">\r\n            Gets a byte at the specified position\r\n            @param position\r\n            @return the byte, or -1 if EOF is reached\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IRandomAccessSource.Get(System.Int64,System.Byte[],System.Int32,System.Int32)\">\r\n            Gets an array at the specified position.  If the number of bytes requested cannot be read, the bytes that can be\r\n            read will be placed in bytes and the number actually read will be returned.\r\n            @param position the position in the RandomAccessSource to read from\r\n            @param bytes output buffer\r\n            @param off offset into the output buffer where results will be placed\r\n            @param len the number of bytes to read\r\n            @return the number of bytes actually read, or -1 if the file is at EOF\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.io.IRandomAccessSource.Length\">\r\n            @return the length of this source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.IRandomAccessSource.Close\">\r\n            Closes this source.  The underlying data structure or source (if any) will also be closed\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.RAFRandomAccessSource\">\r\n            \r\n            A RandomAccessSource that uses a {@link RandomAccessFile} as it's source\r\n            Note: Unlike most of the RandomAccessSource implementations, this class is not thread safe\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RAFRandomAccessSource.raf\">\r\n            The source\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RAFRandomAccessSource.length\">\r\n            The length of the underling RAF.  Note that the length is cached at construction time to avoid the possibility\r\n            of IOExceptions when reading the length.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RAFRandomAccessSource.#ctor(System.IO.FileStream)\">\r\n            Creates this object\r\n            @param raf the source for this RandomAccessSource\r\n            @throws IOException if the RAF can't be read\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RAFRandomAccessSource.Get(System.Int64)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RAFRandomAccessSource.Get(System.Int64,System.Byte[],System.Int32,System.Int32)\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.io.RAFRandomAccessSource.Length\">\r\n            {@inheritDoc}\r\n            Note: the length is determined when the {@link RAFRandomAccessSource} is constructed.  If the file length changes\r\n            after construction, that change will not be reflected in this call.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RAFRandomAccessSource.Close\">\r\n            Closes the underlying RandomAccessFile\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.RandomAccessSourceFactory\">\r\n             Factory to create {@link RandomAccessSource} objects based on various types of sources\r\n             @since 5.3.5\r\n            \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RandomAccessSourceFactory.forceRead\">\r\n            whether the full content of the source should be read into memory at construction\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RandomAccessSourceFactory.usePlainRandomAccess\">\r\n            Whether {@link RandomAccessFile} should be used instead of a {@link FileChannel}, where applicable\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RandomAccessSourceFactory.exclusivelyLockFile\">\r\n            Whether the underlying file should have a RW lock on it or just an R lock\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.#ctor\">\r\n            Creates a factory that will give preference to accessing the underling data source using memory mapped files\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.SetForceRead(System.Boolean)\">\r\n            Determines whether the full content of the source will be read into memory\r\n            @param forceRead true if the full content will be read, false otherwise\r\n            @return this object (this allows chaining of method calls)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.CreateSource(System.Byte[])\">\r\n            Creates a {@link RandomAccessSource} based on a byte array\r\n            @param data the byte array\r\n            @return the newly created {@link RandomAccessSource}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.CreateSource(System.Uri)\">\r\n            Creates a {@link RandomAccessSource} based on a URL.  The data available at the URL is read into memory and used\r\n            as the source for the {@link RandomAccessSource}\r\n            @param url the url to read from\r\n            @return the newly created {@link RandomAccessSource}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.CreateSource(System.IO.Stream)\">\r\n            Creates a {@link RandomAccessSource} based on an {@link InputStream}.  The full content of the InputStream is read into memory and used\r\n            as the source for the {@link RandomAccessSource}\r\n            @param is the stream to read from\r\n            @return the newly created {@link RandomAccessSource}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.CreateBestSource(System.String)\">\r\n            Creates a {@link RandomAccessSource} based on a filename string.\r\n            If the filename describes a URL, a URL based source is created\r\n            If the filename describes a file on disk, the contents may be read into memory (if forceRead is true), opened using memory mapped file channel (if usePlainRandomAccess is false), or opened using {@link RandomAccessFile} access (if usePlainRandomAccess is true)\r\n            This call will automatically failover to using {@link RandomAccessFile} if the memory map operation fails\r\n            @param filename the name of the file or resource to create the {@link RandomAccessSource} for\r\n            @return the newly created {@link RandomAccessSource}\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.CreateByReadingToMemory(System.String)\">\r\n            Creates a new {@link RandomAccessSource} by reading the specified file/resource into memory\r\n            @param filename the name of the resource to read\r\n            @return the newly created {@link RandomAccessSource}\r\n            @throws IOException if reading the underling file or stream fails\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RandomAccessSourceFactory.CreateByReadingToMemory(System.IO.Stream)\">\r\n            Creates a new {@link RandomAccessSource} by reading the specified file/resource into memory\r\n            @param filename the name of the resource to read\r\n            @return the newly created {@link RandomAccessSource}\r\n            @throws IOException if reading the underling file or stream fails\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.RASInputStream\">\r\n            An input stream that uses a RandomAccessSource as it's underlying source \r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RASInputStream.source\">\r\n            The source\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.RASInputStream.position\">\r\n            The current position in the source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.RASInputStream.#ctor(iTextSharp.text.io.IRandomAccessSource)\">\r\n            Creates an input stream based on the source\r\n            @param source the source\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.StreamUtil\">\r\n             Utility class with commonly used stream operations\r\n             @since 5.3.5\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.StreamUtil.InputStreamToArray(System.IO.Stream)\">\r\n            Reads the full content of a stream and returns them in a byte array\r\n            @param is the stream to read\r\n            @return a byte array containing all of the bytes from the stream\r\n            @throws IOException if there is a problem reading from the input stream\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.StreamUtil.GetResourceStream(System.String)\">\r\n            Gets the font resources.\r\n            @param key the name of the resource\r\n            @return the <CODE>Stream</CODE> to get the resource or\r\n            <CODE>null</CODE> if not found\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.io.WindowRandomAccessSource\">\r\n            A RandomAccessSource that wraps another RandomAccessSouce and provides a window of it at a specific offset and over\r\n            a specific length.  Position 0 becomes the offset position in the underlying source.\r\n            @since 5.3.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.WindowRandomAccessSource.source\">\r\n            The source\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.WindowRandomAccessSource.offset\">\r\n            The amount to offset the source by\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.io.WindowRandomAccessSource.length\">\r\n            The length\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.WindowRandomAccessSource.#ctor(iTextSharp.text.io.IRandomAccessSource,System.Int64)\">\r\n            Constructs a new OffsetRandomAccessSource that extends to the end of the underlying source\r\n            @param source the source\r\n            @param offset the amount of the offset to use\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.WindowRandomAccessSource.#ctor(iTextSharp.text.io.IRandomAccessSource,System.Int64,System.Int64)\">\r\n            Constructs a new OffsetRandomAccessSource with an explicit length\r\n            @param source the source\r\n            @param offset the amount of the offset to use\r\n            @param length the number of bytes to be included in this RAS\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.WindowRandomAccessSource.Get(System.Int64)\">\r\n            {@inheritDoc}\r\n            Note that the position will be adjusted to read from the corrected location in the underlying source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.WindowRandomAccessSource.Get(System.Int64,System.Byte[],System.Int32,System.Int32)\">\r\n            {@inheritDoc}\r\n            Note that the position will be adjusted to read from the corrected location in the underlying source\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.io.WindowRandomAccessSource.Length\">\r\n            {@inheritDoc}\r\n            Note that the length will be adjusted to read from the corrected location in the underlying source\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.io.WindowRandomAccessSource.Close\">\r\n            {@inheritDoc}\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.IRtfElementInterface\">\r\n            The RTF jar depends on the iText jar, but the iText jar may not\r\n            depend on the RTF jar. This interface offers a temporary solution\r\n            until we find a more elegant way to solve this.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ISplitCharacter\">\r\n            <summary>\r\n            Interface for customizing the split character.\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.ISplitCharacter.IsSplitCharacter(System.Int32,System.Int32,System.Int32,System.Char[],iTextSharp.text.pdf.PdfChunk[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.ITextElementArray\">\r\n            <summary>\r\n            Interface for a text element to which other objects can be added.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Phrase\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Paragraph\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Section\"/>\r\n            <seealso cref=\"T:iTextSharp.text.ListItem\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Chapter\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Anchor\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Cell\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ITextElementArray.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds an object to the TextElementArray.\r\n            </summary>\r\n            <param name=\"o\">an object that has to be added</param>\r\n            <returns>true if the addition succeeded; false otherwise</returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Jpeg\">\r\n            <summary>\r\n            An Jpeg is the representation of a graphic element (JPEG)\r\n            that has to be inserted into the document\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Image\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Gif\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Png\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.NOT_A_MARKER\">\r\n            <summary> This is a type of marker. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.VALID_MARKER\">\r\n            <summary> This is a type of marker. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.VALID_MARKERS\">\r\n            <summary> Acceptable Jpeg markers. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.UNSUPPORTED_MARKER\">\r\n            <summary> This is a type of marker. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.UNSUPPORTED_MARKERS\">\r\n            <summary> Unsupported Jpeg markers. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.NOPARAM_MARKER\">\r\n            <summary> This is a type of marker. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.NOPARAM_MARKERS\">\r\n            <summary> Jpeg markers without additional parameters. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.M_APPD\">\r\n            Marker value for Photoshop IRB \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Jpeg.PS_8BIM_RESO\">\r\n            sequence preceding Photoshop resolution data \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.#ctor(iTextSharp.text.Image)\">\r\n            <summary>\r\n            Construct a Jpeg-object, using a Image\r\n            </summary>\r\n            <param name=\"image\">a Image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.#ctor(System.Uri)\">\r\n            <summary>\r\n            Constructs a Jpeg-object, using an Uri.\r\n            </summary>\r\n            <remarks>\r\n            Deprecated, use Image.GetInstance(...) to create an Image\r\n            </remarks>\r\n            <param name=\"Uri\">the Uri where the image can be found</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.#ctor(System.Byte[])\">\r\n            <summary>\r\n            Constructs a Jpeg-object from memory.\r\n            </summary>\r\n            <param name=\"img\">the memory image</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.#ctor(System.Byte[],System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a Jpeg-object from memory.\r\n            </summary>\r\n            <param name=\"img\">the memory image.</param>\r\n            <param name=\"width\">the width you want the image to have</param>\r\n            <param name=\"height\">the height you want the image to have</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.GetShort(System.IO.Stream)\">\r\n            <summary>\r\n            Reads a short from the Stream.\r\n            </summary>\r\n            <param name=\"istr\">the Stream</param>\r\n            <returns>an int</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.GetShortInverted(System.IO.Stream)\">\r\n            <summary>\r\n            Reads an inverted short from the Stream.\r\n            </summary>\r\n            <param name=\"istr\">the Stream</param>\r\n            <returns>an int</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.MarkerType(System.Int32)\">\r\n            <summary>\r\n            Returns a type of marker.\r\n            </summary>\r\n            <param name=\"marker\">an int</param>\r\n            <returns>a type: VALID_MARKER, UNSUPPORTED_MARKER or NOPARAM_MARKER</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg.ProcessParameters\">\r\n            <summary>\r\n            This method checks if the image is a valid JPEG and processes some parameters.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Jpeg2000\">\r\n             An <CODE>Jpeg2000</CODE> is the representation of a graphic element (JPEG)\r\n             that has to be inserted into the document\r\n            \r\n             @see\t\tElement\r\n             @see\t\tImage\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg2000.#ctor(System.Uri)\">\r\n             Constructs a <CODE>Jpeg2000</CODE>-object, using an <VAR>url</VAR>.\r\n            \r\n             @param\t\turl\t\t\tthe <CODE>URL</CODE> where the image can be found\r\n             @throws BadElementException\r\n             @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg2000.#ctor(System.Byte[])\">\r\n             Constructs a <CODE>Jpeg2000</CODE>-object from memory.\r\n            \r\n             @param\t\timg\t\tthe memory image\r\n             @throws BadElementException\r\n             @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg2000.#ctor(System.Byte[],System.Single,System.Single)\">\r\n             Constructs a <CODE>Jpeg2000</CODE>-object from memory.\r\n            \r\n             @param\t\timg\t\t\tthe memory image.\r\n             @param\t\twidth\t\tthe width you want the image to have\r\n             @param\t\theight\t\tthe height you want the image to have\r\n             @throws BadElementException\r\n             @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg2000.ProcessParameters\">\r\n            This method checks if the image is a valid JPEG and processes some parameters.\r\n            @throws BadElementException\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Jpeg2000.IsJp2\">\r\n            @return <code>true</code> if the image is JP2, <code>false</code> if a codestream.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.List\">\r\n            <summary>\r\n            A List contains several ListItems.\r\n            </summary>\r\n            <example>\r\n            <B>Example 1:</B>\r\n            <code>\r\n            <strong>List list = new List(true, 20);\r\n            list.Add(new ListItem(\"First line\"));\r\n            list.Add(new ListItem(\"The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?\"));\r\n            list.Add(new ListItem(\"Third line\"));</strong>\r\n            </code>\r\n            \r\n            The result of this code looks like this:\r\n            <OL>\r\n                <LI>\r\n                    First line\r\n                </LI>\r\n                <LI>\r\n                    The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?\r\n                </LI>\r\n                <LI>\r\n                    Third line\r\n                </LI>\r\n            </OL>\r\n            \r\n            <B>Example 2:</B>\r\n            <code>\r\n            <strong>List overview = new List(false, 10);\r\n            overview.Add(new ListItem(\"This is an item\"));\r\n            overview.Add(\"This is another item\");</strong>\r\n            </code>\r\n            \r\n            The result of this code looks like this:\r\n            <UL>\r\n                   <LI>\r\n                       This is an item\r\n                   </LI>\r\n                   <LI>\r\n                       This is another item\r\n                   </LI>\r\n               </UL>\r\n            </example>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.ListItem\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.ORDERED\">\r\n            a possible value for the numbered parameter \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.UNORDERED\">\r\n            a possible value for the numbered parameter \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.NUMERICAL\">\r\n            a possible value for the lettered parameter \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.ALPHABETICAL\">\r\n            a possible value for the lettered parameter \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.UPPERCASE\">\r\n            a possible value for the lettered parameter \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.LOWERCASE\">\r\n            a possible value for the lettered parameter \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.list\">\r\n            <summary> This is the ArrayList containing the different ListItems. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.numbered\">\r\n            Indicates if the list has to be numbered. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.lettered\">\r\n            Indicates if the listsymbols are numerical or alphabetical. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.lowercase\">\r\n            Indicates if the listsymbols are lowercase or uppercase. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.autoindent\">\r\n            Indicates if the indentation has to be set automatically. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.alignindent\">\r\n            Indicates if the indentation of all the items has to be aligned. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.first\">\r\n            <summary> This variable indicates the first number of a numbered list. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.symbol\">\r\n            <summary> This is the listsymbol of a list that is not numbered. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.preSymbol\">\r\n            In case you are using numbered/lettered lists, this String is added before the number/letter.\r\n            @since   iText 2.1.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.postSymbol\">\r\n            In case you are using numbered/lettered lists, this String is added after the number/letter. \r\n            @since   iText 2.1.1\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.indentationLeft\">\r\n            <summary> The indentation of this list on the left side. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.indentationRight\">\r\n            <summary> The indentation of this list on the right side. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.List.symbolIndent\">\r\n            <summary> The indentation of the listitems. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.#ctor\">\r\n            Constructs a <CODE>List</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.#ctor(System.Single)\">\r\n            Constructs a <CODE>List</CODE> with a specific symbol indentation.\r\n            @param   symbolIndent    the symbol indentation\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.#ctor(System.Boolean)\">\r\n             Constructs a <CODE>List</CODE>.\r\n            \r\n             @param    numbered        a bool\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.#ctor(System.Boolean,System.Boolean)\">\r\n             Constructs a <CODE>List</CODE>.\r\n            \r\n             @param    numbered        a bool\r\n             @param lettered has the list to be 'numbered' with letters\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.#ctor(System.Boolean,System.Single)\">\r\n            <summary>\r\n            Constructs a List.\r\n            </summary>\r\n            <remarks>\r\n            the parameter symbolIndent is important for instance when\r\n            generating PDF-documents; it indicates the indentation of the listsymbol.\r\n            </remarks>\r\n            <param name=\"numbered\">a bool</param>\r\n            <param name=\"symbolIndent\">the indentation that has to be used for the listsymbol</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.#ctor(System.Boolean,System.Boolean,System.Single)\">\r\n            <summary>\r\n            Constructs a List.\r\n            </summary>\r\n            <param name=\"numbered\">a bool</param>\r\n            <param name=\"lettered\">a bool</param>\r\n            <param name=\"symbolIndent\">the indentation that has to be used for the listsymbol</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds an Object to the List.\r\n            </summary>\r\n            <param name=\"o\">the object to add</param>\r\n            <returns>true is successful</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.NormalizeIndentation\">\r\n            Makes sure all the items in the list have the same indentation. \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.IsLowercase\">\r\n            <summary>\r\n            Alias for VB.NET compatibility.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.First\">\r\n            <summary>\r\n            Get/set the first number\r\n            </summary>\r\n            <value>an int</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.ListSymbol\">\r\n            <summary>\r\n            Sets the symbol\r\n            </summary>\r\n            <value>a Chunk</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.SetListSymbol(System.String)\">\r\n            <summary>\r\n            Sets the listsymbol.\r\n            </summary>\r\n            <remarks>\r\n            This is a shortcut for SetListSymbol(Chunk symbol).\r\n            </remarks>\r\n            <param name=\"symbol\">a string</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.IndentationLeft\">\r\n            <summary>\r\n            Get/set the indentation of this paragraph on the left side.\r\n            </summary>\r\n            <value>the indentation</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.IndentationRight\">\r\n            <summary>\r\n            Get/set the indentation of this paragraph on the right side.\r\n            </summary>\r\n            <value>the indentation</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.SymbolIndent\">\r\n            <summary>\r\n            Gets the symbol indentation.\r\n            </summary>\r\n            <value>the symbol indentation</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.Items\">\r\n            <summary>\r\n            Gets all the items in the list.\r\n            </summary>\r\n            <value>an ArrayList containing ListItems</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.Size\">\r\n            <summary>\r\n            Gets the size of the list.\r\n            </summary>\r\n            <value>a size</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.IsEmpty\">\r\n            Returns <CODE>true</CODE> if the list is empty.\r\n            \r\n            @return <CODE>true</CODE> if the list is empty\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.TotalLeading\">\r\n            <summary>\r\n            Gets the leading of the first listitem.\r\n            </summary>\r\n            <value>a leading</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.Symbol\">\r\n            <summary>\r\n            Get/set the symbol indentation.\r\n            </summary>\r\n            <value>a Chunk</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.List.getPostSymbol\">\r\n            Returns the String that is after a number or letter in the list symbol.\r\n            @return\tthe String that is after a number or letter in the list symbol\r\n            @since\tiText 2.1.1\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.PostSymbol\">\r\n            Sets the String that has to be added after a number or letter in the list symbol.\r\n            @since\tiText 2.1.1\r\n            @param\tpostSymbol the String that has to be added after a number or letter in the list symbol.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.List.PreSymbol\">\r\n            Sets the String that has to be added before a number or letter in the list symbol.\r\n            @since\tiText 2.1.1\r\n            @param\tpreSymbol the String that has to be added before a number or letter in the list symbol.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ListItem\">\r\n            <summary>\r\n            A ListItem is a Paragraph\r\n            that can be added to a List.\r\n            </summary>\r\n            <example>\r\n            <B>Example 1:</B>\r\n            <code>\r\n            List list = new List(true, 20);\r\n            list.Add(<strong>new ListItem(\"First line\")</strong>);\r\n            list.Add(<strong>new ListItem(\"The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?\")</strong>);\r\n            list.Add(<strong>new ListItem(\"Third line\")</strong>);\r\n            </code>\r\n            \r\n            The result of this code looks like this:\r\n            <OL>\r\n                   <LI>\r\n                       First line\r\n                   </LI>\r\n                   <LI>\r\n                       The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?\r\n                   </LI>\r\n                   <LI>\r\n                       Third line\r\n                   </LI>\r\n               </OL>\r\n               \r\n            <B>Example 2:</B>\r\n            <code>\r\n            List overview = new List(false, 10);\r\n            overview.Add(<strong>new ListItem(\"This is an item\")</strong>);\r\n            overview.Add(\"This is another item\");\r\n            </code>\r\n            \r\n            The result of this code looks like this:\r\n            <UL>\r\n                   <LI>\r\n                       This is an item\r\n                   </LI>\r\n                   <LI>\r\n                       This is another item\r\n                   </LI>\r\n               </UL>\r\n            </example>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.List\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Paragraph\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.ListItem.symbol\">\r\n            <summary> this is the symbol that wil proceed the listitem. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor\">\r\n            <summary>\r\n            Constructs a ListItem.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(System.Single)\">\r\n            <summary>\r\n               Constructs a ListItem with a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs a ListItem with a certain Chunk.\r\n            </summary>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(System.String)\">\r\n            <summary>\r\n            Constructs a ListItem with a certain string.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs a ListItem with a certain string\r\n            and a certain Font.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(System.Single,iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs a ListItem with a certain Chunk\r\n            and a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(System.Single,System.String)\">\r\n            <summary>\r\n            Constructs a ListItem with a certain string\r\n            and a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(System.Single,System.String,iTextSharp.text.Font)\">\r\n             Constructs a ListItem with a certain leading, string\r\n             and Font.\r\n            \r\n             @param    leading        the leading\r\n             @param    string        a string\r\n             @param    font        a Font\r\n            <summary>\r\n            Constructs a ListItem with a certain leading, string\r\n            and Font.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a Font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.#ctor(iTextSharp.text.Phrase)\">\r\n            <summary>\r\n            Constructs a ListItem with a certain Phrase.\r\n            </summary>\r\n            <param name=\"phrase\">a Phrase</param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ListItem.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ListItem.ListSymbol\">\r\n            <summary>\r\n            Get/set the listsymbol.\r\n            </summary>\r\n            <value>a Chunk</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.SetIndentationLeft(System.Single,System.Boolean)\">\r\n             Sets the indentation of this paragraph on the left side.\r\n            \r\n             @param\tindentation\t\tthe new indentation\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ListItem.AdjustListSymbolFont\">\r\n            Changes the font of the list symbol to the font of the first chunk\r\n            in the list item.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.CounterFactory\">\r\n            Factory that creates a counter for every reader or writer class.\r\n            You can implement your own counter and declare it like this:\r\n            <code>CounterFactory.getInstance().setCounter(new SysoCounter());</code>\r\n            SysoCounter is just an example of a Counter implementation.\r\n            It writes info about files being read and written to the System.out.\r\n            \r\n            This functionality can be used to create metrics in a SaaS context.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.log.CounterFactory.myself\">\r\n            The singleton instance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.log.CounterFactory.counter\">\r\n            The current counter implementation. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.CounterFactory.#ctor\">\r\n            The empty constructor. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.CounterFactory.getInstance\">\r\n            Returns the singleton instance of the factory. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.CounterFactory.GetCounter(System.Type)\">\r\n            Returns a counter factory. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.CounterFactory.GetCounter\">\r\n            Getter for the counter.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.CounterFactory.SetCounter(iTextSharp.text.log.ICounter)\">\r\n            Setter for the counter.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.DefaultCounter\">\r\n            Implementation of the Counter interface that doesn't do anything.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.DefaultCounter.GetCounter(System.Type)\">\r\n            @param klass\r\n            @return this Counter implementation\r\n            @see com.itextpdf.text.log.Counter#getCounter(java.lang.Class)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.DefaultCounter.Read(System.Int64)\">\r\n            @see com.itextpdf.text.log.Counter#read(long)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.DefaultCounter.Written(System.Int64)\">\r\n            @see com.itextpdf.text.log.Counter#written(long)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.ICounter\">\r\n            Interface that can be implemented if you want to count the number of documents\r\n            that are being processed by iText.\r\n            \r\n            Implementers may use this method to record actual system usage for licensing purposes\r\n            (e.g. count the number of documents or the volumne in bytes in the context of a SaaS license).\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ICounter.GetCounter(System.Type)\">\r\n            Gets a Counter instance for a specific class. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ICounter.Read(System.Int64)\">\r\n            This method gets triggered if a file is read.\r\n            @param l\tthe length of the file that was written\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ICounter.Written(System.Int64)\">\r\n            This method gets triggered if a file is written.\r\n            @param l\tthe length of the file that was written \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.NoOpCounter\">\r\n            Implementation of the Counter interface that doesn't do anything.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.NoOpCounter.GetCounter(System.Type)\">\r\n            @param klass The Class asking for the Counter\r\n            @return the Counter instance\r\n            @see com.itextpdf.text.log.Counter#getCounter(java.lang.Class)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.NoOpCounter.Read(System.Int64)\">\r\n            @see com.itextpdf.text.log.Counter#read(long)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.NoOpCounter.Written(System.Int64)\">\r\n            @see com.itextpdf.text.log.Counter#written(long)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.log.SysoCounter.name\">\r\n            The name of the class for which the Counter was created\r\n            (or iText if no name is available)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoCounter.#ctor\">\r\n            Empty SysoCounter constructor.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoCounter.#ctor(System.Type)\">\r\n            Constructs a SysoCounter for a specific class.\r\n            @param klass\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoCounter.GetCounter(System.Type)\">\r\n            @see com.itextpdf.text.log.Counter#getCounter(java.lang.Class)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoCounter.Read(System.Int64)\">\r\n            @see com.itextpdf.text.log.Counter#read(long)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoCounter.Written(System.Int64)\">\r\n            @see com.itextpdf.text.log.Counter#written(long)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.ILogger\">\r\n             Logger interface\r\n             {@link LoggerFactory#setLogger(Logger)}.\r\n            \r\n             @author redlab_b\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.GetLogger(System.Type)\">\r\n            @param klass\r\n            @return the logger for the given klass\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.IsLogging(iTextSharp.text.log.Level)\">\r\n            @param level\r\n            @return true if there should be logged for the given level\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.Warn(System.String)\">\r\n            Log a warning message.\r\n            @param message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.Trace(System.String)\">\r\n            Log a trace message.\r\n            @param message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.Debug(System.String)\">\r\n            Log a debug message.\r\n            @param message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.Info(System.String)\">\r\n            Log an info message.\r\n            @param message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.Error(System.String)\">\r\n            Log an error message.\r\n            @param message\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.ILogger.Error(System.String,System.Exception)\">\r\n            Log an error message and exception.\r\n            @param message\r\n            @param e\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.Level\">\r\n             The different log levels.\r\n             @author redlab_b\r\n            \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.LoggerFactory\">\r\n             LoggerFactory can be used to set a logger. The logger should be created by\r\n             implementing {@link Logger}. In the implementation users can choose how they\r\n             log received messages. Added for developers. For some cases it can be handy\r\n             to receive logging statements while developing applications with iText\r\n            \r\n             @author redlab_b\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.LoggerFactory.GetLogger(System.Type)\">\r\n            Returns the logger set in this LoggerFactory. Defaults to {@link NoOpLogger}\r\n            @param klass\r\n            @return the logger.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.LoggerFactory.GetLogger(System.String)\">\r\n            Returns the logger set in this LoggerFactory. Defaults to {@link NoOpLogger}\r\n            @param name\r\n            @return the logger.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.LoggerFactory.GetInstance\">\r\n            Returns the LoggerFactory\r\n            @return singleton instance of this LoggerFactory\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.LoggerFactory.SetLogger(iTextSharp.text.log.ILogger)\">\r\n             Set the global logger to process logging statements with.\r\n            \r\n             @param logger the logger\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.LoggerFactory.Logger\">\r\n             Get the logger.\r\n            \r\n             @return the logger\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.NoOpLogger\">\r\n             The no-operation logger, it does nothing with the received logging\r\n             statements. And returns false by default for {@link NoOpLogger#isLogging(Level)}\r\n            \r\n             @author redlab_b\r\n            \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.log.SysoLogger\">\r\n             A Simple System.out logger.\r\n             @author redlab_be\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoLogger.#ctor\">\r\n            Defaults packageReduce to 1.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoLogger.#ctor(System.Int32)\">\r\n             Amount of characters each package name should be reduced with.\r\n             @param packageReduce\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoLogger.#ctor(System.String,System.Int32)\">\r\n            @param klass\r\n            @param shorten\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.log.SysoLogger.Shorten(System.String)\">\r\n            @param name2\r\n            @return\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.MarkedObject\">\r\n             Wrapper that allows to add properties to 'basic building block' objects.\r\n             Before iText 1.5 every 'basic building block' implemented the MarkupAttributes interface.\r\n             By setting attributes, you could add markup to the corresponding XML and/or HTML tag.\r\n             This functionality was hardly used by anyone, so it was removed, and replaced by\r\n             the MarkedObject functionality.\r\n            \r\n             @deprecated since 5.5.9. This class is no longer used.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.MarkedObject.element\">\r\n            The element that is wrapped in a MarkedObject. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.MarkedObject.markupAttributes\">\r\n            Contains extra markupAttributes \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedObject.#ctor\">\r\n            This constructor is for internal use only.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedObject.#ctor(iTextSharp.text.IElement)\">\r\n            Creates a MarkedObject.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedObject.Chunks\">\r\n             Gets all the chunks in this element.\r\n            \r\n             @return  an <CODE>ArrayList</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedObject.Process(iTextSharp.text.IElementListener)\">\r\n             Processes the element by adding it (or the different parts) to an\r\n             <CODE>ElementListener</CODE>.\r\n            \r\n             @param       listener        an <CODE>ElementListener</CODE>\r\n             @return <CODE>true</CODE> if the element was processed successfully\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedObject.Type\">\r\n             Gets the type of the text element.\r\n            \r\n             @return  a type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedObject.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedObject.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedObject.MarkupAttributes\">\r\n            @return the markupAttributes\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.MarkedSection\">\r\n             Wrapper that allows to add properties to a Chapter/Section object.\r\n             Before iText 1.5 every 'basic building block' implemented the MarkupAttributes interface.\r\n             By setting attributes, you could add markup to the corresponding XML and/or HTML tag.\r\n             This functionality was hardly used by anyone, so it was removed, and replaced by\r\n             the MarkedObject functionality.\r\n            \r\n             @deprecated since 5.5.9. This class is no longer used.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.MarkedSection.title\">\r\n            This is the title of this section. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.#ctor(iTextSharp.text.Section)\">\r\n            Creates a MarkedObject with a Section or Chapter object.\r\n            @param section   the marked section\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.Add(System.Int32,iTextSharp.text.IElement)\">\r\n             Adds a <CODE>Paragraph</CODE>, <CODE>List</CODE> or <CODE>Table</CODE>\r\n             to this <CODE>Section</CODE>.\r\n            \r\n             @param   index   index at which the specified element is to be inserted\r\n             @param   o       an object of type <CODE>Paragraph</CODE>, <CODE>List</CODE> or <CODE>Table</CODE>=\r\n             @throws  ClassCastException if the object is not a <CODE>Paragraph</CODE>, <CODE>List</CODE> or <CODE>Table</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.Add(iTextSharp.text.IElement)\">\r\n             Adds a <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE> or another <CODE>Section</CODE>\r\n             to this <CODE>Section</CODE>.\r\n            \r\n             @param   o       an object of type <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE> or another <CODE>Section</CODE>\r\n             @return  a bool\r\n             @throws  ClassCastException if the object is not a <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE> or <CODE>Section</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.Process(iTextSharp.text.IElementListener)\">\r\n             Processes the element by adding it (or the different parts) to an\r\n             <CODE>ElementListener</CODE>.\r\n            \r\n             @param       listener        an <CODE>ElementListener</CODE>\r\n             @return <CODE>true</CODE> if the element was processed successfully\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.AddAll``1(System.Collections.Generic.ICollection{``0})\">\r\n             Adds a collection of <CODE>Element</CODE>s\r\n             to this <CODE>Section</CODE>.\r\n            \r\n             @param   collection  a collection of <CODE>Paragraph</CODE>s, <CODE>List</CODE>s and/or <CODE>Table</CODE>s\r\n             @return  <CODE>true</CODE> if the action succeeded, <CODE>false</CODE> if not.\r\n             @throws  ClassCastException if one of the objects isn't a <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.AddSection(System.Single,System.Int32)\">\r\n             Creates a <CODE>Section</CODE>, adds it to this <CODE>Section</CODE> and returns it.\r\n            \r\n             @param   indentation the indentation of the new section\r\n             @param   numberDepth the numberDepth of the section\r\n             @return  a new Section object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.AddSection(System.Single)\">\r\n             Creates a <CODE>Section</CODE>, adds it to this <CODE>Section</CODE> and returns it.\r\n            \r\n             @param   indentation the indentation of the new section\r\n             @return  a new Section object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.AddSection(System.Int32)\">\r\n             Creates a <CODE>Section</CODE>, add it to this <CODE>Section</CODE> and returns it.\r\n            \r\n             @param   numberDepth the numberDepth of the section\r\n             @return  a new Section object\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.AddSection\">\r\n             Creates a <CODE>Section</CODE>, adds it to this <CODE>Section</CODE> and returns it.\r\n            \r\n             @return  a new Section object\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedSection.Title\">\r\n             Sets the title of this section.\r\n            \r\n             @param   title   the new title\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.text.MarkedSection.NumberDepth”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.MarkedSection.IndentationLeft\">\r\n             Sets the indentation of this <CODE>Section</CODE> on the left side.\r\n            \r\n             @param   indentation     the indentation\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedSection.IndentationRight\">\r\n             Sets the indentation of this <CODE>Section</CODE> on the right side.\r\n            \r\n             @param   indentation     the indentation\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedSection.Indentation\">\r\n             Sets the indentation of the content of this <CODE>Section</CODE>.\r\n            \r\n             @param   indentation     the indentation\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedSection.BookmarkOpen\">\r\n            Setter for property bookmarkOpen.\r\n            @param bookmarkOpen false if the bookmark children are not\r\n            visible.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedSection.TriggerNewPage\">\r\n            Setter for property triggerNewPage.\r\n            @param triggerNewPage true if a new page has to be triggered.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.MarkedSection.BookmarkTitle\">\r\n            Sets the bookmark title. The bookmark title is the same as the section title but\r\n            can be changed with this method.\r\n            @param bookmarkTitle the bookmark title\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.MarkedSection.NewPage\">\r\n            Adds a new page to the section.\r\n            @since    2.1.1\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Meta\">\r\n            <summary>\r\n            This is an Element that contains\r\n            some meta information about the document.\r\n            </summary>\r\n            <remarks>\r\n            An object of type Meta can not be constructed by the user.\r\n            Userdefined meta information should be placed in a Header-object.\r\n            Meta is reserved for: Subject, Keywords, Author, Title, Producer\r\n            and Creationdate information.\r\n            </remarks>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Header\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.type\">\r\n            <summary> This is the type of Meta-information this object contains. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.content\">\r\n            <summary> This is the content of the Meta-information. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.UNKNOWN\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.PRODUCER\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.CREATIONDATE\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.AUTHOR\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.KEYWORDS\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.SUBJECT\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Meta.TITLE\">\r\n            The possible value of an alignment attribute.\r\n            @since 5.0.6 (moved from ElementTags)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.#ctor(System.Int32,System.String)\">\r\n            <summary>\r\n            Constructs a Meta.\r\n            </summary>\r\n            <param name=\"type\">the type of meta-information</param>\r\n            <param name=\"content\">the content</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.#ctor(System.String,System.String)\">\r\n            <summary>\r\n            Constructs a Meta.\r\n            </summary>\r\n            <param name=\"tag\">the tagname of the meta-information</param>\r\n            <param name=\"content\">the content</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to a\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">the IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Meta.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Meta.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.Append(System.String)\">\r\n            <summary>\r\n            appends some text to this Meta.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n            <returns>a StringBuilder</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Meta.Content\">\r\n            <summary>\r\n            Returns the content of the meta information.\r\n            </summary>\r\n            <value>a string</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Meta.Name\">\r\n            <summary>\r\n            Returns the name of the meta information.\r\n            </summary>\r\n            <value>a string</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Meta.GetType(System.String)\">\r\n            <summary>\r\n            Returns the name of the meta information.\r\n            </summary>\r\n            <param name=\"tag\">name to match</param>\r\n            <returns>a string</returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.PageSize\">\r\n            <summary>\r\n            The PageSize-object contains a number of read only rectangles representing the most common paper sizes.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.RectangleReadOnly\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LETTER\">\r\n            This is the letter format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.NOTE\">\r\n            This is the note format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LEGAL\">\r\n            This is the legal format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.TABLOID\">\r\n            This is the tabloid format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.EXECUTIVE\">\r\n            This is the executive format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.POSTCARD\">\r\n            This is the postcard format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A0\">\r\n            This is the a0 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A1\">\r\n            This is the a1 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A2\">\r\n            This is the a2 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A3\">\r\n            This is the a3 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A4\">\r\n            This is the a4 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A5\">\r\n            This is the a5 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A6\">\r\n            This is the a6 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A7\">\r\n            This is the a7 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A8\">\r\n            This is the a8 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A9\">\r\n            This is the a9 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A10\">\r\n            This is the a10 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B0\">\r\n            This is the b0 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B1\">\r\n            This is the b1 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B2\">\r\n            This is the b2 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B3\">\r\n            This is the b3 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B4\">\r\n            This is the b4 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B5\">\r\n            This is the b5 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B6\">\r\n            This is the b6 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B7\">\r\n            This is the b7 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B8\">\r\n            This is the b8 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B9\">\r\n            This is the b9 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.B10\">\r\n            This is the b10 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ARCH_E\">\r\n            This is the archE format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ARCH_D\">\r\n            This is the archD format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ARCH_C\">\r\n            This is the archC format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ARCH_B\">\r\n            This is the archB format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ARCH_A\">\r\n            This is the archA format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.FLSA\">\r\n            This is the American Foolscap format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.FLSE\">\r\n            This is the European Foolscap format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.HALFLETTER\">\r\n            This is the halfletter format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize._11X17\">\r\n            This is the 11x17 format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ID_1\">\r\n            This is the ISO 7810 ID-1 format (85.60 x 53.98 mm or 3.370 x 2.125 inch) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ID_2\">\r\n            This is the ISO 7810 ID-2 format (A7 rotated) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ID_3\">\r\n            This is the ISO 7810 ID-3 format (B7 rotated) \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LEDGER\">\r\n            This is the ledger format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.CROWN_QUARTO\">\r\n            This is the Crown Quarto format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LARGE_CROWN_QUARTO\">\r\n            This is the Large Crown Quarto format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.DEMY_QUARTO\">\r\n            This is the Demy Quarto format. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ROYAL_QUARTO\">\r\n            This is the Royal Quarto format. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.CROWN_OCTAVO\">\r\n            This is the Crown Octavo format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LARGE_CROWN_OCTAVO\">\r\n            This is the Large Crown Octavo format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.DEMY_OCTAVO\">\r\n            This is the Demy Octavo format \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.ROYAL_OCTAVO\">\r\n            This is the Royal Octavo format. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.SMALL_PAPERBACK\">\r\n            This is the small paperback format. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.PENGUIN_SMALL_PAPERBACK\">\r\n            This is the Pengiun small paperback format. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.PENGUIN_LARGE_PAPERBACK\">\r\n            This is the Penguin large paparback format. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LETTER_LANDSCAPE\">\r\n            This is the letter format\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.LEGAL_LANDSCAPE\">\r\n            This is the legal format\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.PageSize.A4_LANDSCAPE\">\r\n            This is the a4 format\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.PageSize.GetRectangle(System.String)\">\r\n            This method returns a Rectangle based on a String.\r\n            Possible values are the the names of a constant in this class\r\n            (for instance \"A4\", \"LETTER\",...) or a value like \"595 842\"\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Paragraph\">\r\n            <summary>\r\n            A Paragraph is a series of Chunks and/or Phrases.\r\n            </summary>\r\n            <remarks>\r\n            A Paragraph has the same qualities of a Phrase, but also\r\n            some additional layout-parameters:\r\n            <UL>\r\n            <LI/>the indentation\r\n            <LI/>the alignment of the text\r\n            </UL>\r\n            </remarks>\r\n            <example>\r\n            <code>\r\n            <strong>Paragraph p = new Paragraph(\"This is a paragraph\",\r\n                           FontFactory.GetFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new BaseColor(0, 0, 255)));</strong>\r\n               </code>\r\n            </example>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Phrase\"/>\r\n            <seealso cref=\"T:iTextSharp.text.ListItem\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.alignment\">\r\n            <summary> The alignment of the text. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.indentationLeft\">\r\n            <summary> The indentation of this paragraph on the left side. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.indentationRight\">\r\n            <summary> The indentation of this paragraph on the right side. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.firstLineIndent\">\r\n            Holds value of property firstLineIndent.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.spacingBefore\">\r\n            The spacing before the paragraph. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.spacingAfter\">\r\n            The spacing after the paragraph. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.extraParagraphSpace\">\r\n            Holds value of property extraParagraphSpace.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Paragraph.keeptogether\">\r\n            <summary> Does the paragraph has to be kept together on 1 page. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor\">\r\n            <summary>\r\n            Constructs a Paragraph.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(System.Single)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain Chunk.\r\n            </summary>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(System.Single,iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain Chunk\r\n            and a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(System.String)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain string.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain string\r\n            and a certain Font.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a Font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(System.Single,System.String)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain string\r\n            and a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(System.Single,System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain leading, string\r\n            and Font.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a Font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.#ctor(iTextSharp.text.Phrase)\">\r\n            <summary>\r\n            Constructs a Paragraph with a certain Phrase.\r\n            </summary>\r\n            <param name=\"phrase\">a Phrase</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.CloneShallow(System.Boolean)\">\r\n            Creates a shallow clone of the Paragraph.\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.cloneShallow(System.Boolean)\">\r\n            Creates a shallow clone of the Paragraph.\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.BreakUp\">\r\n            Breaks this Paragraph up in different parts, separating paragraphs, lists and tables from each other.\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.breakUp\">\r\n            Breaks this Paragraph up in different parts, separating paragraphs, lists and tables from each other.\r\n            @return\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Paragraph.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Paragraph.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds an Object to the Paragraph.\r\n            </summary>\r\n            <param name=\"o\">the object to add</param>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Paragraph.Alignment\">\r\n            <summary>\r\n            Get/set the alignment of this paragraph.\r\n            </summary>\r\n            <value>a integer</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Paragraph.IndentationLeft\">\r\n            <summary>\r\n            Get/set the indentation of this paragraph on the left side.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Paragraph.IndentationRight\">\r\n            <summary>\r\n            Get/set the indentation of this paragraph on the right side.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Paragraph.KeepTogether\">\r\n            <summary>\r\n            Set/get if this paragraph has to be kept together on one page.\r\n            </summary>\r\n            <value>a bool</value>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Phrase\">\r\n            <summary>\r\n            A Phrase is a series of Chunks.\r\n            </summary>\r\n            <remarks>\r\n            A Phrase has a main Font, but some chunks\r\n            within the phrase can have a Font that differs from the\r\n            main Font. All the Chunks in a Phrase\r\n            have the same leading.\r\n            </remarks>\r\n            <example>\r\n            <code>\r\n            // When no parameters are passed, the default leading = 16\r\n            <strong>Phrase phrase0 = new Phrase();\r\n            Phrase phrase1 = new Phrase(\"this is a phrase\");</strong>\r\n            // In this example the leading is passed as a parameter\r\n            <strong>Phrase phrase2 = new Phrase(16, \"this is a phrase with leading 16\");</strong>\r\n            // When a Font is passed (explicitely or embedded in a chunk), the default leading = 1.5 * size of the font\r\n            <strong>Phrase phrase3 = new Phrase(\"this is a phrase with a red, normal font Courier, size 12\", FontFactory.GetFont(FontFactory.COURIER, 12, Font.NORMAL, new Color(255, 0, 0)));\r\n            Phrase phrase4 = new Phrase(new Chunk(\"this is a phrase\"));\r\n            Phrase phrase5 = new Phrase(18, new Chunk(\"this is a phrase\", FontFactory.GetFont(FontFactory.HELVETICA, 16, Font.BOLD, new Color(255, 0, 0)));</strong>\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Phrase.leading\">\r\n            <summary>This is the leading of this phrase.</summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Phrase.multipliedLeading\">\r\n            The text leading that is multiplied by the biggest font size in the line. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Phrase.font\">\r\n            <summary> This is the font of this phrase. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Phrase.hyphenation\">\r\n            Null, unless the Phrase has to be hyphenated.\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Phrase.tabSettings\">\r\n            Predefined tab position and properties(alignment, leader and etc.);\r\n            @since\t5.4.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor\">\r\n            <summary>\r\n            Constructs a Phrase without specifying a leading.\r\n            </summary>\r\n            <overloads>\r\n            Has nine overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(iTextSharp.text.Phrase)\">\r\n            Copy constructor for <CODE>Phrase</CODE>.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(System.Single)\">\r\n            <summary>\r\n            Constructs a Phrase with a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs a Phrase with a certain Chunk.\r\n            </summary>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(System.Single,iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Constructs a Phrase with a certain Chunk and a certain leading.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"chunk\">a Chunk</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(System.String)\">\r\n            <summary>\r\n            Constructs a Phrase with a certain string.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(System.String,iTextSharp.text.Font)\">\r\n            <summary>\r\n            Constructs a Phrase with a certain string and a certain Font.\r\n            </summary>\r\n            <param name=\"str\">a string</param>\r\n            <param name=\"font\">a Font</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(System.Single,System.String)\">\r\n            <summary>\r\n            Constructs a Phrase with a certain leading and a certain string.\r\n            </summary>\r\n            <param name=\"leading\">the leading</param>\r\n            <param name=\"str\">a string</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            <see cref=\"T:iTextSharp.text.IElementListener\"/>.\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.Add(System.Int32,iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds a Chunk, an Anchor or another Phrase\r\n            to this Phrase.\r\n            </summary>\r\n            <param name=\"index\">index at which the specified element is to be inserted</param>\r\n            <param name=\"o\">an object of type Chunk, Anchor, or Phrase</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.Add(System.String)\">\r\n             Adds a <CODE>String</CODE> to this <CODE>Phrase</CODE>.\r\n            \r\n             @param   s       a string\r\n             @return  a boolean\r\n             @since 5.0.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds a Chunk, Anchor or another Phrase\r\n            to this Phrase.\r\n            </summary>\r\n            <param name=\"o\">an object of type Chunk, Anchor or Phrase</param>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.AddAll``1(System.Collections.Generic.ICollection{``0})\">\r\n            <summary>\r\n            Adds a collection of Chunks\r\n            to this Phrase.\r\n            </summary>\r\n            <param name=\"collection\">a collection of Chunks, Anchors and Phrases.</param>\r\n            <returns>true if the action succeeded, false if not.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.AddChunk(iTextSharp.text.Chunk)\">\r\n            <summary>\r\n            Adds a Chunk.\r\n            </summary>\r\n            <remarks>\r\n            This method is a hack to solve a problem I had with phrases that were split between chunks\r\n            in the wrong place.\r\n            </remarks>\r\n            <param name=\"chunk\">a Chunk</param>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.AddSpecial(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds a Object to the Paragraph.\r\n            </summary>\r\n            <param name=\"obj\">the object to add.</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.IsEmpty\">\r\n            <summary>\r\n            Checks is this Phrase contains no or 1 empty Chunk.\r\n            </summary>\r\n            <returns>\r\n            false if the Phrase\r\n            contains more than one or more non-emptyChunks.\r\n            </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.Phrase.SetLeading(System.Single,System.Single)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.text.Phrase.MultipliedLeading”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.text.Phrase.Leading\">\r\n            <summary>\r\n            Gets/sets the leading of this phrase.\r\n            </summary>\r\n            <value>the linespacing</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.TotalLeading\">\r\n            Gets the total leading.\r\n            This method is based on the assumption that the\r\n            font of the Paragraph is the font of all the elements\r\n            that make part of the paragraph. This isn't necessarily\r\n            true.\r\n            @return the total leading (fixed and multiplied)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.Font\">\r\n            <summary>\r\n            Gets the font of the first Chunk that appears in this Phrase.\r\n            </summary>\r\n            <value>a Font</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.Content\">\r\n            Returns the content as a String object.\r\n            This method differs from toString because toString will return an ArrayList with the toString value of the Chunks in this Phrase.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.Hyphenation\">\r\n            Setter/getter for the hyphenation.\r\n            @param   hyphenation a HyphenationEvent instance\r\n            @since   2.1.2\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Phrase.TabSettings\">\r\n            Setter/getter for the tabSettings.\r\n            @param   tabSettings a TabSettings instance\r\n            @since   5.4.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.#ctor(System.Boolean)\">\r\n            Constructs a Phrase that can be used in the static GetInstance() method.\r\n            @param\tdummy\ta dummy parameter\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.GetInstance(System.String)\">\r\n            Gets a special kind of Phrase that changes some characters into corresponding symbols.\r\n            @param string\r\n            @return a newly constructed Phrase\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.GetInstance(System.Int32,System.String)\">\r\n            Gets a special kind of Phrase that changes some characters into corresponding symbols.\r\n            @param leading\r\n            @param string\r\n            @return a newly constructed Phrase\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Phrase.GetInstance(System.Int32,System.String,iTextSharp.text.Font)\">\r\n            Gets a special kind of Phrase that changes some characters into corresponding symbols.\r\n            @param leading\r\n            @param string\r\n            @param font\r\n            @return a newly constructed Phrase\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Rectangle\">\r\n            <summary>\r\n            A Rectangle is the representation of a geometric figure.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Table\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Cell\"/>\r\n            <seealso cref=\"T:iTextSharp.text.HeaderFooter\"/>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.UNDEFINED\">\r\n            <summary> This is the value that will be used as <VAR>undefined</VAR>. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.TOP_BORDER\">\r\n            <summary> This represents one side of the border of the Rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.BOTTOM_BORDER\">\r\n            <summary> This represents one side of the border of the Rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.LEFT_BORDER\">\r\n            <summary> This represents one side of the border of the Rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.RIGHT_BORDER\">\r\n            <summary> This represents one side of the border of the Rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.NO_BORDER\">\r\n            <summary> This represents a rectangle without borders. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.BOX\">\r\n            <summary> This represents a type of border. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.llx\">\r\n            <summary> the lower left x-coordinate. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.lly\">\r\n            <summary> the lower left y-coordinate. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.urx\">\r\n            <summary> the upper right x-coordinate. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.ury\">\r\n            <summary> the upper right y-coordinate. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.border\">\r\n            <summary> This represents the status of the 4 sides of the rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderWidth\">\r\n            <summary> This is the width of the border around this rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderColor\">\r\n            <summary> This is the color of the border of this rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderColorLeft\">\r\n            The color of the left border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderColorRight\">\r\n            The color of the right border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderColorTop\">\r\n            The color of the top border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderColorBottom\">\r\n            The color of the bottom border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderWidthLeft\">\r\n            The width of the left border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderWidthRight\">\r\n            The width of the right border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderWidthTop\">\r\n            The width of the top border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.borderWidthBottom\">\r\n            The width of the bottom border of this rectangle. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.useVariableBorders\">\r\n            Whether variable width borders are used. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.backgroundColor\">\r\n            <summary> This is the color of the background of this rectangle. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Rectangle.rotation\">\r\n            <summary> This is the rotation value of this rectangle. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.#ctor(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a Rectangle-object.\r\n            </summary>\r\n            <param name=\"llx\">lower left x</param>\r\n            <param name=\"lly\">lower left y</param>\r\n            <param name=\"urx\">upper right x</param>\r\n            <param name=\"ury\">upper right y</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.#ctor(System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n             Constructs a <CODE>Rectangle</CODE>-object.\r\n            \r\n             @param llx   lower left x\r\n             @param lly   lower left y\r\n             @param urx   upper right x\r\n             @param ury   upper right y\r\n             @param rotation the rotation (0, 90, 180, or 270)\r\n             @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.#ctor(System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a Rectangle-object starting from the origin (0, 0).\r\n            </summary>\r\n            <param name=\"urx\">upper right x</param>\r\n            <param name=\"ury\">upper right y</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.#ctor(System.Single,System.Single,System.Int32)\">\r\n             Constructs a <CODE>Rectangle</CODE>-object starting from the origin\r\n             (0, 0) and with a specific rotation (valid values are 0, 90, 180, 270).\r\n            \r\n             @param urx   upper right x\r\n             @param ury   upper right y\r\n             @param rotation the rotation of the rectangle\r\n             @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.#ctor(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Constructs a Rectangle-object.\r\n            </summary>\r\n            <param name=\"rect\">another Rectangle</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.#ctor(System.util.RectangleJ)\">\r\n            Constructs a <CODE>Rectangle</CODE>-object based on a <CODE>com.itextpdf.awt.geom.Rectangle</CODE> object\r\n            @param rect com.itextpdf.awt.geom.Rectangle\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.CloneNonPositionParameters(iTextSharp.text.Rectangle)\">\r\n            Copies all of the parameters from a <CODE>Rectangle</CODE> object\r\n            except the position.\r\n            \r\n            @param rect\r\n                       <CODE>Rectangle</CODE> to copy from\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.SoftCloneNonPositionParameters(iTextSharp.text.Rectangle)\">\r\n            Copies all of the parameters from a <CODE>Rectangle</CODE> object\r\n            except the position.\r\n            \r\n            @param rect\r\n                       <CODE>Rectangle</CODE> to copy from\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">an IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.Normalize\">\r\n            Switches lowerleft with upperright\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.GetRectangle(System.Single,System.Single)\">\r\n            <summary>\r\n            Gets a Rectangle that is altered to fit on the page.\r\n            </summary>\r\n            <param name=\"top\">the top position</param>\r\n            <param name=\"bottom\">the bottom position</param>\r\n            <returns>a Rectangle</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.Rotate\">\r\n            <summary>\r\n            Swaps the values of urx and ury and of lly and llx in order to rotate the rectangle.\r\n            </summary>\r\n            <returns>a Rectangle</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Top\">\r\n            <summary>\r\n            Get/set the upper right y-coordinate. \r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.EnableBorderSide(System.Int32)\">\r\n            Enables the border on the specified side.\r\n            \r\n            @param side\r\n                       the side to enable. One of <CODE>LEFT, RIGHT, TOP, BOTTOM\r\n                       </CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.DisableBorderSide(System.Int32)\">\r\n            Disables the border on the specified side.\r\n            \r\n            @param side\r\n                       the side to disable. One of <CODE>LEFT, RIGHT, TOP, BOTTOM\r\n                       </CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Border\">\r\n            <summary>\r\n            Get/set the border\r\n            </summary>\r\n            <value>a int</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.GrayFill\">\r\n            <summary>\r\n            Get/set the grayscale of the rectangle.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Left\">\r\n            <summary>\r\n            Get/set the lower left x-coordinate.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Right\">\r\n            <summary>\r\n            Get/set the upper right x-coordinate.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Bottom\">\r\n            <summary>\r\n            Get/set the lower left y-coordinate.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.GetLeft(System.Single)\">\r\n            <summary>\r\n            Returns the lower left x-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the lower left x-coordinate</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.GetRight(System.Single)\">\r\n            <summary>\r\n            Returns the upper right x-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the upper right x-coordinate</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.GetTop(System.Single)\">\r\n            <summary>\r\n            Returns the upper right y-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the upper right y-coordinate</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.GetBottom(System.Single)\">\r\n            <summary>\r\n            Returns the lower left y-coordinate, considering a given margin.\r\n            </summary>\r\n            <param name=\"margin\">a margin</param>\r\n            <returns>the lower left y-coordinate</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Width\">\r\n            <summary>\r\n            Returns the width of the rectangle.\r\n            </summary>\r\n            <value>a width</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Height\">\r\n            <summary>\r\n            Returns the height of the rectangle.\r\n            </summary>\r\n            <value>a height</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.HasBorders\">\r\n            <summary>\r\n            Indicates if the table has borders.\r\n            </summary>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.HasBorder(System.Int32)\">\r\n            <summary>\r\n            Indicates if the table has a some type of border.\r\n            </summary>\r\n            <param name=\"type\">the type of border</param>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.BorderWidth\">\r\n            <summary>\r\n            Get/set the borderwidth.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.BorderColor\">\r\n             Gets the color of the border.\r\n            \r\n             @return    a value\r\n            <summary>\r\n            Get/set the color of the border.\r\n            </summary>\r\n            <value>a BaseColor</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.BackgroundColor\">\r\n             Gets the backgroundcolor.\r\n            \r\n             @return    a value\r\n            <summary>\r\n            Get/set the backgroundcolor.\r\n            </summary>\r\n            <value>a BaseColor</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.Rotation\">\r\n            <summary>\r\n            Set/gets the rotation\r\n            </summary>\r\n            <value>a int</value>    \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Rectangle.UpdateBorderBasedOnWidth(System.Single,System.Int32)\">\r\n            Updates the border flag for a side based on the specified width. A width\r\n            of 0 will disable the border on that side. Any other width enables it.\r\n            \r\n            @param width\r\n                       width of border\r\n            @param side\r\n                       border side constant\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Rectangle.UseVariableBorders\">\r\n            Sets a parameter indicating if the rectangle has variable borders\r\n            \r\n            @param useVariableBorders\r\n                       indication if the rectangle has variable borders\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.RectangleReadOnly\">\r\n            <summary>\r\n            A RectangleReadOnly is the representation of a geometric figure.\r\n            It's the same as a Rectangle but immutable.\r\n            </summary>\r\n            <seealso cref=\"T:iTextSharp.text.Element\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Table\"/>\r\n            <seealso cref=\"T:iTextSharp.text.Cell\"/>\r\n            <seealso cref=\"T:iTextSharp.text.HeaderFooter\"/>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.#ctor(System.Single,System.Single,System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a RectangleReadOnly-object.\r\n            </summary>\r\n            <param name=\"llx\">lower left x</param>\r\n            <param name=\"lly\">lower left y</param>\r\n            <param name=\"urx\">upper right x</param>\r\n            <param name=\"ury\">upper right y</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.#ctor(System.Single,System.Single,System.Single,System.Single,System.Int32)\">\r\n            Constructs a <CODE>RectangleReadOnly</CODE> -object.\r\n            \r\n            @param llx\tlower left x\r\n            @param lly\tlower left y\r\n            @param urx\tupper right x\r\n            @param ury\tupper right y\r\n            @param rotation\tthe rotation of the Rectangle (0, 90, 180, 270)\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.#ctor(System.Single,System.Single)\">\r\n            <summary>\r\n            Constructs a RectangleReadOnly-object starting from the origin (0, 0).\r\n            </summary>\r\n            <param name=\"urx\">upper right x</param>\r\n            <param name=\"ury\">upper right y</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.#ctor(System.Single,System.Single,System.Int32)\">\r\n            Constructs a <CODE>RectangleReadOnly</CODE>-object starting from the origin\r\n            (0, 0) and with a specific rotation (valid values are 0, 90, 180, 270).\r\n            \r\n            @param urx   upper right x\r\n            @param ury   upper right y\r\n            @since iText 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.#ctor(iTextSharp.text.Rectangle)\">\r\n            <summary>\r\n            Constructs a RectangleReadOnly-object.\r\n            </summary>\r\n            <param name=\"rect\">another Rectangle</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.CloneNonPositionParameters(iTextSharp.text.Rectangle)\">\r\n            Copies all of the parameters from a <CODE>Rectangle</CODE> object\r\n            except the position.\r\n            \r\n            @param rect\r\n                       <CODE>Rectangle</CODE> to copy from\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.SoftCloneNonPositionParameters(iTextSharp.text.Rectangle)\">\r\n            Copies all of the parameters from a <CODE>Rectangle</CODE> object\r\n            except the position.\r\n            \r\n            @param rect\r\n                       <CODE>Rectangle</CODE> to copy from\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.Normalize\">\r\n            Switches lowerleft with upperright\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.Top\">\r\n            <summary>\r\n            Get/set the upper right y-coordinate. \r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.EnableBorderSide(System.Int32)\">\r\n            Enables the border on the specified side.\r\n            \r\n            @param side\r\n                       the side to enable. One of <CODE>LEFT, RIGHT, TOP, BOTTOM\r\n                       </CODE>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RectangleReadOnly.DisableBorderSide(System.Int32)\">\r\n            Disables the border on the specified side.\r\n            \r\n            @param side\r\n                       the side to disable. One of <CODE>LEFT, RIGHT, TOP, BOTTOM\r\n                       </CODE>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.Border\">\r\n            <summary>\r\n            Get/set the border\r\n            </summary>\r\n            <value>a int</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.GrayFill\">\r\n            <summary>\r\n            Get/set the grayscale of the rectangle.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.Left\">\r\n            <summary>\r\n            Get/set the lower left x-coordinate.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.Right\">\r\n            <summary>\r\n            Get/set the upper right x-coordinate.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.Bottom\">\r\n            <summary>\r\n            Get/set the lower left y-coordinate.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.BorderWidth\">\r\n            <summary>\r\n            Get/set the borderwidth.\r\n            </summary>\r\n            <value>a float</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.BorderColor\">\r\n             Gets the color of the border.\r\n            \r\n             @return    a value\r\n            <summary>\r\n            Get/set the color of the border.\r\n            </summary>\r\n            <value>a BaseColor</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.BackgroundColor\">\r\n             Gets the backgroundcolor.\r\n            \r\n             @return    a value\r\n            <summary>\r\n            Get/set the backgroundcolor.\r\n            </summary>\r\n            <value>a BaseColor</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.Rotation\">\r\n            <summary>\r\n            Set/gets the rotation\r\n            </summary>\r\n            <value>a int</value>    \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.RectangleReadOnly.UseVariableBorders\">\r\n            Sets a parameter indicating if the rectangle has variable borders\r\n            \r\n            @param useVariableBorders\r\n                       indication if the rectangle has variable borders\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.RomanList\">\r\n            \r\n            A special-version of <CODE>LIST</CODE> which use roman-letters.\r\n            \r\n            @see com.lowagie.text.List\r\n            @version 2003-06-22\r\n            @author Michael Niedermair\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RomanList.#ctor\">\r\n            Initialization\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RomanList.#ctor(System.Int32)\">\r\n            Initialization\r\n            \r\n            @param symbolIndent    indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RomanList.#ctor(System.Boolean,System.Int32)\">\r\n            Initialization \r\n            @param    romanlower        roman-char in lowercase   \r\n            @param     symbolIndent    indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.RomanList.Add(iTextSharp.text.IElement)\">\r\n             Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.\r\n            \r\n             @param    o    the object to add.\r\n             @return true if adding the object succeeded\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Section\">\r\n            <summary>\r\n            A Section is a part of a Document containing\r\n            other Sections, Paragraphs, List\r\n            and/or Tables.\r\n            </summary>\r\n            <remarks>\r\n            You can not construct a Section yourself.\r\n            You will have to ask an instance of Section to the\r\n            Chapter or Section to which you want to\r\n            add the new Section.\r\n            </remarks>\r\n            <example>\r\n            <code>\r\n            Paragraph title2 = new Paragraph(\"This is Chapter 2\", FontFactory.GetFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0, 255)));\r\n            Chapter chapter2 = new Chapter(title2, 2);\r\n            Paragraph someText = new Paragraph(\"This is some text\");\r\n            chapter2.Add(someText);\r\n            Paragraph title21 = new Paragraph(\"This is Section 1 in Chapter 2\", FontFactory.GetFont(FontFactory.HELVETICA, 16, Font.BOLD, new Color(255, 0, 0)));\r\n            <strong>Section section1 = chapter2.AddSection(title21);</strong>\r\n            Paragraph someSectionText = new Paragraph(\"This is some silly paragraph in a chapter and/or section. It contains some text to test the functionality of Chapters and Section.\");\r\n            <strong>section1.Add(someSectionText);</strong>\r\n            Paragraph title211 = new Paragraph(\"This is SubSection 1 in Section 1 in Chapter 2\", FontFactory.GetFont(FontFactory.HELVETICA, 14, Font.BOLD, new Color(255, 0, 0)));\r\n            <strong>Section section11 = section1.AddSection(40, title211, 2);\r\n            section11.Add(someSectionText);</strong>strong>\r\n            </code>\r\n            </example>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.NUMBERSTYLE_DOTTED\">\r\n            A possible number style. The default number style: \"1.2.3.\"\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT\">\r\n            A possible number style. For instance: \"1.2.3\"\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.title\">\r\n            <summary> This is the title of this section. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.numberDepth\">\r\n            <summary> This is the number of sectionnumbers that has to be shown before the section title. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.numberStyle\">\r\n            The style for sectionnumbers.\r\n            @since    iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.indentationLeft\">\r\n            <summary> The indentation of this section on the left side. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.indentationRight\">\r\n            <summary> The indentation of this section on the right side. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.indentation\">\r\n            <summary> The additional indentation of the content of this section. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.subsections\">\r\n            <summary> This is the number of subsections. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.numbers\">\r\n            <summary> This is the complete list of sectionnumbers of this section and the parents of this section. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.complete\">\r\n            Indicates if the Section will be complete once added to the document.\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.addedCompletely\">\r\n            Indicates if the Section was added completely to the document.\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.notAddedYet\">\r\n            Indicates if this is the first time the section was added.\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.bookmarkOpen\">\r\n            <summary> false if the bookmark children are not visible </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.triggerNewPage\">\r\n            true if the section has to trigger a new page \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Section.bookmarkTitle\">\r\n            The bookmark title if different from the content title \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.#ctor\">\r\n            <summary>\r\n            Constructs a new Section.\r\n            </summary>\r\n            <overloads>\r\n            Has 2 overloads.\r\n            </overloads>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.#ctor(iTextSharp.text.Paragraph,System.Int32)\">\r\n            <summary>\r\n            Constructs a new Section.\r\n            </summary>\r\n            <param name=\"title\">a Paragraph</param>\r\n            <param name=\"numberDepth\">the numberDepth</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.SetNumbers(System.Int32,System.Collections.Generic.List{System.Int32})\">\r\n            <summary>\r\n            Sets the number of this section.\r\n            </summary>\r\n            <param name=\"number\">the number of this section</param>\r\n            <param name=\"numbers\">an ArrayList, containing the numbers of the Parent</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.Process(iTextSharp.text.IElementListener)\">\r\n            <summary>\r\n            Processes the element by adding it (or the different parts) to an\r\n            IElementListener.\r\n            </summary>\r\n            <param name=\"listener\">the IElementListener</param>\r\n            <returns>true if the element was processed successfully</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.Type\">\r\n            <summary>\r\n            Gets the type of the text element.\r\n            </summary>\r\n            <value>a type</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.Chunks\">\r\n            <summary>\r\n            Gets all the chunks in this element.\r\n            </summary>\r\n            <value>an ArrayList</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.IsContent\">\r\n            @see com.lowagie.text.Element#isContent()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.IsNestable\">\r\n            @see com.lowagie.text.Element#isNestable()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.Add(System.Int32,iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds a Paragraph, List or Table\r\n            to this Section.\r\n            </summary>\r\n            <param name=\"index\">index at which the specified element is to be inserted</param>\r\n            <param name=\"o\">an object of type Paragraph, List or Table</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.Add(iTextSharp.text.IElement)\">\r\n            <summary>\r\n            Adds a Paragraph, List, Table or another Section\r\n            to this Section.\r\n            </summary>\r\n            <param name=\"o\">an object of type Paragraph, List, Table or another Section</param>\r\n            <returns>a bool</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddAll``1(System.Collections.Generic.ICollection{``0})\">\r\n            <summary>\r\n            Adds a collection of Elements\r\n            to this Section.\r\n            </summary>\r\n            <param name=\"collection\">a collection of Paragraphs, Lists and/or Tables</param>\r\n            <returns>true if the action succeeded, false if not.</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(System.Single,iTextSharp.text.Paragraph,System.Int32)\">\r\n            <summary>\r\n            Creates a Section, adds it to this Section and returns it.\r\n            </summary>\r\n            <param name=\"indentation\">the indentation of the new section</param>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <param name=\"numberDepth\">the numberDepth of the section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(System.Single,iTextSharp.text.Paragraph)\">\r\n            <summary>\r\n            Creates a Section, adds it to this Section and returns it.\r\n            </summary>\r\n            <param name=\"indentation\">the indentation of the new section</param>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(iTextSharp.text.Paragraph,System.Int32)\">\r\n            <summary>\r\n            Creates a Section, add it to this Section and returns it.\r\n            </summary>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <param name=\"numberDepth\">the numberDepth of the section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddMarkedSection\">\r\n            Adds a marked section. For use in class MarkedSection only!\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(iTextSharp.text.Paragraph)\">\r\n            <summary>\r\n            Creates a Section, adds it to this Section and returns it.\r\n            </summary>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(System.Single,System.String,System.Int32)\">\r\n             Adds a Section to this Section and returns it.\r\n            \r\n             @param    indentation    the indentation of the new section\r\n             @param    title        the title of the new section\r\n             @param    numberDepth    the numberDepth of the section\r\n            <summary>\r\n            Adds a Section to this Section and returns it.\r\n            </summary>\r\n            <param name=\"indentation\">the indentation of the new section</param>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <param name=\"numberDepth\">the numberDepth of the section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(System.String,System.Int32)\">\r\n             Adds a Section to this Section and returns it.\r\n            \r\n             @param    title        the title of the new section\r\n             @param    numberDepth    the numberDepth of the section\r\n            <summary>\r\n            Adds a Section to this Section and returns it.\r\n            </summary>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <param name=\"numberDepth\">the numberDepth of the section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(System.Single,System.String)\">\r\n            <summary>\r\n            Adds a Section to this Section and returns it.\r\n            </summary>\r\n            <param name=\"indentation\">the indentation of the new section</param>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.AddSection(System.String)\">\r\n            <summary>\r\n            Adds a Section to this Section and returns it.\r\n            </summary>\r\n            <param name=\"title\">the title of the new section</param>\r\n            <returns>the newly added Section</returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.Title\">\r\n            <summary>\r\n            Get/set the title of this section\r\n            </summary>\r\n            <value>a Paragraph</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.NumberStyle\">\r\n            Sets the style for numbering sections.\r\n            Possible values are NUMBERSTYLE_DOTTED: 1.2.3. (the default)\r\n            or NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT: 1.2.3\r\n            @since    iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.ConstructTitle(iTextSharp.text.Paragraph,System.Collections.Generic.List{System.Int32},System.Int32,System.Int32)\">\r\n            Constructs a Paragraph that will be used as title for a Section or Chapter.\r\n            @param    title   the title of the section\r\n            @param    numbers a list of sectionnumbers\r\n            @param    numberDepth how many numbers have to be shown\r\n            @param    numberStyle the numbering style\r\n            @return   a Paragraph object\r\n            @since    iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.IsChapter\">\r\n            <summary>\r\n            Checks if this object is a Chapter.\r\n            </summary>\r\n            <returns>\r\n            true if it is a Chapter,\r\n            false if it is a Section\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.IsSection\">\r\n            <summary>\r\n            Checks if this object is a Section.\r\n            </summary>\r\n            <returns>\r\n            true if it is a Section,\r\n            false if it is a Chapter.\r\n            </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.NumberDepth\">\r\n            <summary>\r\n            Get/set the numberdepth of this Section.\r\n            </summary>\r\n            <value>a int</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.IndentationLeft\">\r\n            <summary>\r\n            Get/set the indentation of this Section on the left side.\r\n            </summary>\r\n            <value>the indentation</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.IndentationRight\">\r\n            <summary>\r\n            Get/set the indentation of this Section on the right side.\r\n            </summary>\r\n            <value>the indentation</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.Indentation\">\r\n            <summary>\r\n            Get/set the indentation of the content of this Section.\r\n            </summary>\r\n            <value>the indentation</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.Depth\">\r\n            <summary>\r\n            Returns the depth of this section.\r\n            </summary>\r\n            <value>the depth</value>\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.BookmarkOpen\">\r\n            <summary>\r\n            Get/set the bookmark\r\n            </summary>\r\n            <value>a bool</value>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.GetBookmarkTitle\">\r\n            Gets the bookmark title.\r\n            @return the bookmark title\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.BookmarkTitle\">\r\n            Sets the bookmark title. The bookmark title is the same as the section title but\r\n            can be changed with this method.\r\n            @param bookmarkTitle the bookmark title\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.SetChapterNumber(System.Int32)\">\r\n            Changes the Chapter number.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.NotAddedYet\">\r\n            Indicates if this is the first time the section is added.\r\n            @since   iText2.0.8\r\n            @return  true if the section wasn't added yet\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.AddedCompletely\">\r\n            @see com.lowagie.text.LargeElement#isAddedCompletely()\r\n            @since   iText 2.0.8\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.FlushContent\">\r\n            @since   iText 2.0.8\r\n            @see com.lowagie.text.LargeElement#flushContent()\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Section.ElementComplete\">\r\n            @since   iText 2.0.8\r\n            @see com.lowagie.text.LargeElement#isComplete()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Section.NewPage\">\r\n            Adds a new page to the section.\r\n            @since   2.1.1\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.SpecialSymbol.Index(System.String)\">\r\n             Returns the first occurrence of a special symbol in a <CODE>String</CODE>.\r\n            \r\n             @param    string        a <CODE>String</CODE>\r\n             @return    an index of -1 if no special symbol was found\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.SpecialSymbol.Get(System.Char,iTextSharp.text.Font)\">\r\n            Gets a chunk with a symbol character.\r\n            @param c a character that has to be changed into a symbol\r\n            @param font Font if there is no SYMBOL character corresponding with c\r\n            @return a SYMBOL version of a character\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.SpecialSymbol.GetCorrespondingSymbol(System.Char)\">\r\n             Looks for the corresponding symbol in the font Symbol.\r\n            \r\n             @param    c    the original ASCII-char\r\n             @return    the corresponding symbol in font Symbol\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Utilities\">\r\n            A collection of convenience methods that were present in many different iText\r\n            classes.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.GetKeySet``2(System.Collections.Generic.Dictionary{``0,``1})\">\r\n            <summary>\r\n            \r\n            </summary>\r\n            <param name=\"table\"></param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.AddToArray(System.Object[][],System.Object[])\">\r\n            Utility method to extend an array.\r\n            @param original the original array or <CODE>null</CODE>\r\n            @param item the item to be added to the array\r\n            @return a new array with the item appended\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.CheckTrueOrFalse(System.util.Properties,System.String)\">\r\n            Checks for a true/false value of a key in a Properties object.\r\n            @param attributes\r\n            @param key\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.ToURL(System.String)\">\r\n            <summary>\r\n            This method makes a valid URL from a given filename.\r\n            </summary>\r\n            <remarks>\r\n            \r\n            </remarks>\r\n            <param name=\"filename\">a given filename</param>\r\n            <returns>a valid URL</returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.UnEscapeURL(System.String)\">\r\n            Unescapes an URL. All the \"%xx\" are replaced by the 'xx' hex char value.\r\n            @param src the url to unescape\r\n            @return the eunescaped value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.Skip(System.IO.Stream,System.Int32)\">\r\n            <summary>\r\n            This method is an alternative for the Stream.Skip()-method\r\n            that doesn't seem to work properly for big values of size.\r\n            </summary>\r\n            <param name=\"istr\">the stream</param>\r\n            <param name=\"size\">the number of bytes to skip</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.MillimetersToPoints(System.Single)\">\r\n            Measurement conversion from millimeters to points.\r\n            @param    value   a value in millimeters\r\n            @return   a value in points\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.MillimetersToInches(System.Single)\">\r\n            Measurement conversion from millimeters to inches.\r\n            @param    value   a value in millimeters\r\n            @return   a value in inches\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.PointsToMillimeters(System.Single)\">\r\n            Measurement conversion from points to millimeters.\r\n            @param    value   a value in points\r\n            @return   a value in millimeters\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.PointsToInches(System.Single)\">\r\n            Measurement conversion from points to inches.\r\n            @param    value   a value in points\r\n            @return   a value in inches\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.InchesToMillimeters(System.Single)\">\r\n            Measurement conversion from inches to millimeters.\r\n            @param    value   a value in inches\r\n            @return   a value in millimeters\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.InchesToPoints(System.Single)\">\r\n            Measurement conversion from inches to points.\r\n            @param    value   a value in inches\r\n            @return   a value in points\r\n            @since    2.1.2\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.ReadFileToString(System.String)\">\r\n            Reads the contents of a file to a String.\r\n            @param\tpath\tthe path to the file\r\n            @return\ta String with the contents of the file\r\n            @since\tiText 5.0.0\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Utilities.ConvertToHex(System.Byte[])\">\r\n            Converts an array of bytes to a String of hexadecimal values\r\n            @param bytes\ta byte array\r\n            @return\tthe same bytes expressed as hexadecimal values\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.ParserBase\">\r\n            <summary>\r\n            The <CODE>ParserBase</CODE>-class provides XML document parsing.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.ParserBase.Parse(System.String)\">\r\n            <summary>\r\n            Begins the process of processing an XML document\r\n            </summary>\r\n            <param name=\"url\">the XML document to parse</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.ParserBase.StartElement(System.String,System.String,System.String,System.Collections.Hashtable)\">\r\n            <summary>\r\n            This method gets called when a start tag is encountered.\r\n            </summary>\r\n            <param name=\"uri\"></param>\r\n            <param name=\"lname\"></param>\r\n            <param name=\"name\">the name of the tag that is encountered</param>\r\n            <param name=\"attrs\">the list of attributes</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.ParserBase.EndElement(System.String,System.String,System.String)\">\r\n            <summary>\r\n            This method gets called when an end tag is encountered.\r\n            </summary>\r\n            <param name=\"uri\"></param>\r\n            <param name=\"lname\"></param>\r\n            <param name=\"name\">the name of the tag that ends</param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.ParserBase.Characters(System.String,System.Int32,System.Int32)\">\r\n            <summary>\r\n            This method gets called when characters are encountered.\r\n            </summary>\r\n            <param name=\"content\">an array of characters</param>\r\n            <param name=\"start\">the start position in the array</param>\r\n            <param name=\"length\">the number of characters to read from the array</param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.EntitiesToSymbol\">\r\n            This class contains entities that can be used in an entity tag.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.EntitiesToSymbol.map\">\r\n            This is a map that contains all possible id values of the entity tag\r\n            that can be translated to a character in font Symbol.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.EntitiesToSymbol.Get(System.String,iTextSharp.text.Font)\">\r\n            Gets a chunk with a symbol character.\r\n            @param e a symbol value (see Entities class: alfa is greek alfa,...)\r\n            @param font the font if the symbol isn't found (otherwise Font.SYMBOL)\r\n            @return a Chunk\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.EntitiesToSymbol.GetCorrespondingSymbol(System.String)\">\r\n             Looks for the corresponding symbol in the font Symbol.\r\n            \r\n             @param    name    the name of the entity\r\n             @return   the corresponding character in font Symbol\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.EntitiesToUnicode\">\r\n            This class contains entities that can be used in an entity tag.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.EntitiesToUnicode.map\">\r\n            This is a map that contains the names of entities and their unicode value.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.EntitiesToUnicode.DecodeEntity(System.String)\">\r\n             Translates an entity to a unicode character.\r\n            \r\n             @param   name    the name of the entity\r\n             @return  the corresponding unicode character\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.xml.simpleparser.EntitiesToUnicode.DecodeString(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.IanaEncodings\">\r\n            Translates a IANA encoding name to a Java encoding.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.IanaEncodings.map\">\r\n            The object that maps IANA to Java encodings. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler\">\r\n            The handler for the events fired by <CODE>SimpleXMLParser</CODE>.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler.StartElement(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            Called when a start tag is found.\r\n            @param tag the tag name\r\n            @param h the tag's attributes\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler.EndElement(System.String)\">\r\n            Called when an end tag is found.\r\n            @param tag the tag name\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler.StartDocument\">\r\n            Called when the document starts to be parsed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler.EndDocument\">\r\n            Called after the document is parsed.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler.Text(System.String)\">\r\n            Called when a text element is found.\r\n            @param str the text element, probably a fragment.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandlerComment\">\r\n            The handler for the events fired by <CODE>SimpleXMLParser</CODE>.\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandlerComment.Comment(System.String)\">\r\n            Called when a comment is found.\r\n            @param text the comment text\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.text.xml.simpleparser.SimpleXMLParser”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.UNKNOWN\">\r\n            possible states \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.stack\">\r\n            the state stack \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.character\">\r\n            The current character. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.previousCharacter\">\r\n            The previous character. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.lines\">\r\n            the line we are currently reading \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.columns\">\r\n            the column where the current character occurs \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.eol\">\r\n            was the last character equivalent to a newline? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.nowhite\">\r\n            A boolean indicating if the next character should be taken into account\r\n            if it's a space character. When nospace is false, the previous character\r\n            wasn't whitespace.\r\n            @since 2.1.5\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.state\">\r\n            the current state \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.html\">\r\n            Are we parsing HTML? \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.text\">\r\n            current text (whatever is encountered between tags) \r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.entity”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.tag\">\r\n            current tagname \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.attributes\">\r\n            current attributes \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.doc\">\r\n            The handler to which we are going to forward document content \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.comment\">\r\n            The handler to which we are going to forward comments. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.nested\">\r\n            Keeps track of the number of tags that are open. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.quoteCharacter\">\r\n            the quote character that was used to open the quote. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.attributekey\">\r\n            the attribute key. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.simpleparser.SimpleXMLParser.attributevalue\">\r\n            the attribute value. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.#ctor(iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler,iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandlerComment,System.Boolean)\">\r\n            Creates a Simple XML parser object.\r\n            Call Go(BufferedReader) immediately after creation.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.Go(System.IO.TextReader)\">\r\n            Does the actual parsing. Perform this immediately\r\n            after creating the parser object.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.RestoreState\">\r\n            Gets a state from the stack\r\n            @return the previous state\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.SaveState(System.Int32)\">\r\n            Adds a state to the stack.\r\n            @param   s   a state to add to the stack\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.Flush\">\r\n            Flushes the text that is currently in the buffer.\r\n            The text can be ignored, added to the document\r\n            as content or as comment,... depending on the current state.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.InitTag\">\r\n            Initialized the tag name and attributes.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.DoTag\">\r\n            Sets the name of the tag. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.ProcessTag(System.Boolean)\">\r\n            processes the tag.\r\n            @param start if true we are dealing with a tag that has just been opened; if false we are closing a tag.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.ThrowException(System.String)\">\r\n            Throws an exception \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.Parse(iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler,iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandlerComment,System.IO.TextReader,System.Boolean)\">\r\n            Parses the XML document firing the events to the handler.\r\n            @param doc the document handler\r\n            @param r the document. The encoding is already resolved. The reader is not closed\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.Parse(iTextSharp.text.xml.simpleparser.ISimpleXMLDocHandler,System.IO.Stream)\">\r\n            Parses the XML document firing the events to the handler.\r\n            @param doc the document handler\r\n            @param in the document. The encoding is deduced from the stream. The stream is not closed\r\n            @throws IOException on error\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.SimpleXMLParser.EscapeXML(System.String,System.Boolean)\">\r\n            Escapes a string with the appropriated XML codes.\r\n            @param s the string to be escaped\r\n            @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>\r\n            @return the escaped string\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.handler.HTMLNewLineHandler\">\r\n             This {@link NewLineHandler} returns true on the tags <code>p</code>,\r\n             <code>blockqoute</code>and <code>br</code>\r\n            \r\n             @author Balder\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.handler.HTMLNewLineHandler.#ctor\">\r\n             Default constructor\r\n            \r\n             @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.handler.NeverNewLineHandler\">\r\n             Always returns false.\r\n             @author Balder\r\n             @since 5.0.6\r\n            \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.simpleparser.INewLineHandler\">\r\n             A NewLineHandler determines if an encountered tag should result in a new line\r\n             in a document.\r\n            \r\n             @author Balder\r\n             @since 5.0.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.simpleparser.INewLineHandler.IsNewLineTag(System.String)\">\r\n            @param tag the tag to check if after this one a new line should be in a document\r\n            @return true in case a new line should be added.\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.DublinCoreSchema\">\r\n            An implementation of an XmpSchema.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.DEFAULT_XPATH_ID\">\r\n            default namespace identifier\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.DEFAULT_XPATH_URI\">\r\n            default namespace uri\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.CONTRIBUTOR\">\r\n            External Contributors to the resource (other than the authors). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.COVERAGE\">\r\n            The extent or scope of the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.CREATOR\">\r\n            The authors of the resource (listed in order of precedence, if significant). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.DATE\">\r\n            Date(s) that something interesting happened to the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.DESCRIPTION\">\r\n            A textual description of the content of the resource. Multiple values may be present for different languages. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.FORMAT\">\r\n            The file format used when saving the resource. Tools and applications should set this property to the save format of the data. It may include appropriate qualifiers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.IDENTIFIER\">\r\n            Unique identifier of the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.LANGUAGE\">\r\n            An unordered array specifying the languages used in the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.PUBLISHER\">\r\n            Publishers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.RELATION\">\r\n            Relationships to other documents. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.RIGHTS\">\r\n            Informal rights statement, selected by language. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.SOURCE\">\r\n            Unique identifier of the work from which this resource was derived. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.SUBJECT\">\r\n            An unordered array of descriptive phrases or keywords that specify the topic of the content of the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.TITLE\">\r\n            The title of the document, or the name given to the resource. Typically, it will be a name by which the resource is formally known. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreSchema.TYPE\">\r\n            A document type; for example, novel, poem, or working paper. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.#ctor\">\r\n            @param shorthand\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddTitle(System.String)\">\r\n            Adds a title.\r\n            @param title\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddTitle(iTextSharp.text.xml.xmp.LangAlt)\">\r\n            Adds a title.\r\n            @param title\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddDescription(System.String)\">\r\n            Adds a description.\r\n            @param desc\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddDescription(iTextSharp.text.xml.xmp.LangAlt)\">\r\n            Adds a description.\r\n            @param desc\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddSubject(System.String)\">\r\n            Adds a subject.\r\n            @param subject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddSubject(System.String[])\">\r\n            Adds a subject.\r\n            @param subject array of subjects\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddAuthor(System.String)\">\r\n            Adds a single author.\r\n            @param author\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddAuthor(System.String[])\">\r\n            Adds an array of authors.\r\n            @param author\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddPublisher(System.String)\">\r\n            Adds a single publisher.\r\n            @param publisher\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreSchema.AddPublisher(System.String[])\">\r\n            Adds an array of publishers.\r\n            @param publisher\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.EncodingNoPreamble\">\r\n            <summary>\r\n            A wrapper for an Encoding to suppress the preamble.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.LangAlt.DEFAULT\">\r\n            Key for the default language. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.LangAlt.#ctor(System.String)\">\r\n            Creates a Properties object that stores languages for use in an XmpSchema \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.LangAlt.#ctor\">\r\n            Creates a Properties object that stores languages for use in an XmpSchema \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.LangAlt.AddLanguage(System.String,System.String)\">\r\n            Add a language.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.LangAlt.Process(System.Text.StringBuilder,System.String)\">\r\n            Process a property.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.LangAlt.ToString\">\r\n            Creates a String that can be used in an XmpSchema.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.PdfSchema\">\r\n            An implementation of an XmpSchema.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfSchema.DEFAULT_XPATH_ID\">\r\n            default namespace identifier\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfSchema.DEFAULT_XPATH_URI\">\r\n            default namespace uri\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfSchema.KEYWORDS\">\r\n            Keywords. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfSchema.VERSION\">\r\n            The PDF file version (for example: 1.0, 1.3, and so on). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfSchema.PRODUCER\">\r\n            The Producer. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfSchema.#ctor\">\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfSchema.AddKeywords(System.String)\">\r\n            Adds keywords.\r\n            @param keywords\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfSchema.AddProducer(System.String)\">\r\n            Adds the producer.\r\n            @param producer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfSchema.AddVersion(System.String)\">\r\n            Adds the version.\r\n            @param version\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.XmpArray\">\r\n            StringBuilder to construct an XMP array.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpArray.UNORDERED\">\r\n            An array that is unordered. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpArray.ORDERED\">\r\n            An array that is ordered. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpArray.ALTERNATIVE\">\r\n            An array with alternatives. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpArray.type\">\r\n            the type of array. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpArray.#ctor(System.String)\">\r\n            Creates an XmpArray.\r\n            @param type the type of array: UNORDERED, ORDERED or ALTERNATIVE.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpArray.ToString\">\r\n            Returns the String representation of the XmpArray.\r\n            @return a String representation\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.XmpBasicSchema\">\r\n            An implementation of an XmpSchema.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.DEFAULT_XPATH_ID\">\r\n            default namespace identifier\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.DEFAULT_XPATH_URI\">\r\n            default namespace uri\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.ADVISORY\">\r\n            An unordered array specifying properties that were edited outside the authoring application. Each item should contain a single namespace and XPath separated by one ASCII space (U+0020). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.BASEURL\">\r\n            The base URL for relative URLs in the document content. If this document contains Internet links, and those links are relative, they are relative to this base URL. This property provides a standard way for embedded relative URLs to be interpreted by tools. Web authoring tools should set the value based on their notion of where URLs will be interpreted. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.CREATEDATE\">\r\n            The date and time the resource was originally created. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.CREATORTOOL\">\r\n            The name of the first known tool used to create the resource. If history is present in the metadata, this value should be equivalent to that of xmpMM:History�s softwareAgent property. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.IDENTIFIER\">\r\n            An unordered array of text strings that unambiguously identify the resource within a given context. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.METADATADATE\">\r\n            The date and time that any metadata for this resource was last changed. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.MODIFYDATE\">\r\n            The date and time the resource was last modified. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.NICKNAME\">\r\n            A short informal name for the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicSchema.THUMBNAILS\">\r\n            An alternative array of thumbnail images for a file, which can differ in characteristics such as size or image encoding. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.#ctor\">\r\n            @param shorthand\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.AddCreatorTool(System.String)\">\r\n            Adds the creatortool.\r\n            @param creator\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.AddCreateDate(System.String)\">\r\n            Adds the creation date.\r\n            @param date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.AddModDate(System.String)\">\r\n            Adds the modification date.\r\n            @param date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.AddMetaDataDate(System.String)\">\r\n            Adds the meta data date.\r\n            @param date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.AddIdentifiers(System.String[])\">\r\n            Adds the identifier.\r\n            @param id\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicSchema.AddNickname(System.String)\">\r\n            Adds the nickname.\r\n            @param name\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.XmpMMSchema\">\r\n            An implementation of an XmpSchema.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.DEFAULT_XPATH_ID\">\r\n            default namespace identifier\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.DEFAULT_XPATH_URI\">\r\n            default namespace uri\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.DERIVEDFROM\">\r\n            A reference to the original document from which this one is derived. It is a minimal reference; missing components can be assumed to be unchanged. For example, a new version might only need to specify the instance ID and version number of the previous version, or a rendition might only need to specify the instance ID and rendition class of the original. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.DOCUMENTID\">\r\n            The common identifier for all versions and renditions of a document. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.HISTORY\">\r\n            An ordered array of high-level user actions that resulted in this resource. It is intended to give human readers a general indication of the steps taken to make the changes from the previous version to this one. The list should be at an abstract level; it is not intended to be an exhaustive keystroke or other detailed history. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.MANAGEDFROM\">\r\n            A reference to the document as it was prior to becoming managed. It is set when a managed document is introduced to an asset management system that does not currently own it. It may or may not include references to different management systems. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.MANAGER\">\r\n            The name of the asset management system that manages this resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.MANAGETO\">\r\n            A URI identifying the managed resource to the asset management system; the presence of this property is the formal indication that this resource is managed. The form and content of this URI is private to the asset management system. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.MANAGEUI\">\r\n            A URI that can be used to access information about the managed resource through a web browser. It might require a custom browser plugin. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.MANAGERVARIANT\">\r\n            Specifies a particular variant of the asset management system. The format of this property is private to the specific asset management system. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.RENDITIONCLASS\">\r\n            The rendition class name for this resource.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.RENDITIONPARAMS\">\r\n             Can be used to provide additional rendition parameters that are too complex or verbose to encode in xmpMM: RenditionClass. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.VERSIONID\">\r\n            The document version identifier for this resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMSchema.VERSIONS\">\r\n            The version history associated with this resource.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpMMSchema.#ctor\">\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.XmpReader\">\r\n            Reads an XMP stream into an org.w3c.dom.Document objects.\r\n            Allows you to replace the contents of a specific tag.\r\n            @since 2.1.3\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpReader.EXTRASPACE\">\r\n            String used to fill the extra space. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpReader.XPACKET_PI_BEGIN\">\r\n            Processing Instruction required at the start of an XMP stream\r\n            @since iText 2.1.6\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpReader.XPACKET_PI_END_W\">\r\n            Processing Instruction required at the end of an XMP stream for XMP streams that can be updated\r\n            @since iText 2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpReader.#ctor(System.Byte[])\">\r\n            Constructs an XMP reader\r\n            @param\tbytes\tthe XMP content\r\n            @throws ExceptionConverter \r\n            @throws IOException \r\n            @throws SAXException \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpReader.ReplaceNode(System.String,System.String,System.String)\">\r\n            Replaces the content of a tag.\r\n            @param\tnamespaceURI\tthe URI of the namespace\r\n            @param\tlocalName\t\tthe tag name\r\n            @param\tvalue\t\t\tthe new content for the tag\r\n            @return\ttrue if the content was successfully replaced\r\n            @since\t2.1.6 the return type has changed from void to boolean\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpReader.ReplaceDescriptionAttribute(System.String,System.String,System.String)\">\r\n            Replaces the content of an attribute in the description tag.\r\n            @param    namespaceURI    the URI of the namespace\r\n            @param    localName       the tag name\r\n            @param    value           the new content for the tag\r\n            @return   true if the content was successfully replaced\r\n            @since    5.0.0 the return type has changed from void to boolean\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpReader.Add(System.String,System.String,System.String,System.String)\">\r\n            Adds a tag.\r\n            @param\tnamespaceURI\tthe URI of the namespace\r\n            @param\tparent\t\t\tthe tag name of the parent\r\n            @param\tlocalName\t\tthe name of the tag to add\r\n            @param\tvalue\t\t\tthe new content for the tag\r\n            @return\ttrue if the content was successfully added\r\n            @since\t2.1.6\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpReader.SetNodeText(System.Xml.XmlDocument,System.Xml.XmlNode,System.String)\">\r\n            Sets the text of this node. All the child's node are deleted and a new\r\n            child text node is created.\r\n            @param domDocument the <CODE>Document</CODE> that contains the node\r\n            @param n the <CODE>Node</CODE> to add the text to\r\n            @param value the text to add\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpReader.SerializeDoc\">\r\n            Writes the document to a byte array.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.XmpSchema\">\r\n            Abstract superclass of the XmpSchemas supported by iText.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpSchema.xmlns\">\r\n            the namesspace \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpSchema.#ctor(System.String)\">\r\n            Constructs an XMP schema. \r\n            @param xmlns\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpSchema.ToString\">\r\n            The String representation of the contents.\r\n            @return a String representation.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpSchema.Process(System.Text.StringBuilder,System.Object)\">\r\n            Processes a property\r\n            @param buf\r\n            @param p\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.xml.xmp.XmpSchema.Xmlns\">\r\n            @return Returns the xmlns.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpSchema.AddProperty(System.String,System.String)\">\r\n            @param key\r\n            @param value\r\n            @return the previous property (null if there wasn't one)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpSchema.SetProperty(System.String,iTextSharp.text.xml.xmp.LangAlt)\">\r\n            @see java.util.Properties#setProperty(java.lang.String, java.lang.String)\r\n            \r\n            @param key\r\n            @param value\r\n            @return the previous property (null if there wasn't one)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpSchema.Escape(System.String)\">\r\n            @param content\r\n            @return\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.xmp.XmpWriter\">\r\n            With this class you can create an Xmp Stream that can be used for adding\r\n            Metadata to a PDF Dictionary. Remark that this class doesn't cover the\r\n            complete XMP specification.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpWriter.UTF8\">\r\n            A possible charset for the XMP. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpWriter.UTF16\">\r\n            A possible charset for the XMP. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpWriter.UTF16BE\">\r\n            A possible charset for the XMP. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpWriter.UTF16LE\">\r\n            A possible charset for the XMP. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.#ctor(System.IO.Stream,System.String,System.Int32)\">\r\n            Creates an XmpWriter.\r\n            @param os\r\n            @param utfEncoding\r\n            @param extraSpace\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.#ctor(System.IO.Stream)\">\r\n            Creates an XmpWriter.\r\n            @param os\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.#ctor(System.IO.Stream,iTextSharp.text.pdf.PdfDictionary)\">\r\n            @param os\r\n            @param info\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.#ctor(System.IO.Stream,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @param os\r\n            @param info\r\n            @throws IOException\r\n            @since 5.0.1 (generic type in signature)\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.xml.xmp.XmpWriter.ReadOnly\">\r\n            Sets the XMP to read-only \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.xml.xmp.XmpWriter.About\">\r\n            @param about The about to set.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.AddRdfDescription(System.String,System.String)\">\r\n            Adds an rdf:Description.\r\n            @param xmlns\r\n            @param content\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.AddRdfDescription(iTextSharp.text.xml.xmp.XmpSchema)\">\r\n            Adds an rdf:Description.\r\n            @param s\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.SetProperty(System.String,System.String,System.Object)\">\r\n            @param schemaNS The namespace URI for the property. Has the same usage as in getProperty.\r\n            @param propName The name of the property.\r\n                            Has the same usage as in <code>getProperty()</code>.\r\n            @param value    the value for the property (only leaf properties have a value).\r\n                            Arrays and non-leaf levels of structs do not have values.\r\n                            Must be <code>null</code> if the value is not relevant.<br/>\r\n                            The value is automatically detected: Boolean, Integer, Long, Double, XMPDateTime and\r\n                            byte[] are handled, on all other <code>toString()</code> is called.\r\n            @throws XMPException Wraps all errors and exceptions that may occur.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.AppendArrayItem(System.String,System.String,System.String)\">\r\n             Simplifies the construction of an array by not requiring that you pre-create an empty array.\r\n             The array that is assigned is created automatically if it does not yet exist. Each call to\r\n             AppendArrayItem() appends an item to the array.\r\n            \r\n             @param schemaNS  The namespace URI for the array.\r\n             @param arrayName The name of the array. May be a general path expression, must not be null or\r\n                              the empty string.\r\n             @param value     the value of the array item.\r\n             @throws XMPException Wraps all errors and exceptions that may occur.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.AppendOrderedArrayItem(System.String,System.String,System.String)\">\r\n             Simplifies the construction of an ordered array by not requiring that you pre-create an empty array.\r\n             The array that is assigned is created automatically if it does not yet exist. Each call to\r\n             AppendArrayItem() appends an item to the array.\r\n            \r\n             @param schemaNS  The namespace URI for the array.\r\n             @param arrayName The name of the array. May be a general path expression, must not be null or\r\n                              the empty string.\r\n             @param value     the value of the array item.\r\n             @throws XMPException Wraps all errors and exceptions that may occur.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.AppendAlternateArrayItem(System.String,System.String,System.String)\">\r\n             Simplifies the construction of an alternate array by not requiring that you pre-create an empty array.\r\n             The array that is assigned is created automatically if it does not yet exist. Each call to\r\n             AppendArrayItem() appends an item to the array.\r\n            \r\n             @param schemaNS  The namespace URI for the array.\r\n             @param arrayName The name of the array. May be a general path expression, must not be null or\r\n                              the empty string.\r\n             @param value     the value of the array item.\r\n             @throws XMPException Wraps all errors and exceptions that may occur.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.Serialize(System.IO.Stream)\">\r\n            Flushes and closes the XmpWriter.\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpWriter.Close\">\r\n            Flushes and closes the XmpWriter.\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.CONTRIBUTOR\">\r\n            External Contributors to the resource (other than the authors). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.COVERAGE\">\r\n            The extent or scope of the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.CREATOR\">\r\n            The authors of the resource (listed in order of precedence, if significant). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.DATE\">\r\n            Date(s) that something interesting happened to the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.DESCRIPTION\">\r\n            A textual description of the content of the resource. Multiple values may be present for different languages. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.FORMAT\">\r\n            The file format used when saving the resource. Tools and applications should set this property to the save format of the data. It may include appropriate qualifiers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.IDENTIFIER\">\r\n            Unique identifier of the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.LANGUAGE\">\r\n            An unordered array specifying the languages used in the\tresource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.PUBLISHER\">\r\n            Publishers. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.RELATION\">\r\n            Relationships to other documents. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.RIGHTS\">\r\n            Informal rights statement, selected by language. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.SOURCE\">\r\n            Unique identifier of the work from which this resource was derived. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.SUBJECT\">\r\n            An unordered array of descriptive phrases or keywords that specify the topic of the content of the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.TITLE\">\r\n            The title of the document, or the name given to the resource. Typically, it will be a name by which the resource is formally known. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.DublinCoreProperties.TYPE\">\r\n            A document type; for example, novel, poem, or working paper. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.AddTitle(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds a title.\r\n            \r\n             @param xmpMeta\r\n             @param title\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.SetTitle(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.String)\">\r\n             Sets a title.\r\n            \r\n             @param xmpMeta\r\n             @param title\r\n             @param genericLang  The name of the generic language\r\n             @param specificLang The name of the specific language\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.AddDescription(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds a description.\r\n            \r\n             @param xmpMeta\r\n             @param desc\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.SetDescription(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.String)\">\r\n             Sets a description.\r\n            \r\n             @param xmpMeta\r\n             @param desc\r\n             @param genericLang  The name of the generic language\r\n             @param specificLang The name of the specific language\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.AddSubject(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds a subject.\r\n            \r\n             @param xmpMeta\r\n             @param subject\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.SetSubject(iTextSharp.xmp.IXmpMeta,System.String[])\">\r\n             Sets a subject.\r\n            \r\n             @param xmpMeta\r\n             @param subject array of subjects\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.AddAuthor(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds a single author.\r\n            \r\n             @param xmpMeta\r\n             @param author\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.SetAuthor(iTextSharp.xmp.IXmpMeta,System.String[])\">\r\n             Sets an array of authors.\r\n            \r\n             @param xmpMeta\r\n             @param author\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.AddPublisher(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds a single publisher.\r\n            \r\n             @param xmpMeta\r\n             @param publisher\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.DublinCoreProperties.SetPublisher(iTextSharp.xmp.IXmpMeta,System.String[])\">\r\n             Sets an array of publishers.\r\n            \r\n             @param xmpMeta\r\n             @param publisher\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfProperties.KEYWORDS\">\r\n            Keywords. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfProperties.VERSION\">\r\n            The PDF file version (for example: 1.0, 1.3, and so on). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.PdfProperties.PRODUCER\">\r\n            The Producer. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfProperties.SetKeywords(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds keywords.\r\n            \r\n             @param xmpMeta\r\n             @param keywords\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfProperties.SetProducer(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds the producer.\r\n            \r\n             @param xmpMeta\r\n             @param producer\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.PdfProperties.SetVersion(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds the version.\r\n            \r\n             @param xmpMeta\r\n             @param version\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.ADVISORY\">\r\n            An unordered array specifying properties that were edited outside the authoring application. Each item should contain a single namespace and XPath separated by one ASCII space (U+0020). \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.BASEURL\">\r\n            The base URL for relative URLs in the document content. If this document contains Internet links, and those links are relative, they are relative to this base URL. This property provides a standard way for embedded relative URLs to be interpreted by tools. Web authoring tools should set the value based on their notion of where URLs will be interpreted. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.CREATEDATE\">\r\n            The date and time the resource was originally created. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.CREATORTOOL\">\r\n            The name of the first known tool used to create the resource. If history is present in the metadata, this value should be equivalent to that of xmpMM:History's softwareAgent property. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.IDENTIFIER\">\r\n            An unordered array of text strings that unambiguously identify the resource within a given context. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.METADATADATE\">\r\n            The date and time that any metadata for this resource was last changed. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.MODIFYDATE\">\r\n            The date and time the resource was last modified. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.NICKNAME\">\r\n            A short informal name for the resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpBasicProperties.THUMBNAILS\">\r\n            An alternative array of thumbnail images for a file, which can differ in characteristics such as size or image encoding. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicProperties.SetCreatorTool(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds the creatortool.\r\n            \r\n             @param xmpMeta\r\n             @param creator\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicProperties.SetCreateDate(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds the creation date.\r\n            \r\n             @param xmpMeta\r\n             @param date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicProperties.SetModDate(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds the modification date.\r\n            \r\n             @param xmpMeta\r\n             @param date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicProperties.SetMetaDataDate(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n             Adds the meta data date.\r\n            \r\n             @param xmpMeta\r\n             @param date\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicProperties.SetIdentifiers(iTextSharp.xmp.IXmpMeta,System.String[])\">\r\n            Sets the identifier.\r\n            \r\n             @param xmpMeta\r\n             @param id\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.xmp.XmpBasicProperties.SetNickname(iTextSharp.xmp.IXmpMeta,System.String)\">\r\n            Adds the nickname.\r\n            \r\n             @param xmpMeta\r\n             @param name\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.DERIVEDFROM\">\r\n            A reference to the original document from which this one is derived. It is a minimal reference; missing components can be assumed to be unchanged. For example, a new version might only need to specify the instance ID and version number of the previous version, or a rendition might only need to specify the instance ID and rendition class of the original. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.DOCUMENTID\">\r\n            The common identifier for all versions and renditions of a document. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.HISTORY\">\r\n            An ordered array of high-level user actions that resulted in this resource. It is intended to give human readers a general indication of the steps taken to make the changes from the previous version to this one. The list should be at an abstract level; it is not intended to be an exhaustive keystroke or other detailed history. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.MANAGEDFROM\">\r\n            A reference to the document as it was prior to becoming managed. It is set when a managed document is introduced to an asset management system that does not currently own it. It may or may not include references to different management systems. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.MANAGER\">\r\n            The name of the asset management system that manages this resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.MANAGETO\">\r\n            A URI identifying the managed resource to the asset management system; the presence of this property is the formal indication that this resource is managed. The form and content of this URI is private to the asset management system. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.MANAGEUI\">\r\n            A URI that can be used to access information about the managed resource through a web browser. It might require a custom browser plugin. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.MANAGERVARIANT\">\r\n            Specifies a particular variant of the asset management system. The format of this property is private to the specific asset management system. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.RENDITIONCLASS\">\r\n            The rendition class name for this resource.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.RENDITIONPARAMS\">\r\n             Can be used to provide additional rendition parameters that are too complex or verbose to encode in xmpMM: RenditionClass. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.VERSIONID\">\r\n            The document version identifier for this resource. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.xmp.XmpMMProperties.VERSIONS\">\r\n            The version history associated with this resource.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.XmlDomWriter\">\r\n            \r\n             @author psoares\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.XmlDomWriter.fOut\">\r\n            Print writer. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.XmlDomWriter.fCanonical\">\r\n            Canonical output. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.XmlDomWriter.fXML11\">\r\n            Processing XML 1.1 document. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.#ctor\">\r\n            Default constructor. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.SetCanonical(System.Boolean)\">\r\n            Sets whether output is canonical. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.SetOutput(System.IO.Stream,System.String)\">\r\n            Sets the output stream for printing. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.SetOutput(System.IO.TextWriter)\">\r\n            Sets the output writer. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.Write(System.Xml.XmlNode)\">\r\n            Writes the specified node, recursively. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.SortAttributes(System.Xml.XmlAttributeCollection)\">\r\n            Returns a sorted list of attributes. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.NormalizeAndPrint(System.String,System.Boolean)\">\r\n            Normalizes and prints the given string. \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlDomWriter.NormalizeAndPrint(System.Char,System.Boolean)\">\r\n            Normalizes and print the given character. \r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.XmlToTxt\">\r\n            This class converts XML into plain text stripping all tags.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.xml.XmlToTxt.buf\">\r\n            Buffer that stores all content that is encountered.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.Parse(System.IO.Stream)\">\r\n            Static method that parses an XML Stream.\r\n            @param is    the XML input that needs to be parsed\r\n            @return  a String obtained by removing all tags from the XML\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.#ctor\">\r\n            Creates an instance of XML to TXT.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.ToString\">\r\n            @return  the String after parsing.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.StartElement(System.String,System.Collections.Generic.IDictionary{System.String,System.String})\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#startElement(java.lang.String, java.util.Map)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.EndElement(System.String)\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#endElement(java.lang.String)\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.StartDocument\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#startDocument()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.EndDocument\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#endDocument()\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XmlToTxt.Text(System.String)\">\r\n            @see com.itextpdf.text.xml.simpleparser.SimpleXMLDocHandler#text(java.lang.String)\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.xml.XMLUtil\">\r\n             Contains utility methods for XML.\r\n             @author Balder\r\n             @since 5.0.6\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XMLUtil.EscapeXML(System.String,System.Boolean)\">\r\n            Escapes a string with the appropriated XML codes.\r\n            @param s the string to be escaped\r\n            @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>\r\n            @return the escaped string\r\n            @since 5.0.6\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.text.xml.XMLUtil.UnescapeXML(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.text.xml.XMLUtil.Unescape(System.String)\">\r\n            Unescapes 'lt', 'gt', 'apos', 'quote' and 'amp' to the\r\n            corresponding character values.\r\n            @param   s   a string representing a character\r\n            @return  a character value\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XMLUtil.IsValidCharacterValue(System.String)\">\r\n            Checks if a character value should be escaped/unescaped.\r\n            @param   s   the String representation of an integer\r\n            @return  true if it's OK to escape or unescape this value \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XMLUtil.IsValidCharacterValue(System.Int32)\">\r\n            Checks if a character value should be escaped/unescaped.\r\n            @param   c   a character value\r\n            @return  true if it's OK to escape or unescape this value \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XMLUtil.FindInArray(System.Char,System.Char[],System.Int32)\">\r\n            Looks for a character in a character array, starting from a certain position\r\n            @param needle    the character you're looking for\r\n            @param haystack  the character array\r\n            @param start     the start position\r\n            @return  the position where the character was found, or -1 if it wasn't found.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.xml.XMLUtil.GetEncodingName(System.Byte[])\">\r\n            Returns the IANA encoding name that is auto-detected from\r\n            the bytes specified, with the endian-ness of that encoding where appropriate.\r\n            (method found in org.apache.xerces.impl.XMLEntityManager, originally published\r\n            by the Apache Software Foundation under the Apache Software License; now being\r\n            used in iText under the MPL)\r\n            @param b4    The first four bytes of the input.\r\n            @return an IANA-encoding string\r\n            @since 5.0.6\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ZapfDingbatsList\">\r\n            \r\n            A special-version of <CODE>LIST</CODE> whitch use zapfdingbats-letters.\r\n            \r\n            @see com.lowagie.text.List\r\n            @author Michael Niedermair and Bruno Lowagie\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.ZapfDingbatsList.zn\">\r\n            char-number in zapfdingbats\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsList.#ctor(System.Int32)\">\r\n            Creates a ZapfDingbatsList\r\n            \r\n            @param zn a char-number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsList.#ctor(System.Int32,System.Int32)\">\r\n            Creates a ZapfDingbatsList\r\n            \r\n            @param zn a char-number\r\n            @param symbolIndent    indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsList.setDingbatColor(iTextSharp.text.BaseColor)\">\r\n             Sets the dingbat's color.\r\n            \r\n             @param zapfDingbatColor color for the ZapfDingbat\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ZapfDingbatsList.CharNumber\">\r\n            set the char-number \r\n            @param zn a char-number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsList.Add(iTextSharp.text.IElement)\">\r\n             Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.\r\n            \r\n             @param    o    the object to add.\r\n             @return true if adding the object succeeded\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.ZapfDingbatsNumberList\">\r\n            \r\n            A special-version of <CODE>LIST</CODE> whitch use zapfdingbats-numbers (1..10).\r\n            \r\n            @see com.lowagie.text.List\r\n            @version 2003-06-22\r\n            @author Michael Niedermair\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.ZapfDingbatsNumberList.type\">\r\n            which type\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsNumberList.#ctor(System.Int32)\">\r\n            Creates a ZapdDingbatsNumberList\r\n            @param type the type of list\r\n            @param symbolIndent  indent\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsNumberList.#ctor(System.Int32,System.Int32)\">\r\n            Creates a ZapdDingbatsNumberList\r\n            @param type the type of list\r\n            @param symbolIndent    indent\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.ZapfDingbatsNumberList.NumberType\">\r\n             get the type\r\n            \r\n             @return    char-number\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.ZapfDingbatsNumberList.Add(iTextSharp.text.IElement)\">\r\n             Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.\r\n            \r\n             @param    o    the object to add.\r\n             @return true if adding the object succeeded\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.api.IIndentable\">\r\n            Objects implementing Indentable allow to set indentation left and right.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.api.IIndentable.IndentationLeft\">\r\n             Sets the indentation on the left side.\r\n            \r\n             @param   indentation     the new indentation\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.api.IIndentable.IndentationRight\">\r\n             Sets the indentation on the right side.\r\n            \r\n             @param   indentation     the new indentation\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.api.ISpaceable\">\r\n            Objects implementing Spaceable allow setting spacing before and after.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.api.ISpaceable.SpacingBefore\">\r\n             Sets the spacing before.\r\n            \r\n             @param   spacing     the new spacing\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.api.ISpaceable.SpacingAfter\">\r\n             Sets the spacing after.\r\n            \r\n             @param   spacing     the new spacing\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.api.IWriterOperation\">\r\n             @author itextpdf.com\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.text.api.IWriterOperation.Write(iTextSharp.text.pdf.PdfWriter,iTextSharp.text.Document)\">\r\n            Receive a writer and the document to do certain operations on them.\r\n            @param writer the PdfWriter\r\n            @param doc the document\r\n            @throws DocumentException\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.Version\">\r\n            This class contains version information about iText.\r\n            DO NOT CHANGE THE VERSION INFORMATION WITHOUT PERMISSION OF THE COPYRIGHT HOLDERS OF ITEXT.\r\n            Changing the version makes it extremely difficult to debug an application.\r\n            Also, the nature of open source software is that you honor the copyright of the original creators of the software.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Version.AGPL\">\r\n            String that will indicate if the AGPL version is used. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Version.version\">\r\n            The iText version instance. \r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Version.iText\">\r\n            This String contains the name of the product.\r\n            iText is a registered trademark by iText Group NV.\r\n            Please don't change this constant.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Version.release\">\r\n            This String contains the version number of this iText release.\r\n            For debugging purposes, we request you NOT to change this constant.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Version.iTextVersion\">\r\n            This String contains the iText version as shown in the producer line.\r\n            iText is a product developed by iText Group NV.\r\n            iText Group requests that you retain the iText producer line\r\n            in every PDF that is created or manipulated using iText.\r\n        </member>\r\n        <member name=\"F:iTextSharp.text.Version.key\">\r\n            The license key.\r\n        </member>\r\n        <member name=\"M:iTextSharp.text.Version.GetInstance\">\r\n            Gets an instance of the iText version that is currently used.\r\n            Note that iText Group requests that you retain the iText producer line\r\n            in every PDF that is created or manipulated using iText.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Version.Product\">\r\n            \t     * Gets the product name.\r\n            \t     * iText Group requests that you retain the iText producer line\r\n            \t     * in every PDF that is created or manipulated using iText.\r\n                     * @return the product name\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Version.Release\">\r\n            \t     * Gets the release number.\r\n            \t     * iText Group requests that you retain the iText producer line\r\n            \t     * in every PDF that is created or manipulated using iText.\r\n                     * @return the release number\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Version.GetVersion\">\r\n            \t     * Returns the iText version as shown in the producer line.\r\n            \t     * iText is a product developed by iText Group NV.\r\n            \t     * iText Group requests that you retain the iText producer line\r\n            \t     * in every PDF that is created or manipulated using iText.\r\n                     * @return iText version\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Version.Key\">\r\n            Returns a license key if one was provided, or null if not.\r\n            @return a license key.\r\n        </member>\r\n        <member name=\"P:iTextSharp.text.Version.IsAGPLVersion\">\r\n            Checks if the AGPL version is used.\r\n            @return returns true if the AGPL version is used.\r\n        </member>\r\n        <member name=\"T:iTextSharp.text.WritableDirectElement\">\r\n             An element that is not an element, it holds {@link Element#WRITABLE_DIRECT}\r\n             as Element type. It implements WriterOperation to do operations on the\r\n             {@link PdfWriter} and the {@link Document} that must be done at the time of\r\n             the writing. Much like a {@link VerticalPositionMark} but little different.\r\n            \r\n             @author itextpdf.com\r\n            \r\n        </member>\r\n        <member name=\"P:iTextSharp.text.WritableDirectElement.Type\">\r\n            @return {@link Element#WRITABLE_DIRECT}\r\n        </member>\r\n        <member name=\"F:iTextSharp.awt.geom.AffineTransform.TYPE_UNKNOWN\">\r\n            The <code>TYPE_UNKNOWN</code> is an initial type value\r\n        </member>\r\n        <member name=\"F:iTextSharp.awt.geom.AffineTransform.ZERO\">\r\n            The min value equivalent to zero. If absolute value less then ZERO it considered as zero.  \r\n        </member>\r\n        <member name=\"F:iTextSharp.awt.geom.AffineTransform.m00\">\r\n            The values of transformation matrix\r\n        </member>\r\n        <member name=\"F:iTextSharp.awt.geom.AffineTransform.type\">\r\n            The transformation <code>type</code> \r\n        </member>\r\n        <member name=\"M:iTextSharp.awt.geom.AffineTransform.Multiply(iTextSharp.awt.geom.AffineTransform,iTextSharp.awt.geom.AffineTransform)\">\r\n            Multiply matrix of two AffineTransform objects \r\n            @param t1 - the AffineTransform object is a multiplicand\r\n            @param t2 - the AffineTransform object is a multiplier\r\n            @return an AffineTransform object that is a result of t1 multiplied by matrix t2. \r\n        </member>\r\n        <member name=\"M:iTextSharp.testutils.ITextTest.GetOutPdf\">\r\n            Gets the name of the resultant PDF file.\r\n            This name will be passed to <code>makePdf</code>, <code>assertPdf</code> and <code>comparePdf</code> methods.\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.testutils.ITextTest.GetCmpPdf\">\r\n            Gets the name of the compare PDF file.\r\n            This name will be passed to <code>comparePdf</code> method.\r\n            @return\r\n        </member>\r\n        <member name=\"M:iTextSharp.testutils.CompareTool.SetCompareByContentErrorsLimit(System.Int32)\">\r\n            Sets the maximum errors count which will be returned as the result of the comparison.\r\n            @param compareByContentMaxErrorCount the errors count.\r\n            @return Returns this.\r\n        </member>\r\n        <member name=\"M:iTextSharp.testutils.CompareTool.SetFloatAbsoluteError(System.Single)\">\r\n            Sets the absolute error parameter which will be used in floating point numbers comparison.\r\n            @param error the epsilon new value.\r\n            @return Returns this.\r\n        </member>\r\n        <member name=\"M:iTextSharp.testutils.CompareTool.SetFloatRelativeError(System.Single)\">\r\n            Sets the relative error parameter which will be used in floating point numbers comparison.\r\n            @param error the epsilon new value.\r\n            @return Returns this.\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.Base64\">\r\n            <summary>\r\n            A utility class to perform base64 encoding and decoding as specified\r\n            in RFC-1521. See also RFC 1421.\r\n            \r\n            @version     $Revision: 1.4 $\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.Base64.INVALID\">\r\n            <summary>\r\n            marker for invalid bytes </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.Base64.WHITESPACE\">\r\n            <summary>\r\n            marker for accepted whitespace bytes </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.Base64.EQUAL\">\r\n            <summary>\r\n            marker for an equal symbol </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Base64.Encode(System.Byte[])\">\r\n            <summary>\r\n            Encode the given byte[].\r\n            </summary>\r\n            <param name=\"src\"> the source string. </param>\r\n            <returns> the base64-encoded data. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Base64.Encode(System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Encode the given byte[].\r\n            </summary>\r\n            <param name=\"src\"> the source string. </param>\r\n            <param name=\"lineFeed\"> a linefeed is added after <code>linefeed</code> characters;\r\n                       must be dividable by four; 0 means no linefeeds </param>\r\n            <returns> the base64-encoded data. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Base64.Encode(System.String)\">\r\n            <summary>\r\n            Encode the given string. </summary>\r\n            <param name=\"src\"> the source string. </param>\r\n            <returns> the base64-encoded string. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Base64.Decode(System.Byte[])\">\r\n            <summary>\r\n            Decode the given byte[].\r\n            </summary>\r\n            <param name=\"src\">\r\n                       the base64-encoded data. </param>\r\n            <returns> the decoded data. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Base64.Decode(System.String)\">\r\n            <summary>\r\n            Decode the given string.\r\n            </summary>\r\n            <param name=\"src\"> the base64-encoded string. </param>\r\n            <returns> the decoded string. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.ByteBuffer\">\r\n            <summary>\r\n            Byte buffer container including length of valid data.\r\n            \r\n            @since   11.10.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.#ctor(System.Int32)\">\r\n            <param name=\"initialCapacity\"> the initial capacity for this buffer </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.#ctor(System.Byte[])\">\r\n            <param name=\"buffer\"> a byte array that will be wrapped with <code>ByteBuffer</code>. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.#ctor(System.Byte[],System.Int32)\">\r\n            <param name=\"buffer\"> a byte array that will be wrapped with <code>ByteBuffer</code>. </param>\r\n            <param name=\"length\"> the length of valid bytes in the array </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.#ctor(System.IO.Stream)\">\r\n            <summary>\r\n            Loads the stream into a buffer. \r\n            </summary>\r\n            <param name=\"in\"> an InputStream </param>\r\n            <exception cref=\"T:System.IO.IOException\"> If the stream cannot be read. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.#ctor(System.Byte[],System.Int32,System.Int32)\">\r\n            <param name=\"buffer\"> a byte array that will be wrapped with <code>ByteBuffer</code>. </param>\r\n            <param name=\"offset\"> the offset of the provided buffer. </param>\r\n            <param name=\"length\"> the length of valid bytes in the array </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.ByteBuffer.ByteStream\">\r\n            <returns> Returns a byte stream that is limited to the valid amount of bytes. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.ByteBuffer.Length\">\r\n            <returns> Returns the length, that means the number of valid bytes, of the buffer;\r\n            the inner byte array might be bigger than that. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.ByteBuffer.Encoding\">\r\n            <summary>\r\n            Detects the encoding of the byte buffer, stores and returns it. \r\n            Only UTF-8, UTF-16LE/BE and UTF-32LE/BE are recognized.\r\n            <em>Note:</em> UTF-32 flavors are not supported by Java, the XML-parser will complain.\r\n            </summary>\r\n            <returns> Returns the encoding string. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.ByteAt(System.Int32)\">\r\n            <param name=\"index\"> the index to retrieve the byte from </param>\r\n            <returns> Returns a byte from the buffer </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.CharAt(System.Int32)\">\r\n            <param name=\"index\"> the index to retrieve a byte as int or char. </param>\r\n            <returns> Returns a byte from the buffer </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.Append(System.Byte)\">\r\n            <summary>\r\n            Appends a byte to the buffer. </summary>\r\n            <param name=\"b\"> a byte </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.Append(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary>\r\n            Appends a byte array or part of to the buffer.\r\n            </summary>\r\n            <param name=\"bytes\"> a byte array </param>\r\n            <param name=\"offset\"> an offset with </param>\r\n            <param name=\"len\"> </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.Append(System.Byte[])\">\r\n            <summary>\r\n            Append a byte array to the buffer </summary>\r\n            <param name=\"bytes\"> a byte array </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.Append(iTextSharp.xmp.impl.ByteBuffer)\">\r\n            <summary>\r\n            Append another buffer to this buffer. </summary>\r\n            <param name=\"anotherBuffer\"> another <code>ByteBuffer</code> </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ByteBuffer.EnsureCapacity(System.Int32)\">\r\n            <summary>\r\n            Ensures the requested capacity by increasing the buffer size when the\r\n            current length is exceeded.\r\n            </summary>\r\n            <param name=\"requestedLength\"> requested new buffer length </param>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.CountOutputStream\">\r\n            <summary>\r\n            An <code>OutputStream</code> that counts the written bytes.\r\n            \r\n            @since   08.11.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.CountOutputStream._outp\">\r\n            <summary>\r\n            the decorated output stream </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.CountOutputStream._bytesWritten\">\r\n            <summary>\r\n            the byte counter </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.CountOutputStream.#ctor(System.IO.Stream)\">\r\n            <summary>\r\n            Constructor with providing the output stream to decorate. </summary>\r\n            <param name=\"out\"> an <code>OutputStream</code> </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.CountOutputStream.BytesWritten\">\r\n            <returns> the bytesWritten </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.CountOutputStream.Write(System.Byte[],System.Int32,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.CountOutputStream.Write(System.Byte[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.CountOutputStream.Write(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.FilterReader\">\r\n            <summary>\r\n            Abstract class for reading filtered character streams.\r\n            The abstract class <code>FilterReader</code> itself\r\n            provides default methods that pass all requests to\r\n            the contained stream. Subclasses of <code>FilterReader</code>\r\n            should override some of these methods and may also provide\r\n            additional methods and fields.\r\n            \r\n            @author      Mark Reinhold\r\n            @since       JDK1.1\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.FilterReader.Read\">\r\n             Reads a single character.\r\n            \r\n             @exception  IOException  If an I/O error occurs\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.FilterReader.Read(System.Char[],System.Int32,System.Int32)\">\r\n             Reads characters into a portion of an array.\r\n            \r\n             @exception  IOException  If an I/O error occurs\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.FilterReader.Close\">\r\n            **\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.FixAsciiControlsReader\">\r\n            <summary>\r\n            @since   22.08.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.FixAsciiControlsReader._control\">\r\n            <summary>\r\n            the result of the escaping sequence </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.FixAsciiControlsReader._digits\">\r\n            <summary>\r\n            count the digits of the sequence </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.FixAsciiControlsReader._state\">\r\n            <summary>\r\n            the state of the automaton </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.FixAsciiControlsReader.#ctor(System.IO.TextReader)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.FixAsciiControlsReader.Read(System.Char[],System.Int32,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.FixAsciiControlsReader.ProcessChar(System.Char)\">\r\n            <summary>\r\n            Processes numeric escaped chars to find out if they are a control character. </summary>\r\n            <param name=\"ch\"> a char </param>\r\n            <returns> Returns the char directly or as replacement for the escaped sequence. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.Iso8601Converter\">\r\n            <summary>\r\n            Converts between ISO 8601 Strings and <code>Calendar</code> with millisecond resolution.\r\n            \r\n            @since   16.02.2006\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Iso8601Converter.Parse(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.Iso8601Converter.Parse(System.String,iTextSharp.xmp.IXmpDateTime)\">\r\n            <param name=\"iso8601String\"> a date string that is ISO 8601 conform. </param>\r\n            <param name=\"binValue\"> an existing XMPDateTime to set with the parsed date </param>\r\n            <returns> Returns an XMPDateTime-object containing the ISO8601-date. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Is thrown when the string is non-conform. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Iso8601Converter.Render(iTextSharp.xmp.IXmpDateTime)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.ParseState\">\r\n            <summary>\r\n            @since   22.08.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.#ctor(System.String)\">\r\n            <param name=\"str\"> initializes the parser container </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.Length\">\r\n            <returns> Returns the length of the input. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.HasNext\">\r\n            <returns> Returns whether there are more chars to come. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.Ch(System.Int32)\">\r\n            <param name=\"index\"> index of char </param>\r\n            <returns> Returns char at a certain index. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.Ch\">\r\n            <returns> Returns the current char or 0x0000 if there are no more chars. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.Skip\">\r\n            <summary>\r\n            Skips the next char.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.Pos\">\r\n            <returns> Returns the current position. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseState.GatherInt(System.String,System.Int32)\">\r\n            <summary>\r\n            Parses a integer from the source and sets the pointer after it. </summary>\r\n            <param name=\"errorMsg\"> Error message to put in the exception if no number can be found </param>\r\n            <param name=\"maxValue\"> the max value of the number to return </param>\r\n            <returns> Returns the parsed integer. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if no integer can be found. </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.Latin1Converter\">\r\n            <summary>\r\n            @since   12.10.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Latin1Converter.#ctor\">\r\n            <summary>\r\n            Private constructor\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Latin1Converter.Convert(iTextSharp.xmp.impl.ByteBuffer)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.Latin1Converter.ConvertToUtf8(System.Byte)\">\r\n            <summary>\r\n            Converts a Cp1252 char (contains all Latin-1 chars above 0x80) into a\r\n            UTF-8 byte sequence. The bytes 0x81, 0x8D, 0x8F, 0x90, and 0x9D are\r\n            formally undefined by Windows 1252 and therefore replaced by a space\r\n            (0x20).\r\n            </summary>\r\n            <param name=\"ch\">\r\n                       an Cp1252 / Latin-1 byte </param>\r\n            <returns> Returns a byte array containing a UTF-8 byte sequence. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.ParameterAsserts\">\r\n            <summary>\r\n            @since   11.08.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.#ctor\">\r\n            <summary>\r\n            private constructor\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertArrayName(System.String)\">\r\n            <summary>\r\n            Asserts that an array name is set. </summary>\r\n            <param name=\"arrayName\"> an array name </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Array name is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertPropName(System.String)\">\r\n            <summary>\r\n            Asserts that a property name is set. </summary>\r\n            <param name=\"propName\"> a property name or path </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Property name is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertSchemaNs(System.String)\">\r\n            <summary>\r\n            Asserts that a schema namespace is set. </summary>\r\n            <param name=\"schemaNs\"> a schema namespace </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Schema is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertPrefix(System.String)\">\r\n            <summary>\r\n            Asserts that a prefix is set. </summary>\r\n            <param name=\"prefix\"> a prefix </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Prefix is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertSpecificLang(System.String)\">\r\n            <summary>\r\n            Asserts that a specific language is set. </summary>\r\n            <param name=\"specificLang\"> a specific lang </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Specific language is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertStructName(System.String)\">\r\n            <summary>\r\n            Asserts that a struct name is set. </summary>\r\n            <param name=\"structName\"> a struct name </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Struct name is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertNotNull(System.Object)\">\r\n            <summary>\r\n            Asserts that any string parameter is set. </summary>\r\n            <param name=\"param\"> any string parameter </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the parameter is null or has length 0. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParameterAsserts.AssertImplementation(iTextSharp.xmp.IXmpMeta)\">\r\n            <summary>\r\n            Asserts that the xmp object is of this implemention\r\n            (<seealso cref=\"T:iTextSharp.xmp.impl.XmpMetaImpl\"/>). </summary>\r\n            <param name=\"xmp\"> the XMP object </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> A wrong implentaion is used. </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.ParseRdf\">\r\n            <summary>\r\n            Parser for \"normal\" XML serialisation of RDF.  \r\n            \r\n            @since   14.07.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_RDF\">\r\n            <summary>\r\n            Start of coreSyntaxTerms. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_DATATYPE\">\r\n            <summary>\r\n            End of coreSyntaxTerms </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_DESCRIPTION\">\r\n            <summary>\r\n            Start of additions for syntax Terms. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_LI\">\r\n            <summary>\r\n            End of of additions for syntaxTerms. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_ABOUT_EACH\">\r\n            <summary>\r\n            Start of oldTerms. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_BAG_ID\">\r\n            <summary>\r\n            End of oldTerms. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.RDFTERM_FIRST_SYNTAX\">\r\n            <summary>\r\n            ! Yes, the syntax terms include the core terms. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.ParseRdf.DEFAULT_PREFIX\">\r\n            <summary>\r\n            this prefix is used for default namespaces </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.Parse(System.Xml.XmlNode)\">\r\n            <summary>\r\n            The main parsing method. The XML tree is walked through from the root node and and XMP tree\r\n            is created. This is a raw parse, the normalisation of the XMP tree happens outside.\r\n            </summary>\r\n            <param name=\"xmlRoot\"> the XML root node </param>\r\n            <returns> Returns an XMP metadata object (not normalized) </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Occurs if the parsing fails for any reason. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfRdf(iTextSharp.xmp.impl.XmpMetaImpl,System.Xml.XmlNode)\">\r\n            <summary>\r\n            Each of these parsing methods is responsible for recognizing an RDF\r\n            syntax production and adding the appropriate structure to the XMP tree.\r\n            They simply return for success, failures will throw an exception.\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"rdfRdfNode\"> the top-level xml node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.ParseRdf.RdfNodeElementList(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfNodeElement(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            <summary>\r\n            7.2.5 nodeElementURIs\r\n            \t\tanyURI - ( coreSyntaxTerms | rdf:li | oldTerms )\r\n            \r\n            7.2.11 nodeElement\r\n            \t\tstart-element ( URI == nodeElementURIs,\r\n            \t\tattributes == set ( ( idAttr | nodeIdAttr | aboutAttr )?, propertyAttr* ) )\r\n            \t\tpropertyEltList\r\n            \t\tend-element()\r\n            \r\n            A node element URI is rdf:Description or anything else that is not an RDF\r\n            term.\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfNodeElementAttrs(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            \r\n            <summary>\r\n            7.2.7 propertyAttributeURIs\r\n            \t\tanyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )\r\n            \r\n            7.2.11 nodeElement\r\n            start-element ( URI == nodeElementURIs,\r\n            \t\t\t\t\tattributes == set ( ( idAttr | nodeIdAttr | aboutAttr )?, propertyAttr* ) )\r\n            \t\t\t\t\tpropertyEltList\r\n            \t\t\t\t\tend-element()\r\n            \r\n            Process the attribute list for an RDF node element. A property attribute URI is \r\n            anything other than an RDF term. The rdf:ID and rdf:nodeID attributes are simply ignored, \r\n            as are rdf:about attributes on inner nodes.\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfPropertyElementList(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            <summary>\r\n            7.2.13 propertyEltList\r\n            ws* ( propertyElt ws* )*\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlParent\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfPropertyElement(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            <summary>\r\n            7.2.14 propertyElt\r\n            \r\n            \tresourcePropertyElt | literalPropertyElt | parseTypeLiteralPropertyElt |\r\n            \tparseTypeResourcePropertyElt | parseTypeCollectionPropertyElt | \r\n            \tparseTypeOtherPropertyElt | emptyPropertyElt\r\n            \r\n            7.2.15 resourcePropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, attributes == set ( idAttr? ) )\r\n            \tws* nodeElement ws*\r\n            \tend-element()\r\n            \r\n            7.2.16 literalPropertyElt\r\n            \tstart-element (\r\n            \t\tURI == propertyElementURIs, attributes == set ( idAttr?, datatypeAttr?) )\r\n            \ttext()\r\n            \tend-element()\r\n            \r\n            7.2.17 parseTypeLiteralPropertyElt\r\n            \tstart-element (\r\n            \t\tURI == propertyElementURIs, attributes == set ( idAttr?, parseLiteral ) )\r\n            \tliteral\r\n            \tend-element()\r\n            \r\n            7.2.18 parseTypeResourcePropertyElt\r\n            \tstart-element (\r\n            \t\t URI == propertyElementURIs, attributes == set ( idAttr?, parseResource ) )\r\n            \tpropertyEltList\r\n            \tend-element()\r\n            \r\n            7.2.19 parseTypeCollectionPropertyElt\r\n            \tstart-element (\r\n            \t\tURI == propertyElementURIs, attributes == set ( idAttr?, parseCollection ) )\r\n            \tnodeElementList\r\n            \tend-element()\r\n            \r\n            7.2.20 parseTypeOtherPropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseOther ) )\r\n            \tpropertyEltList\r\n            \tend-element()\r\n            \r\n            7.2.21 emptyPropertyElt\r\n            \tstart-element ( URI == propertyElementURIs,\r\n            \t\tattributes == set ( idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) )\r\n            \tend-element()\r\n            \r\n            The various property element forms are not distinguished by the XML element name, \r\n            but by their attributes for the most part. The exceptions are resourcePropertyElt and \r\n            literalPropertyElt. They are distinguished by their XML element content.\r\n            \r\n            NOTE: The RDF syntax does not explicitly include the xml:lang attribute although it can \r\n            appear in many of these. We have to allow for it in the attibute counts below.\t \r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfResourcePropertyElement(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            <summary>\r\n            7.2.15 resourcePropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, attributes == set ( idAttr? ) )\r\n            \tws* nodeElement ws*\r\n            \tend-element()\r\n            \r\n            This handles structs using an rdf:Description node, \r\n            arrays using rdf:Bag/Seq/Alt, and typedNodes. It also catches and cleans up qualified \r\n            properties written with rdf:Description and rdf:value.\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfLiteralPropertyElement(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            <summary>\r\n            7.2.16 literalPropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, \r\n            \t\t\tattributes == set ( idAttr?, datatypeAttr?) )\r\n            \ttext()\r\n            \tend-element()\r\n            \r\n            Add a leaf node with the text value and qualifiers for the attributes. </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfParseTypeLiteralPropertyElement\">\r\n            <summary>\r\n            7.2.17 parseTypeLiteralPropertyElt\r\n            \tstart-element ( URI == propertyElementURIs,\r\n            \t\tattributes == set ( idAttr?, parseLiteral ) )\r\n            \tliteral\r\n            \tend-element()\r\n            </summary>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfParseTypeResourcePropertyElement(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)\">\r\n            <summary>\r\n            7.2.18 parseTypeResourcePropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, \r\n            \t\tattributes == set ( idAttr?, parseResource ) )\r\n            \tpropertyEltList\r\n            \tend-element()\r\n            \r\n            Add a new struct node with a qualifier for the possible rdf:ID attribute. \r\n            Then process the XML child nodes to get the struct fields.\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfParseTypeCollectionPropertyElement\">\r\n            <summary>\r\n            7.2.19 parseTypeCollectionPropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, \r\n            \t\tattributes == set ( idAttr?, parseCollection ) )\r\n            \tnodeElementList\r\n            \tend-element()\r\n            </summary>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.RdfParseTypeOtherPropertyElement\">\r\n            <summary>\r\n            7.2.20 parseTypeOtherPropertyElt\r\n            \tstart-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseOther ) )\r\n            \tpropertyEltList\r\n            \tend-element()\r\n            </summary>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.ParseRdf.RdfEmptyPropertyElement(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.AddChildNode(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,System.Xml.XmlNode,System.String,System.Boolean)\">\r\n            <summary>\r\n            Adds a child node.\r\n            </summary>\r\n            <param name=\"xmp\"> the xmp metadata object that is generated </param>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"xmlNode\"> the currently processed XML node </param>\r\n            <param name=\"value\"> Node value </param>\r\n            <param name=\"isTopLevel\"> Flag if the node is a top-level node </param>\r\n            <returns> Returns the newly created child node. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.AddQualifierNode(iTextSharp.xmp.impl.XmpNode,System.String,System.String)\">\r\n            <summary>\r\n            Adds a qualifier node.\r\n            </summary>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <param name=\"name\"> the name of the qualifier which has to be \r\n            \t\tQName including the <b>default prefix</b> </param>\r\n            <param name=\"value\"> the value of the qualifier </param>\r\n            <returns> Returns the newly created child node. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.FixupQualifiedNode(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            The parent is an RDF pseudo-struct containing an rdf:value field. Fix the\r\n            XMP data model. The rdf:value node must be the first child, the other\r\n            children are qualifiers. The form, value, and children of the rdf:value\r\n            node are the real ones. The rdf:value node's qualifiers must be added to\r\n            the others.\r\n            </summary>\r\n            <param name=\"xmpParent\"> the parent xmp node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thown on parsing errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.IsWhitespaceNode(System.Xml.XmlNode)\">\r\n            <summary>\r\n            Checks if the node is a white space. </summary>\r\n            <param name=\"node\"> an XML-node </param>\r\n            <returns> Returns whether the node is a whitespace node, \r\n            \t\ti.e. a text node that contains only whitespaces. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.IsPropertyElementName(System.Int32)\">\r\n            <summary>\r\n            7.2.6 propertyElementURIs\r\n            \t\tanyURI - ( coreSyntaxTerms | rdf:Description | oldTerms )\r\n            </summary>\r\n            <param name=\"term\"> the term id </param>\r\n            <returns> Return true if the term is a property element name. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.ParseRdf.IsOldTerm(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.ParseRdf.IsCoreSyntaxTerm(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.ParseRdf.GetRdfTermKind(System.Xml.XmlNode)\">\r\n            <summary>\r\n            Determines the ID for a certain RDF Term.\r\n            Arranged to hopefully minimize the parse time for large XMP.\r\n            </summary>\r\n            <param name=\"node\"> an XML node </param>\r\n            <returns> Returns the term ID. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.PushbackReader\">\r\n            <summary>\r\n            A character-stream reader that allows characters to be pushed back into the\r\n            stream.\r\n            \r\n            @author      Mark Reinhold\r\n            @since       JDK1.1\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.PushbackReader._buf\">\r\n            <summary>\r\n            Pushback buffer </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.PushbackReader._pos\">\r\n            <summary>\r\n            Current position in buffer </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.PushbackReader.#ctor(System.IO.TextReader,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.#ctor(System.IO.TextReader)\">\r\n            <summary>\r\n            Creates a new pushback reader with a one-character pushback buffer.\r\n            </summary>\r\n            <param name=\"in\">  The reader from which characters will be read </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.EnsureOpen\">\r\n            <summary>\r\n            Checks to make sure that the stream has not been closed. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.Read\">\r\n            <summary>\r\n            Reads a single character.\r\n            </summary>\r\n            <returns>     The character read, or -1 if the end of the stream has been\r\n                        reached\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\">  If an I/O error occurs </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.Read(System.Char[],System.Int32,System.Int32)\">\r\n            <summary>\r\n            Reads characters into a portion of an array.\r\n            </summary>\r\n            <param name=\"cbuf\">  Destination buffer </param>\r\n            <param name=\"off\">   Offset at which to start writing characters </param>\r\n            <param name=\"len\">   Maximum number of characters to read\r\n            </param>\r\n            <returns>     The number of characters read, or -1 if the end of the\r\n                        stream has been reached\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\">  If an I/O error occurs </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.Unread(System.Int32)\">\r\n            <summary>\r\n            Pushes back a single character by copying it to the front of the\r\n            pushback buffer. After this method returns, the next character to be read\r\n            will have the value <code>(char)c</code>.\r\n            </summary>\r\n            <param name=\"c\">  The int value representing a character to be pushed back\r\n            </param>\r\n            <exception cref=\"T:System.IO.IOException\">  If the pushback buffer is full,\r\n                                     or if some other I/O error occurs </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.Unread(System.Char[],System.Int32,System.Int32)\">\r\n            <summary>\r\n            Pushes back a portion of an array of characters by copying it to the\r\n            front of the pushback buffer.  After this method returns, the next\r\n            character to be read will have the value <code>cbuf[off]</code>, the\r\n            character after that will have the value <code>cbuf[off+1]</code>, and\r\n            so forth.\r\n            </summary>\r\n            <param name=\"cbuf\">  Character array </param>\r\n            <param name=\"off\">   Offset of first character to push back </param>\r\n            <param name=\"len\">   Number of characters to push back\r\n            </param>\r\n            <exception cref=\"T:System.IO.IOException\">  If there is insufficient room in the pushback\r\n                                     buffer, or if some other I/O error occurs </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.Unread(System.Char[])\">\r\n            <summary>\r\n            Pushes back an array of characters by copying it to the front of the\r\n            pushback buffer.  After this method returns, the next character to be\r\n            read will have the value <code>cbuf[0]</code>, the character after that\r\n            will have the value <code>cbuf[1]</code>, and so forth.\r\n            </summary>\r\n            <param name=\"cbuf\">  Character array to push back\r\n            </param>\r\n            <exception cref=\"T:System.IO.IOException\">  If there is insufficient room in the pushback\r\n                                     buffer, or if some other I/O error occurs </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.PushbackReader.Close\">\r\n            <summary>\r\n            Closes the stream and releases any system resources associated with\r\n            it. Once the stream has been closed, further read(),\r\n            unread(), ready(), or skip() invocations will throw an IOException.\r\n            Closing a previously closed stream has no effect.\r\n            </summary>\r\n            <exception cref=\"T:System.IO.IOException\">  If an I/O error occurs </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.QName\">\r\n            <summary>\r\n            @since   09.11.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.QName._localName\">\r\n            <summary>\r\n            XML localname </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.QName._prefix\">\r\n            <summary>\r\n            XML namespace prefix </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.QName.#ctor(System.String)\">\r\n            <summary>\r\n            Splits a qname into prefix and localname. </summary>\r\n            <param name=\"qname\"> a QName </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.QName.#ctor(System.String,System.String)\">\r\n            <summary>\r\n            Constructor that initializes the fields </summary>\r\n            <param name=\"prefix\"> the prefix </param>\r\n            <param name=\"localName\"> the name </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.QName.LocalName\">\r\n            <returns> the localName </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.QName.Prefix\">\r\n            <returns> the prefix </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.QName.HasPrefix\">\r\n            <returns> Returns whether the QName has a prefix. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.Utils\">\r\n            <summary>\r\n            Utility functions for the XMPToolkit implementation.\r\n            \r\n            @since 06.06.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.Utils.UUID_SEGMENT_COUNT\">\r\n            <summary>\r\n            segments of a UUID </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.Utils.UUID_LENGTH\">\r\n            <summary>\r\n            length of a UUID </summary>\r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.Utils._xmlNameStartChars”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.Utils._xmlNameChars”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.#cctor\">\r\n            <summary>\r\n            init char tables </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.#ctor\">\r\n            <summary>\r\n            Private constructor\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Utils.NormalizeLangValue(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Utils.SplitNameAndValue(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.IsInternalProperty(System.String,System.String)\">\r\n            \r\n            <param name=\"schema\">\r\n                       a schema namespace </param>\r\n            <param name=\"prop\">\r\n                       an XMP Property </param>\r\n            <returns> Returns true if the property is defined as &quot;Internal\r\n                    Property&quot;, see XMP Specification. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.CheckUuidFormat(System.String)\">\r\n            <summary>\r\n            Check some requirements for an UUID:\r\n            <ul>\r\n            <li>Length of the UUID is 32</li>\r\n            <li>The Delimiter count is 4 and all the 4 delimiter are on their right\r\n            position (8,13,18,23)</li>\r\n            </ul>\r\n            \r\n            </summary>\r\n            <param name=\"uuid\"> uuid to test </param>\r\n            <returns> true - this is a well formed UUID, false - UUID has not the expected format </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Utils.IsXmlName(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.IsXmlNameNs(System.String)\">\r\n            <summary>\r\n            Checks if the value is a legal \"unqualified\" XML name, as\r\n            defined in the XML Namespaces proposed recommendation.\r\n            These are XML names, except that they must not contain a colon. </summary>\r\n            <param name=\"name\"> the value to check </param>\r\n            <returns> Returns true if the name is a valid \"unqualified\" XML name. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.IsControlChar(System.Char)\">\r\n            <param name=\"c\">  a char </param>\r\n            <returns> Returns true if the char is an ASCII control char. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.Utils.EscapeXml(System.String,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.RemoveControlChars(System.String)\">\r\n            <summary>\r\n            Replaces the ASCII control chars with a space.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       a node value </param>\r\n            <returns> Returns the cleaned up value </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.IsNameStartChar(System.Char)\">\r\n            <summary>\r\n            Simple check if a character is a valid XML start name char.\r\n            All characters according to the XML Spec 1.1 are accepted:\r\n            http://www.w3.org/TR/xml11/#NT-NameStartChar\r\n            </summary>\r\n            <param name=\"ch\"> a character </param>\r\n            <returns> Returns true if the character is a valid first char of an XML name. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.IsNameChar(System.Char)\">\r\n            <summary>\r\n            Simple check if a character is a valid XML name char\r\n            (every char except the first one), according to the XML Spec 1.1:\r\n            http://www.w3.org/TR/xml11/#NT-NameChar\r\n            </summary>\r\n            <param name=\"ch\"> a character </param>\r\n            <returns> Returns true if the character is a valid char of an XML name. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.Utils.InitCharTables\">\r\n            <summary>\r\n            Initializes the char tables for the chars 0x00-0xFF for later use,\r\n            according to the XML 1.1 specification\r\n            http://www.w3.org/TR/xml11\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpDateTimeImpl\">\r\n            <summary>\r\n            The implementation of <code>XMPDateTime</code>. Internally a <code>calendar</code> is used\r\n            plus an additional nano seconds field, because <code>Calendar</code> supports only milli\r\n            seconds. The <code>nanoSeconds</code> convers only the resolution beyond a milli second.\r\n            \r\n            @since 16.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpDateTimeImpl._nanoSeconds\">\r\n            <summary>\r\n            The nano seconds take micro and nano seconds, while the milli seconds are in the calendar.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpDateTimeImpl._timeZone\">\r\n            <summary>\r\n            Use NO time zone as default </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpDateTimeImpl.#ctor\">\r\n            <summary>\r\n            Creates an <code>XMPDateTime</code>-instance with the current time in the default time\r\n            zone.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpDateTimeImpl.#ctor(iTextSharp.xmp.XmpCalendar)\">\r\n            <summary>\r\n            Creates an <code>XMPDateTime</code>-instance from a calendar.\r\n            </summary>\r\n            <param name=\"calendar\"> a <code>Calendar</code> </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpDateTimeImpl.#ctor(System.DateTime,System.TimeZone)\">\r\n            <summary>\r\n            Creates an <code>XMPDateTime</code>-instance from \r\n            a <code>Date</code> and a <code>TimeZone</code>.\r\n            </summary>\r\n            <param name=\"date\"> a date describing an absolute point in time </param>\r\n            <param name=\"timeZone\"> a TimeZone how to interpret the date </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpDateTimeImpl.#ctor(System.String)\">\r\n            <summary>\r\n            Creates an <code>XMPDateTime</code>-instance from an ISO 8601 string.\r\n            </summary>\r\n            <param name=\"strValue\"> an ISO 8601 string </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the string is a non-conform ISO 8601 string, an exception is thrown </exception>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Year”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Month”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Day”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Hour”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Minute”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Second”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.NanoSecond”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpDateTimeImpl.CompareTo(System.Object)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.TimeZone”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpDateTimeImpl.HasDate”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpDateTimeImpl.HasTime”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpDateTimeImpl.HasTimeZone”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Calendar”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpDateTimeImpl.Iso8601String”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpDateTimeImpl.ToString\">\r\n            <returns> Returns the ISO string representation. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpIteratorImpl\">\r\n            <summary>\r\n            The <code>XMPIterator</code> implementation.\r\n            Iterates the XMP Tree according to a set of options.\r\n            During the iteration the XMPMeta-object must not be changed.\r\n            Calls to <code>skipSubtree()</code> / <code>skipSiblings()</code> will affect the iteration.\r\n             \r\n            @since   29.06.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl._nodeIterator\">\r\n            <summary>\r\n            the node iterator doing the work </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl._options\">\r\n            <summary>\r\n            stores the iterator options </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl._baseNs\">\r\n            <summary>\r\n            the base namespace of the property path, will be changed during the iteration </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl._skipSiblings\">\r\n            <summary>\r\n            flag to indicate that skipSiblings() has been called. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.skipSubtree\">\r\n            <summary>\r\n            flag to indicate that skipSiblings() has been called. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.#ctor(iTextSharp.xmp.impl.XmpMetaImpl,System.String,System.String,iTextSharp.xmp.options.IteratorOptions)\">\r\n            <summary>\r\n            Constructor with optionsl initial values. If <code>propName</code> is provided, \r\n            <code>schemaNs</code> has also be provided. </summary>\r\n            <param name=\"xmp\"> the iterated metadata object. </param>\r\n            <param name=\"schemaNs\"> the iteration is reduced to this schema (optional) </param>\r\n            <param name=\"propPath\"> the iteration is redurce to this property within the <code>schemaNs</code> </param>\r\n            <param name=\"options\"> advanced iteration options, see <seealso cref=\"T:iTextSharp.xmp.options.IteratorOptions\"/> </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the node defined by the paramters is not existing.  </exception>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpIteratorImpl.Options\">\r\n            <returns> Exposes the options for inner class. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpIteratorImpl.BaseNs\">\r\n            <returns> Exposes the options for inner class. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpIteratorImpl.SkipSubtree”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpIteratorImpl.SkipSiblings”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpIteratorImpl.MoveNext”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpIteratorImpl.Current”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator\">\r\n            <summary>\r\n            The <code>XMPIterator</code> implementation.\r\n            It first returns the node itself, then recursivly the children and qualifier of the node.\r\n            \r\n            @since   29.06.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.ITERATE_NODE\">\r\n            <summary>\r\n            iteration state </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.ITERATE_CHILDREN\">\r\n            <summary>\r\n            iteration state </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.ITERATE_QUALIFIER\">\r\n            <summary>\r\n            iteration state </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._path\">\r\n            <summary>\r\n            the recursively accumulated path </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._visitedNode\">\r\n            <summary>\r\n            the currently visited node </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._childrenIterator\">\r\n            <summary>\r\n            the iterator that goes through the children and qualifier list </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._index\">\r\n            <summary>\r\n            index of node with parent, only interesting for arrays </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._returnProperty\">\r\n            <summary>\r\n            the cached <code>PropertyInfo</code> to return </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._state\">\r\n            <summary>\r\n            the state of the iteration </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator._subIterator\">\r\n            <summary>\r\n            the iterator for each child </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.#ctor(iTextSharp.xmp.impl.XmpIteratorImpl,iTextSharp.xmp.impl.XmpNode,System.String,System.Int32)\">\r\n            <summary>\r\n            Constructor for the node iterator. </summary>\r\n            <param name=\"visitedNode\"> the currently visited node </param>\r\n            <param name=\"parentPath\"> the accumulated path of the node </param>\r\n            <param name=\"index\"> the index within the parent node (only for arrays) </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.ChildrenIterator\">\r\n            <returns> the childrenIterator </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.ReturnProperty\">\r\n            <returns> Returns the returnProperty. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.MoveNext”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.ReportNode\">\r\n            <summary>\r\n            Sets the returnProperty as next item or recurses into <code>hasNext()</code>. </summary>\r\n            <returns> Returns if there is a next item to return.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.IterateChildren(System.Collections.IEnumerator)\">\r\n            <summary>\r\n            Handles the iteration of the children or qualfier </summary>\r\n            <param name=\"iterator\"> an iterator </param>\r\n            <returns> Returns if there are more elements available. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.AccumulatePath(iTextSharp.xmp.impl.XmpNode,System.String,System.Int32)\">\r\n            <param name=\"currNode\"> the node that will be added to the path. </param>\r\n            <param name=\"parentPath\"> the path up to this node. </param>\r\n            <param name=\"currentIndex\"> the current array index if an arrey is traversed </param>\r\n            <returns> Returns the updated path. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIterator.CreatePropertyInfo(iTextSharp.xmp.impl.XmpNode,System.String,System.String)\">\r\n            <summary>\r\n            Creates a property info object from an <code>XMPNode</code>. </summary>\r\n            <param name=\"node\"> an <code>XMPNode</code> </param>\r\n            <param name=\"baseNs\"> the base namespace to report </param>\r\n            <param name=\"path\"> the full property path </param>\r\n            <returns> Returns a <code>XMPProperty</code>-object that serves representation of the node. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIteratorChildren\">\r\n            <summary>\r\n            This iterator is derived from the default <code>NodeIterator</code>,\r\n            and is only used for the option <seealso cref=\"F:iTextSharp.xmp.options.IteratorOptions.JUST_CHILDREN\"/>.\r\n            \r\n            @since 02.10.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIteratorChildren.#ctor(iTextSharp.xmp.impl.XmpIteratorImpl,iTextSharp.xmp.impl.XmpNode,System.String)\">\r\n            <summary>\r\n            Constructor </summary>\r\n            <param name=\"parentNode\"> the node which children shall be iterated. </param>\r\n            <param name=\"parentPath\"> the full path of the former node without the leaf node. </param>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpIteratorImpl.NodeIteratorChildren.MoveNext”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpMetaImpl\">\r\n            <summary>\r\n            Implementation for <seealso cref=\"T:iTextSharp.xmp.IXmpMeta\"/>.\r\n            \r\n            @since 17.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpMetaImpl.VALUE_STRING\">\r\n            <summary>\r\n            Property values are Strings by default </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpMetaImpl._tree\">\r\n            <summary>\r\n            root of the metadata tree </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpMetaImpl._packetHeader\">\r\n            <summary>\r\n            the xpacket processing instructions content </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaImpl.#ctor\">\r\n            <summary>\r\n            Constructor for an empty metadata object.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaImpl.#ctor(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Constructor for a cloned metadata tree.\r\n            </summary>\r\n            <param name=\"tree\">\r\n                       an prefilled metadata tree which fulfills all\r\n                       <code>XMPNode</code> contracts. </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpMetaImpl.Root\">\r\n            <returns> Returns the root node of the XMP tree. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.AppendArrayItem(System.String,System.String,iTextSharp.xmp.options.PropertyOptions,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.AppendArrayItem(System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.CountArrayItems(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DeleteArrayItem(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DeleteProperty(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DeleteQualifier(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DeleteStructField(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DoesPropertyExist(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DoesArrayItemExist(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DoesStructFieldExist(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DoesQualifierExist(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetArrayItem(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetLocalizedText(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetLocalizedText(System.String,System.String,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetLocalizedText(System.String,System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetProperty(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyBoolean(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyBoolean(System.String,System.String,System.Boolean,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyBoolean(System.String,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyInteger(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyInteger(System.String,System.String,System.Int32,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyInteger(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyLong(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyLong(System.String,System.String,System.Int64,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyLong(System.String,System.String,System.Int64)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyDouble(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyDouble(System.String,System.String,System.Double,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyDouble(System.String,System.String,System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyDate(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyDate(System.String,System.String,iTextSharp.xmp.IXmpDateTime,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyDate(System.String,System.String,iTextSharp.xmp.IXmpDateTime)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyCalendar(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyCalendar(System.String,System.String,System.DateTime,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyCalendar(System.String,System.String,System.DateTime)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyBase64(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyString(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyBase64(System.String,System.String,System.SByte[],iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetPropertyBase64(System.String,System.String,System.SByte[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetQualifier(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetStructField(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.Iterator”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.Iterator(iTextSharp.xmp.options.IteratorOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.Iterator(System.String,System.String,iTextSharp.xmp.options.IteratorOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetArrayItem(System.String,System.String,System.Int32,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetArrayItem(System.String,System.String,System.Int32,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.InsertArrayItem(System.String,System.String,System.Int32,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.InsertArrayItem(System.String,System.String,System.Int32,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetProperty(System.String,System.String,System.Object,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetProperty(System.String,System.String,System.Object)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetQualifier(System.String,System.String,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetQualifier(System.String,System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetStructField(System.String,System.String,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.SetStructField(System.String,System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpMetaImpl.ObjectName”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:iTextSharp.xmp.impl.XmpMetaImpl.PacketHeader”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.Clone”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.DumpObject”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.Sort”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.Normalize(iTextSharp.xmp.options.ParseOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetProperty(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaImpl.GetPropertyObject(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaImpl.DoSetArrayItem(iTextSharp.xmp.impl.XmpNode,System.Int32,System.String,iTextSharp.xmp.options.PropertyOptions,System.Boolean)\">\r\n            <summary>\r\n            Locate or create the item node and set the value. Note the index\r\n            parameter is one-based! The index can be in the range [1..size + 1] or\r\n            \"last()\", normalize it and check the insert flags. The order of the\r\n            normalization checks is important. If the array is empty we end up with\r\n            an index and location to set item size + 1.\r\n            </summary>\r\n            <param name=\"arrayNode\"> an array node </param>\r\n            <param name=\"itemIndex\"> the index where to insert the item </param>\r\n            <param name=\"itemValue\"> the item value </param>\r\n            <param name=\"itemOptions\"> the options for the new item </param>\r\n            <param name=\"insert\"> insert oder overwrite at index position? </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaImpl.SetNode(iTextSharp.xmp.impl.XmpNode,System.Object,iTextSharp.xmp.options.PropertyOptions,System.Boolean)\">\r\n            <summary>\r\n            The internals for SetProperty() and related calls, used after the node is\r\n            found or created.\r\n            </summary>\r\n            <param name=\"node\">\r\n                       the newly created node </param>\r\n            <param name=\"value\">\r\n                       the node value, can be <code>null</code> </param>\r\n            <param name=\"newOptions\">\r\n                       options for the new node, must not be <code>null</code>. </param>\r\n            <param name=\"deleteExisting\"> flag if the existing value is to be overwritten </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thrown if options and value do not correspond </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaImpl.evaluateNodeValue(System.Int32,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Evaluates a raw node value to the given value type, apply special\r\n            conversions for defined types in XMP.\r\n            </summary>\r\n            <param name=\"valueType\">\r\n                       an int indicating the value type </param>\r\n            <param name=\"propNode\">\r\n                       the node containing the value </param>\r\n            <returns> Returns a literal value for the node. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpMetaParser\">\r\n            <summary>\r\n            This class replaces the <code>ExpatAdapter.cpp</code> and does the\r\n            XML-parsing and fixes the prefix. After the parsing several normalisations\r\n            are applied to the XMPTree.\r\n            \r\n            @since 01.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaParser.#ctor\">\r\n            <summary>\r\n            Hidden constructor, initialises the SAX parser handler.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaParser.Parse(System.Object,iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Parses the input source into an XMP metadata object, including\r\n            de-aliasing and normalisation.\r\n            </summary>\r\n            <param name=\"input\"> the input can be an <code>InputStream</code>, a <code>String</code> or \r\n            \t\t\ta byte buffer containing the XMP packet. </param>\r\n            <param name=\"options\"> the parse options </param>\r\n            <returns> Returns the resulting XMP metadata object </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if parsing or normalisation fails. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaParser.ParseXml(System.Object,iTextSharp.xmp.options.ParseOptions)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaParser.ParseXmlFromInputStream(System.IO.Stream,iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Parses XML from an <seealso cref=\"T:System.IO.Stream\"/>,\r\n            fixing the encoding (Latin-1 to UTF-8) and illegal control character optionally.\r\n            </summary>\r\n            <param name=\"stream\"> an <code>InputStream</code> </param>\r\n            <param name=\"options\"> the parsing options </param>\r\n            <returns> Returns an XML DOM-Document. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown when the parsing fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaParser.ParseXmlFromBytebuffer(iTextSharp.xmp.impl.ByteBuffer,iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Parses XML from a byte buffer, \r\n            fixing the encoding (Latin-1 to UTF-8) and illegal control character optionally.\r\n            </summary>\r\n            <param name=\"buffer\"> a byte buffer containing the XMP packet </param>\r\n            <param name=\"options\"> the parsing options </param>\r\n            <returns> Returns an XML DOM-Document. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown when the parsing fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpMetaParser.ParseXmlFromString(System.String,iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Parses XML from a <seealso cref=\"T:System.String\"/>, \r\n            fixing the illegal control character optionally.\r\n            </summary>\r\n            <param name=\"input\"> a <code>String</code> containing the XMP packet </param>\r\n            <param name=\"options\"> the parsing options </param>\r\n            <returns> Returns an XML DOM-Document. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown when the parsing fails. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpMetaParser.FindRootNode(System.Xml.XmlNode,System.Boolean,System.Object[])”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpNode\">\r\n            <summary>\r\n            A node in the internally XMP tree, which can be a schema node, a property node, an array node,\r\n            an array item, a struct node or a qualifier node (without '?').\r\n            \r\n            Possible improvements:\r\n            \r\n            1. The kind Node of node might be better represented by a class-hierarchy of different nodes.\r\n            2. The array type should be an enum\r\n            3. isImplicitNode should be removed completely and replaced by return values of fi.\r\n            4. hasLanguage, hasType should be automatically maintained by XMPNode\r\n            \r\n            @since 21.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._alias\">\r\n            <summary>\r\n            flag if the node is an alias </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._children\">\r\n            <summary>\r\n            list of child nodes, lazy initialized </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._hasAliases\">\r\n            <summary>\r\n            flag if the node has aliases </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._hasValueChild\">\r\n            <summary>\r\n            flag if the node has an \"rdf:value\" child node. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._implicit\">\r\n            <summary>\r\n            flag if the node is implicitly created </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._name\">\r\n            <summary>\r\n            name of the node, contains different information depending of the node kind </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._options\">\r\n            <summary>\r\n            options describing the kind of the node </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._parent\">\r\n            <summary>\r\n            link to the parent node </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._qualifier\">\r\n            <summary>\r\n            list of qualifier of the node, lazy initialized </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNode._value\">\r\n            <summary>\r\n            value of the node, contains different information depending of the node kind </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.#ctor(System.String,System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Creates an <code>XMPNode</code> with initial values.\r\n            </summary>\r\n            <param name=\"name\"> the name of the node </param>\r\n            <param name=\"value\"> the value of the node </param>\r\n            <param name=\"options\"> the options of the node </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.#ctor(System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Constructor for the node without value.\r\n            </summary>\r\n            <param name=\"name\"> the name of the node </param>\r\n            <param name=\"options\"> the options of the node </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Parent\">\r\n            <returns> Returns the parent node. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.ChildrenLength\">\r\n            <returns> Returns the number of children without neccessarily creating a list. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.QualifierLength\">\r\n            <returns> Returns the number of qualifier without neccessarily creating a list. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Name\">\r\n            <returns> Returns the name. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Value\">\r\n            <returns> Returns the value. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Options\">\r\n            <returns> Returns the options. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Implicit\">\r\n            <returns> Returns the implicit flag </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.HasAliases\">\r\n            <returns> Returns if the node contains aliases (applies only to schema nodes) </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Alias\">\r\n            <returns> Returns if the node contains aliases (applies only to schema nodes) </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.HasValueChild\">\r\n            <returns> the hasValueChild </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.LanguageNode\">\r\n            <returns> Returns whether this node is a language qualifier.  </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.TypeNode\">\r\n            <returns> Returns whether this node is a type qualifier.  </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Children\">\r\n            <summary>\r\n            <em>Note:</em> This method should always be called when accessing 'children' to be sure\r\n            that its initialized. </summary>\r\n            <returns> Returns list of children that is lazy initialized. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.UnmodifiableChildren\">\r\n            <returns> Returns a read-only copy of child nodes list. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.XmpNode.Qualifier\">\r\n            <returns> Returns list of qualifier that is lazy initialized. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpNode.Clone”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpNode.CompareTo(System.Object)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.Clear\">\r\n            <summary>\r\n            Resets the node.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.GetChild(System.Int32)\">\r\n            <param name=\"index\"> an index [1..size] </param>\r\n            <returns> Returns the child with the requested index. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.AddChild(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Adds a node as child to this node. </summary>\r\n            <param name=\"node\"> an XMPNode </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.AddChild(System.Int32,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Adds a node as child to this node. </summary>\r\n            <param name=\"index\"> the index of the node <em>before</em> which the new one is inserted.\r\n            <em>Note:</em> The node children are indexed from [1..size]! \r\n            An index of size + 1 appends a node. </param>\r\n            <param name=\"node\"> an XMPNode </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.ReplaceChild(System.Int32,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Replaces a node with another one. </summary>\r\n            <param name=\"index\"> the index of the node that will be replaced.\r\n            <em>Note:</em> The node children are indexed from [1..size]! </param>\r\n            <param name=\"node\"> the replacement XMPNode </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.RemoveChild(System.Int32)\">\r\n            <summary>\r\n            Removes a child at the requested index. </summary>\r\n            <param name=\"itemIndex\"> the index to remove [1..size]  </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.RemoveChild(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Removes a child node.\r\n            If its a schema node and doesn't have any children anymore, its deleted.\r\n            </summary>\r\n            <param name=\"node\"> the child node to delete. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.CleanupChildren\">\r\n            <summary>\r\n            Removes the children list if this node has no children anymore;\r\n            checks if the provided node is a schema node and doesn't have any children anymore, \r\n            its deleted.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.RemoveChildren\">\r\n            <summary>\r\n            Removes all children from the node. \r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.FindChildByName(System.String)\">\r\n            <param name=\"expr\"> child node name to look for </param>\r\n            <returns> Returns an <code>XMPNode</code> if node has been found, <code>null</code> otherwise.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.GetQualifier(System.Int32)\">\r\n            <param name=\"index\"> an index [1..size] </param>\r\n            <returns> Returns the qualifier with the requested index. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.AddQualifier(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Appends a qualifier to the qualifier list and sets respective options. </summary>\r\n            <param name=\"qualNode\"> a qualifier node. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.RemoveQualifier(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Removes one qualifier node and fixes the options. </summary>\r\n            <param name=\"qualNode\"> qualifier to remove </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.RemoveQualifiers\">\r\n            <summary>\r\n            Removes all qualifiers from the node and sets the options appropriate. \r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.FindQualifierByName(System.String)\">\r\n            <param name=\"expr\"> qualifier node name to look for </param>\r\n            <returns> Returns a qualifier <code>XMPNode</code> if node has been found, \r\n            <code>null</code> otherwise.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.HasChildren\">\r\n            <returns> Returns whether the node has children. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.IterateChildren\">\r\n            <returns> Returns an iterator for the children.\r\n            <em>Note:</em> take care to use it.remove(), as the flag are not adjusted in that case. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.HasQualifier\">\r\n            <returns> Returns whether the node has qualifier attached. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.IterateQualifier\">\r\n            <returns> Returns an iterator for the qualifier.\r\n            <em>Note:</em> take care to use it.remove(), as the flag are not adjusted in that case. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.CloneSubtree(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Performs a <b>deep clone</b> of the complete subtree (children and\r\n            qualifier )into and add it to the destination node.\r\n            </summary>\r\n            <param name=\"destination\"> the node to add the cloned subtree </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.DumpNode(System.Boolean)\">\r\n            <summary>\r\n            Renders this node and the tree unter this node in a human readable form. </summary>\r\n            <param name=\"recursive\"> Flag is qualifier and child nodes shall be rendered too </param>\r\n            <returns> Returns a multiline string containing the dump. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpNode.Sort”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.DumpNode(System.Text.StringBuilder,System.Boolean,System.Int32,System.Int32)\">\r\n            <summary>\r\n            Dumps this node and its qualifier and children recursively.\r\n            <em>Note:</em> It creats empty options on every node.\r\n            </summary>\r\n            <param name=\"result\"> the buffer to append the dump. </param>\r\n            <param name=\"recursive\"> Flag is qualifier and child nodes shall be rendered too </param>\r\n            <param name=\"indent\"> the current indent level. </param>\r\n            <param name=\"index\"> the index within the parent node (important for arrays)  </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.find(System.Collections.IList,System.String)\">\r\n            <summary>\r\n            Internal find. </summary>\r\n            <param name=\"list\"> the list to search in </param>\r\n            <param name=\"expr\"> the search expression </param>\r\n            <returns> Returns the found node or <code>nulls</code>. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.AssertChildNotExisting(System.String)\">\r\n            <summary>\r\n            Checks that a node name is not existing on the same level, except for array items. </summary>\r\n            <param name=\"childName\"> the node name to check </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if a node with the same name is existing. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNode.AssertQualifierNotExisting(System.String)\">\r\n            <summary>\r\n            Checks that a qualifier name is not existing on the same level. </summary>\r\n            <param name=\"qualifierName\"> the new qualifier name </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if a node with the same name is existing. </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpNodeUtils\">\r\n            <summary>\r\n            Utilities for <code>XMPNode</code>.\r\n            \r\n            @since   Aug 28, 2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.#ctor\">\r\n            <summary>\r\n            Private Constructor\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.FindSchemaNode(iTextSharp.xmp.impl.XmpNode,System.String,System.Boolean)\">\r\n            <summary>\r\n            Find or create a schema node if <code>createNodes</code> is false and\r\n            </summary>\r\n            <param name=\"tree\"> the root of the xmp tree. </param>\r\n            <param name=\"namespaceUri\"> a namespace </param>\r\n            <param name=\"createNodes\"> a flag indicating if the node shall be created if not found.\r\n            \t\t  <em>Note:</em> The namespace must be registered prior to this call.\r\n            </param>\r\n            <returns> Returns the schema node if found, <code>null</code> otherwise.\r\n            \t\t   Note: If <code>createNodes</code> is <code>true</code>, it is <b>always</b>\r\n            \t\t   returned a valid node. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> An exception is only thrown if an error occurred, not if a\r\n                    \t\tnode was not found. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.FindSchemaNode(iTextSharp.xmp.impl.XmpNode,System.String,System.String,System.Boolean)\">\r\n            <summary>\r\n            Find or create a schema node if <code>createNodes</code> is true.\r\n            </summary>\r\n            <param name=\"tree\"> the root of the xmp tree. </param>\r\n            <param name=\"namespaceUri\"> a namespace </param>\r\n            <param name=\"suggestedPrefix\"> If a prefix is suggested, the namespace is allowed to be registered. </param>\r\n            <param name=\"createNodes\"> a flag indicating if the node shall be created if not found.\r\n            \t\t  <em>Note:</em> The namespace must be registered prior to this call.\r\n            </param>\r\n            <returns> Returns the schema node if found, <code>null</code> otherwise.\r\n            \t\t   Note: If <code>createNodes</code> is <code>true</code>, it is <b>always</b>\r\n            \t\t   returned a valid node. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> An exception is only thrown if an error occurred, not if a\r\n                    \t\tnode was not found. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.FindChildNode(iTextSharp.xmp.impl.XmpNode,System.String,System.Boolean)\">\r\n            <summary>\r\n            Find or create a child node under a given parent node. If the parent node is no \r\n            Returns the found or created child node.\r\n            </summary>\r\n            <param name=\"parent\">\r\n                       the parent node </param>\r\n            <param name=\"childName\">\r\n                       the node name to find </param>\r\n            <param name=\"createNodes\">\r\n                       flag, if new nodes shall be created. </param>\r\n            <returns> Returns the found or created node or <code>null</code>. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.FindNode(iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.impl.xpath.XmpPath,System.Boolean,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Follow an expanded path expression to find or create a node.\r\n            </summary>\r\n            <param name=\"xmpTree\"> the node to begin the search. </param>\r\n            <param name=\"xpath\"> the complete xpath </param>\r\n            <param name=\"createNodes\"> flag if nodes shall be created \r\n            \t\t\t(when called by <code>setProperty()</code>) </param>\r\n            <param name=\"leafOptions\"> the options for the created leaf nodes (only when\r\n            \t\t<code>createNodes == true</code>). </param>\r\n            <returns> Returns the node if found or created or <code>null</code>. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> An exception is only thrown if an error occurred, \r\n            \t\t\tnot if a node was not found. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.DeleteNode(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Deletes the the given node and its children from its parent.\r\n            Takes care about adjusting the flags. </summary>\r\n            <param name=\"node\"> the top-most node to delete. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.SetNodeValue(iTextSharp.xmp.impl.XmpNode,System.Object)\">\r\n            <summary>\r\n            This is setting the value of a leaf node.\r\n            </summary>\r\n            <param name=\"node\"> an XMPNode </param>\r\n            <param name=\"value\"> a value </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.VerifySetOptions(iTextSharp.xmp.options.PropertyOptions,System.Object)\">\r\n            <summary>\r\n            Verifies the PropertyOptions for consistancy and updates them as needed. \r\n            If options are <code>null</code> they are created with default values.\r\n            </summary>\r\n            <param name=\"options\"> the <code>PropertyOptions</code> </param>\r\n            <param name=\"itemValue\"> the node value to set </param>\r\n            <returns> Returns the updated options. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the options are not consistant.  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.SerializeNodeValue(System.Object)\">\r\n            <summary>\r\n            Converts the node value to String, apply special conversions for defined\r\n            types in XMP.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       the node value to set </param>\r\n            <returns> Returns the String representation of the node value. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpNodeUtils.FollowXPathStep(iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.impl.xpath.XmpPathSegment,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.FindQualifierNode(iTextSharp.xmp.impl.XmpNode,System.String,System.Boolean)\">\r\n            <summary>\r\n            Find or create a qualifier node under a given parent node. Returns a pointer to the \r\n            qualifier node, and optionally an iterator for the node's position in \r\n            the parent's vector of qualifiers. The iterator is unchanged if no qualifier node (null) \r\n            is returned.\r\n            <em>Note:</em> On entry, the qualName parameter must not have the leading '?' from the \r\n            XmpPath step.\r\n            </summary>\r\n            <param name=\"parent\"> the parent XMPNode </param>\r\n            <param name=\"qualName\"> the qualifier name </param>\r\n            <param name=\"createNodes\"> flag if nodes shall be created </param>\r\n            <returns> Returns the qualifier node if found or created, <code>null</code> otherwise. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.FindIndexedItem(iTextSharp.xmp.impl.XmpNode,System.String,System.Boolean)\">\r\n            <param name=\"arrayNode\"> an array node </param>\r\n            <param name=\"segment\"> the segment containing the array index </param>\r\n            <param name=\"createNodes\"> flag if new nodes are allowed to be created. </param>\r\n            <returns> Returns the index or index = -1 if not found </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Throws Exceptions </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.LookupFieldSelector(iTextSharp.xmp.impl.XmpNode,System.String,System.String)\">\r\n            <summary>\r\n            Searches for a field selector in a node:\r\n            [fieldName=\"value] - an element in an array of structs, chosen by a field value.\r\n            No implicit nodes are created by field selectors. \r\n            </summary>\r\n            <param name=\"arrayNode\"> </param>\r\n            <param name=\"fieldName\"> </param>\r\n            <param name=\"fieldValue\"> </param>\r\n            <returns> Returns the index of the field if found, otherwise -1. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.LookupQualSelector(iTextSharp.xmp.impl.XmpNode,System.String,System.String,System.UInt32)\">\r\n            <summary>\r\n            Searches for a qualifier selector in a node:\r\n            [?qualName=\"value\"] - an element in an array, chosen by a qualifier value.\r\n            No implicit nodes are created for qualifier selectors, \r\n            except for an alias to an x-default item.\r\n            </summary>\r\n            <param name=\"arrayNode\"> an array node </param>\r\n            <param name=\"qualName\"> the qualifier name </param>\r\n            <param name=\"qualValue\"> the qualifier value </param>\r\n            <param name=\"aliasForm\"> in case the qual selector results from an alias,\r\n            \t\t  an x-default node is created if there has not been one. </param>\r\n            <returns> Returns the index of th </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.NormalizeLangArray(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Make sure the x-default item is first. Touch up &quot;single value&quot;\r\n            arrays that have a default plus one real language. This case should have\r\n            the same value for both items. Older Adobe apps were hardwired to only\r\n            use the &quot;x-default&quot; item, so we copy that value to the other\r\n            item.\r\n            </summary>\r\n            <param name=\"arrayNode\">\r\n                       an alt text array node </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.DetectAltText(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            See if an array is an alt-text array. If so, make sure the x-default item\r\n            is first.\r\n            </summary>\r\n            <param name=\"arrayNode\">\r\n                       the array node to check if its an alt-text array </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.AppendLangItem(iTextSharp.xmp.impl.XmpNode,System.String,System.String)\">\r\n            <summary>\r\n            Appends a language item to an alt text array.\r\n            </summary>\r\n            <param name=\"arrayNode\"> the language array </param>\r\n            <param name=\"itemLang\"> the language of the item </param>\r\n            <param name=\"itemValue\"> the content of the item </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if a duplicate property is added </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpNodeUtils.ChooseLocalizedText(iTextSharp.xmp.impl.XmpNode,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNodeUtils.LookupLanguageItem(iTextSharp.xmp.impl.XmpNode,System.String)\">\r\n            <summary>\r\n            Looks for the appropriate language item in a text alternative array.item\r\n            </summary>\r\n            <param name=\"arrayNode\">\r\n                       an array node </param>\r\n            <param name=\"language\">\r\n                       the requested language </param>\r\n            <returns> Returns the index if the language has been found, -1 otherwise. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpNormalizer\">\r\n            <summary>\r\n            @since   Aug 18, 2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpNormalizer._dcArrayForms\">\r\n            <summary>\r\n            caches the correct dc-property array forms </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.#cctor\">\r\n            <summary>\r\n            init char tables </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.#ctor\">\r\n            <summary>\r\n            Hidden constructor\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.Process(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Normalizes a raw parsed XMPMeta-Object </summary>\r\n            <param name=\"xmp\"> the raw metadata object </param>\r\n            <param name=\"options\"> the parsing options </param>\r\n            <returns> Returns the normalized metadata object </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Collects all severe processing errors.  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.TweakOldXmp(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Tweak old XMP: Move an instance ID from rdf:about to the\r\n            <em>xmpMM:InstanceID</em> property. An old instance ID usually looks\r\n            like &quot;uuid:bac965c4-9d87-11d9-9a30-000d936b79c4&quot;, plus InDesign\r\n            3.0 wrote them like &quot;bac965c4-9d87-11d9-9a30-000d936b79c4&quot;. If\r\n            the name looks like a UUID simply move it to <em>xmpMM:InstanceID</em>,\r\n            don't worry about any existing <em>xmpMM:InstanceID</em>. Both will\r\n            only be present when a newer file with the <em>xmpMM:InstanceID</em>\r\n            property is updated by an old app that uses <em>rdf:about</em>.\r\n            </summary>\r\n            <param name=\"tree\"> the root of the metadata tree </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if tweaking fails.  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.TouchUpDataModel(iTextSharp.xmp.impl.XmpMetaImpl)\">\r\n            <summary>\r\n            Visit all schemas to do general fixes and handle special cases.\r\n            </summary>\r\n            <param name=\"xmp\"> the metadata object implementation </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the normalisation fails. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpNormalizer.NormalizeDcArrays(iTextSharp.xmp.impl.XmpNode)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.RepairAltText(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Make sure that the array is well-formed AltText. Each item must be simple\r\n            and have an \"xml:lang\" qualifier. If repairs are needed, keep simple\r\n            non-empty items by adding the \"xml:lang\" with value \"x-repair\". </summary>\r\n            <param name=\"arrayNode\"> the property node of the array to repair. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards unexpected exceptions. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.MoveExplicitAliases(iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Visit all of the top level nodes looking for aliases. If there is\r\n            no base, transplant the alias subtree. If there is a base and strict\r\n            aliasing is on, make sure the alias and base subtrees match.\r\n            </summary>\r\n            <param name=\"tree\"> the root of the metadata tree </param>\r\n            <param name=\"options\"> th parsing options </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards XMP errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.TransplantArrayItemAlias(iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Moves an alias node of array form to another schema into an array </summary>\r\n            <param name=\"childNode\"> the node to be moved </param>\r\n            <param name=\"baseArray\"> the base array for the array item </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards XMP errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.FixGpsTimeStamp(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Fixes the GPS Timestamp in EXIF. </summary>\r\n            <param name=\"exifSchema\"> the EXIF schema node </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the date conversion fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.DeleteEmptySchemas(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Remove all empty schemas from the metadata tree that were generated during the rdf parsing. </summary>\r\n            <param name=\"tree\"> the root of the metadata tree </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.CompareAliasedSubtrees(iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.impl.XmpNode,System.Boolean)\">\r\n            <summary>\r\n            The outermost call is special. The names almost certainly differ. The\r\n            qualifiers (and hence options) will differ for an alias to the x-default\r\n            item of a langAlt array.\r\n            </summary>\r\n            <param name=\"aliasNode\"> the alias node </param>\r\n            <param name=\"baseNode\"> the base node of the alias </param>\r\n            <param name=\"outerCall\"> marks the outer call of the recursion </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards XMP errors  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.MigrateAudioCopyright(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            The initial support for WAV files mapped a legacy ID3 audio copyright\r\n            into a new xmpDM:copyright property. This is special case code to migrate\r\n            that into dc:rights['x-default']. The rules:\r\n            \r\n            <pre>\r\n            1. If there is no dc:rights array, or an empty array -\r\n               Create one with dc:rights['x-default'] set from double linefeed and xmpDM:copyright.\r\n            \r\n            2. If there is a dc:rights array but it has no x-default item -\r\n               Create an x-default item as a copy of the first item then apply rule #3.\r\n            \r\n            3. If there is a dc:rights array with an x-default item, \r\n               Look for a double linefeed in the value.\r\n                A. If no double linefeed, compare the x-default value to the xmpDM:copyright value.\r\n                    A1. If they match then leave the x-default value alone.\r\n                    A2. Otherwise, append a double linefeed and \r\n                        the xmpDM:copyright value to the x-default value.\r\n                B. If there is a double linefeed, compare the trailing text to the xmpDM:copyright value.\r\n                    B1. If they match then leave the x-default value alone.\r\n                    B2. Otherwise, replace the trailing x-default text with the xmpDM:copyright value.\r\n            \r\n            4. In all cases, delete the xmpDM:copyright property.\r\n            </pre>\r\n            </summary>\r\n            <param name=\"xmp\"> the metadata object </param>\r\n            <param name=\"dmCopyright\"> the \"dm:copyright\"-property </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpNormalizer.InitDcArrays\">\r\n            <summary>\r\n            Initializes the map that contains the known arrays, that are fixed by \r\n            <seealso cref=\"M:iTextSharp.xmp.impl.XmpNormalizer.NormalizeDcArrays(iTextSharp.xmp.impl.XmpNode)\"/>. \r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpSchemaRegistryImpl\">\r\n            <summary>\r\n            The schema registry handles the namespaces, aliases and global options for the XMP Toolkit. There\r\n            is only one single instance used by the toolkit.\r\n            \r\n            @since 27.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSchemaRegistryImpl._aliasMap\">\r\n            <summary>\r\n            a map of all registered aliases. \r\n             The map is a relationship from a qname to an <code>XMPAliasInfo</code>-object. \r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSchemaRegistryImpl._namespaceToPrefixMap\">\r\n            <summary>\r\n            a map from a namespace URI to its registered prefix </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSchemaRegistryImpl._prefixToNamespaceMap\">\r\n            <summary>\r\n            a map from a prefix to the associated namespace URI </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSchemaRegistryImpl._regex\">\r\n            <summary>\r\n            The pattern that must not be contained in simple properties </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.#ctor\">\r\n            <summary>\r\n            Performs the initialisation of the registry with the default namespaces, aliases and global\r\n            options.\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.RegisterNamespace(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.DeleteNamespace(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.GetNamespacePrefix(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.GetNamespaceUri(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.ResolveAlias(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.FindAlias(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.FindAliases(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.GetNamespaces”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.GetPrefixes”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.GetAliases”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.RegisterStandardNamespaces\">\r\n            <summary>\r\n            Register the standard namespaces of schemas and types that are included in the XMP\r\n            Specification and some other Adobe private namespaces.\r\n            Note: This method is not lock because only called by the constructor.\r\n            </summary>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards processing exceptions </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.RegisterAlias(System.String,System.String,System.String,System.String,iTextSharp.xmp.options.AliasOptions)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSchemaRegistryImpl.RegisterStandardAliases\">\r\n            <summary>\r\n            Register the standard aliases.\r\n            Note: This method is not lock because only called by the constructor.\r\n            </summary>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the registrations of at least one alias fails. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.ReadOnlyDictionary.ReadOnly(System.Collections.IDictionary)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpSerializerHelper\">\r\n            <summary>\r\n            Serializes the <code>XMPMeta</code>-object to an <code>OutputStream</code> according to the\r\n            <code>SerializeOptions</code>. \r\n            \r\n            @since   11.07.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerHelper.Serialize(iTextSharp.xmp.impl.XmpMetaImpl,System.IO.Stream,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            Static method to Serialize the metadata object. For each serialisation, a new XMPSerializer\r\n            instance is created, either XMPSerializerRDF or XMPSerializerPlain so thats its possible to \r\n            serialialize the same XMPMeta objects in two threads.\r\n            </summary>\r\n            <param name=\"xmp\"> a metadata implementation object </param>\r\n            <param name=\"out\"> the output stream to Serialize to </param>\r\n            <param name=\"options\"> serialization options, can be <code>null</code> for default. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerHelper.SerializeToString(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            Serializes an <code>XMPMeta</code>-object as RDF into a string.\r\n            <em>Note:</em> Encoding is forced to UTF-16 when serializing to a\r\n            string to ensure the correctness of &quot;exact packet size&quot;.\r\n            </summary>\r\n            <param name=\"xmp\"> a metadata implementation object </param>\r\n            <param name=\"options\"> Options to control the serialization (see\r\n                       <seealso cref=\"T:iTextSharp.xmp.options.SerializeOptions\"/>). </param>\r\n            <returns> Returns a string containing the serialized RDF. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> on serializsation errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerHelper.SerializeToBuffer(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            Serializes an <code>XMPMeta</code>-object as RDF into a byte buffer.\r\n            </summary>\r\n            <param name=\"xmp\"> a metadata implementation object </param>\r\n            <param name=\"options\"> Options to control the serialization (see <seealso cref=\"T:iTextSharp.xmp.options.SerializeOptions\"/>). </param>\r\n            <returns> Returns a byte buffer containing the serialized RDF. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> on serializsation errors. </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpSerializerRdf\">\r\n            <summary>\r\n            Serializes the <code>XMPMeta</code>-object using the standard RDF serialization format. \r\n            The output is written to an <code>OutputStream</code> \r\n            according to the <code>SerializeOptions</code>. \r\n            \r\n            @since   11.07.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf.DEFAULT_PAD\">\r\n            <summary>\r\n            default padding </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf.PACKET_TRAILER\">\r\n            <summary>\r\n            The w/r is missing inbetween </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf.RDF_ATTR_QUALIFIER\">\r\n            <summary>\r\n            a set of all rdf attribute qualifier </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf._options\">\r\n            <summary>\r\n            the stored serialization options </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf._outputStream\">\r\n            <summary>\r\n            the output stream to Serialize to </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf._padding\">\r\n            <summary>\r\n            the padding in the XMP Packet, or the length of the complete packet in\r\n             case of option <em>exactPacketLength</em>. \r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf._unicodeSize\">\r\n            <summary>\r\n            the size of one unicode char, for UTF-8 set to 1 \r\n             (Note: only valid for ASCII chars lower than 0x80),\r\n             set to 2 in case of UTF-16 \r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf._writer\">\r\n            <summary>\r\n            this writer is used to do the actual serialization </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.XmpSerializerRdf._xmp\">\r\n            <summary>\r\n            the metadata object to be serialized. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.Serialize(iTextSharp.xmp.IXmpMeta,System.IO.Stream,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            The actual serialization.\r\n            </summary>\r\n            <param name=\"xmp\"> the metadata object to be serialized </param>\r\n            <param name=\"out\"> outputStream the output stream to Serialize to </param>\r\n            <param name=\"options\"> the serialization options\r\n            </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If case of wrong options or any other serialization error. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.AddPadding(System.Int32)\">\r\n            <summary>\r\n            Calculates the padding according to the options and write it to the stream. </summary>\r\n            <param name=\"tailLength\"> the length of the tail string </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> thrown if packet size is to small to fit the padding </exception>\r\n            <exception cref=\"T:System.IO.IOException\"> forwards writer errors </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.CheckOptionsConsistence\">\r\n            <summary>\r\n            Checks if the supplied options are consistent. </summary>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if options are conflicting </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeAsRdf\">\r\n            <summary>\r\n            Writes the (optional) packet header and the outer rdf-tags. </summary>\r\n            <returns> Returns the packet end processing instraction to be written after the padding. </returns>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwarded writer exceptions. </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCanonicalRdfSchemas(System.Int32)\">\r\n            <summary>\r\n            Serializes the metadata in pretty-printed manner. </summary>\r\n            <param name=\"level\"> indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwarded writer exceptions </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.WriteTreeName\">\r\n            <exception cref=\"T:System.IO.IOException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfSchemas(System.Int32)\">\r\n            <summary>\r\n            Serializes the metadata in compact manner. </summary>\r\n            <param name=\"level\"> indent level to start with </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwarded writer exceptions </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">  </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfAttrProps(iTextSharp.xmp.impl.XmpNode,System.Int32)\">\r\n            <summary>\r\n            Write each of the parent's simple unqualified properties as an attribute. Returns true if all\r\n            of the properties are written as attributes.\r\n            </summary>\r\n            <param name=\"parentNode\"> the parent property node </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <returns> Returns true if all properties can be rendered as RDF attribute. </returns>\r\n            <exception cref=\"T:System.IO.IOException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfElementProps(iTextSharp.xmp.impl.XmpNode,System.Int32)\">\r\n            <summary>\r\n            Recursively handles the \"value\" for a node that must be written as an RDF\r\n            property element. It does not matter if it is a top level property, a\r\n            field of a struct, or an item of an array. The indent is that for the\r\n            property element. The patterns bwlow ignore attribute qualifiers such as\r\n            xml:lang, they don't affect the output form.\r\n            \r\n            <blockquote>\r\n            \r\n            <pre>\r\n             \t&lt;ns:UnqualifiedStructProperty-1\r\n             \t\t... The fields as attributes, if all are simple and unqualified\r\n             \t/&gt;\r\n             \r\n             \t&lt;ns:UnqualifiedStructProperty-2 rdf:parseType=&quot;Resource&quot;&gt;\r\n             \t\t... The fields as elements, if none are simple and unqualified\r\n             \t&lt;/ns:UnqualifiedStructProperty-2&gt;\r\n             \r\n             \t&lt;ns:UnqualifiedStructProperty-3&gt;\r\n             \t\t&lt;rdf:Description\r\n             \t\t\t... The simple and unqualified fields as attributes\r\n             \t\t&gt;\r\n             \t\t\t... The compound or qualified fields as elements\r\n             \t\t&lt;/rdf:Description&gt;\r\n             \t&lt;/ns:UnqualifiedStructProperty-3&gt;\r\n             \r\n             \t&lt;ns:UnqualifiedArrayProperty&gt;\r\n             \t\t&lt;rdf:Bag&gt; or Seq or Alt\r\n             \t\t\t... Array items as rdf:li elements, same forms as top level properties\r\n             \t\t&lt;/rdf:Bag&gt;\r\n             \t&lt;/ns:UnqualifiedArrayProperty&gt;\r\n             \r\n             \t&lt;ns:QualifiedProperty rdf:parseType=&quot;Resource&quot;&gt;\r\n             \t\t&lt;rdf:value&gt; ... Property &quot;value&quot; \r\n             \t\t\tfollowing the unqualified forms ... &lt;/rdf:value&gt;\r\n             \t\t... Qualifiers looking like named struct fields\r\n             \t&lt;/ns:QualifiedProperty&gt;\r\n            </pre>\r\n            \r\n            </blockquote>\r\n            \r\n            *** Consider numbered array items, but has compatibility problems. ***\r\n            Consider qualified form with rdf:Description and attributes.\r\n            </summary>\r\n            <param name=\"parentNode\"> the parent node </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards writer exceptions </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If qualifier and element fields are mixed. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfSimpleProp(iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Serializes a simple property.\r\n            </summary>\r\n            <param name=\"node\"> an XMPNode </param>\r\n            <returns> Returns an array containing the flags emitEndTag and indentEndTag. </returns>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards the writer exceptions. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfArrayProp(iTextSharp.xmp.impl.XmpNode,System.Int32)\">\r\n            <summary>\r\n            Serializes an array property.\r\n            </summary>\r\n            <param name=\"node\"> an XMPNode </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards the writer exceptions. </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If qualifier and element fields are mixed. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfStructProp(iTextSharp.xmp.impl.XmpNode,System.Int32,System.Boolean)\">\r\n            <summary>\r\n            Serializes a struct property.\r\n            </summary>\r\n            <param name=\"node\"> an XMPNode </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <param name=\"hasRdfResourceQual\"> Flag if the element has resource qualifier </param>\r\n            <returns> Returns true if an end flag shall be emitted. </returns>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards the writer exceptions. </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If qualifier and element fields are mixed. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCompactRdfGeneralQualifier(System.Int32,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Serializes the general qualifier. </summary>\r\n            <param name=\"node\"> the root node of the subtree </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards all writer exceptions. </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If qualifier and element fields are mixed. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCanonicalRdfSchema(iTextSharp.xmp.impl.XmpNode,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.DeclareUsedNamespaces(iTextSharp.xmp.impl.XmpNode,Org.BouncyCastle.Utilities.Collections.ISet,System.Int32)\">\r\n            <summary>\r\n            Writes all used namespaces of the subtree in node to the output. \r\n            The subtree is recursivly traversed. </summary>\r\n            <param name=\"node\"> the root node of the subtree </param>\r\n            <param name=\"usedPrefixes\"> a set containing currently used prefixes </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards all writer exceptions. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.DeclareNamespace(System.String,System.String,Org.BouncyCastle.Utilities.Collections.ISet,System.Int32)\">\r\n            <summary>\r\n            Writes one namespace declaration to the output. </summary>\r\n            <param name=\"prefix\"> a namespace prefix (without colon) or a complete qname (when namespace == null) </param>\r\n            <param name=\"namespace\"> the a namespace </param>\r\n            <param name=\"usedPrefixes\"> a set containing currently used prefixes </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards all writer exceptions. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.StartOuterRdfDescription(iTextSharp.xmp.impl.XmpNode,System.Int32)\">\r\n            <summary>\r\n            Start the outer rdf:Description element, including all needed xmlns attributes.\r\n            Leave the element open so that the compact form can add property attributes.\r\n            </summary>\r\n            <exception cref=\"T:System.IO.IOException\"> If the writing to   </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSerializerRdf.EndOuterRdfDescription(System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.SerializeCanonicalRdfProperty(iTextSharp.xmp.impl.XmpNode,System.Boolean,System.Boolean,System.Int32)\">\r\n            <summary>\r\n            Recursively handles the \"value\" for a node. It does not matter if it is a\r\n            top level property, a field of a struct, or an item of an array. The\r\n            indent is that for the property element. An xml:lang qualifier is written\r\n            as an attribute of the property start tag, not by itself forcing the\r\n            qualified property form. The patterns below mostly ignore attribute\r\n            qualifiers like xml:lang. Except for the one struct case, attribute\r\n            qualifiers don't affect the output form.\r\n            \r\n            <blockquote>\r\n            \r\n            <pre>\r\n            \t&lt;ns:UnqualifiedSimpleProperty&gt;value&lt;/ns:UnqualifiedSimpleProperty&gt;\r\n            \r\n            \t&lt;ns:UnqualifiedStructProperty&gt; (If no rdf:resource qualifier)\r\n            \t\t&lt;rdf:Description&gt;\r\n            \t\t\t... Fields, same forms as top level properties\r\n            \t\t&lt;/rdf:Description&gt;\r\n            \t&lt;/ns:UnqualifiedStructProperty&gt;\r\n            \r\n            \t&lt;ns:ResourceStructProperty rdf:resource=&quot;URI&quot;\r\n            \t\t... Fields as attributes\r\n            \t&gt;\r\n            \r\n            \t&lt;ns:UnqualifiedArrayProperty&gt;\r\n            \t\t&lt;rdf:Bag&gt; or Seq or Alt\r\n            \t\t\t... Array items as rdf:li elements, same forms as top level properties\r\n            \t\t&lt;/rdf:Bag&gt;\r\n            \t&lt;/ns:UnqualifiedArrayProperty&gt;\r\n            \r\n            \t&lt;ns:QualifiedProperty&gt;\r\n            \t\t&lt;rdf:Description&gt;\r\n            \t\t\t&lt;rdf:value&gt; ... Property &quot;value&quot; following the unqualified \r\n            \t\t\t\tforms ... &lt;/rdf:value&gt;\r\n            \t\t\t... Qualifiers looking like named struct fields\r\n            \t\t&lt;/rdf:Description&gt;\r\n            \t&lt;/ns:QualifiedProperty&gt;\r\n            </pre>\r\n            \r\n            </blockquote>\r\n            </summary>\r\n            <param name=\"node\"> the property node </param>\r\n            <param name=\"emitAsRdfValue\"> property shall be rendered as attribute rather than tag </param>\r\n            <param name=\"useCanonicalRdf\"> use canonical form with inner description tag or \r\n            \t\t  the compact form with rdf:ParseType=&quot;resource&quot; attribute. </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards all writer exceptions. </exception>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If &quot;rdf:resource&quot; and general qualifiers are mixed. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.EmitRdfArrayTag(iTextSharp.xmp.impl.XmpNode,System.Boolean,System.Int32)\">\r\n            <summary>\r\n            Writes the array start and end tags.\r\n            </summary>\r\n            <param name=\"arrayNode\"> an array node </param>\r\n            <param name=\"isStartTag\"> flag if its the start or end tag </param>\r\n            <param name=\"indent\"> the current indent level </param>\r\n            <exception cref=\"T:System.IO.IOException\"> forwards writer exceptions </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.AppendNodeValue(System.String,System.Boolean)\">\r\n            <summary>\r\n            Serializes the node value in XML encoding. Its used for tag bodies and\r\n            attributes. <em>Note:</em> The attribute is always limited by quotes,\r\n            thats why <code>&amp;apos;</code> is never serialized. <em>Note:</em>\r\n            Control chars are written unescaped, but if the user uses others than tab, LF\r\n            and CR the resulting XML will become invalid.\r\n            </summary>\r\n            <param name=\"value\"> the value of the node </param>\r\n            <param name=\"forAttribute\"> flag if value is an attribute value </param>\r\n            <exception cref=\"T:System.IO.IOException\"> </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpSerializerRdf.canBeRDFAttrProp(iTextSharp.xmp.impl.XmpNode)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.WriteIndent(System.Int32)\">\r\n            <summary>\r\n            Writes indents and automatically includes the baseindend from the options. </summary>\r\n            <param name=\"times\"> number of indents to write </param>\r\n            <exception cref=\"T:System.IO.IOException\"> forwards exception </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.Write(System.Char)\">\r\n            <summary>\r\n            Writes a char to the output. </summary>\r\n            <param name=\"c\"> a char </param>\r\n            <exception cref=\"T:System.IO.IOException\"> forwards writer exceptions </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.Write(System.String)\">\r\n            <summary>\r\n            Writes a String to the output. </summary>\r\n            <param name=\"str\"> a String </param>\r\n            <exception cref=\"T:System.IO.IOException\"> forwards writer exceptions </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.WriteChars(System.Int32,System.Char)\">\r\n            <summary>\r\n            Writes an amount of chars, mostly spaces </summary>\r\n            <param name=\"number\"> number of chars </param>\r\n            <param name=\"c\"> a char </param>\r\n            <exception cref=\"T:System.IO.IOException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpSerializerRdf.WriteNewline\">\r\n            <summary>\r\n            Writes a newline according to the options. </summary>\r\n            <exception cref=\"T:System.IO.IOException\"> Forwards exception </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.XmpUtilsImpl\">\r\n            <summary>\r\n            @since 11.08.2006\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.XmpUtilsImpl.SPACES”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.XmpUtilsImpl.COMMAS”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.XmpUtilsImpl.SEMICOLA”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.XmpUtilsImpl.CONTROLS”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“F:iTextSharp.xmp.impl.XmpUtilsImpl.QUOTES”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.#ctor\">\r\n            <summary>\r\n            Private constructor, as\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpUtilsImpl.CatenateArrayItems(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.String,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.SeparateArrayItems(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions,System.Boolean)\">\r\n            <summary>\r\n            see {@link XMPUtils#separateArrayItems(XMPMeta, String, String, String, \r\n            PropertyOptions, boolean)}\r\n            </summary>\r\n            <param name=\"xmp\">\r\n                       The XMP object containing the array to be updated. </param>\r\n            <param name=\"schemaNs\">\r\n                       The schema namespace URI for the array. Must not be null or\r\n                       the empty string. </param>\r\n            <param name=\"arrayName\">\r\n                       The name of the array. May be a general path expression, must\r\n                       not be null or the empty string. Each item in the array must\r\n                       be a simple string value. </param>\r\n            <param name=\"catedStr\">\r\n                       The string to be separated into the array items. </param>\r\n            <param name=\"arrayOptions\">\r\n                       Option flags to control the separation. </param>\r\n            <param name=\"preserveCommas\">\r\n                       Flag if commas shall be preserved\r\n            </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">\r\n                        Forwards the Exceptions from the metadata processing </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.SeparateFindCreateArray(System.String,System.String,iTextSharp.xmp.options.PropertyOptions,iTextSharp.xmp.impl.XmpMetaImpl)\">\r\n            <summary>\r\n            Utility to find or create the array used by <code>separateArrayItems()</code>. </summary>\r\n            <param name=\"schemaNs\"> a the namespace fo the array </param>\r\n            <param name=\"arrayName\"> the name of the array </param>\r\n            <param name=\"arrayOptions\"> the options for the array if newly created </param>\r\n            <param name=\"xmp\"> the xmp object </param>\r\n            <returns> Returns the array node. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards exceptions </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpUtilsImpl.RemoveProperties(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpUtilsImpl.AppendProperties(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.IXmpMeta,System.Boolean,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.RemoveSchemaChildren(iTextSharp.xmp.impl.XmpNode,System.Boolean)\">\r\n            <summary>\r\n            Remove all schema children according to the flag\r\n            <code>doAllProperties</code>. Empty schemas are automatically remove\r\n            by <code>XMPNode</code>\r\n            </summary>\r\n            <param name=\"schemaNode\">\r\n                       a schema node </param>\r\n            <param name=\"doAllProperties\">\r\n                       flag if all properties or only externals shall be removed. </param>\r\n            <returns> Returns true if the schema is empty after the operation. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.XmpUtilsImpl.AppendSubtree(iTextSharp.xmp.impl.XmpMetaImpl,iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.impl.XmpNode,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.ItemValuesMatch(iTextSharp.xmp.impl.XmpNode,iTextSharp.xmp.impl.XmpNode)\">\r\n            <summary>\r\n            Compares two nodes including its children and qualifier. </summary>\r\n            <param name=\"leftNode\"> an <code>XMPNode</code> </param>\r\n            <param name=\"rightNode\"> an <code>XMPNode</code> </param>\r\n            <returns> Returns true if the nodes are equal, false otherwise. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards exceptions to the calling method. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.CheckSeparator(System.String)\">\r\n            <summary>\r\n            Make sure the separator is OK. It must be one semicolon surrounded by\r\n            zero or more spaces. Any of the recognized semicolons or spaces are\r\n            allowed.\r\n            </summary>\r\n            <param name=\"separator\"> </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.CheckQuotes(System.String,System.Char)\">\r\n            <summary>\r\n            Make sure the open and close quotes are a legitimate pair and return the\r\n            correct closing quote or an exception.\r\n            </summary>\r\n            <param name=\"quotes\">\r\n                       opened and closing quote in a string </param>\r\n            <param name=\"openQuote\">\r\n                       the open quote </param>\r\n            <returns> Returns a corresponding closing quote. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.ClassifyCharacter(System.Char)\">\r\n            <summary>\r\n            Classifies the character into normal chars, spaces, semicola, quotes,\r\n            control chars.\r\n            </summary>\r\n            <param name=\"ch\">\r\n                       a char </param>\r\n            <returns> Return the character kind. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.GetClosingQuote(System.Char)\">\r\n            <param name=\"openQuote\">\r\n                       the open quote char </param>\r\n            <returns> Returns the matching closing quote for an open quote. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.ApplyQuotes(System.String,System.Char,System.Char,System.Boolean)\">\r\n            <summary>\r\n            Add quotes to the item.\r\n            </summary>\r\n            <param name=\"item\">\r\n                       the array item </param>\r\n            <param name=\"openQuote\">\r\n                       the open quote character </param>\r\n            <param name=\"closeQuote\">\r\n                       the closing quote character </param>\r\n            <param name=\"allowCommas\">\r\n                       flag if commas are allowed </param>\r\n            <returns> Returns the value in quotes. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.IsSurroundingQuote(System.Char,System.Char,System.Char)\">\r\n            <param name=\"ch\"> a character </param>\r\n            <param name=\"openQuote\"> the opening quote char </param>\r\n            <param name=\"closeQuote\"> the closing quote char </param>\r\n            <returns> Return it the character is a surrounding quote. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.XmpUtilsImpl.IsClosingingQuote(System.Char,System.Char,System.Char)\">\r\n            <param name=\"ch\"> a character </param>\r\n            <param name=\"openQuote\"> the opening quote char </param>\r\n            <param name=\"closeQuote\"> the closing quote char </param>\r\n            <returns> Returns true if the character is a closing quote. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.xpath.XmpPath\">\r\n            <summary>\r\n            Representates an XMP XmpPath with segment accessor methods.\r\n            \r\n            @since   28.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPath.STRUCT_FIELD_STEP\">\r\n            <summary>\r\n            Marks a struct field step , also for top level nodes (schema \"fields\"). </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPath.QUALIFIER_STEP\">\r\n            <summary>\r\n            Marks a qualifier step. \r\n             Note: Order is significant to separate struct/qual from array kinds! \r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPath.ARRAY_INDEX_STEP\">\r\n            <summary>\r\n            Marks an array index step </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPath._segments\">\r\n            <summary>\r\n            stores the segments of an XmpPath </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPath.Add(iTextSharp.xmp.impl.xpath.XmpPathSegment)\">\r\n            <summary>\r\n            Append a path segment\r\n            </summary>\r\n            <param name=\"segment\"> the segment to add </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPath.GetSegment(System.Int32)\">\r\n            <param name=\"index\"> the index of the segment to return </param>\r\n            <returns> Returns a path segment. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPath.Size\">\r\n            <returns> Returns the size of the xmp path.  </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.xpath.XmpPath.ToString”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.xpath.XmpPathParser\">\r\n             Parser for XMP XPaths.\r\n            \r\n             @since   01.03.2006\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.#ctor\">\r\n            Private constructor\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.xpath.XmpPathParser.ExpandXPath(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.SkipPathDelimiter(System.String,iTextSharp.xmp.impl.xpath.PathPosition)\">\r\n            @param path\r\n            @param pos\r\n            @throws XmpException\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.ParseStructSegment(iTextSharp.xmp.impl.xpath.PathPosition)\">\r\n            Parses a struct segment\r\n            @param pos the current position in the path\r\n            @return Retusn the segment or an errror\r\n            @throws XmpException If the sement is empty\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.ParseIndexSegment(iTextSharp.xmp.impl.xpath.PathPosition)\">\r\n            Parses an array index segment.\r\n            \r\n            @param pos the xmp path \r\n            @return Returns the segment or an error\r\n            @throws XmpException thrown on xmp path errors\r\n            \r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.ParseRootNode(System.String,iTextSharp.xmp.impl.xpath.PathPosition,iTextSharp.xmp.impl.xpath.XmpPath)\">\r\n            Parses the root node of an XMP Path, checks if namespace and prefix fit together\r\n            and resolve the property to the base property if it is an alias. \r\n            @param schemaNs the root namespace\r\n            @param pos the parsing position helper\r\n            @param expandedXPath  the path to contribute to\r\n            @throws XmpException If the path is not valid.\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.VerifyQualName(System.String)\">\r\n            Verifies whether the qualifier name is not XML conformant or the\r\n            namespace prefix has not been registered.\r\n            \r\n            @param qualName\r\n                       a qualifier name\r\n            @throws XmpException\r\n                        If the name is not conformant\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathParser.VerifySimpleXmlName(System.String)\">\r\n            Verify if an XML name is conformant.\r\n            \r\n            @param name\r\n                       an XML name\r\n            @throws XmpException\r\n                        When the name is not XML conformant\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.xpath.XmpPathParser.VerifyXPathRoot(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.impl.xpath.PathPosition\">\r\n            This objects contains all needed char positions to parse.\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.PathPosition.NameEnd\">\r\n            the complete path \r\n            the end of a segment name \r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.PathPosition.StepBegin\">\r\n            the begin of a step \r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.PathPosition.StepEnd\">\r\n            the end of a step \r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.impl.xpath.XmpPathSegment\">\r\n            <summary>\r\n            A segment of a parsed <code>XmpPath</code>.\r\n             \r\n            @since   23.06.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPathSegment._alias\">\r\n            <summary>\r\n            flag if segment is an alias </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPathSegment._aliasForm\">\r\n            <summary>\r\n            alias form if applicable </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPathSegment._kind\">\r\n            <summary>\r\n            kind of the path segment </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.impl.xpath.XmpPathSegment._name\">\r\n            <summary>\r\n            name of the path segment </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathSegment.#ctor(System.String)\">\r\n            <summary>\r\n            Constructor with initial values.\r\n            </summary>\r\n            <param name=\"name\"> the name of the segment </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.impl.xpath.XmpPathSegment.#ctor(System.String,System.UInt32)\">\r\n            <summary>\r\n            Constructor with initial values.\r\n            </summary>\r\n            <param name=\"name\"> the name of the segment </param>\r\n            <param name=\"kind\"> the kind of the segment </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.xpath.XmpPathSegment.Kind\">\r\n            <returns> Returns the kind. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.xpath.XmpPathSegment.Name\">\r\n            <returns> Returns the name. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.xpath.XmpPathSegment.Alias\">\r\n            <param name=\"alias\"> the flag to set </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.impl.xpath.XmpPathSegment.AliasForm\">\r\n            <returns> Returns the aliasForm if this segment has been created by an alias. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.impl.xpath.XmpPathSegment.ToString”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“T:iTextSharp.xmp.IXmpDateTime”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Year\">\r\n            <returns> Returns the year, can be negative. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Month\">\r\n            <returns> Returns The month in the range 1..12. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Day\">\r\n            <returns> Returns the day of the month in the range 1..31. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Hour\">\r\n            <returns> Returns hour - The hour in the range 0..23. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Minute\">\r\n            <returns> Returns the minute in the range 0..59. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Second\">\r\n            <returns> Returns the second in the range 0..59. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.NanoSecond\">\r\n            <returns> Returns milli-, micro- and nano seconds.\r\n            \t\t   Nanoseconds within a second, often left as zero? </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.TimeZone\">\r\n            <returns> Returns the time zone. </returns>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.IXmpDateTime.Calendar”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.xmp.IXmpDateTime.Iso8601String\">\r\n            <returns> Returns the ISO 8601 string representation of the date and time. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpDateTime.HasDate\">\r\n            <summary>\r\n            This flag is set either by parsing or by setting year, month or day. </summary>\r\n            <returns> Returns true if the XMPDateTime object has a date portion. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpDateTime.HasTime\">\r\n            <summary>\r\n            This flag is set either by parsing or by setting hours, minutes, seconds or milliseconds. </summary>\r\n            <returns> Returns true if the XMPDateTime object has a time portion. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpDateTime.HasTimeZone\">\r\n            <summary>\r\n            This flag is set either by parsing or by setting hours, minutes, seconds or milliseconds. </summary>\r\n            <returns> Returns true if the XMPDateTime object has a defined timezone. </returns>\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.xmp.IXmpIterator”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpIterator.SkipSubtree\">\r\n            <summary>\r\n            Skip the subtree below the current node when <code>next()</code> is\r\n            called.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpIterator.SkipSiblings\">\r\n            <summary>\r\n            Skip the subtree below and remaining siblings of the current node when\r\n            <code>next()</code> is called.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.IXmpMeta\">\r\n            <summary>\r\n            This class represents the set of XMP metadata as a DOM representation. It has methods to read and\r\n            modify all kinds of properties, create an iterator over all properties and Serialize the metadata\r\n            to a String, byte-array or <code>OutputStream</code>.\r\n            \r\n            @since 20.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpMeta.ObjectName\">\r\n            <summary>\r\n            This correlates to the about-attribute,\r\n            returns the empty String if no name is set.\r\n            </summary>\r\n            <returns> Returns the name of the XMP object. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpMeta.PacketHeader\">\r\n            <returns> Returns the unparsed content of the &lt;?xpacket&gt; processing instruction.\r\n            \t\tThis contains normally the attribute-like elements 'begin=\"&lt;BOM&gt;\"\r\n            \tid=\"W5M0MpCehiHzreSzNTczkc9d\"' and possibly the deprecated elements 'bytes=\"1234\"' or\r\n            \t\t'encoding=\"XXX\"'. If the parsed packet has not been wrapped into an xpacket,\r\n            \t\t<code>null</code> is returned.    </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.GetProperty(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetArrayItem(System.String,System.String,System.Int32)\">\r\n            <summary>\r\n            Provides access to items within an array. The index is passed as an integer, you need not\r\n            worry about the path string syntax for array items, convert a loop index to a string, etc.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the array. Has the same usage as in GetProperty. </param>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in <code>GetProperty()</code>. </param>\r\n            <param name=\"itemIndex\"> The index of the desired item. Arrays in XMP are indexed from 1. The\r\n                   constant <seealso cref=\"F:iTextSharp.xmp.XmpConst.ARRAY_LAST_ITEM\"/> always refers to the last existing array\r\n                   item. </param>\r\n            <returns> Returns a <code>XMPProperty</code> containing the value and the options or\r\n                    <code>null</code> if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.CountArrayItems(System.String,System.String)\">\r\n            <summary>\r\n            Returns the number of items in the array.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the array. Has the same usage as in GetProperty. </param>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in <code>GetProperty()</code>. </param>\r\n            <returns> Returns the number of items in the array. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.GetStructField(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.GetQualifier(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetProperty(System.String,System.String,System.Object,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetProperty(System.String,System.String,System.Object)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetArrayItem(System.String,System.String,System.Int32,System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Replaces an item within an array. The index is passed as an integer, you need not worry about\r\n            the path string syntax for array items, convert a loop index to a string, etc. The array\r\n            passed must already exist. In normal usage the selected array item is modified. A new item is\r\n            automatically appended if the index is the array size plus 1.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the array. Has the same usage as in GetProperty. </param>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in GetProperty. </param>\r\n            <param name=\"itemIndex\"> The index of the desired item. Arrays in XMP are indexed from 1. To address\r\n                   the last existing item, use <seealso cref=\"M:iTextSharp.xmp.IXmpMeta.CountArrayItems(System.String,System.String)\"/> to find\r\n                   out the length of the array. </param>\r\n            <param name=\"itemValue\"> the new value of the array item. Has the same usage as propValue in\r\n                   <code>SetProperty()</code>. </param>\r\n            <param name=\"options\"> the set options for the item. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetArrayItem(System.String,System.String,System.Int32,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.InsertArrayItem(System.String,System.String,System.Int32,System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Inserts an item into an array previous to the given index. The index is passed as an integer,\r\n            you need not worry about the path string syntax for array items, convert a loop index to a\r\n            string, etc. The array passed must already exist. In normal usage the selected array item is\r\n            modified. A new item is automatically appended if the index is the array size plus 1.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the array. Has the same usage as in GetProperty. </param>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in GetProperty. </param>\r\n            <param name=\"itemIndex\"> The index to insert the new item. Arrays in XMP are indexed from 1. Use\r\n            \t\t  <code>XmpConst.ARRAY_LAST_ITEM</code> to append items. </param>\r\n            <param name=\"itemValue\"> the new value of the array item. Has the same usage as\r\n                   propValue in <code>SetProperty()</code>. </param>\r\n            <param name=\"options\"> the set options that decide about the kind of the node. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.InsertArrayItem(System.String,System.String,System.Int32,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.AppendArrayItem(System.String,System.String,iTextSharp.xmp.options.PropertyOptions,System.String,iTextSharp.xmp.options.PropertyOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.AppendArrayItem(System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetStructField(System.String,System.String,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Provides access to fields within a nested structure. The namespace for the field is passed as\r\n            a URI, you need not worry about the path string syntax. The names of fields should be XML\r\n            qualified names, that is within an XML namespace. The path syntax for a qualified name uses\r\n            the namespace prefix, which is unreliable because the prefix is never guaranteed. The URI is\r\n            the formal name, the prefix is just a local shorthand in a given sequence of XML text.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the struct. Has the same usage as in GetProperty. </param>\r\n            <param name=\"structName\"> The name of the struct. May be a general path expression, must not be null\r\n                   or the empty string. Has the same namespace prefix usage as propName in GetProperty. </param>\r\n            <param name=\"fieldNs\"> The namespace URI for the field. Has the same URI and prefix usage as the\r\n                   schemaNs parameter. </param>\r\n            <param name=\"fieldName\"> The name of the field. Must be a single XML name, must not be null or the\r\n                   empty string. Has the same namespace prefix usage as the structName parameter. </param>\r\n            <param name=\"fieldValue\"> the value of thefield, if the field has a value. \r\n                   Has the same usage as propValue in GetProperty. </param>\r\n            <param name=\"options\"> Option flags describing the field. See the earlier description. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetStructField(System.String,System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetQualifier(System.String,System.String,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Provides access to a qualifier attached to a property. The namespace for the qualifier is\r\n            passed as a URI, you need not worry about the path string syntax. In many regards qualifiers\r\n            are like struct fields. See the introductory discussion of qualified properties for more\r\n            information. The names of qualifiers should be XML qualified names, that is within an XML\r\n            namespace. The path syntax for a qualified name uses the namespace prefix, which is\r\n            unreliable because the prefix is never guaranteed. The URI is the formal name, the prefix is\r\n            just a local shorthand in a given sequence of XML text. The property the qualifier\r\n            will be attached has to exist.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the struct. Has the same usage as in GetProperty. </param>\r\n            <param name=\"propName\"> The name of the property to which the qualifier is attached. Has the same\r\n                   usage as in GetProperty. </param>\r\n            <param name=\"qualNs\"> The namespace URI for the qualifier. Has the same URI and prefix usage as the\r\n                   schemaNs parameter. </param>\r\n            <param name=\"qualName\"> The name of the qualifier. Must be a single XML name, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as the\r\n                   propName parameter. </param>\r\n            <param name=\"qualValue\"> A pointer to the <code>null</code> terminated UTF-8 string that is the\r\n                   value of the qualifier, if the qualifier has a value. Has the same usage as propValue\r\n                   in GetProperty. </param>\r\n            <param name=\"options\"> Option flags describing the qualifier. See the earlier description. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetQualifier(System.String,System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DeleteProperty(System.String,System.String)\">\r\n            <summary>\r\n            Deletes the given XMP subtree rooted at the given property. It is not an error if the\r\n            property does not exist.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property. Has the same usage as in GetProperty. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DeleteArrayItem(System.String,System.String,System.Int32)\">\r\n            <summary>\r\n            Deletes the given XMP subtree rooted at the given array item. It is not an error if the array\r\n            item does not exist.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the array. Has the same usage as in GetProperty. </param>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in <code>GetProperty()</code>. </param>\r\n            <param name=\"itemIndex\"> The index of the desired item. Arrays in XMP are indexed from 1. The\r\n                   constant <code>XmpConst.ARRAY_LAST_ITEM</code> always refers to the last\r\n                   existing array item. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DeleteStructField(System.String,System.String,System.String,System.String)\">\r\n            <summary>\r\n            Deletes the given XMP subtree rooted at the given struct field. It is not an error if the\r\n            field does not exist.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the struct. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"structName\"> The name of the struct. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in GetProperty. </param>\r\n            <param name=\"fieldNs\"> The namespace URI for the field. Has the same URI and prefix usage as the\r\n                   schemaNs parameter. </param>\r\n            <param name=\"fieldName\"> The name of the field. Must be a single XML name, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as the\r\n                   structName parameter. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DeleteQualifier(System.String,System.String,System.String,System.String)\">\r\n            <summary>\r\n            Deletes the given XMP subtree rooted at the given qualifier. It is not an error if the\r\n            qualifier does not exist.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the struct. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property to which the qualifier is attached. Has the same\r\n                   usage as in GetProperty. </param>\r\n            <param name=\"qualNs\"> The namespace URI for the qualifier. Has the same URI and prefix usage as the\r\n                   schemaNs parameter. </param>\r\n            <param name=\"qualName\"> The name of the qualifier. Must be a single XML name, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as the\r\n                   propName parameter. </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DoesPropertyExist(System.String,System.String)\">\r\n            <summary>\r\n            Returns whether the property exists.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property. \r\n            \t\t  Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns true if the property exists. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DoesArrayItemExist(System.String,System.String,System.Int32)\">\r\n            <summary>\r\n            Tells if the array item exists.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the array. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in <code>GetProperty()</code>. </param>\r\n            <param name=\"itemIndex\"> The index of the desired item. Arrays in XMP are indexed from 1. The\r\n                   constant <code>XmpConst.ARRAY_LAST_ITEM</code> always refers to the last\r\n                   existing array item. </param>\r\n            <returns> Returns <code>true</code> if the array exists, <code>false</code> otherwise. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DoesStructFieldExist(System.String,System.String,System.String,System.String)\">\r\n            <summary>\r\n            DoesStructFieldExist tells if the struct field exists.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the struct. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"structName\"> The name of the struct. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in <code>GetProperty()</code>. </param>\r\n            <param name=\"fieldNs\"> The namespace URI for the field. Has the same URI and prefix usage as the\r\n                   schemaNs parameter. </param>\r\n            <param name=\"fieldName\"> The name of the field. Must be a single XML name, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as the\r\n                   structName parameter. </param>\r\n            <returns> Returns true if the field exists. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DoesQualifierExist(System.String,System.String,System.String,System.String)\">\r\n            <summary>\r\n            DoesQualifierExist tells if the qualifier exists.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the struct. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property to which the qualifier is attached. Has the same\r\n                   usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"qualNs\"> The namespace URI for the qualifier. Has the same URI and prefix usage as the\r\n                   schemaNs parameter. </param>\r\n            <param name=\"qualName\"> The name of the qualifier. Must be a single XML name, must not be\r\n                   <code>null</code> or the empty string. Has the same namespace prefix usage as the\r\n                   propName parameter. </param>\r\n            <returns> Returns true if the qualifier exists. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.GetLocalizedText(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetLocalizedText(System.String,System.String,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Modifies the value of a selected item in an alt-text array. Creates an appropriate array item\r\n            if necessary, and handles special cases for the x-default item. If the selected item is from\r\n            a match with the specific language, the value of that item is modified. If the existing value\r\n            of that item matches the existing value of the x-default item, the x-default item is also\r\n            modified. If the array only has 1 existing item (which is not x-default), an x-default item\r\n            is added with the given value. If the selected item is from a match with the generic language\r\n            and there are no other generic matches, the value of that item is modified. If the existing\r\n            value of that item matches the existing value of the x-default item, the x-default item is\r\n            also modified. If the array only has 1 existing item (which is not x-default), an x-default\r\n            item is added with the given value. If the selected item is from a partial match with the\r\n            generic language and there are other partial matches, a new item is created for the specific\r\n            language. The x-default item is not modified. If the selected item is from the last 2 rules\r\n            then a new item is created for the specific language. If the array only had an x-default\r\n            item, the x-default item is also modified. If the array was empty, items are created for the\r\n            specific language and x-default.\r\n            \r\n            <em>Note:</em> In a future version of this API a method \r\n            \t\tusing Java <code>java.lang.Locale</code> will be added.\r\n            \r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the alt-text array. Has the same usage as in\r\n                   <code>GetProperty()</code>. </param>\r\n            <param name=\"altTextName\"> The name of the alt-text array. May be a general path expression, must not\r\n                   be <code>null</code> or the empty string. Has the same namespace prefix usage as\r\n                   propName in <code>GetProperty()</code>. </param>\r\n            <param name=\"genericLang\"> The name of the generic language as an RFC 3066 primary subtag. May be\r\n                   <code>null</code> or the empty string if no generic language is wanted. </param>\r\n            <param name=\"specificLang\"> The name of the specific language as an RFC 3066 tag. Must not be\r\n                   <code>null</code> or the empty string. </param>\r\n            <param name=\"itemValue\"> A pointer to the <code>null</code> terminated UTF-8 string that is the new\r\n                   value for the appropriate array item. </param>\r\n            <param name=\"options\"> Option flags, none are defined at present. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetLocalizedText(System.String,System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyBoolean(System.String,System.String)\">\r\n            <summary>\r\n            These are very similar to <code>GetProperty()</code> and <code>SetProperty()</code> above, \r\n            but the value is returned or provided in a literal form instead of as a UTF-8 string. \r\n            The path composition functions in <code>XMPPathFactory</code> may be used to compose an path \r\n            expression for fields in nested structures, items in arrays, or qualifiers.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a <code>Boolean</code> value or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyInteger(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns an <code>Integer</code> value or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyLong(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a <code>Long</code> value or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyDouble(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a <code>Double</code> value or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyDate(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a <code>XMPDateTime</code>-object or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyCalendar(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a Java <code>Calendar</code>-object or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyBase64(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a <code>byte[]</code>-array contained the decoded base64 value \r\n            \t\t   or <code>null</code> if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.GetPropertyString(System.String,System.String)\">\r\n            <summary>\r\n            Convenience method to retrieve the literal value of a property.\r\n            <em>Note:</em> There is no <code>SetPropertyString()</code>, \r\n            because <code>SetProperty()</code> sets a string value.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>GetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <returns> Returns a <code>String</code> value or <code>null</code> \r\n            \t\t   if the property does not exist. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur, \r\n            \t\t   especially conversion errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyBoolean(System.String,System.String,System.Boolean,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property to a literal <code>boolean</code> value.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the literal property value as <code>boolean</code>. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyBoolean(System.String,System.String,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyInteger(System.String,System.String,System.Int32,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property to a literal <code>int</code> value.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the literal property value as <code>int</code>. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyInteger(System.String,System.String,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyLong(System.String,System.String,System.Int64,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property to a literal <code>long</code> value.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the literal property value as <code>long</code>. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyLong(System.String,System.String,System.Int64)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyDouble(System.String,System.String,System.Double,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property to a literal <code>double</code> value.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the literal property value as <code>double</code>. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyDouble(System.String,System.String,System.Double)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyDate(System.String,System.String,iTextSharp.xmp.IXmpDateTime,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property with an XMPDateTime-object, \r\n            which is serialized to an ISO8601 date.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the property value as <code>XMPDateTime</code>. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyDate(System.String,System.String,iTextSharp.xmp.IXmpDateTime)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyCalendar(System.String,System.String,System.DateTime,iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property with a Java Calendar-object, \r\n            which is serialized to an ISO8601 date.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the property value as Java <code>Calendar</code>. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyCalendar(System.String,System.String,System.DateTime)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.SetPropertyBase64(System.String,System.String,System.SByte[],iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Convenience method to set a property from a binary <code>byte[]</code>-array, \r\n            which is serialized as base64-string.\r\n            </summary>\r\n            <param name=\"schemaNs\"> The namespace URI for the property. Has the same usage as in\r\n                    <code>SetProperty()</code>. </param>\r\n            <param name=\"propName\"> The name of the property.\r\n            \t\t   Has the same usage as in <code>GetProperty()</code>. </param>\r\n            <param name=\"propValue\"> the literal property value as byte array. </param>\r\n            <param name=\"options\"> options of the property to set (optional). </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.SetPropertyBase64(System.String,System.String,System.SByte[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.Iterator”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.Iterator(iTextSharp.xmp.options.IteratorOptions)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.Iterator(System.String,System.String,iTextSharp.xmp.options.IteratorOptions)\">\r\n            <summary>\r\n            Construct an iterator for the properties within an XMP object. According to the parameters it iterates the entire data tree,\r\n            properties within a specific schema, or a subtree rooted at a specific node.\r\n            </summary>\r\n            <param name=\"schemaNs\"> Optional schema namespace URI to restrict the iteration. Omitted (visit all\r\n                   schema) by passing <code>null</code> or empty String. </param>\r\n            <param name=\"propName\"> Optional property name to restrict the iteration. May be an arbitrary path\r\n                   expression. Omitted (visit all properties) by passing <code>null</code> or empty\r\n                   String. If no schema URI is given, it is ignored. </param>\r\n            <param name=\"options\"> Option flags to control the iteration. See <seealso cref=\"T:iTextSharp.xmp.options.IteratorOptions\"/> for\r\n                   details. </param>\r\n            <returns> Returns an <code>XMPIterator</code> for this <code>XMPMeta</code>-object\r\n                    considering the given options. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpMeta.Sort”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.Normalize(iTextSharp.xmp.options.ParseOptions)\">\r\n            <summary>\r\n            Perform the normalization as a separate parsing step.\r\n            Normally it is done during parsing, unless the parsing option\r\n            <seealso cref=\"F:iTextSharp.xmp.options.ParseOptions.OMIT_NORMALIZATION\"/> is set to <code>true</code>.\r\n            <em>Note:</em> It does no harm to call this method to an already normalized xmp object. \r\n            It was a PDF/A requirement to get hand on the unnormalized <code>XMPMeta</code> object.\r\n            </summary>\r\n            <param name=\"options\"> optional parsing options. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Wraps all errors and exceptions that may occur. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpMeta.DumpObject\">\r\n            <summary>\r\n            Renders this node and the tree unter this node in a human readable form. </summary>\r\n            <returns> Returns a multiline string containing the dump. </returns>\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.xmp.IXmpSchemaRegistry”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpSchemaRegistry.RegisterNamespace(System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpSchemaRegistry.GetNamespacePrefix(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpSchemaRegistry.GetNamespaceUri(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpSchemaRegistry.GetNamespaces\">\r\n            <returns> Returns the registered prefix/namespace-pairs as map, where the keys are the\r\n                    namespaces and the values are the prefixes. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpSchemaRegistry.GetPrefixes\">\r\n            <returns> Returns the registered namespace/prefix-pairs as map, where the keys are the\r\n                    prefixes and the values are the namespaces. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.IXmpSchemaRegistry.DeleteNamespace(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.IXmpSchemaRegistry.ResolveAlias(System.String,System.String)\">\r\n            <summary>\r\n            Determines if a name is an alias, and what it is aliased to.\r\n            </summary>\r\n            <param name=\"aliasNs\">\r\n                       The namespace URI of the alias. Must not be <code>null</code> or the empty\r\n                       string. </param>\r\n            <param name=\"aliasProp\">\r\n                       The name of the alias. May be an arbitrary path expression\r\n                       path, must not be <code>null</code> or the empty string. </param>\r\n            <returns> Returns the <code>XMPAliasInfo</code> for the given alias namespace and property or\r\n            \t\t<code>null</code> if there is no such alias. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpSchemaRegistry.FindAliases(System.String)\">\r\n            <summary>\r\n            Collects all aliases that are contained in the provided namespace.\r\n            If nothing is found, an empty array is returned. \r\n            </summary>\r\n            <param name=\"aliasNs\"> a schema namespace URI </param>\r\n            <returns> Returns all alias infos from aliases that are contained in the provided namespace.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpSchemaRegistry.FindAlias(System.String)\">\r\n            <summary>\r\n            Searches for registered aliases.\r\n            </summary>\r\n            <param name=\"qname\">\r\n                       an XML conform qname </param>\r\n            <returns> Returns if an alias definition for the given qname to another\r\n                    schema and property is registered. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.IXmpSchemaRegistry.GetAliases\">\r\n            <returns> Returns the registered aliases as map, where the key is the \"qname\" (prefix and name)\r\n            and the value an <code>XMPAliasInfo</code>-object. </returns>\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.xmp.IXmpVersionInfo”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:iTextSharp.xmp.IXmpVersionInfo.Major\">\r\n            <returns> Returns the primary release number, the \"1\" in version \"1.2.3\". </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpVersionInfo.Minor\">\r\n            <returns> Returns the secondary release number, the \"2\" in version \"1.2.3\". </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpVersionInfo.Micro\">\r\n            <returns> Returns the tertiary release number, the \"3\" in version \"1.2.3\". </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpVersionInfo.Build\">\r\n            <returns> Returns a rolling build number, monotonically increasing in a release. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpVersionInfo.Debug\">\r\n            <returns> Returns true if this is a debug build. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.IXmpVersionInfo.Message\">\r\n            <returns> Returns a comprehensive version information string. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.options.AliasOptions\">\r\n            <summary>\r\n            Options for XMPSchemaRegistryImpl#registerAlias.\r\n            \r\n            @since 20.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.AliasOptions.PROP_DIRECT\">\r\n            <summary>\r\n            This is a direct mapping. The actual data type does not matter. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.AliasOptions.PROP_ARRAY\">\r\n            <summary>\r\n            The actual is an unordered array, the alias is to the first element of the array. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.AliasOptions.PROP_ARRAY_ORDERED\">\r\n            <summary>\r\n            The actual is an ordered array, the alias is to the first element of the array. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.AliasOptions.PROP_ARRAY_ALTERNATE\">\r\n            <summary>\r\n            The actual is an alternate array, the alias is to the first element of the array. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.AliasOptions.PROP_ARRAY_ALT_TEXT\">\r\n            <summary>\r\n            The actual is an alternate text array, the alias is to the 'x-default' element of the array.\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.AliasOptions.#ctor”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.options.AliasOptions.#ctor(System.UInt32)\">\r\n            <param name=\"options\"> the options to init with </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If options are not consistant </exception>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.AliasOptions.Simple\">\r\n            <returns> Returns if the alias is of the simple form. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.AliasOptions.Array\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.AliasOptions.ArrayOrdered\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.AliasOptions.ArrayAlternate\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.AliasOptions.ArrayAltText\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.options.AliasOptions.ValidOptions”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.options.AliasOptions.ToPropertyOptions\">\r\n            <returns> returns a <seealso cref=\"T:iTextSharp.xmp.options.PropertyOptions\"/>s object </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the options are not consistant.  </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.AliasOptions.DefineOptionName(System.UInt32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.options.IteratorOptions\">\r\n            <summary>\r\n            Options for <code>XMPIterator</code> construction.\r\n            \r\n            @since 24.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.IteratorOptions.JUST_CHILDREN\">\r\n            <summary>\r\n            Just do the immediate children of the root, default is subtree. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.IteratorOptions.JUST_LEAFNODES\">\r\n            <summary>\r\n            Just do the leaf nodes, default is all nodes in the subtree.\r\n             Bugfix #2658965: If this option is set the Iterator returns the namespace \r\n             of the leaf instead of the namespace of the base property. \r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.IteratorOptions.JUST_LEAFNAME\">\r\n            <summary>\r\n            Return just the leaf part of the path, default is the full path. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.IteratorOptions.OMIT_QUALIFIERS\">\r\n            <summary>\r\n            Omit all qualifiers. </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.IteratorOptions.JustChildren\">\r\n            <returns> Returns whether the option is set. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.IteratorOptions.JustLeafname\">\r\n            <returns> Returns whether the option is set. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.IteratorOptions.JustLeafnodes\">\r\n            <returns> Returns whether the option is set. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.IteratorOptions.OmitQualifiers\">\r\n            <returns> Returns whether the option is set. </returns>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.options.IteratorOptions.ValidOptions”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.IteratorOptions.DefineOptionName(System.UInt32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.options.ParseOptions\">\r\n            <summary>\r\n            Options for <seealso cref=\"M:iTextSharp.xmp.XmpMetaFactory.Parse(System.IO.Stream,iTextSharp.xmp.options.ParseOptions)\"/>.\r\n            \r\n            @since 24.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.ParseOptions.REQUIRE_XMP_META\">\r\n            <summary>\r\n            Require a surrounding &quot;x:xmpmeta&quot; element in the xml-document. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.ParseOptions.STRICT_ALIASING\">\r\n            <summary>\r\n            Do not reconcile alias differences, throw an exception instead. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.ParseOptions.FIX_CONTROL_CHARS\">\r\n            <summary>\r\n            Convert ASCII control characters 0x01 - 0x1F (except tab, cr, and lf) to spaces. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.ParseOptions.ACCEPT_LATIN_1\">\r\n            <summary>\r\n            If the input is not unicode, try to parse it as ISO-8859-1. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.ParseOptions.OMIT_NORMALIZATION\">\r\n            <summary>\r\n            Do not carry run the XMPNormalizer on a packet, leave it as it is. </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.ParseOptions.#ctor\">\r\n            <summary>\r\n            Sets the options to the default values.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.ParseOptions.RequireXmpMeta\">\r\n            <returns> Returns the requireXMPMeta. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.ParseOptions.StrictAliasing\">\r\n            <returns> Returns the strictAliasing. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.ParseOptions.FixControlChars\">\r\n            <returns> Returns the strictAliasing. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.ParseOptions.AcceptLatin1\">\r\n            <returns> Returns the strictAliasing. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.ParseOptions.OmitNormalization\">\r\n            <returns> Returns the option \"omit normalization\". </returns>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.options.ParseOptions.ValidOptions”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.ParseOptions.DefineOptionName(System.UInt32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.options.PropertyOptions\">\r\n            <summary>\r\n            The property flags are used when properties are fetched from the <code>XMPMeta</code>-object\r\n            and provide more detailed information about the property.\r\n            \r\n            @since   03.07.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.PropertyOptions.DELETE_EXISTING\">\r\n            <summary>\r\n            may be used in the future </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.PropertyOptions.SEPARATE_NODE\">\r\n            <summary>\r\n            Updated by iText. Indicates if the property should be writted as a separate node\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.PropertyOptions.#ctor\">\r\n            <summary>\r\n            Default constructor\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.PropertyOptions.#ctor(System.UInt32)\">\r\n            <summary>\r\n            Intialization constructor\r\n            </summary>\r\n            <param name=\"options\"> the initialization options </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the options are not valid  </exception>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.Uri\">\r\n            <returns> Return whether the property value is a URI. It is serialized to RDF using the\r\n                    <tt>rdf:resource</tt> attribute. Not mandatory for URIs, but considered RDF-savvy. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.HasQualifiers\">\r\n            <returns> Return whether the property has qualifiers. These could be an <tt>xml:lang</tt>\r\n                    attribute, an <tt>rdf:type</tt> property, or a general qualifier. See the\r\n                    introductory discussion of qualified properties for more information. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.Qualifier\">\r\n            <returns> Return whether this property is a qualifier for some other property. Note that if the\r\n                    qualifier itself has a structured value, this flag is only set for the top node of\r\n                    the qualifier's subtree. Qualifiers may have arbitrary structure, and may even have\r\n                    qualifiers. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.HasLanguage\">\r\n            <returns> Return whether this property has an <tt>xml:lang</tt> qualifier. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.HasType\">\r\n            <returns> Return whether this property has an <tt>rdf:type</tt> qualifier. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.Struct\">\r\n            <returns> Return whether this property contains nested fields. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.Array\">\r\n            <returns> Return whether this property is an array. By itself this indicates a general\r\n                    unordered array. It is serialized using an <tt>rdf:Bag</tt> container. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.ArrayOrdered\">\r\n            <returns> Return whether this property is an ordered array. Appears in conjunction with\r\n                    getPropValueIsArray(). It is serialized using an <tt>rdf:Seq</tt> container. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.ArrayAlternate\">\r\n            <returns> Return whether this property is an alternative array. Appears in conjunction with\r\n                    getPropValueIsArray(). It is serialized using an <tt>rdf:Alt</tt> container. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.ArrayAltText\">\r\n            <returns> Return whether this property is an alt-text array. Appears in conjunction with\r\n                    getPropArrayIsAlternate(). It is serialized using an <tt>rdf:Alt</tt> container.\r\n                    Each array element is a simple property with an <tt>xml:lang</tt> attribute. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.SchemaNode\">\r\n            <param name=\"value\"> the value to set </param>\r\n            <returns> Returns this to enable cascaded options. </returns>\r\n            <returns> Returns whether the SCHEMA_NODE option is set. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.CompositeProperty\">\r\n            <returns> Returns whether the property is of composite type - an array or a struct. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.Simple\">\r\n            <returns> Returns whether the property is of composite type - an array or a struct. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.PropertyOptions.OnlyArrayOptions\">\r\n            <returns> Returns true if only array options are set. </returns>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.options.PropertyOptions.ValidOptions”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.options.PropertyOptions.EqualArrayTypes(iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Compares two options set for array compatibility.\r\n            </summary>\r\n            <param name=\"options\"> other options </param>\r\n            <returns> Returns true if the array options of the sets are equal. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.PropertyOptions.MergeWith(iTextSharp.xmp.options.PropertyOptions)\">\r\n            <summary>\r\n            Merges the set options of a another options object with this.\r\n            If the other options set is null, this objects stays the same. </summary>\r\n            <param name=\"options\"> other options </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If illegal options are provided  </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.PropertyOptions.DefineOptionName(System.UInt32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.options.PropertyOptions.AssertConsistency(System.UInt32)\">\r\n            <summary>\r\n            Checks that a node not a struct and array at the same time;\r\n            and URI cannot be a struct.\r\n            </summary>\r\n            <param name=\"options\"> the bitmask to check. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the options are not consistent. </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.options.SerializeOptions\">\r\n            <summary>\r\n            Options for <seealso cref=\"M:iTextSharp.xmp.XmpMetaFactory.SerializeToBuffer(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.options.SerializeOptions)\"/>.\r\n            \r\n            @since 24.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.OMIT_PACKET_WRAPPER\">\r\n            <summary>\r\n            Omit the XML packet wrapper. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.READONLY_PACKET\">\r\n            <summary>\r\n            Mark packet as read-only. Default is a writeable packet. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.USE_COMPACT_FORMAT\">\r\n            <summary>\r\n            Use a compact form of RDF.\r\n            The compact form is the default serialization format (this flag is technically ignored).\r\n            To Serialize to the canonical form, set the flag USE_CANONICAL_FORMAT.\r\n            If both flags &quot;compact&quot; and &quot;canonical&quot; are set, canonical is used.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.USE_CANONICAL_FORMAT\">\r\n            <summary>\r\n            Use the canonical form of RDF if set. By default the compact form is used </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.INCLUDE_THUMBNAIL_PAD\">\r\n            <summary>\r\n            Include a padding allowance for a thumbnail image. If no <tt>xmp:Thumbnails</tt> property\r\n            is present, the typical space for a JPEG thumbnail is used.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.EXACT_PACKET_LENGTH\">\r\n            <summary>\r\n            The padding parameter provides the overall packet length. The actual amount of padding is\r\n            computed. An exception is thrown if the packet exceeds this length with no padding.\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“F:iTextSharp.xmp.options.SerializeOptions.OMIT_XMPMETA_ELEMENT”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.SORT\">\r\n            <summary>\r\n            Sort the struct properties and qualifier before serializing </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.LITTLEENDIAN_BIT\">\r\n            <summary>\r\n            Bit indicating little endian encoding, unset is big endian </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.UTF16_BIT\">\r\n            <summary>\r\n            Bit indication UTF16 encoding. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.ENCODE_UTF8\">\r\n            <summary>\r\n            UTF8 encoding; this is the default </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.ENCODE_UTF16BE\">\r\n            <summary>\r\n            UTF16BE encoding </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions.ENCODE_UTF16LE\">\r\n            <summary>\r\n            UTF16LE encoding </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions._baseIndent\">\r\n            <summary>\r\n            The number of levels of indentation to be used for the outermost XML element in the\r\n            serialized RDF. This is convenient when embedding the RDF in other text, defaults to 0.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions._indent\">\r\n            <summary>\r\n            The string to be used for each level of indentation in the serialized\r\n            RDF. If empty it defaults to two ASCII spaces, U+0020.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions._newline\">\r\n            <summary>\r\n            The string to be used as a line terminator. If empty it defaults to; linefeed, U+000A, the\r\n            standard XML newline.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions._omitVersionAttribute\">\r\n            <summary>\r\n            Omits the Toolkit version attribute, not published, only used for Unit tests. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.SerializeOptions._padding\">\r\n            <summary>\r\n            The amount of padding to be added if a writeable XML packet is created. If zero is passed\r\n            (the default) an appropriate amount of padding is computed.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.SerializeOptions.#ctor\">\r\n            <summary>\r\n            Default constructor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.SerializeOptions.#ctor(System.UInt32)\">\r\n            <summary>\r\n            Constructor using inital options </summary>\r\n            <param name=\"options\"> the inital options </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if options are not consistant. </exception>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.OmitPacketWrapper\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.OmitXmpMetaElement\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.ReadOnlyPacket\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.UseCompactFormat\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.UseCanonicalFormat\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.IncludeThumbnailPad\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.ExactPacketLength\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.Sort\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.EncodeUtf16Be\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.EncodeUtf16Le\">\r\n            <returns> Returns the option. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.BaseIndent\">\r\n            <returns> Returns the baseIndent. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.Indent\">\r\n            <returns> Returns the indent. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.Newline\">\r\n            <returns> Returns the newline. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.Padding\">\r\n            <returns> Returns the padding. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.OmitVersionAttribute\">\r\n            <returns> Returns whether the Toolkit version attribute shall be omitted.\r\n            <em>Note:</em> This options can only be set by unit tests. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.SerializeOptions.Encoding\">\r\n            <returns> Returns the encoding as Java encoding String.  </returns>\r\n        </member>\r\n        <!-- 对于成员“P:iTextSharp.xmp.options.SerializeOptions.ValidOptions”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.options.SerializeOptions.Clone\">\r\n            \r\n            <returns> Returns clone of this SerializeOptions-object with the same options set. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.SerializeOptions.DefineOptionName(System.UInt32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:iTextSharp.xmp.options.XmpOptions\">\r\n            <summary>\r\n            The base class for a collection of 32 flag bits. Individual flags are defined as enum value bit\r\n            masks. Inheriting classes add convenience accessor methods.\r\n            \r\n            @since 24.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.XmpOptions._optionNames\">\r\n            <summary>\r\n            a map containing the bit names </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.options.XmpOptions._options\">\r\n            <summary>\r\n            the internal int containing all options </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.#ctor\">\r\n            <summary>\r\n            The default constructor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.#ctor(System.UInt32)\">\r\n            <summary>\r\n            Constructor with the options bit mask. \r\n            </summary>\r\n            <param name=\"options\"> the options bit mask </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> If the options are not correct </exception>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.XmpOptions.Options\">\r\n            <summary>\r\n            Is friendly to access it during the tests. </summary>\r\n            <returns> Returns the options. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.XmpOptions.OptionsString\">\r\n            <summary>\r\n            Creates a human readable string from the set options. <em>Note:</em> This method is quite\r\n            expensive and should only be used within tests or as </summary>\r\n            <returns> Returns a String listing all options that are set to <code>true</code> by their name,\r\n            like &quot;option1 | option4&quot;. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.options.XmpOptions.ValidOptions\">\r\n            <summary>\r\n            To be implemeted by inheritants. </summary>\r\n            <returns> Returns a bit mask where all valid option bits are set. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.Clear\">\r\n            <summary>\r\n            Resets the options.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.IsExactly(System.UInt32)\">\r\n            <param name=\"optionBits\"> an option bitmask </param>\r\n            <returns> Returns true, if this object is equal to the given options.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.ContainsAllOptions(System.UInt32)\">\r\n            <param name=\"optionBits\"> an option bitmask </param>\r\n            <returns> Returns true, if this object contains all given options.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.ContainsOneOf(System.UInt32)\">\r\n            <param name=\"optionBits\"> an option bitmask </param>\r\n            <returns> Returns true, if this object contain at least one of the given options.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.GetOption(System.UInt32)\">\r\n            <param name=\"optionBit\"> the binary bit or bits that are requested </param>\r\n            <returns> Returns if <emp>all</emp> of the requested bits are set or not. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.SetOption(System.UInt32,System.Boolean)\">\r\n            <param name=\"optionBits\"> the binary bit or bits that shall be set to the given value </param>\r\n            <param name=\"value\"> the boolean value to set </param>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.XmpOptions.Equals(System.Object)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.options.XmpOptions.GetHashCode”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.ToString\">\r\n            <returns> Returns the options as hex bitmask.  </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.DefineOptionName(System.UInt32)\">\r\n            <summary>\r\n            To be implemeted by inheritants. </summary>\r\n            <param name=\"option\"> a single, valid option bit. </param>\r\n            <returns> Returns a human readable name for an option bit. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.AssertConsistency(System.UInt32)\">\r\n            <summary>\r\n            The inheriting option class can do additional checks on the options.\r\n            <em>Note:</em> For performance reasons this method is only called \r\n            when setting bitmasks directly.\r\n            When get- and set-methods are used, this method must be called manually,\r\n            normally only when the Options-object has been created from a client\r\n            (it has to be made public therefore).\r\n            </summary>\r\n            <param name=\"options\"> the bitmask to check. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the options are not consistent. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.AssertOptionsValid(System.UInt32)\">\r\n            <summary>\r\n            Checks options before they are set.\r\n            First it is checked if only defined options are used,\r\n            second the additional <seealso cref=\"M:iTextSharp.xmp.options.XmpOptions.AssertConsistency(System.UInt32)\"/>-method is called.\r\n            </summary>\r\n            <param name=\"options\"> the options to check </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the options are invalid. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.GetOptionName(System.UInt32)\">\r\n            <summary>\r\n            Looks up or asks the inherited class for the name of an option bit.\r\n            Its save that there is only one valid option handed into the method. </summary>\r\n            <param name=\"option\"> a single option bit </param>\r\n            <returns> Returns the option name or undefined. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.options.XmpOptions.ProcureOptionNames\">\r\n            <returns> Returns the optionNames map and creates it if required. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.properties.IXmpAliasInfo\">\r\n            <summary>\r\n            This interface is used to return info about an alias.\r\n            \r\n            @since   27.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpAliasInfo.Namespace\">\r\n            <returns> Returns Returns the namespace URI for the base property. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpAliasInfo.Prefix\">\r\n            <returns> Returns the default prefix for the given base property.  </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpAliasInfo.PropName\">\r\n            <returns> Returns the path of the base property. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpAliasInfo.AliasForm\">\r\n            <returns> Returns the kind of the alias. This can be a direct alias\r\n                    (ARRAY), a simple property to an ordered array\r\n                    (ARRAY_ORDERED), to an alternate array\r\n                    (ARRAY_ALTERNATE) or to an alternate text array\r\n                    (ARRAY_ALT_TEXT). </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.properties.IXmpProperty\">\r\n            <summary>\r\n            This interface is used to return a text property together with its and options.\r\n            \r\n            @since   23.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpProperty.Value\">\r\n            <returns> Returns the value of the property. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpProperty.Options\">\r\n            <returns> Returns the options of the property. </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpProperty.Language\">\r\n            <summary>\r\n            Only set by <seealso cref=\"M:iTextSharp.xmp.IXmpMeta.GetLocalizedText(System.String,System.String,System.String,System.String)\"/>. </summary>\r\n            <returns> Returns the language of the alt-text item. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.properties.IXmpPropertyInfo\">\r\n            <summary>\r\n            This interface is used to return a property together with its path and namespace.\r\n            It is returned when properties are iterated with the <code>XMPIterator</code>.\r\n            \r\n            @since   06.07.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpPropertyInfo.Namespace\">\r\n            <returns> Returns the namespace of the property </returns>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.properties.IXmpPropertyInfo.Path\">\r\n            <returns> Returns the path of the property, but only if returned by the iterator. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.XmpConst\">\r\n            <summary>\r\n            Common constants for the XMP Toolkit. \r\n            \r\n            @since 20.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_XML\">\r\n            <summary>\r\n            The XML namespace for XML. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_RDF\">\r\n            <summary>\r\n            The XML namespace for RDF. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_DC\">\r\n            <summary>\r\n            The XML namespace for the Dublin Core schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_IPTCCORE\">\r\n            <summary>\r\n            The XML namespace for the IPTC Core schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_IPTCEXT\">\r\n            <summary>\r\n            The XML namespace for the IPTC Extension schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_DICOM\">\r\n            <summary>\r\n            The XML namespace for the DICOM medical schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_PLUS\">\r\n            <summary>\r\n            The XML namespace for the PLUS (Picture Licensing Universal System, http://www.useplus.org) </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_X\">\r\n            <summary>\r\n            The XML namespace Adobe XMP Metadata. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_XMP\">\r\n            <summary>\r\n            The XML namespace for the XMP \"basic\" schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_XMP_RIGHTS\">\r\n            <summary>\r\n            The XML namespace for the XMP copyright schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_XMP_MM\">\r\n            <summary>\r\n            The XML namespace for the XMP digital asset management schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_XMP_BJ\">\r\n            <summary>\r\n            The XML namespace for the job management schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_XMP_NOTE\">\r\n            <summary>\r\n            The XML namespace for the job management schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_PDF\">\r\n            <summary>\r\n            The XML namespace for the PDF schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_PDFX\">\r\n            <summary>\r\n            The XML namespace for the PDF schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_PHOTOSHOP\">\r\n            <summary>\r\n            The XML namespace for the Photoshop custom schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_PSALBUM\">\r\n            <summary>\r\n            The XML namespace for the Photoshop Album schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_EXIF\">\r\n            <summary>\r\n            The XML namespace for Adobe's EXIF schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_EXIFX\">\r\n            <summary>\r\n            NS for the CIPA XMP for Exif document v1.1 </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_TIFF\">\r\n            <summary>\r\n            The XML namespace for Adobe's TIFF schema. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_BWF\">\r\n            <summary>\r\n            BExt Schema </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_RIFFINFO\">\r\n            <summary>\r\n            RIFF Info Schema </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_TXMP\">\r\n            <summary>\r\n            Transform XMP </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_SWF\">\r\n            <summary>\r\n            Adobe Flash SWF </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.NS_DC_DEPRECATED\">\r\n            <summary>\r\n            legacy Dublin Core NS, will be converted to NS_DC </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_IDENTIFIERQUAL\">\r\n            <summary>\r\n            The XML namespace for qualifiers of the xmp:Identifier property. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_DIMENSIONS\">\r\n            <summary>\r\n            The XML namespace for fields of the Dimensions type. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_IMAGE\">\r\n            <summary>\r\n            The XML namespace for fields of a graphical image. Used for the Thumbnail type. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_RESOURCEEVENT\">\r\n            <summary>\r\n            The XML namespace for fields of the ResourceEvent type. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_RESOURCEREF\">\r\n            <summary>\r\n            The XML namespace for fields of the ResourceRef type. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_ST_VERSION\">\r\n            <summary>\r\n            The XML namespace for fields of the Version type. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TYPE_ST_JOB\">\r\n            <summary>\r\n            The XML namespace for fields of the JobRef type. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TRUESTR\">\r\n            <summary>\r\n            The canonical true string value for Booleans in serialized XMP. Code that converts from the\r\n            string to a bool should be case insensitive, and even allow \"1\".\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.FALSESTR\">\r\n            <summary>\r\n            The canonical false string value for Booleans in serialized XMP. Code that converts from the\r\n            string to a bool should be case insensitive, and even allow \"0\".\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.ARRAY_LAST_ITEM\">\r\n            <summary>\r\n            Index that has the meaning to be always the last item in an array. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.ARRAY_ITEM_NAME\">\r\n            <summary>\r\n            Node name of an array item. </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.X_DEFAULT\">\r\n            <summary>\r\n            The x-default string for localized properties </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.XML_LANG\">\r\n            <summary>\r\n            xml:lang qualfifier </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.RDF_TYPE\">\r\n            <summary>\r\n            rdf:type qualfifier </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.XMP_PI\">\r\n            <summary>\r\n            Processing Instruction (PI) for xmp packet </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TAG_XMPMETA\">\r\n            <summary>\r\n            XMP meta tag version new </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpConst.TAG_XAPMETA\">\r\n            <summary>\r\n            XMP meta tag version old </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.XmpDateTimeFactory\">\r\n            <summary>\r\n            A factory to create <code>XMPDateTime</code>-instances from a <code>Calendar</code> or an\r\n            ISO 8601 string or for the current time.\r\n            \r\n            @since 16.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.XmpDateTimeFactory.CurrentDateTime\">\r\n            <summary>\r\n            Obtain the current date and time.\r\n            </summary>\r\n            <returns> Returns The returned time is UTC, properly adjusted for the local time zone. The\r\n                    resolution of the time is not guaranteed to be finer than seconds. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpDateTimeFactory.CreateFromCalendar(iTextSharp.xmp.XmpCalendar)\">\r\n            <summary>\r\n            Creates an <code>XMPDateTime</code> from a <code>Calendar</code>-object.\r\n            </summary>\r\n            <param name=\"calendar\"> a <code>Calendar</code>-object. </param>\r\n            <returns> An <code>XMPDateTime</code>-object. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpDateTimeFactory.Create\">\r\n            <summary>\r\n            Creates an empty <code>XMPDateTime</code>-object. </summary>\r\n            <returns> Returns an <code>XMPDateTime</code>-object. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpDateTimeFactory.Create(System.Int32,System.Int32,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpDateTimeFactory.Create(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.XmpDateTimeFactory.CreateFromIso8601(System.String)\">\r\n            <summary>\r\n            Creates an <code>XMPDateTime</code> from an ISO 8601 string.\r\n            </summary>\r\n            <param name=\"strValue\"> The ISO 8601 string representation of the date/time. </param>\r\n            <returns> An <code>XMPDateTime</code>-object. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> When the ISO 8601 string is non-conform </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpDateTimeFactory.SetLocalTimeZone(iTextSharp.xmp.IXmpDateTime)\">\r\n            <summary>\r\n            Sets the local time zone without touching any other Any existing time zone value is replaced,\r\n            the other date/time fields are not adjusted in any way.\r\n            </summary>\r\n            <param name=\"dateTime\"> the <code>XMPDateTime</code> variable containing the value to be modified. </param>\r\n            <returns> Returns an updated <code>XMPDateTime</code>-object. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpDateTimeFactory.ConvertToUtcTime(iTextSharp.xmp.IXmpDateTime)\">\r\n            <summary>\r\n            Make sure a time is UTC. If the time zone is not UTC, the time is\r\n            adjusted and the time zone set to be UTC.\r\n            </summary>\r\n            <param name=\"dateTime\">\r\n                       the <code>XMPDateTime</code> variable containing the time to\r\n                       be modified. </param>\r\n            <returns> Returns an updated <code>XMPDateTime</code>-object. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpDateTimeFactory.ConvertToLocalTime(iTextSharp.xmp.IXmpDateTime)\">\r\n            <summary>\r\n            Make sure a time is local. If the time zone is not the local zone, the time is adjusted and\r\n            the time zone set to be local.\r\n            </summary>\r\n            <param name=\"dateTime\"> the <code>XMPDateTime</code> variable containing the time to be modified. </param>\r\n            <returns> Returns an updated <code>XMPDateTime</code>-object. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.XmpError\">\r\n            <summary>\r\n            @since   21.09.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpError.BADSTREAM\">\r\n            <summary>\r\n            <em>Note:</em> This is an error code introduced by Java. </summary>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.XmpException\">\r\n            <summary>\r\n            This exception wraps all errors that occur in the XMP Toolkit.\r\n            \r\n            @since   16.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpException._errorCode\">\r\n            <summary>\r\n            the errorCode of the XMP toolkit </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpException.#ctor(System.String,System.Int32)\">\r\n            <summary>\r\n            Constructs an exception with a message and an error code. </summary>\r\n            <param name=\"message\"> the message </param>\r\n            <param name=\"errorCode\"> the error code </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpException.#ctor(System.String,System.Int32,System.Exception)\">\r\n            <summary>\r\n            Constructs an exception with a message, an error code and a <code>Throwable</code> </summary>\r\n            <param name=\"message\"> the error message. </param>\r\n            <param name=\"errorCode\"> the error code </param>\r\n            <param name=\"t\"> the exception source </param>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.XmpException.ErrorCode\">\r\n            <returns> Returns the errorCode. </returns>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.XmpMetaFactory\">\r\n            <summary>\r\n            Creates <code>XMPMeta</code>-instances from an <code>InputStream</code>\r\n            \r\n            @since 30.01.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpMetaFactory._schema\">\r\n            <summary>\r\n            The singleton instance of the <code>XMPSchemaRegistry</code>.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:iTextSharp.xmp.XmpMetaFactory._versionInfo\">\r\n            <summary>\r\n            cache for version info\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:iTextSharp.xmp.XmpMetaFactory.SchemaRegistry\">\r\n            <returns> Returns the singleton instance of the <code>XMPSchemaRegistry</code>. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.Create\">\r\n            <returns> Returns an empty <code>XMPMeta</code>-object. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpMetaFactory.Parse(System.IO.Stream)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpMetaFactory.Parse(System.IO.Stream,iTextSharp.xmp.options.ParseOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpMetaFactory.ParseFromString(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpMetaFactory.ParseFromString(System.String,iTextSharp.xmp.options.ParseOptions)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpMetaFactory.ParseFromBuffer(System.Byte[])”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpMetaFactory.ParseFromBuffer(System.Byte[],iTextSharp.xmp.options.ParseOptions)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.Serialize(iTextSharp.xmp.IXmpMeta,System.IO.Stream)\">\r\n            <summary>\r\n            Serializes an <code>XMPMeta</code>-object as RDF into an <code>OutputStream</code>\r\n            with default options.\r\n            </summary>\r\n            <param name=\"xmp\"> a metadata object </param>\r\n            <param name=\"out\"> an <code>OutputStream</code> to write the serialized RDF to. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> on serializsation errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.Serialize(iTextSharp.xmp.IXmpMeta,System.IO.Stream,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            Serializes an <code>XMPMeta</code>-object as RDF into an <code>OutputStream</code>.\r\n            </summary>\r\n            <param name=\"xmp\">     a metadata object </param>\r\n            <param name=\"options\"> Options to control the serialization (see <seealso cref=\"T:iTextSharp.xmp.options.SerializeOptions\"/>). </param>\r\n            <param name=\"out\">     an <code>OutputStream</code> to write the serialized RDF to. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> on serializsation errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.SerializeToBuffer(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            Serializes an <code>XMPMeta</code>-object as RDF into a byte buffer.\r\n            </summary>\r\n            <param name=\"xmp\">     a metadata object </param>\r\n            <param name=\"options\"> Options to control the serialization (see <seealso cref=\"T:iTextSharp.xmp.options.SerializeOptions\"/>). </param>\r\n            <returns> Returns a byte buffer containing the serialized RDF. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> on serializsation errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.SerializeToString(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.options.SerializeOptions)\">\r\n            <summary>\r\n            Serializes an <code>XMPMeta</code>-object as RDF into a string. <em>Note:</em> Encoding\r\n            is ignored when serializing to a string.\r\n            </summary>\r\n            <param name=\"xmp\">     a metadata object </param>\r\n            <param name=\"options\"> Options to control the serialization (see <seealso cref=\"T:iTextSharp.xmp.options.SerializeOptions\"/>). </param>\r\n            <returns> Returns a string containing the serialized RDF. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> on serializsation errors. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.AssertImplementation(iTextSharp.xmp.IXmpMeta)\">\r\n            <param name=\"xmp\"> Asserts that xmp is compatible to <code>XMPMetaImpl</code>.s </param>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.Reset\">\r\n            <summary>\r\n            Resets the _schema registry to its original state (creates a new one).\r\n            Be careful this might break all existing XMPMeta-objects and should be used\r\n            only for testing purpurses.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpMetaFactory.GetVersionInfo\">\r\n            <summary>\r\n            Obtain version information. The XMPVersionInfo singleton is created the first time\r\n            its requested.\r\n            </summary>\r\n            <returns> Returns the version information. </returns>\r\n        </member>\r\n        <!-- 对于成员“T:iTextSharp.xmp.XmpPathFactory”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.ComposeArrayItemPath(System.String,System.Int32)\">\r\n            <summary>\r\n            Compose the path expression for an item in an array.\r\n            </summary>\r\n            <param name=\"arrayName\"> The name of the array. May be a general path expression, must not be\r\n                   <code>null</code> or the empty string. </param>\r\n            <param name=\"itemIndex\"> The index of the desired item. Arrays in XMP are indexed from 1.\r\n            \t\t  0 and below means last array item and renders as <code>[last()]</code>.\t\r\n            </param>\r\n            <returns> Returns the composed path basing on fullPath. This will be of the form\r\n                    <tt>ns:arrayName[i]</tt>, where &quot;ns&quot; is the prefix for schemaNs and\r\n                    &quot;i&quot; is the decimal representation of itemIndex. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Throws exeption if index zero is used. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.ComposeStructFieldPath(System.String,System.String)\">\r\n            <summary>\r\n            Compose the path expression for a field in a struct. The result can be added to the\r\n            path of \r\n            \r\n            </summary>\r\n            <param name=\"fieldNs\"> The namespace URI for the field. Must not be <code>null</code> or the empty\r\n                   string. </param>\r\n            <param name=\"fieldName\"> The name of the field. Must be a simple XML name, must not be\r\n                   <code>null</code> or the empty string. </param>\r\n            <returns> Returns the composed path. This will be of the form\r\n                    <tt>ns:structName/fNS:fieldName</tt>, where &quot;ns&quot; is the prefix for\r\n                    schemaNs and &quot;fNS&quot; is the prefix for fieldNs. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the path to create is not valid. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.ComposeQualifierPath(System.String,System.String)\">\r\n            <summary>\r\n            Compose the path expression for a qualifier.\r\n            </summary>\r\n            <param name=\"qualNs\"> The namespace URI for the qualifier. May be <code>null</code> or the empty\r\n                   string if the qualifier is in the XML empty namespace. </param>\r\n            <param name=\"qualName\"> The name of the qualifier. Must be a simple XML name, must not be\r\n                   <code>null</code> or the empty string. </param>\r\n            <returns> Returns the composed path. This will be of the form\r\n                    <tt>ns:propName/?qNS:qualName</tt>, where &quot;ns&quot; is the prefix for\r\n                    schemaNs and &quot;qNS&quot; is the prefix for qualNs. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the path to create is not valid. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.ComposeLangSelector(System.String,System.String)\">\r\n            <summary>\r\n            Compose the path expression to select an alternate item by language. The\r\n            path syntax allows two forms of &quot;content addressing&quot; that may\r\n            be used to select an item in an array of alternatives. The form used in\r\n            ComposeLangSelector lets you select an item in an alt-text array based on\r\n            the value of its <tt>xml:lang</tt> qualifier. The other form of content\r\n            addressing is shown in ComposeFieldSelector. \\note ComposeLangSelector\r\n            does not supplant SetLocalizedText or GetLocalizedText. They should\r\n            generally be used, as they provide extra logic to choose the appropriate\r\n            language and maintain consistency with the 'x-default' value.\r\n            ComposeLangSelector gives you an path expression that is explicitly and\r\n            only for the language given in the langName parameter.\r\n            </summary>\r\n            <param name=\"arrayName\">\r\n                       The name of the array. May be a general path expression, must\r\n                       not be <code>null</code> or the empty string. </param>\r\n            <param name=\"langName\">\r\n                       The RFC 3066 code for the desired language. </param>\r\n            <returns> Returns the composed path. This will be of the form\r\n                    <tt>ns:arrayName[@xml:lang='langName']</tt>, where\r\n                    &quot;ns&quot; is the prefix for schemaNs. </returns>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpPathFactory.ComposeFieldSelector(System.String,System.String,System.String,System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.AssertQualNs(System.String)\">\r\n            <summary>\r\n            ParameterAsserts that a qualifier namespace is set. </summary>\r\n            <param name=\"qualNs\"> a qualifier namespace </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Qualifier schema is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.AssertQualName(System.String)\">\r\n            <summary>\r\n            ParameterAsserts that a qualifier name is set. </summary>\r\n            <param name=\"qualName\"> a qualifier name or path </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Qualifier name is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.AssertFieldNs(System.String)\">\r\n            <summary>\r\n            ParameterAsserts that a struct field namespace is set. </summary>\r\n            <param name=\"fieldNs\"> a struct field namespace </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Struct field schema is null or empty </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpPathFactory.AssertFieldName(System.String)\">\r\n            <summary>\r\n            ParameterAsserts that a struct field name is set. </summary>\r\n            <param name=\"fieldName\"> a struct field name or path </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Struct field name is null or empty </exception>\r\n        </member>\r\n        <member name=\"T:iTextSharp.xmp.XmpUtils\">\r\n            <summary>\r\n            Utility methods for XMP. I included only those that are different from the\r\n            Java default conversion utilities.\r\n            \r\n            @since 21.02.2006\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.#ctor\">\r\n            <summary>\r\n            Private constructor </summary>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.CatenateArrayItems(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.String,System.String,System.Boolean)\">\r\n            <summary>\r\n            Create a single edit string from an array of strings.\r\n            </summary>\r\n            <param name=\"xmp\">\r\n                       The XMP object containing the array to be catenated. </param>\r\n            <param name=\"schemaNs\">\r\n                       The schema namespace URI for the array. Must not be null or\r\n                       the empty string. </param>\r\n            <param name=\"arrayName\">\r\n                       The name of the array. May be a general path expression, must\r\n                       not be null or the empty string. Each item in the array must\r\n                       be a simple string value. </param>\r\n            <param name=\"separator\">\r\n                       The string to be used to separate the items in the catenated\r\n                       string. Defaults to &quot;; &quot;, ASCII semicolon and space\r\n                       (U+003B, U+0020). </param>\r\n            <param name=\"quotes\">\r\n                       The characters to be used as quotes around array items that\r\n                       contain a separator. Defaults to &apos;&quot;&apos; </param>\r\n            <param name=\"allowCommas\">\r\n                       Option flag to control the catenation. </param>\r\n            <returns> Returns the string containing the catenated array items. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards the Exceptions from the metadata processing </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.SeparateArrayItems(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.String,iTextSharp.xmp.options.PropertyOptions,System.Boolean)\">\r\n            <summary>\r\n            Separate a single edit string into an array of strings.\r\n            </summary>\r\n            <param name=\"xmp\">\r\n                       The XMP object containing the array to be updated. </param>\r\n            <param name=\"schemaNs\">\r\n                       The schema namespace URI for the array. Must not be null or\r\n                       the empty string. </param>\r\n            <param name=\"arrayName\">\r\n                       The name of the array. May be a general path expression, must\r\n                       not be null or the empty string. Each item in the array must\r\n                       be a simple string value. </param>\r\n            <param name=\"catedStr\">\r\n                       The string to be separated into the array items. </param>\r\n            <param name=\"arrayOptions\"> Option flags to control the separation. </param>\r\n            <param name=\"preserveCommas\"> Flag if commas shall be preserved </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards the Exceptions from the metadata processing  </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpUtils.RemoveProperties(iTextSharp.xmp.IXmpMeta,System.String,System.String,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.AppendProperties(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.IXmpMeta,System.Boolean,System.Boolean)\">\r\n            <summary>\r\n            Alias without the new option <code>deleteEmptyValues</code>. </summary>\r\n            <param name=\"source\"> The source XMP object. </param>\r\n            <param name=\"dest\"> The destination XMP object. </param>\r\n            <param name=\"doAllProperties\"> Do internal properties in addition to external properties. </param>\r\n            <param name=\"replaceOldValues\"> Replace the values of existing properties. </param>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Forwards the Exceptions from the metadata processing  </exception>\r\n        </member>\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpUtils.AppendProperties(iTextSharp.xmp.IXmpMeta,iTextSharp.xmp.IXmpMeta,System.Boolean,System.Boolean,System.Boolean)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:iTextSharp.xmp.XmpUtils.ConvertToBoolean(System.String)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertFromBoolean(System.Boolean)\">\r\n            <summary>\r\n            Convert from boolean to string.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       a boolean value </param>\r\n            <returns> The XMP string representation of the boolean. The values used are\r\n                    given by the constnts <seealso cref=\"F:iTextSharp.xmp.XmpConst.TRUESTR\"/> and\r\n                    <seealso cref=\"F:iTextSharp.xmp.XmpConst.FALSESTR\"/>. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertToInteger(System.String)\">\r\n            <summary>\r\n            Converts a string value to an <code>int</code>.\r\n            </summary>\r\n            <param name=\"rawValue\">\r\n                       the string value </param>\r\n            <returns> Returns an int. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">\r\n                        If the <code>rawValue</code> is <code>null</code> or empty or the\r\n                        conversion fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertFromInteger(System.Int32)\">\r\n            <summary>\r\n            Convert from int to string.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       an int value </param>\r\n            <returns> The string representation of the int. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertToLong(System.String)\">\r\n            <summary>\r\n            Converts a string value to a <code>long</code>.\r\n            </summary>\r\n            <param name=\"rawValue\">\r\n                       the string value </param>\r\n            <returns> Returns a long. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">\r\n                        If the <code>rawValue</code> is <code>null</code> or empty or the\r\n                        conversion fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertFromLong(System.Int64)\">\r\n            <summary>\r\n            Convert from long to string.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       a long value </param>\r\n            <returns> The string representation of the long. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertToDouble(System.String)\">\r\n            <summary>\r\n            Converts a string value to a <code>double</code>.\r\n            </summary>\r\n            <param name=\"rawValue\">\r\n                       the string value </param>\r\n            <returns> Returns a double. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">\r\n                        If the <code>rawValue</code> is <code>null</code> or empty or the\r\n                        conversion fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertFromDouble(System.Double)\">\r\n            <summary>\r\n            Convert from long to string.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       a long value </param>\r\n            <returns> The string representation of the long. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertToDate(System.String)\">\r\n            <summary>\r\n            Converts a string value to an <code>XMPDateTime</code>.\r\n            </summary>\r\n            <param name=\"rawValue\">\r\n                       the string value </param>\r\n            <returns> Returns an <code>XMPDateTime</code>-object. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\">\r\n                        If the <code>rawValue</code> is <code>null</code> or empty or the\r\n                        conversion fails. </exception>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.ConvertFromDate(iTextSharp.xmp.IXmpDateTime)\">\r\n            <summary>\r\n            Convert from <code>XMPDateTime</code> to string.\r\n            </summary>\r\n            <param name=\"value\">\r\n                       an <code>XMPDateTime</code> </param>\r\n            <returns> The string representation of the long. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.EncodeBase64(System.Byte[])\">\r\n            <summary>\r\n            Convert from a byte array to a base64 encoded string.\r\n            </summary>\r\n            <param name=\"buffer\">\r\n                       the byte array to be converted </param>\r\n            <returns> Returns the base64 string. </returns>\r\n        </member>\r\n        <member name=\"M:iTextSharp.xmp.XmpUtils.DecodeBase64(System.String)\">\r\n            <summary>\r\n            Decode from Base64 encoded string to raw data.\r\n            </summary>\r\n            <param name=\"base64String\">\r\n                       a base64 encoded string </param>\r\n            <returns> Returns a byte array containg the decoded string. </returns>\r\n            <exception cref=\"T:iTextSharp.xmp.XmpException\"> Thrown if the given string is not property base64 encoded </exception>\r\n        </member>\r\n        <!-- 对于成员“P:com.itextpdf.text.pdf.ListLabel.TagLabelContent”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"T:com.itextpdf.text.pdf.languages.DevanagariLigaturizer\">\r\n             Implementation of the IndicLigaturizer for Devanagari.\r\n            \r\n             Warning: this is an incomplete and experimental implementation of Devanagari. This implementation should not be used in production.\r\n        </member>\r\n        <member name=\"M:com.itextpdf.text.pdf.languages.DevanagariLigaturizer.#ctor\">\r\n            Constructor for the IndicLigaturizer for Devanagari.\r\n        </member>\r\n        <member name=\"T:com.itextpdf.text.pdf.security.ExternalBlankSignatureContainer\">\r\n            Produces a blank (or empty) signature. Useful for deferred signing with\r\n            MakeSignature.signExternalContainer().\r\n            @author Paulo Soares\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Encodable.GetDerEncoded\">\r\n             Return the DER encoding of the object, null if the DER encoding can not be made.\r\n            \r\n             @return a DER byte array, null otherwise.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Asn1InputStream\">\r\n            a general purpose ASN.1 decoder - note: this class differs from the\r\n            others in that it returns null after it has read the last object in\r\n            the stream. If an ASN.1 Null is encountered a Der/BER Null object is\r\n            returned.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1InputStream.#ctor(System.IO.Stream,System.Int32)\">\r\n             Create an ASN1InputStream where no DER object will be longer than limit.\r\n            \r\n             @param input stream containing ASN.1 encoded data.\r\n             @param limit maximum size of a DER encoded object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1InputStream.#ctor(System.Byte[])\">\r\n             Create an ASN1InputStream based on the input byte array. The length of DER objects in\r\n             the stream is automatically limited to the length of the input array.\r\n            \r\n             @param input array containing ASN.1 encoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1InputStream.BuildObject(System.Int32,System.Int32,System.Int32)\">\r\n            build an object given its tag and the number of bytes to construct it from.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Asn1Null\">\r\n            A Null object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Object.FromByteArray(System.Byte[])\">\r\n            <summary>Create a base ASN.1 object from a byte array.</summary>\r\n            <param name=\"data\">The byte array to parse.</param>\r\n            <returns>The base ASN.1 object represented by the byte array.</returns>\r\n            <exception cref=\"T:System.IO.IOException\">If there is a problem parsing the data.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Object.FromStream(System.IO.Stream)\">\r\n            <summary>Read a base ASN.1 object from a stream.</summary>\r\n            <param name=\"inStr\">The stream to parse.</param>\r\n            <returns>The base ASN.1 object represented by the byte array.</returns>\r\n            <exception cref=\"T:System.IO.IOException\">If there is a problem parsing the data.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1OctetString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an Octet string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                          be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1OctetString.GetInstance(System.Object)\">\r\n             return an Octet string from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1OctetString.#ctor(System.Byte[])\">\r\n            @param string the octets making up the octet string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Sequence.GetInstance(System.Object)\">\r\n             return an Asn1Sequence from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Sequence.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             Return an ASN1 sequence from a tagged object. There is a special\r\n             case here, if an object appears to have been explicitly tagged on\r\n             reading but we were expecting it to be implicitly tagged in the\r\n             normal course of events it indicates that we lost the surrounding\r\n             sequence - so we need to add it back (this will happen if the tagged\r\n             object is a sequence that contains other sequences). If you are\r\n             dealing with implicitly tagged sequences you really <b>should</b>\r\n             be using this method.\r\n            \r\n             @param obj the tagged object.\r\n             @param explicitly true if the object is meant to be explicitly tagged,\r\n                      false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                      be converted.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Asn1Sequence.Item(System.Int32)\">\r\n             return the object at the sequence position indicated by index.\r\n            \r\n             @param index the sequence number (starting at zero) of the object\r\n             @return the object at the sequence position indicated by index.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Set.GetInstance(System.Object)\">\r\n             return an ASN1Set from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Set.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             Return an ASN1 set from a tagged object. There is a special\r\n             case here, if an object appears to have been explicitly tagged on\r\n             reading but we were expecting it to be implicitly tagged in the\r\n             normal course of events it indicates that we lost the surrounding\r\n             set - so we need to add it back (this will happen if the tagged\r\n             object is a sequence that contains other sequences). If you are\r\n             dealing with implicitly tagged sets you really <b>should</b>\r\n             be using this method.\r\n            \r\n             @param obj the tagged object.\r\n             @param explicitly true if the object is meant to be explicitly tagged\r\n                      false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                      be converted.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Asn1Set.Item(System.Int32)\">\r\n             return the object at the set position indicated by index.\r\n            \r\n             @param index the set number (starting at zero) of the object\r\n             @return the object at the set position indicated by index.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1Set.LessThanOrEqual(System.Byte[],System.Byte[])\">\r\n            return true if a &lt;= b (arrays are assumed padded with zeros).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Asn1TaggedObject\">\r\n            ASN.1 TaggedObject - in ASN.1 notation this is any object preceded by\r\n            a [n] where n is some number - these are assumed to follow the construction\r\n            rules (as with sequences).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1TaggedObject.#ctor(System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param tagNo the tag number for this object.\r\n            @param obj the tagged object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1TaggedObject.#ctor(System.Boolean,System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param explicitly true if the object is explicitly tagged.\r\n            @param tagNo the tag number for this object.\r\n            @param obj the tagged object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1TaggedObject.IsExplicit\">\r\n            return whether or not the object may be explicitly tagged.\r\n            <p>\r\n            Note: if the object has been read from an input stream, the only\r\n            time you can be sure if isExplicit is returning the true state of\r\n            affairs is if it returns false. An implicitly tagged object may appear\r\n            to be explicitly tagged, so you need to understand the context under\r\n            which the reading was done as well, see GetObject below.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1TaggedObject.GetObject\">\r\n            return whatever was following the tag.\r\n            <p>\r\n            Note: tagged objects are generally context dependent if you're\r\n            trying to extract a tagged object you should be going via the\r\n            appropriate GetInstance method.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Asn1TaggedObject.GetObjectParser(System.Int32,System.Boolean)\">\r\n            Return the object held in this tagged object as a parser assuming it has\r\n            the type of the passed in tag. If the object doesn't have a parser\r\n            associated with it, the base object is returned.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.BerNull\">\r\n            A BER Null object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerOctetString.ToBytes(System.Collections.IEnumerable)\">\r\n            convert a vector of octet strings into a single byte string\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerOctetString.#ctor(System.Byte[])\">\r\n            <param name=\"str\">The octets making up the octet string.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerOctetString.GetEnumerator\">\r\n            return the DER octets that make up this string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerSequence.#ctor\">\r\n            create an empty sequence\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerSequence.#ctor(Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            create a sequence containing one object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerSequence.#ctor(Org.BouncyCastle.Asn1.Asn1EncodableVector)\">\r\n            create a sequence containing a vector of objects.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerSet.#ctor\">\r\n            create an empty sequence\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerSet.#ctor(Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            create a set containing one object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerSet.#ctor(Org.BouncyCastle.Asn1.Asn1EncodableVector)\">\r\n            create a set containing a vector of objects.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.BerTaggedObject\">\r\n            BER TaggedObject - in ASN.1 notation this is any object preceded by\r\n            a [n] where n is some number - these are assumed to follow the construction\r\n            rules (as with sequences).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerTaggedObject.#ctor(System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param tagNo the tag number for this object.\r\n            @param obj the tagged object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerTaggedObject.#ctor(System.Boolean,System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param explicitly true if an explicitly tagged object.\r\n            @param tagNo the tag number for this object.\r\n            @param obj the tagged object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.BerTaggedObject.#ctor(System.Int32)\">\r\n            create an implicitly tagged object that contains a zero\r\n            length sequence.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cmp.PkiFailureInfo\">\r\n            <pre>\r\n            PKIFailureInfo ::= BIT STRING {\r\n            badAlg               (0),\r\n              -- unrecognized or unsupported Algorithm Identifier\r\n            badMessageCheck      (1), -- integrity check failed (e.g., signature did not verify)\r\n            badRequest           (2),\r\n              -- transaction not permitted or supported\r\n            badTime              (3), -- messageTime was not sufficiently close to the system time, as defined by local policy\r\n            badCertId            (4), -- no certificate could be found matching the provided criteria\r\n            badDataFormat        (5),\r\n              -- the data submitted has the wrong format\r\n            wrongAuthority       (6), -- the authority indicated in the request is different from the one creating the response token\r\n            incorrectData        (7), -- the requester's data is incorrect (for notary services)\r\n            missingTimeStamp     (8), -- when the timestamp is missing but should be there (by policy)\r\n            badPOP               (9)  -- the proof-of-possession failed\r\n            timeNotAvailable    (14),\r\n              -- the TSA's time source is not available\r\n            unacceptedPolicy    (15),\r\n              -- the requested TSA policy is not supported by the TSA\r\n            unacceptedExtension (16),\r\n              -- the requested extension is not supported by the TSA\r\n             addInfoNotAvailable (17)\r\n               -- the additional information requested could not be understood\r\n               -- or is not available\r\n             systemFailure       (25)\r\n               -- the request cannot be handled due to system failure\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiFailureInfo.#ctor(System.Int32)\">\r\n            Basic constructor.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Cmp.PkiFreeText.Size\">\r\n             Return the number of string elements present.\r\n            \r\n             @return number of elements present.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Cmp.PkiFreeText.Item(System.Int32)\">\r\n             Return the UTF8STRING at index.\r\n            \r\n             @param index index of the string of interest\r\n             @return the string at index.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiFreeText.ToAsn1Object\">\r\n            <pre>\r\n            PkiFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiStatusInfo.#ctor(System.Int32)\">\r\n            @param status\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiStatusInfo.#ctor(System.Int32,Org.BouncyCastle.Asn1.Cmp.PkiFreeText)\">\r\n            @param status\r\n            @param statusString\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiStatusInfo.ToAsn1Object\">\r\n             <pre>\r\n             PkiStatusInfo ::= SEQUENCE {\r\n                 status        PKIStatus,                (INTEGER)\r\n                 statusString  PkiFreeText     OPTIONAL,\r\n                 failInfo      PkiFailureInfo  OPTIONAL  (BIT STRING)\r\n             }\r\n            \r\n             PKIStatus:\r\n               granted                (0), -- you got exactly what you asked for\r\n               grantedWithMods        (1), -- you got something like what you asked for\r\n               rejection              (2), -- you don't get it, more information elsewhere in the message\r\n               waiting                (3), -- the request body part has not yet been processed, expect to hear more later\r\n               revocationWarning      (4), -- this message contains a warning that a revocation is imminent\r\n               revocationNotification (5), -- notification that a revocation has occurred\r\n               keyUpdateWarning       (6)  -- update already done for the oldCertId specified in CertReqMsg\r\n            \r\n             PkiFailureInfo:\r\n               badAlg           (0), -- unrecognized or unsupported Algorithm Identifier\r\n               badMessageCheck  (1), -- integrity check failed (e.g., signature did not verify)\r\n               badRequest       (2), -- transaction not permitted or supported\r\n               badTime          (3), -- messageTime was not sufficiently close to the system time, as defined by local policy\r\n               badCertId        (4), -- no certificate could be found matching the provided criteria\r\n               badDataFormat    (5), -- the data submitted has the wrong format\r\n               wrongAuthority   (6), -- the authority indicated in the request is different from the one creating the response token\r\n               incorrectData    (7), -- the requester's data is incorrect (for notary services)\r\n               missingTimeStamp (8), -- when the timestamp is missing but should be there (by policy)\r\n               badPOP           (9)  -- the proof-of-possession failed\r\n            \r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CAKeyUpdAnnContent.ToAsn1Object\">\r\n            <pre>\r\n            CAKeyUpdAnnContent ::= SEQUENCE {\r\n                                        oldWithNew   CmpCertificate, -- old pub signed with new priv\r\n                                        newWithOld   CmpCertificate, -- new pub signed with old priv\r\n                                        newWithNew   CmpCertificate  -- new pub signed with new priv\r\n             }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CertConfirmContent.ToAsn1Object\">\r\n            <pre>\r\n            CertConfirmContent ::= SEQUENCE OF CertStatus\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CertifiedKeyPair.ToAsn1Object\">\r\n            <pre>\r\n            CertifiedKeyPair ::= SEQUENCE {\r\n                                             certOrEncCert       CertOrEncCert,\r\n                                             privateKey      [0] EncryptedValue      OPTIONAL,\r\n                                             -- see [CRMF] for comment on encoding\r\n                                             publicationInfo [1] PKIPublicationInfo  OPTIONAL\r\n                  }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CertOrEncCert.ToAsn1Object\">\r\n            <pre>\r\n            CertOrEncCert ::= CHOICE {\r\n                                 certificate     [0] CMPCertificate,\r\n                                 encryptedCert   [1] EncryptedValue\r\n                      }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CertRepMessage.ToAsn1Object\">\r\n            <pre>\r\n            CertRepMessage ::= SEQUENCE {\r\n                                     caPubs       [1] SEQUENCE SIZE (1..MAX) OF CMPCertificate\r\n                                                                                        OPTIONAL,\r\n                                     response         SEQUENCE OF CertResponse\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CertResponse.ToAsn1Object\">\r\n            <pre>\r\n            CertResponse ::= SEQUENCE {\r\n                                       certReqId           INTEGER,\r\n                                       -- to match this response with corresponding request (a value\r\n                                       -- of -1 is to be used if certReqId is not specified in the\r\n                                       -- corresponding request)\r\n                                       status              PKIStatusInfo,\r\n                                       certifiedKeyPair    CertifiedKeyPair    OPTIONAL,\r\n                                       rspInfo             OCTET STRING        OPTIONAL\r\n                                       -- analogous to the id-regInfo-utf8Pairs string defined\r\n                                       -- for regInfo in CertReqMsg [CRMF]\r\n                        }\r\n            </pre> \r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CertStatus.ToAsn1Object\">\r\n            <pre>\r\n            CertStatus ::= SEQUENCE {\r\n                              certHash    OCTET STRING,\r\n                              -- the hash of the certificate, using the same hash algorithm\r\n                              -- as is used to create and verify the certificate signature\r\n                              certReqId   INTEGER,\r\n                              -- to match this confirmation with the corresponding req/rep\r\n                              statusInfo  PKIStatusInfo OPTIONAL\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.Challenge.ToAsn1Object\">\r\n             <pre>\r\n             Challenge ::= SEQUENCE {\r\n                             owf                 AlgorithmIdentifier  OPTIONAL,\r\n            \r\n                             -- MUST be present in the first Challenge; MAY be omitted in\r\n                             -- any subsequent Challenge in POPODecKeyChallContent (if\r\n                             -- omitted, then the owf used in the immediately preceding\r\n                             -- Challenge is to be used).\r\n            \r\n                             witness             OCTET STRING,\r\n                             -- the result of applying the one-way function (owf) to a\r\n                             -- randomly-generated INTEGER, A.  [Note that a different\r\n                             -- INTEGER MUST be used for each Challenge.]\r\n                             challenge           OCTET STRING\r\n                             -- the encryption (under the public key for which the cert.\r\n                             -- request is being made) of Rand, where Rand is specified as\r\n                             --   Rand ::= SEQUENCE {\r\n                             --      int      INTEGER,\r\n                             --       - the randomly-generated INTEGER A (above)\r\n                             --      sender   GeneralName\r\n                             --       - the sender's name (as included in PKIHeader)\r\n                             --   }\r\n                  }\r\n             </pre>\r\n             @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CmpCertificate.#ctor(Org.BouncyCastle.Asn1.X509.AttributeCertificate)\">\r\n            Note: the addition of attribute certificates is a BC extension.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CmpCertificate.ToAsn1Object\">\r\n             <pre>\r\n             CMPCertificate ::= CHOICE {\r\n                        x509v3PKCert        Certificate\r\n                        x509v2AttrCert      [1] AttributeCertificate\r\n              }\r\n             </pre>\r\n             Note: the addition of attribute certificates is a BC extension.\r\n            \r\n             @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.CrlAnnContent.ToAsn1Object\">\r\n            <pre>\r\n            CrlAnnContent ::= SEQUENCE OF CertificateList\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.ErrorMsgContent.ToAsn1Object\">\r\n            <pre>\r\n            ErrorMsgContent ::= SEQUENCE {\r\n                                   pKIStatusInfo          PKIStatusInfo,\r\n                                   errorCode              INTEGER           OPTIONAL,\r\n                                   -- implementation-specific error codes\r\n                                   errorDetails           PKIFreeText       OPTIONAL\r\n                                   -- implementation-specific error details\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.GenMsgContent.ToAsn1Object\">\r\n            <pre>\r\n            GenMsgContent ::= SEQUENCE OF InfoTypeAndValue\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.GenRepContent.ToAsn1Object\">\r\n            <pre>\r\n            GenRepContent ::= SEQUENCE OF InfoTypeAndValue\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cmp.InfoTypeAndValue\">\r\n             Example InfoTypeAndValue contents include, but are not limited\r\n             to, the following (un-comment in this ASN.1 module and use as\r\n             appropriate for a given environment):\r\n             <pre>\r\n               id-it-caProtEncCert    OBJECT IDENTIFIER ::= {id-it 1}\r\n                  CAProtEncCertValue      ::= CMPCertificate\r\n               id-it-signKeyPairTypes OBJECT IDENTIFIER ::= {id-it 2}\r\n                 SignKeyPairTypesValue   ::= SEQUENCE OF AlgorithmIdentifier\r\n               id-it-encKeyPairTypes  OBJECT IDENTIFIER ::= {id-it 3}\r\n                 EncKeyPairTypesValue    ::= SEQUENCE OF AlgorithmIdentifier\r\n               id-it-preferredSymmAlg OBJECT IDENTIFIER ::= {id-it 4}\r\n                  PreferredSymmAlgValue   ::= AlgorithmIdentifier\r\n               id-it-caKeyUpdateInfo  OBJECT IDENTIFIER ::= {id-it 5}\r\n                  CAKeyUpdateInfoValue    ::= CAKeyUpdAnnContent\r\n               id-it-currentCRL       OBJECT IDENTIFIER ::= {id-it 6}\r\n                  CurrentCRLValue         ::= CertificateList\r\n               id-it-unsupportedOIDs  OBJECT IDENTIFIER ::= {id-it 7}\r\n                  UnsupportedOIDsValue    ::= SEQUENCE OF OBJECT IDENTIFIER\r\n               id-it-keyPairParamReq  OBJECT IDENTIFIER ::= {id-it 10}\r\n                  KeyPairParamReqValue    ::= OBJECT IDENTIFIER\r\n               id-it-keyPairParamRep  OBJECT IDENTIFIER ::= {id-it 11}\r\n                  KeyPairParamRepValue    ::= AlgorithmIdentifer\r\n               id-it-revPassphrase    OBJECT IDENTIFIER ::= {id-it 12}\r\n                  RevPassphraseValue      ::= EncryptedValue\r\n               id-it-implicitConfirm  OBJECT IDENTIFIER ::= {id-it 13}\r\n                  ImplicitConfirmValue    ::= NULL\r\n               id-it-confirmWaitTime  OBJECT IDENTIFIER ::= {id-it 14}\r\n                  ConfirmWaitTimeValue    ::= GeneralizedTime\r\n               id-it-origPKIMessage   OBJECT IDENTIFIER ::= {id-it 15}\r\n                  OrigPKIMessageValue     ::= PKIMessages\r\n               id-it-suppLangTags     OBJECT IDENTIFIER ::= {id-it 16}\r\n                  SuppLangTagsValue       ::= SEQUENCE OF UTF8String\r\n            \r\n             where\r\n            \r\n               id-pkix OBJECT IDENTIFIER ::= {\r\n                  iso(1) identified-organization(3)\r\n                  dod(6) internet(1) security(5) mechanisms(5) pkix(7)}\r\n             and\r\n                  id-it   OBJECT IDENTIFIER ::= {id-pkix 4}\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.InfoTypeAndValue.ToAsn1Object\">\r\n            <pre>\r\n            InfoTypeAndValue ::= SEQUENCE {\r\n                                    infoType               OBJECT IDENTIFIER,\r\n                                    infoValue              ANY DEFINED BY infoType  OPTIONAL\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.KeyRecRepContent.ToAsn1Object\">\r\n            <pre>\r\n            KeyRecRepContent ::= SEQUENCE {\r\n                                    status                  PKIStatusInfo,\r\n                                    newSigCert          [0] CMPCertificate OPTIONAL,\r\n                                    caCerts             [1] SEQUENCE SIZE (1..MAX) OF\r\n                                                                      CMPCertificate OPTIONAL,\r\n                                    keyPairHist         [2] SEQUENCE SIZE (1..MAX) OF\r\n                                                                      CertifiedKeyPair OPTIONAL\r\n                         }\r\n            </pre> \r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.OobCertHash.ToAsn1Object\">\r\n            <pre>\r\n            OobCertHash ::= SEQUENCE {\r\n                                 hashAlg     [0] AlgorithmIdentifier     OPTIONAL,\r\n                                 certId      [1] CertId                  OPTIONAL,\r\n                                 hashVal         BIT STRING\r\n                                 -- hashVal is calculated over the Der encoding of the\r\n                                 -- self-signed certificate with the identifier certID.\r\n                  }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PbmParameter.ToAsn1Object\">\r\n            <pre>\r\n             PbmParameter ::= SEQUENCE {\r\n                                   salt                OCTET STRING,\r\n                                   -- note:  implementations MAY wish to limit acceptable sizes\r\n                                   -- of this string to values appropriate for their environment\r\n                                   -- in order to reduce the risk of denial-of-service attacks\r\n                                   owf                 AlgorithmIdentifier,\r\n                                   -- AlgId for a One-Way Function (SHA-1 recommended)\r\n                                   iterationCount      INTEGER,\r\n                                   -- number of times the OWF is applied\r\n                                   -- note:  implementations MAY wish to limit acceptable sizes\r\n                                   -- of this integer to values appropriate for their environment\r\n                                   -- in order to reduce the risk of denial-of-service attacks\r\n                                   mac                 AlgorithmIdentifier\r\n                                   -- the MAC AlgId (e.g., DES-MAC, Triple-DES-MAC [PKCS11],\r\n               }   -- or HMAC [RFC2104, RFC2202])\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiBody.#ctor(System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            Creates a new PkiBody.\r\n            @param type one of the TYPE_* constants\r\n            @param content message content\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiBody.ToAsn1Object\">\r\n            <pre>\r\n            PkiBody ::= CHOICE {       -- message-specific body elements\r\n                   ir       [0]  CertReqMessages,        --Initialization Request\r\n                   ip       [1]  CertRepMessage,         --Initialization Response\r\n                   cr       [2]  CertReqMessages,        --Certification Request\r\n                   cp       [3]  CertRepMessage,         --Certification Response\r\n                   p10cr    [4]  CertificationRequest,   --imported from [PKCS10]\r\n                   popdecc  [5]  POPODecKeyChallContent, --pop Challenge\r\n                   popdecr  [6]  POPODecKeyRespContent,  --pop Response\r\n                   kur      [7]  CertReqMessages,        --Key Update Request\r\n                   kup      [8]  CertRepMessage,         --Key Update Response\r\n                   krr      [9]  CertReqMessages,        --Key Recovery Request\r\n                   krp      [10] KeyRecRepContent,       --Key Recovery Response\r\n                   rr       [11] RevReqContent,          --Revocation Request\r\n                   rp       [12] RevRepContent,          --Revocation Response\r\n                   ccr      [13] CertReqMessages,        --Cross-Cert. Request\r\n                   ccp      [14] CertRepMessage,         --Cross-Cert. Response\r\n                   ckuann   [15] CAKeyUpdAnnContent,     --CA Key Update Ann.\r\n                   cann     [16] CertAnnContent,         --Certificate Ann.\r\n                   rann     [17] RevAnnContent,          --Revocation Ann.\r\n                   crlann   [18] CRLAnnContent,          --CRL Announcement\r\n                   pkiconf  [19] PKIConfirmContent,      --Confirmation\r\n                   nested   [20] NestedMessageContent,   --Nested Message\r\n                   genm     [21] GenMsgContent,          --General Message\r\n                   genp     [22] GenRepContent,          --General Response\r\n                   error    [23] ErrorMsgContent,        --Error Message\r\n                   certConf [24] CertConfirmContent,     --Certificate confirm\r\n                   pollReq  [25] PollReqContent,         --Polling request\r\n                   pollRep  [26] PollRepContent          --Polling response\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiConfirmContent.ToAsn1Object\">\r\n            <pre>\r\n            PkiConfirmContent ::= NULL\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Cmp.PkiHeader.NULL_NAME\">\r\n            Value for a \"null\" recipient or sender.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiHeader.ToAsn1Object\">\r\n            <pre>\r\n             PkiHeader ::= SEQUENCE {\r\n                       pvno                INTEGER     { cmp1999(1), cmp2000(2) },\r\n                       sender              GeneralName,\r\n                       -- identifies the sender\r\n                       recipient           GeneralName,\r\n                       -- identifies the intended recipient\r\n                       messageTime     [0] GeneralizedTime         OPTIONAL,\r\n                       -- time of production of this message (used when sender\r\n                       -- believes that the transport will be \"suitable\"; i.e.,\r\n                       -- that the time will still be meaningful upon receipt)\r\n                       protectionAlg   [1] AlgorithmIdentifier     OPTIONAL,\r\n                       -- algorithm used for calculation of protection bits\r\n                       senderKID       [2] KeyIdentifier           OPTIONAL,\r\n                       recipKID        [3] KeyIdentifier           OPTIONAL,\r\n                       -- to identify specific keys used for protection\r\n                       transactionID   [4] OCTET STRING            OPTIONAL,\r\n                       -- identifies the transaction; i.e., this will be the same in\r\n                       -- corresponding request, response, certConf, and PKIConf\r\n                       -- messages\r\n                       senderNonce     [5] OCTET STRING            OPTIONAL,\r\n                       recipNonce      [6] OCTET STRING            OPTIONAL,\r\n                       -- nonces used to provide replay protection, senderNonce\r\n                       -- is inserted by the creator of this message; recipNonce\r\n                       -- is a nonce previously inserted in a related message by\r\n                       -- the intended recipient of this message\r\n                       freeText        [7] PKIFreeText             OPTIONAL,\r\n                       -- this may be used to indicate context-specific instructions\r\n                       -- (this field is intended for human consumption)\r\n                       generalInfo     [8] SEQUENCE SIZE (1..MAX) OF\r\n                                            InfoTypeAndValue     OPTIONAL\r\n                       -- this may be used to convey context-specific information\r\n                       -- (this field not primarily intended for human consumption)\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiHeaderBuilder.Build\">\r\n            <pre>\r\n             PKIHeader ::= SEQUENCE {\r\n                       pvno                INTEGER     { cmp1999(1), cmp2000(2) },\r\n                       sender              GeneralName,\r\n                       -- identifies the sender\r\n                       recipient           GeneralName,\r\n                       -- identifies the intended recipient\r\n                       messageTime     [0] GeneralizedTime         OPTIONAL,\r\n                       -- time of production of this message (used when sender\r\n                       -- believes that the transport will be \"suitable\"; i.e.,\r\n                       -- that the time will still be meaningful upon receipt)\r\n                       protectionAlg   [1] AlgorithmIdentifier     OPTIONAL,\r\n                       -- algorithm used for calculation of protection bits\r\n                       senderKID       [2] KeyIdentifier           OPTIONAL,\r\n                       recipKID        [3] KeyIdentifier           OPTIONAL,\r\n                       -- to identify specific keys used for protection\r\n                       transactionID   [4] OCTET STRING            OPTIONAL,\r\n                       -- identifies the transaction; i.e., this will be the same in\r\n                       -- corresponding request, response, certConf, and PKIConf\r\n                       -- messages\r\n                       senderNonce     [5] OCTET STRING            OPTIONAL,\r\n                       recipNonce      [6] OCTET STRING            OPTIONAL,\r\n                       -- nonces used to provide replay protection, senderNonce\r\n                       -- is inserted by the creator of this message; recipNonce\r\n                       -- is a nonce previously inserted in a related message by\r\n                       -- the intended recipient of this message\r\n                       freeText        [7] PKIFreeText             OPTIONAL,\r\n                       -- this may be used to indicate context-specific instructions\r\n                       -- (this field is intended for human consumption)\r\n                       generalInfo     [8] SEQUENCE SIZE (1..MAX) OF\r\n                                            InfoTypeAndValue     OPTIONAL\r\n                       -- this may be used to convey context-specific information\r\n                       -- (this field not primarily intended for human consumption)\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiMessage.#ctor(Org.BouncyCastle.Asn1.Cmp.PkiHeader,Org.BouncyCastle.Asn1.Cmp.PkiBody,Org.BouncyCastle.Asn1.DerBitString,Org.BouncyCastle.Asn1.Cmp.CmpCertificate[])\">\r\n             Creates a new PkiMessage.\r\n            \r\n             @param header message header\r\n             @param body message body\r\n             @param protection message protection (may be null)\r\n             @param extraCerts extra certificates (may be null)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiMessage.ToAsn1Object\">\r\n            <pre>\r\n            PkiMessage ::= SEQUENCE {\r\n                             header           PKIHeader,\r\n                             body             PKIBody,\r\n                             protection   [0] PKIProtection OPTIONAL,\r\n                             extraCerts   [1] SEQUENCE SIZE (1..MAX) OF CMPCertificate\r\n                                                                                OPTIONAL\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PkiMessages.ToAsn1Object\">\r\n            <pre>\r\n            PkiMessages ::= SEQUENCE SIZE (1..MAX) OF PkiMessage\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PollRepContent.ToAsn1Object\">\r\n            <pre>\r\n            PollRepContent ::= SEQUENCE OF SEQUENCE {\r\n                    certReqId              INTEGER,\r\n                    checkAfter             INTEGER,  -- time in seconds\r\n                    reason                 PKIFreeText OPTIONAL\r\n                }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PollReqContent.ToAsn1Object\">\r\n            <pre>\r\n            PollReqContent ::= SEQUENCE OF SEQUENCE {\r\n                                   certReqId              INTEGER\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PopoDecKeyChallContent.ToAsn1Object\">\r\n            <pre>\r\n            PopoDecKeyChallContent ::= SEQUENCE OF Challenge\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.PopoDecKeyRespContent.ToAsn1Object\">\r\n            <pre>\r\n            PopoDecKeyRespContent ::= SEQUENCE OF INTEGER\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.ProtectedPart.ToAsn1Object\">\r\n            <pre>\r\n            ProtectedPart ::= SEQUENCE {\r\n                               header    PKIHeader,\r\n                               body      PKIBody\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.RevAnnContent.ToAsn1Object\">\r\n            <pre>\r\n            RevAnnContent ::= SEQUENCE {\r\n                  status              PKIStatus,\r\n                  certId              CertId,\r\n                  willBeRevokedAt     GeneralizedTime,\r\n                  badSinceDate        GeneralizedTime,\r\n                  crlDetails          Extensions  OPTIONAL\r\n                   -- extra CRL details (e.g., crl number, reason, location, etc.)\r\n            }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.RevDetails.ToAsn1Object\">\r\n            <pre>\r\n            RevDetails ::= SEQUENCE {\r\n                             certDetails         CertTemplate,\r\n                              -- allows requester to specify as much as they can about\r\n                              -- the cert. for which revocation is requested\r\n                              -- (e.g., for cases in which serialNumber is not available)\r\n                              crlEntryDetails     Extensions       OPTIONAL\r\n                              -- requested crlEntryExtensions\r\n                        }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.RevRepContent.ToAsn1Object\">\r\n            <pre>\r\n            RevRepContent ::= SEQUENCE {\r\n                   status       SEQUENCE SIZE (1..MAX) OF PKIStatusInfo,\r\n                   -- in same order as was sent in RevReqContent\r\n                   revCerts [0] SEQUENCE SIZE (1..MAX) OF CertId OPTIONAL,\r\n                   -- IDs for which revocation was requested\r\n                   -- (same order as status)\r\n                   crls     [1] SEQUENCE SIZE (1..MAX) OF CertificateList OPTIONAL\r\n                   -- the resulting CRLs (there may be more than one)\r\n              }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cmp.RevReqContent.ToAsn1Object\">\r\n            <pre>\r\n            RevReqContent ::= SEQUENCE OF RevDetails\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Attribute.GetInstance(System.Object)\">\r\n             return an Attribute object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Attribute.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Attribute ::= SEQUENCE {\r\n                attrType OBJECT IDENTIFIER,\r\n                attrValues SET OF AttributeValue\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Cms.AttributeTable.Item(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            <summary>Return the first attribute matching the given OBJECT IDENTIFIER</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AttributeTable.GetAll(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             Return all the attributes matching the OBJECT IDENTIFIER oid. The vector will be\r\n             empty if there are no attributes of the required type present.\r\n            \r\n             @param oid type of attribute required.\r\n             @return a vector of all the attributes found of type oid.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AttributeTable.Add(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n             Return a new table with the passed in attribute added.\r\n            \r\n             @param attrType\r\n             @param attrValue\r\n             @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AuthenticatedData.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an AuthenticatedData object from a tagged object.\r\n            \r\n             @param obj      the tagged object holding the object we want.\r\n             @param isExplicit true if the object is meant to be explicitly\r\n                             tagged false otherwise.\r\n             @throws ArgumentException if the object held by the\r\n                                              tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AuthenticatedData.GetInstance(System.Object)\">\r\n             return an AuthenticatedData object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @throws ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AuthenticatedData.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             AuthenticatedData ::= SEQUENCE {\r\n                   version CMSVersion,\r\n                   originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,\r\n                   recipientInfos RecipientInfos,\r\n                   macAlgorithm MessageAuthenticationCodeAlgorithm,\r\n                   digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,\r\n                   encapContentInfo EncapsulatedContentInfo,\r\n                   authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,\r\n                   mac MessageAuthenticationCode,\r\n                   unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }\r\n            \r\n             AuthAttributes ::= SET SIZE (1..MAX) OF Attribute\r\n            \r\n             UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute\r\n            \r\n             MessageAuthenticationCode ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.AuthenticatedDataParser\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             AuthenticatedData ::= SEQUENCE {\r\n                   version CMSVersion,\r\n                   originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,\r\n                   recipientInfos RecipientInfos,\r\n                   macAlgorithm MessageAuthenticationCodeAlgorithm,\r\n                   digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,\r\n                   encapContentInfo EncapsulatedContentInfo,\r\n                   authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,\r\n                   mac MessageAuthenticationCode,\r\n                   unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }\r\n            \r\n             AuthAttributes ::= SET SIZE (1..MAX) OF Attribute\r\n            \r\n             UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute\r\n            \r\n             MessageAuthenticationCode ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AuthEnvelopedData.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an AuthEnvelopedData object from a tagged object.\r\n            \r\n             @param obj      the tagged object holding the object we want.\r\n             @param isExplicit true if the object is meant to be explicitly\r\n                             tagged false otherwise.\r\n             @throws ArgumentException if the object held by the\r\n                                              tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AuthEnvelopedData.GetInstance(System.Object)\">\r\n             return an AuthEnvelopedData object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @throws ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.AuthEnvelopedData.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            AuthEnvelopedData ::= SEQUENCE {\r\n              version CMSVersion,\r\n              originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,\r\n              recipientInfos RecipientInfos,\r\n              authEncryptedContentInfo EncryptedContentInfo,\r\n              authAttrs [1] IMPLICIT AuthAttributes OPTIONAL,\r\n              mac MessageAuthenticationCode,\r\n              unauthAttrs [2] IMPLICIT UnauthAttributes OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.AuthEnvelopedDataParser\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            \r\n            <pre>\r\n            AuthEnvelopedData ::= SEQUENCE {\r\n              version CMSVersion,\r\n              originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,\r\n              recipientInfos RecipientInfos,\r\n              authEncryptedContentInfo EncryptedContentInfo,\r\n              authAttrs [1] IMPLICIT AuthAttributes OPTIONAL,\r\n              mac MessageAuthenticationCode,\r\n              unauthAttrs [2] IMPLICIT UnauthAttributes OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Cms.CmsObjectIdentifiers.id_ri\">\r\n            The other Revocation Info arc\r\n            id-ri OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)\r\n                                              dod(6) internet(1) security(5) mechanisms(5) pkix(7) ri(16) }\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.CompressedData\">\r\n            RFC 3274 - CMS Compressed Data.\r\n            <pre>\r\n            CompressedData ::= Sequence {\r\n             version CMSVersion,\r\n             compressionAlgorithm CompressionAlgorithmIdentifier,\r\n             encapContentInfo EncapsulatedContentInfo\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.CompressedData.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a CompressedData object from a tagged object.\r\n            \r\n             @param ato the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.CompressedData.GetInstance(System.Object)\">\r\n             return a CompressedData object from the given object.\r\n            \r\n             @param _obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.CompressedDataParser\">\r\n            RFC 3274 - CMS Compressed Data.\r\n            <pre>\r\n            CompressedData ::= SEQUENCE {\r\n             version CMSVersion,\r\n             compressionAlgorithm CompressionAlgorithmIdentifier,\r\n             encapContentInfo EncapsulatedContentInfo\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.ContentInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ContentInfo ::= Sequence {\r\n                     contentType ContentType,\r\n                     content\r\n                     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.ContentInfoParser\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ContentInfo ::= SEQUENCE {\r\n                     contentType ContentType,\r\n                     content\r\n                     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Ecc.MQVuserKeyingMaterial.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an AuthEnvelopedData object from a tagged object.\r\n            \r\n             @param obj      the tagged object holding the object we want.\r\n             @param isExplicit true if the object is meant to be explicitly\r\n                             tagged false otherwise.\r\n             @throws ArgumentException if the object held by the\r\n                                              tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Ecc.MQVuserKeyingMaterial.GetInstance(System.Object)\">\r\n             return an AuthEnvelopedData object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @throws ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Ecc.MQVuserKeyingMaterial.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            MQVuserKeyingMaterial ::= SEQUENCE {\r\n              ephemeralPublicKey OriginatorPublicKey,\r\n              addedukm [0] EXPLICIT UserKeyingMaterial OPTIONAL  }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.EncryptedContentInfo.GetInstance(System.Object)\">\r\n             return an EncryptedContentInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.EncryptedContentInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            EncryptedContentInfo ::= Sequence {\r\n                contentType ContentType,\r\n                contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,\r\n                encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.EncryptedContentInfoParser\">\r\n            <pre>\r\n            EncryptedContentInfo ::= SEQUENCE {\r\n                contentType ContentType,\r\n                contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,\r\n                encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.EncryptedData.ToAsn1Object\">\r\n            <pre>\r\n                  EncryptedData ::= SEQUENCE {\r\n                                version CMSVersion,\r\n                                encryptedContentInfo EncryptedContentInfo,\r\n                                unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.EnvelopedData.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an EnvelopedData object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.EnvelopedData.GetInstance(System.Object)\">\r\n             return an EnvelopedData object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.EnvelopedData.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            EnvelopedData ::= Sequence {\r\n                version CMSVersion,\r\n                originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,\r\n                recipientInfos RecipientInfos,\r\n                encryptedContentInfo EncryptedContentInfo,\r\n                unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.EnvelopedDataParser\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            EnvelopedData ::= SEQUENCE {\r\n                version CMSVersion,\r\n                originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,\r\n                recipientInfos RecipientInfos,\r\n                encryptedContentInfo EncryptedContentInfo,\r\n                unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KekIdentifier.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a KekIdentifier object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KekIdentifier.GetInstance(System.Object)\">\r\n             return a KekIdentifier object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KekIdentifier.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            KekIdentifier ::= Sequence {\r\n                keyIdentifier OCTET STRING,\r\n                date GeneralizedTime OPTIONAL,\r\n                other OtherKeyAttribute OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KekRecipientInfo.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a KekRecipientInfo object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KekRecipientInfo.GetInstance(System.Object)\">\r\n             return a KekRecipientInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KekRecipientInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            KekRecipientInfo ::= Sequence {\r\n                version CMSVersion,  -- always set to 4\r\n                kekID KekIdentifier,\r\n                keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,\r\n                encryptedKey EncryptedKey\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyAgreeRecipientIdentifier.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an KeyAgreeRecipientIdentifier object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param isExplicit true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyAgreeRecipientIdentifier.GetInstance(System.Object)\">\r\n             return an KeyAgreeRecipientIdentifier object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyAgreeRecipientIdentifier.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            KeyAgreeRecipientIdentifier ::= CHOICE {\r\n                issuerAndSerialNumber IssuerAndSerialNumber,\r\n                rKeyId [0] IMPLICIT RecipientKeyIdentifier\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyAgreeRecipientInfo.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a KeyAgreeRecipientInfo object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyAgreeRecipientInfo.GetInstance(System.Object)\">\r\n             return a KeyAgreeRecipientInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyAgreeRecipientInfo.ToAsn1Object\">\r\n                     * Produce an object suitable for an Asn1OutputStream.\r\n                     * <pre>\r\n                     * KeyAgreeRecipientInfo ::= Sequence {\r\n                     *     version CMSVersion,  -- always set to 3\r\n                     *     originator [0] EXPLICIT OriginatorIdentifierOrKey,\r\n                     *     ukm [1] EXPLICIT UserKeyingMaterial OPTIONAL,\r\n                     *     keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,\r\n                     *     recipientEncryptedKeys RecipientEncryptedKeys\r\n                     * }\r\n            \t\t *\r\n            \t\t * UserKeyingMaterial ::= OCTET STRING\r\n                     * </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyTransRecipientInfo.GetInstance(System.Object)\">\r\n             return a KeyTransRecipientInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.KeyTransRecipientInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            KeyTransRecipientInfo ::= Sequence {\r\n                version CMSVersion,  -- always set to 0 or 2\r\n                rid RecipientIdentifier,\r\n                keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,\r\n                encryptedKey EncryptedKey\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorIdentifierOrKey.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an OriginatorIdentifierOrKey object from a tagged object.\r\n            \r\n             @param o the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorIdentifierOrKey.GetInstance(System.Object)\">\r\n             return an OriginatorIdentifierOrKey object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorIdentifierOrKey.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             OriginatorIdentifierOrKey ::= CHOICE {\r\n                 issuerAndSerialNumber IssuerAndSerialNumber,\r\n                 subjectKeyIdentifier [0] SubjectKeyIdentifier,\r\n                 originatorKey [1] OriginatorPublicKey\r\n             }\r\n            \r\n             SubjectKeyIdentifier ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorInfo.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an OriginatorInfo object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorInfo.GetInstance(System.Object)\">\r\n             return an OriginatorInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            OriginatorInfo ::= Sequence {\r\n                certs [0] IMPLICIT CertificateSet OPTIONAL,\r\n                crls [1] IMPLICIT CertificateRevocationLists OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorPublicKey.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an OriginatorPublicKey object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorPublicKey.GetInstance(System.Object)\">\r\n             return an OriginatorPublicKey object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OriginatorPublicKey.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            OriginatorPublicKey ::= Sequence {\r\n                algorithm AlgorithmIdentifier,\r\n                publicKey BIT STRING\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherKeyAttribute.GetInstance(System.Object)\">\r\n             return an OtherKeyAttribute object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherKeyAttribute.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            OtherKeyAttribute ::= Sequence {\r\n                keyAttrId OBJECT IDENTIFIER,\r\n                keyAttr ANY DEFINED BY keyAttrId OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherRecipientInfo.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a OtherRecipientInfo object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherRecipientInfo.GetInstance(System.Object)\">\r\n             return a OtherRecipientInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherRecipientInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            OtherRecipientInfo ::= Sequence {\r\n               oriType OBJECT IDENTIFIER,\r\n               oriValue ANY DEFINED BY oriType }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherRevocationInfoFormat.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a OtherRevocationInfoFormat object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicit true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception IllegalArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherRevocationInfoFormat.GetInstance(System.Object)\">\r\n             return a OtherRevocationInfoFormat object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception IllegalArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.OtherRevocationInfoFormat.ToAsn1Object\">\r\n            Produce an object suitable for an ASN1OutputStream.\r\n            <pre>\r\n            OtherRevocationInfoFormat ::= SEQUENCE {\r\n                 otherRevInfoFormat OBJECT IDENTIFIER,\r\n                 otherRevInfo ANY DEFINED BY otherRevInfoFormat }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.PasswordRecipientInfo.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a PasswordRecipientInfo object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.PasswordRecipientInfo.GetInstance(System.Object)\">\r\n             return a PasswordRecipientInfo object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.PasswordRecipientInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            PasswordRecipientInfo ::= Sequence {\r\n              version CMSVersion,   -- Always set to 0\r\n              keyDerivationAlgorithm [0] KeyDerivationAlgorithmIdentifier\r\n                                        OPTIONAL,\r\n             keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,\r\n             encryptedKey EncryptedKey }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientEncryptedKey.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an RecipientEncryptedKey object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want.\r\n             @param isExplicit true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientEncryptedKey.GetInstance(System.Object)\">\r\n             return a RecipientEncryptedKey object from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientEncryptedKey.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            RecipientEncryptedKey ::= SEQUENCE {\r\n                rid KeyAgreeRecipientIdentifier,\r\n                encryptedKey EncryptedKey\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientIdentifier.GetInstance(System.Object)\">\r\n             return a RecipientIdentifier object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientIdentifier.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             RecipientIdentifier ::= CHOICE {\r\n                 issuerAndSerialNumber IssuerAndSerialNumber,\r\n                 subjectKeyIdentifier [0] SubjectKeyIdentifier\r\n             }\r\n            \r\n             SubjectKeyIdentifier ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            RecipientInfo ::= CHOICE {\r\n                ktri KeyTransRecipientInfo,\r\n                kari [1] KeyAgreeRecipientInfo,\r\n                kekri [2] KekRecipientInfo,\r\n                pwri [3] PasswordRecipientInfo,\r\n                ori [4] OtherRecipientInfo }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientKeyIdentifier.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a RecipientKeyIdentifier object from a tagged object.\r\n            \r\n             @param _ato the tagged object holding the object we want.\r\n             @param _explicit true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the object held by the\r\n                      tagged object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientKeyIdentifier.GetInstance(System.Object)\">\r\n             return a RecipientKeyIdentifier object from the given object.\r\n            \r\n             @param _obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.RecipientKeyIdentifier.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             RecipientKeyIdentifier ::= Sequence {\r\n                 subjectKeyIdentifier SubjectKeyIdentifier,\r\n                 date GeneralizedTime OPTIONAL,\r\n                 other OtherKeyAttribute OPTIONAL\r\n             }\r\n            \r\n             SubjectKeyIdentifier ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.ScvpReqRes.ToAsn1Object\">\r\n            <pre>\r\n               ScvpReqRes ::= SEQUENCE {\r\n               request  [0] EXPLICIT ContentInfo OPTIONAL,\r\n               response     ContentInfo }\r\n            </pre>\r\n            @return  the ASN.1 primitive representation.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.SignedData\">\r\n            a signed data object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.SignedData.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            SignedData ::= Sequence {\r\n                version CMSVersion,\r\n                digestAlgorithms DigestAlgorithmIdentifiers,\r\n                encapContentInfo EncapsulatedContentInfo,\r\n                certificates [0] IMPLICIT CertificateSet OPTIONAL,\r\n                crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,\r\n                signerInfos SignerInfos\r\n              }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Cms.SignedDataParser\">\r\n            <pre>\r\n            SignedData ::= SEQUENCE {\r\n                version CMSVersion,\r\n                digestAlgorithms DigestAlgorithmIdentifiers,\r\n                encapContentInfo EncapsulatedContentInfo,\r\n                certificates [0] IMPLICIT CertificateSet OPTIONAL,\r\n                crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,\r\n                signerInfos SignerInfos\r\n              }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.SignerIdentifier.GetInstance(System.Object)\">\r\n             return a SignerIdentifier object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.SignerIdentifier.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             SignerIdentifier ::= CHOICE {\r\n                 issuerAndSerialNumber IssuerAndSerialNumber,\r\n                 subjectKeyIdentifier [0] SubjectKeyIdentifier\r\n             }\r\n            \r\n             SubjectKeyIdentifier ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.SignerInfo.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n              SignerInfo ::= Sequence {\r\n                  version Version,\r\n                  SignerIdentifier sid,\r\n                  digestAlgorithm DigestAlgorithmIdentifier,\r\n                  authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,\r\n                  digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,\r\n                  encryptedDigest EncryptedDigest,\r\n                  unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL\r\n              }\r\n            \r\n              EncryptedDigest ::= OCTET STRING\r\n            \r\n              DigestAlgorithmIdentifier ::= AlgorithmIdentifier\r\n            \r\n              DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Time.#ctor(System.DateTime)\">\r\n            creates a time object from a given date - if the date is between 1950\r\n            and 2049 a UTCTime object is Generated, otherwise a GeneralizedTime\r\n            is used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Time.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Time ::= CHOICE {\r\n                        utcTime        UTCTime,\r\n                        generalTime    GeneralizedTime }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.Attributes.ToAsn1Object\">\r\n            <pre>\r\n            Attributes ::=\r\n              SET SIZE(1..MAX) OF Attribute -- according to RFC 5652\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.MetaData.ToAsn1Object\">\r\n            <pre>\r\n            MetaData ::= SEQUENCE {\r\n              hashProtected        BOOLEAN,\r\n              fileName             UTF8String OPTIONAL,\r\n              mediaType            IA5String OPTIONAL,\r\n              otherMetaData        Attributes OPTIONAL\r\n            }\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.TimeStampAndCrl.ToAsn1Object\">\r\n            <pre>\r\n            TimeStampAndCRL ::= SEQUENCE {\r\n                timeStamp   TimeStampToken,          -- according to RFC 3161\r\n                crl         CertificateList OPTIONAL -- according to RFC 5280\r\n             }\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.TimeStampedData.ToAsn1Object\">\r\n            <pre>\r\n            TimeStampedData ::= SEQUENCE {\r\n              version              INTEGER { v1(1) },\r\n              dataUri              IA5String OPTIONAL,\r\n              metaData             MetaData OPTIONAL,\r\n              content              OCTET STRING OPTIONAL,\r\n              temporalEvidence     Evidence\r\n            }\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Cms.TimeStampTokenEvidence.ToAsn1Object\">\r\n            <pre>\r\n            TimeStampTokenEvidence ::=\r\n               SEQUENCE SIZE(1..MAX) OF TimeStampAndCrl\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.CryptoPro.ECGost3410NamedCurves\">\r\n            table of the available named parameters for GOST 3410-2001.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.CryptoPro.ECGost3410NamedCurves.GetByOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the ECDomainParameters object for the given OID, null if it\r\n             isn't present.\r\n            \r\n             @param oid an object identifier representing a named parameters, if present.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.CryptoPro.ECGost3410NamedCurves.Names\">\r\n            returns an enumeration containing the name strings for curves\r\n            contained in this structure.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.CryptoPro.ECGost3410NamedCurves.GetName(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return the named curve name represented by the given object identifier.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.CryptoPro.Gost28147Parameters.ToAsn1Object\">\r\n             <pre>\r\n             Gost28147-89-Parameters ::=\r\n                           SEQUENCE {\r\n                                   iv                   Gost28147-89-IV,\r\n                                   encryptionParamSet   OBJECT IDENTIFIER\r\n                            }\r\n            \r\n               Gost28147-89-IV ::= OCTET STRING (SIZE (8))\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.CryptoPro.Gost3410NamedParameters\">\r\n            table of the available named parameters for GOST 3410-94.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.CryptoPro.Gost3410NamedParameters.GetByOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the GOST3410ParamSetParameters object for the given OID, null if it\r\n             isn't present.\r\n            \r\n             @param oid an object identifier representing a named parameters, if present.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.CryptoPro.Gost3410NamedParameters.Names\">\r\n            returns an enumeration containing the name strings for parameters\r\n            contained in this structure.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerApplicationSpecific\">\r\n            Base class for an application specific object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerApplicationSpecific.GetObject\">\r\n             Return the enclosed object assuming explicit tagging.\r\n            \r\n             @return  the resulting object\r\n             @throws IOException if reconstruction fails.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerApplicationSpecific.GetObject(System.Int32)\">\r\n             Return the enclosed object assuming implicit tagging.\r\n            \r\n             @param derTagNo the type tag that should be applied to the object's contents.\r\n             @return  the resulting object\r\n             @throws IOException if reconstruction fails.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBitString.GetPadBits(System.Int32)\">\r\n            return the correct number of pad bits for a bit string defined in\r\n            a 32 bit constant\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBitString.GetBytes(System.Int32)\">\r\n            return the correct number of bytes for a bit string defined in\r\n            a 32 bit constant\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBitString.GetInstance(System.Object)\">\r\n             return a Bit string from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBitString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a Bit string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBitString.#ctor(System.Byte[],System.Int32)\">\r\n            @param data the octets making up the bit string.\r\n            @param padBits the number of extra bits at the end of the string.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.DerBitString.IntValue\">\r\n            @return the value of the bit string as an int (truncating if necessary)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerBmpString\">\r\n            Der BMPString object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBmpString.GetInstance(System.Object)\">\r\n             return a BMP string from the given object.\r\n            \r\n             @param obj the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBmpString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a BMP string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                          be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBmpString.#ctor(System.Byte[])\">\r\n            basic constructor - byte encoded string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBmpString.#ctor(System.String)\">\r\n            basic constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBoolean.GetInstance(System.Object)\">\r\n             return a bool from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBoolean.GetInstance(System.Boolean)\">\r\n            return a DerBoolean from the passed in bool.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerBoolean.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a Boolean from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerEnumerated.GetInstance(System.Object)\">\r\n             return an integer from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerEnumerated.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an Enumerated from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerExternal\">\r\n            Class representing the DER-type External\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerExternal.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.DerInteger,Org.BouncyCastle.Asn1.Asn1Object,Org.BouncyCastle.Asn1.DerTaggedObject)\">\r\n            Creates a new instance of DerExternal\r\n            See X.690 for more informations about the meaning of these parameters\r\n            @param directReference The direct reference or <code>null</code> if not set.\r\n            @param indirectReference The indirect reference or <code>null</code> if not set.\r\n            @param dataValueDescriptor The data value descriptor or <code>null</code> if not set.\r\n            @param externalData The external data in its encoded form.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerExternal.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.DerInteger,Org.BouncyCastle.Asn1.Asn1Object,System.Int32,Org.BouncyCastle.Asn1.Asn1Object)\">\r\n            Creates a new instance of DerExternal.\r\n            See X.690 for more informations about the meaning of these parameters\r\n            @param directReference The direct reference or <code>null</code> if not set.\r\n            @param indirectReference The indirect reference or <code>null</code> if not set.\r\n            @param dataValueDescriptor The data value descriptor or <code>null</code> if not set.\r\n            @param encoding The encoding to be used for the external data\r\n            @param externalData The external data\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.DerExternal.Encoding\">\r\n            The encoding of the content. Valid values are\r\n            <ul>\r\n            <li><code>0</code> single-ASN1-type</li>\r\n            <li><code>1</code> OCTET STRING</li>\r\n            <li><code>2</code> BIT STRING</li>\r\n            </ul>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerGeneralizedTime\">\r\n            Generalized time object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerGeneralizedTime.GetInstance(System.Object)\">\r\n             return a generalized time from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerGeneralizedTime.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a Generalized Time object from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerGeneralizedTime.#ctor(System.String)\">\r\n             The correct format for this is YYYYMMDDHHMMSS[.f]Z, or without the Z\r\n             for local time, or Z+-HHMM on the end, for difference between local\r\n             time and UTC time. The fractional second amount f must consist of at\r\n             least one number with trailing zeroes removed.\r\n            \r\n             @param time the time string.\r\n             @exception ArgumentException if string is an illegal format.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerGeneralizedTime.#ctor(System.DateTime)\">\r\n            base constructor from a local time object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.DerGeneralizedTime.TimeString\">\r\n            Return the time.\r\n            @return The time string as it appeared in the encoded object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerGeneralizedTime.GetTime\">\r\n            return the time - always in the form of\r\n             YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm).\r\n            <p>\r\n            Normally in a certificate we would expect \"Z\" rather than \"GMT\",\r\n            however adding the \"GMT\" means we can just use:\r\n            <pre>\r\n                dateF = new SimpleDateFormat(\"yyyyMMddHHmmssz\");\r\n            </pre>\r\n            To read in the time and Get a date which is compatible with our local\r\n            time zone.</p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerIA5String\">\r\n            Der IA5String object - this is an ascii string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerIA5String.GetInstance(System.Object)\">\r\n             return a IA5 string from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerIA5String.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an IA5 string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerIA5String.#ctor(System.Byte[])\">\r\n            basic constructor - with bytes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerIA5String.#ctor(System.String)\">\r\n            basic constructor - without validation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerIA5String.#ctor(System.String,System.Boolean)\">\r\n             Constructor with optional validation.\r\n            \r\n             @param string the base string to wrap.\r\n             @param validate whether or not to check the string.\r\n             @throws ArgumentException if validate is true and the string\r\n             contains characters that should not be in an IA5String.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerIA5String.IsIA5String(System.String)\">\r\n             return true if the passed in String can be represented without\r\n             loss as an IA5String, false otherwise.\r\n            \r\n             @return true if in printable set, false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerInteger.GetInstance(System.Object)\">\r\n             return an integer from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerInteger.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an Integer from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param isExplicit true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.DerInteger.PositiveValue\">\r\n            in some cases positive values Get crammed into a space,\r\n            that's not quite big enough...\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerNull\">\r\n            A Null object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerNumericString\">\r\n            Der NumericString object - this is an ascii string of characters {0,1,2,3,4,5,6,7,8,9, }.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerNumericString.GetInstance(System.Object)\">\r\n             return a Numeric string from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerNumericString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an Numeric string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerNumericString.#ctor(System.Byte[])\">\r\n            basic constructor - with bytes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerNumericString.#ctor(System.String)\">\r\n            basic constructor -  without validation..\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerNumericString.#ctor(System.String,System.Boolean)\">\r\n             Constructor with optional validation.\r\n            \r\n             @param string the base string to wrap.\r\n             @param validate whether or not to check the string.\r\n             @throws ArgumentException if validate is true and the string\r\n             contains characters that should not be in a NumericString.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerNumericString.IsNumericString(System.String)\">\r\n             Return true if the string can be represented as a NumericString ('0'..'9', ' ')\r\n            \r\n             @param str string to validate.\r\n             @return true if numeric, fale otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerObjectIdentifier.GetInstance(System.Object)\">\r\n             return an Oid from the passed in object\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerObjectIdentifier.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an object Identifier from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerObjectIdentifier.On(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            Return  true if this oid is an extension of the passed in branch, stem.\r\n            @param stem the arc or branch that is a possible parent.\r\n            @return  true if the branch is on the passed in stem, false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerOctetString.#ctor(System.Byte[])\">\r\n            <param name=\"str\">The octets making up the octet string.</param>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerPrintableString\">\r\n            Der PrintableString object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerPrintableString.GetInstance(System.Object)\">\r\n             return a printable string from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerPrintableString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a Printable string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerPrintableString.#ctor(System.Byte[])\">\r\n            basic constructor - byte encoded string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerPrintableString.#ctor(System.String)\">\r\n            basic constructor - this does not validate the string\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerPrintableString.#ctor(System.String,System.Boolean)\">\r\n             Constructor with optional validation.\r\n            \r\n             @param string the base string to wrap.\r\n             @param validate whether or not to check the string.\r\n             @throws ArgumentException if validate is true and the string\r\n             contains characters that should not be in a PrintableString.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerPrintableString.IsPrintableString(System.String)\">\r\n             return true if the passed in String can be represented without\r\n             loss as a PrintableString, false otherwise.\r\n            \r\n             @return true if in printable set, false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerSequence.#ctor\">\r\n            create an empty sequence\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerSequence.#ctor(Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            create a sequence containing one object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerSequence.#ctor(Org.BouncyCastle.Asn1.Asn1EncodableVector)\">\r\n            create a sequence containing a vector of objects.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerSet\">\r\n            A Der encoded set object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerSet.#ctor\">\r\n            create an empty set\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerSet.#ctor(Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param obj - a single object that makes up the set.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerSet.#ctor(Org.BouncyCastle.Asn1.Asn1EncodableVector)\">\r\n            @param v - a vector of objects making up the set.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerT61String\">\r\n            Der T61String (also the teletex string) - 8-bit characters\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerT61String.GetInstance(System.Object)\">\r\n             return a T61 string from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerT61String.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an T61 string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerT61String.#ctor(System.Byte[])\">\r\n            basic constructor - with bytes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerT61String.#ctor(System.String)\">\r\n            basic constructor - with string.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerTaggedObject\">\r\n            DER TaggedObject - in ASN.1 notation this is any object preceded by\r\n            a [n] where n is some number - these are assumed to follow the construction\r\n            rules (as with sequences).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerTaggedObject.#ctor(System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param tagNo the tag number for this object.\r\n            @param obj the tagged object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerTaggedObject.#ctor(System.Boolean,System.Int32,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param explicitly true if an explicitly tagged object.\r\n            @param tagNo the tag number for this object.\r\n            @param obj the tagged object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerTaggedObject.#ctor(System.Int32)\">\r\n            create an implicitly tagged object that contains a zero\r\n            length sequence.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerUniversalString\">\r\n            Der UniversalString object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUniversalString.GetInstance(System.Object)\">\r\n             return a Universal string from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUniversalString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a Universal string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUniversalString.#ctor(System.Byte[])\">\r\n            basic constructor - byte encoded string.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerUnknownTag\">\r\n            We insert one of these when we find a tag we don't recognise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUnknownTag.#ctor(System.Int32,System.Byte[])\">\r\n            @param tag the tag value.\r\n            @param data the contents octets.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerUtcTime\">\r\n            UTC time object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtcTime.GetInstance(System.Object)\">\r\n             return an UTC Time from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtcTime.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an UTC Time from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtcTime.#ctor(System.String)\">\r\n            The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were\r\n            never encoded. When you're creating one of these objects from scratch, that's\r\n            what you want to use, otherwise we'll try to deal with whatever Gets read from\r\n            the input stream... (this is why the input format is different from the GetTime()\r\n            method output).\r\n            <p>\r\n            @param time the time string.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtcTime.#ctor(System.DateTime)\">\r\n            base constructor from a DateTime object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtcTime.ToDateTime\">\r\n             return the time as a date based on whatever a 2 digit year will return. For\r\n             standardised processing use ToAdjustedDateTime().\r\n            \r\n             @return the resulting date\r\n             @exception ParseException if the date string cannot be parsed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtcTime.ToAdjustedDateTime\">\r\n             return the time as an adjusted date\r\n             in the range of 1950 - 2049.\r\n            \r\n             @return a date in the range of 1950 to 2049.\r\n             @exception ParseException if the date string cannot be parsed.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.DerUtcTime.TimeString\">\r\n            return the time - always in the form of\r\n             YYMMDDhhmmssGMT(+hh:mm|-hh:mm).\r\n            <p>\r\n            Normally in a certificate we would expect \"Z\" rather than \"GMT\",\r\n            however adding the \"GMT\" means we can just use:\r\n            <pre>\r\n                dateF = new SimpleDateFormat(\"yyMMddHHmmssz\");\r\n            </pre>\r\n            To read in the time and Get a date which is compatible with our local\r\n            time zone.</p>\r\n            <p>\r\n            <b>Note:</b> In some cases, due to the local date processing, this\r\n            may lead to unexpected results. If you want to stick the normal\r\n            convention of 1950 to 2049 use the GetAdjustedTime() method.</p>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.DerUtcTime.AdjustedTimeString\">\r\n            <summary>\r\n            Return a time string as an adjusted date with a 4 digit year.\r\n            This goes in the range of 1950 - 2049.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerUtf8String\">\r\n            Der UTF8String object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtf8String.GetInstance(System.Object)\">\r\n             return an UTF8 string from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtf8String.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return an UTF8 string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtf8String.#ctor(System.Byte[])\">\r\n            basic constructor - byte encoded string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerUtf8String.#ctor(System.String)\">\r\n            basic constructor\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.DerVisibleString\">\r\n            Der VisibleString object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerVisibleString.GetInstance(System.Object)\">\r\n             return a Visible string from the passed in object.\r\n            \r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerVisibleString.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             return a Visible string from a tagged object.\r\n            \r\n             @param obj the tagged object holding the object we want\r\n             @param explicitly true if the object is meant to be explicitly\r\n                          tagged false otherwise.\r\n             @exception ArgumentException if the tagged object cannot\r\n                           be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerVisibleString.#ctor(System.Byte[])\">\r\n            basic constructor - byte encoded string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.DerVisibleString.#ctor(System.String)\">\r\n            basic constructor\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CertificateValues\">\r\n            <remarks>\r\n            RFC 3126: 4.3.1 Certificate Values Attribute Definition\r\n            <code>\r\n            CertificateValues ::= SEQUENCE OF Certificate\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.CommitmentTypeIndication.ToAsn1Object\">\r\n            <pre>\r\n            CommitmentTypeIndication ::= SEQUENCE {\r\n                 commitmentTypeId   CommitmentTypeIdentifier,\r\n                 commitmentTypeQualifier   SEQUENCE SIZE (1..MAX) OF\r\n                         CommitmentTypeQualifier OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CommitmentTypeQualifier\">\r\n             Commitment type qualifiers, used in the Commitment-Type-Indication attribute (RFC3126).\r\n            \r\n             <pre>\r\n               CommitmentTypeQualifier ::= SEQUENCE {\r\n                   commitmentTypeIdentifier  CommitmentTypeIdentifier,\r\n                   qualifier          ANY DEFINED BY commitmentTypeIdentifier OPTIONAL }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.CommitmentTypeQualifier.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             Creates a new <code>CommitmentTypeQualifier</code> instance.\r\n            \r\n             @param commitmentTypeIdentifier a <code>CommitmentTypeIdentifier</code> value\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.CommitmentTypeQualifier.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n             Creates a new <code>CommitmentTypeQualifier</code> instance.\r\n            \r\n             @param commitmentTypeIdentifier a <code>CommitmentTypeIdentifier</code> value\r\n             @param qualifier the qualifier, defined by the above field.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.CommitmentTypeQualifier.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>CommitmentTypeQualifier</code> instance.\r\n            \r\n             @param as <code>CommitmentTypeQualifier</code> structure\r\n             encoded as an Asn1Sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.CommitmentTypeQualifier.ToAsn1Object\">\r\n             Returns a DER-encodable representation of this instance.\r\n            \r\n             @return a <code>Asn1Object</code> value\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CompleteCertificateRefs\">\r\n            <remarks>\r\n            RFC 3126: 4.2.1 Complete Certificate Refs Attribute Definition\r\n            <code>\r\n            CompleteCertificateRefs ::= SEQUENCE OF OtherCertID\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CompleteRevocationRefs\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            CompleteRevocationRefs ::= SEQUENCE OF CrlOcspRef\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CrlIdentifier\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            CrlIdentifier ::= SEQUENCE \r\n            {\r\n            \tcrlissuer\t\tName,\r\n            \tcrlIssuedTime\tUTCTime,\r\n            \tcrlNumber\t\tINTEGER OPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CrlListID\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            CRLListID ::= SEQUENCE \r\n            {\r\n            \tcrls\tSEQUENCE OF CrlValidatedID\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CrlOcspRef\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            CrlOcspRef ::= SEQUENCE {\r\n            \tcrlids\t\t[0] CRLListID\t\tOPTIONAL,\r\n            \tocspids\t\t[1] OcspListID\t\tOPTIONAL,\r\n            \totherRev\t[2] OtherRevRefs\tOPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.CrlValidatedID\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            CrlValidatedID ::= SEQUENCE {\r\n            \tcrlHash\t\t\tOtherHash,\r\n            \tcrlIdentifier\tCrlIdentifier OPTIONAL}\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OcspIdentifier\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            OcspIdentifier ::= SEQUENCE {\r\n            \tocspResponderID\t\tResponderID,\r\n            \t\t-- As in OCSP response data\r\n            \tproducedAt\t\t\tGeneralizedTime\r\n            \t\t-- As in OCSP response data\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OcspListID\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            OcspListID ::=  SEQUENCE {\r\n            \tocspResponses\tSEQUENCE OF OcspResponsesID\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OcspResponsesID\">\r\n            <remarks>\r\n            RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n            <code>\r\n            OcspResponsesID ::= SEQUENCE {\r\n            \tocspIdentifier\tOcspIdentifier,\r\n            \tocspRepHash\t\tOtherHash OPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OtherCertID\">\r\n            <remarks>\r\n            <code>\r\n            OtherCertID ::= SEQUENCE {\r\n            \totherCertHash\tOtherHash,\r\n            \tissuerSerial\tIssuerSerial OPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OtherHash\">\r\n            <remarks>\r\n            <code>\r\n            OtherHash ::= CHOICE {\r\n            \tsha1Hash\tOtherHashValue, -- This contains a SHA-1 hash\r\n            \totherHash\tOtherHashAlgAndValue\r\n            }\r\n            \r\n            OtherHashValue ::= OCTET STRING\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OtherHashAlgAndValue\">\r\n            <summary>\r\n            Summary description for OtherHashAlgAndValue.\r\n            </summary>\r\n            <remarks>\r\n            <code>\r\n            OtherHashAlgAndValue ::= SEQUENCE {\r\n            \thashAlgorithm\tAlgorithmIdentifier,\r\n            \thashValue\t\tOtherHashValue\r\n            }\r\n            \r\n            OtherHashValue ::= OCTET STRING\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OtherRevRefs\">\r\n             <remarks>\r\n             RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition\r\n             <code>\r\n             OtherRevRefs ::= SEQUENCE \r\n             {\r\n            \t\totherRevRefType      OtherRevRefType,\r\n            \t\totherRevRefs         ANY DEFINED BY otherRevRefType\r\n             }\r\n            \r\n             OtherRevRefType ::= OBJECT IDENTIFIER\r\n             </code>\r\n             </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OtherRevVals\">\r\n             <remarks>\r\n             RFC 3126: 4.3.2 Revocation Values Attribute Definition\r\n             <code>\r\n             OtherRevVals ::= SEQUENCE \r\n             {\r\n            \t\totherRevValType      OtherRevValType,\r\n            \t\totherRevVals         ANY DEFINED BY otherRevValType\r\n             }\r\n            \r\n             OtherRevValType ::= OBJECT IDENTIFIER\r\n             </code>\r\n             </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.OtherSigningCertificate\">\r\n            <remarks>\r\n            <code>\r\n            OtherSigningCertificate ::= SEQUENCE {\r\n            \tcerts\t\tSEQUENCE OF OtherCertID,\r\n            \tpolicies\tSEQUENCE OF PolicyInformation OPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.RevocationValues\">\r\n            <remarks>\r\n            RFC 5126: 6.3.4.  revocation-values Attribute Definition\r\n            <code>\r\n            RevocationValues ::=  SEQUENCE {\r\n            \tcrlVals\t\t\t[0] SEQUENCE OF CertificateList     OPTIONAL,\r\n            \tocspVals\t\t[1] SEQUENCE OF BasicOCSPResponse   OPTIONAL,\r\n            \totherRevVals\t[2] OtherRevVals OPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.SignaturePolicyId\">\r\n            <remarks>\r\n            <code>\r\n            SignaturePolicyId ::= SEQUENCE {\r\n            \tsigPolicyIdentifier\t\tSigPolicyId,\r\n            \tsigPolicyHash\t\t\tSigPolicyHash,\r\n            \tsigPolicyQualifiers\t\tSEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo OPTIONAL\r\n            }\r\n            \r\n            SigPolicyId ::= OBJECT IDENTIFIER\r\n            \r\n            SigPolicyHash ::= OtherHashAlgAndValue\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.SignaturePolicyIdentifier\">\r\n            <remarks>\r\n            <code>\r\n            SignaturePolicyIdentifier ::= CHOICE {\r\n            \tSignaturePolicyId\t\tSignaturePolicyId,\r\n            \tSignaturePolicyImplied\tSignaturePolicyImplied\r\n            }\r\n            \r\n            SignaturePolicyImplied ::= NULL\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.SignerAttribute.ToAsn1Object\">\r\n            \r\n             <pre>\r\n              SignerAttribute ::= SEQUENCE OF CHOICE {\r\n                  claimedAttributes   [0] ClaimedAttributes,\r\n                  certifiedAttributes [1] CertifiedAttributes }\r\n            \r\n              ClaimedAttributes ::= SEQUENCE OF Attribute\r\n              CertifiedAttributes ::= AttributeCertificate -- as defined in RFC 3281: see clause 4.1.\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.SignerLocation\">\r\n             Signer-Location attribute (RFC3126).\r\n            \r\n             <pre>\r\n               SignerLocation ::= SEQUENCE {\r\n                   countryName        [0] DirectoryString OPTIONAL,\r\n                   localityName       [1] DirectoryString OPTIONAL,\r\n                   postalAddress      [2] PostalAddress OPTIONAL }\r\n            \r\n               PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Esf.SignerLocation.ToAsn1Object\">\r\n             <pre>\r\n               SignerLocation ::= SEQUENCE {\r\n                   countryName        [0] DirectoryString OPTIONAL,\r\n                   localityName       [1] DirectoryString OPTIONAL,\r\n                   postalAddress      [2] PostalAddress OPTIONAL }\r\n            \r\n               PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString\r\n            \r\n               DirectoryString ::= CHOICE {\r\n                     teletexString           TeletexString (SIZE (1..MAX)),\r\n                     printableString         PrintableString (SIZE (1..MAX)),\r\n                     universalString         UniversalString (SIZE (1..MAX)),\r\n                     utf8String              UTF8String (SIZE (1.. MAX)),\r\n                     bmpString               BMPString (SIZE (1..MAX)) }\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Esf.SigPolicyQualifierInfo\">\r\n            <remarks>\r\n            <code>\r\n            SigPolicyQualifierInfo ::= SEQUENCE {\r\n            \tsigPolicyQualifierId  SigPolicyQualifierId,\r\n            \tsigQualifier          ANY DEFINED BY sigPolicyQualifierId\r\n            }\r\n            \r\n            SigPolicyQualifierId ::= OBJECT IDENTIFIER\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.ContentHints.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.ContentHints.ToAsn1Object\">\r\n            <pre>\r\n            ContentHints ::= SEQUENCE {\r\n              contentDescription UTF8String (SIZE (1..MAX)) OPTIONAL,\r\n              contentType ContentType }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.ContentIdentifier.#ctor(Org.BouncyCastle.Asn1.Asn1OctetString)\">\r\n            Create from OCTET STRING whose octets represent the identifier.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.ContentIdentifier.#ctor(System.Byte[])\">\r\n            Create from byte array representing the identifier.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.ContentIdentifier.ToAsn1Object\">\r\n            The definition of ContentIdentifier is\r\n            <pre>\r\n            ContentIdentifier ::=  OCTET STRING\r\n            </pre>\r\n            id-aa-contentIdentifier OBJECT IDENTIFIER ::= { iso(1)\r\n             member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)\r\n             smime(16) id-aa(2) 7 }\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.EssCertID.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.EssCertID.ToAsn1Object\">\r\n            <pre>\r\n            EssCertID ::= SEQUENCE {\r\n                certHash Hash,\r\n                issuerSerial IssuerSerial OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.EssCertIDv2.ToAsn1Object\">\r\n             <pre>\r\n             EssCertIDv2 ::=  SEQUENCE {\r\n                 hashAlgorithm     AlgorithmIdentifier\r\n                          DEFAULT {algorithm id-sha256},\r\n                 certHash          Hash,\r\n                 issuerSerial      IssuerSerial OPTIONAL\r\n             }\r\n            \r\n             Hash ::= OCTET STRING\r\n            \r\n             IssuerSerial ::= SEQUENCE {\r\n                 issuer         GeneralNames,\r\n                 serialNumber   CertificateSerialNumber\r\n             }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.OtherCertID.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.OtherCertID.ToAsn1Object\">\r\n             <pre>\r\n             OtherCertID ::= SEQUENCE {\r\n                 otherCertHash    OtherHash,\r\n                 issuerSerial     IssuerSerial OPTIONAL }\r\n            \r\n             OtherHash ::= CHOICE {\r\n                 sha1Hash     OCTET STRING,\r\n                 otherHash    OtherHashAlgAndValue }\r\n            \r\n             OtherHashAlgAndValue ::= SEQUENCE {\r\n                 hashAlgorithm    AlgorithmIdentifier,\r\n                 hashValue        OCTET STRING }\r\n            \r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.OtherSigningCertificate.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            constructors\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.OtherSigningCertificate.ToAsn1Object\">\r\n            The definition of OtherSigningCertificate is\r\n            <pre>\r\n            OtherSigningCertificate ::=  SEQUENCE {\r\n                 certs        SEQUENCE OF OtherCertID,\r\n                 policies     SEQUENCE OF PolicyInformation OPTIONAL\r\n            }\r\n            </pre>\r\n            id-aa-ets-otherSigCert OBJECT IDENTIFIER ::= { iso(1)\r\n             member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)\r\n             smime(16) id-aa(2) 19 }\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.SigningCertificate.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            constructors\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.SigningCertificate.ToAsn1Object\">\r\n            The definition of SigningCertificate is\r\n            <pre>\r\n            SigningCertificate ::=  SEQUENCE {\r\n                 certs        SEQUENCE OF EssCertID,\r\n                 policies     SEQUENCE OF PolicyInformation OPTIONAL\r\n            }\r\n            </pre>\r\n            id-aa-signingCertificate OBJECT IDENTIFIER ::= { iso(1)\r\n             member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)\r\n             smime(16) id-aa(2) 12 }\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ess.SigningCertificateV2.ToAsn1Object\">\r\n            The definition of SigningCertificateV2 is\r\n            <pre>\r\n            SigningCertificateV2 ::=  SEQUENCE {\r\n                 certs        SEQUENCE OF EssCertIDv2,\r\n                 policies     SEQUENCE OF PolicyInformation OPTIONAL\r\n            }\r\n            </pre>\r\n            id-aa-signingCertificateV2 OBJECT IDENTIFIER ::= { iso(1)\r\n               member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)\r\n               smime(16) id-aa(2) 47 }\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IAsn1Choice\">\r\n            Marker interface for CHOICE objects - if you implement this in a roll-your-own\r\n            object, any attempt to tag the object implicitly will convert the tag to an\r\n            explicit one as the encoding rules require.\r\n            <p>\r\n            If you use this interface your class should also implement the getInstance\r\n            pattern which takes a tag object and the tagging mode used. \r\n            </p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IAsn1String\">\r\n            basic interface for Der string objects.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Icao.DataGroupHash\">\r\n             The DataGroupHash object.\r\n             <pre>\r\n             DataGroupHash  ::=  SEQUENCE {\r\n                  dataGroupNumber         DataGroupNumber,\r\n                  dataGroupHashValue     OCTET STRING }\r\n            \r\n             DataGroupNumber ::= INTEGER {\r\n                     dataGroup1    (1),\r\n                     dataGroup1    (2),\r\n                     dataGroup1    (3),\r\n                     dataGroup1    (4),\r\n                     dataGroup1    (5),\r\n                     dataGroup1    (6),\r\n                     dataGroup1    (7),\r\n                     dataGroup1    (8),\r\n                     dataGroup1    (9),\r\n                     dataGroup1    (10),\r\n                     dataGroup1    (11),\r\n                     dataGroup1    (12),\r\n                     dataGroup1    (13),\r\n                     dataGroup1    (14),\r\n                     dataGroup1    (15),\r\n                     dataGroup1    (16) }\r\n            \r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Icao.LdsSecurityObject\">\r\n             The LDSSecurityObject object (V1.8).\r\n             <pre>\r\n             LDSSecurityObject ::= SEQUENCE {\r\n               version                LDSSecurityObjectVersion,\r\n               hashAlgorithm          DigestAlgorithmIdentifier,\r\n               dataGroupHashValues    SEQUENCE SIZE (2..ub-DataGroups) OF DataHashGroup,\r\n               ldsVersionInfo         LDSVersionInfo OPTIONAL\r\n                 -- if present, version MUST be v1 }\r\n            \r\n             DigestAlgorithmIdentifier ::= AlgorithmIdentifier,\r\n            \r\n             LDSSecurityObjectVersion :: INTEGER {V0(0)}\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Icao.CscaMasterList\">\r\n             The CscaMasterList object. This object can be wrapped in a\r\n             CMSSignedData to be published in LDAP.\r\n            \r\n             <pre>\r\n             CscaMasterList ::= SEQUENCE {\r\n               version                CscaMasterListVersion,\r\n               certList               SET OF Certificate }\r\n               \r\n             CscaMasterListVersion :: INTEGER {v0(0)}\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Icao.LdsVersionInfo.ToAsn1Object\">\r\n            <pre>\r\n            LDSVersionInfo ::= SEQUENCE {\r\n               ldsVersion PRINTABLE STRING\r\n               unicodeVersion PRINTABLE STRING\r\n             }\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttCPAccredited\">\r\n            The id-isismtt-cp-accredited OID indicates that the certificate is a\r\n            qualified certificate according to Directive 1999/93/EC of the European\r\n            Parliament and of the Council of 13 December 1999 on a Community\r\n            Framework for Electronic Signatures, which additionally conforms the\r\n            special requirements of the SigG and has been issued by an accredited CA.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATDateOfCertGen\">\r\n             Certificate extensionDate of certificate generation\r\n             \r\n             <pre>\r\n            \t\tDateOfCertGenSyntax ::= GeneralizedTime\r\n             </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATProcuration\">\r\n            Attribute to indicate that the certificate holder may sign in the name of\r\n            a third person. May also be used as extension in a certificate.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATAdmission\">\r\n            Attribute to indicate admissions to certain professions. May be used as\r\n            attribute in attribute certificate or as extension in a certificate\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATMonetaryLimit\">\r\n            Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST\r\n            be used in new certificates in place of the extension/attribute\r\n            MonetaryLimit since January 1, 2004. For the sake of backward\r\n            compatibility with certificates already in use, SigG conforming\r\n            components MUST support MonetaryLimit (as well as QcEuLimitValue).\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATDeclarationOfMajority\">\r\n            A declaration of majority. May be used as attribute in attribute\r\n            certificate or as extension in a certificate\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATIccsn\">\r\n             \r\n             Serial number of the smart card containing the corresponding private key\r\n             \r\n             <pre>\r\n            \t\tICCSNSyntax ::= OCTET STRING (SIZE(8..20))\r\n             </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATPKReference\">\r\n             \r\n             Reference for a file of a smartcard that stores the public key of this\r\n             certificate and that is used as �security anchor�.\r\n             \r\n             <pre>\r\n            \t\tPKReferenceSyntax ::= OCTET STRING (SIZE(20))\r\n             </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATRestriction\">\r\n             Some other restriction regarding the usage of this certificate. May be\r\n             used as attribute in attribute certificate or as extension in a\r\n             certificate.\r\n             \r\n             <pre>\r\n            \t\tRestrictionSyntax ::= DirectoryString (SIZE(1..1024))\r\n             </pre>\r\n             \r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATRetrieveIfAllowed\">\r\n             \r\n             (Single)Request extension: Clients may include this extension in a\r\n             (single) Request to request the responder to send the certificate in the\r\n             response message along with the status information. Besides the LDAP\r\n             service, this extension provides another mechanism for the distribution\r\n             of certificates, which MAY optionally be provided by certificate\r\n             repositories.\r\n             \r\n             <pre>\r\n            \t\tRetrieveIfAllowed ::= BOOLEAN\r\n             </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATRequestedCertificate\">\r\n            SingleOCSPResponse extension: The certificate requested by the client by\r\n            inserting the RetrieveIfAllowed extension in the request, will be\r\n            returned in this extension.\r\n            \r\n            @see Org.BouncyCastle.Asn1.IsisMtt.Ocsp.RequestedCertificate\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATNamingAuthorities\">\r\n            Base ObjectIdentifier for naming authorities\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATCertInDirSince\">\r\n             SingleOCSPResponse extension: Date, when certificate has been published\r\n             in the directory and status information has become available. Currently,\r\n             accrediting authorities enforce that SigG-conforming OCSP servers include\r\n             this extension in the responses.\r\n             \r\n             <pre>\r\n            \t\tCertInDirSince ::= GeneralizedTime\r\n             </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATCertHash\">\r\n             Hash of a certificate in OCSP.\r\n            \r\n             @see Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATNameAtBirth\">\r\n             <pre>\r\n            \t\tNameAtBirth ::= DirectoryString(SIZE(1..64)\r\n             </pre>\r\n             \r\n             Used in\r\n             {@link Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes SubjectDirectoryAttributes}\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATAdditionalInformation\">\r\n            Some other information of non-restrictive nature regarding the usage of\r\n            this certificate. May be used as attribute in atribute certificate or as\r\n            extension in a certificate.\r\n            \r\n            <pre>\r\n                          AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))\r\n            </pre>\r\n            \r\n            @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdditionalInformationSyntax\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.IsisMttObjectIdentifiers.IdIsisMttATLiabilityLimitationFlag\">\r\n             Indicates that an attribute certificate exists, which limits the\r\n             usability of this public key certificate. Whenever verifying a signature\r\n             with the help of this certificate, the content of the corresponding\r\n             attribute certificate should be concerned. This extension MUST be\r\n             included in a PKC, if a corresponding attribute certificate (having the\r\n             PKC as base certificate) contains some attribute that restricts the\r\n             usability of the PKC too. Attribute certificates with restricting content\r\n             MUST always be included in the signed document.\r\n             \r\n             <pre>\r\n            \t\tLiabilityLimitationFlagSyntax ::= BOOLEAN\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash\">\r\n            ISIS-MTT PROFILE: The responder may include this extension in a response to\r\n            send the hash of the requested certificate to the responder. This hash is\r\n            cryptographically bound to the certificate and serves as evidence that the\r\n            certificate is known to the responder (i.e. it has been issued and is present\r\n            in the directory). Hence, this extension is a means to provide a positive\r\n            statement of availability as described in T8.[8]. As explained in T13.[1],\r\n            clients may rely on this information to be able to validate signatures after\r\n            the expiry of the corresponding certificate. Hence, clients MUST support this\r\n            extension. If a positive statement of availability is to be delivered, this\r\n            extension syntax and OID MUST be used.\r\n            <p/>\r\n            <p/>\r\n            <pre>\r\n                CertHash ::= SEQUENCE {\r\n                  hashAlgorithm AlgorithmIdentifier,\r\n                  certificateHash OCTET STRING\r\n                }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type CertHash:\r\n             <p/>\r\n             <pre>\r\n                 CertHash ::= SEQUENCE {\r\n                   hashAlgorithm AlgorithmIdentifier,\r\n                   certificateHash OCTET STRING\r\n                 }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash.#ctor(Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier,System.Byte[])\">\r\n             Constructor from a given details.\r\n            \r\n             @param hashAlgorithm   The hash algorithm identifier.\r\n             @param certificateHash The hash of the whole DER encoding of the certificate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                 CertHash ::= SEQUENCE {\r\n                   hashAlgorithm AlgorithmIdentifier,\r\n                   certificateHash OCTET STRING\r\n                 }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.RequestedCertificate\">\r\n            ISIS-MTT-Optional: The certificate requested by the client by inserting the\r\n            RetrieveIfAllowed extension in the request, will be returned in this\r\n            extension.\r\n            <p/>\r\n            ISIS-MTT-SigG: The signature act allows publishing certificates only then,\r\n            when the certificate owner gives his isExplicit permission. Accordingly, there\r\n            may be �nondownloadable� certificates, about which the responder must provide\r\n            status information, but MUST NOT include them in the response. Clients may\r\n            get therefore the following three kind of answers on a single request\r\n            including the RetrieveIfAllowed extension:\r\n            <ul>\r\n            <li> a) the responder supports the extension and is allowed to publish the\r\n            certificate: RequestedCertificate returned including the requested\r\n            certificate</li>\r\n            <li>b) the responder supports the extension but is NOT allowed to publish\r\n            the certificate: RequestedCertificate returned including an empty OCTET\r\n            STRING</li>\r\n            <li>c) the responder does not support the extension: RequestedCertificate is\r\n            not included in the response</li>\r\n            </ul>\r\n            Clients requesting RetrieveIfAllowed MUST be able to handle these cases. If\r\n            any of the OCTET STRING options is used, it MUST contain the DER encoding of\r\n            the requested certificate.\r\n            <p/>\r\n            <pre>\r\n                       RequestedCertificate ::= CHOICE {\r\n                         Certificate Certificate,\r\n                         publicKeyCertificate [0] EXPLICIT OCTET STRING,\r\n                         attributeCertificate [1] EXPLICIT OCTET STRING\r\n                       }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.RequestedCertificate.#ctor(Org.BouncyCastle.Asn1.X509.X509CertificateStructure)\">\r\n             Constructor from a given details.\r\n             <p/>\r\n             Only one parameter can be given. All other must be <code>null</code>.\r\n            \r\n             @param certificate Given as Certificate\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.Ocsp.RequestedCertificate.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                        RequestedCertificate ::= CHOICE {\r\n                          Certificate Certificate,\r\n                          publicKeyCertificate [0] EXPLICIT OCTET STRING,\r\n                          attributeCertificate [1] EXPLICIT OCTET STRING\r\n                        }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.AdditionalInformationSyntax\">\r\n            Some other information of non-restrictive nature regarding the usage of this\r\n            certificate.\r\n            \r\n            <pre>\r\n               AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.AdditionalInformationSyntax.#ctor(System.String)\">\r\n             Constructor from a given details.\r\n            \r\n             @param information The describtion of the information.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.AdditionalInformationSyntax.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n               AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions\">\r\n             An Admissions structure.\r\n             <p/>\r\n             <pre>\r\n                        Admissions ::= SEQUENCE\r\n                        {\r\n                          admissionAuthority [0] EXPLICIT GeneralName OPTIONAL\r\n                          namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL\r\n                          professionInfos SEQUENCE OF ProfessionInfo\r\n                        }\r\n             <p/>\r\n             </pre>\r\n            \r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax\r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo\r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type ProcurationSyntax:\r\n             <p/>\r\n             <pre>\r\n                        Admissions ::= SEQUENCE\r\n                        {\r\n                          admissionAuthority [0] EXPLICIT GeneralName OPTIONAL\r\n                          namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL\r\n                          professionInfos SEQUENCE OF ProfessionInfo\r\n                        }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions.#ctor(Org.BouncyCastle.Asn1.X509.GeneralName,Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority,Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo[])\">\r\n             Constructor from a given details.\r\n             <p/>\r\n             Parameter <code>professionInfos</code> is mandatory.\r\n            \r\n             @param admissionAuthority The admission authority.\r\n             @param namingAuthority    The naming authority.\r\n             @param professionInfos    The profession infos.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                   Admissions ::= SEQUENCE\r\n                   {\r\n                     admissionAuthority [0] EXPLICIT GeneralName OPTIONAL\r\n                     namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL\r\n                     professionInfos SEQUENCE OF ProfessionInfo\r\n                   }\r\n             <p/>\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax\">\r\n             Attribute to indicate admissions to certain professions.\r\n             <p/>\r\n             <pre>\r\n                 AdmissionSyntax ::= SEQUENCE\r\n                 {\r\n                   admissionAuthority GeneralName OPTIONAL,\r\n                   contentsOfAdmissions SEQUENCE OF Admissions\r\n                 }\r\n             <p/>\r\n                 Admissions ::= SEQUENCE\r\n                 {\r\n                   admissionAuthority [0] EXPLICIT GeneralName OPTIONAL\r\n                   namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL\r\n                   professionInfos SEQUENCE OF ProfessionInfo\r\n                 }\r\n             <p/>\r\n                 NamingAuthority ::= SEQUENCE\r\n                 {\r\n                   namingAuthorityId OBJECT IDENTIFIER OPTIONAL,\r\n                   namingAuthorityUrl IA5String OPTIONAL,\r\n                   namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL\r\n                 }\r\n             <p/>\r\n                 ProfessionInfo ::= SEQUENCE\r\n                 {\r\n                   namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,\r\n                   professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),\r\n                   professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,\r\n                   registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,\r\n                   addProfessionInfo OCTET STRING OPTIONAL\r\n                 }\r\n             </pre>\r\n             <p/>\r\n             <p/>\r\n             ISIS-MTT PROFILE: The relatively complex structure of AdmissionSyntax\r\n             supports the following concepts and requirements:\r\n             <ul>\r\n             <li> External institutions (e.g. professional associations, chambers, unions,\r\n             administrative bodies, companies, etc.), which are responsible for granting\r\n             and verifying professional admissions, are indicated by means of the data\r\n             field admissionAuthority. An admission authority is indicated by a\r\n             GeneralName object. Here an X.501 directory name (distinguished name) can be\r\n             indicated in the field directoryName, a URL address can be indicated in the\r\n             field uniformResourceIdentifier, and an object identifier can be indicated in\r\n             the field registeredId.</li>\r\n             <li> The names of authorities which are responsible for the administration of\r\n             title registers are indicated in the data field namingAuthority. The name of\r\n             the authority can be identified by an object identifier in the field\r\n             namingAuthorityId, by means of a text string in the field\r\n             namingAuthorityText, by means of a URL address in the field\r\n             namingAuthorityUrl, or by a combination of them. For example, the text string\r\n             can contain the name of the authority, the country and the name of the title\r\n             register. The URL-option refers to a web page which contains lists with\r\n             �officially� registered professions (text and possibly OID) as well as\r\n             further information on these professions. Object identifiers for the\r\n             component namingAuthorityId are grouped under the OID-branch\r\n             id-isis-at-namingAuthorities and must be applied for.</li>\r\n             <li>See http://www.teletrust.de/anwend.asp?Id=30200&amp;Sprache=E_&amp;HomePG=0\r\n             for an application form and http://www.teletrust.de/links.asp?id=30220,11\r\n             for an overview of registered naming authorities.</li>\r\n             <li> By means of the data type ProfessionInfo certain professions,\r\n             specializations, disciplines, fields of activity, etc. are identified. A\r\n             profession is represented by one or more text strings, resp. profession OIDs\r\n             in the fields professionItems and professionOIDs and by a registration number\r\n             in the field registrationNumber. An indication in text form must always be\r\n             present, whereas the other indications are optional. The component\r\n             addProfessionInfo may contain additional applicationspecific information in\r\n             DER-encoded form.</li>\r\n             </ul>\r\n             <p/>\r\n             By means of different namingAuthority-OIDs or profession OIDs hierarchies of\r\n             professions, specializations, disciplines, fields of activity, etc. can be\r\n             expressed. The issuing admission authority should always be indicated (field\r\n             admissionAuthority), whenever a registration number is presented. Still,\r\n             information on admissions can be given without indicating an admission or a\r\n             naming authority by the exclusive use of the component professionItems. In\r\n             this case the certification authority is responsible for the verification of\r\n             the admission information.\r\n             <p/>\r\n             <p/>\r\n             <p/>\r\n             This attribute is single-valued. Still, several admissions can be captured in\r\n             the sequence structure of the component contentsOfAdmissions of\r\n             AdmissionSyntax or in the component professionInfos of Admissions. The\r\n             component admissionAuthority of AdmissionSyntax serves as default value for\r\n             the component admissionAuthority of Admissions. Within the latter component\r\n             the default value can be overwritten, in case that another authority is\r\n             responsible. The component namingAuthority of Admissions serves as a default\r\n             value for the component namingAuthority of ProfessionInfo. Within the latter\r\n             component the default value can be overwritten, in case that another naming\r\n             authority needs to be recorded.\r\n             <p/>\r\n             The length of the string objects is limited to 128 characters. It is\r\n             recommended to indicate a namingAuthorityURL in all issued attribute\r\n             certificates. If a namingAuthorityURL is indicated, the field professionItems\r\n             of ProfessionInfo should contain only registered titles. If the field\r\n             professionOIDs exists, it has to contain the OIDs of the professions listed\r\n             in professionItems in the same order. In general, the field professionInfos\r\n             should contain only one entry, unless the admissions that are to be listed\r\n             are logically connected (e.g. they have been issued under the same admission\r\n             number).\r\n            \r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions\r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo\r\n             @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type ProcurationSyntax:\r\n             <p/>\r\n             <pre>\r\n                 AdmissionSyntax ::= SEQUENCE\r\n                 {\r\n                   admissionAuthority GeneralName OPTIONAL,\r\n                   contentsOfAdmissions SEQUENCE OF Admissions\r\n                 }\r\n             <p/>\r\n                 Admissions ::= SEQUENCE\r\n                 {\r\n                   admissionAuthority [0] EXPLICIT GeneralName OPTIONAL\r\n                   namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL\r\n                   professionInfos SEQUENCE OF ProfessionInfo\r\n                 }\r\n             <p/>\r\n                 NamingAuthority ::= SEQUENCE\r\n                 {\r\n                   namingAuthorityId OBJECT IDENTIFIER OPTIONAL,\r\n                   namingAuthorityUrl IA5String OPTIONAL,\r\n                   namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL\r\n                 }\r\n             <p/>\r\n                 ProfessionInfo ::= SEQUENCE\r\n                 {\r\n                   namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,\r\n                   professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),\r\n                   professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,\r\n                   registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,\r\n                   addProfessionInfo OCTET STRING OPTIONAL\r\n                 }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax.#ctor(Org.BouncyCastle.Asn1.X509.GeneralName,Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from given details.\r\n            \r\n             @param admissionAuthority   The admission authority.\r\n             @param contentsOfAdmissions The admissions.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                 AdmissionSyntax ::= SEQUENCE\r\n                 {\r\n                   admissionAuthority GeneralName OPTIONAL,\r\n                   contentsOfAdmissions SEQUENCE OF Admissions\r\n                 }\r\n             <p/>\r\n                 Admissions ::= SEQUENCE\r\n                 {\r\n                   admissionAuthority [0] EXPLICIT GeneralName OPTIONAL\r\n                   namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL\r\n                   professionInfos SEQUENCE OF ProfessionInfo\r\n                 }\r\n             <p/>\r\n                 NamingAuthority ::= SEQUENCE\r\n                 {\r\n                   namingAuthorityId OBJECT IDENTIFIER OPTIONAL,\r\n                   namingAuthorityUrl IA5String OPTIONAL,\r\n                   namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL\r\n                 }\r\n             <p/>\r\n                 ProfessionInfo ::= SEQUENCE\r\n                 {\r\n                   namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,\r\n                   professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),\r\n                   professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,\r\n                   registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,\r\n                   addProfessionInfo OCTET STRING OPTIONAL\r\n                 }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax.AdmissionAuthority\">\r\n            @return Returns the admissionAuthority if present, null otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax.GetContentsOfAdmissions\">\r\n            @return Returns the contentsOfAdmissions.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.DeclarationOfMajority\">\r\n            A declaration of majority.\r\n            <p/>\r\n            <pre>\r\n                      DeclarationOfMajoritySyntax ::= CHOICE\r\n                      {\r\n                        notYoungerThan [0] IMPLICIT INTEGER,\r\n                        fullAgeAtCountry [1] IMPLICIT SEQUENCE\r\n                        {\r\n                          fullAge BOOLEAN DEFAULT TRUE,\r\n                          country PrintableString (SIZE(2))\r\n                        }\r\n                        dateOfBirth [2] IMPLICIT GeneralizedTime\r\n                      }\r\n            </pre>\r\n            <p/>\r\n            fullAgeAtCountry indicates the majority of the owner with respect to the laws\r\n            of a specific country.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.DeclarationOfMajority.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                       DeclarationOfMajoritySyntax ::= CHOICE\r\n                       {\r\n                         notYoungerThan [0] IMPLICIT INTEGER,\r\n                         fullAgeAtCountry [1] IMPLICIT SEQUENCE\r\n                         {\r\n                           fullAge BOOLEAN DEFAULT TRUE,\r\n                           country PrintableString (SIZE(2))\r\n                         }\r\n                         dateOfBirth [2] IMPLICIT GeneralizedTime\r\n                       }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.DeclarationOfMajority.NotYoungerThan\">\r\n            @return notYoungerThan if that's what we are, -1 otherwise\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.MonetaryLimit\">\r\n            Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST be\r\n            used in new certificates in place of the extension/attribute MonetaryLimit\r\n            since January 1, 2004. For the sake of backward compatibility with\r\n            certificates already in use, components SHOULD support MonetaryLimit (as well\r\n            as QcEuLimitValue).\r\n            <p/>\r\n            Indicates a monetary limit within which the certificate holder is authorized\r\n            to act. (This value DOES NOT express a limit on the liability of the\r\n            certification authority).\r\n            <p/>\r\n            <pre>\r\n               MonetaryLimitSyntax ::= SEQUENCE\r\n               {\r\n                 currency PrintableString (SIZE(3)),\r\n                 amount INTEGER,\r\n                 exponent INTEGER\r\n               }\r\n            </pre>\r\n            <p/>\r\n            currency must be the ISO code.\r\n            <p/>\r\n            value = amount�10*exponent\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.MonetaryLimit.#ctor(System.String,System.Int32,System.Int32)\">\r\n             Constructor from a given details.\r\n             <p/>\r\n             <p/>\r\n             value = amount�10^exponent\r\n            \r\n             @param currency The currency. Must be the ISO code.\r\n             @param amount   The amount\r\n             @param exponent The exponent\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.MonetaryLimit.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                MonetaryLimitSyntax ::= SEQUENCE\r\n                {\r\n                  currency PrintableString (SIZE(3)),\r\n                  amount INTEGER,\r\n                  exponent INTEGER\r\n                }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority\">\r\n            Names of authorities which are responsible for the administration of title\r\n            registers.\r\n            \r\n            <pre>\r\n                        NamingAuthority ::= SEQUENCE \r\n                        {\r\n                          namingAuthorityID OBJECT IDENTIFIER OPTIONAL,\r\n                          namingAuthorityUrl IA5String OPTIONAL,\r\n                          namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL\r\n                        }\r\n            </pre>\r\n            @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern\">\r\n            Profession OIDs should always be defined under the OID branch of the\r\n            responsible naming authority. At the time of this writing, the work group\r\n            �Recht, Wirtschaft, Steuern� (�Law, Economy, Taxes�) is registered as the\r\n            first naming authority under the OID id-isismtt-at-namingAuthorities.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             <p/>\r\n             <pre>\r\n                         NamingAuthority ::= SEQUENCE\r\n                         {\r\n                           namingAuthorityID OBJECT IDENTIFIER OPTIONAL,\r\n                           namingAuthorityUrl IA5String OPTIONAL,\r\n                           namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL\r\n                         }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.NamingAuthorityID\">\r\n            @return Returns the namingAuthorityID.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.NamingAuthorityText\">\r\n            @return Returns the namingAuthorityText.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.NamingAuthorityUrl\">\r\n            @return Returns the namingAuthorityUrl.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.String,Org.BouncyCastle.Asn1.X500.DirectoryString)\">\r\n             Constructor from given details.\r\n             <p/>\r\n             All parameters can be combined.\r\n            \r\n             @param namingAuthorityID   ObjectIdentifier for naming authority.\r\n             @param namingAuthorityUrl  URL for naming authority.\r\n             @param namingAuthorityText Textual representation of naming authority.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                         NamingAuthority ::= SEQUENCE\r\n                         {\r\n                           namingAuthorityID OBJECT IDENTIFIER OPTIONAL,\r\n                           namingAuthorityUrl IA5String OPTIONAL,\r\n                           namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL\r\n                         }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.ProcurationSyntax\">\r\n            Attribute to indicate that the certificate holder may sign in the name of a\r\n            third person.\r\n            <p>\r\n            ISIS-MTT PROFILE: The corresponding ProcurationSyntax contains either the\r\n            name of the person who is represented (subcomponent thirdPerson) or a\r\n            reference to his/her base certificate (in the component signingFor,\r\n            subcomponent certRef), furthermore the optional components country and\r\n            typeSubstitution to indicate the country whose laws apply, and respectively\r\n            the type of procuration (e.g. manager, procuration, custody).\r\n            </p>\r\n            <p>\r\n            ISIS-MTT PROFILE: The GeneralName MUST be of type directoryName and MAY only\r\n            contain: - RFC3039 attributes, except pseudonym (countryName, commonName,\r\n            surname, givenName, serialNumber, organizationName, organizationalUnitName,\r\n            stateOrProvincename, localityName, postalAddress) and - SubjectDirectoryName\r\n            attributes (title, dateOfBirth, placeOfBirth, gender, countryOfCitizenship,\r\n            countryOfResidence and NameAtBirth).\r\n            </p>\r\n            <pre>\r\n                          ProcurationSyntax ::= SEQUENCE {\r\n                            country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,\r\n                            typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,\r\n                            signingFor [3] EXPLICIT SigningFor \r\n                          }\r\n                          \r\n                          SigningFor ::= CHOICE \r\n                          { \r\n                            thirdPerson GeneralName,\r\n                            certRef IssuerSerial \r\n                          }\r\n            </pre>\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProcurationSyntax.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type ProcurationSyntax:\r\n             <p/>\r\n             <pre>\r\n                           ProcurationSyntax ::= SEQUENCE {\r\n                             country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,\r\n                             typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,\r\n                             signingFor [3] EXPLICIT SigningFor\r\n                           }\r\n             <p/>\r\n                           SigningFor ::= CHOICE\r\n                           {\r\n                             thirdPerson GeneralName,\r\n                             certRef IssuerSerial\r\n                           }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProcurationSyntax.#ctor(System.String,Org.BouncyCastle.Asn1.X500.DirectoryString,Org.BouncyCastle.Asn1.X509.IssuerSerial)\">\r\n             Constructor from a given details.\r\n             <p/>\r\n             <p/>\r\n             Either <code>generalName</code> or <code>certRef</code> MUST be\r\n             <code>null</code>.\r\n            \r\n             @param country            The country code whose laws apply.\r\n             @param typeOfSubstitution The type of procuration.\r\n             @param certRef            Reference to certificate of the person who is represented.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProcurationSyntax.#ctor(System.String,Org.BouncyCastle.Asn1.X500.DirectoryString,Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n             Constructor from a given details.\r\n             <p/>\r\n             <p/>\r\n             Either <code>generalName</code> or <code>certRef</code> MUST be\r\n             <code>null</code>.\r\n            \r\n             @param country            The country code whose laws apply.\r\n             @param typeOfSubstitution The type of procuration.\r\n             @param thirdPerson        The GeneralName of the person who is represented.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProcurationSyntax.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                           ProcurationSyntax ::= SEQUENCE {\r\n                             country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,\r\n                             typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,\r\n                             signingFor [3] EXPLICIT SigningFor\r\n                           }\r\n             <p/>\r\n                           SigningFor ::= CHOICE\r\n                           {\r\n                             thirdPerson GeneralName,\r\n                             certRef IssuerSerial\r\n                           }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo\">\r\n            Professions, specializations, disciplines, fields of activity, etc.\r\n            \r\n            <pre>\r\n                          ProfessionInfo ::= SEQUENCE \r\n                          {\r\n                            namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,\r\n                            professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),\r\n                            professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,\r\n                            registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,\r\n                            addProfessionInfo OCTET STRING OPTIONAL \r\n                          }\r\n            </pre>\r\n            \r\n            @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Rechtsanwltin\">\r\n            Rechtsanw�ltin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Rechtsanwalt\">\r\n            Rechtsanwalt\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Rechtsbeistand\">\r\n            Rechtsbeistand\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Steuerberaterin\">\r\n            Steuerberaterin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Steuerberater\">\r\n            Steuerberater\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Steuerbevollmchtigte\">\r\n            Steuerbevollm�chtigte\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Steuerbevollmchtigter\">\r\n            Steuerbevollm�chtigter\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Notarin\">\r\n            Notarin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Notar\">\r\n            Notar\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Notarvertreterin\">\r\n            Notarvertreterin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Notarvertreter\">\r\n            Notarvertreter\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Notariatsverwalterin\">\r\n            Notariatsverwalterin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Notariatsverwalter\">\r\n            Notariatsverwalter\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Wirtschaftsprferin\">\r\n            Wirtschaftspr�ferin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Wirtschaftsprfer\">\r\n            Wirtschaftspr�fer\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.VereidigteBuchprferin\">\r\n            Vereidigte Buchpr�ferin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.VereidigterBuchprfer\">\r\n            Vereidigter Buchpr�fer\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Patentanwltin\">\r\n            Patentanw�ltin\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.Patentanwalt\">\r\n            Patentanwalt\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             <p/>\r\n             <pre>\r\n                           ProfessionInfo ::= SEQUENCE\r\n                           {\r\n                             namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,\r\n                             professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),\r\n                             professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,\r\n                             registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,\r\n                             addProfessionInfo OCTET STRING OPTIONAL\r\n                           }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.#ctor(Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority,Org.BouncyCastle.Asn1.X500.DirectoryString[],Org.BouncyCastle.Asn1.DerObjectIdentifier[],System.String,Org.BouncyCastle.Asn1.Asn1OctetString)\">\r\n             Constructor from given details.\r\n             <p/>\r\n             <code>professionItems</code> is mandatory, all other parameters are\r\n             optional.\r\n            \r\n             @param namingAuthority    The naming authority.\r\n             @param professionItems    Directory strings of the profession.\r\n             @param professionOids     DERObjectIdentfier objects for the\r\n                                       profession.\r\n             @param registrationNumber Registration number.\r\n             @param addProfessionInfo  Additional infos in encoded form.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                           ProfessionInfo ::= SEQUENCE\r\n                           {\r\n                             namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,\r\n                             professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),\r\n                             professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,\r\n                             registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,\r\n                             addProfessionInfo OCTET STRING OPTIONAL\r\n                           }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.AddProfessionInfo\">\r\n            @return Returns the addProfessionInfo.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.NamingAuthority\">\r\n            @return Returns the namingAuthority.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.GetProfessionItems\">\r\n            @return Returns the professionItems.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.GetProfessionOids\">\r\n            @return Returns the professionOids.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo.RegistrationNumber\">\r\n            @return Returns the registrationNumber.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction\">\r\n            Some other restriction regarding the usage of this certificate.\r\n            <p/>\r\n            <pre>\r\n             RestrictionSyntax ::= DirectoryString (SIZE(1..1024))\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction.#ctor(Org.BouncyCastle.Asn1.X500.DirectoryString)\">\r\n             Constructor from DirectoryString.\r\n             <p/>\r\n             The DirectoryString is of type RestrictionSyntax:\r\n             <p/>\r\n             <pre>\r\n                  RestrictionSyntax ::= DirectoryString (SIZE(1..1024))\r\n             </pre>\r\n            \r\n             @param restriction A IAsn1String.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction.#ctor(System.String)\">\r\n             Constructor from a given details.\r\n            \r\n             @param restriction The description of the restriction.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                  RestrictionSyntax ::= DirectoryString (SIZE(1..1024))\r\n             <p/>\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Misc.Cast5CbcParameters.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            cast5CBCParameters ::= Sequence {\r\n                                      iv         OCTET STRING DEFAULT 0,\r\n                                             -- Initialization vector\r\n                                      keyLength  Integer\r\n                                             -- Key length, in bits\r\n                                 }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Misc.IdeaCbcPar.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            IDEA-CBCPar ::= Sequence {\r\n                                 iv    OCTET STRING OPTIONAL -- exactly 8 octets\r\n                             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Misc.NetscapeCertType\">\r\n            The NetscapeCertType object.\r\n            <pre>\r\n               NetscapeCertType ::= BIT STRING {\r\n                    SSLClient               (0),\r\n                    SSLServer               (1),\r\n                    S/MIME                  (2),\r\n                    Object Signing          (3),\r\n                    Reserved                (4),\r\n                    SSL CA                  (5),\r\n                    S/MIME CA               (6),\r\n                    Object Signing CA       (7) }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Misc.NetscapeCertType.#ctor(System.Int32)\">\r\n             Basic constructor.\r\n            \r\n             @param usage - the bitwise OR of the Key Usage flags giving the\r\n             allowed uses for the key.\r\n             e.g. (X509NetscapeCertType.sslCA | X509NetscapeCertType.smimeCA)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Mozilla.PublicKeyAndChallenge\">\r\n             This is designed to parse\r\n             the PublicKeyAndChallenge created by the KEYGEN tag included by\r\n             Mozilla based browsers.\r\n              <pre>\r\n              PublicKeyAndChallenge ::= SEQUENCE {\r\n                spki SubjectPublicKeyInfo,\r\n                challenge IA5STRING\r\n              }\r\n            \r\n              </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Nist.NistNamedCurves\">\r\n            Utility class for fetching curves using their NIST names as published in FIPS-PUB 186-3\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Nist.NistNamedCurves.GetByOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the X9ECParameters object for the named curve represented by\r\n             the passed in object identifier. Null if the curve isn't present.\r\n            \r\n             @param oid an object identifier representing a named curve, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Nist.NistNamedCurves.GetOid(System.String)\">\r\n             return the object identifier signified by the passed in name. Null\r\n             if there is no object identifier associated with name.\r\n            \r\n             @return the object identifier associated with name, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Nist.NistNamedCurves.GetName(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return the named curve name represented by the given object identifier.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Nist.NistNamedCurves.Names\">\r\n            returns an enumeration containing the name strings for curves\r\n            contained in this structure.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Ntt.NttObjectIdentifiers\">\r\n            <summary>From RFC 3657</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.BasicOcspResponse.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            BasicOcspResponse       ::= Sequence {\r\n                 tbsResponseData      ResponseData,\r\n                 signatureAlgorithm   AlgorithmIdentifier,\r\n                 signature            BIT STRING,\r\n                 certs                [0] EXPLICIT Sequence OF Certificate OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.CertID.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            CertID          ::=     Sequence {\r\n                hashAlgorithm       AlgorithmIdentifier,\r\n                issuerNameHash      OCTET STRING, -- Hash of Issuer's DN\r\n                issuerKeyHash       OCTET STRING, -- Hash of Issuers public key\r\n                serialNumber        CertificateSerialNumber }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.CertStatus.#ctor\">\r\n            create a CertStatus object with a tag of zero.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.CertStatus.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             CertStatus ::= CHOICE {\r\n                             good        [0]     IMPLICIT Null,\r\n                             revoked     [1]     IMPLICIT RevokedInfo,\r\n                             unknown     [2]     IMPLICIT UnknownInfo }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.CrlID.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            CrlID ::= Sequence {\r\n                crlUrl               [0]     EXPLICIT IA5String OPTIONAL,\r\n                crlNum               [1]     EXPLICIT Integer OPTIONAL,\r\n                crlTime              [2]     EXPLICIT GeneralizedTime OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.OcspRequest.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            OcspRequest     ::=     Sequence {\r\n                tbsRequest                  TBSRequest,\r\n                optionalSignature   [0]     EXPLICIT Signature OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.OcspResponse.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            OcspResponse ::= Sequence {\r\n                responseStatus         OcspResponseStatus,\r\n                responseBytes          [0] EXPLICIT ResponseBytes OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.OcspResponseStatus.#ctor(System.Int32)\">\r\n            The OcspResponseStatus enumeration.\r\n            <pre>\r\n            OcspResponseStatus ::= Enumerated {\r\n                successful            (0),  --Response has valid confirmations\r\n                malformedRequest      (1),  --Illegal confirmation request\r\n                internalError         (2),  --Internal error in issuer\r\n                tryLater              (3),  --Try again later\r\n                                            --(4) is not used\r\n                sigRequired           (5),  --Must sign the request\r\n                unauthorized          (6)   --Request unauthorized\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.Request.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Request         ::=     Sequence {\r\n                reqCert                     CertID,\r\n                singleRequestExtensions     [0] EXPLICIT Extensions OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.ResponderID.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ResponderID ::= CHOICE {\r\n                 byName          [1] Name,\r\n                 byKey           [2] KeyHash }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.ResponseBytes.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ResponseBytes ::=       Sequence {\r\n                responseType   OBJECT IDENTIFIER,\r\n                response       OCTET STRING }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.ResponseData.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ResponseData ::= Sequence {\r\n                version              [0] EXPLICIT Version DEFAULT v1,\r\n                responderID              ResponderID,\r\n                producedAt               GeneralizedTime,\r\n                responses                Sequence OF SingleResponse,\r\n                responseExtensions   [1] EXPLICIT Extensions OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.RevokedInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            RevokedInfo ::= Sequence {\r\n                 revocationTime              GeneralizedTime,\r\n                 revocationReason    [0]     EXPLICIT CRLReason OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.ServiceLocator.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ServiceLocator ::= Sequence {\r\n                issuer    Name,\r\n                locator   AuthorityInfoAccessSyntax OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.Signature.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Signature       ::=     Sequence {\r\n                signatureAlgorithm      AlgorithmIdentifier,\r\n                signature               BIT STRING,\r\n                certs               [0] EXPLICIT Sequence OF Certificate OPTIONAL}\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.SingleResponse.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             SingleResponse ::= Sequence {\r\n                     certID                       CertID,\r\n                     certStatus                   CertStatus,\r\n                     thisUpdate                   GeneralizedTime,\r\n                     nextUpdate         [0]       EXPLICIT GeneralizedTime OPTIONAL,\r\n                     singleExtensions   [1]       EXPLICIT Extensions OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Ocsp.TbsRequest.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            TBSRequest      ::=     Sequence {\r\n                version             [0]     EXPLICIT Version DEFAULT v1,\r\n                requestorName       [1]     EXPLICIT GeneralName OPTIONAL,\r\n                requestList                 Sequence OF Request,\r\n                requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.OidTokenizer\">\r\n            class for breaking up an Oid into it's component tokens, ala\r\n            java.util.StringTokenizer. We need this class as some of the\r\n            lightweight Java environment don't support classes like\r\n            StringTokenizer.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.AttributePkcs.GetInstance(System.Object)\">\r\n             return an Attribute object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.AttributePkcs.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Attr ::= Sequence {\r\n                attrType OBJECT IDENTIFIER,\r\n                attrValues Set OF AttributeValue\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Pkcs.CertificationRequest\">\r\n            Pkcs10 Certfication request object.\r\n            <pre>\r\n            CertificationRequest ::= Sequence {\r\n              certificationRequestInfo  CertificationRequestInfo,\r\n              signatureAlgorithm        AlgorithmIdentifier{{ SignatureAlgorithms }},\r\n              signature                 BIT STRING\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Pkcs.CertificationRequestInfo\">\r\n             Pkcs10 CertificationRequestInfo object.\r\n             <pre>\r\n              CertificationRequestInfo ::= Sequence {\r\n               version             Integer { v1(0) } (v1,...),\r\n               subject             Name,\r\n               subjectPKInfo   SubjectPublicKeyInfo{{ PKInfoAlgorithms }},\r\n               attributes          [0] Attributes{{ CRIAttributes }}\r\n              }\r\n            \r\n              Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}\r\n            \r\n              Attr { ATTRIBUTE:IOSet } ::= Sequence {\r\n                type    ATTRIBUTE.&amp;id({IOSet}),\r\n                values  Set SIZE(1..MAX) OF ATTRIBUTE.&amp;Type({IOSet}{\\@type})\r\n              }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.ContentInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            ContentInfo ::= Sequence {\r\n                     contentType ContentType,\r\n                     content\r\n                     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Pkcs.EncryptedData\">\r\n             The EncryptedData object.\r\n             <pre>\r\n                  EncryptedData ::= Sequence {\r\n                       version Version,\r\n                       encryptedContentInfo EncryptedContentInfo\r\n                  }\r\n            \r\n            \r\n                  EncryptedContentInfo ::= Sequence {\r\n                      contentType ContentType,\r\n                      contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,\r\n                      encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL\r\n                }\r\n            \r\n                EncryptedContent ::= OCTET STRING\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.EncryptedPrivateKeyInfo.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n             EncryptedPrivateKeyInfo ::= Sequence {\r\n                  encryptionAlgorithm AlgorithmIdentifier {{KeyEncryptionAlgorithms}},\r\n                  encryptedData EncryptedData\r\n             }\r\n            \r\n             EncryptedData ::= OCTET STRING\r\n            \r\n             KeyEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {\r\n                      ... -- For local profiles\r\n             }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.MacData.ToAsn1Object\">\r\n            <pre>\r\n            MacData ::= SEQUENCE {\r\n                mac      DigestInfo,\r\n                macSalt  OCTET STRING,\r\n                iterations INTEGER DEFAULT 1\r\n                -- Note: The default is for historic reasons and its use is deprecated. A\r\n                -- higher value, like 1024 is recommended.\r\n            </pre>\r\n            @return the basic DERObject construction.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Pkcs.Pfx\">\r\n            the infamous Pfx from Pkcs12\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.PrivateKeyInfo.ToAsn1Object\">\r\n             write out an RSA private key with its associated information\r\n             as described in Pkcs8.\r\n             <pre>\r\n                  PrivateKeyInfo ::= Sequence {\r\n                                          version Version,\r\n                                          privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},\r\n                                          privateKey PrivateKey,\r\n                                          attributes [0] IMPLICIT Attributes OPTIONAL\r\n                                      }\r\n                  Version ::= Integer {v1(0)} (v1,...)\r\n            \r\n                  PrivateKey ::= OCTET STRING\r\n            \r\n                  Attributes ::= Set OF Attr\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.RsaesOaepParameters.#ctor\">\r\n            The default version\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.RsaesOaepParameters.ToAsn1Object\">\r\n             <pre>\r\n              RSAES-OAEP-params ::= SEQUENCE {\r\n                 hashAlgorithm      [0] OAEP-PSSDigestAlgorithms     DEFAULT sha1,\r\n                 maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,\r\n                 pSourceAlgorithm   [2] PKCS1PSourceAlgorithms  DEFAULT pSpecifiedEmpty\r\n               }\r\n            \r\n               OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {\r\n                 { OID id-sha1 PARAMETERS NULL   }|\r\n                 { OID id-sha256 PARAMETERS NULL }|\r\n                 { OID id-sha384 PARAMETERS NULL }|\r\n                 { OID id-sha512 PARAMETERS NULL },\r\n                 ...  -- Allows for future expansion --\r\n               }\r\n               PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {\r\n                 { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },\r\n                ...  -- Allows for future expansion --\r\n               }\r\n               PKCS1PSourceAlgorithms    ALGORITHM-IDENTIFIER ::= {\r\n                 { OID id-pSpecified PARAMETERS OCTET STRING },\r\n                 ...  -- Allows for future expansion --\r\n              }\r\n             </pre>\r\n             @return the asn1 primitive representing the parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.RsaPrivateKeyStructure.ToAsn1Object\">\r\n             This outputs the key in Pkcs1v2 format.\r\n             <pre>\r\n                  RsaPrivateKey ::= Sequence {\r\n                                      version Version,\r\n                                      modulus Integer, -- n\r\n                                      publicExponent Integer, -- e\r\n                                      privateExponent Integer, -- d\r\n                                      prime1 Integer, -- p\r\n                                      prime2 Integer, -- q\r\n                                      exponent1 Integer, -- d mod (p-1)\r\n                                      exponent2 Integer, -- d mod (q-1)\r\n                                      coefficient Integer -- (inverse of q) mod p\r\n                                  }\r\n            \r\n                  Version ::= Integer\r\n             </pre>\r\n             <p>This routine is written to output Pkcs1 version 0, private keys.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.RsassaPssParameters.#ctor\">\r\n            The default version\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.RsassaPssParameters.ToAsn1Object\">\r\n             <pre>\r\n             RSASSA-PSS-params ::= SEQUENCE {\r\n               hashAlgorithm      [0] OAEP-PSSDigestAlgorithms  DEFAULT sha1,\r\n                maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,\r\n                saltLength         [2] INTEGER  DEFAULT 20,\r\n                trailerField       [3] TrailerField  DEFAULT trailerFieldBC\r\n              }\r\n            \r\n             OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {\r\n                { OID id-sha1 PARAMETERS NULL   }|\r\n                { OID id-sha256 PARAMETERS NULL }|\r\n                { OID id-sha384 PARAMETERS NULL }|\r\n                { OID id-sha512 PARAMETERS NULL },\r\n                ...  -- Allows for future expansion --\r\n             }\r\n            \r\n             PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {\r\n               { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },\r\n                ...  -- Allows for future expansion --\r\n             }\r\n            \r\n             TrailerField ::= INTEGER { trailerFieldBC(1) }\r\n             </pre>\r\n             @return the asn1 primitive representing the parameters.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Pkcs.SignedData\">\r\n            a Pkcs#7 signed data object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.SignedData.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             SignedData ::= Sequence {\r\n                 version Version,\r\n                 digestAlgorithms DigestAlgorithmIdentifiers,\r\n                 contentInfo ContentInfo,\r\n                 certificates\r\n                     [0] IMPLICIT ExtendedCertificatesAndCertificates\r\n                              OPTIONAL,\r\n                 crls\r\n                     [1] IMPLICIT CertificateRevocationLists OPTIONAL,\r\n                 signerInfos SignerInfos }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Pkcs.SignerInfo\">\r\n            a Pkcs#7 signer info object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Pkcs.SignerInfo.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n              SignerInfo ::= Sequence {\r\n                  version Version,\r\n                  issuerAndSerialNumber IssuerAndSerialNumber,\r\n                  digestAlgorithm DigestAlgorithmIdentifier,\r\n                  authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,\r\n                  digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,\r\n                  encryptedDigest EncryptedDigest,\r\n                  unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL\r\n              }\r\n            \r\n              EncryptedDigest ::= OCTET STRING\r\n            \r\n              DigestAlgorithmIdentifier ::= AlgorithmIdentifier\r\n            \r\n              DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Sec.ECPrivateKeyStructure\">\r\n            the elliptic curve private key object from SEC 1\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Sec.ECPrivateKeyStructure.ToAsn1Object\">\r\n            ECPrivateKey ::= SEQUENCE {\r\n                version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),\r\n                privateKey OCTET STRING,\r\n                parameters [0] Parameters OPTIONAL,\r\n                publicKey [1] BIT STRING OPTIONAL }\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the X9ECParameters object for the named curve represented by\r\n             the passed in object identifier. Null if the curve isn't present.\r\n            \r\n             @param oid an object identifier representing a named curve, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetOid(System.String)\">\r\n             return the object identifier signified by the passed in name. Null\r\n             if there is no object identifier associated with name.\r\n            \r\n             @return the object identifier associated with name, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetName(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return the named curve name represented by the given object identifier.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Sec.SecNamedCurves.Names\">\r\n            returns an enumeration containing the name strings for curves\r\n            contained in this structure.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Sec.SecObjectIdentifiers.EllipticCurve\">\r\n            EllipticCurve OBJECT IDENTIFIER ::= {\r\n                  iso(1) identified-organization(3) certicom(132) curve(0)\r\n            }\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Smime.SmimeCapabilities\">\r\n            Handler class for dealing with S/MIME Capabilities\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Smime.SmimeCapabilities.PreferSignedData\">\r\n            general preferences\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Smime.SmimeCapabilities.DesCbc\">\r\n            encryption algorithms preferences\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Smime.SmimeCapabilities.GetInstance(System.Object)\">\r\n             return an Attr object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Smime.SmimeCapabilities.GetCapabilitiesForOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            returns an ArrayList with 0 or more objects of all the capabilities\r\n            matching the passed in capability Oid. If the Oid passed is null the\r\n            entire set is returned.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Smime.SmimeCapabilities.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            SMIMECapabilities ::= Sequence OF SMIMECapability\r\n            </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Smime.SmimeCapability.PreferSignedData\">\r\n            general preferences\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.Smime.SmimeCapability.DesCbc\">\r\n            encryption algorithms preferences\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Smime.SmimeCapability.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            SMIMECapability ::= Sequence {\r\n                capabilityID OBJECT IDENTIFIER,\r\n                parameters ANY DEFINED BY capabilityID OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Smime.SmimeCapabilityVector\">\r\n            Handler for creating a vector S/MIME Capabilities\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Smime.SmimeEncryptionKeyPreferenceAttribute\">\r\n            The SmimeEncryptionKeyPreference object.\r\n            <pre>\r\n            SmimeEncryptionKeyPreference ::= CHOICE {\r\n                issuerAndSerialNumber   [0] IssuerAndSerialNumber,\r\n                receipentKeyId          [1] RecipientKeyIdentifier,\r\n                subjectAltKeyIdentifier [2] SubjectKeyIdentifier\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Smime.SmimeEncryptionKeyPreferenceAttribute.#ctor(Org.BouncyCastle.Asn1.Asn1OctetString)\">\r\n            @param sKeyId the subjectKeyIdentifier value (normally the X.509 one)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.TeleTrust.TeleTrusTNamedCurves\">\r\n            elliptic curves defined in \"ECC Brainpool Standard Curves and Curve Generation\"\r\n            http://www.ecc-brainpool.org/download/draft_pkix_additional_ecc_dp.txt\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.TeleTrust.TeleTrusTNamedCurves.GetByOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the X9ECParameters object for the named curve represented by\r\n             the passed in object identifier. Null if the curve isn't present.\r\n            \r\n             @param oid an object identifier representing a named curve, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.TeleTrust.TeleTrusTNamedCurves.GetOid(System.String)\">\r\n             return the object identifier signified by the passed in name. Null\r\n             if there is no object identifier associated with name.\r\n            \r\n             @return the object identifier associated with name, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.TeleTrust.TeleTrusTNamedCurves.GetName(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return the named curve name represented by the given object identifier.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.TeleTrust.TeleTrusTNamedCurves.Names\">\r\n            returns an enumeration containing the name strings for curves\r\n            contained in this structure.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Tsp.Accuracy.ToAsn1Object\">\r\n            <pre>\r\n            Accuracy ::= SEQUENCE {\r\n                        seconds        INTEGER              OPTIONAL,\r\n                        millis     [0] INTEGER  (1..999)    OPTIONAL,\r\n                        micros     [1] INTEGER  (1..999)    OPTIONAL\r\n                        }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Tsp.MessageImprint.GetInstance(System.Object)\">\r\n            @param o\r\n            @return a MessageImprint object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Tsp.MessageImprint.ToAsn1Object\">\r\n            <pre>\r\n               MessageImprint ::= SEQUENCE  {\r\n                  hashAlgorithm                AlgorithmIdentifier,\r\n                  hashedMessage                OCTET STRING  }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Tsp.TimeStampReq.ToAsn1Object\">\r\n            <pre>\r\n            TimeStampReq ::= SEQUENCE  {\r\n             version                      INTEGER  { v1(1) },\r\n             messageImprint               MessageImprint,\r\n               --a hash algorithm OID and the hash value of the data to be\r\n               --time-stamped\r\n             reqPolicy             TSAPolicyId              OPTIONAL,\r\n             nonce                 INTEGER                  OPTIONAL,\r\n             certReq               BOOLEAN                  DEFAULT FALSE,\r\n             extensions            [0] IMPLICIT Extensions  OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Tsp.TimeStampResp.ToAsn1Object\">\r\n            <pre>\r\n            TimeStampResp ::= SEQUENCE  {\r\n              status                  PkiStatusInfo,\r\n              timeStampToken          TimeStampToken     OPTIONAL  }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Tsp.TstInfo.ToAsn1Object\">\r\n             <pre>\r\n            \r\n                 TstInfo ::= SEQUENCE  {\r\n                    version                      INTEGER  { v1(1) },\r\n                    policy                       TSAPolicyId,\r\n                    messageImprint               MessageImprint,\r\n                      -- MUST have the same value as the similar field in\r\n                      -- TimeStampReq\r\n                    serialNumber                 INTEGER,\r\n                     -- Time-Stamping users MUST be ready to accommodate integers\r\n                     -- up to 160 bits.\r\n                    genTime                      GeneralizedTime,\r\n                    accuracy                     Accuracy                 OPTIONAL,\r\n                    ordering                     BOOLEAN             DEFAULT FALSE,\r\n                    nonce                        INTEGER                  OPTIONAL,\r\n                      -- MUST be present if the similar field was present\r\n                      -- in TimeStampReq.  In that case it MUST have the same value.\r\n                    tsa                          [0] GeneralName          OPTIONAL,\r\n                    extensions                   [1] IMPLICIT Extensions   OPTIONAL  }\r\n            \r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Utilities.Asn1Dump.AsString(System.String,System.Boolean,Org.BouncyCastle.Asn1.Asn1Object,System.Text.StringBuilder)\">\r\n             dump a Der object as a formatted string with indentation\r\n            \r\n             @param obj the Asn1Object to be dumped out.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Utilities.Asn1Dump.DumpAsString(Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n             dump out a DER object as a formatted string, in non-verbose mode\r\n            \r\n             @param obj the Asn1Encodable to be dumped out.\r\n             @return  the resulting string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Utilities.Asn1Dump.DumpAsString(Org.BouncyCastle.Asn1.Asn1Encodable,System.Boolean)\">\r\n             Dump out the object as a string\r\n            \r\n             @param obj the Asn1Encodable to be dumped out.\r\n             @param verbose  if true, dump out the contents of octet and bit strings.\r\n             @return  the resulting string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X500.DirectoryString.ToAsn1Object\">\r\n            <pre>\r\n             DirectoryString ::= CHOICE {\r\n               teletexString               TeletexString (SIZE (1..MAX)),\r\n               printableString             PrintableString (SIZE (1..MAX)),\r\n               universalString             UniversalString (SIZE (1..MAX)),\r\n               utf8String                  UTF8String (SIZE (1..MAX)),\r\n               bmpString                   BMPString (SIZE (1..MAX))  }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.AccessDescription\">\r\n            The AccessDescription object.\r\n            <pre>\r\n            AccessDescription  ::=  SEQUENCE {\r\n                  accessMethod          OBJECT IDENTIFIER,\r\n                  accessLocation        GeneralName  }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AccessDescription.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n            create an AccessDescription with the oid and location provided.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.AccessDescription.AccessMethod\">\r\n            \r\n             @return the access method.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.AccessDescription.AccessLocation\">\r\n            \r\n             @return the access location\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n                 AlgorithmIdentifier ::= Sequence {\r\n                                       algorithm OBJECT IDENTIFIER,\r\n                                       parameters ANY DEFINED BY algorithm OPTIONAL }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttCertIssuer.#ctor(Org.BouncyCastle.Asn1.X509.GeneralNames)\">\r\n            <summary>\r\n            Don't use this one if you are trying to be RFC 3281 compliant.\r\n            Use it for v1 attribute certificates only.\r\n            </summary>\r\n            <param name=\"names\">Our GeneralNames structure</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttCertIssuer.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             AttCertIssuer ::= CHOICE {\r\n                  v1Form   GeneralNames,  -- MUST NOT be used in this\r\n                                          -- profile\r\n                  v2Form   [0] V2Form     -- v2 only\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttCertValidityPeriod.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             AttCertValidityPeriod  ::= Sequence {\r\n                  notBeforeTime  GeneralizedTime,\r\n                  notAfterTime   GeneralizedTime\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttributeX509.GetInstance(System.Object)\">\r\n             return an Attr object from the given object.\r\n            \r\n             @param o the object we want converted.\r\n             @exception ArgumentException if the object cannot be converted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttributeX509.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Attr ::= Sequence {\r\n                attrType OBJECT IDENTIFIER,\r\n                attrValues Set OF AttributeValue\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttributeCertificate.GetInstance(System.Object)\">\r\n            @param obj\r\n            @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttributeCertificate.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             AttributeCertificate ::= Sequence {\r\n                  acinfo               AttributeCertificateInfo,\r\n                  signatureAlgorithm   AlgorithmIdentifier,\r\n                  signatureValue       BIT STRING\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AttributeCertificateInfo.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <pre>\r\n              AttributeCertificateInfo ::= Sequence {\r\n                   version              AttCertVersion -- version is v2,\r\n                   holder               Holder,\r\n                   issuer               AttCertIssuer,\r\n                   signature            AlgorithmIdentifier,\r\n                   serialNumber         CertificateSerialNumber,\r\n                   attrCertValidityPeriod   AttCertValidityPeriod,\r\n                   attributes           Sequence OF Attr,\r\n                   issuerUniqueID       UniqueIdentifier OPTIONAL,\r\n                   extensions           Extensions OPTIONAL\r\n              }\r\n            \r\n              AttCertVersion ::= Integer { v2(1) }\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.AuthorityInformationAccess\">\r\n             The AuthorityInformationAccess object.\r\n             <pre>\r\n             id-pe-authorityInfoAccess OBJECT IDENTIFIER ::= { id-pe 1 }\r\n            \r\n             AuthorityInfoAccessSyntax  ::=\r\n                  Sequence SIZE (1..MAX) OF AccessDescription\r\n             AccessDescription  ::=  Sequence {\r\n                   accessMethod          OBJECT IDENTIFIER,\r\n                   accessLocation        GeneralName  }\r\n            \r\n             id-ad OBJECT IDENTIFIER ::= { id-pkix 48 }\r\n             id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 }\r\n             id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityInformationAccess.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n            create an AuthorityInformationAccess with the oid and location provided.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier\">\r\n             The AuthorityKeyIdentifier object.\r\n             <pre>\r\n             id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }\r\n            \r\n               AuthorityKeyIdentifier ::= Sequence {\r\n                  keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,\r\n                  authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,\r\n                  authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }\r\n            \r\n               KeyIdentifier ::= OCTET STRING\r\n             </pre>\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier.#ctor(Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo)\">\r\n                     *\r\n                     * Calulates the keyidentifier using a SHA1 hash over the BIT STRING\r\n                     * from SubjectPublicKeyInfo as defined in RFC2459.\r\n                     *\r\n                     * Example of making a AuthorityKeyIdentifier:\r\n                     * <pre>\r\n            \t     *   SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(\r\n            \t\t *       publicKey.getEncoded()).readObject());\r\n                     *   AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);\r\n                     * </pre>\r\n                     *\r\n                     *\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier.#ctor(Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo,Org.BouncyCastle.Asn1.X509.GeneralNames,Org.BouncyCastle.Math.BigInteger)\">\r\n            create an AuthorityKeyIdentifier with the GeneralNames tag and\r\n            the serial number provided as well.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier.#ctor(Org.BouncyCastle.Asn1.X509.GeneralNames,Org.BouncyCastle.Math.BigInteger)\">\r\n            create an AuthorityKeyIdentifier with the GeneralNames tag and\r\n            the serial number provided.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier.#ctor(System.Byte[])\">\r\n            create an AuthorityKeyIdentifier with a precomputed key identifier\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier.#ctor(System.Byte[],Org.BouncyCastle.Asn1.X509.GeneralNames,Org.BouncyCastle.Math.BigInteger)\">\r\n            create an AuthorityKeyIdentifier with a precomupted key identifier\r\n            and the GeneralNames tag and the serial number provided as well.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.AuthorityKeyIdentifier.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.BasicConstraints.#ctor(System.Int32)\">\r\n             create a cA=true object for the given path length constraint.\r\n            \r\n             @param pathLenConstraint\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.BasicConstraints.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            BasicConstraints := Sequence {\r\n               cA                  Boolean DEFAULT FALSE,\r\n               pathLenConstraint   Integer (0..MAX) OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.CertificateList\">\r\n             PKIX RFC-2459\r\n            \r\n             The X.509 v2 CRL syntax is as follows.  For signature calculation,\r\n             the data that is to be signed is ASN.1 Der encoded.\r\n            \r\n             <pre>\r\n             CertificateList  ::=  Sequence  {\r\n                  tbsCertList          TbsCertList,\r\n                  signatureAlgorithm   AlgorithmIdentifier,\r\n                  signatureValue       BIT STRING  }\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.CertificatePair\">\r\n             This class helps to support crossCerfificatePairs in a LDAP directory\r\n             according RFC 2587\r\n            \r\n             <pre>\r\n                 crossCertificatePairATTRIBUTE::={\r\n                   WITH SYNTAX   CertificatePair\r\n                   EQUALITY MATCHING RULE certificatePairExactMatch\r\n                   ID joint-iso-ccitt(2) ds(5) attributeType(4) crossCertificatePair(40)}\r\n             </pre>\r\n            \r\n             <blockquote> The forward elements of the crossCertificatePair attribute of a\r\n             CA's directory entry shall be used to store all, except self-issued\r\n             certificates issued to this CA. Optionally, the reverse elements of the\r\n             crossCertificatePair attribute, of a CA's directory entry may contain a\r\n             subset of certificates issued by this CA to other CAs. When both the forward\r\n             and the reverse elements are present in a single attribute value, issuer name\r\n             in one certificate shall match the subject name in the other and vice versa,\r\n             and the subject public key in one certificate shall be capable of verifying\r\n             the digital signature on the other certificate and vice versa.\r\n            \r\n             When a reverse element is present, the forward element value and the reverse\r\n             element value need not be stored in the same attribute value; in other words,\r\n             they can be stored in either a single attribute value or two attribute\r\n             values. </blockquote>\r\n            \r\n             <pre>\r\n                   CertificatePair ::= SEQUENCE {\r\n                     forward\t\t[0]\tCertificate OPTIONAL,\r\n                     reverse\t\t[1]\tCertificate OPTIONAL,\r\n                     -- at least one of the pair shall be present -- }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CertificatePair.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type CertificatePair:\r\n             <p/>\r\n             <pre>\r\n                   CertificatePair ::= SEQUENCE {\r\n                     forward\t\t[0]\tCertificate OPTIONAL,\r\n                     reverse\t\t[1]\tCertificate OPTIONAL,\r\n                     -- at least one of the pair shall be present -- }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CertificatePair.#ctor(Org.BouncyCastle.Asn1.X509.X509CertificateStructure,Org.BouncyCastle.Asn1.X509.X509CertificateStructure)\">\r\n             Constructor from a given details.\r\n            \r\n             @param forward Certificates issued to this CA.\r\n             @param reverse Certificates issued by this CA to other CAs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CertificatePair.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                   CertificatePair ::= SEQUENCE {\r\n                     forward\t\t[0]\tCertificate OPTIONAL,\r\n                     reverse\t\t[1]\tCertificate OPTIONAL,\r\n                     -- at least one of the pair shall be present -- }\r\n             </pre>\r\n            \r\n             @return a DERObject\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.CertificatePair.Forward\">\r\n            @return Returns the forward.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.CertificatePair.Reverse\">\r\n            @return Returns the reverse.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CertificatePolicies.#ctor(Org.BouncyCastle.Asn1.X509.PolicyInformation)\">\r\n            Construct a CertificatePolicies object containing one PolicyInformation.\r\n            \r\n            @param name the name to be contained.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CertificatePolicies.ToAsn1Object\">\r\n            Produce an object suitable for an ASN1OutputStream.\r\n            <pre>\r\n            CertificatePolicies ::= SEQUENCE SIZE {1..MAX} OF PolicyInformation\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.CertPolicyID\">\r\n             CertPolicyId, used in the CertificatePolicies and PolicyMappings\r\n             X509V3 Extensions.\r\n            \r\n             <pre>\r\n                 CertPolicyId ::= OBJECT IDENTIFIER\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CrlDistPoint.GetDistributionPoints\">\r\n             Return the distribution points making up the sequence.\r\n            \r\n             @return DistributionPoint[]\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.CrlDistPoint.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            CrlDistPoint ::= Sequence SIZE {1..MAX} OF DistributionPoint\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.CrlNumber\">\r\n            The CRLNumber object.\r\n            <pre>\r\n            CRLNumber::= Integer(0..MAX)\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.CrlReason\">\r\n            The CRLReason enumeration.\r\n            <pre>\r\n            CRLReason ::= Enumerated {\r\n             unspecified             (0),\r\n             keyCompromise           (1),\r\n             cACompromise            (2),\r\n             affiliationChanged      (3),\r\n             superseded              (4),\r\n             cessationOfOperation    (5),\r\n             certificateHold         (6),\r\n             removeFromCRL           (8),\r\n             privilegeWithdrawn      (9),\r\n             aACompromise           (10)\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.DigestInfo\">\r\n            The DigestInfo object.\r\n            <pre>\r\n            DigestInfo::=Sequence{\r\n                     digestAlgorithm  AlgorithmIdentifier,\r\n                     digest OCTET STRING }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.DisplayText\">\r\n             <code>DisplayText</code> class, used in\r\n             <code>CertificatePolicies</code> X509 V3 extensions (in policy qualifiers).\r\n            \r\n             <p>It stores a string in a chosen encoding.\r\n             <pre>\r\n             DisplayText ::= CHOICE {\r\n                  ia5String        IA5String      (SIZE (1..200)),\r\n                  visibleString    VisibleString  (SIZE (1..200)),\r\n                  bmpString        BMPString      (SIZE (1..200)),\r\n                  utf8String       UTF8String     (SIZE (1..200)) }\r\n             </pre></p>\r\n             @see PolicyQualifierInfo\r\n             @see PolicyInformation\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.DisplayText.ContentTypeIA5String\">\r\n             Constant corresponding to ia5String encoding.\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.DisplayText.ContentTypeBmpString\">\r\n             Constant corresponding to bmpString encoding.\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.DisplayText.ContentTypeUtf8String\">\r\n             Constant corresponding to utf8String encoding.\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.DisplayText.ContentTypeVisibleString\">\r\n             Constant corresponding to visibleString encoding.\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.DisplayText.DisplayTextMaximumSize\">\r\n             Describe constant <code>DisplayTextMaximumSize</code> here.\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.DisplayText.#ctor(System.Int32,System.String)\">\r\n             Creates a new <code>DisplayText</code> instance.\r\n            \r\n             @param type the desired encoding type for the text.\r\n             @param text the text to store. Strings longer than 200\r\n             characters are truncated.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.DisplayText.#ctor(System.String)\">\r\n             Creates a new <code>DisplayText</code> instance.\r\n            \r\n             @param text the text to encapsulate. Strings longer than 200\r\n             characters are truncated.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.DisplayText.#ctor(Org.BouncyCastle.Asn1.IAsn1String)\">\r\n             Creates a new <code>DisplayText</code> instance.\r\n             <p>Useful when reading back a <code>DisplayText</code> class\r\n             from it's Asn1Encodable form.</p>\r\n            \r\n             @param contents an <code>Asn1Encodable</code> instance.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.DisplayText.GetString\">\r\n             Returns the stored <code>string</code> object.\r\n            \r\n             @return the stored text as a <code>string</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.DistributionPoint\">\r\n            The DistributionPoint object.\r\n            <pre>\r\n            DistributionPoint ::= Sequence {\r\n                 distributionPoint [0] DistributionPointName OPTIONAL,\r\n                 reasons           [1] ReasonFlags OPTIONAL,\r\n                 cRLIssuer         [2] GeneralNames OPTIONAL\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.DistributionPointName\">\r\n            The DistributionPointName object.\r\n            <pre>\r\n            DistributionPointName ::= CHOICE {\r\n                fullName                 [0] GeneralNames,\r\n                nameRelativeToCRLIssuer  [1] RDN\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.ExtendedKeyUsage\">\r\n            The extendedKeyUsage object.\r\n            <pre>\r\n                 extendedKeyUsage ::= Sequence SIZE (1..MAX) OF KeyPurposeId\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.ExtendedKeyUsage.GetAllUsages\">\r\n            Returns all extended key usages.\r\n            The returned ArrayList contains DerObjectIdentifier instances.\r\n            @return An ArrayList with all key purposes.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.GeneralName\">\r\n             The GeneralName object.\r\n             <pre>\r\n             GeneralName ::= CHOICE {\r\n                  otherName                       [0]     OtherName,\r\n                  rfc822Name                      [1]     IA5String,\r\n                  dNSName                         [2]     IA5String,\r\n                  x400Address                     [3]     ORAddress,\r\n                  directoryName                   [4]     Name,\r\n                  ediPartyName                    [5]     EDIPartyName,\r\n                  uniformResourceIdentifier       [6]     IA5String,\r\n                  iPAddress                       [7]     OCTET STRING,\r\n                  registeredID                    [8]     OBJECT IDENTIFIER}\r\n            \r\n             OtherName ::= Sequence {\r\n                  type-id    OBJECT IDENTIFIER,\r\n                  value      [0] EXPLICIT ANY DEFINED BY type-id }\r\n            \r\n             EDIPartyName ::= Sequence {\r\n                  nameAssigner            [0]     DirectoryString OPTIONAL,\r\n                  partyName               [1]     DirectoryString }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.GeneralName.#ctor(Org.BouncyCastle.Asn1.Asn1Object,System.Int32)\">\r\n             When the subjectAltName extension contains an Internet mail address,\r\n             the address MUST be included as an rfc822Name. The format of an\r\n             rfc822Name is an \"addr-spec\" as defined in RFC 822 [RFC 822].\r\n            \r\n             When the subjectAltName extension contains a domain name service\r\n             label, the domain name MUST be stored in the dNSName (an IA5String).\r\n             The name MUST be in the \"preferred name syntax,\" as specified by RFC\r\n             1034 [RFC 1034].\r\n            \r\n             When the subjectAltName extension contains a URI, the name MUST be\r\n             stored in the uniformResourceIdentifier (an IA5String). The name MUST\r\n             be a non-relative URL, and MUST follow the URL syntax and encoding\r\n             rules specified in [RFC 1738].  The name must include both a scheme\r\n             (e.g., \"http\" or \"ftp\") and a scheme-specific-part.  The scheme-\r\n             specific-part must include a fully qualified domain name or IP\r\n             address as the host.\r\n            \r\n             When the subjectAltName extension contains a iPAddress, the address\r\n             MUST be stored in the octet string in \"network byte order,\" as\r\n             specified in RFC 791 [RFC 791]. The least significant bit (LSB) of\r\n             each octet is the LSB of the corresponding byte in the network\r\n             address. For IP Version 4, as specified in RFC 791, the octet string\r\n             MUST contain exactly four octets.  For IP Version 6, as specified in\r\n             RFC 1883, the octet string MUST contain exactly sixteen octets [RFC\r\n             1883].\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.GeneralName.#ctor(System.Int32,System.String)\">\r\n             Create a GeneralName for the given tag from the passed in string.\r\n             <p>\r\n             This constructor can handle:\r\n             <ul>\r\n             <li>rfc822Name</li>\r\n             <li>iPAddress</li>\r\n             <li>directoryName</li>\r\n             <li>dNSName</li>\r\n             <li>uniformResourceIdentifier</li>\r\n             <li>registeredID</li>\r\n             </ul>\r\n             For x400Address, otherName and ediPartyName there is no common string\r\n             format defined.\r\n             </p><p>\r\n             Note: A directory name can be encoded in different ways into a byte\r\n             representation. Be aware of this if the byte representation is used for\r\n             comparing results.\r\n             </p>\r\n            \r\n             @param tag tag number\r\n             @param name string representation of name\r\n             @throws ArgumentException if the string encoding is not correct or\r\n                         not supported.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.GeneralNames.#ctor(Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n            <summary>Construct a GeneralNames object containing one GeneralName.</summary>\r\n            <param name=\"name\">The name to be contained.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.GeneralNames.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            GeneralNames ::= Sequence SIZE {1..MAX} OF GeneralName\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.GeneralSubtree\">\r\n             Class for containing a restriction object subtrees in NameConstraints. See\r\n             RFC 3280.\r\n            \r\n             <pre>\r\n            \r\n                   GeneralSubtree ::= SEQUENCE\r\n                   {\r\n                     baseName                    GeneralName,\r\n                     minimum         [0]     BaseDistance DEFAULT 0,\r\n                     maximum         [1]     BaseDistance OPTIONAL\r\n                   }\r\n             </pre>\r\n            \r\n             @see org.bouncycastle.asn1.x509.NameConstraints\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.GeneralSubtree.#ctor(Org.BouncyCastle.Asn1.X509.GeneralName,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n             Constructor from a given details.\r\n            \r\n             According RFC 3280, the minimum and maximum fields are not used with any\r\n             name forms, thus minimum MUST be zero, and maximum MUST be absent.\r\n             <p>\r\n             If minimum is <code>null</code>, zero is assumed, if\r\n             maximum is <code>null</code>, maximum is absent.</p>\r\n            \r\n             @param baseName\r\n                        A restriction.\r\n             @param minimum\r\n                        Minimum\r\n            \r\n             @param maximum\r\n                        Maximum\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.GeneralSubtree.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n            \r\n             Returns:\r\n            \r\n             <pre>\r\n                   GeneralSubtree ::= SEQUENCE\r\n                   {\r\n                     baseName                    GeneralName,\r\n                     minimum         [0]     BaseDistance DEFAULT 0,\r\n                     maximum         [1]     BaseDistance OPTIONAL\r\n                   }\r\n             </pre>\r\n            \r\n             @return a DERObject\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Holder\">\r\n            The Holder object.\r\n            <p>\r\n            For an v2 attribute certificate this is:\r\n            \r\n            <pre>\r\n                       Holder ::= SEQUENCE {\r\n                             baseCertificateID   [0] IssuerSerial OPTIONAL,\r\n                                      -- the issuer and serial number of\r\n                                      -- the holder's Public Key Certificate\r\n                             entityName          [1] GeneralNames OPTIONAL,\r\n                                      -- the name of the claimant or role\r\n                             objectDigestInfo    [2] ObjectDigestInfo OPTIONAL\r\n                                      -- used to directly authenticate the holder,\r\n                                      -- for example, an executable\r\n                       }\r\n            </pre>\r\n            </p>\r\n            <p>\r\n            For an v1 attribute certificate this is:\r\n            \r\n            <pre>\r\n                    subject CHOICE {\r\n                     baseCertificateID [0] IssuerSerial,\r\n                     -- associated with a Public Key Certificate\r\n                     subjectName [1] GeneralNames },\r\n                     -- associated with a name\r\n            </pre>\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.#ctor(Org.BouncyCastle.Asn1.Asn1TaggedObject)\">\r\n            Constructor for a holder for an v1 attribute certificate.\r\n            \r\n            @param tagObj The ASN.1 tagged holder object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Constructor for a holder for an v2 attribute certificate. *\r\n            \r\n            @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.#ctor(Org.BouncyCastle.Asn1.X509.IssuerSerial,System.Int32)\">\r\n            Constructs a holder from a IssuerSerial.\r\n            @param baseCertificateID The IssuerSerial.\r\n            @param version The version of the attribute certificate. \r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.Holder.Version\">\r\n            Returns 1 for v2 attribute certificates or 0 for v1 attribute\r\n            certificates. \r\n            @return The version of the attribute certificate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.#ctor(Org.BouncyCastle.Asn1.X509.GeneralNames)\">\r\n            Constructs a holder with an entityName for v2 attribute certificates or\r\n            with a subjectName for v1 attribute certificates.\r\n            \r\n            @param entityName The entity or subject name.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.#ctor(Org.BouncyCastle.Asn1.X509.GeneralNames,System.Int32)\">\r\n            Constructs a holder with an entityName for v2 attribute certificates or\r\n            with a subjectName for v1 attribute certificates.\r\n            \r\n            @param entityName The entity or subject name.\r\n            @param version The version of the attribute certificate. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.#ctor(Org.BouncyCastle.Asn1.X509.ObjectDigestInfo)\">\r\n            Constructs a holder from an object digest info.\r\n            \r\n            @param objectDigestInfo The object digest info object.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.Holder.EntityName\">\r\n            Returns the entityName for an v2 attribute certificate or the subjectName\r\n            for an v1 attribute certificate.\r\n            \r\n            @return The entityname or subjectname.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Holder.ToAsn1Object\">\r\n            The Holder object.\r\n            <pre>\r\n             Holder ::= Sequence {\r\n                   baseCertificateID   [0] IssuerSerial OPTIONAL,\r\n                            -- the issuer and serial number of\r\n                            -- the holder's Public Key Certificate\r\n                   entityName          [1] GeneralNames OPTIONAL,\r\n                            -- the name of the claimant or role\r\n                   objectDigestInfo    [2] ObjectDigestInfo OPTIONAL\r\n                            -- used to directly authenticate the holder,\r\n                            -- for example, an executable\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.IetfAttrSyntax\">\r\n            Implementation of <code>IetfAttrSyntax</code> as specified by RFC3281.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.IetfAttrSyntax.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.IetfAttrSyntax.ToAsn1Object\">\r\n            \r\n             <pre>\r\n            \r\n              IetfAttrSyntax ::= Sequence {\r\n                policyAuthority [0] GeneralNames OPTIONAL,\r\n                values Sequence OF CHOICE {\r\n                  octets OCTET STRING,\r\n                  oid OBJECT IDENTIFIER,\r\n                  string UTF8String\r\n                }\r\n              }\r\n            \r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.IssuerSerial.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             IssuerSerial  ::=  Sequence {\r\n                  issuer         GeneralNames,\r\n                  serial         CertificateSerialNumber,\r\n                  issuerUid      UniqueIdentifier OPTIONAL\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.IssuingDistributionPoint\">\r\n            <pre>\r\n            IssuingDistributionPoint ::= SEQUENCE { \r\n              distributionPoint          [0] DistributionPointName OPTIONAL, \r\n              onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE, \r\n              onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE, \r\n              onlySomeReasons            [3] ReasonFlags OPTIONAL, \r\n              indirectCRL                [4] BOOLEAN DEFAULT FALSE,\r\n              onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.IssuingDistributionPoint.#ctor(Org.BouncyCastle.Asn1.X509.DistributionPointName,System.Boolean,System.Boolean,Org.BouncyCastle.Asn1.X509.ReasonFlags,System.Boolean,System.Boolean)\">\r\n            Constructor from given details.\r\n            \r\n            @param distributionPoint\r\n                       May contain an URI as pointer to most current CRL.\r\n            @param onlyContainsUserCerts Covers revocation information for end certificates.\r\n            @param onlyContainsCACerts Covers revocation information for CA certificates.\r\n            \r\n            @param onlySomeReasons\r\n                       Which revocation reasons does this point cover.\r\n            @param indirectCRL\r\n                       If <code>true</code> then the CRL contains revocation\r\n                       information about certificates ssued by other CAs.\r\n            @param onlyContainsAttributeCerts Covers revocation information for attribute certificates.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.IssuingDistributionPoint.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Constructor from Asn1Sequence\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.IssuingDistributionPoint.DistributionPoint\">\r\n            @return Returns the distributionPoint.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.IssuingDistributionPoint.OnlySomeReasons\">\r\n            @return Returns the onlySomeReasons.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.KeyPurposeID\">\r\n            The KeyPurposeID object.\r\n            <pre>\r\n                KeyPurposeID ::= OBJECT IDENTIFIER\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.KeyUsage\">\r\n             The KeyUsage object.\r\n             <pre>\r\n                id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }\r\n            \r\n                KeyUsage ::= BIT STRING {\r\n                     digitalSignature        (0),\r\n                     nonRepudiation          (1),\r\n                     keyEncipherment         (2),\r\n                     dataEncipherment        (3),\r\n                     keyAgreement            (4),\r\n                     keyCertSign             (5),\r\n                     cRLSign                 (6),\r\n                     encipherOnly            (7),\r\n                     decipherOnly            (8) }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.KeyUsage.#ctor(System.Int32)\">\r\n             Basic constructor.\r\n            \r\n             @param usage - the bitwise OR of the Key Usage flags giving the\r\n             allowed uses for the key.\r\n             e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.NameConstraints.#ctor(System.Collections.IList,System.Collections.IList)\">\r\n             Constructor from a given details.\r\n            \r\n             <p>permitted and excluded are Vectors of GeneralSubtree objects.</p>\r\n            \r\n             @param permitted Permitted subtrees\r\n             @param excluded Excluded subtrees\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.NoticeReference\">\r\n             <code>NoticeReference</code> class, used in\r\n             <code>CertificatePolicies</code> X509 V3 extensions\r\n             (in policy qualifiers).\r\n            \r\n             <pre>\r\n              NoticeReference ::= Sequence {\r\n                  organization     DisplayText,\r\n                  noticeNumbers    Sequence OF Integer }\r\n            \r\n             </pre>\r\n            \r\n             @see PolicyQualifierInfo\r\n             @see PolicyInformation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.NoticeReference.#ctor(System.String,System.Collections.IList)\">\r\n             Creates a new <code>NoticeReference</code> instance.\r\n            \r\n             @param orgName a <code>string</code> value\r\n             @param numbers a <code>ArrayList</code> value\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.NoticeReference.#ctor(System.String,Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>NoticeReference</code> instance.\r\n            \r\n             @param orgName a <code>string</code> value\r\n             @param numbers an <code>Asn1Sequence</code> value\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.NoticeReference.#ctor(System.Int32,System.String,Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>NoticeReference</code> instance.\r\n            \r\n             @param displayTextType an <code>int</code> value\r\n             @param orgName a <code>string</code> value\r\n             @param numbers an <code>Asn1Sequence</code> value\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.NoticeReference.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>NoticeReference</code> instance.\r\n             <p>Useful for reconstructing a <code>NoticeReference</code>\r\n             instance from its encodable/encoded form.</p>\r\n            \r\n             @param as an <code>Asn1Sequence</code> value obtained from either\r\n             calling @{link ToAsn1Object()} for a <code>NoticeReference</code>\r\n             instance or from parsing it from a Der-encoded stream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.NoticeReference.ToAsn1Object\">\r\n             Describe <code>ToAsn1Object</code> method here.\r\n            \r\n             @return a <code>Asn1Object</code> value\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.ObjectDigestInfo\">\r\n            ObjectDigestInfo ASN.1 structure used in v2 attribute certificates.\r\n            \r\n            <pre>\r\n             \r\n               ObjectDigestInfo ::= SEQUENCE {\r\n                    digestedObjectType  ENUMERATED {\r\n                            publicKey            (0),\r\n                            publicKeyCert        (1),\r\n                            otherObjectTypes     (2) },\r\n                                    -- otherObjectTypes MUST NOT\r\n                                    -- be used in this profile\r\n                    otherObjectTypeID   OBJECT IDENTIFIER OPTIONAL,\r\n                    digestAlgorithm     AlgorithmIdentifier,\r\n                    objectDigest        BIT STRING\r\n               }\r\n              \r\n            </pre>\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.ObjectDigestInfo.PublicKey\">\r\n            The public key is hashed.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.ObjectDigestInfo.PublicKeyCert\">\r\n            The public key certificate is hashed.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.ObjectDigestInfo.OtherObjectDigest\">\r\n            An other object is hashed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.ObjectDigestInfo.#ctor(System.Int32,System.String,Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier,System.Byte[])\">\r\n            Constructor from given details.\r\n            <p>\r\n            If <code>digestedObjectType</code> is not {@link #publicKeyCert} or\r\n            {@link #publicKey} <code>otherObjectTypeID</code> must be given,\r\n            otherwise it is ignored.</p>\r\n            \r\n            @param digestedObjectType The digest object type.\r\n            @param otherObjectTypeID The object type ID for\r\n                       <code>otherObjectDigest</code>.\r\n            @param digestAlgorithm The algorithm identifier for the hash.\r\n            @param objectDigest The hash value.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.ObjectDigestInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            \r\n            <pre>\r\n             \r\n               ObjectDigestInfo ::= SEQUENCE {\r\n                    digestedObjectType  ENUMERATED {\r\n                            publicKey            (0),\r\n                            publicKeyCert        (1),\r\n                            otherObjectTypes     (2) },\r\n                                    -- otherObjectTypes MUST NOT\r\n                                    -- be used in this profile\r\n                    otherObjectTypeID   OBJECT IDENTIFIER OPTIONAL,\r\n                    digestAlgorithm     AlgorithmIdentifier,\r\n                    objectDigest        BIT STRING\r\n               }\r\n              \r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.PolicyMappings\">\r\n             PolicyMappings V3 extension, described in RFC3280.\r\n             <pre>\r\n                PolicyMappings ::= Sequence SIZE (1..MAX) OF Sequence {\r\n                  issuerDomainPolicy      CertPolicyId,\r\n                  subjectDomainPolicy     CertPolicyId }\r\n             </pre>\r\n            \r\n             @see <a href=\"http://www.faqs.org/rfc/rfc3280.txt\">RFC 3280, section 4.2.1.6</a>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.PolicyMappings.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>PolicyMappings</code> instance.\r\n            \r\n             @param seq an <code>Asn1Sequence</code> constructed as specified\r\n             in RFC 3280\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.PolicyMappings.#ctor(System.Collections.IDictionary)\">\r\n             Creates a new <code>PolicyMappings</code> instance.\r\n            \r\n             @param mappings a <code>HashMap</code> value that maps\r\n             <code>string</code> oids\r\n             to other <code>string</code> oids.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.PolicyQualifierID\">\r\n             PolicyQualifierId, used in the CertificatePolicies\r\n             X509V3 extension.\r\n            \r\n             <pre>\r\n                id-qt          OBJECT IDENTIFIER ::=  { id-pkix 2 }\r\n                id-qt-cps      OBJECT IDENTIFIER ::=  { id-qt 1 }\r\n                id-qt-unotice  OBJECT IDENTIFIER ::=  { id-qt 2 }\r\n              PolicyQualifierId ::=\r\n                   OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.PolicyQualifierInfo\">\r\n             Policy qualifiers, used in the X509V3 CertificatePolicies\r\n             extension.\r\n            \r\n             <pre>\r\n               PolicyQualifierInfo ::= Sequence {\r\n                   policyQualifierId  PolicyQualifierId,\r\n                   qualifier          ANY DEFINED BY policyQualifierId }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.PolicyQualifierInfo.#ctor(Org.BouncyCastle.Asn1.DerObjectIdentifier,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n             Creates a new <code>PolicyQualifierInfo</code> instance.\r\n            \r\n             @param policyQualifierId a <code>PolicyQualifierId</code> value\r\n             @param qualifier the qualifier, defined by the above field.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.PolicyQualifierInfo.#ctor(System.String)\">\r\n             Creates a new <code>PolicyQualifierInfo</code> containing a\r\n             cPSuri qualifier.\r\n            \r\n             @param cps the CPS (certification practice statement) uri as a\r\n             <code>string</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.PolicyQualifierInfo.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>PolicyQualifierInfo</code> instance.\r\n            \r\n             @param as <code>PolicyQualifierInfo</code> X509 structure\r\n             encoded as an Asn1Sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.PolicyQualifierInfo.ToAsn1Object\">\r\n             Returns a Der-encodable representation of this instance.\r\n            \r\n             @return a <code>Asn1Object</code> value\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.PrivateKeyUsagePeriod\">\r\n            <remarks>\r\n            <pre>\r\n            PrivateKeyUsagePeriod ::= SEQUENCE\r\n            {\r\n            notBefore       [0]     GeneralizedTime OPTIONAL,\r\n            notAfter        [1]     GeneralizedTime OPTIONAL }\r\n            </pre>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Qualified.BiometricData\">\r\n            The BiometricData object.\r\n            <pre>\r\n            BiometricData  ::=  SEQUENCE {\r\n                  typeOfBiometricData  TypeOfBiometricData,\r\n                  hashAlgorithm        AlgorithmIdentifier,\r\n                  biometricDataHash    OCTET STRING,\r\n                  sourceDataUri        IA5String OPTIONAL  }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Qualified.Iso4217CurrencyCode\">\r\n            The Iso4217CurrencyCode object.\r\n            <pre>\r\n            Iso4217CurrencyCode  ::=  CHOICE {\r\n                  alphabetic              PrintableString (SIZE 3), --Recommended\r\n                  numeric              INTEGER (1..999) }\r\n            -- Alphabetic or numeric currency code as defined in ISO 4217\r\n            -- It is recommended that the Alphabetic form is used\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Qualified.MonetaryValue\">\r\n            The MonetaryValue object.\r\n            <pre>\r\n            MonetaryValue  ::=  SEQUENCE {\r\n                  currency              Iso4217CurrencyCode,\r\n                  amount               INTEGER,\r\n                  exponent             INTEGER }\r\n            -- value = amount * 10^exponent\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Qualified.QCStatement\">\r\n            The QCStatement object.\r\n            <pre>\r\n            QCStatement ::= SEQUENCE {\r\n              statementId        OBJECT IDENTIFIER,\r\n              statementInfo      ANY DEFINED BY statementId OPTIONAL}\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Qualified.SemanticsInformation\">\r\n             The SemanticsInformation object.\r\n             <pre>\r\n                   SemanticsInformation ::= SEQUENCE {\r\n                     semanticsIdentifier        OBJECT IDENTIFIER   OPTIONAL,\r\n                     nameRegistrationAuthorities NameRegistrationAuthorities\r\n                                                                     OPTIONAL }\r\n                     (WITH COMPONENTS {..., semanticsIdentifier PRESENT}|\r\n                      WITH COMPONENTS {..., nameRegistrationAuthorities PRESENT})\r\n            \r\n                 NameRegistrationAuthorities ::=  SEQUENCE SIZE (1..MAX) OF\r\n                     GeneralName\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Qualified.TypeOfBiometricData\">\r\n             The TypeOfBiometricData object.\r\n             <pre>\r\n             TypeOfBiometricData ::= CHOICE {\r\n               predefinedBiometricType   PredefinedBiometricType,\r\n               biometricDataOid          OBJECT IDENTIFIER }\r\n            \r\n             PredefinedBiometricType ::= INTEGER {\r\n               picture(0),handwritten-signature(1)}\r\n               (picture|handwritten-signature)\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.ReasonFlags\">\r\n            The ReasonFlags object.\r\n            <pre>\r\n            ReasonFlags ::= BIT STRING {\r\n               unused(0),\r\n               keyCompromise(1),\r\n               cACompromise(2),\r\n               affiliationChanged(3),\r\n               superseded(4),\r\n               cessationOfOperation(5),\r\n               certficateHold(6)\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.ReasonFlags.#ctor(System.Int32)\">\r\n            @param reasons - the bitwise OR of the Key Reason flags giving the\r\n            allowed uses for the key.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.RoleSyntax\">\r\n             Implementation of the RoleSyntax object as specified by the RFC3281.\r\n            \r\n             <pre>\r\n             RoleSyntax ::= SEQUENCE {\r\n                             roleAuthority  [0] GeneralNames OPTIONAL,\r\n                             roleName       [1] GeneralName\r\n                       }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.GetInstance(System.Object)\">\r\n            RoleSyntax factory method.\r\n            @param obj the object used to construct an instance of <code>\r\n            RoleSyntax</code>. It must be an instance of <code>RoleSyntax\r\n            </code> or <code>Asn1Sequence</code>.\r\n            @return the instance of <code>RoleSyntax</code> built from the\r\n            supplied object.\r\n            @throws java.lang.ArgumentException if the object passed\r\n            to the factory is not an instance of <code>RoleSyntax</code> or\r\n            <code>Asn1Sequence</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.#ctor(Org.BouncyCastle.Asn1.X509.GeneralNames,Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n            Constructor.\r\n            @param roleAuthority the role authority of this RoleSyntax.\r\n            @param roleName    the role name of this RoleSyntax.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.#ctor(Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n            Constructor. Invoking this constructor is the same as invoking\r\n            <code>new RoleSyntax(null, roleName)</code>.\r\n            @param roleName    the role name of this RoleSyntax.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.#ctor(System.String)\">\r\n            Utility constructor. Takes a <code>string</code> argument representing\r\n            the role name, builds a <code>GeneralName</code> to hold the role name\r\n            and calls the constructor that takes a <code>GeneralName</code>.\r\n            @param roleName\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Constructor that builds an instance of <code>RoleSyntax</code> by\r\n            extracting the encoded elements from the <code>Asn1Sequence</code>\r\n            object supplied.\r\n            @param seq    an instance of <code>Asn1Sequence</code> that holds\r\n            the encoded elements used to build this <code>RoleSyntax</code>.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.RoleSyntax.RoleAuthority\">\r\n            Gets the role authority of this RoleSyntax.\r\n            @return    an instance of <code>GeneralNames</code> holding the\r\n            role authority of this RoleSyntax.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.RoleSyntax.RoleName\">\r\n            Gets the role name of this RoleSyntax.\r\n            @return    an instance of <code>GeneralName</code> holding the\r\n            role name of this RoleSyntax.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.GetRoleNameAsString\">\r\n            Gets the role name as a <code>java.lang.string</code> object.\r\n            @return    the role name of this RoleSyntax represented as a\r\n            <code>string</code> object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.GetRoleAuthorityAsString\">\r\n            Gets the role authority as a <code>string[]</code> object.\r\n            @return the role authority of this RoleSyntax represented as a\r\n            <code>string[]</code> array.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RoleSyntax.ToAsn1Object\">\r\n             Implementation of the method <code>ToAsn1Object</code> as\r\n             required by the superclass <code>ASN1Encodable</code>.\r\n            \r\n             <pre>\r\n             RoleSyntax ::= SEQUENCE {\r\n                             roleAuthority  [0] GeneralNames OPTIONAL,\r\n                             roleName       [1] GeneralName\r\n                       }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.RsaPublicKeyStructure.ToAsn1Object\">\r\n            This outputs the key in Pkcs1v2 format.\r\n            <pre>\r\n                 RSAPublicKey ::= Sequence {\r\n                                     modulus Integer, -- n\r\n                                     publicExponent Integer, -- e\r\n                                 }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym\">\r\n            Structure for a name or pseudonym.\r\n            \r\n            <pre>\r\n                  NameOrPseudonym ::= CHOICE {\r\n                \t   surAndGivenName SEQUENCE {\r\n                \t     surName DirectoryString,\r\n                \t     givenName SEQUENCE OF DirectoryString \r\n                    },\r\n                \t   pseudonym DirectoryString \r\n                  }\r\n            </pre>\r\n            \r\n            @see org.bouncycastle.asn1.x509.sigi.PersonalData\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym.#ctor(Org.BouncyCastle.Asn1.X500.DirectoryString)\">\r\n            Constructor from DERString.\r\n            <p/>\r\n            The sequence is of type NameOrPseudonym:\r\n            <p/>\r\n            <pre>\r\n                  NameOrPseudonym ::= CHOICE {\r\n                \t   surAndGivenName SEQUENCE {\r\n                \t     surName DirectoryString,\r\n                \t     givenName SEQUENCE OF DirectoryString\r\n                    },\r\n                \t   pseudonym DirectoryString\r\n                  }\r\n            </pre>\r\n            @param pseudonym pseudonym value to use.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type NameOrPseudonym:\r\n             <p/>\r\n             <pre>\r\n                   NameOrPseudonym ::= CHOICE {\r\n                 \t   surAndGivenName SEQUENCE {\r\n                 \t     surName DirectoryString,\r\n                 \t     givenName SEQUENCE OF DirectoryString\r\n                     },\r\n                 \t   pseudonym DirectoryString\r\n                   }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym.#ctor(System.String)\">\r\n             Constructor from a given details.\r\n            \r\n             @param pseudonym The pseudonym.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym.#ctor(Org.BouncyCastle.Asn1.X500.DirectoryString,Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from a given details.\r\n            \r\n             @param surname   The surname.\r\n             @param givenName A sequence of directory strings making up the givenName\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                   NameOrPseudonym ::= CHOICE {\r\n                 \t   surAndGivenName SEQUENCE {\r\n                 \t     surName DirectoryString,\r\n                 \t     givenName SEQUENCE OF DirectoryString\r\n                     },\r\n                 \t   pseudonym DirectoryString\r\n                   }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.SigI.PersonalData\">\r\n             Contains personal data for the otherName field in the subjectAltNames\r\n             extension.\r\n             <p/>\r\n             <pre>\r\n                 PersonalData ::= SEQUENCE {\r\n                   nameOrPseudonym NameOrPseudonym,\r\n                   nameDistinguisher [0] INTEGER OPTIONAL,\r\n                   dateOfBirth [1] GeneralizedTime OPTIONAL,\r\n                   placeOfBirth [2] DirectoryString OPTIONAL,\r\n                   gender [3] PrintableString OPTIONAL,\r\n                   postalAddress [4] DirectoryString OPTIONAL\r\n                   }\r\n             </pre>\r\n            \r\n             @see org.bouncycastle.asn1.x509.sigi.NameOrPseudonym\r\n             @see org.bouncycastle.asn1.x509.sigi.SigIObjectIdentifiers\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.PersonalData.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n             <p/>\r\n             The sequence is of type NameOrPseudonym:\r\n             <p/>\r\n             <pre>\r\n                 PersonalData ::= SEQUENCE {\r\n                   nameOrPseudonym NameOrPseudonym,\r\n                   nameDistinguisher [0] INTEGER OPTIONAL,\r\n                   dateOfBirth [1] GeneralizedTime OPTIONAL,\r\n                   placeOfBirth [2] DirectoryString OPTIONAL,\r\n                   gender [3] PrintableString OPTIONAL,\r\n                   postalAddress [4] DirectoryString OPTIONAL\r\n                   }\r\n             </pre>\r\n            \r\n             @param seq The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.PersonalData.#ctor(Org.BouncyCastle.Asn1.X509.SigI.NameOrPseudonym,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Asn1.DerGeneralizedTime,Org.BouncyCastle.Asn1.X500.DirectoryString,System.String,Org.BouncyCastle.Asn1.X500.DirectoryString)\">\r\n             Constructor from a given details.\r\n            \r\n             @param nameOrPseudonym  Name or pseudonym.\r\n             @param nameDistinguisher Name distinguisher.\r\n             @param dateOfBirth      Date of birth.\r\n             @param placeOfBirth     Place of birth.\r\n             @param gender           Gender.\r\n             @param postalAddress    Postal Address.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SigI.PersonalData.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n             <p/>\r\n             Returns:\r\n             <p/>\r\n             <pre>\r\n                 PersonalData ::= SEQUENCE {\r\n                   nameOrPseudonym NameOrPseudonym,\r\n                   nameDistinguisher [0] INTEGER OPTIONAL,\r\n                   dateOfBirth [1] GeneralizedTime OPTIONAL,\r\n                   placeOfBirth [2] DirectoryString OPTIONAL,\r\n                   gender [3] PrintableString OPTIONAL,\r\n                   postalAddress [4] DirectoryString OPTIONAL\r\n                   }\r\n             </pre>\r\n            \r\n             @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers\">\r\n            Object Identifiers of SigI specifciation (German Signature Law\r\n            Interoperability specification).\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers.IdSigIKP\">\r\n            Key purpose IDs for German SigI (Signature Interoperability\r\n            Specification)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers.IdSigICP\">\r\n            Certificate policy IDs for German SigI (Signature Interoperability\r\n            Specification)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers.IdSigION\">\r\n            Other Name IDs for German SigI (Signature Interoperability Specification)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers.IdSigIKPDirectoryService\">\r\n            To be used for for the generation of directory service certificates.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers.IdSigIONPersonalData\">\r\n            ID for PersonalData\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.SigI.SigIObjectIdentifiers.IdSigICPSigConform\">\r\n            Certificate is conform to german signature law.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes\">\r\n             This extension may contain further X.500 attributes of the subject. See also\r\n             RFC 3039.\r\n            \r\n             <pre>\r\n                 SubjectDirectoryAttributes ::= Attributes\r\n                 Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute\r\n                 Attribute ::= SEQUENCE\r\n                 {\r\n                   type AttributeType\r\n                   values SET OF AttributeValue\r\n                 }\r\n            \r\n                 AttributeType ::= OBJECT IDENTIFIER\r\n                 AttributeValue ::= ANY DEFINED BY AttributeType\r\n             </pre>\r\n            \r\n             @see org.bouncycastle.asn1.x509.X509Name for AttributeType ObjectIdentifiers.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n            \r\n             The sequence is of type SubjectDirectoryAttributes:\r\n            \r\n             <pre>\r\n                  SubjectDirectoryAttributes ::= Attributes\r\n                  Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute\r\n                  Attribute ::= SEQUENCE\r\n                  {\r\n                    type AttributeType\r\n                    values SET OF AttributeValue\r\n                  }\r\n            \r\n                  AttributeType ::= OBJECT IDENTIFIER\r\n                  AttributeValue ::= ANY DEFINED BY AttributeType\r\n             </pre>\r\n            \r\n             @param seq\r\n                        The ASN.1 sequence.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes.#ctor(System.Collections.IList)\">\r\n             Constructor from an ArrayList of attributes.\r\n            \r\n             The ArrayList consists of attributes of type {@link Attribute Attribute}\r\n            \r\n             @param attributes The attributes.\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes.ToAsn1Object\">\r\n             Produce an object suitable for an Asn1OutputStream.\r\n            \r\n             Returns:\r\n            \r\n             <pre>\r\n                  SubjectDirectoryAttributes ::= Attributes\r\n                  Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute\r\n                  Attribute ::= SEQUENCE\r\n                  {\r\n                    type AttributeType\r\n                    values SET OF AttributeValue\r\n                  }\r\n            \r\n                  AttributeType ::= OBJECT IDENTIFIER\r\n                  AttributeValue ::= ANY DEFINED BY AttributeType\r\n             </pre>\r\n            \r\n             @return a DERObject\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes.Attributes\">\r\n            @return Returns the attributes.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.SubjectKeyIdentifier\">\r\n            The SubjectKeyIdentifier object.\r\n            <pre>\r\n            SubjectKeyIdentifier::= OCTET STRING\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectKeyIdentifier.#ctor(Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo)\">\r\n             Calculates the keyIdentifier using a SHA1 hash over the BIT STRING\r\n             from SubjectPublicKeyInfo as defined in RFC3280.\r\n            \r\n             @param spki the subject public key info.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectKeyIdentifier.CreateSha1KeyIdentifier(Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo)\">\r\n            Return a RFC 3280 type 1 key identifier. As in:\r\n            <pre>\r\n            (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the\r\n            value of the BIT STRING subjectPublicKey (excluding the tag,\r\n            length, and number of unused bits).\r\n            </pre>\r\n            @param keyInfo the key info object containing the subjectPublicKey field.\r\n            @return the key identifier.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectKeyIdentifier.CreateTruncatedSha1KeyIdentifier(Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo)\">\r\n            Return a RFC 3280 type 2 key identifier. As in:\r\n            <pre>\r\n            (2) The keyIdentifier is composed of a four bit type field with\r\n            the value 0100 followed by the least significant 60 bits of the\r\n            SHA-1 hash of the value of the BIT STRING subjectPublicKey.\r\n            </pre>\r\n            @param keyInfo the key info object containing the subjectPublicKey field.\r\n            @return the key identifier.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo\">\r\n            The object that contains the public key stored in a certficate.\r\n            <p>\r\n            The GetEncoded() method in the public keys in the JCE produces a DER\r\n            encoded one of these.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo.GetPublicKey\">\r\n             for when the public key is an encoded object - if the bitstring\r\n             can't be decoded this routine raises an IOException.\r\n            \r\n             @exception IOException - if the bit string doesn't represent a Der\r\n             encoded object.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo.PublicKeyData\">\r\n            for when the public key is raw bits...\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            SubjectPublicKeyInfo ::= Sequence {\r\n                                     algorithm AlgorithmIdentifier,\r\n                                     publicKey BIT STRING }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Target\">\r\n            Target structure used in target information extension for attribute\r\n            certificates from RFC 3281.\r\n            \r\n            <pre>\r\n                Target  ::= CHOICE {\r\n                  targetName          [0] GeneralName,\r\n                  targetGroup         [1] GeneralName,\r\n                  targetCert          [2] TargetCert\r\n                }\r\n            </pre>\r\n            \r\n            <p>\r\n            The targetCert field is currently not supported and must not be used\r\n            according to RFC 3281.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Target.GetInstance(System.Object)\">\r\n            Creates an instance of a Target from the given object.\r\n            <p>\r\n            <code>obj</code> can be a Target or a {@link Asn1TaggedObject}</p>\r\n            \r\n            @param obj The object.\r\n            @return A Target instance.\r\n            @throws ArgumentException if the given object cannot be\r\n                        interpreted as Target.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Target.#ctor(Org.BouncyCastle.Asn1.Asn1TaggedObject)\">\r\n            Constructor from Asn1TaggedObject.\r\n            \r\n            @param tagObj The tagged object.\r\n            @throws ArgumentException if the encoding is wrong.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Target.#ctor(Org.BouncyCastle.Asn1.X509.Target.Choice,Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n             Constructor from given details.\r\n             <p>\r\n             Exactly one of the parameters must be not <code>null</code>.</p>\r\n            \r\n             @param type the choice type to apply to the name.\r\n             @param name the general name.\r\n             @throws ArgumentException if type is invalid.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.Target.TargetGroup\">\r\n            @return Returns the targetGroup.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.Target.TargetName\">\r\n            @return Returns the targetName.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Target.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            \r\n            Returns:\r\n            \r\n            <pre>\r\n                Target  ::= CHOICE {\r\n                  targetName          [0] GeneralName,\r\n                  targetGroup         [1] GeneralName,\r\n                  targetCert          [2] TargetCert\r\n                }\r\n            </pre>\r\n            \r\n            @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.TargetInformation\">\r\n            Target information extension for attributes certificates according to RFC\r\n            3281.\r\n            \r\n            <pre>\r\n                      SEQUENCE OF Targets\r\n            </pre>\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.TargetInformation.GetInstance(System.Object)\">\r\n            Creates an instance of a TargetInformation from the given object.\r\n            <p>\r\n            <code>obj</code> can be a TargetInformation or a {@link Asn1Sequence}</p>\r\n            \r\n            @param obj The object.\r\n            @return A TargetInformation instance.\r\n            @throws ArgumentException if the given object cannot be interpreted as TargetInformation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.TargetInformation.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Constructor from a Asn1Sequence.\r\n            \r\n            @param seq The Asn1Sequence.\r\n            @throws ArgumentException if the sequence does not contain\r\n                        correctly encoded Targets elements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.TargetInformation.GetTargetsObjects\">\r\n            Returns the targets in this target information extension.\r\n            <p>\r\n            The ArrayList is cloned before it is returned.</p>\r\n            \r\n            @return Returns the targets.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.TargetInformation.#ctor(Org.BouncyCastle.Asn1.X509.Targets)\">\r\n            Constructs a target information from a single targets element. \r\n            According to RFC 3281 only one targets element must be produced.\r\n            \r\n            @param targets A Targets instance.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.TargetInformation.#ctor(Org.BouncyCastle.Asn1.X509.Target[])\">\r\n             According to RFC 3281 only one targets element must be produced. If\r\n             multiple targets are given they must be merged in\r\n             into one targets element.\r\n            \r\n             @param targets An array with {@link Targets}.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.TargetInformation.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            \r\n            Returns:\r\n            \r\n            <pre>\r\n                     SEQUENCE OF Targets\r\n            </pre>\r\n            \r\n            <p>\r\n            According to RFC 3281 only one targets element must be produced. If\r\n            multiple targets are given in the constructor they are merged into one\r\n            targets element. If this was produced from a\r\n            {@link Org.BouncyCastle.Asn1.Asn1Sequence} the encoding is kept.</p>\r\n            \r\n            @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.Targets\">\r\n            Targets structure used in target information extension for attribute\r\n            certificates from RFC 3281.\r\n            \r\n            <pre>\r\n                       Targets ::= SEQUENCE OF Target\r\n                      \r\n                       Target  ::= CHOICE {\r\n                         targetName          [0] GeneralName,\r\n                         targetGroup         [1] GeneralName,\r\n                         targetCert          [2] TargetCert\r\n                       }\r\n                      \r\n                       TargetCert  ::= SEQUENCE {\r\n                         targetCertificate    IssuerSerial,\r\n                         targetName           GeneralName OPTIONAL,\r\n                         certDigestInfo       ObjectDigestInfo OPTIONAL\r\n                       }\r\n            </pre>\r\n            \r\n            @see org.bouncycastle.asn1.x509.Target\r\n            @see org.bouncycastle.asn1.x509.TargetInformation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Targets.GetInstance(System.Object)\">\r\n            Creates an instance of a Targets from the given object.\r\n            <p>\r\n            <code>obj</code> can be a Targets or a {@link Asn1Sequence}</p>\r\n            \r\n            @param obj The object.\r\n            @return A Targets instance.\r\n            @throws ArgumentException if the given object cannot be interpreted as Target.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Targets.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n            Constructor from Asn1Sequence.\r\n            \r\n            @param targets The ASN.1 SEQUENCE.\r\n            @throws ArgumentException if the contents of the sequence are\r\n                        invalid.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Targets.#ctor(Org.BouncyCastle.Asn1.X509.Target[])\">\r\n            Constructor from given targets.\r\n            <p>\r\n            The ArrayList is copied.</p>\r\n            \r\n            @param targets An <code>ArrayList</code> of {@link Target}s.\r\n            @see Target\r\n            @throws ArgumentException if the ArrayList contains not only Targets.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Targets.GetTargets\">\r\n            Returns the targets in an <code>ArrayList</code>.\r\n            <p>\r\n            The ArrayList is cloned before it is returned.</p>\r\n            \r\n            @return Returns the targets.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Targets.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            \r\n            Returns:\r\n            \r\n            <pre>\r\n                       Targets ::= SEQUENCE OF Target\r\n            </pre>\r\n            \r\n            @return an Asn1Object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.TbsCertificateStructure\">\r\n            The TbsCertificate object.\r\n            <pre>\r\n            TbsCertificate ::= Sequence {\r\n                 version          [ 0 ]  Version DEFAULT v1(0),\r\n                 serialNumber            CertificateSerialNumber,\r\n                 signature               AlgorithmIdentifier,\r\n                 issuer                  Name,\r\n                 validity                Validity,\r\n                 subject                 Name,\r\n                 subjectPublicKeyInfo    SubjectPublicKeyInfo,\r\n                 issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,\r\n                 subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,\r\n                 extensions        [ 3 ] Extensions OPTIONAL\r\n                 }\r\n            </pre>\r\n            <p>\r\n            Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class\r\n            will parse them, but you really shouldn't be creating new ones.</p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.TbsCertificateList\">\r\n            PKIX RFC-2459 - TbsCertList object.\r\n            <pre>\r\n            TbsCertList  ::=  Sequence  {\r\n                 version                 Version OPTIONAL,\r\n                                              -- if present, shall be v2\r\n                 signature               AlgorithmIdentifier,\r\n                 issuer                  Name,\r\n                 thisUpdate              Time,\r\n                 nextUpdate              Time OPTIONAL,\r\n                 revokedCertificates     Sequence OF Sequence  {\r\n                      userCertificate         CertificateSerialNumber,\r\n                      revocationDate          Time,\r\n                      crlEntryExtensions      Extensions OPTIONAL\r\n                                                    -- if present, shall be v2\r\n                                           }  OPTIONAL,\r\n                 crlExtensions           [0]  EXPLICIT Extensions OPTIONAL\r\n                                                    -- if present, shall be v2\r\n                                           }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Time.#ctor(System.DateTime)\">\r\n            creates a time object from a given date - if the date is between 1950\r\n            and 2049 a UTCTime object is Generated, otherwise a GeneralizedTime\r\n            is used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Time.ToDateTime\">\r\n            <summary>\r\n            Return our time as DateTime.\r\n            </summary>\r\n            <returns>A date time.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.Time.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Time ::= CHOICE {\r\n                        utcTime        UTCTime,\r\n                        generalTime    GeneralizedTime }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.UserNotice\">\r\n             <code>UserNotice</code> class, used in\r\n             <code>CertificatePolicies</code> X509 extensions (in policy\r\n             qualifiers).\r\n             <pre>\r\n             UserNotice ::= Sequence {\r\n                  noticeRef        NoticeReference OPTIONAL,\r\n                  explicitText     DisplayText OPTIONAL}\r\n            \r\n             </pre>\r\n            \r\n             @see PolicyQualifierId\r\n             @see PolicyInformation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.UserNotice.#ctor(Org.BouncyCastle.Asn1.X509.NoticeReference,Org.BouncyCastle.Asn1.X509.DisplayText)\">\r\n             Creates a new <code>UserNotice</code> instance.\r\n            \r\n             @param noticeRef a <code>NoticeReference</code> value\r\n             @param explicitText a <code>DisplayText</code> value\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.UserNotice.#ctor(Org.BouncyCastle.Asn1.X509.NoticeReference,System.String)\">\r\n             Creates a new <code>UserNotice</code> instance.\r\n            \r\n             @param noticeRef a <code>NoticeReference</code> value\r\n             @param str the explicitText field as a string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.UserNotice.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Creates a new <code>UserNotice</code> instance.\r\n             <p>Useful from reconstructing a <code>UserNotice</code> instance\r\n             from its encodable/encoded form.\r\n            \r\n             @param as an <code>ASN1Sequence</code> value obtained from either\r\n             calling @{link toASN1Object()} for a <code>UserNotice</code>\r\n             instance or from parsing it from a DER-encoded stream.</p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.V1TbsCertificateGenerator\">\r\n             Generator for Version 1 TbsCertificateStructures.\r\n             <pre>\r\n             TbsCertificate ::= Sequence {\r\n                  version          [ 0 ]  Version DEFAULT v1(0),\r\n                  serialNumber            CertificateSerialNumber,\r\n                  signature               AlgorithmIdentifier,\r\n                  issuer                  Name,\r\n                  validity                Validity,\r\n                  subject                 Name,\r\n                  subjectPublicKeyInfo    SubjectPublicKeyInfo,\r\n                  }\r\n             </pre>\r\n            \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.V2AttributeCertificateInfoGenerator\">\r\n             Generator for Version 2 AttributeCertificateInfo\r\n             <pre>\r\n             AttributeCertificateInfo ::= Sequence {\r\n                   version              AttCertVersion -- version is v2,\r\n                   holder               Holder,\r\n                   issuer               AttCertIssuer,\r\n                   signature            AlgorithmIdentifier,\r\n                   serialNumber         CertificateSerialNumber,\r\n                   attrCertValidityPeriod   AttCertValidityPeriod,\r\n                   attributes           Sequence OF Attr,\r\n                   issuerUniqueID       UniqueIdentifier OPTIONAL,\r\n                   extensions           Extensions OPTIONAL\r\n             }\r\n             </pre>\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.V2AttributeCertificateInfoGenerator.AddAttribute(Org.BouncyCastle.Asn1.X509.AttributeX509)\">\r\n            @param attribute\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.V2Form.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             V2Form ::= Sequence {\r\n                  issuerName            GeneralNames  OPTIONAL,\r\n                  baseCertificateID     [0] IssuerSerial  OPTIONAL,\r\n                  objectDigestInfo      [1] ObjectDigestInfo  OPTIONAL\r\n                    -- issuerName MUST be present in this profile\r\n                    -- baseCertificateID and objectDigestInfo MUST NOT\r\n                    -- be present in this profile\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.V2TbsCertListGenerator\">\r\n             Generator for Version 2 TbsCertList structures.\r\n             <pre>\r\n              TbsCertList  ::=  Sequence  {\r\n                   version                 Version OPTIONAL,\r\n                                                -- if present, shall be v2\r\n                   signature               AlgorithmIdentifier,\r\n                   issuer                  Name,\r\n                   thisUpdate              Time,\r\n                   nextUpdate              Time OPTIONAL,\r\n                   revokedCertificates     Sequence OF Sequence  {\r\n                        userCertificate         CertificateSerialNumber,\r\n                        revocationDate          Time,\r\n                        crlEntryExtensions      Extensions OPTIONAL\r\n                                                      -- if present, shall be v2\r\n                                             }  OPTIONAL,\r\n                   crlExtensions           [0]  EXPLICIT Extensions OPTIONAL\r\n                                                      -- if present, shall be v2\r\n                                             }\r\n             </pre>\r\n            \r\n             <b>Note: This class may be subject to change</b>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.V3TbsCertificateGenerator\">\r\n             Generator for Version 3 TbsCertificateStructures.\r\n             <pre>\r\n             TbsCertificate ::= Sequence {\r\n                  version          [ 0 ]  Version DEFAULT v1(0),\r\n                  serialNumber            CertificateSerialNumber,\r\n                  signature               AlgorithmIdentifier,\r\n                  issuer                  Name,\r\n                  validity                Validity,\r\n                  subject                 Name,\r\n                  subjectPublicKeyInfo    SubjectPublicKeyInfo,\r\n                  issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,\r\n                  subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,\r\n                  extensions        [ 3 ] Extensions OPTIONAL\r\n                  }\r\n             </pre>\r\n            \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509CertificateStructure\">\r\n            an X509Certificate structure.\r\n            <pre>\r\n             Certificate ::= Sequence {\r\n                 tbsCertificate          TbsCertificate,\r\n                 signatureAlgorithm      AlgorithmIdentifier,\r\n                 signature               BIT STRING\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509DefaultEntryConverter\">\r\n            The default converter for X509 DN entries when going from their\r\n            string value to ASN.1 strings.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509DefaultEntryConverter.GetConvertedValue(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.String)\">\r\n             Apply default conversion for the given value depending on the oid\r\n             and the character range of the value.\r\n            \r\n             @param oid the object identifier for the DN entry\r\n             @param value the value associated with it\r\n             @return the ASN.1 equivalent for the string value.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509Extension\">\r\n            an object for the elements in the X.509 V3 extension block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extension.ConvertValueToObject(Org.BouncyCastle.Asn1.X509.X509Extension)\">\r\n            <sumary>Convert the value of the passed in extension to an object.</sumary>\r\n            <param name=\"ext\">The extension to parse.</param>\r\n            <returns>The object the value string contains.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">If conversion is not possible.</exception>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.SubjectDirectoryAttributes\">\r\n            Subject Directory Attributes\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.SubjectKeyIdentifier\">\r\n            Subject Key Identifier\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.KeyUsage\">\r\n            Key Usage\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.PrivateKeyUsagePeriod\">\r\n            Private Key Usage Period\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.SubjectAlternativeName\">\r\n            Subject Alternative Name\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.IssuerAlternativeName\">\r\n            Issuer Alternative Name\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.BasicConstraints\">\r\n            Basic Constraints\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.CrlNumber\">\r\n            CRL Number\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.ReasonCode\">\r\n            Reason code\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.InstructionCode\">\r\n            Hold Instruction Code\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.InvalidityDate\">\r\n            Invalidity Date\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.DeltaCrlIndicator\">\r\n            Delta CRL indicator\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.IssuingDistributionPoint\">\r\n            Issuing Distribution Point\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.CertificateIssuer\">\r\n            Certificate Issuer\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.NameConstraints\">\r\n            Name Constraints\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.CrlDistributionPoints\">\r\n            CRL Distribution Points\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.CertificatePolicies\">\r\n            Certificate Policies\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.PolicyMappings\">\r\n            Policy Mappings\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.AuthorityKeyIdentifier\">\r\n            Authority Key Identifier\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.PolicyConstraints\">\r\n            Policy Constraints\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.ExtendedKeyUsage\">\r\n            Extended Key Usage\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.FreshestCrl\">\r\n            Freshest CRL\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.InhibitAnyPolicy\">\r\n            Inhibit Any Policy\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.AuthorityInfoAccess\">\r\n            Authority Info Access\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.SubjectInfoAccess\">\r\n            Subject Info Access\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.LogoType\">\r\n            Logo Type\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.BiometricInfo\">\r\n            BiometricInfo\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.QCStatements\">\r\n            QCStatements\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.AuditIdentity\">\r\n            Audit identity extension in attribute certificates.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.NoRevAvail\">\r\n            NoRevAvail extension in attribute certificates.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Extensions.TargetInformation\">\r\n            TargetInformation extension in attribute certificates.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence.\r\n            \r\n             the extensions are a list of constructed sequences, either with (Oid, OctetString) or (Oid, Boolean, OctetString)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(System.Collections.IDictionary)\">\r\n            constructor from a table of extensions.\r\n            <p>\r\n            it's is assumed the table contains Oid/string pairs.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(System.Collections.IList,System.Collections.IDictionary)\">\r\n            Constructor from a table of extensions with ordering.\r\n            <p>\r\n            It's is assumed the table contains Oid/string pairs.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(System.Collections.IList,System.Collections.IList)\">\r\n             Constructor from two vectors\r\n            \r\n             @param objectIDs an ArrayList of the object identifiers.\r\n             @param values an ArrayList of the extension values.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(System.Collections.Hashtable)\">\r\n            constructor from a table of extensions.\r\n            <p>\r\n            it's is assumed the table contains Oid/string pairs.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(System.Collections.ArrayList,System.Collections.Hashtable)\">\r\n            Constructor from a table of extensions with ordering.\r\n            <p>\r\n            It's is assumed the table contains Oid/string pairs.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.#ctor(System.Collections.ArrayList,System.Collections.ArrayList)\">\r\n             Constructor from two vectors\r\n            \r\n             @param objectIDs an ArrayList of the object identifiers.\r\n             @param values an ArrayList of the extension values.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.X509Extensions.ExtensionOids\">\r\n            return an Enumeration of the extension field's object ids.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.GetExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the extension represented by the object identifier\r\n             passed in.\r\n            \r\n             @return the extension if it's present, null otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Extensions.ToAsn1Object\">\r\n             <pre>\r\n                 Extensions        ::=   SEQUENCE SIZE (1..MAX) OF Extension\r\n            \r\n                 Extension         ::=   SEQUENCE {\r\n                    extnId            EXTENSION.&amp;id ({ExtensionSet}),\r\n                    critical          BOOLEAN DEFAULT FALSE,\r\n                    extnValue         OCTET STRING }\r\n             </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509ExtensionsGenerator\">\r\n            <remarks>Generator for X.509 extensions</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509ExtensionsGenerator.Reset\">\r\n            <summary>Reset the generator</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509ExtensionsGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            <summary>\r\n            Add an extension with the given oid and the passed in value to be included\r\n            in the OCTET STRING associated with the extension.\r\n            </summary>\r\n            <param name=\"oid\">OID for the extension.</param>\r\n            <param name=\"critical\">True if critical, false otherwise.</param>\r\n            <param name=\"extValue\">The ASN.1 object to be included in the extension.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509ExtensionsGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,System.Byte[])\">\r\n            <summary>\r\n            Add an extension with the given oid and the passed in byte array to be wrapped\r\n            in the OCTET STRING associated with the extension.\r\n            </summary>\r\n            <param name=\"oid\">OID for the extension.</param>\r\n            <param name=\"critical\">True if critical, false otherwise.</param>\r\n            <param name=\"extValue\">The byte array to be wrapped.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.X509ExtensionsGenerator.IsEmpty\">\r\n            <summary>Return true if there are no extension present in this generator.</summary>\r\n            <returns>True if empty, false otherwise</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509ExtensionsGenerator.Generate\">\r\n            <summary>Generate an X509Extensions object based on the current state of the generator.</summary>\r\n            <returns>An <c>X509Extensions</c> object</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509Name\">\r\n             <pre>\r\n                 RDNSequence ::= SEQUENCE OF RelativeDistinguishedName\r\n            \r\n                 RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue\r\n            \r\n                 AttributeTypeAndValue ::= SEQUENCE {\r\n                                               type  OBJECT IDENTIFIER,\r\n                                               value ANY }\r\n             </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.C\">\r\n            country code - StringType(SIZE(2))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.O\">\r\n            organization - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.OU\">\r\n            organizational unit name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.T\">\r\n            Title\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.CN\">\r\n            common name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.Street\">\r\n            street - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.SerialNumber\">\r\n            device serial number name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.L\">\r\n            locality name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.ST\">\r\n            state, or province name - StringType(SIZE(1..64))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.Surname\">\r\n            Naming attributes of type X520name\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.BusinessCategory\">\r\n            businessCategory - DirectoryString(SIZE(1..128)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.PostalCode\">\r\n            postalCode - DirectoryString(SIZE(1..40)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.DnQualifier\">\r\n            dnQualifier - DirectoryString(SIZE(1..64)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.Pseudonym\">\r\n            RFC 3039 Pseudonym - DirectoryString(SIZE(1..64)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.DateOfBirth\">\r\n            RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.PlaceOfBirth\">\r\n            RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.Gender\">\r\n            RFC 3039 DateOfBirth - PrintableString (SIZE(1)) -- \"M\", \"F\", \"m\" or \"f\"\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.CountryOfCitizenship\">\r\n            RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166\r\n            codes only\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.CountryOfResidence\">\r\n            RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166\r\n            codes only\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.NameAtBirth\">\r\n            ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64)\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.PostalAddress\">\r\n            RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF\r\n            DirectoryString(SIZE(1..30))\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.DmdName\">\r\n            RFC 2256 dmdName\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.TelephoneNumber\">\r\n            id-at-telephoneNumber\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.Name\">\r\n            id-at-name\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.EmailAddress\">\r\n            Email address (RSA PKCS#9 extension) - IA5String.\r\n            <p>Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.</p>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.UnstructuredName\">\r\n            more from PKCS#9\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.E\">\r\n            email address in Verisign certificates\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.UID\">\r\n            LDAP User id.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X509.X509Name.DefaultReverse\">\r\n            determines whether or not strings should be processed and printed\r\n            from back to front.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.DefaultSymbols\">\r\n            default look up table translating OID values into their common symbols following\r\n            the convention in RFC 2253 with a few extras\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.RFC2253Symbols\">\r\n            look up table translating OID values into their common symbols following the convention in RFC 2253\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.RFC1779Symbols\">\r\n             look up table translating OID values into their common symbols following the convention in RFC 1779\r\n            \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X509.X509Name.DefaultLookup\">\r\n            look up table translating common symbols into their OIDS.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetInstance(Org.BouncyCastle.Asn1.Asn1TaggedObject,System.Boolean)\">\r\n             Return a X509Name based on the passed in tagged object.\r\n            \r\n             @param obj tag object holding name.\r\n             @param explicitly true if explicitly tagged false otherwise.\r\n             @return the X509Name\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Constructor from Asn1Sequence\r\n            \r\n             the principal will be a list of constructed sets, each containing an (OID, string) pair.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Collections.IList,System.Collections.IDictionary)\">\r\n            Constructor from a table of attributes with ordering.\r\n            <p>\r\n            it's is assumed the table contains OID/string pairs, and the contents\r\n            of the table are copied into an internal table as part of the\r\n            construction process. The ordering ArrayList should contain the OIDs\r\n            in the order they are meant to be encoded or printed in ToString.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Collections.IList,System.Collections.IDictionary,Org.BouncyCastle.Asn1.X509.X509NameEntryConverter)\">\r\n            Constructor from a table of attributes with ordering.\r\n            <p>\r\n            it's is assumed the table contains OID/string pairs, and the contents\r\n            of the table are copied into an internal table as part of the\r\n            construction process. The ordering ArrayList should contain the OIDs\r\n            in the order they are meant to be encoded or printed in ToString.</p>\r\n            <p>\r\n            The passed in converter will be used to convert the strings into their\r\n            ASN.1 counterparts.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Collections.IList,System.Collections.IList)\">\r\n            Takes two vectors one of the oids and the other of the values.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Collections.IList,System.Collections.IList,Org.BouncyCastle.Asn1.X509.X509NameEntryConverter)\">\r\n            Takes two vectors one of the oids and the other of the values.\r\n            <p>\r\n            The passed in converter will be used to convert the strings into their\r\n            ASN.1 counterparts.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.String)\">\r\n            Takes an X509 dir name as a string of the format \"C=AU, ST=Victoria\", or\r\n            some such, converting it into an ordered set of name attributes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.String,Org.BouncyCastle.Asn1.X509.X509NameEntryConverter)\">\r\n            Takes an X509 dir name as a string of the format \"C=AU, ST=Victoria\", or\r\n            some such, converting it into an ordered set of name attributes with each\r\n            string value being converted to its associated ASN.1 type using the passed\r\n            in converter.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Boolean,System.String)\">\r\n            Takes an X509 dir name as a string of the format \"C=AU, ST=Victoria\", or\r\n            some such, converting it into an ordered set of name attributes. If reverse\r\n            is true, create the encoded version of the sequence starting from the\r\n            last element in the string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Boolean,System.String,Org.BouncyCastle.Asn1.X509.X509NameEntryConverter)\">\r\n            Takes an X509 dir name as a string of the format \"C=AU, ST=Victoria\", or\r\n            some such, converting it into an ordered set of name attributes with each\r\n            string value being converted to its associated ASN.1 type using the passed\r\n            in converter. If reverse is true the ASN.1 sequence representing the DN will\r\n            be built by starting at the end of the string, rather than the start.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Boolean,System.Collections.IDictionary,System.String)\">\r\n            Takes an X509 dir name as a string of the format \"C=AU, ST=Victoria\", or\r\n            some such, converting it into an ordered set of name attributes. lookUp\r\n            should provide a table of lookups, indexed by lowercase only strings and\r\n            yielding a DerObjectIdentifier, other than that OID. and numeric oids\r\n            will be processed automatically.\r\n            <br/>\r\n            If reverse is true, create the encoded version of the sequence\r\n            starting from the last element in the string.\r\n            @param reverse true if we should start scanning from the end (RFC 2553).\r\n            @param lookUp table of names and their oids.\r\n            @param dirName the X.500 string to be parsed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.#ctor(System.Boolean,System.Collections.IDictionary,System.String,Org.BouncyCastle.Asn1.X509.X509NameEntryConverter)\">\r\n            Takes an X509 dir name as a string of the format \"C=AU, ST=Victoria\", or\r\n            some such, converting it into an ordered set of name attributes. lookUp\r\n            should provide a table of lookups, indexed by lowercase only strings and\r\n            yielding a DerObjectIdentifier, other than that OID. and numeric oids\r\n            will be processed automatically. The passed in converter is used to convert the\r\n            string values to the right of each equals sign to their ASN.1 counterparts.\r\n            <br/>\r\n            @param reverse true if we should start scanning from the end, false otherwise.\r\n            @param lookUp table of names and oids.\r\n            @param dirName the string dirName\r\n            @param converter the converter to convert string values into their ASN.1 equivalents\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetOids\">\r\n            return an ArrayList of the oids in the name, in the order they were found.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetOidList\">\r\n            return an IList of the oids in the name, in the order they were found.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetValues\">\r\n            return an ArrayList of the values found in the name, in the order they\r\n            were found.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetValueList\">\r\n            return an IList of the values found in the name, in the order they\r\n            were found.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetValues(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return an ArrayList of the values found in the name, in the order they\r\n            were found, with the DN label corresponding to passed in oid.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.GetValueList(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return an IList of the values found in the name, in the order they\r\n            were found, with the DN label corresponding to passed in oid.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.Equivalent(Org.BouncyCastle.Asn1.X509.X509Name,System.Boolean)\">\r\n            <param name=\"other\">The X509Name object to test equivalency against.</param>\r\n            <param name=\"inOrder\">If true, the order of elements must be the same,\r\n            as well as the values associated with each element.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.Equivalent(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n            test for equivalence - note: case is ignored.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509Name.ToString(System.Boolean,System.Collections.IDictionary)\">\r\n             convert the structure to a string - if reverse is true the\r\n             oids and values are listed out starting with the last element\r\n             in the sequence (ala RFC 2253), otherwise the string will begin\r\n             with the first element of the structure. If no string definition\r\n             for the oid is found in oidSymbols the string value of the oid is\r\n             added. Two standard symbol tables are provided DefaultSymbols, and\r\n             RFC2253Symbols as part of this class.\r\n            \r\n             @param reverse if true start at the end of the sequence and work back.\r\n             @param oidSymbols look up table strings for oids.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509NameEntryConverter\">\r\n                 * It turns out that the number of standard ways the fields in a DN should be\r\n                 * encoded into their ASN.1 counterparts is rapidly approaching the\r\n                 * number of machines on the internet. By default the X509Name class\r\n                 * will produce UTF8Strings in line with the current recommendations (RFC 3280).\r\n                 * <p>\r\n                 * An example of an encoder look like below:\r\n                 * <pre>\r\n                 * public class X509DirEntryConverter\r\n                 *     : X509NameEntryConverter\r\n                 * {\r\n                 *     public Asn1Object GetConvertedValue(\r\n                 *         DerObjectIdentifier  oid,\r\n                 *         string               value)\r\n                 *     {\r\n                 *         if (str.Length() != 0 &amp;&amp; str.charAt(0) == '#')\r\n                 *         {\r\n                 *             return ConvertHexEncoded(str, 1);\r\n                 *         }\r\n                 *         if (oid.Equals(EmailAddress))\r\n                 *         {\r\n                 *             return new DerIA5String(str);\r\n                 *         }\r\n                 *         else if (CanBePrintable(str))\r\n                 *         {\r\n                 *             return new DerPrintableString(str);\r\n                 *         }\r\n                 *         else if (CanBeUTF8(str))\r\n                 *         {\r\n                 *             return new DerUtf8String(str);\r\n                 *         }\r\n                 *         else\r\n                 *         {\r\n                 *             return new DerBmpString(str);\r\n                 *         }\r\n                 *     }\r\n                 * }\r\n            \t * </pre>\r\n            \t * </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509NameEntryConverter.ConvertHexEncoded(System.String,System.Int32)\">\r\n             Convert an inline encoded hex string rendition of an ASN.1\r\n             object back into its corresponding ASN.1 object.\r\n            \r\n             @param str the hex encoded object\r\n             @param off the index at which the encoding starts\r\n             @return the decoded object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509NameEntryConverter.CanBePrintable(System.String)\">\r\n            return true if the passed in string can be represented without\r\n            loss as a PrintableString, false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X509.X509NameEntryConverter.GetConvertedValue(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.String)\">\r\n             Convert the passed in string value into the appropriate ASN.1\r\n             encoded object.\r\n            \r\n             @param oid the oid associated with the value in the DN.\r\n             @param value the value of the particular DN component.\r\n             @return the ASN.1 equivalent for the value.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X509.X509NameTokenizer\">\r\n            class for breaking up an X500 Name into it's component tokens, ala\r\n            java.util.StringTokenizer. We need this class as some of the\r\n            lightweight Java environment don't support classes like\r\n            StringTokenizer.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.KeySpecificInfo\">\r\n            ASN.1 def for Diffie-Hellman key exchange KeySpecificInfo structure. See\r\n            RFC 2631, or X9.42, for further details.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.KeySpecificInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             KeySpecificInfo ::= Sequence {\r\n                 algorithm OBJECT IDENTIFIER,\r\n                 counter OCTET STRING SIZE (4..4)\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.OtherInfo\">\r\n            ANS.1 def for Diffie-Hellman key exchange OtherInfo structure. See\r\n            RFC 2631, or X9.42, for further details.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.OtherInfo.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             OtherInfo ::= Sequence {\r\n                 keyInfo KeySpecificInfo,\r\n                 partyAInfo [0] OCTET STRING OPTIONAL,\r\n                 suppPubInfo [2] OCTET STRING\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.X962NamedCurves\">\r\n            table of the current named curves defined in X.962 EC-DSA.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X962NamedCurves.GetByOid(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n             return the X9ECParameters object for the named curve represented by\r\n             the passed in object identifier. Null if the curve isn't present.\r\n            \r\n             @param oid an object identifier representing a named curve, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X962NamedCurves.GetOid(System.String)\">\r\n             return the object identifier signified by the passed in name. Null\r\n             if there is no object identifier associated with name.\r\n            \r\n             @return the object identifier associated with name, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X962NamedCurves.GetName(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            return the named curve name represented by the given object identifier.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.X9.X962NamedCurves.Names\">\r\n            returns an enumeration containing the name strings for curves\r\n            contained in this structure.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X962Parameters.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n            Parameters ::= CHOICE {\r\n               ecParameters ECParameters,\r\n               namedCurve   CURVES.&amp;id({CurveNames}),\r\n               implicitlyCA Null\r\n            }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.X9Curve\">\r\n            ASN.1 def for Elliptic-Curve Curve structure. See\r\n            X9.62, for further details.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9Curve.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             Curve ::= Sequence {\r\n                 a               FieldElement,\r\n                 b               FieldElement,\r\n                 seed            BIT STRING      OPTIONAL\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.X9ECParameters\">\r\n            ASN.1 def for Elliptic-Curve ECParameters structure. See\r\n            X9.62, for further details.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9ECParameters.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             ECParameters ::= Sequence {\r\n                 version         Integer { ecpVer1(1) } (ecpVer1),\r\n                 fieldID         FieldID {{FieldTypes}},\r\n                 curve           X9Curve,\r\n                 base            X9ECPoint,\r\n                 order           Integer,\r\n                 cofactor        Integer OPTIONAL\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.X9ECPoint\">\r\n            class for describing an ECPoint as a Der object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9ECPoint.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             ECPoint ::= OCTET STRING\r\n            </pre>\r\n            <p>\r\n            Octet string produced using ECPoint.GetEncoded().</p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.X9FieldElement\">\r\n            Class for processing an ECFieldElement as a DER object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9FieldElement.ToAsn1Object\">\r\n            Produce an object suitable for an Asn1OutputStream.\r\n            <pre>\r\n             FieldElement ::= OCTET STRING\r\n            </pre>\r\n            <p>\r\n            <ol>\r\n            <li> if <i>q</i> is an odd prime then the field element is\r\n            processed as an Integer and converted to an octet string\r\n            according to x 9.62 4.3.1.</li>\r\n            <li> if <i>q</i> is 2<sup>m</sup> then the bit string\r\n            contained in the field element is converted into an octet\r\n            string with the same ordering padded at the front if necessary.\r\n            </li>\r\n            </ol>\r\n            </p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.X9.X9FieldID\">\r\n            ASN.1 def for Elliptic-Curve Field ID structure. See\r\n            X9.62, for further details.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9FieldID.#ctor(Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for elliptic curves over prime fields\r\n            <code>F<sub>2</sub></code>.\r\n            @param primeP The prime <code>p</code> defining the prime field.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9FieldID.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            Constructor for elliptic curves over binary fields\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>..\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.X9.X9FieldID.ToAsn1Object\">\r\n            Produce a Der encoding of the following structure.\r\n            <pre>\r\n             FieldID ::= Sequence {\r\n                 fieldType       FIELD-ID.&amp;id({IOSet}),\r\n                 parameters      FIELD-ID.&amp;Type({IOSet}{&#64;fieldType})\r\n             }\r\n            </pre>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.IdDsaWithSha1\">\r\n            id-dsa-with-sha1 OBJECT IDENTIFIER ::=  { iso(1) member-body(2)\r\n                  us(840) x9-57 (10040) x9cm(4) 3 }\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.X9x63Scheme\">\r\n            X9.63\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.ansi_x9_42\">\r\n            X9.42\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.AttributeTypeAndValue.ToAsn1Object\">\r\n            <pre>\r\n            AttributeTypeAndValue ::= SEQUENCE {\r\n                      type         OBJECT IDENTIFIER,\r\n                      value        ANY DEFINED BY type }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertId.ToAsn1Object\">\r\n            <pre>\r\n            CertId ::= SEQUENCE {\r\n                            issuer           GeneralName,\r\n                            serialNumber     INTEGER }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertReqMessages.ToAsn1Object\">\r\n            <pre>\r\n            CertReqMessages ::= SEQUENCE SIZE (1..MAX) OF CertReqMsg\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertReqMsg.#ctor(Org.BouncyCastle.Asn1.Crmf.CertRequest,Org.BouncyCastle.Asn1.Crmf.ProofOfPossession,Org.BouncyCastle.Asn1.Crmf.AttributeTypeAndValue[])\">\r\n            Creates a new CertReqMsg.\r\n            @param certReq CertRequest\r\n            @param popo may be null\r\n            @param regInfo may be null\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertReqMsg.ToAsn1Object\">\r\n            <pre>\r\n            CertReqMsg ::= SEQUENCE {\r\n                               certReq   CertRequest,\r\n                               pop       ProofOfPossession  OPTIONAL,\r\n                               -- content depends upon key type\r\n                               regInfo   SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue OPTIONAL }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertRequest.ToAsn1Object\">\r\n            <pre>\r\n            CertRequest ::= SEQUENCE {\r\n                                 certReqId     INTEGER,          -- ID for matching request and reply\r\n                                 certTemplate  CertTemplate,  -- Selected fields of cert to be issued\r\n                                 controls      Controls OPTIONAL }   -- Attributes affecting issuance\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertTemplate.ToAsn1Object\">\r\n            <pre>\r\n             CertTemplate ::= SEQUENCE {\r\n                 version      [0] Version               OPTIONAL,\r\n                 serialNumber [1] INTEGER               OPTIONAL,\r\n                 signingAlg   [2] AlgorithmIdentifier   OPTIONAL,\r\n                 issuer       [3] Name                  OPTIONAL,\r\n                 validity     [4] OptionalValidity      OPTIONAL,\r\n                 subject      [5] Name                  OPTIONAL,\r\n                 publicKey    [6] SubjectPublicKeyInfo  OPTIONAL,\r\n                 issuerUID    [7] UniqueIdentifier      OPTIONAL,\r\n                 subjectUID   [8] UniqueIdentifier      OPTIONAL,\r\n                 extensions   [9] Extensions            OPTIONAL }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertTemplateBuilder.SetVersion(System.Int32)\">\r\n            Sets the X.509 version. Note: for X509v3, use 2 here. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertTemplateBuilder.SetIssuerUID(Org.BouncyCastle.Asn1.DerBitString)\">\r\n            Sets the issuer unique ID (deprecated in X.509v3) \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertTemplateBuilder.SetSubjectUID(Org.BouncyCastle.Asn1.DerBitString)\">\r\n            Sets the subject unique ID (deprecated in X.509v3) \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.CertTemplateBuilder.Build\">\r\n            <pre>\r\n             CertTemplate ::= SEQUENCE {\r\n                 version      [0] Version               OPTIONAL,\r\n                 serialNumber [1] INTEGER               OPTIONAL,\r\n                 signingAlg   [2] AlgorithmIdentifier   OPTIONAL,\r\n                 issuer       [3] Name                  OPTIONAL,\r\n                 validity     [4] OptionalValidity      OPTIONAL,\r\n                 subject      [5] Name                  OPTIONAL,\r\n                 publicKey    [6] SubjectPublicKeyInfo  OPTIONAL,\r\n                 issuerUID    [7] UniqueIdentifier      OPTIONAL,\r\n                 subjectUID   [8] UniqueIdentifier      OPTIONAL,\r\n                 extensions   [9] Extensions            OPTIONAL }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.Controls.ToAsn1Object\">\r\n            <pre>\r\n            Controls  ::= SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.EncKeyWithID.ToAsn1Object\">\r\n            <pre>\r\n            EncKeyWithID ::= SEQUENCE {\r\n                 privateKey           PrivateKeyInfo,\r\n                 identifier CHOICE {\r\n                    string               UTF8String,\r\n                    generalName          GeneralName\r\n                } OPTIONAL\r\n            }\r\n            </pre>\r\n            @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.EncryptedKey.ToAsn1Object\">\r\n            <pre>\r\n               EncryptedKey ::= CHOICE {\r\n                   encryptedValue        EncryptedValue, -- deprecated\r\n                   envelopedData     [0] EnvelopedData }\r\n                   -- The encrypted private key MUST be placed in the envelopedData\r\n                   -- encryptedContentInfo encryptedContent OCTET STRING.\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.EncryptedValue.ToAsn1Object\">\r\n            <pre>\r\n            EncryptedValue ::= SEQUENCE {\r\n                                intendedAlg   [0] AlgorithmIdentifier  OPTIONAL,\r\n                                -- the intended algorithm for which the value will be used\r\n                                symmAlg       [1] AlgorithmIdentifier  OPTIONAL,\r\n                                -- the symmetric algorithm used to encrypt the value\r\n                                encSymmKey    [2] BIT STRING           OPTIONAL,\r\n                                -- the (encrypted) symmetric key used to encrypt the value\r\n                                keyAlg        [3] AlgorithmIdentifier  OPTIONAL,\r\n                                -- algorithm used to encrypt the symmetric key\r\n                                valueHint     [4] OCTET STRING         OPTIONAL,\r\n                                -- a brief description or identifier of the encValue content\r\n                                -- (may be meaningful only to the sending entity, and used only\r\n                                -- if EncryptedValue might be re-examined by the sending entity\r\n                                -- in the future)\r\n                                encValue       BIT STRING }\r\n                                -- the encrypted value itself\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.OptionalValidity.ToAsn1Object\">\r\n            <pre>\r\n            OptionalValidity ::= SEQUENCE {\r\n                                   notBefore  [0] Time OPTIONAL,\r\n                                   notAfter   [1] Time OPTIONAL } --at least one MUST be present\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PkiArchiveOptions.ToAsn1Object\">\r\n            <pre>\r\n             PkiArchiveOptions ::= CHOICE {\r\n                 encryptedPrivKey     [0] EncryptedKey,\r\n                 -- the actual value of the private key\r\n                 keyGenParameters     [1] KeyGenParameters,\r\n                 -- parameters which allow the private key to be re-generated\r\n                 archiveRemGenPrivKey [2] BOOLEAN }\r\n                 -- set to TRUE if sender wishes receiver to archive the private\r\n                 -- key of a key pair that the receiver generates in response to\r\n                 -- this request; set to FALSE if no archival is desired.\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PkiPublicationInfo.ToAsn1Object\">\r\n            <pre>\r\n            PkiPublicationInfo ::= SEQUENCE {\r\n                             action     INTEGER {\r\n                                            dontPublish (0),\r\n                                            pleasePublish (1) },\r\n                             pubInfos  SEQUENCE SIZE (1..MAX) OF SinglePubInfo OPTIONAL }\r\n            -- pubInfos MUST NOT be present if action is \"dontPublish\"\r\n            -- (if action is \"pleasePublish\" and pubInfos is omitted,\r\n            -- \"dontCare\" is assumed)\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Asn1.Crmf.PKMacValue\">\r\n            Password-based MAC value for use with POPOSigningKeyInput.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PKMacValue.#ctor(Org.BouncyCastle.Asn1.Cmp.PbmParameter,Org.BouncyCastle.Asn1.DerBitString)\">\r\n            Creates a new PKMACValue.\r\n            @param params parameters for password-based MAC\r\n            @param value MAC of the DER-encoded SubjectPublicKeyInfo\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PKMacValue.#ctor(Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier,Org.BouncyCastle.Asn1.DerBitString)\">\r\n            Creates a new PKMACValue.\r\n            @param aid CMPObjectIdentifiers.passwordBasedMAC, with PBMParameter\r\n            @param value MAC of the DER-encoded SubjectPublicKeyInfo\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PKMacValue.ToAsn1Object\">\r\n            <pre>\r\n            PKMACValue ::= SEQUENCE {\r\n                 algId  AlgorithmIdentifier,\r\n                 -- algorithm value shall be PasswordBasedMac 1.2.840.113533.7.66.13\r\n                 -- parameter value is PBMParameter\r\n                 value  BIT STRING }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PopoPrivKey.ToAsn1Object\">\r\n            <pre>\r\n            PopoPrivKey ::= CHOICE {\r\n                   thisMessage       [0] BIT STRING,         -- Deprecated\r\n                    -- possession is proven in this message (which contains the private\r\n                    -- key itself (encrypted for the CA))\r\n                   subsequentMessage [1] SubsequentMessage,\r\n                    -- possession will be proven in a subsequent message\r\n                   dhMAC             [2] BIT STRING,         -- Deprecated\r\n                   agreeMAC          [3] PKMACValue,\r\n                   encryptedKey      [4] EnvelopedData }\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PopoSigningKey.#ctor(Org.BouncyCastle.Asn1.Crmf.PopoSigningKeyInput,Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier,Org.BouncyCastle.Asn1.DerBitString)\">\r\n            Creates a new Proof of Possession object for a signing key.\r\n            @param poposkIn the PopoSigningKeyInput structure, or null if the\r\n                CertTemplate includes both subject and publicKey values.\r\n            @param aid the AlgorithmIdentifier used to sign the proof of possession.\r\n            @param signature a signature over the DER-encoded value of poposkIn,\r\n                or the DER-encoded value of certReq if poposkIn is null.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PopoSigningKey.ToAsn1Object\">\r\n            <pre>\r\n            PopoSigningKey ::= SEQUENCE {\r\n                                 poposkInput           [0] PopoSigningKeyInput OPTIONAL,\r\n                                 algorithmIdentifier   AlgorithmIdentifier,\r\n                                 signature             BIT STRING }\r\n             -- The signature (using \"algorithmIdentifier\") is on the\r\n             -- DER-encoded value of poposkInput.  NOTE: If the CertReqMsg\r\n             -- certReq CertTemplate contains the subject and publicKey values,\r\n             -- then poposkInput MUST be omitted and the signature MUST be\r\n             -- computed on the DER-encoded value of CertReqMsg certReq.  If\r\n             -- the CertReqMsg certReq CertTemplate does not contain the public\r\n             -- key and subject values, then poposkInput MUST be present and\r\n             -- MUST be signed.  This strategy ensures that the public key is\r\n             -- not present in both the poposkInput and CertReqMsg certReq\r\n             -- CertTemplate fields.\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PopoSigningKeyInput.#ctor(Org.BouncyCastle.Asn1.X509.GeneralName,Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo)\">\r\n            Creates a new PopoSigningKeyInput with sender name as authInfo. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PopoSigningKeyInput.#ctor(Org.BouncyCastle.Asn1.Crmf.PKMacValue,Org.BouncyCastle.Asn1.X509.SubjectPublicKeyInfo)\">\r\n            Creates a new PopoSigningKeyInput using password-based MAC. \r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Crmf.PopoSigningKeyInput.Sender\">\r\n            Returns the sender field, or null if authInfo is publicKeyMac \r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Asn1.Crmf.PopoSigningKeyInput.PublicKeyMac\">\r\n            Returns the publicKeyMac field, or null if authInfo is sender \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.PopoSigningKeyInput.ToAsn1Object\">\r\n            <pre>\r\n            PopoSigningKeyInput ::= SEQUENCE {\r\n                   authInfo             CHOICE {\r\n                                            sender              [0] GeneralName,\r\n                                            -- used only if an authenticated identity has been\r\n                                            -- established for the sender (e.g., a DN from a\r\n                                            -- previously-issued and currently-valid certificate\r\n                                            publicKeyMac        PKMacValue },\r\n                                            -- used if no authenticated GeneralName currently exists for\r\n                                            -- the sender; publicKeyMac contains a password-based MAC\r\n                                            -- on the DER-encoded value of publicKey\r\n                   publicKey           SubjectPublicKeyInfo }  -- from CertTemplate\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.ProofOfPossession.#ctor\">\r\n            Creates a ProofOfPossession with type raVerified. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.ProofOfPossession.#ctor(Org.BouncyCastle.Asn1.Crmf.PopoSigningKey)\">\r\n            Creates a ProofOfPossession for a signing key. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.ProofOfPossession.#ctor(System.Int32,Org.BouncyCastle.Asn1.Crmf.PopoPrivKey)\">\r\n            Creates a ProofOfPossession for key encipherment or agreement.\r\n            @param type one of TYPE_KEY_ENCIPHERMENT or TYPE_KEY_AGREEMENT\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.ProofOfPossession.ToAsn1Object\">\r\n            <pre>\r\n            ProofOfPossession ::= CHOICE {\r\n                                      raVerified        [0] NULL,\r\n                                      -- used if the RA has already verified that the requester is in\r\n                                      -- possession of the private key\r\n                                      signature         [1] PopoSigningKey,\r\n                                      keyEncipherment   [2] PopoPrivKey,\r\n                                      keyAgreement      [3] PopoPrivKey }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Asn1.Crmf.SinglePubInfo.ToAsn1Object\">\r\n            <pre>\r\n            SinglePubInfo ::= SEQUENCE {\r\n                   pubMethod    INTEGER {\r\n                      dontCare    (0),\r\n                      x500        (1),\r\n                      web         (2),\r\n                      ldap        (3) },\r\n                  pubLocation  GeneralName OPTIONAL }\r\n            </pre>\r\n            @return a basic ASN.1 object representation.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ArmoredInputStream\">\r\n            reader for Base64 armored objects - read the headers and then start returning\r\n            bytes when the data is reached. An IOException is thrown if the CRC check\r\n            fails.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.Decode(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32[])\">\r\n             decode the base 64 encoded input data.\r\n            \r\n             @return the offset the data starts in out.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.#ctor(System.IO.Stream)\">\r\n             Create a stream for reading a PGP armoured message, parsing up to a header\r\n             and then reading the data that follows.\r\n            \r\n             @param input\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.#ctor(System.IO.Stream,System.Boolean)\">\r\n             Create an armoured input stream which will assume the data starts\r\n             straight away, or parse for headers first depending on the value of\r\n             hasHeaders.\r\n            \r\n             @param input\r\n             @param hasHeaders true if headers are to be looked for, false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.IsClearText\">\r\n            @return true if we are inside the clear text section of a PGP\r\n            signed message.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.IsEndOfStream\">\r\n            @return true if the stream is actually at end of file.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.GetArmorHeaderLine\">\r\n            Return the armor header line (if there is one)\r\n            @return the armor header line, null if none present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredInputStream.GetArmorHeaders\">\r\n            Return the armor headers (the lines after the armor header line),\r\n            @return an array of armor headers, null if there aren't any.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ArmoredOutputStream\">\r\n            Basic output stream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredOutputStream.Encode(System.IO.Stream,System.Int32[],System.Int32)\">\r\n            encode the input data producing a base 64 encoded byte array.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredOutputStream.SetHeader(System.String,System.String)\">\r\n             Set an additional header entry.\r\n            \r\n             @param name the name of the header entry.\r\n             @param v the value of the header entry.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredOutputStream.ResetHeaders\">\r\n            Reset the headers to only contain a Version string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredOutputStream.BeginClearText(Org.BouncyCastle.Bcpg.HashAlgorithmTag)\">\r\n            Start a clear text signed message.\r\n            @param hashAlgorithm\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ArmoredOutputStream.Close\">\r\n            <b>Note</b>: close does nor close the underlying stream. So it is possible to write\r\n            multiple objects using armoring to a single stream.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Attr.ImageAttrib\">\r\n            <remarks>Basic type for a image attribute packet.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.BcpgInputStream\">\r\n            <remarks>Reader for PGP objects.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgInputStream.NextPacketTag\">\r\n            <summary>Returns the next packet tag in the stream.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.BcpgInputStream.PartialInputStream\">\r\n            <summary>\r\n            A stream that overlays our input stream, allowing the user to only read a segment of it.\r\n            NB: dataLength will be negative if the segment length is in the upper range above 2**31.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.BcpgObject\">\r\n            <remarks>Base class for a PGP object.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.BcpgOutputStream\">\r\n            <remarks>Basic output stream.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.#ctor(System.IO.Stream)\">\r\n            <summary>Create a stream representing a general packet.</summary>\r\n            <param name=\"outStr\">Output stream to write to.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.#ctor(System.IO.Stream,Org.BouncyCastle.Bcpg.PacketTag)\">\r\n            <summary>Create a stream representing an old style partial object.</summary>\r\n            <param name=\"outStr\">Output stream to write to.</param>\r\n            <param name=\"tag\">The packet tag for the object.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.#ctor(System.IO.Stream,Org.BouncyCastle.Bcpg.PacketTag,System.Int64,System.Boolean)\">\r\n            <summary>Create a stream representing a general packet.</summary>\r\n            <param name=\"outStr\">Output stream to write to.</param>\r\n            <param name=\"tag\">Packet tag.</param>\r\n            <param name=\"length\">Size of chunks making up the packet.</param>\r\n            <param name=\"oldFormat\">If true, the header is written out in old format.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.#ctor(System.IO.Stream,Org.BouncyCastle.Bcpg.PacketTag,System.Int64)\">\r\n            <summary>Create a new style partial input stream buffered into chunks.</summary>\r\n            <param name=\"outStr\">Output stream to write to.</param>\r\n            <param name=\"tag\">Packet tag.</param>\r\n            <param name=\"length\">Size of chunks making up the packet.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.#ctor(System.IO.Stream,Org.BouncyCastle.Bcpg.PacketTag,System.Byte[])\">\r\n            <summary>Create a new style partial input stream buffered into chunks.</summary>\r\n            <param name=\"outStr\">Output stream to write to.</param>\r\n            <param name=\"tag\">Packet tag.</param>\r\n            <param name=\"buffer\">Buffer to use for collecting chunks.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.Flush\">\r\n            <summary>Flush the underlying stream.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.BcpgOutputStream.Finish\">\r\n            <summary>Finish writing out the current packet without closing the underlying stream.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.CompressedDataPacket\">\r\n            <remarks>Generic compressed data object.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.CompressedDataPacket.Algorithm\">\r\n            <summary>The algorithm tag value.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.CompressionAlgorithmTag\">\r\n            <remarks>Basic tags for compression algorithms.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ContainedPacket\">\r\n            <remarks>Basic type for a PGP packet.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.DsaPublicBcpgKey\">\r\n            <remarks>Base class for a DSA public key.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.DsaPublicBcpgKey.#ctor(Org.BouncyCastle.Bcpg.BcpgInputStream)\">\r\n            <param name=\"bcpgIn\">The stream to read the packet from.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.DsaPublicBcpgKey.Format\">\r\n            <summary>The format, as a string, always \"PGP\".</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.DsaPublicBcpgKey.GetEncoded\">\r\n            <summary>Return the standard PGP encoding of the key.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.DsaSecretBcpgKey\">\r\n            <remarks>Base class for a DSA secret key.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.DsaSecretBcpgKey.#ctor(Org.BouncyCastle.Bcpg.BcpgInputStream)\">\r\n            @param in\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.DsaSecretBcpgKey.Format\">\r\n            <summary>The format, as a string, always \"PGP\".</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.DsaSecretBcpgKey.GetEncoded\">\r\n            <summary>Return the standard PGP encoding of the key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.DsaSecretBcpgKey.X\">\r\n            @return x\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ElGamalPublicBcpgKey\">\r\n            <remarks>Base class for an ElGamal public key.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.ElGamalPublicBcpgKey.Format\">\r\n            <summary>The format, as a string, always \"PGP\".</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ElGamalPublicBcpgKey.GetEncoded\">\r\n            <summary>Return the standard PGP encoding of the key.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ElGamalSecretBcpgKey\">\r\n            <remarks>Base class for an ElGamal secret key.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ElGamalSecretBcpgKey.#ctor(Org.BouncyCastle.Bcpg.BcpgInputStream)\">\r\n            @param in\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ElGamalSecretBcpgKey.#ctor(Org.BouncyCastle.Math.BigInteger)\">\r\n            @param x\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.ElGamalSecretBcpgKey.Format\">\r\n            <summary>The format, as a string, always \"PGP\".</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.ElGamalSecretBcpgKey.GetEncoded\">\r\n            <summary>Return the standard PGP encoding of the key.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ExperimentalPacket\">\r\n            <remarks>Basic packet for an experimental packet.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.HashAlgorithmTag\">\r\n            <remarks>Basic tags for hash algorithms.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.IBcpgKey\">\r\n            <remarks>Base interface for a PGP key.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.IBcpgKey.Format\">\r\n            <summary>\r\n            The base format for this key - in the case of the symmetric keys it will generally\r\n            be raw indicating that the key is just a straight byte representation, for an asymmetric\r\n            key the format will be PGP, indicating the key is a string of MPIs encoded in PGP format.\r\n            </summary>\r\n            <returns>\"RAW\" or \"PGP\".</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.InputStreamPacket.GetInputStream\">\r\n            <summary>Note: you can only read from this once...</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.LiteralDataPacket\">\r\n            <remarks>Generic literal data packet.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.LiteralDataPacket.Format\">\r\n            <summary>The format tag value.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.LiteralDataPacket.ModificationTime\">\r\n            <summary>The modification time of the file in milli-seconds (since Jan 1, 1970 UTC)</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.MarkerPacket\">\r\n            <remarks>Basic type for a marker packet.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.ModDetectionCodePacket\">\r\n            <remarks>Basic packet for a modification detection code packet.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.MPInteger\">\r\n            <remarks>A multiple precision integer</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OnePassSignaturePacket\">\r\n            <remarks>Generic signature object</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OnePassSignaturePacket.KeyAlgorithm\">\r\n            <summary>The encryption algorithm tag.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OnePassSignaturePacket.HashAlgorithm\">\r\n            <summary>The hash algorithm tag.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.PacketTag\">\r\n            <remarks>Basic PGP packet tag types.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag\">\r\n            <remarks>Public Key Algorithm tag numbers.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.PublicKeyEncSessionPacket\">\r\n            <remarks>Basic packet for a PGP public key.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.PublicKeyPacket\">\r\n            <remarks>Basic packet for a PGP public key.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.PublicKeyPacket.#ctor(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,System.DateTime,Org.BouncyCastle.Bcpg.IBcpgKey)\">\r\n            <summary>Construct a version 4 public key packet.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.PublicSubkeyPacket\">\r\n            <remarks>Basic packet for a PGP public subkey</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.PublicSubkeyPacket.#ctor(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,System.DateTime,Org.BouncyCastle.Bcpg.IBcpgKey)\">\r\n            <summary>Construct a version 4 public subkey packet.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.RsaPublicBcpgKey\">\r\n            <remarks>Base class for an RSA public key.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.RsaPublicBcpgKey.#ctor(Org.BouncyCastle.Bcpg.BcpgInputStream)\">\r\n            <summary>Construct an RSA public key from the passed in stream.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.RsaPublicBcpgKey.#ctor(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            <param name=\"n\">The modulus.</param>\r\n            <param name=\"e\">The public exponent.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.RsaPublicBcpgKey.Format\">\r\n            <summary>The format, as a string, always \"PGP\".</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.RsaPublicBcpgKey.GetEncoded\">\r\n            <summary>Return the standard PGP encoding of the key.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.RsaSecretBcpgKey\">\r\n            <remarks>Base class for an RSA secret (or priate) key.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.RsaSecretBcpgKey.Format\">\r\n            <summary>The format, as a string, always \"PGP\".</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.RsaSecretBcpgKey.GetEncoded\">\r\n            <summary>Return the standard PGP encoding of the key.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.S2k\">\r\n            <remarks>The string to key specifier class.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.S2k.HashAlgorithm\">\r\n            <summary>The hash algorithm.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.S2k.GetIV\">\r\n            <summary>The IV for the key generation algorithm.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.S2k.IterationCount\">\r\n            <summary>The iteration count</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.S2k.ProtectionMode\">\r\n            <summary>The protection mode - only if GnuDummyS2K</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SecretKeyPacket\">\r\n            <remarks>Basic packet for a PGP secret key.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SecretSubkeyPacket\">\r\n            <remarks>Basic packet for a PGP secret key.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SignaturePacket\">\r\n            <remarks>Generic signature packet.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SignaturePacket.#ctor(System.Int32,System.Int64,Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,Org.BouncyCastle.Bcpg.HashAlgorithmTag,Org.BouncyCastle.Bcpg.SignatureSubpacket[],Org.BouncyCastle.Bcpg.SignatureSubpacket[],System.Byte[],Org.BouncyCastle.Bcpg.MPInteger[])\">\r\n             Generate a version 4 signature packet.\r\n            \r\n             @param signatureType\r\n             @param keyAlgorithm\r\n             @param hashAlgorithm\r\n             @param hashedData\r\n             @param unhashedData\r\n             @param fingerprint\r\n             @param signature\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SignaturePacket.#ctor(System.Int32,System.Int32,System.Int64,Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,Org.BouncyCastle.Bcpg.HashAlgorithmTag,System.Int64,System.Byte[],Org.BouncyCastle.Bcpg.MPInteger[])\">\r\n             Generate a version 2/3 signature packet.\r\n            \r\n             @param signatureType\r\n             @param keyAlgorithm\r\n             @param hashAlgorithm\r\n             @param fingerprint\r\n             @param signature\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.SignaturePacket.KeyId\">\r\n            return the keyId\r\n            @return the keyId that created the signature.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SignaturePacket.GetSignatureTrailer\">\r\n             return the signature trailer that must be included with the data\r\n             to reconstruct the signature\r\n            \r\n             @return byte[]\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SignaturePacket.GetSignature\">\r\n            \t\t* return the signature as a set of integers - note this is normalised to be the\r\n                    * ASN.1 encoding of what appears in the signature packet.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SignaturePacket.GetSignatureBytes\">\r\n            Return the byte encoding of the signature section.\r\n            @return uninterpreted signature bytes.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.SignaturePacket.CreationTime\">\r\n            <summary>Return the creation time in milliseconds since 1 Jan., 1970 UTC.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SignatureSubpacket\">\r\n            <remarks>Basic type for a PGP Signature sub-packet.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SignatureSubpacket.GetData\">\r\n            <summary>Return the generic data making up the packet.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SignatureSubpacketsParser\">\r\n            reader for signature sub-packets\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SignatureSubpacketTag\">\r\n            Basic PGP signature sub-packet tag types.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.EmbeddedSignature\">\r\n            Packet embedded signature\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.Exportable\">\r\n            packet giving signature creation time.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.IssuerKeyId\">\r\n            packet giving signature creation time.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.KeyExpirationTime\">\r\n            packet giving time after creation at which the key expires.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.Sig.KeyExpirationTime.Time\">\r\n             Return the number of seconds after creation time a key is valid for.\r\n            \r\n             @return second count for key validity.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.KeyFlags\">\r\n            Packet holding the key flag values.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.Sig.KeyFlags.Flags\">\r\n            <summary>\r\n            Return the flag values contained in the first 4 octets (note: at the moment\r\n            the standard only uses the first one).\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.NotationData\">\r\n            Class provided a NotationData object according to\r\n            RFC2440, Chapter 5.2.3.15. Notation Data\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.PreferredAlgorithms\">\r\n            packet giving signature creation time.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.PrimaryUserId\">\r\n            packet giving whether or not the signature is signed using the primary user ID for the key.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.Revocable\">\r\n            packet giving whether or not is revocable.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.SignatureCreationTime\">\r\n            packet giving signature creation time.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.SignatureExpirationTime\">\r\n            packet giving signature expiration time.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.Sig.SignatureExpirationTime.Time\">\r\n            return time in seconds before signature expires after creation time.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.SignerUserId\">\r\n            packet giving the User ID of the signer.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.Sig.TrustSignature\">\r\n            packet giving trust.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SymmetricEncDataPacket\">\r\n            <remarks>Basic type for a symmetric key encrypted packet.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag\">\r\n            Basic tags for symmetric key algorithms\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.SymmetricKeyEncSessionPacket\">\r\n            Basic type for a symmetric encrypted session key packet\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.SymmetricKeyEncSessionPacket.EncAlgorithm\">\r\n            @return int\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.SymmetricKeyEncSessionPacket.S2k\">\r\n            @return S2k\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.SymmetricKeyEncSessionPacket.GetSecKeyData\">\r\n            @return byte[]\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.SymmetricKeyEncSessionPacket.Version\">\r\n            @return int\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.TrustPacket\">\r\n            <summary>Basic type for a trust packet.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.UserAttributePacket\">\r\n            Basic type for a user attribute packet.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.UserAttributeSubpacket\">\r\n            Basic type for a user attribute sub-packet.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.UserAttributeSubpacket.GetData\">\r\n            return the generic data making up the packet.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.UserAttributeSubpacketsParser\">\r\n            reader for user attribute sub-packets\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.UserAttributeSubpacketTag\">\r\n            Basic PGP user attribute sub-packet tag types.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.UserIdPacket\">\r\n            Basic type for a user ID packet.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedData\">\r\n            <remarks>Compressed data objects</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedData.Algorithm\">\r\n            <summary>The algorithm used for compression</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedData.GetInputStream\">\r\n            <summary>Get the raw input stream contained in the object.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedData.GetDataStream\">\r\n            <summary>Return an uncompressed input stream which allows reading of the compressed data.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedDataGenerator\">\r\n            <remarks>Class for producing compressed data packets.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedDataGenerator.Open(System.IO.Stream)\">\r\n            <summary>\r\n            <p>\r\n            Return an output stream which will save the data being written to\r\n            the compressed object.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            </summary>\r\n            <param name=\"outStr\">Stream to be used for output.</param>\r\n            <returns>A Stream for output of the compressed data.</returns>\r\n            <exception cref=\"T:System.ArgumentNullException\"></exception>\r\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedDataGenerator.Open(System.IO.Stream,System.Byte[])\">\r\n            <summary>\r\n            <p>\r\n            Return an output stream which will compress the data as it is written to it.\r\n            The stream will be written out in chunks according to the size of the passed in buffer.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            <p>\r\n            <b>Note</b>: if the buffer is not a power of 2 in length only the largest power of 2\r\n            bytes worth of the buffer will be used.\r\n            </p>\r\n            <p>\r\n            <b>Note</b>: using this may break compatibility with RFC 1991 compliant tools.\r\n            Only recent OpenPGP implementations are capable of accepting these streams.\r\n            </p>\r\n            </summary>\r\n            <param name=\"outStr\">Stream to be used for output.</param>\r\n            <param name=\"buffer\">The buffer to use.</param>\r\n            <returns>A Stream for output of the compressed data.</returns>\r\n            <exception cref=\"T:System.ArgumentNullException\"></exception>\r\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n            <exception cref=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpCompressedDataGenerator.Close\">\r\n            <summary>Close the compressed object.</summary>summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpDataValidationException\">\r\n            <remarks>\r\n            Thrown if the IV at the start of a data stream indicates the wrong key is being used.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedData.GetInputStream\">\r\n            <summary>Return the raw input stream for the data stream.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedData.IsIntegrityProtected\">\r\n            <summary>Return true if the message is integrity protected.</summary>\r\n            <returns>True, if there is a modification detection code namespace associated\r\n            with this stream.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedData.Verify\">\r\n            <summary>Note: This can only be called after the message has been read.</summary>\r\n            <returns>True, if the message verifies, false otherwise</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator\">\r\n            <remarks>Generator for encrypted objects.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.#ctor(Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Existing SecureRandom constructor.</summary>\r\n            <param name=\"encAlgorithm\">The symmetric algorithm to use.</param>\r\n            <param name=\"rand\">Source of randomness.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.#ctor(Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,System.Boolean,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Creates a cipher stream which will have an integrity packet associated with it.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.#ctor(Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,Org.BouncyCastle.Security.SecureRandom,System.Boolean)\">\r\n            <summary>Base constructor.</summary>\r\n            <param name=\"encAlgorithm\">The symmetric algorithm to use.</param>\r\n            <param name=\"rand\">Source of randomness.</param>\r\n            <param name=\"oldFormat\">PGP 2.6.x compatibility required.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.AddMethod(System.Char[])\">\r\n            <summary>\r\n            Add a PBE encryption method to the encrypted object using the default algorithm (S2K_SHA1).\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.AddMethod(System.Char[],Org.BouncyCastle.Bcpg.HashAlgorithmTag)\">\r\n            <summary>Add a PBE encryption method to the encrypted object.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.AddMethod(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Add a public key encrypted session key to the encrypted object.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.Open(System.IO.Stream,System.Int64,System.Byte[])\">\r\n            <summary>\r\n            <p>\r\n            If buffer is non null stream assumed to be partial, otherwise the length will be used\r\n            to output a fixed length packet.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.Open(System.IO.Stream,System.Int64)\">\r\n            <summary>\r\n            <p>\r\n            Return an output stream which will encrypt the data as it is written to it.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.Open(System.IO.Stream,System.Byte[])\">\r\n            <summary>\r\n            <p>\r\n            Return an output stream which will encrypt the data as it is written to it.\r\n            The stream will be written out in chunks according to the size of the passed in buffer.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            <p>\r\n            <b>Note</b>: if the buffer is not a power of 2 in length only the largest power of 2\r\n            bytes worth of the buffer will be used.\r\n            </p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataGenerator.Close\">\r\n            <summary>\r\n            <p>\r\n            Close off the encrypted object - this is equivalent to calling Close() on the stream\r\n            returned by the Open() method.\r\n            </p>\r\n            <p>\r\n            <b>Note</b>: This does not close the underlying output stream, only the stream on top of\r\n            it created by the Open() method.\r\n            </p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpEncryptedDataList\">\r\n            <remarks>A holder for a list of PGP encryption method packets.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\">\r\n            <remarks>Generic exception class for PGP encoding/decoding problems.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyFlags\">\r\n            <remarks>Key flag values for the KeyFlags subpacket.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair\">\r\n            <remarks>\r\n            General class to handle JCA key pairs and convert them into OpenPGP ones.\r\n            <p>\r\n            A word for the unwary, the KeyId for an OpenPGP public key is calculated from\r\n            a hash that includes the time of creation, if you pass a different date to the\r\n            constructor below with the same public private key pair the KeyIs will not be the\r\n            same as for previous generations of the key, so ideally you only want to do\r\n            this once.\r\n            </p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair.#ctor(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey)\">\r\n            <summary>Create a key pair from a PgpPrivateKey and a PgpPublicKey.</summary>\r\n            <param name=\"pub\">The public key.</param>\r\n            <param name=\"priv\">The private key.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair.KeyId\">\r\n            <summary>The keyId associated with this key pair.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator\">\r\n            <remarks>\r\n            Generator for a PGP master and subkey ring.\r\n            This class will generate both the secret and public key rings\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator.#ctor(System.Int32,Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair,System.String,Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,System.Char[],Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Create a new key ring generator using old style checksumming. It is recommended to use\r\n            SHA1 checksumming where possible.\r\n            </summary>\r\n            <param name=\"certificationLevel\">The certification level for keys on this ring.</param>\r\n            <param name=\"masterKey\">The master key pair.</param>\r\n            <param name=\"id\">The id to be associated with the ring.</param>\r\n            <param name=\"encAlgorithm\">The algorithm to be used to protect secret keys.</param>\r\n            <param name=\"passPhrase\">The passPhrase to be used to protect secret keys.</param>\r\n            <param name=\"hashedPackets\">Packets to be included in the certification hash.</param>\r\n            <param name=\"unhashedPackets\">Packets to be attached unhashed to the certification.</param>\r\n            <param name=\"rand\">input secured random.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator.#ctor(System.Int32,Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair,System.String,Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,System.Char[],System.Boolean,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Create a new key ring generator.\r\n            </summary>\r\n            <param name=\"certificationLevel\">The certification level for keys on this ring.</param>\r\n            <param name=\"masterKey\">The master key pair.</param>\r\n            <param name=\"id\">The id to be associated with the ring.</param>\r\n            <param name=\"encAlgorithm\">The algorithm to be used to protect secret keys.</param>\r\n            <param name=\"passPhrase\">The passPhrase to be used to protect secret keys.</param>\r\n            <param name=\"useSha1\">Checksum the secret keys with SHA1 rather than the older 16 bit checksum.</param>\r\n            <param name=\"hashedPackets\">Packets to be included in the certification hash.</param>\r\n            <param name=\"unhashedPackets\">Packets to be attached unhashed to the certification.</param>\r\n            <param name=\"rand\">input secured random.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator.AddSubKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair)\">\r\n            <summary>Add a subkey to the key ring to be generated with default certification.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator.AddSubKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyPair,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector)\">\r\n            <summary>\r\n            Add a subkey with specific hashed and unhashed packets associated with it and\r\n            default certification.\r\n            </summary>\r\n            <param name=\"keyPair\">Public/private key pair.</param>\r\n            <param name=\"hashedPackets\">Hashed packet values to be included in certification.</param>\r\n            <param name=\"unhashedPackets\">Unhashed packets values to be included in certification.</param>\r\n            <exception cref=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator.GenerateSecretKeyRing\">\r\n            <summary>Return the secret key ring.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyRingGenerator.GeneratePublicKeyRing\">\r\n            <summary>Return the public key ring that corresponds to the secret key ring.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpKeyValidationException\">\r\n            <remarks>\r\n            Thrown if the key checksum is invalid.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData\">\r\n            <summary>Class for processing literal data objects.</summary>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.Console\">\r\n            <summary>The special name indicating a \"for your eyes only\" packet.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.Format\">\r\n            <summary>The format of the data stream - Binary or Text</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.FileName\">\r\n            <summary>The file name that's associated with the data stream.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.GetRawFileName\">\r\n            Return the file name as an unintrepreted byte array.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.ModificationTime\">\r\n            <summary>The modification time for the file.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.GetInputStream\">\r\n            <summary>The raw input stream for the data stream.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralData.GetDataStream\">\r\n            <summary>The input stream representing the data stream.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator\">\r\n            <remarks>Class for producing literal data packets.</remarks>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator.Console\">\r\n            <summary>The special name indicating a \"for your eyes only\" packet.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator.#ctor(System.Boolean)\">\r\n            <summary>\r\n            Generates literal data objects in the old format.\r\n            This is important if you need compatibility with PGP 2.6.x.\r\n            </summary>\r\n            <param name=\"oldFormat\">If true, uses old format.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator.Open(System.IO.Stream,System.Char,System.String,System.Int64,System.DateTime)\">\r\n            <summary>\r\n            <p>\r\n            Open a literal data packet, returning a stream to store the data inside the packet.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            </summary>\r\n            <param name=\"outStr\">The stream we want the packet in.</param>\r\n            <param name=\"format\">The format we are using.</param>\r\n            <param name=\"name\">The name of the 'file'.</param>\r\n            <param name=\"length\">The length of the data we will write.</param>\r\n            <param name=\"modificationTime\">The time of last modification we want stored.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator.Open(System.IO.Stream,System.Char,System.String,System.DateTime,System.Byte[])\">\r\n            <summary>\r\n            <p>\r\n            Open a literal data packet, returning a stream to store the data inside the packet,\r\n            as an indefinite length stream. The stream is written out as a series of partial\r\n            packets with a chunk size determined by the size of the passed in buffer.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            <p>\r\n            <b>Note</b>: if the buffer is not a power of 2 in length only the largest power of 2\r\n            bytes worth of the buffer will be used.</p>\r\n            </summary>\r\n            <param name=\"outStr\">The stream we want the packet in.</param>\r\n            <param name=\"format\">The format we are using.</param>\r\n            <param name=\"name\">The name of the 'file'.</param>\r\n            <param name=\"modificationTime\">The time of last modification we want stored.</param>\r\n            <param name=\"buffer\">The buffer to use for collecting data to put into chunks.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator.Open(System.IO.Stream,System.Char,System.IO.FileInfo)\">\r\n            <summary>\r\n            <p>\r\n            Open a literal data packet for the passed in <c>FileInfo</c> object, returning\r\n            an output stream for saving the file contents.\r\n            </p>\r\n            <p>\r\n            The stream created can be closed off by either calling Close()\r\n            on the stream or Close() on the generator. Closing the returned\r\n            stream does not close off the Stream parameter <c>outStr</c>.\r\n            </p>\r\n            </summary>\r\n            <param name=\"outStr\">The stream we want the packet in.</param>\r\n            <param name=\"format\">The format we are using.</param>\r\n            <param name=\"file\">The <c>FileInfo</c> object containg the packet details.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpLiteralDataGenerator.Close\">\r\n            <summary>\r\n            Close the literal data packet - this is equivalent to calling Close()\r\n            on the stream returned by the Open() method.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpMarker\">\r\n            <remarks>\r\n            A PGP marker packet - in general these should be ignored other than where\r\n            the idea is to preserve the original input stream.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpObjectFactory\">\r\n            <remarks>\r\n            General class for reading a PGP object stream.\r\n            <p>\r\n            Note: if this class finds a PgpPublicKey or a PgpSecretKey it\r\n            will create a PgpPublicKeyRing, or a PgpSecretKeyRing for each\r\n            key found. If all you are trying to do is read a key ring file use\r\n            either PgpPublicKeyRingBundle or PgpSecretKeyRingBundle.</p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpObjectFactory.NextPgpObject\">\r\n            <summary>Return the next object in the stream, or null if the end is reached.</summary>\r\n            <exception cref=\"T:System.IO.IOException\">On a parse error</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpObjectFactory.AllPgpObjects\">\r\n            <summary>\r\n            Return all available objects in a list.\r\n            </summary>\r\n            <returns>An <c>IList</c> containing all objects from this factory, in order.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpOnePassSignature\">\r\n            <remarks>A one pass signature object.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpOnePassSignature.InitVerify(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Initialise the signature object for verification.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpOnePassSignature.Verify(Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Verify the calculated signature against the passed in PgpSignature.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpOnePassSignatureList\">\r\n            <remarks>Holder for a list of PgpOnePassSignature objects.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpPbeEncryptedData\">\r\n            <remarks>A password based encryption object.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPbeEncryptedData.GetInputStream\">\r\n            <summary>Return the raw input stream for the data stream.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPbeEncryptedData.GetDataStream(System.Char[])\">\r\n            <summary>Return the decrypted input stream, using the passed in passphrase.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey\">\r\n            <remarks>General class to contain a private key for use with other OpenPGP objects.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Int64)\">\r\n            <summary>\r\n            Create a PgpPrivateKey from a regular private key and the ID of its\r\n            associated public key.\r\n            </summary>\r\n            <param name=\"privateKey\">Private key to use.</param>\r\n            <param name=\"keyId\">ID of the corresponding public key.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey.KeyId\">\r\n            <summary>The keyId associated with the contained private key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey.Key\">\r\n            <summary>The contained private key.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey\">\r\n            <remarks>General class to handle a PGP public key object.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.#ctor(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.DateTime)\">\r\n            <summary>\r\n            Create a PgpPublicKey from the passed in lightweight one.\r\n            </summary>\r\n            <remarks>\r\n            Note: the time passed in affects the value of the key's keyId, so you probably only want\r\n            to do this once for a lightweight key, or make sure you keep track of the time you used.\r\n            </remarks>\r\n            <param name=\"algorithm\">Asymmetric algorithm type representing the public key.</param>\r\n            <param name=\"pubKey\">Actual public key to associate.</param>\r\n            <param name=\"time\">Date of creation.</param>\r\n            <exception cref=\"T:System.ArgumentException\">If <c>pubKey</c> is not public.</exception>\r\n            <exception cref=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\">On key creation problem.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.#ctor(Org.BouncyCastle.Bcpg.PublicKeyPacket,Org.BouncyCastle.Bcpg.TrustPacket,System.Collections.IList)\">\r\n            <summary>Constructor for a sub-key.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.#ctor(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Copy constructor.</summary>\r\n            <param name=\"pubKey\">The public key to copy.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.Version\">\r\n            <summary>The version of this key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.CreationTime\">\r\n            <summary>The creation time of this key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.ValidDays\">\r\n            <summary>The number of valid days from creation time - zero means no expiry.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetTrustData\">\r\n            <summary>Return the trust data associated with the public key, if present.</summary>\r\n            <returns>A byte array with trust data, null otherwise.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetValidSeconds\">\r\n            <summary>The number of valid seconds from creation time - zero means no expiry.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.KeyId\">\r\n            <summary>The keyId associated with the public key.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetFingerprint\">\r\n            <summary>The fingerprint of the key</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.IsEncryptionKey\">\r\n            <summary>\r\n            Check if this key has an algorithm type that makes it suitable to use for encryption.\r\n            </summary>\r\n            <remarks>\r\n            Note: with version 4 keys KeyFlags subpackets should also be considered when present for\r\n            determining the preferred use of the key.\r\n            </remarks>\r\n            <returns>\r\n            <c>true</c> if this key algorithm is suitable for encryption.\r\n            </returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.IsMasterKey\">\r\n            <summary>True, if this is a master key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.Algorithm\">\r\n            <summary>The algorithm code associated with the public key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.BitStrength\">\r\n            <summary>The strength of the key in bits.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetKey\">\r\n            <summary>The public key contained in the object.</summary>\r\n            <returns>A lightweight public key.</returns>\r\n            <exception cref=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\">If the key algorithm is not recognised.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetUserIds\">\r\n            <summary>Allows enumeration of any user IDs associated with the key.</summary>\r\n            <returns>An <c>IEnumerable</c> of <c>string</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetUserAttributes\">\r\n            <summary>Allows enumeration of any user attribute vectors associated with the key.</summary>\r\n            <returns>An <c>IEnumerable</c> of <c>PgpUserAttributeSubpacketVector</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetSignaturesForId(System.String)\">\r\n            <summary>Allows enumeration of any signatures associated with the passed in id.</summary>\r\n            <param name=\"id\">The ID to be matched.</param>\r\n            <returns>An <c>IEnumerable</c> of <c>PgpSignature</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetSignaturesForUserAttribute(Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector)\">\r\n            <summary>Allows enumeration of signatures associated with the passed in user attributes.</summary>\r\n            <param name=\"userAttributes\">The vector of user attributes to be matched.</param>\r\n            <returns>An <c>IEnumerable</c> of <c>PgpSignature</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetSignaturesOfType(System.Int32)\">\r\n            <summary>Allows enumeration of signatures of the passed in type that are on this key.</summary>\r\n            <param name=\"signatureType\">The type of the signature to be returned.</param>\r\n            <returns>An <c>IEnumerable</c> of <c>PgpSignature</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.GetSignatures\">\r\n            <summary>Allows enumeration of all signatures/certifications associated with this key.</summary>\r\n            <returns>An <c>IEnumerable</c> with all signatures/certifications.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.IsRevoked\">\r\n            <summary>Check whether this (sub)key has a revocation signature on it.</summary>\r\n            <returns>True, if this (sub)key has been revoked.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.AddCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,System.String,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Add a certification for an id to the given public key.</summary>\r\n            <param name=\"key\">The key the certification is to be added to.</param>\r\n            <param name=\"id\">The ID the certification is associated with.</param>\r\n            <param name=\"certification\">The new certification.</param>\r\n            <returns>The re-certified key.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.AddCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Add a certification for the given UserAttributeSubpackets to the given public key.</summary>\r\n            <param name=\"key\">The key the certification is to be added to.</param>\r\n            <param name=\"userAttributes\">The attributes the certification is associated with.</param>\r\n            <param name=\"certification\">The new certification.</param>\r\n            <returns>The re-certified key.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.RemoveCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector)\">\r\n            <summary>\r\n            Remove any certifications associated with a user attribute subpacket on a key.\r\n            </summary>\r\n            <param name=\"key\">The key the certifications are to be removed from.</param>\r\n            <param name=\"userAttributes\">The attributes to be removed.</param>\r\n            <returns>\r\n            The re-certified key, or null if the user attribute subpacket was not found on the key.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.RemoveCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,System.String)\">\r\n            <summary>Remove any certifications associated with a given ID on a key.</summary>\r\n            <param name=\"key\">The key the certifications are to be removed from.</param>\r\n            <param name=\"id\">The ID that is to be removed.</param>\r\n            <returns>The re-certified key, or null if the ID was not found on the key.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.RemoveCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,System.String,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Remove a certification associated with a given ID on a key.</summary>\r\n            <param name=\"key\">The key the certifications are to be removed from.</param>\r\n            <param name=\"id\">The ID that the certfication is to be removed from.</param>\r\n            <param name=\"certification\">The certfication to be removed.</param>\r\n            <returns>The re-certified key, or null if the certification was not found.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.RemoveCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Remove a certification associated with a given user attributes on a key.</summary>\r\n            <param name=\"key\">The key the certifications are to be removed from.</param>\r\n            <param name=\"userAttributes\">The user attributes that the certfication is to be removed from.</param>\r\n            <param name=\"certification\">The certification to be removed.</param>\r\n            <returns>The re-certified key, or null if the certification was not found.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.AddCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Add a revocation or some other key certification to a key.</summary>\r\n            <param name=\"key\">The key the revocation is to be added to.</param>\r\n            <param name=\"certification\">The key signature to be added.</param>\r\n            <returns>The new changed public key object.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey.RemoveCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature)\">\r\n            <summary>Remove a certification from the key.</summary>\r\n            <param name=\"key\">The key the certifications are to be removed from.</param>\r\n            <param name=\"certification\">The certfication to be removed.</param>\r\n            <returns>The modified key, null if the certification was not found.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyEncryptedData\">\r\n            <remarks>A public key encrypted data object.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyEncryptedData.KeyId\">\r\n            <summary>The key ID for the key used to encrypt the data.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyEncryptedData.GetSymmetricAlgorithm(Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey)\">\r\n            <summary>\r\n            Return the algorithm code for the symmetric algorithm used to encrypt the data.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyEncryptedData.GetDataStream(Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey)\">\r\n            <summary>Return the decrypted data stream for the packet.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing\">\r\n            <remarks>\r\n            Class to hold a single master public key and its subkeys.\r\n            <p>\r\n            Often PGP keyring files consist of multiple master keys, if you are trying to process\r\n            or construct one of these you should use the <c>PgpPublicKeyRingBundle</c> class.\r\n            </p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing.GetPublicKey\">\r\n            <summary>Return the first public key in the ring.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing.GetPublicKey(System.Int64)\">\r\n            <summary>Return the public key referred to by the passed in key ID if it is present.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing.GetPublicKeys\">\r\n            <summary>Allows enumeration of all the public keys.</summary>\r\n            <returns>An <c>IEnumerable</c> of <c>PgpPublicKey</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing.InsertPublicKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>\r\n            Returns a new key ring with the public key passed in either added or\r\n            replacing an existing one.\r\n            </summary>\r\n            <param name=\"pubRing\">The public key ring to be modified.</param>\r\n            <param name=\"pubKey\">The public key to be inserted.</param>\r\n            <returns>A new <c>PgpPublicKeyRing</c></returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing.RemovePublicKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Returns a new key ring with the public key passed in removed from the key ring.</summary>\r\n            <param name=\"pubRing\">The public key ring to be modified.</param>\r\n            <param name=\"pubKey\">The public key to be removed.</param>\r\n            <returns>A new <c>PgpPublicKeyRing</c>, or null if pubKey is not found.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle\">\r\n            <remarks>\r\n            Often a PGP key ring file is made up of a succession of master/sub-key key rings.\r\n            If you want to read an entire public key file in one hit this is the class for you.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.#ctor(System.IO.Stream)\">\r\n            <summary>Build a PgpPublicKeyRingBundle from the passed in input stream.</summary>\r\n            <param name=\"inputStream\">Input stream containing data.</param>\r\n            <exception cref=\"T:System.IO.IOException\">If a problem parsing the stream occurs.</exception>\r\n            <exception cref=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\">If an object is encountered which isn't a PgpPublicKeyRing.</exception>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.Count\">\r\n            <summary>Return the number of key rings in this collection.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.GetKeyRings\">\r\n            <summary>Allow enumeration of the public key rings making up this collection.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.GetKeyRings(System.String)\">\r\n            <summary>Allow enumeration of the key rings associated with the passed in userId.</summary>\r\n            <param name=\"userId\">The user ID to be matched.</param>\r\n            <returns>An <c>IEnumerable</c> of key rings which matched (possibly none).</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.GetKeyRings(System.String,System.Boolean)\">\r\n            <summary>Allow enumeration of the key rings associated with the passed in userId.</summary>\r\n            <param name=\"userId\">The user ID to be matched.</param>\r\n            <param name=\"matchPartial\">If true, userId need only be a substring of an actual ID string to match.</param>\r\n            <returns>An <c>IEnumerable</c> of key rings which matched (possibly none).</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.GetKeyRings(System.String,System.Boolean,System.Boolean)\">\r\n            <summary>Allow enumeration of the key rings associated with the passed in userId.</summary>\r\n            <param name=\"userId\">The user ID to be matched.</param>\r\n            <param name=\"matchPartial\">If true, userId need only be a substring of an actual ID string to match.</param>\r\n            <param name=\"ignoreCase\">If true, case is ignored in user ID comparisons.</param>\r\n            <returns>An <c>IEnumerable</c> of key rings which matched (possibly none).</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.GetPublicKey(System.Int64)\">\r\n            <summary>Return the PGP public key associated with the given key id.</summary>\r\n            <param name=\"keyId\">The ID of the public key to return.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.GetPublicKeyRing(System.Int64)\">\r\n            <summary>Return the public key ring which contains the key referred to by keyId</summary>\r\n            <param name=\"keyId\">key ID to match against</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.Contains(System.Int64)\">\r\n            <summary>\r\n            Return true if a key matching the passed in key ID is present, false otherwise.\r\n            </summary>\r\n            <param name=\"keyID\">key ID to look for.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.AddPublicKeyRing(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing)\">\r\n            <summary>\r\n            Return a new bundle containing the contents of the passed in bundle and\r\n            the passed in public key ring.\r\n            </summary>\r\n            <param name=\"bundle\">The <c>PgpPublicKeyRingBundle</c> the key ring is to be added to.</param>\r\n            <param name=\"publicKeyRing\">The key ring to be added.</param>\r\n            <returns>A new <c>PgpPublicKeyRingBundle</c> merging the current one with the passed in key ring.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">If the keyId for the passed in key ring is already present.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle.RemovePublicKeyRing(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRingBundle,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing)\">\r\n            <summary>\r\n            Return a new bundle containing the contents of the passed in bundle with\r\n            the passed in public key ring removed.\r\n            </summary>\r\n            <param name=\"bundle\">The <c>PgpPublicKeyRingBundle</c> the key ring is to be removed from.</param>\r\n            <param name=\"publicKeyRing\">The key ring to be removed.</param>\r\n            <returns>A new <c>PgpPublicKeyRingBundle</c> not containing the passed in key ring.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">If the keyId for the passed in key ring is not present.</exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey\">\r\n            <remarks>General class to handle a PGP secret key object.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.IsSigningKey\">\r\n            <summary>\r\n            Check if this key has an algorithm type that makes it suitable to use for signing.\r\n            </summary>\r\n            <remarks>\r\n            Note: with version 4 keys KeyFlags subpackets should also be considered when present for\r\n            determining the preferred use of the key.\r\n            </remarks>\r\n            <returns>\r\n            <c>true</c> if this key algorithm is suitable for use with signing.\r\n            </returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.IsMasterKey\">\r\n            <summary>True, if this is a master key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.KeyEncryptionAlgorithm\">\r\n            <summary>The algorithm the key is encrypted with.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.KeyId\">\r\n            <summary>The key ID of the public key associated with this key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.PublicKey\">\r\n            <summary>The public key associated with this key.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.UserIds\">\r\n            <summary>Allows enumeration of any user IDs associated with the key.</summary>\r\n            <returns>An <c>IEnumerable</c> of <c>string</c> objects.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.UserAttributes\">\r\n            <summary>Allows enumeration of any user attribute vectors associated with the key.</summary>\r\n            <returns>An <c>IEnumerable</c> of <c>string</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.ExtractPrivateKey(System.Char[])\">\r\n            <summary>Extract a <c>PgpPrivateKey</c> from this secret key's encrypted contents.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.CopyWithNewPassword(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey,System.Char[],System.Char[],Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Return a copy of the passed in secret key, encrypted using a new password\r\n            and the passed in algorithm.\r\n            </summary>\r\n            <param name=\"key\">The PgpSecretKey to be copied.</param>\r\n            <param name=\"oldPassPhrase\">The current password for the key.</param>\r\n            <param name=\"newPassPhrase\">The new password for the key.</param>\r\n            <param name=\"newEncAlgorithm\">The algorithm to be used for the encryption.</param>\r\n            <param name=\"rand\">Source of randomness.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey.ReplacePublicKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Replace the passed the public key on the passed in secret key.</summary>\r\n            <param name=\"secretKey\">Secret key to change.</param>\r\n            <param name=\"publicKey\">New public key.</param>\r\n            <returns>A new secret key.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">If KeyId's do not match.</exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing\">\r\n            <remarks>\r\n            Class to hold a single master secret key and its subkeys.\r\n            <p>\r\n            Often PGP keyring files consist of multiple master keys, if you are trying to process\r\n            or construct one of these you should use the <c>PgpSecretKeyRingBundle</c> class.\r\n            </p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.GetPublicKey\">\r\n            <summary>Return the public key for the master key.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.GetSecretKey\">\r\n            <summary>Return the master private key.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.GetSecretKeys\">\r\n            <summary>Allows enumeration of the secret keys.</summary>\r\n            <returns>An <c>IEnumerable</c> of <c>PgpSecretKey</c> objects.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.GetExtraPublicKeys\">\r\n            <summary>\r\n            Return an iterator of the public keys in the secret key ring that\r\n            have no matching private key. At the moment only personal certificate data\r\n            appears in this fashion.\r\n            </summary>\r\n            <returns>An <c>IEnumerable</c> of unattached, or extra, public keys.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.ReplacePublicKeys(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyRing)\">\r\n            <summary>\r\n            Replace the public key set on the secret ring with the corresponding key off the public ring.\r\n            </summary>\r\n            <param name=\"secretRing\">Secret ring to be changed.</param>\r\n            <param name=\"publicRing\">Public ring containing the new public key set.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.CopyWithNewPassword(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing,System.Char[],System.Char[],Org.BouncyCastle.Bcpg.SymmetricKeyAlgorithmTag,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Return a copy of the passed in secret key ring, with the master key and sub keys encrypted\r\n            using a new password and the passed in algorithm.\r\n            </summary>\r\n            <param name=\"ring\">The <c>PgpSecretKeyRing</c> to be copied.</param>\r\n            <param name=\"oldPassPhrase\">The current password for key.</param>\r\n            <param name=\"newPassPhrase\">The new password for the key.</param>\r\n            <param name=\"newEncAlgorithm\">The algorithm to be used for the encryption.</param>\r\n            <param name=\"rand\">Source of randomness.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.InsertSecretKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing,Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey)\">\r\n            <summary>\r\n            Returns a new key ring with the secret key passed in either added or\r\n            replacing an existing one with the same key ID.\r\n            </summary>\r\n            <param name=\"secRing\">The secret key ring to be modified.</param>\r\n            <param name=\"secKey\">The secret key to be inserted.</param>\r\n            <returns>A new <c>PgpSecretKeyRing</c></returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing.RemoveSecretKey(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing,Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKey)\">\r\n            <summary>Returns a new key ring with the secret key passed in removed from the key ring.</summary>\r\n            <param name=\"secRing\">The secret key ring to be modified.</param>\r\n            <param name=\"secKey\">The secret key to be removed.</param>\r\n            <returns>A new <c>PgpSecretKeyRing</c>, or null if secKey is not found.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle\">\r\n            <remarks>\r\n            Often a PGP key ring file is made up of a succession of master/sub-key key rings.\r\n            If you want to read an entire secret key file in one hit this is the class for you.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.#ctor(System.IO.Stream)\">\r\n            <summary>Build a PgpSecretKeyRingBundle from the passed in input stream.</summary>\r\n            <param name=\"inputStream\">Input stream containing data.</param>\r\n            <exception cref=\"T:System.IO.IOException\">If a problem parsing the stream occurs.</exception>\r\n            <exception cref=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpException\">If an object is encountered which isn't a PgpSecretKeyRing.</exception>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.Count\">\r\n            <summary>Return the number of rings in this collection.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.GetKeyRings\">\r\n            <summary>Allow enumeration of the secret key rings making up this collection.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.GetKeyRings(System.String)\">\r\n            <summary>Allow enumeration of the key rings associated with the passed in userId.</summary>\r\n            <param name=\"userId\">The user ID to be matched.</param>\r\n            <returns>An <c>IEnumerable</c> of key rings which matched (possibly none).</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.GetKeyRings(System.String,System.Boolean)\">\r\n            <summary>Allow enumeration of the key rings associated with the passed in userId.</summary>\r\n            <param name=\"userId\">The user ID to be matched.</param>\r\n            <param name=\"matchPartial\">If true, userId need only be a substring of an actual ID string to match.</param>\r\n            <returns>An <c>IEnumerable</c> of key rings which matched (possibly none).</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.GetKeyRings(System.String,System.Boolean,System.Boolean)\">\r\n            <summary>Allow enumeration of the key rings associated with the passed in userId.</summary>\r\n            <param name=\"userId\">The user ID to be matched.</param>\r\n            <param name=\"matchPartial\">If true, userId need only be a substring of an actual ID string to match.</param>\r\n            <param name=\"ignoreCase\">If true, case is ignored in user ID comparisons.</param>\r\n            <returns>An <c>IEnumerable</c> of key rings which matched (possibly none).</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.GetSecretKey(System.Int64)\">\r\n            <summary>Return the PGP secret key associated with the given key id.</summary>\r\n            <param name=\"keyId\">The ID of the secret key to return.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.GetSecretKeyRing(System.Int64)\">\r\n            <summary>Return the secret key ring which contains the key referred to by keyId</summary>\r\n            <param name=\"keyId\">The ID of the secret key</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.Contains(System.Int64)\">\r\n            <summary>\r\n            Return true if a key matching the passed in key ID is present, false otherwise.\r\n            </summary>\r\n            <param name=\"keyID\">key ID to look for.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.AddSecretKeyRing(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle,Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing)\">\r\n            <summary>\r\n            Return a new bundle containing the contents of the passed in bundle and\r\n            the passed in secret key ring.\r\n            </summary>\r\n            <param name=\"bundle\">The <c>PgpSecretKeyRingBundle</c> the key ring is to be added to.</param>\r\n            <param name=\"secretKeyRing\">The key ring to be added.</param>\r\n            <returns>A new <c>PgpSecretKeyRingBundle</c> merging the current one with the passed in key ring.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">If the keyId for the passed in key ring is already present.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle.RemoveSecretKeyRing(Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRingBundle,Org.BouncyCastle.Bcpg.OpenPgp.PgpSecretKeyRing)\">\r\n            <summary>\r\n            Return a new bundle containing the contents of the passed in bundle with\r\n            the passed in secret key ring removed.\r\n            </summary>\r\n            <param name=\"bundle\">The <c>PgpSecretKeyRingBundle</c> the key ring is to be removed from.</param>\r\n            <param name=\"secretKeyRing\">The key ring to be removed.</param>\r\n            <returns>A new <c>PgpSecretKeyRingBundle</c> not containing the passed in key ring.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">If the keyId for the passed in key ring is not present.</exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature\">\r\n            <remarks>A PGP signature object.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.Version\">\r\n            <summary>The OpenPGP version number for this signature.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.KeyAlgorithm\">\r\n            <summary>The key algorithm associated with this signature.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.HashAlgorithm\">\r\n            <summary>The hash algorithm associated with this signature.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.VerifyCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>\r\n            Verify the signature as certifying the passed in public key as associated\r\n            with the passed in user attributes.\r\n            </summary>\r\n            <param name=\"userAttributes\">User attributes the key was stored under.</param>\r\n            <param name=\"key\">The key to be verified.</param>\r\n            <returns>True, if the signature matches, false otherwise.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.VerifyCertification(System.String,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>\r\n            Verify the signature as certifying the passed in public key as associated\r\n            with the passed in ID.\r\n            </summary>\r\n            <param name=\"id\">ID the key was stored under.</param>\r\n            <param name=\"key\">The key to be verified.</param>\r\n            <returns>True, if the signature matches, false otherwise.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.VerifyCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Verify a certification for the passed in key against the passed in master key.</summary>\r\n            <param name=\"masterKey\">The key we are verifying against.</param>\r\n            <param name=\"pubKey\">The key we are verifying.</param>\r\n            <returns>True, if the certification is valid, false otherwise.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.VerifyCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Verify a key certification, such as revocation, for the passed in key.</summary>\r\n            <param name=\"pubKey\">The key we are checking.</param>\r\n            <returns>True, if the certification is valid, false otherwise.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.KeyId\">\r\n            <summary>The ID of the key that created the signature.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.CreationTime\">\r\n            <summary>The creation time of this signature.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignature.HasSubpackets\">\r\n            <summary>\r\n            Return true if the signature has either hashed or unhashed subpackets.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator\">\r\n            <remarks>Generator for PGP signatures.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.#ctor(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,Org.BouncyCastle.Bcpg.HashAlgorithmTag)\">\r\n            <summary>Create a generator for the passed in keyAlgorithm and hashAlgorithm codes.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.InitSign(System.Int32,Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey)\">\r\n            <summary>Initialise the generator for signing.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.InitSign(System.Int32,Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Initialise the generator for signing.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.GenerateOnePassVersion(System.Boolean)\">\r\n            <summary>Return the one pass header associated with the current signature.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.Generate\">\r\n            <summary>Return a signature object containing the current signature state.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.GenerateCertification(System.String,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Generate a certification for the passed in ID and key.</summary>\r\n            <param name=\"id\">The ID we are certifying against the public key.</param>\r\n            <param name=\"pubKey\">The key we are certifying against the ID.</param>\r\n            <returns>The certification.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.GenerateCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Generate a certification for the passed in userAttributes.</summary>\r\n            <param name=\"userAttributes\">The ID we are certifying against the public key.</param>\r\n            <param name=\"pubKey\">The key we are certifying against the ID.</param>\r\n            <returns>The certification.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.GenerateCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey,Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Generate a certification for the passed in key against the passed in master key.</summary>\r\n            <param name=\"masterKey\">The key we are certifying against.</param>\r\n            <param name=\"pubKey\">The key we are certifying.</param>\r\n            <returns>The certification.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureGenerator.GenerateCertification(Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKey)\">\r\n            <summary>Generate a certification, such as a revocation, for the passed in key.</summary>\r\n            <param name=\"pubKey\">The key we are certifying.</param>\r\n            <returns>The certification.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureList\">\r\n            <remarks>A list of PGP signatures - normally in the signature block after literal data.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator\">\r\n            <remarks>Generator for signature subpackets.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetTrust(System.Boolean,System.Int32,System.Int32)\">\r\n            <summary>\r\n            Add a TrustSignature packet to the signature. The values for depth and trust are largely\r\n            installation dependent but there are some guidelines in RFC 4880 - 5.2.3.13.\r\n            </summary>\r\n            <param name=\"isCritical\">true if the packet is critical.</param>\r\n            <param name=\"depth\">depth level.</param>\r\n            <param name=\"trustAmount\">trust amount.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetKeyExpirationTime(System.Boolean,System.Int64)\">\r\n            <summary>\r\n            Set the number of seconds a key is valid for after the time of its creation.\r\n            A value of zero means the key never expires.\r\n            </summary>\r\n            <param name=\"isCritical\">True, if should be treated as critical, false otherwise.</param>\r\n            <param name=\"seconds\">The number of seconds the key is valid, or zero if no expiry.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetSignatureExpirationTime(System.Boolean,System.Int64)\">\r\n            <summary>\r\n            Set the number of seconds a signature is valid for after the time of its creation.\r\n            A value of zero means the signature never expires.\r\n            </summary>\r\n            <param name=\"isCritical\">True, if should be treated as critical, false otherwise.</param>\r\n            <param name=\"seconds\">The number of seconds the signature is valid, or zero if no expiry.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetSignatureCreationTime(System.Boolean,System.DateTime)\">\r\n            <summary>\r\n            Set the creation time for the signature.\r\n            <p>\r\n            Note: this overrides the generation of a creation time when the signature\r\n            is generated.</p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetRevocationReason(System.Boolean,Org.BouncyCastle.Bcpg.RevocationReasonTag,System.String)\">\r\n            <summary>\r\n            Sets revocation reason sub packet\r\n            </summary>\t    \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetRevocationKey(System.Boolean,Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,System.Byte[])\">\r\n            <summary>\r\n            Sets revocation key sub packet\r\n            </summary>\t\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketGenerator.SetIssuerKeyID(System.Boolean,System.Int64)\">\r\n            <summary>\r\n            Sets issuer key sub packet\r\n            </summary>\t\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector\">\r\n            <remarks>Container for a list of signature subpackets.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector.HasSubpacket(Org.BouncyCastle.Bcpg.SignatureSubpacketTag)\">\r\n             Return true if a particular subpacket type exists.\r\n            \r\n             @param type type to look for.\r\n             @return true if present, false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector.GetSubpackets(Org.BouncyCastle.Bcpg.SignatureSubpacketTag)\">\r\n            Return all signature subpackets of the passed in type.\r\n            @param type subpacket type code\r\n            @return an array of zero or more matching subpackets.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector.GetSignatureExpirationTime\">\r\n            <summary>\r\n            Return the number of seconds a signature is valid for after its creation date.\r\n            A value of zero means the signature never expires.\r\n            </summary>\r\n            <returns>Seconds a signature is valid for.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector.GetKeyExpirationTime\">\r\n            <summary>\r\n            Return the number of seconds a key is valid for after its creation date.\r\n            A value of zero means the key never expires.\r\n            </summary>\r\n            <returns>Seconds a signature is valid for.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Bcpg.OpenPgp.PgpSignatureSubpacketVector.Count\">\r\n            <summary>Return the number of packets this vector contains.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpUserAttributeSubpacketVector\">\r\n            <remarks>Container for a list of user attribute subpackets.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpUtilities\">\r\n            <remarks>Basic utility class.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpUtilities.WriteFileToLiteralData(System.IO.Stream,System.Char,System.IO.FileInfo)\">\r\n            <summary>Write out the passed in file as a literal data packet.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpUtilities.WriteFileToLiteralData(System.IO.Stream,System.Char,System.IO.FileInfo,System.Byte[])\">\r\n            <summary>Write out the passed in file as a literal data packet in partial packet format.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpUtilities.GetDecoderStream(System.IO.Stream)\">\r\n            <summary>\r\n            Return either an ArmoredInputStream or a BcpgInputStream based on whether\r\n            the initial characters of the stream are binary PGP encodings or not.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.OpenPgp.PgpV3SignatureGenerator\">\r\n            <remarks>Generator for old style PGP V3 Signatures.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpV3SignatureGenerator.#ctor(Org.BouncyCastle.Bcpg.PublicKeyAlgorithmTag,Org.BouncyCastle.Bcpg.HashAlgorithmTag)\">\r\n            <summary>Create a generator for the passed in keyAlgorithm and hashAlgorithm codes.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpV3SignatureGenerator.InitSign(System.Int32,Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey)\">\r\n            <summary>Initialise the generator for signing.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpV3SignatureGenerator.InitSign(System.Int32,Org.BouncyCastle.Bcpg.OpenPgp.PgpPrivateKey,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Initialise the generator for signing.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpV3SignatureGenerator.GenerateOnePassVersion(System.Boolean)\">\r\n            <summary>Return the one pass header associated with the current signature.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Bcpg.OpenPgp.PgpV3SignatureGenerator.Generate\">\r\n            <summary>Return a V3 signature object containing the current signature state.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.RevocationKey\">\r\n            <summary>\r\n            Represents revocation key OpenPGP signature sub packet.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Bcpg.RevocationReason\">\r\n            <summary>\r\n            Represents revocation reason OpenPGP signature sub packet.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsAttributeTableParameter\">\r\n            <remarks>\r\n            The 'Signature' parameter is only available when generating unsigned attributes.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsAuthenticatedData\">\r\n            containing class for an CMS Authenticated Data object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsAuthenticatedData.MacAlgOid\">\r\n            return the object identifier for the content MAC algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedData.GetRecipientInfos\">\r\n            return a store of the intended recipients for this message\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsAuthenticatedData.ContentInfo\">\r\n            return the ContentInfo \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedData.GetAuthAttrs\">\r\n            return a table of the digested attributes indexed by\r\n            the OID of the attribute.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedData.GetUnauthAttrs\">\r\n            return a table of the undigested attributes indexed by\r\n            the OID of the attribute.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedData.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsAuthenticatedDataGenerator\">\r\n             General class for generating a CMS authenticated-data message.\r\n            \r\n             A simple example of usage.\r\n            \r\n             <pre>\r\n                  CMSAuthenticatedDataGenerator  fact = new CMSAuthenticatedDataGenerator();\r\n            \r\n                  fact.addKeyTransRecipient(cert);\r\n            \r\n                  CMSAuthenticatedData         data = fact.generate(content, algorithm, \"BC\");\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataGenerator.#ctor\">\r\n            base constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            constructor allowing specific source of randomness\r\n            @param rand instance of SecureRandom to use\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.String,Org.BouncyCastle.Crypto.CipherKeyGenerator)\">\r\n            generate an enveloped object that contains an CMS Enveloped Data\r\n            object using the given provider and the passed in key generator.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.String)\">\r\n            generate an authenticated object that contains an CMS Authenticated Data object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsAuthenticatedDataParser\">\r\n             Parsing class for an CMS Authenticated Data object from an input stream.\r\n             <p>\r\n             Note: that because we are in a streaming mode only one recipient can be tried and it is important\r\n             that the methods on the parser are called in the appropriate order.\r\n             </p>\r\n             <p>\r\n             Example of use - assuming the first recipient matches the private key we have.\r\n             <pre>\r\n                  CMSAuthenticatedDataParser     ad = new CMSAuthenticatedDataParser(inputStream);\r\n            \r\n                  RecipientInformationStore  recipients = ad.getRecipientInfos();\r\n            \r\n                  Collection  c = recipients.getRecipients();\r\n                  Iterator    it = c.iterator();\r\n            \r\n                  if (it.hasNext())\r\n                  {\r\n                      RecipientInformation   recipient = (RecipientInformation)it.next();\r\n            \r\n                      CMSTypedStream recData = recipient.getContentStream(privateKey, \"BC\");\r\n            \r\n                      processDataStream(recData.getContentStream());\r\n            \r\n                      if (!Arrays.equals(ad.getMac(), recipient.getMac())\r\n                      {\r\n                          System.err.println(\"Data corrupted!!!!\");\r\n                      }\r\n                  }\r\n              </pre>\r\n              Note: this class does not introduce buffering - if you are processing large files you should create\r\n              the parser with:\r\n              <pre>\r\n                      CMSAuthenticatedDataParser     ep = new CMSAuthenticatedDataParser(new BufferedInputStream(inputStream, bufSize));\r\n              </pre>\r\n              where bufSize is a suitably large buffer size.\r\n             </p>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsAuthenticatedDataParser.MacAlgOid\">\r\n            return the object identifier for the mac algorithm.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsAuthenticatedDataParser.MacAlgParams\">\r\n            return the ASN.1 encoded encryption algorithm parameters, or null if\r\n            there aren't any.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataParser.GetRecipientInfos\">\r\n            return a store of the intended recipients for this message\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataParser.GetAuthAttrs\">\r\n            return a table of the unauthenticated attributes indexed by\r\n            the OID of the attribute.\r\n            @exception java.io.IOException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataParser.GetUnauthAttrs\">\r\n            return a table of the unauthenticated attributes indexed by\r\n            the OID of the attribute.\r\n            @exception java.io.IOException\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator\">\r\n             General class for generating a CMS authenticated-data message stream.\r\n             <p>\r\n             A simple example of usage.\r\n             <pre>\r\n                  CMSAuthenticatedDataStreamGenerator edGen = new CMSAuthenticatedDataStreamGenerator();\r\n            \r\n                  edGen.addKeyTransRecipient(cert);\r\n            \r\n                  ByteArrayOutputStream  bOut = new ByteArrayOutputStream();\r\n            \r\n                  OutputStream out = edGen.open(\r\n                                          bOut, CMSAuthenticatedDataGenerator.AES128_CBC, \"BC\");*\r\n                  out.write(data);\r\n            \r\n                  out.close();\r\n             </pre>\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.#ctor\">\r\n            base constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            constructor allowing specific source of randomness\r\n            @param rand instance of SecureRandom to use\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.SetBufferSize(System.Int32)\">\r\n             Set the underlying string size for encapsulated data\r\n            \r\n             @param bufferSize length of octet strings to buffer the data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.SetBerEncodeRecipients(System.Boolean)\">\r\n            Use a BER Set to store the recipient information\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.Open(System.IO.Stream,System.String,Org.BouncyCastle.Crypto.CipherKeyGenerator)\">\r\n            generate an enveloped object that contains an CMS Enveloped Data\r\n            object using the given provider and the passed in key generator.\r\n            @throws java.io.IOException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.Open(System.IO.Stream,System.String)\">\r\n            generate an enveloped object that contains an CMS Enveloped Data object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedDataStreamGenerator.Open(System.IO.Stream,System.String,System.Int32)\">\r\n            generate an enveloped object that contains an CMS Enveloped Data object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedGenerator.#ctor\">\r\n            base constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsAuthenticatedGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n             constructor allowing specific source of randomness\r\n            \r\n             @param rand instance of SecureRandom to use\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsAuthEnvelopedData\">\r\n            containing class for an CMS AuthEnveloped Data object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsCompressedData\">\r\n            containing class for an CMS Compressed Data object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsCompressedData.GetContent\">\r\n             Return the uncompressed content.\r\n            \r\n             @return the uncompressed content\r\n             @throws CmsException if there is an exception uncompressing the data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsCompressedData.GetContent(System.Int32)\">\r\n             Return the uncompressed content, throwing an exception if the data size\r\n             is greater than the passed in limit. If the content is exceeded getCause()\r\n             on the CMSException will contain a StreamOverflowException\r\n            \r\n             @param limit maximum number of bytes to read\r\n             @return the content read\r\n             @throws CMSException if there is an exception uncompressing the data.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsCompressedData.ContentInfo\">\r\n            return the ContentInfo \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsCompressedData.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsCompressedDataGenerator\">\r\n                * General class for generating a compressed CMS message.\r\n                * <p>\r\n                * A simple example of usage.</p>\r\n                * <p>\r\n                * <pre>\r\n                *      CMSCompressedDataGenerator fact = new CMSCompressedDataGenerator();\r\n                *      CMSCompressedData data = fact.Generate(content, algorithm);\r\n                * </pre>\r\n            \t* </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsCompressedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.String)\">\r\n            Generate an object that contains an CMS Compressed Data\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsCompressedDataParser\">\r\n             Class for reading a CMS Compressed Data stream.\r\n             <pre>\r\n                 CMSCompressedDataParser cp = new CMSCompressedDataParser(inputStream);\r\n            \r\n                 process(cp.GetContent().GetContentStream());\r\n             </pre>\r\n              Note: this class does not introduce buffering - if you are processing large files you should create\r\n              the parser with:\r\n              <pre>\r\n                  CMSCompressedDataParser     ep = new CMSCompressedDataParser(new BufferedInputStream(inputStream, bufSize));\r\n              </pre>\r\n              where bufSize is a suitably large buffer size.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsCompressedDataStreamGenerator\">\r\n             General class for generating a compressed CMS message stream.\r\n             <p>\r\n             A simple example of usage.\r\n             </p>\r\n             <pre>\r\n                  CMSCompressedDataStreamGenerator gen = new CMSCompressedDataStreamGenerator();\r\n            \r\n                  Stream cOut = gen.Open(outputStream, CMSCompressedDataStreamGenerator.ZLIB);\r\n            \r\n                  cOut.Write(data);\r\n            \r\n                  cOut.Close();\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsCompressedDataStreamGenerator.#ctor\">\r\n            base constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsCompressedDataStreamGenerator.SetBufferSize(System.Int32)\">\r\n             Set the underlying string size for encapsulated data\r\n            \r\n             @param bufferSize length of octet strings to buffer the data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsContentInfoParser.Close\">\r\n            Close the underlying data stream.\r\n            @throws IOException if the close fails.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsEnvelopedData\">\r\n            containing class for an CMS Enveloped Data object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsEnvelopedData.EncryptionAlgOid\">\r\n            return the object identifier for the content encryption algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedData.GetRecipientInfos\">\r\n            return a store of the intended recipients for this message\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsEnvelopedData.ContentInfo\">\r\n            return the ContentInfo \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedData.GetUnprotectedAttributes\">\r\n            return a table of the unprotected attributes indexed by\r\n            the OID of the attribute.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedData.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsEnvelopedDataGenerator\">\r\n             <remarks>\r\n             General class for generating a CMS enveloped-data message.\r\n            \r\n             A simple example of usage.\r\n            \r\n             <pre>\r\n                  CmsEnvelopedDataGenerator  fact = new CmsEnvelopedDataGenerator();\r\n            \r\n                  fact.AddKeyTransRecipient(cert);\r\n            \r\n                  CmsEnvelopedData         data = fact.Generate(content, algorithm);\r\n             </pre>\r\n             </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Constructor allowing specific source of randomness</summary>\r\n            <param name=\"rand\">Instance of <c>SecureRandom</c> to use.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.String,Org.BouncyCastle.Crypto.CipherKeyGenerator)\">\r\n            <summary>\r\n            Generate an enveloped object that contains a CMS Enveloped Data\r\n            object using the passed in key generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.String)\">\r\n            <summary>Generate an enveloped object that contains an CMS Enveloped Data object.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.String,System.Int32)\">\r\n            <summary>Generate an enveloped object that contains an CMS Enveloped Data object.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsEnvelopedDataParser\">\r\n             Parsing class for an CMS Enveloped Data object from an input stream.\r\n             <p>\r\n             Note: that because we are in a streaming mode only one recipient can be tried and it is important\r\n             that the methods on the parser are called in the appropriate order.\r\n             </p>\r\n             <p>\r\n             Example of use - assuming the first recipient matches the private key we have.\r\n             <pre>\r\n                  CmsEnvelopedDataParser     ep = new CmsEnvelopedDataParser(inputStream);\r\n            \r\n                  RecipientInformationStore  recipients = ep.GetRecipientInfos();\r\n            \r\n                  Collection  c = recipients.getRecipients();\r\n                  Iterator    it = c.iterator();\r\n            \r\n                  if (it.hasNext())\r\n                  {\r\n                      RecipientInformation   recipient = (RecipientInformation)it.next();\r\n            \r\n                      CMSTypedStream recData = recipient.getContentStream(privateKey);\r\n            \r\n                      processDataStream(recData.getContentStream());\r\n                  }\r\n              </pre>\r\n              Note: this class does not introduce buffering - if you are processing large files you should create\r\n              the parser with:\r\n              <pre>\r\n                      CmsEnvelopedDataParser     ep = new CmsEnvelopedDataParser(new BufferedInputStream(inputStream, bufSize));\r\n              </pre>\r\n              where bufSize is a suitably large buffer size.\r\n             </p>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsEnvelopedDataParser.EncryptionAlgOid\">\r\n            return the object identifier for the content encryption algorithm.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsEnvelopedDataParser.EncryptionAlgParams\">\r\n            return the ASN.1 encoded encryption algorithm parameters, or null if\r\n            there aren't any.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataParser.GetRecipientInfos\">\r\n            return a store of the intended recipients for this message\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataParser.GetUnprotectedAttributes\">\r\n            return a table of the unprotected attributes indexed by\r\n            the OID of the attribute.\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator\">\r\n             General class for generating a CMS enveloped-data message stream.\r\n             <p>\r\n             A simple example of usage.\r\n             <pre>\r\n                  CmsEnvelopedDataStreamGenerator edGen = new CmsEnvelopedDataStreamGenerator();\r\n            \r\n                  edGen.AddKeyTransRecipient(cert);\r\n            \r\n                  MemoryStream  bOut = new MemoryStream();\r\n            \r\n                  Stream out = edGen.Open(\r\n                                          bOut, CMSEnvelopedDataGenerator.AES128_CBC);*\r\n                  out.Write(data);\r\n            \r\n                  out.Close();\r\n             </pre>\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Constructor allowing specific source of randomness</summary>\r\n            <param name=\"rand\">Instance of <c>SecureRandom</c> to use.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator.SetBufferSize(System.Int32)\">\r\n            <summary>Set the underlying string size for encapsulated data.</summary>\r\n            <param name=\"bufferSize\">Length of octet strings to buffer the data.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator.SetBerEncodeRecipients(System.Boolean)\">\r\n            <summary>Use a BER Set to store the recipient information.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator.Open(System.IO.Stream,System.String,Org.BouncyCastle.Crypto.CipherKeyGenerator)\">\r\n            <summary>\r\n            Generate an enveloped object that contains an CMS Enveloped Data\r\n            object using the passed in key generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator.Open(System.IO.Stream,System.String)\">\r\n            generate an enveloped object that contains an CMS Enveloped Data object\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedDataStreamGenerator.Open(System.IO.Stream,System.String,System.Int32)\">\r\n            generate an enveloped object that contains an CMS Enveloped Data object\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsEnvelopedGenerator\">\r\n             General class for generating a CMS enveloped-data message.\r\n            \r\n             A simple example of usage.\r\n            \r\n             <pre>\r\n                  CMSEnvelopedDataGenerator  fact = new CMSEnvelopedDataGenerator();\r\n            \r\n                  fact.addKeyTransRecipient(cert);\r\n            \r\n                  CMSEnvelopedData         data = fact.generate(content, algorithm, \"BC\");\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Constructor allowing specific source of randomness</summary>\r\n            <param name=\"rand\">Instance of <c>SecureRandom</c> to use.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.AddKeyTransRecipient(Org.BouncyCastle.X509.X509Certificate)\">\r\n             add a recipient.\r\n            \r\n             @param cert recipient's public key certificate\r\n             @exception ArgumentException if there is a problem with the certificate\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.AddKeyTransRecipient(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[])\">\r\n             add a recipient\r\n            \r\n             @param key the public key used by the recipient\r\n             @param subKeyId the identifier for the recipient's public key\r\n             @exception ArgumentException if there is a problem with the key\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.AddKekRecipient(System.String,Org.BouncyCastle.Crypto.Parameters.KeyParameter,System.Byte[])\">\r\n            add a KEK recipient.\r\n            @param key the secret key to use for wrapping\r\n            @param keyIdentifier the byte string that identifies the key\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.AddKekRecipient(System.String,Org.BouncyCastle.Crypto.Parameters.KeyParameter,Org.BouncyCastle.Asn1.Cms.KekIdentifier)\">\r\n            add a KEK recipient.\r\n            @param key the secret key to use for wrapping\r\n            @param keyIdentifier the byte string that identifies the key\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.AddKeyAgreementRecipient(System.String,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n             Add a key agreement based recipient.\r\n            \r\n             @param agreementAlgorithm key agreement algorithm to use.\r\n             @param senderPrivateKey private key to initialise sender side of agreement with.\r\n             @param senderPublicKey sender public key to include with message.\r\n             @param recipientCert recipient's public key certificate.\r\n             @param cekWrapAlgorithm OID for key wrapping algorithm to use.\r\n             @exception SecurityUtilityException if the algorithm requested cannot be found\r\n             @exception InvalidKeyException if the keys are inappropriate for the algorithm specified\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsEnvelopedGenerator.AddKeyAgreementRecipients(System.String,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Collections.ICollection,System.String)\">\r\n             Add multiple key agreement based recipients (sharing a single KeyAgreeRecipientInfo structure).\r\n            \r\n             @param agreementAlgorithm key agreement algorithm to use.\r\n             @param senderPrivateKey private key to initialise sender side of agreement with.\r\n             @param senderPublicKey sender public key to include with message.\r\n             @param recipientCerts recipients' public key certificates.\r\n             @param cekWrapAlgorithm OID for key wrapping algorithm to use.\r\n             @exception SecurityUtilityException if the algorithm requested cannot be found\r\n             @exception InvalidKeyException if the keys are inappropriate for the algorithm specified\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsProcessable.Write(System.IO.Stream)\">\r\n            <summary>\r\n            Generic routine to copy out the data we want processed.\r\n            </summary>\r\n            <remarks>\r\n            This routine may be called multiple times.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsProcessableByteArray\">\r\n            a holding class for a byte array of data to be processed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsProcessableByteArray.GetContent\">\r\n            <returns>A clone of the byte array</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsProcessableFile\">\r\n            a holding class for a file of data to be processed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsProcessableFile.GetContent\">\r\n            <returns>The file handle</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsSignedData\">\r\n             general class for handling a pkcs7-signature message.\r\n            \r\n             A simple example of usage - note, in the example below the validity of\r\n             the certificate isn't verified, just the fact that one of the certs\r\n             matches the given signer...\r\n            \r\n             <pre>\r\n              IX509Store              certs = s.GetCertificates();\r\n              SignerInformationStore  signers = s.GetSignerInfos();\r\n            \r\n              foreach (SignerInformation signer in signers.GetSigners())\r\n              {\r\n                  ArrayList       certList = new ArrayList(certs.GetMatches(signer.SignerID));\r\n                  X509Certificate cert = (X509Certificate) certList[0];\r\n            \r\n                  if (signer.Verify(cert.GetPublicKey()))\r\n                  {\r\n                      verified++;\r\n                  }\r\n              }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.#ctor(System.Collections.IDictionary,System.Byte[])\">\r\n             Content with detached signature, digests precomputed\r\n            \r\n             @param hashes a map of precomputed digests for content indexed by name of hash.\r\n             @param sigBlock the signature object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.#ctor(Org.BouncyCastle.Cms.CmsProcessable,System.IO.Stream)\">\r\n             base constructor - content with detached signature.\r\n            \r\n             @param signedContent the content that was signed.\r\n             @param sigData the signature object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.#ctor(System.IO.Stream)\">\r\n            base constructor - with encapsulated content\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsSignedData.Version\">\r\n            <summary>Return the version number for this object.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.GetSignerInfos\">\r\n            return the collection of signers that are associated with the\r\n            signatures for the message.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.GetAttributeCertificates(System.String)\">\r\n             return a X509Store containing the attribute certificates, if any, contained\r\n             in this message.\r\n            \r\n             @param type type of store to create\r\n             @return a store of attribute certificates\r\n             @exception NoSuchStoreException if the store type isn't available.\r\n             @exception CmsException if a general exception prevents creation of the X509Store\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.GetCertificates(System.String)\">\r\n             return a X509Store containing the public key certificates, if any, contained\r\n             in this message.\r\n            \r\n             @param type type of store to create\r\n             @return a store of public key certificates\r\n             @exception NoSuchStoreException if the store type isn't available.\r\n             @exception CmsException if a general exception prevents creation of the X509Store\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.GetCrls(System.String)\">\r\n             return a X509Store containing CRLs, if any, contained\r\n             in this message.\r\n            \r\n             @param type type of store to create\r\n             @return a store of CRLs\r\n             @exception NoSuchStoreException if the store type isn't available.\r\n             @exception CmsException if a general exception prevents creation of the X509Store\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsSignedData.SignedContentType\">\r\n            <summary>\r\n            Return the <c>DerObjectIdentifier</c> associated with the encapsulated\r\n            content info structure carried in the signed data.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsSignedData.ContentInfo\">\r\n            return the ContentInfo\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.ReplaceSigners(Org.BouncyCastle.Cms.CmsSignedData,Org.BouncyCastle.Cms.SignerInformationStore)\">\r\n             Replace the signerinformation store associated with this\r\n             CmsSignedData object with the new one passed in. You would\r\n             probably only want to do this if you wanted to change the unsigned\r\n             attributes associated with a signer, or perhaps delete one.\r\n            \r\n             @param signedData the signed data object to be used as a base.\r\n             @param signerInformationStore the new signer information store to use.\r\n             @return a new signed data object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedData.ReplaceCertificatesAndCrls(Org.BouncyCastle.Cms.CmsSignedData,Org.BouncyCastle.X509.Store.IX509Store,Org.BouncyCastle.X509.Store.IX509Store,Org.BouncyCastle.X509.Store.IX509Store)\">\r\n             Replace the certificate and CRL information associated with this\r\n             CmsSignedData object with the new one passed in.\r\n            \r\n             @param signedData the signed data object to be used as a base.\r\n             @param x509Certs the new certificates to be used.\r\n             @param x509Crls the new CRLs to be used.\r\n             @return a new signed data object.\r\n             @exception CmsException if there is an error processing the stores\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsSignedDataGenerator\">\r\n                 * general class for generating a pkcs7-signature message.\r\n                 * <p>\r\n                 * A simple example of usage.\r\n                 *\r\n                 * <pre>\r\n                 *      IX509Store certs...\r\n                 *      IX509Store crls...\r\n                 *      CmsSignedDataGenerator gen = new CmsSignedDataGenerator();\r\n                 *\r\n                 *      gen.AddSigner(privKey, cert, CmsSignedGenerator.DigestSha1);\r\n                 *      gen.AddCertificates(certs);\r\n                 *      gen.AddCrls(crls);\r\n                 *\r\n                 *      CmsSignedData data = gen.Generate(content);\r\n                 * </pre>\r\n            \t * </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Constructor allowing specific source of randomness</summary>\r\n            <param name=\"rand\">Instance of <c>SecureRandom</c> to use.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n                    * add a signer - no attributes other than the default ones will be\r\n                    * provided here.\r\n            \t\t*\r\n            \t\t* @param key signing key to use\r\n            \t\t* @param cert certificate containing corresponding public key\r\n            \t\t* @param digestOID digest algorithm OID\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String)\">\r\n             add a signer, specifying the digest encryption algorithm to use - no attributes other than the default ones will be\r\n             provided here.\r\n            \r\n             @param key signing key to use\r\n             @param cert certificate containing corresponding public key\r\n             @param encryptionOID digest encryption algorithm OID\r\n             @param digestOID digest algorithm OID\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String)\">\r\n            add a signer - no attributes other than the default ones will be\r\n            provided here.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,System.String)\">\r\n            add a signer, specifying the digest encryption algorithm to use - no attributes other than the default ones will be\r\n            provided here.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n                    * add a signer with extra signed/unsigned attributes.\r\n            \t\t*\r\n            \t\t* @param key signing key to use\r\n            \t\t* @param cert certificate containing corresponding public key\r\n            \t\t* @param digestOID digest algorithm OID\r\n            \t\t* @param signedAttr table of attributes to be included in signature\r\n            \t\t* @param unsignedAttr table of attributes to be included as unsigned\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n             add a signer, specifying the digest encryption algorithm, with extra signed/unsigned attributes.\r\n            \r\n             @param key signing key to use\r\n             @param cert certificate containing corresponding public key\r\n             @param encryptionOID digest encryption algorithm OID\r\n             @param digestOID digest algorithm OID\r\n             @param signedAttr table of attributes to be included in signature\r\n             @param unsignedAttr table of attributes to be included as unsigned\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n            \t     * add a signer with extra signed/unsigned attributes.\r\n            \t\t *\r\n            \t\t * @param key signing key to use\r\n            \t\t * @param subjectKeyID subjectKeyID of corresponding public key\r\n            \t\t * @param digestOID digest algorithm OID\r\n            \t\t * @param signedAttr table of attributes to be included in signature\r\n            \t\t * @param unsignedAttr table of attributes to be included as unsigned\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n             add a signer, specifying the digest encryption algorithm, with extra signed/unsigned attributes.\r\n            \r\n             @param key signing key to use\r\n             @param subjectKeyID subjectKeyID of corresponding public key\r\n             @param encryptionOID digest encryption algorithm OID\r\n             @param digestOID digest algorithm OID\r\n             @param signedAttr table of attributes to be included in signature\r\n             @param unsignedAttr table of attributes to be included as unsigned\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,Org.BouncyCastle.Cms.CmsAttributeTableGenerator,Org.BouncyCastle.Cms.CmsAttributeTableGenerator)\">\r\n            add a signer with extra signed/unsigned attributes based on generators.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String,Org.BouncyCastle.Cms.CmsAttributeTableGenerator,Org.BouncyCastle.Cms.CmsAttributeTableGenerator)\">\r\n            add a signer, specifying the digest encryption algorithm, with extra signed/unsigned attributes based on generators.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,Org.BouncyCastle.Cms.CmsAttributeTableGenerator,Org.BouncyCastle.Cms.CmsAttributeTableGenerator)\">\r\n            add a signer with extra signed/unsigned attributes based on generators.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,System.String,Org.BouncyCastle.Cms.CmsAttributeTableGenerator,Org.BouncyCastle.Cms.CmsAttributeTableGenerator)\">\r\n            add a signer, including digest encryption algorithm, with extra signed/unsigned attributes based on generators.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable)\">\r\n            generate a signed object that for a CMS Signed Data object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.Generate(System.String,Org.BouncyCastle.Cms.CmsProcessable,System.Boolean)\">\r\n            generate a signed object that for a CMS Signed Data\r\n            object  - if encapsulate is true a copy\r\n            of the message will be included in the signature. The content type\r\n            is set according to the OID represented by the string signedContentType.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.Generate(Org.BouncyCastle.Cms.CmsProcessable,System.Boolean)\">\r\n            generate a signed object that for a CMS Signed Data\r\n            object - if encapsulate is true a copy\r\n            of the message will be included in the signature with the\r\n            default content type \"data\".\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataGenerator.GenerateCounterSigners(Org.BouncyCastle.Cms.SignerInformation)\">\r\n             generate a set of one or more SignerInformation objects representing counter signatures on\r\n             the passed in SignerInformation object.\r\n            \r\n             @param signer the signer to be countersigned\r\n             @param sigProvider the provider to be used for counter signing.\r\n             @return a store containing the signers.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsSignedDataParser\">\r\n             Parsing class for an CMS Signed Data object from an input stream.\r\n             <p>\r\n             Note: that because we are in a streaming mode only one signer can be tried and it is important\r\n             that the methods on the parser are called in the appropriate order.\r\n             </p>\r\n             <p>\r\n             A simple example of usage for an encapsulated signature.\r\n             </p>\r\n             <p>\r\n             Two notes: first, in the example below the validity of\r\n             the certificate isn't verified, just the fact that one of the certs\r\n             matches the given signer, and, second, because we are in a streaming\r\n             mode the order of the operations is important.\r\n             </p>\r\n             <pre>\r\n                  CmsSignedDataParser     sp = new CmsSignedDataParser(encapSigData);\r\n            \r\n                  sp.GetSignedContent().Drain();\r\n            \r\n                  IX509Store              certs = sp.GetCertificates();\r\n                  SignerInformationStore  signers = sp.GetSignerInfos();\r\n            \r\n                  foreach (SignerInformation signer in signers.GetSigners())\r\n                  {\r\n                      ArrayList       certList = new ArrayList(certs.GetMatches(signer.SignerID));\r\n                      X509Certificate cert = (X509Certificate) certList[0];\r\n            \r\n                      Console.WriteLine(\"verify returns: \" + signer.Verify(cert));\r\n                  }\r\n             </pre>\r\n              Note also: this class does not introduce buffering - if you are processing large files you should create\r\n              the parser with:\r\n              <pre>\r\n                      CmsSignedDataParser     ep = new CmsSignedDataParser(new BufferedInputStream(encapSigData, bufSize));\r\n              </pre>\r\n              where bufSize is a suitably large buffer size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.#ctor(System.IO.Stream)\">\r\n            base constructor - with encapsulated content\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.#ctor(Org.BouncyCastle.Cms.CmsTypedStream,System.IO.Stream)\">\r\n             base constructor\r\n            \r\n             @param signedContent the content that was signed.\r\n             @param sigData the signature object.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsSignedDataParser.Version\">\r\n             Return the version number for the SignedData object\r\n            \r\n             @return the version number\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.GetSignerInfos\">\r\n            return the collection of signers that are associated with the\r\n            signatures for the message.\r\n            @throws CmsException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.GetAttributeCertificates(System.String)\">\r\n             return a X509Store containing the attribute certificates, if any, contained\r\n             in this message.\r\n            \r\n             @param type type of store to create\r\n             @return a store of attribute certificates\r\n             @exception org.bouncycastle.x509.NoSuchStoreException if the store type isn't available.\r\n             @exception CmsException if a general exception prevents creation of the X509Store\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.GetCertificates(System.String)\">\r\n             return a X509Store containing the public key certificates, if any, contained\r\n             in this message.\r\n            \r\n             @param type type of store to create\r\n             @return a store of public key certificates\r\n             @exception NoSuchStoreException if the store type isn't available.\r\n             @exception CmsException if a general exception prevents creation of the X509Store\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.GetCrls(System.String)\">\r\n             return a X509Store containing CRLs, if any, contained\r\n             in this message.\r\n            \r\n             @param type type of store to create\r\n             @return a store of CRLs\r\n             @exception NoSuchStoreException if the store type isn't available.\r\n             @exception CmsException if a general exception prevents creation of the X509Store\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.CmsSignedDataParser.SignedContentType\">\r\n            <summary>\r\n            Return the <c>DerObjectIdentifier</c> associated with the encapsulated\r\n            content info structure carried in the signed data.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.ReplaceSigners(System.IO.Stream,Org.BouncyCastle.Cms.SignerInformationStore,System.IO.Stream)\">\r\n            Replace the signerinformation store associated with the passed\r\n            in message contained in the stream original with the new one passed in.\r\n            You would probably only want to do this if you wanted to change the unsigned\r\n            attributes associated with a signer, or perhaps delete one.\r\n            <p>\r\n            The output stream is returned unclosed.\r\n            </p>\r\n            @param original the signed data stream to be used as a base.\r\n            @param signerInformationStore the new signer information store to use.\r\n            @param out the stream to Write the new signed data object to.\r\n            @return out.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataParser.ReplaceCertificatesAndCrls(System.IO.Stream,Org.BouncyCastle.X509.Store.IX509Store,Org.BouncyCastle.X509.Store.IX509Store,Org.BouncyCastle.X509.Store.IX509Store,System.IO.Stream)\">\r\n            Replace the certificate and CRL information associated with this\r\n            CMSSignedData object with the new one passed in.\r\n            <p>\r\n            The output stream is returned unclosed.\r\n            </p>\r\n            @param original the signed data stream to be used as a base.\r\n            @param certsAndCrls the new certificates and CRLs to be used.\r\n            @param out the stream to Write the new signed data object to.\r\n            @return out.\r\n            @exception CmsException if there is an error processing the CertStore\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator\">\r\n             General class for generating a pkcs7-signature message stream.\r\n             <p>\r\n             A simple example of usage.\r\n             </p>\r\n             <pre>\r\n                  IX509Store                   certs...\r\n                  CmsSignedDataStreamGenerator gen = new CmsSignedDataStreamGenerator();\r\n            \r\n                  gen.AddSigner(privateKey, cert, CmsSignedDataStreamGenerator.DIGEST_SHA1);\r\n            \r\n                  gen.AddCertificates(certs);\r\n            \r\n                  Stream sigOut = gen.Open(bOut);\r\n            \r\n                  sigOut.Write(Encoding.UTF8.GetBytes(\"Hello World!\"));\r\n            \r\n                  sigOut.Close();\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Constructor allowing specific source of randomness</summary>\r\n            <param name=\"rand\">Instance of <c>SecureRandom</c> to use.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.SetBufferSize(System.Int32)\">\r\n             Set the underlying string size for encapsulated data\r\n            \r\n             @param bufferSize length of octet strings to buffer the data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String)\">\r\n            add a signer - no attributes other than the default ones will be\r\n            provided here.\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String)\">\r\n            add a signer, specifying the digest encryption algorithm - no attributes other than the default ones will be\r\n            provided here.\r\n            @throws NoSuchProviderException\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n            add a signer with extra signed/unsigned attributes.\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n            add a signer with extra signed/unsigned attributes - specifying digest\r\n            encryption algorithm.\r\n            @throws NoSuchProviderException\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String)\">\r\n            add a signer - no attributes other than the default ones will be\r\n            provided here.\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,System.String)\">\r\n            add a signer - no attributes other than the default ones will be\r\n            provided here.\r\n            @throws NoSuchProviderException\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.AddSigner(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[],System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n            add a signer with extra signed/unsigned attributes.\r\n            @throws NoSuchAlgorithmException\r\n            @throws InvalidKeyException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.Open(System.IO.Stream)\">\r\n            generate a signed object that for a CMS Signed Data object\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.Open(System.IO.Stream,System.Boolean)\">\r\n            generate a signed object that for a CMS Signed Data\r\n            object - if encapsulate is true a copy\r\n            of the message will be included in the signature with the\r\n            default content type \"data\".\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.Open(System.IO.Stream,System.Boolean,System.IO.Stream)\">\r\n            generate a signed object that for a CMS Signed Data\r\n            object using the given provider - if encapsulate is true a copy\r\n            of the message will be included in the signature with the\r\n            default content type \"data\". If dataOutputStream is non null the data\r\n            being signed will be written to the stream as it is processed.\r\n            @param out stream the CMS object is to be written to.\r\n            @param encapsulate true if data should be encapsulated.\r\n            @param dataOutputStream output stream to copy the data being signed to.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.Open(System.IO.Stream,System.String,System.Boolean)\">\r\n            generate a signed object that for a CMS Signed Data\r\n            object - if encapsulate is true a copy\r\n            of the message will be included in the signature. The content type\r\n            is set according to the OID represented by the string signedContentType.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedDataStreamGenerator.Open(System.IO.Stream,System.String,System.Boolean,System.IO.Stream)\">\r\n            generate a signed object that for a CMS Signed Data\r\n            object using the given provider - if encapsulate is true a copy\r\n            of the message will be included in the signature. The content type\r\n            is set according to the OID represented by the string signedContentType.\r\n            @param out stream the CMS object is to be written to.\r\n            @param signedContentType OID for data to be signed.\r\n            @param encapsulate true if data should be encapsulated.\r\n            @param dataOutputStream output stream to copy the data being signed to.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Cms.CmsSignedGenerator.Data\">\r\n            Default type for the signed data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedGenerator.#ctor(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Constructor allowing specific source of randomness</summary>\r\n            <param name=\"rand\">Instance of <c>SecureRandom</c> to use.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedGenerator.AddAttributeCertificates(Org.BouncyCastle.X509.Store.IX509Store)\">\r\n             Add the attribute certificates contained in the passed in store to the\r\n             generator.\r\n            \r\n             @param store a store of Version 2 attribute certificates\r\n             @throws CmsException if an error occurse processing the store.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedGenerator.AddSigners(Org.BouncyCastle.Cms.SignerInformationStore)\">\r\n             Add a store of precalculated signers to the generator.\r\n            \r\n             @param signerStore store of signers\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedGenerator.GetGeneratedDigests\">\r\n             Return a map of oids and byte arrays representing the digests calculated on the content during\r\n             the last generate.\r\n            \r\n             @return a map of oids (as String objects) and byte[] representing digests.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedHelper.GetDigestAlgName(System.String)\">\r\n            Return the digest algorithm using one of the standard JCA string\r\n            representations rather than the algorithm identifier (if possible).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.CmsSignedHelper.GetEncryptionAlgName(System.String)\">\r\n            Return the digest encryption algorithm using one of the standard\r\n            JCA string representations rather than the algorithm identifier (if\r\n            possible).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.DefaultSignedAttributeTableGenerator\">\r\n            Default signed attributes generator.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultSignedAttributeTableGenerator.#ctor\">\r\n            Initialise to use all defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultSignedAttributeTableGenerator.#ctor(Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n             Initialise with some extra attributes or overrides.\r\n            \r\n             @param attributeTable initial attribute table to use.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultSignedAttributeTableGenerator.createStandardAttributeTable(System.Collections.IDictionary)\">\r\n             Create a standard attribute table from the passed in parameters - this will\r\n             normally include contentType, signingTime, and messageDigest. If the constructor\r\n             using an AttributeTable was used, entries in it for contentType, signingTime, and\r\n             messageDigest will override the generated ones.\r\n            \r\n             @param parameters source parameters for table generation.\r\n            \r\n             @return a filled in Hashtable of attributes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultSignedAttributeTableGenerator.GetAttributes(System.Collections.IDictionary)\">\r\n            @param parameters source parameters\r\n            @return the populated attribute table\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.KekRecipientInformation\">\r\n            the RecipientInfo class for a recipient who has been sent a message\r\n            encrypted using a secret key known to the other side.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.KekRecipientInformation.GetContentStream(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            decrypt the content and return an input stream.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.KeyAgreeRecipientInformation\">\r\n            the RecipientInfo class for a recipient who has been sent a message\r\n            encrypted using key agreement.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.KeyAgreeRecipientInformation.GetContentStream(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            decrypt the content and return an input stream.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.KeyTransRecipientInformation\">\r\n            the KeyTransRecipientInformation class for a recipient who has been sent a secret\r\n            key encrypted using their public key that needs to be used to\r\n            extract the message.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.KeyTransRecipientInformation.GetContentStream(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            decrypt the content and return it as a byte array.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.OriginatorID\">\r\n            a basic index for an originator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.PasswordRecipientInformation\">\r\n            the RecipientInfo class for a recipient who has been sent a message\r\n            encrypted using a password.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.PasswordRecipientInformation.KeyDerivationAlgorithm\">\r\n             return the object identifier for the key derivation algorithm, or null\r\n             if there is none present.\r\n            \r\n             @return OID for key derivation algorithm, if present.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.PasswordRecipientInformation.GetContentStream(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            decrypt the content and return an input stream.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.Pkcs5Scheme2PbeKey\">\r\n            <summary>\r\n            PKCS5 scheme-2 - password converted to bytes assuming ASCII.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.Pkcs5Scheme2Utf8PbeKey\">\r\n            PKCS5 scheme-2 - password converted to bytes using UTF-8.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.RecipientInfoGenerator.Generate(Org.BouncyCastle.Crypto.Parameters.KeyParameter,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Generate a RecipientInfo object for the given key.\r\n            </summary>\r\n            <param name=\"contentEncryptionKey\">\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Parameters.KeyParameter\"/>\r\n            </param>\r\n            <param name=\"random\">\r\n            A <see cref=\"T:Org.BouncyCastle.Security.SecureRandom\"/>\r\n            </param>\r\n            <returns>\r\n            A <see cref=\"T:Org.BouncyCastle.Asn1.Cms.RecipientInfo\"/>\r\n            </returns>\r\n            <exception cref=\"T:Org.BouncyCastle.Security.GeneralSecurityException\"></exception>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.RecipientInformation.KeyEncryptionAlgOid\">\r\n                    * return the object identifier for the key encryption algorithm.\r\n                    * \r\n            \t\t* @return OID for key encryption algorithm.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.RecipientInformation.KeyEncryptionAlgParams\">\r\n                    * return the ASN.1 encoded key encryption algorithm parameters, or null if\r\n                    * there aren't any.\r\n                    * \r\n            \t\t* @return ASN.1 encoding of key encryption algorithm parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.RecipientInformation.GetMac\">\r\n             Return the MAC calculated for the content stream. Note: this call is only meaningful once all\r\n             the content has been read.\r\n            \r\n             @return  byte array containing the mac.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.RecipientInformationStore.GetFirstRecipient(Org.BouncyCastle.Cms.RecipientID)\">\r\n             Return the first RecipientInformation object that matches the\r\n             passed in selector. Null if there are no matches.\r\n            \r\n             @param selector to identify a recipient\r\n             @return a single RecipientInformation object. Null if none matches.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.RecipientInformationStore.Count\">\r\n             Return the number of recipients in the collection.\r\n            \r\n             @return number of recipients identified.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.RecipientInformationStore.GetRecipients\">\r\n             Return all recipients in the collection\r\n            \r\n             @return a collection of recipients.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.RecipientInformationStore.GetRecipients(Org.BouncyCastle.Cms.RecipientID)\">\r\n             Return possible empty collection with recipients matching the passed in RecipientID\r\n            \r\n             @param selector a recipient id to select against.\r\n             @return a collection of RecipientInformation objects.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.SignerID\">\r\n            a basic index for a signer.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.SignerInformation\">\r\n            an expanded SignerInfo block from a CMS Signed message\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.Version\">\r\n            return the version number for this objects underlying SignerInfo structure.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.DigestAlgOid\">\r\n            return the object identifier for the signature.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.DigestAlgParams\">\r\n            return the signature parameters, or null if there aren't any.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.GetContentDigest\">\r\n            return the content digest that was calculated during verification.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.EncryptionAlgOid\">\r\n            return the object identifier for the signature.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.EncryptionAlgParams\">\r\n            return the signature/encryption algorithm parameters, or null if\r\n            there aren't any.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.SignedAttributes\">\r\n            return a table of the signed attributes - indexed by\r\n            the OID of the attribute.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformation.UnsignedAttributes\">\r\n            return a table of the unsigned attributes indexed by\r\n            the OID of the attribute.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.GetSignature\">\r\n            return the encoded signature\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.GetCounterSignatures\">\r\n            Return a SignerInformationStore containing the counter signatures attached to this\r\n            signer. If no counter signatures are present an empty store is returned.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.GetEncodedSignedAttributes\">\r\n            return the DER encoding of the signed attributes.\r\n            @throws IOException if an encoding error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.Verify(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            verify that the given public key successfully handles and confirms the\r\n            signature associated with this signer.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.Verify(Org.BouncyCastle.X509.X509Certificate)\">\r\n            verify that the given certificate successfully handles and confirms\r\n            the signature associated with this signer and, if a signingTime\r\n            attribute is available, that the certificate was valid at the time the\r\n            signature was generated.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.ToSignerInfo\">\r\n             Return the base ASN.1 CMS structure that this object contains.\r\n            \r\n             @return an object containing a CMS SignerInfo structure.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.ReplaceUnsignedAttributes(Org.BouncyCastle.Cms.SignerInformation,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n             Return a signer information object with the passed in unsigned\r\n             attributes replacing the ones that are current associated with\r\n             the object passed in.\r\n            \r\n             @param signerInformation the signerInfo to be used as the basis.\r\n             @param unsignedAttributes the unsigned attributes to add.\r\n             @return a copy of the original SignerInformationObject with the changed attributes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformation.AddCounterSigners(Org.BouncyCastle.Cms.SignerInformation,Org.BouncyCastle.Cms.SignerInformationStore)\">\r\n             Return a signer information object with passed in SignerInformationStore representing counter\r\n             signatures attached as an unsigned attribute.\r\n            \r\n             @param signerInformation the signerInfo to be used as the basis.\r\n             @param counterSigners signer info objects carrying counter signature.\r\n             @return a copy of the original SignerInformationObject with the changed attributes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformationStore.GetFirstSigner(Org.BouncyCastle.Cms.SignerID)\">\r\n             Return the first SignerInformation object that matches the\r\n             passed in selector. Null if there are no matches.\r\n            \r\n             @param selector to identify a signer\r\n             @return a single SignerInformation object. Null if none matches.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Cms.SignerInformationStore.Count\">\r\n            <summary>The number of signers in the collection.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformationStore.GetSigners\">\r\n            <returns>An ICollection of all signers in the collection</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.SignerInformationStore.GetSigners(Org.BouncyCastle.Cms.SignerID)\">\r\n             Return possible empty collection with signers matching the passed in SignerID\r\n            \r\n             @param selector a signer id to select against.\r\n             @return a collection of SignerInformation objects.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.SimpleAttributeTableGenerator\">\r\n            Basic generator that just returns a preconstructed attribute table\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Cms.DefaultAuthenticatedAttributeTableGenerator\">\r\n            Default authenticated attributes generator.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultAuthenticatedAttributeTableGenerator.#ctor\">\r\n            Initialise to use all defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultAuthenticatedAttributeTableGenerator.#ctor(Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n             Initialise with some extra attributes or overrides.\r\n            \r\n             @param attributeTable initial attribute table to use.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultAuthenticatedAttributeTableGenerator.CreateStandardAttributeTable(System.Collections.IDictionary)\">\r\n             Create a standard attribute table from the passed in parameters - this will\r\n             normally include contentType and messageDigest. If the constructor\r\n             using an AttributeTable was used, entries in it for contentType and\r\n             messageDigest will override the generated ones.\r\n            \r\n             @param parameters source parameters for table generation.\r\n            \r\n             @return a filled in IDictionary of attributes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.DefaultAuthenticatedAttributeTableGenerator.GetAttributes(System.Collections.IDictionary)\">\r\n            @param parameters source parameters\r\n            @return the populated attribute table\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.OriginatorInformation.GetCertificates\">\r\n             Return the certificates stored in the underlying OriginatorInfo object.\r\n            \r\n             @return a Store of X509CertificateHolder objects.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.OriginatorInformation.GetCrls\">\r\n             Return the CRLs stored in the underlying OriginatorInfo object.\r\n            \r\n             @return a Store of X509CRLHolder objects.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Cms.OriginatorInformation.ToAsn1Structure\">\r\n             Return the underlying ASN.1 object defining this SignerInformation object.\r\n            \r\n             @return a OriginatorInfo.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.DHAgreement\">\r\n            a Diffie-Hellman key exchange engine.\r\n            <p>\r\n            note: This uses MTI/A0 key agreement in order to make the key agreement\r\n            secure against passive attacks. If you're doing Diffie-Hellman and both\r\n            parties have long term public keys you should look at using this. For\r\n            further information have a look at RFC 2631.</p>\r\n            <p>\r\n            It's possible to extend this to more than two parties as well, for the moment\r\n            that is left as an exercise for the reader.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.DHAgreement.CalculateMessage\">\r\n            calculate our initial message.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.DHAgreement.CalculateAgreement(Org.BouncyCastle.Crypto.Parameters.DHPublicKeyParameters,Org.BouncyCastle.Math.BigInteger)\">\r\n            given a message from a given party and the corresponding public key\r\n            calculate the next message in the agreement sequence. In this case\r\n            this will represent the shared secret.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.DHBasicAgreement\">\r\n            a Diffie-Hellman key agreement class.\r\n            <p>\r\n            note: This is only the basic algorithm, it doesn't take advantage of\r\n            long term public keys if they are available. See the DHAgreement class\r\n            for a \"better\" implementation.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.DHBasicAgreement.CalculateAgreement(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            given a short term public key from a given party calculate the next\r\n            message in the agreement sequence.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.ECDHBasicAgreement\">\r\n             P1363 7.2.1 ECSVDP-DH\r\n            \r\n             ECSVDP-DH is Elliptic Curve Secret Value Derivation Primitive,\r\n             Diffie-Hellman version. It is based on the work of [DH76], [Mil86],\r\n             and [Kob87]. This primitive derives a shared secret value from one\r\n             party's private key and another party's public key, where both have\r\n             the same set of EC domain parameters. If two parties correctly\r\n             execute this primitive, they will produce the same output. This\r\n             primitive can be invoked by a scheme to derive a shared secret key;\r\n             specifically, it may be used with the schemes ECKAS-DH1 and\r\n             DL/ECKAS-DH2. It assumes that the input keys are valid (see also\r\n             Section 7.2.2).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.ECDHCBasicAgreement\">\r\n             P1363 7.2.2 ECSVDP-DHC\r\n            \r\n             ECSVDP-DHC is Elliptic Curve Secret Value Derivation Primitive,\r\n             Diffie-Hellman version with cofactor multiplication. It is based on\r\n             the work of [DH76], [Mil86], [Kob87], [LMQ98] and [Kal98a]. This\r\n             primitive derives a shared secret value from one party's private key\r\n             and another party's public key, where both have the same set of EC\r\n             domain parameters. If two parties correctly execute this primitive,\r\n             they will produce the same output. This primitive can be invoked by a\r\n             scheme to derive a shared secret key; specifically, it may be used\r\n             with the schemes ECKAS-DH1 and DL/ECKAS-DH2. It does not assume the\r\n             validity of the input public key (see also Section 7.2.1).\r\n             <p>\r\n             Note: As stated P1363 compatibility mode with ECDH can be preset, and\r\n             in this case the implementation doesn't have a ECDH compatibility mode\r\n             (if you want that just use ECDHBasicAgreement and note they both implement\r\n             BasicAgreement!).</p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.Kdf.DHKekGenerator\">\r\n            RFC 2631 Diffie-hellman KEK derivation function.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.Kdf.ECDHKekGenerator\">\r\n            X9.63 based key derivation function for ECDH CMS.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Client\">\r\n            Implements the client side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe.\r\n            This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper\r\n            \"SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002\"\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Client.Init(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Crypto.IDigest,Org.BouncyCastle.Security.SecureRandom)\">\r\n            Initialises the client to begin new authentication attempt\r\n            @param N The safe prime associated with the client's verifier\r\n            @param g The group parameter associated with the client's verifier\r\n            @param digest The digest algorithm associated with the client's verifier\r\n            @param random For key generation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Client.GenerateClientCredentials(System.Byte[],System.Byte[],System.Byte[])\">\r\n            Generates client's credentials given the client's salt, identity and password\r\n            @param salt The salt used in the client's verifier.\r\n            @param identity The user's identity (eg. username)\r\n            @param password The user's password\r\n            @return Client's public value to send to server\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Client.CalculateSecret(Org.BouncyCastle.Math.BigInteger)\">\r\n            Generates client's verification message given the server's credentials\r\n            @param serverB The server's credentials\r\n            @return Client's verification message for the server\r\n            @throws CryptoException If server's credentials are invalid\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Server\">\r\n            Implements the server side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe.\r\n            This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper\r\n            \"SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002\"\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Server.Init(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Crypto.IDigest,Org.BouncyCastle.Security.SecureRandom)\">\r\n            Initialises the server to accept a new client authentication attempt\r\n            @param N The safe prime associated with the client's verifier\r\n            @param g The group parameter associated with the client's verifier\r\n            @param v The client's verifier\r\n            @param digest The digest algorithm associated with the client's verifier\r\n            @param random For key generation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Server.GenerateServerCredentials\">\r\n            Generates the server's credentials that are to be sent to the client.\r\n            @return The server's public value to the client\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6Server.CalculateSecret(Org.BouncyCastle.Math.BigInteger)\">\r\n            Processes the client's credentials. If valid the shared secret is generated and returned.\r\n            @param clientA The client's credentials\r\n            @return A shared secret BigInteger\r\n            @throws CryptoException If client's credentials are invalid\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6VerifierGenerator\">\r\n            Generates new SRP verifier for user\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6VerifierGenerator.Init(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Crypto.IDigest)\">\r\n            Initialises generator to create new verifiers\r\n            @param N The safe prime to use (see DHParametersGenerator)\r\n            @param g The group parameter to use (see DHParametersGenerator)\r\n            @param digest The digest to use. The same digest type will need to be used later for the actual authentication\r\n            attempt. Also note that the final session key size is dependent on the chosen digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Agreement.Srp.Srp6VerifierGenerator.GenerateVerifier(System.Byte[],System.Byte[],System.Byte[])\">\r\n            Creates a new SRP verifier\r\n            @param salt The salt to use, generally should be large and random\r\n            @param identity The user's identifying information (eg. username)\r\n            @param password The user's password\r\n            @return A new verifier for use in future SRP authentication\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair\">\r\n            a holding class for public/private parameter pairs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n             basic constructor.\r\n            \r\n             @param publicParam a public key parameters object.\r\n             @param privateParam the corresponding private key parameters.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair.Public\">\r\n             return the public key parameters.\r\n            \r\n             @return the public key parameters.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair.Private\">\r\n             return the private key parameters.\r\n            \r\n             @return the private key parameters.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher\">\r\n            The AEAD block ciphers already handle buffering internally, so this class\r\n            just takes care of implementing IBufferedCipher methods.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the cipher.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.GetBlockSize\">\r\n             return the blocksize for the underlying cipher.\r\n            \r\n             @return the blocksize for the underlying cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.GetUpdateOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update\r\n             an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to update\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.GetOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update plus a\r\n             doFinal with an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to update and doFinal\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n             process a single byte, producing an output block if neccessary.\r\n            \r\n             @param in the input byte.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n             process an array of bytes, producing output if necessary.\r\n            \r\n             @param in the input byte array.\r\n             @param inOff the offset at which the input data starts.\r\n             @param len the number of bytes to be copied out of the input array.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.DoFinal(System.Byte[],System.Int32)\">\r\n             Process the last block in the buffer.\r\n            \r\n             @param out the array the block currently being held is copied into.\r\n             @param outOff the offset at which the copying starts.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there is insufficient space in out for\r\n             the output, or the input is not block size aligned and should be.\r\n             @exception InvalidOperationException if the underlying cipher is not\r\n             initialised.\r\n             @exception InvalidCipherTextException if padding is expected and not found.\r\n             @exception DataLengthException if the input is not block size\r\n             aligned.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.Reset\">\r\n            Reset the buffer and cipher. After resetting the object is in the same\r\n            state as it was after the last init (if there was one).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.BufferedAsymmetricBlockCipher\">\r\n            a buffer wrapper for an asymmetric block cipher, allowing input\r\n            to be accumulated in a piecemeal fashion until final processing.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAsymmetricBlockCipher.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher)\">\r\n             base constructor.\r\n            \r\n             @param cipher the cipher this buffering object wraps.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAsymmetricBlockCipher.GetBufferPosition\">\r\n             return the amount of data sitting in the buffer.\r\n            \r\n             @return the amount of data sitting in the buffer.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAsymmetricBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the buffer and the underlying cipher.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAsymmetricBlockCipher.DoFinal\">\r\n             process the contents of the buffer using the underlying\r\n             cipher.\r\n            \r\n             @return the result of the encryption/decryption process on the\r\n             buffer.\r\n             @exception InvalidCipherTextException if we are given a garbage block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedAsymmetricBlockCipher.Reset\">\r\n            <summary>Reset the buffer</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.BufferedBlockCipher\">\r\n            A wrapper class that allows block ciphers to be used to process data in\r\n            a piecemeal fashion. The BufferedBlockCipher outputs a block only when the\r\n            buffer is full and more data is being added, or on a doFinal.\r\n            <p>\r\n            Note: in the case where the underlying cipher is either a CFB cipher or an\r\n            OFB one the last block may not be a multiple of the block size.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.#ctor\">\r\n            constructor for subclasses\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Create a buffered block cipher without padding.\r\n            \r\n             @param cipher the underlying block cipher this buffering object wraps.\r\n             false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the cipher.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.GetBlockSize\">\r\n             return the blocksize for the underlying cipher.\r\n            \r\n             @return the blocksize for the underlying cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.GetUpdateOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update\r\n             an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to update\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.GetOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update plus a\r\n             doFinal with an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to update and doFinal\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n             process a single byte, producing an output block if neccessary.\r\n            \r\n             @param in the input byte.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n             process an array of bytes, producing output if necessary.\r\n            \r\n             @param in the input byte array.\r\n             @param inOff the offset at which the input data starts.\r\n             @param len the number of bytes to be copied out of the input array.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.DoFinal(System.Byte[],System.Int32)\">\r\n             Process the last block in the buffer.\r\n            \r\n             @param out the array the block currently being held is copied into.\r\n             @param outOff the offset at which the copying starts.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there is insufficient space in out for\r\n             the output, or the input is not block size aligned and should be.\r\n             @exception InvalidOperationException if the underlying cipher is not\r\n             initialised.\r\n             @exception InvalidCipherTextException if padding is expected and not found.\r\n             @exception DataLengthException if the input is not block size\r\n             aligned.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.BufferedBlockCipher.Reset\">\r\n            Reset the buffer and cipher. After resetting the object is in the same\r\n            state as it was after the last init (if there was one).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.CipherKeyGenerator\">\r\n            The base class for symmetric, or secret, cipher key generators.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.CipherKeyGenerator.Init(Org.BouncyCastle.Crypto.KeyGenerationParameters)\">\r\n             initialise the key generator.\r\n            \r\n             @param param the parameters to be used for key generation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.CipherKeyGenerator.GenerateKey\">\r\n             Generate a secret key.\r\n            \r\n             @return a byte array containing the key value.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.DataLengthException\">\r\n            this exception is thrown if a buffer that is meant to have output\r\n            copied into it turns out to be too short, or if we've been given\r\n            insufficient input. In general this exception will Get thrown rather\r\n            than an ArrayOutOfBounds exception.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.DataLengthException.#ctor\">\r\n            base constructor.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.DataLengthException.#ctor(System.String)\">\r\n             create a DataLengthException with the given message.\r\n            \r\n             @param message the message to be carried with the exception.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.GeneralDigest\">\r\n            base implementation of MD4 family style digest as outlined in\r\n            \"Handbook of Applied Cryptography\", pages 344 - 347.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Gost3411Digest\">\r\n            implementation of GOST R 34.11-94\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Gost3411Digest.#ctor\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Gost3411Digest.#ctor(System.Byte[])\">\r\n            Constructor to allow use of a particular sbox with GOST28147\r\n            @see GOST28147Engine#getSBox(String)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Gost3411Digest.#ctor(Org.BouncyCastle.Crypto.Digests.Gost3411Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Digests.Gost3411Digest.C2\">\r\n            reset the chaining variables to the IV values.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.LongDigest\">\r\n            Base class for SHA-384 and SHA-512.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.LongDigest.#ctor\">\r\n            Constructor for variable length word\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.LongDigest.#ctor(Org.BouncyCastle.Crypto.Digests.LongDigest)\">\r\n            Copy constructor.  We are using copy constructors in place\r\n            of the object.Clone() interface as this interface is not\r\n            supported by J2ME.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.LongDigest.AdjustByteCounts\">\r\n            adjust the byte counts so that byteCount2 represents the\r\n            upper long (less 3 bits) word of the byte count.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.MD2Digest\">\r\n            implementation of MD2\r\n            as outlined in RFC1319 by B.Kaliski from RSA Laboratories April 1992\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Digests.MD2Digest.AlgorithmName\">\r\n             return the algorithm name\r\n            \r\n             @return the algorithm name\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD2Digest.DoFinal(System.Byte[],System.Int32)\">\r\n             Close the digest, producing the final digest value. The doFinal\r\n             call leaves the digest reset.\r\n            \r\n             @param out the array the digest is to be copied into.\r\n             @param outOff the offset into the out array the digest is to start at.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD2Digest.Reset\">\r\n            reset the digest back to it's initial state.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD2Digest.Update(System.Byte)\">\r\n             update the message digest with a single byte.\r\n            \r\n             @param in the input byte to be entered.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD2Digest.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n             update the message digest with a block of bytes.\r\n            \r\n             @param in the byte array containing the data.\r\n             @param inOff the offset into the byte array where the data starts.\r\n             @param len the length of the data.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.MD4Digest\">\r\n            implementation of MD4 as RFC 1320 by R. Rivest, MIT Laboratory for\r\n            Computer Science and RSA Data Security, Inc.\r\n            <p>\r\n            <b>NOTE</b>: This algorithm is only included for backwards compatibility\r\n            with legacy applications, it's not secure, don't use it for anything new!</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD4Digest.#ctor\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD4Digest.#ctor(Org.BouncyCastle.Crypto.Digests.MD4Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD4Digest.Reset\">\r\n            reset the chaining variables to the IV values.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.MD5Digest\">\r\n            implementation of MD5 as outlined in \"Handbook of Applied Cryptography\", pages 346 - 347.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD5Digest.#ctor(Org.BouncyCastle.Crypto.Digests.MD5Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.MD5Digest.Reset\">\r\n            reset the chaining variables to the IV values.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.RipeMD128Digest\">\r\n            implementation of RipeMD128\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD128Digest.#ctor\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD128Digest.#ctor(Org.BouncyCastle.Crypto.Digests.RipeMD128Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD128Digest.Reset\">\r\n            reset the chaining variables to the IV values.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.RipeMD160Digest\">\r\n            implementation of RipeMD see,\r\n            http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD160Digest.#ctor\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD160Digest.#ctor(Org.BouncyCastle.Crypto.Digests.RipeMD160Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD160Digest.Reset\">\r\n            reset the chaining variables to the IV values.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.RipeMD256Digest\">\r\n            <remarks>\r\n            <p>Implementation of RipeMD256.</p>\r\n            <p><b>Note:</b> this algorithm offers the same level of security as RipeMD128.</p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD256Digest.#ctor\">\r\n            <summary> Standard constructor</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD256Digest.#ctor(Org.BouncyCastle.Crypto.Digests.RipeMD256Digest)\">\r\n            <summary> Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD256Digest.Reset\">\r\n            <summary> reset the chaining variables to the IV values.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.RipeMD320Digest\">\r\n            <remarks>\r\n            <p>Implementation of RipeMD 320.</p>\r\n            <p><b>Note:</b> this algorithm offers the same level of security as RipeMD160.</p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD320Digest.#ctor\">\r\n            <summary> Standard constructor</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD320Digest.#ctor(Org.BouncyCastle.Crypto.Digests.RipeMD320Digest)\">\r\n            <summary> Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.RipeMD320Digest.Reset\">\r\n            <summary> reset the chaining variables to the IV values.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha1Digest\">\r\n             implementation of SHA-1 as outlined in \"Handbook of Applied Cryptography\", pages 346 - 349.\r\n            \r\n             It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5\r\n             is the \"endianness\" of the word processing!\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha1Digest.#ctor(Org.BouncyCastle.Crypto.Digests.Sha1Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha1Digest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha224Digest\">\r\n            SHA-224 as described in RFC 3874\r\n            <pre>\r\n                    block  word  digest\r\n            SHA-1   512    32    160\r\n            SHA-224 512    32    224\r\n            SHA-256 512    32    256\r\n            SHA-384 1024   64    384\r\n            SHA-512 1024   64    512\r\n            </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha224Digest.#ctor\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha224Digest.#ctor(Org.BouncyCastle.Crypto.Digests.Sha224Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha224Digest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha256Digest\">\r\n             Draft FIPS 180-2 implementation of SHA-256. <b>Note:</b> As this is\r\n             based on a draft this implementation is subject to change.\r\n            \r\n             <pre>\r\n                     block  word  digest\r\n             SHA-1   512    32    160\r\n             SHA-256 512    32    256\r\n             SHA-384 1024   64    384\r\n             SHA-512 1024   64    512\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha256Digest.#ctor(Org.BouncyCastle.Crypto.Digests.Sha256Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha256Digest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha384Digest\">\r\n             Draft FIPS 180-2 implementation of SHA-384. <b>Note:</b> As this is\r\n             based on a draft this implementation is subject to change.\r\n            \r\n             <pre>\r\n                     block  word  digest\r\n             SHA-1   512    32    160\r\n             SHA-256 512    32    256\r\n             SHA-384 1024   64    384\r\n             SHA-512 1024   64    512\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha384Digest.#ctor(Org.BouncyCastle.Crypto.Digests.Sha384Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha384Digest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha3Digest\">\r\n            <summary>\r\n            Implementation of SHA-3 based on following KeccakNISTInterface.c from http://keccak.noekeon.org/\r\n            </summary>\r\n            <remarks>\r\n            Following the naming conventions used in the C source code to enable easy review of the implementation.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha3Digest.GetByteLength\">\r\n             Return the size of block that the compression function is applied to in bytes.\r\n            \r\n             @return internal byte length of a block.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha512Digest\">\r\n             Draft FIPS 180-2 implementation of SHA-512. <b>Note:</b> As this is\r\n             based on a draft this implementation is subject to change.\r\n            \r\n             <pre>\r\n                     block  word  digest\r\n             SHA-1   512    32    160\r\n             SHA-256 512    32    256\r\n             SHA-384 1024   64    384\r\n             SHA-512 1024   64    512\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha512Digest.#ctor(Org.BouncyCastle.Crypto.Digests.Sha512Digest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha512Digest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.Sha512tDigest\">\r\n            FIPS 180-4 implementation of SHA-512/t\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha512tDigest.#ctor(System.Int32)\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha512tDigest.#ctor(Org.BouncyCastle.Crypto.Digests.Sha512tDigest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.Sha512tDigest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.ShortenedDigest\">\r\n            Wrapper class that reduces the output length of a particular digest to\r\n            only the first n bytes of the digest function.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.ShortenedDigest.#ctor(Org.BouncyCastle.Crypto.IDigest,System.Int32)\">\r\n             Base constructor.\r\n            \r\n             @param baseDigest underlying digest to use.\r\n             @param length length in bytes of the output of doFinal.\r\n             @exception ArgumentException if baseDigest is null, or length is greater than baseDigest.GetDigestSize().\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.TigerDigest\">\r\n            implementation of Tiger based on:\r\n            <a href=\"http://www.cs.technion.ac.il/~biham/Reports/Tiger\">\r\n             http://www.cs.technion.ac.il/~biham/Reports/Tiger</a>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.TigerDigest.#ctor\">\r\n            Standard constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.TigerDigest.#ctor(Org.BouncyCastle.Crypto.Digests.TigerDigest)\">\r\n            Copy constructor.  This will copy the state of the provided\r\n            message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.TigerDigest.Reset\">\r\n            reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Digests.WhirlpoolDigest\">\r\n             Implementation of WhirlpoolDigest, based on Java source published by Barreto\r\n             and Rijmen.\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.WhirlpoolDigest.#ctor(Org.BouncyCastle.Crypto.Digests.WhirlpoolDigest)\">\r\n            Copy constructor. This will copy the state of the provided message\r\n            digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Digests.WhirlpoolDigest.Reset\">\r\n            Reset the chaining variables\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Encodings.ISO9796d1Encoding\">\r\n            ISO 9796-1 padding. Note in the light of recent results you should\r\n            only use this with RSA (rather than the \"simpler\" Rabin keys) and you\r\n            should never use it with anything other than a hash (ie. even if the\r\n            message is small don't sign the message, sign it's hash) or some \"random\"\r\n            value. See your favorite search engine for details.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.ISO9796d1Encoding.GetInputBlockSize\">\r\n            return the input block size. The largest message we can process\r\n            is (key_size_in_bits + 3)/16, which in our world comes to\r\n            key_size_in_bytes / 2.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.ISO9796d1Encoding.GetOutputBlockSize\">\r\n            return the maximum possible size for the output.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.ISO9796d1Encoding.SetPadBits(System.Int32)\">\r\n            set the number of bits in the next message to be treated as\r\n            pad bits.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.ISO9796d1Encoding.GetPadBits\">\r\n            retrieve the number of pad bits in the last decoded message.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.ISO9796d1Encoding.DecodeBlock(System.Byte[],System.Int32,System.Int32)\">\r\n            @exception InvalidCipherTextException if the decrypted block is not a valid ISO 9796 bit string\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Encodings.OaepEncoding\">\r\n            Optimal Asymmetric Encryption Padding (OAEP) - see PKCS 1 V 2.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.OaepEncoding.DecodeBlock(System.Byte[],System.Int32,System.Int32)\">\r\n            @exception InvalidCipherTextException if the decrypted block turns out to\r\n            be badly formatted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.OaepEncoding.ItoOSP(System.Int32,System.Byte[])\">\r\n            int to octet string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.OaepEncoding.maskGeneratorFunction1(System.Byte[],System.Int32,System.Int32,System.Int32)\">\r\n            mask generator function, as described in PKCS1v2.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding\">\r\n            this does your basic Pkcs 1 v1.5 padding - whether or not you should be using this\r\n            depends on your application - see Pkcs1 Version 2 for details.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding.StrictLengthEnabledProperty\">\r\n            some providers fail to include the leading zero in PKCS1 encoded blocks. If you need to\r\n            work with one of these set the system property Org.BouncyCastle.Pkcs1.Strict to false.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding.StrictLengthEnabled\">\r\n            The same effect can be achieved by setting the static property directly\r\n            <p>\r\n            The static property is checked during construction of the encoding object, it is set to\r\n            true by default.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher)\">\r\n            Basic constructor.\r\n            @param cipher\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding.DecodeBlock(System.Byte[],System.Int32,System.Int32)\">\r\n            @exception InvalidCipherTextException if the decrypted block is not in Pkcs1 format.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.AesEngine\">\r\n             an implementation of the AES (Rijndael), from FIPS-197.\r\n             <p>\r\n             For further details see: <a href=\"http://csrc.nist.gov/encryption/aes/\">http://csrc.nist.gov/encryption/aes/</a>.\r\n            \r\n             This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at\r\n             <a href=\"http://fp.gladman.plus.com/cryptography_technology/rijndael/\">http://fp.gladman.plus.com/cryptography_technology/rijndael/</a>\r\n            \r\n             There are three levels of tradeoff of speed vs memory\r\n             Because java has no preprocessor, they are written as three separate classes from which to choose\r\n            \r\n             The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption\r\n             and 4 for decryption.\r\n            \r\n             The middle performance version uses only one 256 word table for each, for a total of 2Kbytes,\r\n             adding 12 rotate operations per round to compute the values contained in the other tables from\r\n             the contents of the first.\r\n            \r\n             The slowest version uses no static tables at all and computes the values in each round.\r\n             </p>\r\n             <p>\r\n             This file contains the middle performance version with 2Kbytes of static tables for round precomputation.\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesEngine.GenerateWorkingKey(System.Byte[],System.Boolean)\">\r\n            Calculate the necessary round keys\r\n            The number of calculations depends on key size and block size\r\n            AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits\r\n            This code is written assuming those are the only possible values\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesEngine.#ctor\">\r\n            default constructor - 128 bit block size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise an AES cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.AesFastEngine\">\r\n             an implementation of the AES (Rijndael)), from FIPS-197.\r\n             <p>\r\n             For further details see: <a href=\"http://csrc.nist.gov/encryption/aes/\">http://csrc.nist.gov/encryption/aes/</a>.\r\n            \r\n             This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at\r\n             <a href=\"http://fp.gladman.plus.com/cryptography_technology/rijndael/\">http://fp.gladman.plus.com/cryptography_technology/rijndael/</a>\r\n            \r\n             There are three levels of tradeoff of speed vs memory\r\n             Because java has no preprocessor), they are written as three separate classes from which to choose\r\n            \r\n             The fastest uses 8Kbytes of static tables to precompute round calculations), 4 256 word tables for encryption\r\n             and 4 for decryption.\r\n            \r\n             The middle performance version uses only one 256 word table for each), for a total of 2Kbytes),\r\n             adding 12 rotate operations per round to compute the values contained in the other tables from\r\n             the contents of the first\r\n            \r\n             The slowest version uses no static tables at all and computes the values in each round\r\n             </p>\r\n             <p>\r\n             This file contains the fast version with 8Kbytes of static tables for round precomputation\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesFastEngine.GenerateWorkingKey(System.Byte[],System.Boolean)\">\r\n            Calculate the necessary round keys\r\n            The number of calculations depends on key size and block size\r\n            AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits\r\n            This code is written assuming those are the only possible values\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesFastEngine.#ctor\">\r\n            default constructor - 128 bit block size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesFastEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise an AES cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.AesLightEngine\">\r\n             an implementation of the AES (Rijndael), from FIPS-197.\r\n             <p>\r\n             For further details see: <a href=\"http://csrc.nist.gov/encryption/aes/\">http://csrc.nist.gov/encryption/aes/</a>.\r\n            \r\n             This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at\r\n             <a href=\"http://fp.gladman.plus.com/cryptography_technology/rijndael/\">http://fp.gladman.plus.com/cryptography_technology/rijndael/</a>\r\n            \r\n             There are three levels of tradeoff of speed vs memory\r\n             Because java has no preprocessor, they are written as three separate classes from which to choose\r\n            \r\n             The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption\r\n             and 4 for decryption.\r\n            \r\n             The middle performance version uses only one 256 word table for each, for a total of 2Kbytes,\r\n             adding 12 rotate operations per round to compute the values contained in the other tables from\r\n             the contents of the first\r\n            \r\n             The slowest version uses no static tables at all and computes the values\r\n             in each round.\r\n             </p>\r\n             <p>\r\n             This file contains the slowest performance version with no static tables\r\n             for round precomputation, but it has the smallest foot print.\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesLightEngine.GenerateWorkingKey(System.Byte[],System.Boolean)\">\r\n            Calculate the necessary round keys\r\n            The number of calculations depends on key size and block size\r\n            AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits\r\n            This code is written assuming those are the only possible values\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesLightEngine.#ctor\">\r\n            default constructor - 128 bit block size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.AesLightEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise an AES cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.AesWrapEngine\">\r\n            <remarks>\r\n            An implementation of the AES Key Wrapper from the NIST Key Wrap Specification.\r\n            <p/>\r\n            For further details see: <a href=\"http://csrc.nist.gov/encryption/kms/key-wrap.pdf\">http://csrc.nist.gov/encryption/kms/key-wrap.pdf</a>.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.BlowfishEngine\">\r\n            A class that provides Blowfish key encryption operations,\r\n            such as encoding data and generating keys.\r\n            All the algorithms herein are from Applied Cryptography\r\n            and implement a simplified cryptography interface.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.BlowfishEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a Blowfish cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.BlowfishEngine.ProcessTable(System.UInt32,System.UInt32,System.UInt32[])\">\r\n            apply the encryption cycle to each value pair in the table.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.BlowfishEngine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n            Encrypt the given input starting at the given offset and place\r\n            the result in the provided buffer starting at the given offset.\r\n            The input will be an exact multiple of our blocksize.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.BlowfishEngine.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n            Decrypt the given input starting at the given offset and place\r\n            the result in the provided buffer starting at the given offset.\r\n            The input will be an exact multiple of our blocksize.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.CamelliaEngine\">\r\n            Camellia - based on RFC 3713.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.CamelliaLightEngine\">\r\n            Camellia - based on RFC 3713, smaller implementation, about half the size of CamelliaEngine.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.CamelliaWrapEngine\">\r\n            <remarks>\r\n            An implementation of the Camellia key wrapper based on RFC 3657/RFC 3394.\r\n            <p/>\r\n            For further details see: <a href=\"http://www.ietf.org/rfc/rfc3657.txt\">http://www.ietf.org/rfc/rfc3657.txt</a>.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.Cast5Engine\">\r\n             A class that provides CAST key encryption operations,\r\n             such as encoding data and generating keys.\r\n            \r\n             All the algorithms herein are from the Internet RFC's\r\n            \r\n             RFC2144 - Cast5 (64bit block, 40-128bit key)\r\n             RFC2612 - CAST6 (128bit block, 128-256bit key)\r\n            \r\n             and implement a simplified cryptography interface.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a CAST cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Encrypt the given input starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n            \r\n             @param src        The plaintext buffer\r\n             @param srcIndex    An offset into src\r\n             @param dst        The ciphertext buffer\r\n             @param dstIndex    An offset into dst\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Decrypt the given input starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n            \r\n             @param src        The plaintext buffer\r\n             @param srcIndex    An offset into src\r\n             @param dst        The ciphertext buffer\r\n             @param dstIndex    An offset into dst\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.F1(System.UInt32,System.UInt32,System.Int32)\">\r\n             The first of the three processing functions for the\r\n             encryption and decryption.\r\n            \r\n             @param D            the input to be processed\r\n             @param Kmi        the mask to be used from Km[n]\r\n             @param Kri        the rotation value to be used\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.F2(System.UInt32,System.UInt32,System.Int32)\">\r\n             The second of the three processing functions for the\r\n             encryption and decryption.\r\n            \r\n             @param D            the input to be processed\r\n             @param Kmi        the mask to be used from Km[n]\r\n             @param Kri        the rotation value to be used\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.F3(System.UInt32,System.UInt32,System.Int32)\">\r\n             The third of the three processing functions for the\r\n             encryption and decryption.\r\n            \r\n             @param D            the input to be processed\r\n             @param Kmi        the mask to be used from Km[n]\r\n             @param Kri        the rotation value to be used\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast5Engine.CAST_Encipher(System.UInt32,System.UInt32,System.UInt32[])\">\r\n             Does the 16 rounds to encrypt the block.\r\n            \r\n             @param L0    the LH-32bits of the plaintext block\r\n             @param R0    the RH-32bits of the plaintext block\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.Cast6Engine\">\r\n             A class that provides CAST6 key encryption operations,\r\n             such as encoding data and generating keys.\r\n            \r\n             All the algorithms herein are from the Internet RFC\r\n            \r\n             RFC2612 - CAST6 (128bit block, 128-256bit key)\r\n            \r\n             and implement a simplified cryptography interface.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast6Engine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Encrypt the given input starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n            \r\n             @param src        The plaintext buffer\r\n             @param srcIndex    An offset into src\r\n             @param dst        The ciphertext buffer\r\n             @param dstIndex    An offset into dst\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast6Engine.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Decrypt the given input starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n            \r\n             @param src        The plaintext buffer\r\n             @param srcIndex    An offset into src\r\n             @param dst        The ciphertext buffer\r\n             @param dstIndex    An offset into dst\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast6Engine.CAST_Encipher(System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.UInt32[])\">\r\n             Does the 12 quad rounds rounds to encrypt the block.\r\n            \r\n             @param A    the 00-31  bits of the plaintext block\r\n             @param B    the 32-63  bits of the plaintext block\r\n             @param C    the 64-95  bits of the plaintext block\r\n             @param D    the 96-127 bits of the plaintext block\r\n             @param result the resulting ciphertext\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Cast6Engine.CAST_Decipher(System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.UInt32[])\">\r\n             Does the 12 quad rounds rounds to decrypt the block.\r\n            \r\n             @param A    the 00-31  bits of the ciphertext block\r\n             @param B    the 32-63  bits of the ciphertext block\r\n             @param C    the 64-95  bits of the ciphertext block\r\n             @param D    the 96-127 bits of the ciphertext block\r\n             @param result the resulting plaintext\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.DesEdeEngine\">\r\n            <remarks>A class that provides a basic DESede (or Triple DES) engine.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEdeEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a DESede cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine\">\r\n                * Wrap keys according to\r\n                * <a href=\"http://www.ietf.org/internet-drafts/draft-ietf-smime-key-wrap-01.txt\">\r\n                * draft-ietf-smime-key-wrap-01.txt</a>.\r\n                * <p>\r\n                * Note:\r\n                * <ul>\r\n                * <li>this is based on a draft, and as such is subject to change - don't use this class for anything requiring long term storage.</li>\r\n                * <li>if you are using this to wrap triple-des keys you need to set the\r\n                * parity bits on the key and, if it's a two-key triple-des key, pad it\r\n                * yourself.</li>\r\n                * </ul>\r\n            \t* </p>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.engine\">\r\n            Field engine \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.param\">\r\n            Field param \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.paramPlusIV\">\r\n            Field paramPlusIV \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.iv\">\r\n            Field iv \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.forWrapping\">\r\n            Field forWrapping \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.IV2\">\r\n            Field IV2           \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Method init\r\n            \r\n             @param forWrapping\r\n             @param param\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.AlgorithmName\">\r\n             Method GetAlgorithmName\r\n            \r\n             @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.Wrap(System.Byte[],System.Int32,System.Int32)\">\r\n             Method wrap\r\n            \r\n             @param in\r\n             @param inOff\r\n             @param inLen\r\n             @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.Unwrap(System.Byte[],System.Int32,System.Int32)\">\r\n             Method unwrap\r\n            \r\n             @param in\r\n             @param inOff\r\n             @param inLen\r\n             @return\r\n             @throws InvalidCipherTextException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.CalculateCmsKeyChecksum(System.Byte[])\">\r\n             Some key wrap algorithms make use of the Key Checksum defined\r\n             in CMS [CMS-Algorithms]. This is used to provide an integrity\r\n             check value for the key being wrapped. The algorithm is\r\n            \r\n             - Compute the 20 octet SHA-1 hash on the key being wrapped.\r\n             - Use the first 8 octets of this hash as the checksum value.\r\n            \r\n             @param key\r\n             @return\r\n             @throws Exception\r\n             @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEdeWrapEngine.CheckCmsKeyChecksum(System.Byte[],System.Byte[])\">\r\n            @param key\r\n            @param checksum\r\n            @return\r\n            @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.DesEngine\">\r\n            <remarks>A class that provides a basic DES engine.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a DES cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.DesEngine.bytebit\">\r\n            what follows is mainly taken from \"Applied Cryptography\", by\r\n            Bruce Schneier, however it also bears great resemblance to Richard\r\n            Outerbridge's D3DES...\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEngine.GenerateWorkingKey(System.Boolean,System.Byte[])\">\r\n             Generate an integer based working key based on our secret key\r\n             and what we processing we are planning to do.\r\n            \r\n             Acknowledgements for this routine go to James Gillogly and Phil Karn.\r\n                     (whoever, and wherever they are!).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.DesEngine.DesFunc(System.Int32[],System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n            the DES engine.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.ElGamalEngine\">\r\n            this does your basic ElGamal algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.ElGamalEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the ElGamal engine.\r\n            \r\n             @param forEncryption true if we are encrypting, false otherwise.\r\n             @param param the necessary ElGamal key parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.ElGamalEngine.GetInputBlockSize\">\r\n             Return the maximum size for an input block to this engine.\r\n             For ElGamal this is always one byte less than the size of P on\r\n             encryption, and twice the length as the size of P on decryption.\r\n            \r\n             @return maximum size for an input block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.ElGamalEngine.GetOutputBlockSize\">\r\n             Return the maximum size for an output block to this engine.\r\n             For ElGamal this is always one byte less than the size of P on\r\n             decryption, and twice the length as the size of P on encryption.\r\n            \r\n             @return maximum size for an output block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.ElGamalEngine.ProcessBlock(System.Byte[],System.Int32,System.Int32)\">\r\n             Process a single block using the basic ElGamal algorithm.\r\n            \r\n             @param in the input array.\r\n             @param inOff the offset into the input buffer where the data starts.\r\n             @param length the length of the data to be processed.\r\n             @return the result of the ElGamal process.\r\n             @exception DataLengthException the input block is too large.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.Gost28147Engine\">\r\n            implementation of GOST 28147-89\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Gost28147Engine.#ctor\">\r\n            standard constructor.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Gost28147Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise an Gost28147 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Gost28147Engine.GetSBox(System.String)\">\r\n            Return the S-Box associated with SBoxName\r\n            @param sBoxName name of the S-Box\r\n            @return byte array representing the S-Box\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.HC128Engine\">\r\n             HC-128 is a software-efficient stream cipher created by Hongjun Wu. It\r\n             generates keystream from a 128-bit secret key and a 128-bit initialization\r\n             vector.\r\n             <p>\r\n             http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc128_p3.pdf\r\n             </p><p>\r\n             It is a third phase candidate in the eStream contest, and is patent-free.\r\n             No attacks are known as of today (April 2007). See\r\n            \r\n             http://www.ecrypt.eu.org/stream/hcp3.html\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.HC128Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise a HC-128 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption. Irrelevant, as\r\n                                  encryption and decryption are the same.\r\n             @param params        the parameters required to set up the cipher.\r\n             @throws ArgumentException if the params argument is\r\n                                              inappropriate (ie. the key is not 128 bit long).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.HC256Engine\">\r\n            HC-256 is a software-efficient stream cipher created by Hongjun Wu. It \r\n            generates keystream from a 256-bit secret key and a 256-bit initialization \r\n            vector.\r\n            <p>\r\n            http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc256_p3.pdf\r\n            </p><p>\r\n            Its brother, HC-128, is a third phase candidate in the eStream contest.\r\n            The algorithm is patent-free. No attacks are known as of today (April 2007). \r\n            See\r\n            \r\n            http://www.ecrypt.eu.org/stream/hcp3.html\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.HC256Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise a HC-256 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption. Irrelevant, as\r\n                                  encryption and decryption are the same.\r\n             @param params        the parameters required to set up the cipher.\r\n             @throws ArgumentException if the params argument is\r\n                                              inappropriate (ie. the key is not 256 bit long).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.IesEngine\">\r\n            support class for constructing intergrated encryption ciphers\r\n            for doing basic message exchanges on top of key agreement ciphers\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.IesEngine.#ctor(Org.BouncyCastle.Crypto.IBasicAgreement,Org.BouncyCastle.Crypto.IDerivationFunction,Org.BouncyCastle.Crypto.IMac)\">\r\n             set up for use with stream mode, where the key derivation function\r\n             is used to provide a stream of bytes to xor with the message.\r\n            \r\n             @param agree the key agreement used as the basis for the encryption\r\n             @param kdf the key derivation function used for byte generation\r\n             @param mac the message authentication code generator for the message\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.IesEngine.#ctor(Org.BouncyCastle.Crypto.IBasicAgreement,Org.BouncyCastle.Crypto.IDerivationFunction,Org.BouncyCastle.Crypto.IMac,Org.BouncyCastle.Crypto.BufferedBlockCipher)\">\r\n             set up for use in conjunction with a block cipher to handle the\r\n             message.\r\n            \r\n             @param agree the key agreement used as the basis for the encryption\r\n             @param kdf the key derivation function used for byte generation\r\n             @param mac the message authentication code generator for the message\r\n             @param cipher the cipher to used for encrypting the message\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.IesEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters,Org.BouncyCastle.Crypto.ICipherParameters,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the encryptor.\r\n            \r\n             @param forEncryption whether or not this is encryption/decryption.\r\n             @param privParam our private key parameters\r\n             @param pubParam the recipient's/sender's public key parameters\r\n             @param param encoding and derivation parameters.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.IsaacEngine\">\r\n            Implementation of Bob Jenkin's ISAAC (Indirection Shift Accumulate Add and Count).\r\n            see: http://www.burtleburtle.net/bob/rand/isaacafa.html\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.IsaacEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise an ISAAC cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param params the parameters required to set up the cipher.\r\n             @exception ArgumentException if the params argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine\">\r\n            NaccacheStern Engine. For details on this cipher, please see\r\n            http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initializes this algorithm. Must be called before all other Functions.\r\n            \r\n             @see org.bouncycastle.crypto.AsymmetricBlockCipher#init(bool,\r\n                  org.bouncycastle.crypto.CipherParameters)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.GetInputBlockSize\">\r\n             Returns the input block size of this algorithm.\r\n            \r\n             @see org.bouncycastle.crypto.AsymmetricBlockCipher#GetInputBlockSize()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.GetOutputBlockSize\">\r\n             Returns the output block size of this algorithm.\r\n            \r\n             @see org.bouncycastle.crypto.AsymmetricBlockCipher#GetOutputBlockSize()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.ProcessBlock(System.Byte[],System.Int32,System.Int32)\">\r\n             Process a single Block using the Naccache-Stern algorithm.\r\n            \r\n             @see org.bouncycastle.crypto.AsymmetricBlockCipher#ProcessBlock(byte[],\r\n                  int, int)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.Encrypt(Org.BouncyCastle.Math.BigInteger)\">\r\n             Encrypts a BigInteger aka Plaintext with the public key.\r\n            \r\n             @param plain\r\n                        The BigInteger to encrypt\r\n             @return The byte[] representation of the encrypted BigInteger (i.e.\r\n                     crypted.toByteArray())\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.AddCryptedBlocks(System.Byte[],System.Byte[])\">\r\n             Adds the contents of two encrypted blocks mod sigma\r\n            \r\n             @param block1\r\n                        the first encrypted block\r\n             @param block2\r\n                        the second encrypted block\r\n             @return encrypt((block1 + block2) mod sigma)\r\n             @throws InvalidCipherTextException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.ProcessData(System.Byte[])\">\r\n             Convenience Method for data exchange with the cipher.\r\n            \r\n             Determines blocksize and splits data to blocksize.\r\n            \r\n             @param data the data to be processed\r\n             @return the data after it went through the NaccacheSternEngine.\r\n             @throws InvalidCipherTextException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NaccacheSternEngine.chineseRemainder(System.Collections.IList,System.Collections.IList)\">\r\n             Computes the integer x that is expressed through the given primes and the\r\n             congruences with the chinese remainder theorem (CRT).\r\n            \r\n             @param congruences\r\n                        the congruences c_i\r\n             @param primes\r\n                        the primes p_i\r\n             @return an integer x for that x % p_i == c_i\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.NoekeonEngine\">\r\n            A Noekeon engine, using direct-key mode.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NoekeonEngine.#ctor\">\r\n            Create an instance of the Noekeon encryption algorithm\r\n            and set some defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NoekeonEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param params the parameters required to set up the cipher.\r\n             @exception ArgumentException if the params argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.NoekeonEngine.setKey(System.Byte[])\">\r\n             Re-key the cipher.\r\n            \r\n             @param  key  the key to be used\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.NullEngine\">\r\n            The no-op engine that just copies bytes through, irrespective of whether encrypting and decrypting.\r\n            Provided for the sake of completeness.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RC2Engine\">\r\n            an implementation of RC2 as described in RFC 2268\r\n                 \"A Description of the RC2(r) Encryption Algorithm\" R. Rivest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a RC2 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2Engine.RotateWordLeft(System.Int32,System.Int32)\">\r\n            return the result rotating the 16 bit number in x left by y\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine\">\r\n            Wrap keys according to RFC 3217 - RC2 mechanism\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.engine\">\r\n            Field engine \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.parameters\">\r\n            Field param \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.paramPlusIV\">\r\n            Field paramPlusIV \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.iv\">\r\n            Field iv \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.forWrapping\">\r\n            Field forWrapping \r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.IV2\">\r\n            Field IV2           \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Method init\r\n            \r\n             @param forWrapping\r\n             @param param\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.AlgorithmName\">\r\n             Method GetAlgorithmName\r\n            \r\n             @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.Wrap(System.Byte[],System.Int32,System.Int32)\">\r\n             Method wrap\r\n            \r\n             @param in\r\n             @param inOff\r\n             @param inLen\r\n             @return\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.Unwrap(System.Byte[],System.Int32,System.Int32)\">\r\n             Method unwrap\r\n            \r\n             @param in\r\n             @param inOff\r\n             @param inLen\r\n             @return\r\n             @throws InvalidCipherTextException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.CalculateCmsKeyChecksum(System.Byte[])\">\r\n             Some key wrap algorithms make use of the Key Checksum defined\r\n             in CMS [CMS-Algorithms]. This is used to provide an integrity\r\n             check value for the key being wrapped. The algorithm is\r\n            \r\n             - Compute the 20 octet SHA-1 hash on the key being wrapped.\r\n             - Use the first 8 octets of this hash as the checksum value.\r\n            \r\n             @param key\r\n             @return\r\n             @throws Exception\r\n             @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC2WrapEngine.CheckCmsKeyChecksum(System.Byte[],System.Byte[])\">\r\n            @param key\r\n            @param checksum\r\n            @return\r\n            @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC4Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a RC4 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RC532Engine\">\r\n            The specification for RC5 came from the <code>RC5 Encryption Algorithm</code>\r\n            publication in RSA CryptoBytes, Spring of 1995.\r\n            <em>http://www.rsasecurity.com/rsalabs/cryptobytes</em>.\r\n            <p>\r\n            This implementation has a word size of 32 bits.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC532Engine.#ctor\">\r\n            Create an instance of the RC5 encryption algorithm\r\n            and set some defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC532Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a RC5-32 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC532Engine.SetKey(System.Byte[])\">\r\n             Re-key the cipher.\r\n            \r\n             @param  key  the key to be used\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC532Engine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Encrypt the given block starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n            \r\n             @param  in     in byte buffer containing data to encrypt\r\n             @param  inOff  offset into src buffer\r\n             @param  out     out buffer where encrypted data is written\r\n             @param  outOff  offset into out buffer\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC532Engine.RotateLeft(System.Int32,System.Int32)\">\r\n             Perform a left \"spin\" of the word. The rotation of the given\r\n             word <em>x</em> is rotated left by <em>y</em> bits.\r\n             Only the <em>lg(32)</em> low-order bits of <em>y</em>\r\n             are used to determine the rotation amount. Here it is\r\n             assumed that the wordsize used is a power of 2.\r\n            \r\n             @param  x  word to rotate\r\n             @param  y    number of bits to rotate % 32\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC532Engine.RotateRight(System.Int32,System.Int32)\">\r\n             Perform a right \"spin\" of the word. The rotation of the given\r\n             word <em>x</em> is rotated left by <em>y</em> bits.\r\n             Only the <em>lg(32)</em> low-order bits of <em>y</em>\r\n             are used to determine the rotation amount. Here it is\r\n             assumed that the wordsize used is a power of 2.\r\n            \r\n             @param  x  word to rotate\r\n             @param  y    number of bits to rotate % 32\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RC564Engine\">\r\n            The specification for RC5 came from the <code>RC5 Encryption Algorithm</code>\r\n            publication in RSA CryptoBytes, Spring of 1995.\r\n            <em>http://www.rsasecurity.com/rsalabs/cryptobytes</em>.\r\n            <p>\r\n            This implementation is set to work with a 64 bit word size.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC564Engine.#ctor\">\r\n            Create an instance of the RC5 encryption algorithm\r\n            and set some defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC564Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a RC5-64 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC564Engine.SetKey(System.Byte[])\">\r\n             Re-key the cipher.\r\n            \r\n             @param  key  the key to be used\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC564Engine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Encrypt the given block starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n            \r\n             @param  in      in byte buffer containing data to encrypt\r\n             @param  inOff   offset into src buffer\r\n             @param  out     out buffer where encrypted data is written\r\n             @param  outOff  offset into out buffer\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC564Engine.RotateLeft(System.Int64,System.Int64)\">\r\n             Perform a left \"spin\" of the word. The rotation of the given\r\n             word <em>x</em> is rotated left by <em>y</em> bits.\r\n             Only the <em>lg(wordSize)</em> low-order bits of <em>y</em>\r\n             are used to determine the rotation amount. Here it is\r\n             assumed that the wordsize used is a power of 2.\r\n            \r\n             @param  x  word to rotate\r\n             @param  y    number of bits to rotate % wordSize\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC564Engine.RotateRight(System.Int64,System.Int64)\">\r\n             Perform a right \"spin\" of the word. The rotation of the given\r\n             word <em>x</em> is rotated left by <em>y</em> bits.\r\n             Only the <em>lg(wordSize)</em> low-order bits of <em>y</em>\r\n             are used to determine the rotation amount. Here it is\r\n             assumed that the wordsize used is a power of 2.\r\n            \r\n             @param x word to rotate\r\n             @param y number of bits to rotate % wordSize\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RC6Engine\">\r\n            An RC6 engine.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC6Engine.#ctor\">\r\n            Create an instance of the RC6 encryption algorithm\r\n            and set some defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC6Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a RC5-32 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC6Engine.SetKey(System.Byte[])\">\r\n             Re-key the cipher.\r\n            \r\n             @param inKey the key to be used\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC6Engine.RotateLeft(System.Int32,System.Int32)\">\r\n             Perform a left \"spin\" of the word. The rotation of the given\r\n             word <em>x</em> is rotated left by <em>y</em> bits.\r\n             Only the <em>lg(wordSize)</em> low-order bits of <em>y</em>\r\n             are used to determine the rotation amount. Here it is\r\n             assumed that the wordsize used is a power of 2.\r\n            \r\n             @param x word to rotate\r\n             @param y number of bits to rotate % wordSize\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RC6Engine.RotateRight(System.Int32,System.Int32)\">\r\n             Perform a right \"spin\" of the word. The rotation of the given\r\n             word <em>x</em> is rotated left by <em>y</em> bits.\r\n             Only the <em>lg(wordSize)</em> low-order bits of <em>y</em>\r\n             are used to determine the rotation amount. Here it is\r\n             assumed that the wordsize used is a power of 2.\r\n            \r\n             @param x word to rotate\r\n             @param y number of bits to rotate % wordSize\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.Rfc3211WrapEngine\">\r\n            an implementation of the RFC 3211 Key Wrap\r\n            Specification.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.Rfc3394WrapEngine\">\r\n            <remarks>\r\n            An implementation of the AES Key Wrapper from the NIST Key Wrap\r\n            Specification as described in RFC 3394.\r\n            <p/>\r\n            For further details see: <a href=\"http://www.ietf.org/rfc/rfc3394.txt\">http://www.ietf.org/rfc/rfc3394.txt</a>\r\n            and  <a href=\"http://csrc.nist.gov/encryption/kms/key-wrap.pdf\">http://csrc.nist.gov/encryption/kms/key-wrap.pdf</a>.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RijndaelEngine\">\r\n            an implementation of Rijndael, based on the documentation and reference implementation\r\n            by Paulo Barreto, Vincent Rijmen, for v2.0 August '99.\r\n            <p>\r\n            Note: this implementation is based on information prior to readonly NIST publication.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.Mul0x2(System.Int32)\">\r\n            multiply two elements of GF(2^m)\r\n            needed for MixColumn and InvMixColumn\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.KeyAddition(System.Int64[])\">\r\n            xor corresponding text input and round key input bytes\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.ShiftRow(System.Byte[])\">\r\n            Row 0 remains unchanged\r\n            The other three rows are shifted a variable amount\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.Substitution(System.Byte[])\">\r\n            Replace every byte of the input by the byte at that place\r\n            in the nonlinear S-box\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.MixColumn\">\r\n            Mix the bytes of every column in a linear way\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.InvMixColumn\">\r\n            Mix the bytes of every column in a linear way\r\n            This is the opposite operation of Mixcolumn\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.GenerateWorkingKey(System.Byte[])\">\r\n            Calculate the necessary round keys\r\n            The number of calculations depends on keyBits and blockBits\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.#ctor\">\r\n            default constructor - 128 bit block size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.#ctor(System.Int32)\">\r\n             basic constructor - set the cipher up for a given blocksize\r\n            \r\n             @param blocksize the blocksize in bits, must be 128, 192, or 256.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RijndaelEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a Rijndael cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RsaBlindedEngine\">\r\n            this does your basic RSA algorithm with blinding\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindedEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the RSA engine.\r\n            \r\n             @param forEncryption true if we are encrypting, false otherwise.\r\n             @param param the necessary RSA key parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindedEngine.GetInputBlockSize\">\r\n             Return the maximum size for an input block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             encryption, and the same length as the key size on decryption.\r\n            \r\n             @return maximum size for an input block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindedEngine.GetOutputBlockSize\">\r\n             Return the maximum size for an output block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             decryption, and the same length as the key size on encryption.\r\n            \r\n             @return maximum size for an output block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindedEngine.ProcessBlock(System.Byte[],System.Int32,System.Int32)\">\r\n             Process a single block using the basic RSA algorithm.\r\n            \r\n             @param inBuf the input array.\r\n             @param inOff the offset into the input buffer where the data starts.\r\n             @param inLen the length of the data to be processed.\r\n             @return the result of the RSA process.\r\n             @exception DataLengthException the input block is too large.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RsaBlindingEngine\">\r\n            This does your basic RSA Chaum's blinding and unblinding as outlined in\r\n            \"Handbook of Applied Cryptography\", page 475. You need to use this if you are\r\n            trying to get another party to generate signatures without them being aware\r\n            of the message they are signing.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindingEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the blinding engine.\r\n            \r\n             @param forEncryption true if we are encrypting (blinding), false otherwise.\r\n             @param param         the necessary RSA key parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindingEngine.GetInputBlockSize\">\r\n             Return the maximum size for an input block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             encryption, and the same length as the key size on decryption.\r\n            \r\n             @return maximum size for an input block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindingEngine.GetOutputBlockSize\">\r\n             Return the maximum size for an output block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             decryption, and the same length as the key size on encryption.\r\n            \r\n             @return maximum size for an output block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaBlindingEngine.ProcessBlock(System.Byte[],System.Int32,System.Int32)\">\r\n             Process a single block using the RSA blinding algorithm.\r\n            \r\n             @param in    the input array.\r\n             @param inOff the offset into the input buffer where the data starts.\r\n             @param inLen the length of the data to be processed.\r\n             @return the result of the RSA process.\r\n             @throws DataLengthException the input block is too large.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RsaCoreEngine\">\r\n            this does your basic RSA algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaCoreEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the RSA engine.\r\n            \r\n             @param forEncryption true if we are encrypting, false otherwise.\r\n             @param param the necessary RSA key parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaCoreEngine.GetInputBlockSize\">\r\n             Return the maximum size for an input block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             encryption, and the same length as the key size on decryption.\r\n            \r\n             @return maximum size for an input block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaCoreEngine.GetOutputBlockSize\">\r\n             Return the maximum size for an output block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             decryption, and the same length as the key size on encryption.\r\n            \r\n             @return maximum size for an output block.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.RsaEngine\">\r\n            this does your basic RSA algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the RSA engine.\r\n            \r\n             @param forEncryption true if we are encrypting, false otherwise.\r\n             @param param the necessary RSA key parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaEngine.GetInputBlockSize\">\r\n             Return the maximum size for an input block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             encryption, and the same length as the key size on decryption.\r\n            \r\n             @return maximum size for an input block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaEngine.GetOutputBlockSize\">\r\n             Return the maximum size for an output block to this engine.\r\n             For RSA this is always one byte less than the key size on\r\n             decryption, and the same length as the key size on encryption.\r\n            \r\n             @return maximum size for an output block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.RsaEngine.ProcessBlock(System.Byte[],System.Int32,System.Int32)\">\r\n             Process a single block using the basic RSA algorithm.\r\n            \r\n             @param inBuf the input array.\r\n             @param inOff the offset into the input buffer where the data starts.\r\n             @param inLen the length of the data to be processed.\r\n             @return the result of the RSA process.\r\n             @exception DataLengthException the input block is too large.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.Salsa20Engine\">\r\n            Implementation of Daniel J. Bernstein's Salsa20 stream cipher, Snuffle 2005\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.Salsa20Engine.StateSize\">\r\n            Constants \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.Salsa20Engine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a Salsa20 cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param params the parameters required to set up the cipher.\r\n             @exception ArgumentException if the params argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.SeedEngine\">\r\n            Implementation of the SEED algorithm as described in RFC 4009\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.SeedWrapEngine\">\r\n            <remarks>\r\n            An implementation of the SEED key wrapper based on RFC 4010/RFC 3394.\r\n            <p/>\r\n            For further details see: <a href=\"http://www.ietf.org/rfc/rfc4010.txt\">http://www.ietf.org/rfc/rfc4010.txt</a>.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.SerpentEngine\">\r\n                * Serpent is a 128-bit 32-round block cipher with variable key lengths,\r\n                * including 128, 192 and 256 bit keys conjectured to be at least as\r\n                * secure as three-key triple-DES.\r\n                * <p>\r\n                * Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a\r\n                * candidate algorithm for the NIST AES Quest.>\r\n            \t* </p>\r\n                * <p>\r\n                * For full details see the <a href=\"http://www.cl.cam.ac.uk/~rja14/serpent.html\">The Serpent home page</a>\r\n            \t* </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a Serpent cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.MakeWorkingKey(System.Byte[])\">\r\n             Expand a user-supplied key material into a session key.\r\n            \r\n             @param key  The user-key bytes (multiples of 4) to use.\r\n             @exception ArgumentException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Encrypt one block of plaintext.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Decrypt one block of ciphertext.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb0(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib0(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb1(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib1(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb2(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib2(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb3(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib3(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb4(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib4(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb5(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib5(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb6(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib6(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Sb7(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.Ib7(System.Int32,System.Int32,System.Int32,System.Int32)\">\r\n            InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.LT\">\r\n            Apply the linear transformation to the register set.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SerpentEngine.InverseLT\">\r\n            Apply the inverse of the linear transformation to the register set.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.SkipjackEngine\">\r\n            a class that provides a basic SKIPJACK engine.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SkipjackEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a SKIPJACK cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SkipjackEngine.G(System.Int32,System.Int32)\">\r\n            The G permutation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.SkipjackEngine.H(System.Int32,System.Int32)\">\r\n            the inverse of the G permutation.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.TeaEngine\">\r\n            An TEA engine.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TeaEngine.#ctor\">\r\n            Create an instance of the TEA encryption algorithm\r\n            and set some defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TeaEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param params the parameters required to set up the cipher.\r\n             @exception ArgumentException if the params argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TeaEngine.setKey(System.Byte[])\">\r\n             Re-key the cipher.\r\n            \r\n             @param  key  the key to be used\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.TwofishEngine\">\r\n             A class that provides Twofish encryption operations.\r\n            \r\n             This Java implementation is based on the Java reference\r\n             implementation provided by Bruce Schneier and developed\r\n             by Raif S. Naffah.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.TwofishEngine.P_00\">\r\n            Define the fixed p0/p1 permutations used in keyed S-box lookup.\r\n            By changing the following constant definitions, the S-boxes will\r\n            automatically Get changed in the Twofish engine.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Engines.TwofishEngine.gSubKeys\">\r\n            gSubKeys[] and gSBox[] are eventually used in the\r\n            encryption and decryption methods.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TwofishEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise a Twofish cipher.\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param parameters the parameters required to set up the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TwofishEngine.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Encrypt the given input starting at the given offset and place\r\n             the result in the provided buffer starting at the given offset.\r\n             The input will be an exact multiple of our blocksize.\r\n            \r\n             encryptBlock uses the pre-calculated gSBox[] and subKey[]\r\n             arrays.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TwofishEngine.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n            Decrypt the given input starting at the given offset and place\r\n            the result in the provided buffer starting at the given offset.\r\n            The input will be an exact multiple of our blocksize.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TwofishEngine.RS_MDS_Encode(System.Int32,System.Int32)\">\r\n             Use (12, 8) Reed-Solomon code over GF(256) to produce\r\n             a key S-box 32-bit entity from 2 key material 32-bit\r\n             entities.\r\n            \r\n             @param    k0 first 32-bit entity\r\n             @param    k1 second 32-bit entity\r\n             @return     Remainder polynomial Generated using RS code\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.TwofishEngine.RS_rem(System.Int32)\">\r\n                    * Reed-Solomon code parameters: (12,8) reversible code:\r\n            \t\t* <p>\r\n                    * <pre>\r\n                    * G(x) = x^4 + (a+1/a)x^3 + ax^2 + (a+1/a)x + 1\r\n                    * </pre>\r\n                    * where a = primitive root of field generator 0x14D\r\n            \t\t* </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.VmpcEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            initialise a VMPC cipher.\r\n            \r\n            @param forEncryption\r\n               whether or not we are for encryption.\r\n            @param params\r\n               the parameters required to set up the cipher.\r\n            @exception ArgumentException\r\n               if the params argument is inappropriate.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Engines.XteaEngine\">\r\n            An XTEA engine.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.XteaEngine.#ctor\">\r\n            Create an instance of the TEA encryption algorithm\r\n            and set some defaults\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.XteaEngine.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise\r\n            \r\n             @param forEncryption whether or not we are for encryption.\r\n             @param params the parameters required to set up the cipher.\r\n             @exception ArgumentException if the params argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Engines.XteaEngine.setKey(System.Byte[])\">\r\n             Re-key the cipher.\r\n            \r\n             @param  key  the key to be used\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.BaseKdfBytesGenerator\">\r\n            Basic KDF generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033\r\n            <br/>\r\n            This implementation is based on ISO 18033/P1363a.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.BaseKdfBytesGenerator.#ctor(System.Int32,Org.BouncyCastle.Crypto.IDigest)\">\r\n             Construct a KDF Parameters generator.\r\n            \r\n             @param counterStart value of counter.\r\n             @param digest the digest to be used as the source of derived keys.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Generators.BaseKdfBytesGenerator.Digest\">\r\n            return the underlying digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.BaseKdfBytesGenerator.GenerateBytes(System.Byte[],System.Int32,System.Int32)\">\r\n             fill len bytes of the output buffer with bytes generated from\r\n             the derivation function.\r\n            \r\n             @throws ArgumentException if the size of the request will cause an overflow.\r\n             @throws DataLengthException if the out buffer is too small.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DesEdeKeyGenerator.engineInit(Org.BouncyCastle.Crypto.KeyGenerationParameters)\">\r\n             initialise the key generator - if strength is set to zero\r\n             the key Generated will be 192 bits in size, otherwise\r\n             strength can be 128 or 192 (or 112 or 168 if you don't count\r\n             parity bits), depending on whether you wish to do 2-key or 3-key\r\n             triple DES.\r\n            \r\n             @param param the parameters to be used for key generation\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DesKeyGenerator.engineInit(Org.BouncyCastle.Crypto.KeyGenerationParameters)\">\r\n             initialise the key generator - if strength is set to zero\r\n             the key generated will be 64 bits in size, otherwise\r\n             strength can be 64 or 56 bits (if you don't count the parity bits).\r\n            \r\n             @param param the parameters to be used for key generation\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.DHBasicKeyPairGenerator\">\r\n             a basic Diffie-Hellman key pair generator.\r\n            \r\n             This generates keys consistent for use with the basic algorithm for\r\n             Diffie-Hellman.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.DHKeyPairGenerator\">\r\n             a Diffie-Hellman key pair generator.\r\n            \r\n             This generates keys consistent for use in the MTI/A0 key agreement protocol\r\n             as described in \"Handbook of Applied Cryptography\", Pages 516-519.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DHParametersGenerator.GenerateParameters\">\r\n            which Generates the p and g values from the given parameters,\r\n            returning the DHParameters object.\r\n            <p>\r\n            Note: can take a while...</p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.DsaKeyPairGenerator\">\r\n                 * a DSA key pair generator.\r\n                 *\r\n                 * This Generates DSA keys in line with the method described\r\n            \t * in <i>FIPS 186-3 B.1 FFC Key Pair Generation</i>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.DsaParametersGenerator\">\r\n            Generate suitable parameters for DSA, in line with FIPS 186-2, or FIPS 186-3.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DsaParametersGenerator.Init(System.Int32,System.Int32,Org.BouncyCastle.Security.SecureRandom)\">\r\n             initialise the key generator.\r\n            \r\n             @param size size of the key (range 2^512 -> 2^1024 - 64 bit increments)\r\n             @param certainty measure of robustness of prime (for FIPS 186-2 compliance this should be at least 80).\r\n             @param random random byte source.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DsaParametersGenerator.Init(Org.BouncyCastle.Crypto.Parameters.DsaParameterGenerationParameters)\">\r\n             Initialise the key generator for DSA 2.\r\n             <p>\r\n                 Use this init method if you need to generate parameters for DSA 2 keys.\r\n             </p>\r\n            \r\n             @param params  DSA 2 key generation parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DsaParametersGenerator.GenerateParameters\">\r\n            which Generates the p and g values from the given parameters,\r\n            returning the DsaParameters object.\r\n            <p>\r\n            Note: can take a while...</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.DsaParametersGenerator.GenerateParameters_FIPS186_3\">\r\n            generate suitable parameters for DSA, in line with\r\n            <i>FIPS 186-3 A.1 Generation of the FFC Primes p and q</i>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.ECKeyPairGenerator.GenerateKeyPair\">\r\n            Given the domain parameters this routine Generates an EC key\r\n            pair in accordance with X9.62 section 5.2.1 pages 26, 27.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.ElGamalKeyPairGenerator\">\r\n            a ElGamal key pair generator.\r\n            <p>\r\n            This Generates keys consistent for use with ElGamal as described in\r\n            page 164 of \"Handbook of Applied Cryptography\".</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.ElGamalParametersGenerator.GenerateParameters\">\r\n                     * which Generates the p and g values from the given parameters,\r\n                     * returning the ElGamalParameters object.\r\n                     * <p>\r\n                     * Note: can take a while...\r\n            \t\t * </p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Gost3410KeyPairGenerator\">\r\n            a GOST3410 key pair generator.\r\n            This generates GOST3410 keys in line with the method described\r\n            in GOST R 34.10-94.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Gost3410ParametersGenerator\">\r\n            generate suitable parameters for GOST3410.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Gost3410ParametersGenerator.Init(System.Int32,System.Int32,Org.BouncyCastle.Security.SecureRandom)\">\r\n             initialise the key generator.\r\n            \r\n             @param size size of the key\r\n             @param typeProcedure type procedure A,B = 1;  A',B' - else\r\n             @param random random byte source.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Gost3410ParametersGenerator.procedure_C(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            Procedure C\r\n            procedure generates the a value from the given p,q,\r\n            returning the a value.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Gost3410ParametersGenerator.GenerateParameters\">\r\n            which generates the p , q and a values from the given parameters,\r\n            returning the Gost3410Parameters object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Kdf1BytesGenerator\">\r\n            KFD2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033\r\n            <br/>\r\n            This implementation is based on IEEE P1363/ISO 18033.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Kdf1BytesGenerator.#ctor(Org.BouncyCastle.Crypto.IDigest)\">\r\n             Construct a KDF1 byte generator.\r\n            \r\n             @param digest the digest to be used as the source of derived keys.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Kdf2BytesGenerator\">\r\n            KDF2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033\r\n            <br/>\r\n            This implementation is based on IEEE P1363/ISO 18033.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Kdf2BytesGenerator.#ctor(Org.BouncyCastle.Crypto.IDigest)\">\r\n             Construct a KDF2 bytes generator. Generates key material\r\n             according to IEEE P1363 or ISO 18033 depending on the initialisation.\r\n            \r\n             @param digest the digest to be used as the source of derived keys.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Mgf1BytesGenerator\">\r\n            Generator for MGF1 as defined in Pkcs 1v2\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Mgf1BytesGenerator.#ctor(Org.BouncyCastle.Crypto.IDigest)\">\r\n            @param digest the digest to be used as the source of Generated bytes\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Generators.Mgf1BytesGenerator.Digest\">\r\n            return the underlying digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Mgf1BytesGenerator.ItoOSP(System.Int32,System.Byte[])\">\r\n            int to octet string.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Mgf1BytesGenerator.GenerateBytes(System.Byte[],System.Int32,System.Int32)\">\r\n             fill len bytes of the output buffer with bytes Generated from\r\n             the derivation function.\r\n            \r\n             @throws DataLengthException if the out buffer is too small.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.NaccacheSternKeyPairGenerator\">\r\n             Key generation parameters for NaccacheStern cipher. For details on this cipher, please see\r\n            \r\n             http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.NaccacheSternKeyPairGenerator.permuteList(System.Collections.IList,Org.BouncyCastle.Security.SecureRandom)\">\r\n             Generates a permuted ArrayList from the original one. The original List\r\n             is not modified\r\n            \r\n             @param arr\r\n                        the ArrayList to be permuted\r\n             @param rand\r\n                        the source of Randomness for permutation\r\n             @return a new IList with the permuted elements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.NaccacheSternKeyPairGenerator.findFirstPrimes(System.Int32)\">\r\n             Finds the first 'count' primes starting with 3\r\n            \r\n             @param count\r\n                        the number of primes to find\r\n             @return a vector containing the found primes as Integer\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator\">\r\n            Generator for PBE derived keys and ivs as usd by OpenSSL.\r\n            <p>\r\n            The scheme is a simple extension of PKCS 5 V2.0 Scheme 1 using MD5 with an\r\n            iteration count of 1.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator.#ctor\">\r\n            Construct a OpenSSL Parameters generator. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator.Init(System.Byte[],System.Byte[])\">\r\n            Initialise - note the iteration count for this algorithm is fixed at 1.\r\n            \r\n            @param password password to use.\r\n            @param salt salt to use.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator.GenerateDerivedKey(System.Int32)\">\r\n            the derived key function, the ith hash of the password and the salt.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator.GenerateDerivedParameters(System.Int32)\">\r\n             Generate a key parameter derived from the password, salt, and iteration\r\n             count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n             @exception ArgumentException if the key length larger than the base hash size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator.GenerateDerivedParameters(System.Int32,System.Int32)\">\r\n             Generate a key with initialisation vector parameter derived from\r\n             the password, salt, and iteration count we are currently initialised\r\n             with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @param ivSize the size of the iv we want (in bits)\r\n             @return a ParametersWithIV object.\r\n             @exception ArgumentException if keySize + ivSize is larger than the base hash size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.OpenSslPbeParametersGenerator.GenerateDerivedMacParameters(System.Int32)\">\r\n             Generate a key parameter for use with a MAC derived from the password,\r\n             salt, and iteration count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n             @exception ArgumentException if the key length larger than the base hash size.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator\">\r\n            Generator for Pbe derived keys and ivs as defined by Pkcs 12 V1.0.\r\n            <p>\r\n            The document this implementation is based on can be found at\r\n            <a href=\"http://www.rsasecurity.com/rsalabs/pkcs/pkcs-12/index.html\">\r\n            RSA's Pkcs12 Page</a>\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator.#ctor(Org.BouncyCastle.Crypto.IDigest)\">\r\n             Construct a Pkcs 12 Parameters generator.\r\n            \r\n             @param digest the digest to be used as the source of derived keys.\r\n             @exception ArgumentException if an unknown digest is passed in.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator.Adjust(System.Byte[],System.Int32,System.Byte[])\">\r\n            add a + b + 1, returning the result in a. The a value is treated\r\n            as a BigInteger of length (b.Length * 8) bits. The result is\r\n            modulo 2^b.Length in case of overflow.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator.GenerateDerivedKey(System.Int32,System.Int32)\">\r\n            generation of a derived key ala Pkcs12 V1.0.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator.GenerateDerivedParameters(System.Int32)\">\r\n             Generate a key parameter derived from the password, salt, and iteration\r\n             count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator.GenerateDerivedParameters(System.Int32,System.Int32)\">\r\n             Generate a key with initialisation vector parameter derived from\r\n             the password, salt, and iteration count we are currently initialised\r\n             with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @param ivSize the size of the iv we want (in bits)\r\n             @return a ParametersWithIV object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs12ParametersGenerator.GenerateDerivedMacParameters(System.Int32)\">\r\n             Generate a key parameter for use with a MAC derived from the password,\r\n             salt, and iteration count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Pkcs5S1ParametersGenerator\">\r\n            Generator for Pbe derived keys and ivs as defined by Pkcs 5 V2.0 Scheme 1.\r\n            Note this generator is limited to the size of the hash produced by the\r\n            digest used to drive it.\r\n            <p>\r\n            The document this implementation is based on can be found at\r\n            <a href=\"http://www.rsasecurity.com/rsalabs/pkcs/pkcs-5/index.html\">\r\n            RSA's Pkcs5 Page</a>\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S1ParametersGenerator.#ctor(Org.BouncyCastle.Crypto.IDigest)\">\r\n             Construct a Pkcs 5 Scheme 1 Parameters generator.\r\n            \r\n             @param digest the digest to be used as the source of derived keys.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S1ParametersGenerator.GenerateDerivedKey\">\r\n            the derived key function, the ith hash of the mPassword and the mSalt.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S1ParametersGenerator.GenerateDerivedParameters(System.Int32)\">\r\n             Generate a key parameter derived from the mPassword, mSalt, and iteration\r\n             count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n             @exception ArgumentException if the key length larger than the base hash size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S1ParametersGenerator.GenerateDerivedParameters(System.Int32,System.Int32)\">\r\n             Generate a key with initialisation vector parameter derived from\r\n             the mPassword, mSalt, and iteration count we are currently initialised\r\n             with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @param ivSize the size of the iv we want (in bits)\r\n             @return a ParametersWithIV object.\r\n             @exception ArgumentException if keySize + ivSize is larger than the base hash size.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S1ParametersGenerator.GenerateDerivedMacParameters(System.Int32)\">\r\n             Generate a key parameter for use with a MAC derived from the mPassword,\r\n             mSalt, and iteration count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n             @exception ArgumentException if the key length larger than the base hash size.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.Pkcs5S2ParametersGenerator\">\r\n            Generator for Pbe derived keys and ivs as defined by Pkcs 5 V2.0 Scheme 2.\r\n            This generator uses a SHA-1 HMac as the calculation function.\r\n            <p>\r\n            The document this implementation is based on can be found at\r\n            <a href=\"http://www.rsasecurity.com/rsalabs/pkcs/pkcs-5/index.html\">\r\n            RSA's Pkcs5 Page</a></p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S2ParametersGenerator.#ctor\">\r\n            construct a Pkcs5 Scheme 2 Parameters generator.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S2ParametersGenerator.GenerateDerivedParameters(System.Int32)\">\r\n             Generate a key parameter derived from the password, salt, and iteration\r\n             count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S2ParametersGenerator.GenerateDerivedParameters(System.Int32,System.Int32)\">\r\n             Generate a key with initialisation vector parameter derived from\r\n             the password, salt, and iteration count we are currently initialised\r\n             with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @param ivSize the size of the iv we want (in bits)\r\n             @return a ParametersWithIV object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.Pkcs5S2ParametersGenerator.GenerateDerivedMacParameters(System.Int32)\">\r\n             Generate a key parameter for use with a MAC derived from the password,\r\n             salt, and iteration count we are currently initialised with.\r\n            \r\n             @param keySize the size of the key we want (in bits)\r\n             @return a KeyParameter object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.RsaBlindingFactorGenerator\">\r\n            Generate a random factor suitable for use with RSA blind signatures\r\n            as outlined in Chaum's blinding and unblinding as outlined in\r\n            \"Handbook of Applied Cryptography\", page 475.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.RsaBlindingFactorGenerator.Init(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the factor generator\r\n            \r\n             @param param the necessary RSA key parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Generators.RsaBlindingFactorGenerator.GenerateBlindingFactor\">\r\n             Generate a suitable blind factor for the public key the generator was initialised with.\r\n            \r\n             @return a random blind factor\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Generators.RsaKeyPairGenerator\">\r\n            an RSA key pair generator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IAsymmetricBlockCipher\">\r\n            <remarks>Base interface for a public/private key block cipher.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IAsymmetricBlockCipher.AlgorithmName\">\r\n            <summary>The name of the algorithm this cipher implements.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IAsymmetricBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            <summary>Initialise the cipher.</summary>\r\n            <param name=\"forEncryption\">Initialise for encryption if true, for decryption if false.</param>\r\n            <param name=\"parameters\">The key or other data required by the cipher.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IAsymmetricBlockCipher.GetInputBlockSize\">\r\n            <returns>The maximum size, in bytes, an input block may be.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IAsymmetricBlockCipher.GetOutputBlockSize\">\r\n            <returns>The maximum size, in bytes, an output block will be.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IAsymmetricBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary>Process a block.</summary>\r\n            <param name=\"inBuf\">The input buffer.</param>\r\n            <param name=\"inOff\">The offset into <paramref>inBuf</paramref> that the input block begins.</param>\r\n            <param name=\"inLen\">The length of the input block.</param>\r\n            <exception cref=\"T:Org.BouncyCastle.Crypto.InvalidCipherTextException\">Input decrypts improperly.</exception>\r\n            <exception cref=\"T:Org.BouncyCastle.Crypto.DataLengthException\">Input is too large for the cipher.</exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IAsymmetricCipherKeyPairGenerator\">\r\n            interface that a public/private key pair generator should conform to.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IAsymmetricCipherKeyPairGenerator.Init(Org.BouncyCastle.Crypto.KeyGenerationParameters)\">\r\n             intialise the key pair generator.\r\n            \r\n             @param the parameters the key pair is to be initialised with.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IAsymmetricCipherKeyPairGenerator.GenerateKeyPair\">\r\n             return an AsymmetricCipherKeyPair containing the Generated keys.\r\n            \r\n             @return an AsymmetricCipherKeyPair containing the Generated keys.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IBasicAgreement\">\r\n            The basic interface that basic Diffie-Hellman implementations\r\n            conforms to.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBasicAgreement.Init(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            initialise the agreement engine.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBasicAgreement.GetFieldSize\">\r\n            return the field size for the agreement algorithm in bytes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBasicAgreement.CalculateAgreement(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            given a public key from a given party calculate the next\r\n            message in the agreement sequence.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IBlockCipher\">\r\n            <remarks>Base interface for a symmetric key block cipher.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IBlockCipher.AlgorithmName\">\r\n            <summary>The name of the algorithm this cipher implements.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            <summary>Initialise the cipher.</summary>\r\n            <param name=\"forEncryption\">Initialise for encryption if true, for decryption if false.</param>\r\n            <param name=\"parameters\">The key or other data required by the cipher.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBlockCipher.GetBlockSize\">\r\n            <returns>The block size for this cipher, in bytes.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IBlockCipher.IsPartialBlockOkay\">\r\n            <summary>Indicates whether this cipher can handle partial blocks.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n            <summary>Process a block.</summary>\r\n            <param name=\"inBuf\">The input buffer.</param>\r\n            <param name=\"inOff\">The offset into <paramref>inBuf</paramref> that the input block begins.</param>\r\n            <param name=\"outBuf\">The output buffer.</param>\r\n            <param name=\"outOff\">The offset into <paramref>outBuf</paramref> to write the output block.</param>\r\n            <exception cref=\"T:Org.BouncyCastle.Crypto.DataLengthException\">If input block is wrong size, or outBuf too small.</exception>\r\n            <returns>The number of bytes processed and produced.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBlockCipher.Reset\">\r\n            <summary>\r\n            Reset the cipher to the same state as it was after the last init (if there was one).\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IBufferedCipher\">\r\n            <remarks>Block cipher engines are expected to conform to this interface.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IBufferedCipher.AlgorithmName\">\r\n            <summary>The name of the algorithm this cipher implements.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBufferedCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            <summary>Initialise the cipher.</summary>\r\n            <param name=\"forEncryption\">If true the cipher is initialised for encryption,\r\n            if false for decryption.</param>\r\n            <param name=\"parameters\">The key and other data required by the cipher.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IBufferedCipher.Reset\">\r\n            <summary>\r\n            Reset the cipher. After resetting the cipher is in the same state\r\n            as it was after the last init (if there was one).\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.ICipherParameters\">\r\n            all parameter classes implement this.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IDerivationFunction\">\r\n            base interface for general purpose byte derivation functions.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IDerivationFunction.Digest\">\r\n            return the message digest used as the basis for the function\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IDerivationParameters\">\r\n            Parameters for key/byte stream derivation classes\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IDigest\">\r\n            interface that a message digest conforms to.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IDigest.AlgorithmName\">\r\n             return the algorithm name\r\n            \r\n             @return the algorithm name\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDigest.GetDigestSize\">\r\n             return the size, in bytes, of the digest produced by this message digest.\r\n            \r\n             @return the size, in bytes, of the digest produced by this message digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDigest.GetByteLength\">\r\n             return the size, in bytes, of the internal buffer used by this digest.\r\n            \r\n             @return the size, in bytes, of the internal buffer used by this digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDigest.Update(System.Byte)\">\r\n             update the message digest with a single byte.\r\n            \r\n             @param inByte the input byte to be entered.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDigest.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n             update the message digest with a block of bytes.\r\n            \r\n             @param input the byte array containing the data.\r\n             @param inOff the offset into the byte array where the data starts.\r\n             @param len the length of the data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDigest.DoFinal(System.Byte[],System.Int32)\">\r\n             Close the digest, producing the final digest value. The doFinal\r\n             call leaves the digest reset.\r\n            \r\n             @param output the array the digest is to be copied into.\r\n             @param outOff the offset into the out array the digest is to start at.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDigest.Reset\">\r\n            reset the digest back to it's initial state.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IDsa\">\r\n            interface for classes implementing the Digital Signature Algorithm\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDsa.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the signer for signature generation or signature\r\n             verification.\r\n            \r\n             @param forSigning true if we are generating a signature, false\r\n             otherwise.\r\n             @param param key parameters for signature generation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDsa.GenerateSignature(System.Byte[])\">\r\n             sign the passed in message (usually the output of a hash function).\r\n            \r\n             @param message the message to be signed.\r\n             @return two big integers representing the r and s values respectively.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IDsa.VerifySignature(System.Byte[],Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n             verify the message message against the signature values r and s.\r\n            \r\n             @param message the message that was supposed to have been signed.\r\n             @param r the r signature value.\r\n             @param s the s signature value.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IMac\">\r\n            The base interface for implementations of message authentication codes (MACs).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IMac.Init(Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the MAC.\r\n            \r\n             @param param the key and other data required by the MAC.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IMac.AlgorithmName\">\r\n             Return the name of the algorithm the MAC implements.\r\n            \r\n             @return the name of the algorithm the MAC implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IMac.GetMacSize\">\r\n             Return the block size for this MAC (in bytes).\r\n            \r\n             @return the block size for this MAC in bytes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IMac.Update(System.Byte)\">\r\n             add a single byte to the mac for processing.\r\n            \r\n             @param in the byte to be processed.\r\n             @exception InvalidOperationException if the MAC is not initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IMac.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            @param in the array containing the input.\r\n            @param inOff the index in the array the data begins at.\r\n            @param len the length of the input starting at inOff.\r\n            @exception InvalidOperationException if the MAC is not initialised.\r\n            @exception DataLengthException if there isn't enough data in in.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IMac.DoFinal(System.Byte[],System.Int32)\">\r\n            Compute the final stage of the MAC writing the output to the out\r\n            parameter.\r\n            <p>\r\n            doFinal leaves the MAC in the same state it was after the last init.\r\n            </p>\r\n            @param out the array the MAC is to be output to.\r\n            @param outOff the offset into the out buffer the output is to start at.\r\n            @exception DataLengthException if there isn't enough space in out.\r\n            @exception InvalidOperationException if the MAC is not initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IMac.Reset\">\r\n            Reset the MAC. At the end of resetting the MAC should be in the\r\n            in the same state it was after the last init (if there was one).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.InvalidCipherTextException\">\r\n            this exception is thrown whenever we find something we don't expect in a\r\n            message.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.InvalidCipherTextException.#ctor\">\r\n            base constructor.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.InvalidCipherTextException.#ctor(System.String)\">\r\n             create a InvalidCipherTextException with the given message.\r\n            \r\n             @param message the message to be carried with the exception.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.ISigner.AlgorithmName\">\r\n             Return the name of the algorithm the signer implements.\r\n            \r\n             @return the name of the algorithm the signer implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISigner.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the signer for signing or verification.\r\n            \r\n             @param forSigning true if for signing, false otherwise\r\n             @param param necessary parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISigner.Update(System.Byte)\">\r\n            update the internal digest with the byte b\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            update the internal digest with the byte array in\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISigner.GenerateSignature\">\r\n            Generate a signature for the message we've been loaded with using\r\n            the key we were initialised with.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISigner.VerifySignature(System.Byte[])\">\r\n            return true if the internal state represents the signature described\r\n            in the passed in array.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISigner.Reset\">\r\n            reset the internal state\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.ISignerWithRecovery\">\r\n            Signer with message recovery.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.HasFullMessage\">\r\n             Returns true if the signer has recovered the full message as\r\n             part of signature verification.\r\n            \r\n             @return true if full message recovered.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.GetRecoveredMessage\">\r\n             Returns a reference to what message was recovered (if any).\r\n            \r\n             @return full/partial message, null if nothing.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.UpdateWithRecoveredMessage(System.Byte[])\">\r\n             Perform an update with the recovered message before adding any other data. This must\r\n             be the first update method called, and calling it will result in the signer assuming\r\n             that further calls to update will include message content past what is recoverable.\r\n            \r\n             @param signature the signature that we are in the process of verifying.\r\n             @throws IllegalStateException\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.IStreamCipher\">\r\n            <summary>The interface stream ciphers conform to.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IStreamCipher.AlgorithmName\">\r\n            <summary>The name of the algorithm this cipher implements.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IStreamCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            <summary>Initialise the cipher.</summary>\r\n            <param name=\"forEncryption\">If true the cipher is initialised for encryption,\r\n            if false for decryption.</param>\r\n            <param name=\"parameters\">The key and other data required by the cipher.</param>\r\n            <exception cref=\"T:System.ArgumentException\">\r\n            If the parameters argument is inappropriate.\r\n            </exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IStreamCipher.ReturnByte(System.Byte)\">\r\n            <summary>encrypt/decrypt a single byte returning the result.</summary>\r\n            <param name=\"input\">the byte to be processed.</param>\r\n            <returns>the result of processing the input byte.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IStreamCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Process a block of bytes from <c>input</c> putting the result into <c>output</c>.\r\n            </summary>\r\n            <param name=\"input\">The input byte array.</param>\r\n            <param name=\"inOff\">\r\n            The offset into <c>input</c> where the data to be processed starts.\r\n            </param>\r\n            <param name=\"length\">The number of bytes to be processed.</param>\r\n            <param name=\"output\">The output buffer the processed bytes go into.</param>\r\n            <param name=\"outOff\">\r\n            The offset into <c>output</c> the processed data starts at.\r\n            </param>\r\n            <exception cref=\"T:Org.BouncyCastle.Crypto.DataLengthException\">If the output buffer is too small.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.IStreamCipher.Reset\">\r\n            <summary>\r\n            Reset the cipher to the same state as it was after the last init (if there was one).\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.IWrapper.AlgorithmName\">\r\n            <summary>The name of the algorithm this cipher implements.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.KeyGenerationParameters\">\r\n            The base class for parameters to key generators.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.KeyGenerationParameters.#ctor(Org.BouncyCastle.Security.SecureRandom,System.Int32)\">\r\n             initialise the generator with a source of randomness\r\n             and a strength (in bits).\r\n            \r\n             @param random the random byte source.\r\n             @param strength the size, in bits, of the keys we want to produce.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.KeyGenerationParameters.Random\">\r\n             return the random source associated with this\r\n             generator.\r\n            \r\n             @return the generators random source.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.KeyGenerationParameters.Strength\">\r\n             return the bit strength for keys produced by this generator,\r\n            \r\n             @return the strength of the keys this generator produces (in bits).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.CbcBlockCipherMac\">\r\n            standard CBC Block Cipher MAC - if no padding is specified the default of\r\n            pad of zeroes is used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CbcBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             create a standard MAC based on a CBC block cipher. This will produce an\r\n             authentication code half the length of the block size of the cipher.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CbcBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n             create a standard MAC based on a CBC block cipher. This will produce an\r\n             authentication code half the length of the block size of the cipher.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation.\r\n             @param padding the padding to be used to complete the last block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CbcBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32)\">\r\n            create a standard MAC based on a block cipher with the size of the\r\n            MAC been given in bits. This class uses CBC mode as the basis for the\r\n            MAC generation.\r\n            <p>\r\n            Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n            or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n            and in general should be less than the size of the block cipher as it reduces\r\n            the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            </p>\r\n            @param cipher the cipher to be used as the basis of the MAC generation.\r\n            @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CbcBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n            create a standard MAC based on a block cipher with the size of the\r\n            MAC been given in bits. This class uses CBC mode as the basis for the\r\n            MAC generation.\r\n            <p>\r\n            Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n            or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n            and in general should be less than the size of the block cipher as it reduces\r\n            the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            </p>\r\n            @param cipher the cipher to be used as the basis of the MAC generation.\r\n            @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.\r\n            @param padding the padding to be used to complete the last block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CbcBlockCipherMac.Reset\">\r\n            Reset the mac generator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher\">\r\n            implements a Cipher-FeedBack (CFB) mode on top of a simple cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used as the basis of the\r\n             feedback mode.\r\n             @param blockSize the block size in bits (note: a multiple of 8)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the cipher and, possibly, the initialisation vector (IV).\r\n             If an IV isn't passed as part of the parameter, the IV will be all zeros.\r\n             An IV which is too short is handled in FIPS compliant fashion.\r\n            \r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher.AlgorithmName\">\r\n             return the algorithm name and mode.\r\n            \r\n             @return the name of the underlying algorithm followed by \"/CFB\"\r\n             and the block size in bits.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher.GetBlockSize\">\r\n             return the block size we are operating at.\r\n            \r\n             @return the block size we are operating at (in bytes).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.MacCFBBlockCipher.Reset\">\r\n            reset the chaining vector back to the IV and reset the underlying\r\n            cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CfbBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             create a standard MAC based on a CFB block cipher. This will produce an\r\n             authentication code half the length of the block size of the cipher, with\r\n             the CFB mode set to 8 bits.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CfbBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n             create a standard MAC based on a CFB block cipher. This will produce an\r\n             authentication code half the length of the block size of the cipher, with\r\n             the CFB mode set to 8 bits.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation.\r\n             @param padding the padding to be used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CfbBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32,System.Int32)\">\r\n            create a standard MAC based on a block cipher with the size of the\r\n            MAC been given in bits. This class uses CFB mode as the basis for the\r\n            MAC generation.\r\n            <p>\r\n            Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n            or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n            and in general should be less than the size of the block cipher as it reduces\r\n            the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            </p>\r\n            @param cipher the cipher to be used as the basis of the MAC generation.\r\n            @param cfbBitSize the size of an output block produced by the CFB mode.\r\n            @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CfbBlockCipherMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32,System.Int32,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n            create a standard MAC based on a block cipher with the size of the\r\n            MAC been given in bits. This class uses CFB mode as the basis for the\r\n            MAC generation.\r\n            <p>\r\n            Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n            or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n            and in general should be less than the size of the block cipher as it reduces\r\n            the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            </p>\r\n            @param cipher the cipher to be used as the basis of the MAC generation.\r\n            @param cfbBitSize the size of an output block produced by the CFB mode.\r\n            @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.\r\n            @param padding a padding to be used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CfbBlockCipherMac.Reset\">\r\n            Reset the mac generator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.CMac\">\r\n            CMAC - as specified at www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html\r\n            <p>\r\n            CMAC is analogous to OMAC1 - see also en.wikipedia.org/wiki/CMAC\r\n            </p><p>\r\n            CMAC is a NIST recomendation - see \r\n            csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf\r\n            </p><p>\r\n            CMAC/OMAC1 is a blockcipher-based message authentication code designed and\r\n            analyzed by Tetsu Iwata and Kaoru Kurosawa.\r\n            </p><p>\r\n            CMAC/OMAC1 is a simple variant of the CBC MAC (Cipher Block Chaining Message \r\n            Authentication Code). OMAC stands for One-Key CBC MAC.\r\n            </p><p>\r\n            It supports 128- or 64-bits block ciphers, with any key size, and returns\r\n            a MAC with dimension less or equal to the block size of the underlying \r\n            cipher.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             create a standard MAC based on a CBC block cipher (64 or 128 bit block).\r\n             This will produce an authentication code the length of the block size\r\n             of the cipher.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CMac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32)\">\r\n             create a standard MAC based on a block cipher with the size of the\r\n             MAC been given in bits.\r\n             <p/>\r\n             Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n             or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n             and in general should be less than the size of the block cipher as it reduces\r\n             the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            \r\n             @param cipher        the cipher to be used as the basis of the MAC generation.\r\n             @param macSizeInBits the size of the MAC in bits, must be a multiple of 8 and @lt;= 128.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.CMac.Reset\">\r\n            Reset the mac generator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.Gost28147Mac\">\r\n            implementation of GOST 28147-89 MAC\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.HMac\">\r\n             HMAC implementation based on RFC2104\r\n            \r\n             H(K XOR opad, H(K XOR ipad, text))\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.HMac.Reset\">\r\n            Reset the mac generator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.ISO9797Alg3Mac\">\r\n             DES based CBC Block Cipher MAC according to ISO9797, algorithm 3 (ANSI X9.19 Retail MAC)\r\n            \r\n             This could as well be derived from CBCBlockCipherMac, but then the property mac in the base\r\n             class must be changed to protected\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.ISO9797Alg3Mac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             create a Retail-MAC based on a CBC block cipher. This will produce an\r\n             authentication code of the length of the block size of the cipher.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation. This must\r\n             be DESEngine.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.ISO9797Alg3Mac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n             create a Retail-MAC based on a CBC block cipher. This will produce an\r\n             authentication code of the length of the block size of the cipher.\r\n            \r\n             @param cipher the cipher to be used as the basis of the MAC generation.\r\n             @param padding the padding to be used to complete the last block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.ISO9797Alg3Mac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32)\">\r\n            create a Retail-MAC based on a block cipher with the size of the\r\n            MAC been given in bits. This class uses single DES CBC mode as the basis for the\r\n            MAC generation.\r\n            <p>\r\n            Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n            or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n            and in general should be less than the size of the block cipher as it reduces\r\n            the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            </p>\r\n            @param cipher the cipher to be used as the basis of the MAC generation.\r\n            @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.ISO9797Alg3Mac.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n            create a standard MAC based on a block cipher with the size of the\r\n            MAC been given in bits. This class uses single DES CBC mode as the basis for the\r\n            MAC generation. The final block is decrypted and then encrypted using the\r\n            middle and right part of the key.\r\n            <p>\r\n            Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),\r\n            or 16 bits if being used as a data authenticator (FIPS Publication 113),\r\n            and in general should be less than the size of the block cipher as it reduces\r\n            the chance of an exhaustive attack (see Handbook of Applied Cryptography).\r\n            </p>\r\n            @param cipher the cipher to be used as the basis of the MAC generation.\r\n            @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.\r\n            @param padding the padding to be used to complete the last block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.ISO9797Alg3Mac.Reset\">\r\n            Reset the mac generator.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Macs.SipHash\">\r\n            <summary>\r\n            Implementation of SipHash as specified in \"SipHash: a fast short-input PRF\", by Jean-Philippe\r\n            Aumasson and Daniel J. Bernstein (https://131002.net/siphash/siphash.pdf).\r\n            </summary>\r\n            <remarks>\r\n            \"SipHash is a family of PRFs SipHash-c-d where the integer parameters c and d are the number of\r\n            compression rounds and the number of finalization rounds. A compression round is identical to a\r\n            finalization round and this round function is called SipRound. Given a 128-bit key k and a\r\n            (possibly empty) byte string m, SipHash-c-d returns a 64-bit value...\"\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.SipHash.#ctor\">\r\n            <summary>SipHash-2-4</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Macs.SipHash.#ctor(System.Int32,System.Int32)\">\r\n            <summary>SipHash-c-d</summary>\r\n            <param name=\"c\">the number of compression rounds</param>\r\n            <param name=\"d\">the number of finalization rounds</param>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.MaxBytesExceededException\">\r\n            <summary>\r\n            This exception is thrown whenever a cipher requires a change of key, iv\r\n            or similar after x amount of bytes enciphered\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher\">\r\n            implements Cipher-Block-Chaining (CBC) mode on top of a simple cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used as the basis of chaining.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the cipher and, possibly, the initialisation vector (IV).\r\n             If an IV isn't passed as part of the parameter, the IV will be all zeros.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.AlgorithmName\">\r\n             return the algorithm name and mode.\r\n            \r\n             @return the name of the underlying algorithm followed by \"/CBC\".\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.GetBlockSize\">\r\n             return the block size of the underlying cipher.\r\n            \r\n             @return the block size of the underlying cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.Reset\">\r\n            reset the chaining vector back to the IV and reset the underlying\r\n            cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Do the appropriate chaining step for CBC mode encryption.\r\n            \r\n             @param in the array containing the data to be encrypted.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the encrypted data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CbcBlockCipher.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Do the appropriate chaining step for CBC mode decryption.\r\n            \r\n             @param in the array containing the data to be decrypted.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the decrypted data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.CcmBlockCipher\">\r\n            Implements the Counter with Cipher Block Chaining mode (CCM) detailed in\r\n            NIST Special Publication 800-38C.\r\n            <p>\r\n            <b>Note</b>: this mode is a packet mode - it needs all the data up front.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CcmBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CcmBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CcmBlockCipher.GetMac\">\r\n             Returns a byte array containing the mac calculated as part of the\r\n             last encrypt or decrypt operation.\r\n            \r\n             @return the last mac calculated.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher\">\r\n            implements a Cipher-FeedBack (CFB) mode on top of a simple cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used as the basis of the\r\n             feedback mode.\r\n             @param blockSize the block size in bits (note: a multiple of 8)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the cipher and, possibly, the initialisation vector (IV).\r\n             If an IV isn't passed as part of the parameter, the IV will be all zeros.\r\n             An IV which is too short is handled in FIPS compliant fashion.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.AlgorithmName\">\r\n             return the algorithm name and mode.\r\n            \r\n             @return the name of the underlying algorithm followed by \"/CFB\"\r\n             and the block size in bits.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.GetBlockSize\">\r\n             return the block size we are operating at.\r\n            \r\n             @return the block size we are operating at (in bytes).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Do the appropriate processing for CFB mode encryption.\r\n            \r\n             @param in the array containing the data to be encrypted.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the encrypted data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Do the appropriate processing for CFB mode decryption.\r\n            \r\n             @param in the array containing the data to be decrypted.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the encrypted data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CfbBlockCipher.Reset\">\r\n            reset the chaining vector back to the IV and reset the underlying\r\n            cipher.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher\">\r\n            A Cipher Text Stealing (CTS) mode cipher. CTS allows block ciphers to\r\n            be used to produce cipher text which is the same outLength as the plain text.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Create a buffered block cipher that uses Cipher Text Stealing\r\n            \r\n             @param cipher the underlying block cipher this buffering object wraps.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher.GetUpdateOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update of 'length' bytes.\r\n            \r\n             @param length the outLength of the input.\r\n             @return the space required to accommodate a call to update\r\n             with length bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher.GetOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update plus a\r\n             doFinal with an input of length bytes.\r\n            \r\n             @param length the outLength of the input.\r\n             @return the space required to accommodate a call to update and doFinal\r\n             with length bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n             process a single byte, producing an output block if neccessary.\r\n            \r\n             @param in the input byte.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n             process an array of bytes, producing output if necessary.\r\n            \r\n             @param in the input byte array.\r\n             @param inOff the offset at which the input data starts.\r\n             @param length the number of bytes to be copied out of the input array.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.CtsBlockCipher.DoFinal(System.Byte[],System.Int32)\">\r\n             Process the last block in the buffer.\r\n            \r\n             @param out the array the block currently being held is copied into.\r\n             @param outOff the offset at which the copying starts.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there is insufficient space in out for\r\n             the output.\r\n             @exception InvalidOperationException if the underlying cipher is not\r\n             initialised.\r\n             @exception InvalidCipherTextException if cipher text decrypts wrongly (in\r\n             case the exception will never Get thrown).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.EaxBlockCipher\">\r\n            A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and \r\n            Efficiency - by M. Bellare, P. Rogaway, D. Wagner.\r\n            \r\n            http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf\r\n            \r\n            EAX is an AEAD scheme based on CTR and OMAC1/CMAC, that uses a single block \r\n            cipher to encrypt and authenticate data. It's on-line (the length of a \r\n            message isn't needed to begin processing it), has good performances, it's\r\n            simple and provably secure (provided the underlying block cipher is secure).\r\n            \r\n            Of course, this implementations is NOT thread-safe.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.EaxBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Constructor that accepts an instance of a block cipher engine.\r\n            \r\n             @param cipher the engine to use\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.GcmBlockCipher\">\r\n            <summary>\r\n            Implements the Galois/Counter mode (GCM) detailed in\r\n            NIST Special Publication 800-38D.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher\">\r\n            implements the GOST 28147 OFB counter mode (GCTR).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used as the basis of the\r\n             counter mode (must have a 64 bit block size).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the cipher and, possibly, the initialisation vector (IV).\r\n             If an IV isn't passed as part of the parameter, the IV will be all zeros.\r\n             An IV which is too short is handled in FIPS compliant fashion.\r\n            \r\n             @param encrypting if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param parameters the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is inappropriate.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.AlgorithmName\">\r\n             return the algorithm name and mode.\r\n            \r\n             @return the name of the underlying algorithm followed by \"/GCTR\"\r\n             and the block size in bits\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.GetBlockSize\">\r\n             return the block size we are operating at (in bytes).\r\n            \r\n             @return the block size we are operating at (in bytes).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.GOfbBlockCipher.Reset\">\r\n            reset the feedback vector back to the IV and reset the underlying\r\n            cipher.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher\">\r\n            <summary>\r\n            A block cipher mode that includes authenticated encryption with a streaming mode\r\n            and optional associated data.</summary>\r\n            <see cref=\"T:Org.BouncyCastle.Crypto.Parameters.AeadParameters\"/>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.AlgorithmName\">\r\n            <summary>The name of the algorithm this cipher implements.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            <summary>Initialise the cipher.</summary>\r\n            <remarks>Parameter can either be an AeadParameters or a ParametersWithIV object.</remarks>\r\n            <param name=\"forEncryption\">Initialise for encryption if true, for decryption if false.</param>\r\n            <param name=\"parameters\">The key or other data required by the cipher.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.GetBlockSize\">\r\n            <returns>The block size for this cipher, in bytes.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.ProcessAadByte(System.Byte)\">\r\n            <summary>Add a single byte to the associated data check.</summary>\r\n            <remarks>If the implementation supports it, this will be an online operation and will not retain the associated data.</remarks>\r\n            <param name=\"input\">The byte to be processed.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.ProcessAadBytes(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary>Add a sequence of bytes to the associated data check.</summary>\r\n            <remarks>If the implementation supports it, this will be an online operation and will not retain the associated data.</remarks>\r\n            <param name=\"inBytes\">The input byte array.</param>\r\n            <param name=\"inOff\">The offset into the input array where the data to be processed starts.</param>\r\n            <param name=\"len\">The number of bytes to be processed.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n             Encrypt/decrypt a single byte.\r\n            \r\n             @param input the byte to be processed.\r\n             @param outBytes the output buffer the processed byte goes into.\r\n             @param outOff the offset into the output byte array the processed data starts at.\r\n             @return the number of bytes written to out.\r\n             @exception DataLengthException if the output buffer is too small.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n             Process a block of bytes from in putting the result into out.\r\n            \r\n             @param inBytes the input byte array.\r\n             @param inOff the offset into the in array where the data to be processed starts.\r\n             @param len the number of bytes to be processed.\r\n             @param outBytes the output buffer the processed bytes go into.\r\n             @param outOff the offset into the output byte array the processed data starts at.\r\n             @return the number of bytes written to out.\r\n             @exception DataLengthException if the output buffer is too small.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.DoFinal(System.Byte[],System.Int32)\">\r\n             Finish the operation either appending or verifying the MAC at the end of the data.\r\n            \r\n             @param outBytes space for any resulting output data.\r\n             @param outOff offset into out to start copying the data at.\r\n             @return number of bytes written into out.\r\n             @throws InvalidOperationException if the cipher is in an inappropriate state.\r\n             @throws InvalidCipherTextException if the MAC fails to match.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.GetMac\">\r\n             Return the value of the MAC associated with the last stream processed.\r\n            \r\n             @return MAC for plaintext data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.GetUpdateOutputSize(System.Int32)\">\r\n             Return the size of the output buffer required for a ProcessBytes\r\n             an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to ProcessBytes\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.GetOutputSize(System.Int32)\">\r\n             Return the size of the output buffer required for a ProcessBytes plus a\r\n             DoFinal with an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to ProcessBytes and DoFinal\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.IAeadBlockCipher.Reset\">\r\n            <summary>\r\n            Reset the cipher to the same state as it was after the last init (if there was one).\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.OcbBlockCipher\">\r\n            An implementation of the \"work in progress\" Internet-Draft <a\r\n            href=\"http://tools.ietf.org/html/draft-irtf-cfrg-ocb-03\">The OCB Authenticated-Encryption\r\n            Algorithm</a>, licensed per:\r\n            \r\n            <blockquote><p><a href=\"http://www.cs.ucdavis.edu/~rogaway/ocb/license1.pdf\">License for\r\n            Open-Source Software Implementations of OCB</a> (Jan 9, 2013) - 'License 1'<br/>\r\n            Under this license, you are authorized to make, use, and distribute open-source software\r\n            implementations of OCB. This license terminates for you if you sue someone over their open-source\r\n            software implementation of OCB claiming that you have a patent covering their implementation.\r\n            </p><p>\r\n            This is a non-binding summary of a legal document (the link above). The parameters of the license\r\n            are specified in the license document and that document is controlling.</p></blockquote>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher\">\r\n            implements a Output-FeedBack (OFB) mode on top of a simple cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,System.Int32)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used as the basis of the\r\n             feedback mode.\r\n             @param blockSize the block size in bits (note: a multiple of 8)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the cipher and, possibly, the initialisation vector (IV).\r\n             If an IV isn't passed as part of the parameter, the IV will be all zeros.\r\n             An IV which is too short is handled in FIPS compliant fashion.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.AlgorithmName\">\r\n             return the algorithm name and mode.\r\n            \r\n             @return the name of the underlying algorithm followed by \"/OFB\"\r\n             and the block size in bits\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.GetBlockSize\">\r\n             return the block size we are operating at (in bytes).\r\n            \r\n             @return the block size we are operating at (in bytes).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OfbBlockCipher.Reset\">\r\n            reset the feedback vector back to the IV and reset the underlying\r\n            cipher.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher\">\r\n                * Implements OpenPGP's rather strange version of Cipher-FeedBack (CFB) mode\r\n                * on top of a simple cipher. This class assumes the IV has been prepended\r\n                * to the data stream already, and just accomodates the reset after\r\n                * (blockSize + 2) bytes have been read.\r\n                * <p>\r\n                * For further info see <a href=\"http://www.ietf.org/rfc/rfc2440.html\">RFC 2440</a>.\r\n            \t* </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Basic constructor.\r\n            \r\n             @param cipher the block cipher to be used as the basis of the\r\n             feedback mode.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.AlgorithmName\">\r\n             return the algorithm name and mode.\r\n            \r\n             @return the name of the underlying algorithm followed by \"/PGPCFB\"\r\n             and the block size in bits.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.GetBlockSize\">\r\n             return the block size we are operating at.\r\n            \r\n             @return the block size we are operating at (in bytes).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.ProcessBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Process one block of input from the array in and write it to\r\n             the out array.\r\n            \r\n             @param in the array containing the input data.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the output data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.Reset\">\r\n            reset the chaining vector back to the IV and reset the underlying\r\n            cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the cipher and, possibly, the initialisation vector (IV).\r\n             If an IV isn't passed as part of the parameter, the IV will be all zeros.\r\n             An IV which is too short is handled in FIPS compliant fashion.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param parameters the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.EncryptByte(System.Byte,System.Int32)\">\r\n            Encrypt one byte of data according to CFB mode.\r\n            @param data the byte to encrypt\r\n            @param blockOff offset in the current block\r\n            @returns the encrypted byte\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.EncryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Do the appropriate processing for CFB IV mode encryption.\r\n            \r\n             @param in the array containing the data to be encrypted.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the encrypted data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.OpenPgpCfbBlockCipher.DecryptBlock(System.Byte[],System.Int32,System.Byte[],System.Int32)\">\r\n             Do the appropriate processing for CFB IV mode decryption.\r\n            \r\n             @param in the array containing the data to be decrypted.\r\n             @param inOff offset into the in array the data starts at.\r\n             @param out the array the encrypted data will be copied into.\r\n             @param outOff the offset into the out array the output will start at.\r\n             @exception DataLengthException if there isn't enough data in in, or\r\n             space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n             @return the number of bytes processed and produced.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Modes.SicBlockCipher\">\r\n            Implements the Segmented Integer Counter (SIC) mode on top of a simple\r\n            block cipher.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.SicBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Basic constructor.\r\n            \r\n             @param c the block cipher to be used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Modes.SicBlockCipher.GetUnderlyingCipher\">\r\n             return the underlying block cipher that we are wrapping.\r\n            \r\n             @return the underlying block cipher that we are wrapping.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding\">\r\n            Block cipher padders are expected to conform to this interface\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n             Initialise the padder.\r\n            \r\n             @param param parameters, if any required.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding.PaddingName\">\r\n             Return the name of the algorithm the cipher implements.\r\n            \r\n             @return the name of the algorithm the cipher implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding.AddPadding(System.Byte[],System.Int32)\">\r\n            add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding.PadCount(System.Byte[])\">\r\n            return the number of pad bytes present in the block.\r\n            @exception InvalidCipherTextException if the padding is badly formed\r\n            or invalid.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.ISO10126d2Padding\">\r\n            A padder that adds ISO10126-2 padding to a block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ISO10126d2Padding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n             Initialise the padder.\r\n            \r\n             @param random a SecureRandom if available.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.ISO10126d2Padding.PaddingName\">\r\n             Return the name of the algorithm the cipher implements.\r\n            \r\n             @return the name of the algorithm the cipher implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ISO10126d2Padding.AddPadding(System.Byte[],System.Int32)\">\r\n            add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ISO10126d2Padding.PadCount(System.Byte[])\">\r\n            return the number of pad bytes present in the block.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.ISO7816d4Padding\">\r\n            A padder that adds the padding according to the scheme referenced in\r\n            ISO 7814-4 - scheme 2 from ISO 9797-1. The first byte is 0x80, rest is 0x00\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ISO7816d4Padding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n             Initialise the padder.\r\n            \r\n             @param random - a SecureRandom if available.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.ISO7816d4Padding.PaddingName\">\r\n             Return the name of the algorithm the padder implements.\r\n            \r\n             @return the name of the algorithm the padder implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ISO7816d4Padding.AddPadding(System.Byte[],System.Int32)\">\r\n            add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ISO7816d4Padding.PadCount(System.Byte[])\">\r\n            return the number of pad bytes present in the block.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher\">\r\n            A wrapper class that allows block ciphers to be used to process data in\r\n            a piecemeal fashion with padding. The PaddedBufferedBlockCipher\r\n            outputs a block only when the buffer is full and more data is being added,\r\n            or on a doFinal (unless the current block in the buffer is a pad block).\r\n            The default padding mechanism used is the one outlined in Pkcs5/Pkcs7.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher,Org.BouncyCastle.Crypto.Paddings.IBlockCipherPadding)\">\r\n             Create a buffered block cipher with the desired padding.\r\n            \r\n             @param cipher the underlying block cipher this buffering object wraps.\r\n             @param padding the padding type.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             Create a buffered block cipher Pkcs7 padding\r\n            \r\n             @param cipher the underlying block cipher this buffering object wraps.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the cipher.\r\n            \r\n             @param forEncryption if true the cipher is initialised for\r\n              encryption, if false for decryption.\r\n             @param param the key and other data required by the cipher.\r\n             @exception ArgumentException if the parameters argument is\r\n             inappropriate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.GetOutputSize(System.Int32)\">\r\n             return the minimum size of the output buffer required for an update\r\n             plus a doFinal with an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to update and doFinal\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.GetUpdateOutputSize(System.Int32)\">\r\n             return the size of the output buffer required for an update\r\n             an input of len bytes.\r\n            \r\n             @param len the length of the input.\r\n             @return the space required to accommodate a call to update\r\n             with len bytes of input.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n             process a single byte, producing an output block if neccessary.\r\n            \r\n             @param in the input byte.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n             process an array of bytes, producing output if necessary.\r\n            \r\n             @param in the input byte array.\r\n             @param inOff the offset at which the input data starts.\r\n             @param len the number of bytes to be copied out of the input array.\r\n             @param out the space for any output that might be produced.\r\n             @param outOff the offset from which the output will be copied.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there isn't enough space in out.\r\n             @exception InvalidOperationException if the cipher isn't initialised.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.PaddedBufferedBlockCipher.DoFinal(System.Byte[],System.Int32)\">\r\n             Process the last block in the buffer. If the buffer is currently\r\n             full and padding needs to be added a call to doFinal will produce\r\n             2 * GetBlockSize() bytes.\r\n            \r\n             @param out the array the block currently being held is copied into.\r\n             @param outOff the offset at which the copying starts.\r\n             @return the number of output bytes copied to out.\r\n             @exception DataLengthException if there is insufficient space in out for\r\n             the output or we are decrypting and the input is not block size aligned.\r\n             @exception InvalidOperationException if the underlying cipher is not\r\n             initialised.\r\n             @exception InvalidCipherTextException if padding is expected and not found.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.Pkcs7Padding\">\r\n            A padder that adds Pkcs7/Pkcs5 padding to a block.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.Pkcs7Padding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n             Initialise the padder.\r\n            \r\n             @param random - a SecureRandom if available.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.Pkcs7Padding.PaddingName\">\r\n             Return the name of the algorithm the cipher implements.\r\n            \r\n             @return the name of the algorithm the cipher implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.Pkcs7Padding.AddPadding(System.Byte[],System.Int32)\">\r\n            add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.Pkcs7Padding.PadCount(System.Byte[])\">\r\n            return the number of pad bytes present in the block.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.TbcPadding\">\r\n            <summary> A padder that adds Trailing-Bit-Compliment padding to a block.\r\n            <p>\r\n            This padding pads the block out compliment of the last bit\r\n            of the plain text.\r\n            </p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.TbcPadding.PaddingName\">\r\n            <summary> Return the name of the algorithm the cipher implements.</summary>\r\n            <returns> the name of the algorithm the cipher implements.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.TbcPadding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary> Initialise the padder.</summary>\r\n            <param name=\"random\">- a SecureRandom if available.\r\n            </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.TbcPadding.AddPadding(System.Byte[],System.Int32)\">\r\n            <summary> add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n            <p>\r\n            Note: this assumes that the last block of plain text is always\r\n            passed to it inside in. i.e. if inOff is zero, indicating the\r\n            entire block is to be overwritten with padding the value of in\r\n            should be the same as the last block of plain text.\r\n            </p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.TbcPadding.PadCount(System.Byte[])\">\r\n            <summary> return the number of pad bytes present in the block.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.X923Padding\">\r\n            A padder that adds X9.23 padding to a block - if a SecureRandom is\r\n            passed in random padding is assumed, otherwise padding with zeros is used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.X923Padding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n             Initialise the padder.\r\n            \r\n             @param random a SecureRandom if one is available.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.X923Padding.PaddingName\">\r\n             Return the name of the algorithm the cipher implements.\r\n            \r\n             @return the name of the algorithm the cipher implements.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.X923Padding.AddPadding(System.Byte[],System.Int32)\">\r\n            add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.X923Padding.PadCount(System.Byte[])\">\r\n            return the number of pad bytes present in the block.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Paddings.ZeroBytePadding\">\r\n            <summary> A padder that adds Null byte padding to a block.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Paddings.ZeroBytePadding.PaddingName\">\r\n             <summary> Return the name of the algorithm the cipher implements.\r\n            \r\n             </summary>\r\n             <returns> the name of the algorithm the cipher implements.\r\n             </returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ZeroBytePadding.Init(Org.BouncyCastle.Security.SecureRandom)\">\r\n             <summary> Initialise the padder.\r\n            \r\n             </summary>\r\n             <param name=\"random\">- a SecureRandom if available.\r\n             </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ZeroBytePadding.AddPadding(System.Byte[],System.Int32)\">\r\n            <summary> add the pad bytes to the passed in block, returning the\r\n            number of bytes added.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Paddings.ZeroBytePadding.PadCount(System.Byte[])\">\r\n            <summary> return the number of pad bytes present in the block.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.AeadParameters.#ctor(Org.BouncyCastle.Crypto.Parameters.KeyParameter,System.Int32,System.Byte[])\">\r\n             Base constructor.\r\n            \r\n             @param key key to be used by underlying cipher\r\n             @param macSize macSize in bits\r\n             @param nonce nonce to be used\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.AeadParameters.#ctor(Org.BouncyCastle.Crypto.Parameters.KeyParameter,System.Int32,System.Byte[],System.Byte[])\">\r\n             Base constructor.\r\n            \r\n             @param key key to be used by underlying cipher\r\n             @param macSize macSize in bits\r\n             @param nonce nonce to be used\r\n             @param associatedText associated text, if any\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.CcmParameters.#ctor(Org.BouncyCastle.Crypto.Parameters.KeyParameter,System.Int32,System.Byte[],System.Byte[])\">\r\n            Base constructor.\r\n            \r\n            @param key key to be used by underlying cipher\r\n            @param macSize macSize in bits\r\n            @param nonce nonce to be used\r\n            @param associatedText associated text, if any\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.DesEdeParameters.IsWeakKey(System.Byte[],System.Int32,System.Int32)\">\r\n             return true if the passed in key is a DES-EDE weak key.\r\n            \r\n             @param key bytes making up the key\r\n             @param offset offset into the byte array the key starts at\r\n             @param length number of bytes making up the key\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.DesEdeParameters.IsWeakKey(System.Byte[],System.Int32)\">\r\n             return true if the passed in key is a DES-EDE weak key.\r\n            \r\n             @param key bytes making up the key\r\n             @param offset offset into the byte array the key starts at\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.DesParameters.IsWeakKey(System.Byte[],System.Int32)\">\r\n            DES has 16 weak keys.  This method will check\r\n            if the given DES key material is weak or semi-weak.\r\n            Key material that is too short is regarded as weak.\r\n            <p>\r\n            See <a href=\"http://www.counterpane.com/applied.html\">\"Applied\r\n            Cryptography\"</a> by Bruce Schneier for more information.\r\n            </p>\r\n            @return true if the given DES key material is weak or semi-weak,\r\n                false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.DesParameters.SetOddParity(System.Byte[])\">\r\n             DES Keys use the LSB as the odd parity bit.  This can\r\n             be used to check for corrupt keys.\r\n            \r\n             @param bytes the byte array to set the parity on.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.DHParameters.M\">\r\n            <summary>The minimum bitlength of the private value.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.DHParameters.L\">\r\n            <summary>The bitlength of the private value.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.DsaParameterGenerationParameters.#ctor(System.Int32,System.Int32,System.Int32,Org.BouncyCastle.Security.SecureRandom)\">\r\n             Construct without a usage index, this will do a random construction of G.\r\n            \r\n             @param L desired length of prime P in bits (the effective key size).\r\n             @param N desired length of prime Q in bits.\r\n             @param certainty certainty level for prime number generation.\r\n             @param random the source of randomness to use.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.DsaParameterGenerationParameters.#ctor(System.Int32,System.Int32,System.Int32,Org.BouncyCastle.Security.SecureRandom,System.Int32)\">\r\n             Construct for a specific usage index - this has the effect of using verifiable canonical generation of G.\r\n            \r\n             @param L desired length of prime P in bits (the effective key size).\r\n             @param N desired length of prime Q in bits.\r\n             @param certainty certainty level for prime number generation.\r\n             @param random the source of randomness to use.\r\n             @param usageIndex a valid usage index.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.ElGamalParameters.G\">\r\n            return the generator - g\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.ElGamalParameters.L\">\r\n            return private value limit - l\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.IesParameters\">\r\n            parameters for using an integrated cipher in stream mode.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.IesParameters.#ctor(System.Byte[],System.Byte[],System.Int32)\">\r\n            @param derivation the derivation parameter for the KDF function.\r\n            @param encoding the encoding parameter for the KDF function.\r\n            @param macKeySize the size of the MAC key (in bits).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.IesWithCipherParameters.#ctor(System.Byte[],System.Byte[],System.Int32,System.Int32)\">\r\n            @param derivation the derivation parameter for the KDF function.\r\n            @param encoding the encoding parameter for the KDF function.\r\n            @param macKeySize the size of the MAC key (in bits).\r\n            @param cipherKeySize the size of the associated Cipher key (in bits).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.Iso18033KdfParameters\">\r\n            parameters for Key derivation functions for ISO-18033\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.KdfParameters\">\r\n            parameters for Key derivation functions for IEEE P1363a\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.MgfParameters\">\r\n            <remarks>Parameters for mask derivation functions.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyGenerationParameters\">\r\n             Parameters for NaccacheStern public private key generation. For details on\r\n             this cipher, please see\r\n            \r\n             http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyGenerationParameters.#ctor(Org.BouncyCastle.Security.SecureRandom,System.Int32,System.Int32,System.Int32)\">\r\n             Parameters for generating a NaccacheStern KeyPair.\r\n            \r\n             @param random\r\n                        The source of randomness\r\n             @param strength\r\n                        The desired strength of the Key in Bits\r\n             @param certainty\r\n                        the probability that the generated primes are not really prime\r\n                        as integer: 2^(-certainty) is then the probability\r\n             @param countSmallPrimes\r\n                        How many small key factors are desired\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyGenerationParameters.#ctor(Org.BouncyCastle.Security.SecureRandom,System.Int32,System.Int32,System.Int32,System.Boolean)\">\r\n             Parameters for a NaccacheStern KeyPair.\r\n            \r\n             @param random\r\n                        The source of randomness\r\n             @param strength\r\n                        The desired strength of the Key in Bits\r\n             @param certainty\r\n                        the probability that the generated primes are not really prime\r\n                        as integer: 2^(-certainty) is then the probability\r\n             @param cntSmallPrimes\r\n                        How many small key factors are desired\r\n             @param debug\r\n                        Turn debugging on or off (reveals secret information, use with\r\n                        caution)\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyGenerationParameters.Certainty\">\r\n            @return Returns the certainty.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyGenerationParameters.CountSmallPrimes\">\r\n            @return Returns the countSmallPrimes.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyParameters\">\r\n             Public key parameters for NaccacheStern cipher. For details on this cipher,\r\n             please see\r\n            \r\n             http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyParameters.#ctor(System.Boolean,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,System.Int32)\">\r\n            @param privateKey\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyParameters.G\">\r\n            @return Returns the g.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyParameters.LowerSigmaBound\">\r\n            @return Returns the lowerSigmaBound.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Parameters.NaccacheSternKeyParameters.Modulus\">\r\n            @return Returns the n.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.NaccacheSternPrivateKeyParameters\">\r\n             Private key parameters for NaccacheStern cipher. For details on this cipher,\r\n             please see\r\n            \r\n             http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Parameters.NaccacheSternPrivateKeyParameters.#ctor(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,System.Int32,System.Collections.IList,Org.BouncyCastle.Math.BigInteger)\">\r\n             Constructs a NaccacheSternPrivateKey\r\n            \r\n             @param g\r\n                        the public enryption parameter g\r\n             @param n\r\n                        the public modulus n = p*q\r\n             @param lowerSigmaBound\r\n                        the public lower sigma bound up to which data can be encrypted\r\n             @param smallPrimes\r\n                        the small primes, of which sigma is constructed in the right\r\n                        order\r\n             @param phi_n\r\n                        the private modulus phi(n) = (p-1)(q-1)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Parameters.ParametersWithSalt\">\r\n            <summary> Cipher parameters with a fixed salt value associated with them.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.PbeParametersGenerator\">\r\n            super class for all Password Based Encyrption (Pbe) parameter generator classes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.#ctor\">\r\n            base constructor.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.Init(System.Byte[],System.Byte[],System.Int32)\">\r\n             initialise the Pbe generator.\r\n            \r\n             @param password the password converted into bytes (see below).\r\n             @param salt the salt to be mixed with the password.\r\n             @param iterationCount the number of iterations the \"mixing\" function\r\n             is to be applied for.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.GetPassword\">\r\n             return the password byte array.\r\n            \r\n             @return the password byte array.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.GetSalt\">\r\n             return the salt byte array.\r\n            \r\n             @return the salt byte array.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.PbeParametersGenerator.IterationCount\">\r\n             return the iteration count.\r\n            \r\n             @return the iteration count.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.GenerateDerivedParameters(System.Int32)\">\r\n             Generate derived parameters for a key of length keySize.\r\n            \r\n             @param keySize the length, in bits, of the key required.\r\n             @return a parameters object representing a key.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.GenerateDerivedParameters(System.Int32,System.Int32)\">\r\n             Generate derived parameters for a key of length keySize, and\r\n             an initialisation vector (IV) of length ivSize.\r\n            \r\n             @param keySize the length, in bits, of the key required.\r\n             @param ivSize the length, in bits, of the iv required.\r\n             @return a parameters object representing a key and an IV.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.GenerateDerivedMacParameters(System.Int32)\">\r\n             Generate derived parameters for a key of length keySize, specifically\r\n             for use with a MAC.\r\n            \r\n             @param keySize the length, in bits, of the key required.\r\n             @return a parameters object representing a key.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.Pkcs5PasswordToBytes(System.Char[])\">\r\n             converts a password to a byte array according to the scheme in\r\n             Pkcs5 (ascii, no padding)\r\n            \r\n             @param password a character array representing the password.\r\n             @return a byte array representing the password.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.Pkcs5PasswordToUtf8Bytes(System.Char[])\">\r\n             converts a password to a byte array according to the scheme in\r\n             PKCS5 (UTF-8, no padding)\r\n            \r\n             @param password a character array representing the password.\r\n             @return a byte array representing the password.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.PbeParametersGenerator.Pkcs12PasswordToBytes(System.Char[])\">\r\n             converts a password to a byte array according to the scheme in\r\n             Pkcs12 (unicode, big endian, 2 zero pad bytes at the end).\r\n            \r\n             @param password a character array representing the password.\r\n             @return a byte array representing the password.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Prng.CryptoApiRandomGenerator\">\r\n            <summary>\r\n            Uses Microsoft's RNGCryptoServiceProvider\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Prng.DigestRandomGenerator\">\r\n            Random generation based on the digest with counter. Calling AddSeedMaterial will\r\n            always increase the entropy of the hash.\r\n            <p>\r\n            Internal access to the digest is synchronized so a single one of these can be shared.\r\n            </p>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Prng.IRandomGenerator\">\r\n            <remarks>Generic interface for objects generating random bytes.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.IRandomGenerator.AddSeedMaterial(System.Byte[])\">\r\n            <summary>Add more seed material to the generator.</summary>\r\n            <param name=\"seed\">A byte array to be mixed into the generator's state.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.IRandomGenerator.AddSeedMaterial(System.Int64)\">\r\n            <summary>Add more seed material to the generator.</summary>\r\n            <param name=\"seed\">A long value to be mixed into the generator's state.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.IRandomGenerator.NextBytes(System.Byte[])\">\r\n            <summary>Fill byte array with random values.</summary>\r\n            <param name=\"bytes\">Array to be filled.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.IRandomGenerator.NextBytes(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary>Fill byte array with random values.</summary>\r\n            <param name=\"bytes\">Array to receive bytes.</param>\r\n            <param name=\"start\">Index to start filling at.</param>\r\n            <param name=\"len\">Length of segment to fill.</param>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Prng.ReversedWindowGenerator\">\r\n            <remarks>\r\n            Takes bytes generated by an underling RandomGenerator and reverses the order in\r\n            each small window (of configurable size).\r\n            <p>\r\n            Access to internals is synchronized so a single one of these can be shared.\r\n            </p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.ReversedWindowGenerator.AddSeedMaterial(System.Byte[])\">\r\n            <summary>Add more seed material to the generator.</summary>\r\n            <param name=\"seed\">A byte array to be mixed into the generator's state.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.ReversedWindowGenerator.AddSeedMaterial(System.Int64)\">\r\n            <summary>Add more seed material to the generator.</summary>\r\n            <param name=\"seed\">A long value to be mixed into the generator's state.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.ReversedWindowGenerator.NextBytes(System.Byte[])\">\r\n            <summary>Fill byte array with random values.</summary>\r\n            <param name=\"bytes\">Array to be filled.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.ReversedWindowGenerator.NextBytes(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary>Fill byte array with random values.</summary>\r\n            <param name=\"bytes\">Array to receive bytes.</param>\r\n            <param name=\"start\">Index to start filling at.</param>\r\n            <param name=\"len\">Length of segment to fill.</param>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Prng.ThreadedSeedGenerator\">\r\n            A thread based seed generator - one source of randomness.\r\n            <p>\r\n            Based on an idea from Marcus Lippert.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Prng.ThreadedSeedGenerator.GenerateSeed(System.Int32,System.Boolean)\">\r\n            Generate seed bytes. Set fast to false for best quality.\r\n            <p>\r\n            If fast is set to true, the code should be round about 8 times faster when\r\n            generating a long sequence of random bytes. 20 bytes of random values using\r\n            the fast mode take less than half a second on a Nokia e70. If fast is set to false,\r\n            it takes round about 2500 ms.\r\n            </p>\r\n            @param numBytes the number of bytes to generate\r\n            @param fast true if fast mode should be used\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Prng.VmpcRandomGenerator.P\">\r\n            <remarks>\r\n            Permutation generated by code:\r\n            <code>\r\n            // First 1850 fractional digit of Pi number. \r\n            byte[] key = new BigInteger(\"14159265358979323846...5068006422512520511\").ToByteArray();\r\n            s = 0;\r\n            P = new byte[256];\r\n            for (int i = 0; i &lt; 256; i++) \r\n            {\r\n                P[i] = (byte) i;\r\n            }\r\n            for (int m = 0; m &lt; 768; m++) \r\n            {\r\n                s = P[(s + P[m &amp; 0xff] + key[m % key.length]) &amp; 0xff];\r\n                byte temp = P[m &amp; 0xff];\r\n                P[m &amp; 0xff] = P[s &amp; 0xff];\r\n                P[s &amp; 0xff] = temp;\r\n            } </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Prng.VmpcRandomGenerator.s\">\r\n            <remarks>Value generated in the same way as <c>P</c>.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaDigestSigner.Update(System.Byte)\">\r\n            update the internal digest with the byte b\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaDigestSigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            update the internal digest with the byte array in\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaDigestSigner.GenerateSignature\">\r\n            Generate a signature for the message we've been loaded with using\r\n            the key we were initialised with.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaDigestSigner.VerifySignature(System.Byte[])\">\r\n            <returns>true if the internal state represents the signature described in the passed in array.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaDigestSigner.Reset\">\r\n            <summary>Reset the internal state</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.DsaSigner\">\r\n            The Digital Signature Algorithm - as described in \"Handbook of Applied\r\n            Cryptography\", pages 452 - 453.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaSigner.GenerateSignature(System.Byte[])\">\r\n             Generate a signature for the given message using the key we were\r\n             initialised with. For conventional DSA the message should be a SHA-1\r\n             hash of the message of interest.\r\n            \r\n             @param message the message that will be verified later.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.DsaSigner.VerifySignature(System.Byte[],Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            return true if the value r and s represent a DSA signature for\r\n            the passed in message for standard DSA the message should be a\r\n            SHA-1 hash of the real message to be verified.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.ECDsaSigner\">\r\n            EC-DSA as described in X9.62\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.ECDsaSigner.GenerateSignature(System.Byte[])\">\r\n             Generate a signature for the given message using the key we were\r\n             initialised with. For conventional DSA the message should be a SHA-1\r\n             hash of the message of interest.\r\n            \r\n             @param message the message that will be verified later.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.ECDsaSigner.VerifySignature(System.Byte[],Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            return true if the value r and s represent a DSA signature for\r\n            the passed in message (for standard DSA the message should be\r\n            a SHA-1 hash of the real message to be verified).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.ECGost3410Signer\">\r\n            GOST R 34.10-2001 Signature Algorithm\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.ECGost3410Signer.GenerateSignature(System.Byte[])\">\r\n             generate a signature for the given message using the key we were\r\n             initialised with. For conventional GOST3410 the message should be a GOST3411\r\n             hash of the message of interest.\r\n            \r\n             @param message the message that will be verified later.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.ECGost3410Signer.VerifySignature(System.Byte[],Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            return true if the value r and s represent a GOST3410 signature for\r\n            the passed in message (for standard GOST3410 the message should be\r\n            a GOST3411 hash of the real message to be verified).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.ECNRSigner\">\r\n            EC-NR as described in IEEE 1363-2000\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.ECNRSigner.GenerateSignature(System.Byte[])\">\r\n             generate a signature for the given message using the key we were\r\n             initialised with.  Generally, the order of the curve should be at\r\n             least as long as the hash of the message of interest, and with\r\n             ECNR it *must* be at least as long.\r\n            \r\n             @param digest  the digest to be signed.\r\n             @exception DataLengthException if the digest is longer than the key allows\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.ECNRSigner.VerifySignature(System.Byte[],Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n             return true if the value r and s represent a signature for the\r\n             message passed in. Generally, the order of the curve should be at\r\n             least as long as the hash of the message of interest, and with\r\n             ECNR, it *must* be at least as long.  But just in case the signer\r\n             applied mod(n) to the longer digest, this implementation will\r\n             apply mod(n) during verification.\r\n            \r\n             @param digest  the digest to be verified.\r\n             @param r       the r value of the signature.\r\n             @param s       the s value of the signature.\r\n             @exception DataLengthException if the digest is longer than the key allows\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.GenericSigner.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the signer for signing or verification.\r\n            \r\n             @param forSigning\r\n                        true if for signing, false otherwise\r\n             @param parameters\r\n                        necessary parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.GenericSigner.Update(System.Byte)\">\r\n            update the internal digest with the byte b\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.GenericSigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            update the internal digest with the byte array in\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.GenericSigner.GenerateSignature\">\r\n            Generate a signature for the message we've been loaded with using the key\r\n            we were initialised with.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.GenericSigner.VerifySignature(System.Byte[])\">\r\n            return true if the internal state represents the signature described in\r\n            the passed in array.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410DigestSigner.Update(System.Byte)\">\r\n            update the internal digest with the byte b\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410DigestSigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            update the internal digest with the byte array in\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410DigestSigner.GenerateSignature\">\r\n            Generate a signature for the message we've been loaded with using\r\n            the key we were initialised with.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410DigestSigner.VerifySignature(System.Byte[])\">\r\n            <returns>true if the internal state represents the signature described in the passed in array.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410DigestSigner.Reset\">\r\n            <summary>Reset the internal state</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.Gost3410Signer\">\r\n            Gost R 34.10-94 Signature Algorithm\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410Signer.GenerateSignature(System.Byte[])\">\r\n             generate a signature for the given message using the key we were\r\n             initialised with. For conventional Gost3410 the message should be a Gost3411\r\n             hash of the message of interest.\r\n            \r\n             @param message the message that will be verified later.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Gost3410Signer.VerifySignature(System.Byte[],Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            return true if the value r and s represent a Gost3410 signature for\r\n            the passed in message for standard Gost3410 the message should be a\r\n            Gost3411 hash of the real message to be verified.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner\">\r\n            <summary> ISO9796-2 - mechanism using a hash function with recovery (scheme 2 and 3).\r\n            <p>\r\n            Note: the usual length for the salt is the length of the hash\r\n            function used in bytes.</p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.GetRecoveredMessage\">\r\n            <summary>\r\n            Return a reference to the recoveredMessage message.\r\n            </summary>\r\n            <returns>The full/partial recoveredMessage message.</returns>\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.GetRecoveredMessage\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher,Org.BouncyCastle.Crypto.IDigest,System.Int32,System.Boolean)\">\r\n            <summary>\r\n            Generate a signer for the with either implicit or explicit trailers\r\n            for ISO9796-2, scheme 2 or 3.\r\n            </summary>\r\n            <param name=\"cipher\">base cipher to use for signature creation/verification</param>\r\n            <param name=\"digest\">digest to use.</param>\r\n            <param name=\"saltLength\">length of salt in bytes.</param>\r\n            <param name=\"isImplicit\">whether or not the trailer is implicit or gives the hash.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher,Org.BouncyCastle.Crypto.IDigest,System.Int32)\">\r\n             <summary> Constructor for a signer with an explicit digest trailer.\r\n            \r\n             </summary>\r\n             <param name=\"cipher\">cipher to use.\r\n             </param>\r\n             <param name=\"digest\">digest to sign with.\r\n             </param>\r\n             <param name=\"saltLength\">length of salt in bytes.\r\n             </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n            <summary>Initialise the signer.</summary>\r\n            <param name=\"forSigning\">true if for signing, false if for verification.</param>\r\n            <param name=\"parameters\">parameters for signature generation/verification. If the\r\n            parameters are for generation they should be a ParametersWithRandom,\r\n            a ParametersWithSalt, or just an RsaKeyParameters object. If RsaKeyParameters\r\n            are passed in a SecureRandom will be created.\r\n            </param>\r\n            <exception cref=\"T:System.ArgumentException\">if wrong parameter type or a fixed\r\n            salt is passed in which is the wrong length.\r\n            </exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.IsSameAs(System.Byte[],System.Byte[])\">\r\n            <summary> compare two byte arrays - constant time.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.ClearBlock(System.Byte[])\">\r\n            <summary> clear possible sensitive data</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.Update(System.Byte)\">\r\n            <summary> update the internal digest with the byte b</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary> update the internal digest with the byte array in</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.Reset\">\r\n            <summary> reset the internal state</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.GenerateSignature\">\r\n            <summary> Generate a signature for the loaded message using the key we were\r\n            initialised with.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.VerifySignature(System.Byte[])\">\r\n            <summary> return true if the signature represents a ISO9796-2 signature\r\n            for the passed in message.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.HasFullMessage\">\r\n            <summary>\r\n            Return true if the full message was recoveredMessage.\r\n            </summary>\r\n            <returns>true on full message recovery, false otherwise, or if not sure.</returns>\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.HasFullMessage\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.ItoOSP(System.Int32,System.Byte[])\">\r\n            <summary> int to octet string.</summary>\r\n            <summary> int to octet string.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.LtoOSP(System.Int64,System.Byte[])\">\r\n            <summary> long to octet string.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2PssSigner.MaskGeneratorFunction1(System.Byte[],System.Int32,System.Int32,System.Int32)\">\r\n            <summary> mask generator function, as described in Pkcs1v2.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer\">\r\n            <summary> ISO9796-2 - mechanism using a hash function with recovery (scheme 1)</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.GetRecoveredMessage\">\r\n            <summary>\r\n            Return a reference to the recoveredMessage message.\r\n            </summary>\r\n            <returns>The full/partial recoveredMessage message.</returns>\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.GetRecoveredMessage\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher,Org.BouncyCastle.Crypto.IDigest,System.Boolean)\">\r\n            <summary>\r\n            Generate a signer for the with either implicit or explicit trailers\r\n            for ISO9796-2.\r\n            </summary>\r\n            <param name=\"cipher\">base cipher to use for signature creation/verification</param>\r\n            <param name=\"digest\">digest to use.</param>\r\n            <param name=\"isImplicit\">whether or not the trailer is implicit or gives the hash.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher,Org.BouncyCastle.Crypto.IDigest)\">\r\n             <summary> Constructor for a signer with an explicit digest trailer.\r\n            \r\n             </summary>\r\n             <param name=\"cipher\">cipher to use.\r\n             </param>\r\n             <param name=\"digest\">digest to sign with.\r\n             </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.IsSameAs(System.Byte[],System.Byte[])\">\r\n            <summary> compare two byte arrays - constant time.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.ClearBlock(System.Byte[])\">\r\n            <summary> clear possible sensitive data</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.Update(System.Byte)\">\r\n            <summary> update the internal digest with the byte b</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary> update the internal digest with the byte array in</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.Reset\">\r\n            <summary> reset the internal state</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.GenerateSignature\">\r\n            <summary> Generate a signature for the loaded message using the key we were\r\n            initialised with.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.VerifySignature(System.Byte[])\">\r\n            <summary> return true if the signature represents a ISO9796-2 signature\r\n            for the passed in message.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.Iso9796d2Signer.HasFullMessage\">\r\n            <summary>\r\n            Return true if the full message was recoveredMessage.\r\n            </summary>\r\n            <returns> true on full message recovery, false otherwise.</returns>\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.ISignerWithRecovery.HasFullMessage\"/>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Signers.PssSigner\">\r\n            <summary> RSA-PSS as described in Pkcs# 1 v 2.1.\r\n            <p>\r\n            Note: the usual value for the salt length is the number of\r\n            bytes in the hash function.</p>\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.#ctor(Org.BouncyCastle.Crypto.IAsymmetricBlockCipher,Org.BouncyCastle.Crypto.IDigest,System.Int32)\">\r\n            <summary>Basic constructor</summary>\r\n            <param name=\"cipher\">the asymmetric cipher to use.</param>\r\n            <param name=\"digest\">the digest to use.</param>\r\n            <param name=\"saltLen\">the length of the salt to use (in bytes).</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.ClearBlock(System.Byte[])\">\r\n            <summary> clear possible sensitive data</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.Update(System.Byte)\">\r\n            <summary> update the internal digest with the byte b</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary> update the internal digest with the byte array in</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.Reset\">\r\n            <summary> reset the internal state</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.GenerateSignature\">\r\n            <summary> Generate a signature for the message we've been loaded with using\r\n            the key we were initialised with.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.VerifySignature(System.Byte[])\">\r\n            <summary> return true if the internal state represents the signature described\r\n            in the passed in array.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.ItoOSP(System.Int32,System.Byte[])\">\r\n            <summary> int to octet string.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.PssSigner.MaskGeneratorFunction1(System.Byte[],System.Int32,System.Int32,System.Int32)\">\r\n            <summary> mask generator function, as described in Pkcs1v2.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.RsaDigestSigner.#cctor\">\r\n            <summary>\r\n            Load oid table.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.RsaDigestSigner.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             Initialise the signer for signing or verification.\r\n            \r\n             @param forSigning true if for signing, false otherwise\r\n             @param param necessary parameters.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.RsaDigestSigner.Update(System.Byte)\">\r\n            update the internal digest with the byte b\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.RsaDigestSigner.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            update the internal digest with the byte array in\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.RsaDigestSigner.GenerateSignature\">\r\n            Generate a signature for the message we've been loaded with using\r\n            the key we were initialised with.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Signers.RsaDigestSigner.VerifySignature(System.Byte[])\">\r\n            return true if the internal state represents the signature described\r\n            in the passed in array.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.StreamBlockCipher\">\r\n            a wrapper for block ciphers with a single byte block size, so that they\r\n            can be treated like stream ciphers.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.StreamBlockCipher.#ctor(Org.BouncyCastle.Crypto.IBlockCipher)\">\r\n             basic constructor.\r\n            \r\n             @param cipher the block cipher to be wrapped.\r\n             @exception ArgumentException if the cipher has a block size other than\r\n             one.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.StreamBlockCipher.Init(System.Boolean,Org.BouncyCastle.Crypto.ICipherParameters)\">\r\n             initialise the underlying cipher.\r\n            \r\n             @param forEncryption true if we are setting up for encryption, false otherwise.\r\n             @param param the necessary parameters for the underlying cipher to be initialised.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.StreamBlockCipher.AlgorithmName\">\r\n             return the name of the algorithm we are wrapping.\r\n            \r\n             @return the name of the algorithm we are wrapping.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.StreamBlockCipher.ReturnByte(System.Byte)\">\r\n             encrypt/decrypt a single byte returning the result.\r\n            \r\n             @param in the byte to be processed.\r\n             @return the result of processing the input byte.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.StreamBlockCipher.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n             process a block of bytes from in putting the result into out.\r\n            \r\n             @param in the input byte array.\r\n             @param inOff the offset into the in array where the data to be processed starts.\r\n             @param len the number of bytes to be processed.\r\n             @param out the output buffer the processed bytes go into.\r\n             @param outOff the offset into the output byte array the processed data stars at.\r\n             @exception DataLengthException if the output buffer is too small.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.StreamBlockCipher.Reset\">\r\n            reset the underlying cipher. This leaves it in the same state\r\n            it was at after the last init (if there was one).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.AlwaysValidVerifyer\">\r\n            <remarks>\r\n            A certificate verifyer, that will always return true.\r\n            <pre>\r\n            DO NOT USE THIS FILE UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING.\r\n            </pre>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.AlwaysValidVerifyer.IsValid(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[])\">\r\n            <summary>Return true.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ByteQueue\">\r\n            <remarks>\r\n            A queue for bytes.\r\n            <p>\r\n            This file could be more optimized.\r\n            </p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.ByteQueue.NextTwoPow(System.Int32)\">\r\n            <returns>The smallest number which can be written as 2^x which is bigger than i.</returns>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ByteQueue.DefaultCapacity\">\r\n            The initial size for our buffer.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ByteQueue.databuf\">\r\n            The buffer where we store our data.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ByteQueue.skipped\">\r\n            How many bytes at the beginning of the buffer are skipped.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ByteQueue.available\">\r\n            How many bytes in the buffer are valid data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.ByteQueue.Read(System.Byte[],System.Int32,System.Int32,System.Int32)\">\r\n            <summary>Read data from the buffer.</summary>\r\n            <param name=\"buf\">The buffer where the read data will be copied to.</param>\r\n            <param name=\"offset\">How many bytes to skip at the beginning of buf.</param>\r\n            <param name=\"len\">How many bytes to read at all.</param>\r\n            <param name=\"skip\">How many bytes from our data to skip.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.ByteQueue.AddData(System.Byte[],System.Int32,System.Int32)\">\r\n            <summary>Add some data to our buffer.</summary>\r\n            <param name=\"data\">A byte-array to read data from.</param>\r\n            <param name=\"offset\">How many bytes to skip at the beginning of the array.</param>\r\n            <param name=\"len\">How many bytes to read from the array.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.ByteQueue.RemoveData(System.Int32)\">\r\n            <summary>Remove some bytes from our data from the beginning.</summary>\r\n            <param name=\"i\">How many bytes to remove.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.ByteQueue.Available\">\r\n            <summary>The number of bytes which are available in this buffer.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.Certificate\">\r\n            A representation for a certificate chain.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.Certificate.certs\">\r\n            The certificates.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.Certificate.Parse(System.IO.Stream)\">\r\n             Parse the ServerCertificate message.\r\n            \r\n             @param inStr The stream where to parse from.\r\n             @return A Certificate object with the certs, the server has sended.\r\n             @throws IOException If something goes wrong during parsing.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.Certificate.Encode(System.IO.Stream)\">\r\n             Encodes version of the ClientCertificate message\r\n            \r\n             @param outStr stream to write the message to\r\n             @throws IOException If something goes wrong\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.Certificate.#ctor(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[])\">\r\n             Private constructor from a cert array.\r\n            \r\n             @param certs The certs the chain should contain.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.Certificate.GetCerts\">\r\n            <returns>An array which contains the certs, this chain contains.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.CombinedHash\">\r\n            <remarks>A combined hash, which implements md5(m) || sha1(m).</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.CombinedHash.AlgorithmName\">\r\n            <seealso cref=\"P:Org.BouncyCastle.Crypto.IDigest.AlgorithmName\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.CombinedHash.GetByteLength\">\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.IDigest.GetByteLength\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.CombinedHash.GetDigestSize\">\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.IDigest.GetDigestSize\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.CombinedHash.Update(System.Byte)\">\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.IDigest.Update(System.Byte)\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.CombinedHash.BlockUpdate(System.Byte[],System.Int32,System.Int32)\">\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.IDigest.BlockUpdate(System.Byte[],System.Int32,System.Int32)\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.CombinedHash.DoFinal(System.Byte[],System.Int32)\">\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.IDigest.DoFinal(System.Byte[],System.Int32)\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.CombinedHash.Reset\">\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.IDigest.Reset\"/>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ICertificateVerifyer\">\r\n            <remarks>\r\n            This should be implemented by any class which can find out, if a given\r\n            certificate chain is being accepted by an client.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.ICertificateVerifyer.IsValid(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[])\">\r\n            <param name=\"certs\">The certs, which are part of the chain.</param>\r\n            <returns>True, if the chain is accepted, false otherwise</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.RecordStream\">\r\n            <remarks>An implementation of the TLS 1.0 record layer.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsBlockCipher\">\r\n            <summary>\r\n            A generic TLS 1.0 block cipher. This can be used for AES or 3DES for example.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsCipher.EncodePlaintext(Org.BouncyCastle.Crypto.Tls.ContentType,System.Byte[],System.Int32,System.Int32)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsCipher.DecodeCiphertext(Org.BouncyCastle.Crypto.Tls.ContentType,System.Byte[],System.Int32,System.Int32)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.Init(Org.BouncyCastle.Crypto.Tls.TlsClientContext)\">\r\n            <summary>\r\n            Called at the start of a new TLS session, before any other methods.\r\n            </summary>\r\n            <param name=\"context\">\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler\"/>\r\n            </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetCipherSuites\">\r\n            <summary>\r\n            Get the list of cipher suites that this client supports.\r\n            </summary>\r\n            <returns>\r\n            An array of <see cref=\"T:Org.BouncyCastle.Crypto.Tls.CipherSuite\"/>, each specifying a supported cipher suite.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetCompressionMethods\">\r\n            <summary>\r\n            Get the list of compression methods that this client supports.\r\n            </summary>\r\n            <returns>\r\n            An array of <see cref=\"T:Org.BouncyCastle.Crypto.Tls.CompressionMethod\"/>, each specifying a supported compression method.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetClientExtensions\">\r\n            <summary>\r\n            Get the (optional) table of client extensions to be included in (extended) client hello.\r\n            </summary>\r\n            <returns>\r\n            A <see cref=\"T:System.Collections.IDictionary\"/> (<see cref=\"T:Org.BouncyCastle.Crypto.Tls.ExtensionType\"/> -> byte[]). May be null.\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.NotifySessionID(System.Byte[])\">\r\n            <summary>\r\n            Reports the session ID once it has been determined.\r\n            </summary>\r\n            <param name=\"sessionID\">\r\n            A <see cref=\"T:System.Byte\"/>\r\n            </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.NotifySelectedCipherSuite(Org.BouncyCastle.Crypto.Tls.CipherSuite)\">\r\n            <summary>\r\n            Report the cipher suite that was selected by the server.\r\n            </summary>\r\n            <remarks>\r\n            The protocol handler validates this value against the offered cipher suites\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetCipherSuites\"/>\r\n            </remarks>\r\n            <param name=\"selectedCipherSuite\">\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.CipherSuite\"/>\r\n            </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.NotifySelectedCompressionMethod(Org.BouncyCastle.Crypto.Tls.CompressionMethod)\">\r\n            <summary>\r\n            Report the compression method that was selected by the server.\r\n            </summary>\r\n            <remarks>\r\n            The protocol handler validates this value against the offered compression methods\r\n            <seealso cref=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetCompressionMethods\"/>\r\n            </remarks>\r\n            <param name=\"selectedCompressionMethod\">\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.CompressionMethod\"/>\r\n            </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.NotifySecureRenegotiation(System.Boolean)\">\r\n            <summary>\r\n            Report whether the server supports secure renegotiation\r\n            </summary>\r\n            <remarks>\r\n            The protocol handler automatically processes the relevant extensions\r\n            </remarks>\r\n            <param name=\"secureRenegotiation\">\r\n            A <see cref=\"T:System.Boolean\"/>, true if the server supports secure renegotiation\r\n            </param>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.ProcessServerExtensions(System.Collections.IDictionary)\">\r\n            <summary>\r\n            Report the extensions from an extended server hello.\r\n            </summary>\r\n            <remarks>\r\n            Will only be called if we returned a non-null result from <see cref=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetClientExtensions\"/>.\r\n            </remarks>\r\n            <param name=\"serverExtensions\">\r\n            A <see cref=\"T:System.Collections.IDictionary\"/>  (<see cref=\"T:Org.BouncyCastle.Crypto.Tls.ExtensionType\"/> -> byte[])\r\n            </param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetKeyExchange\">\r\n            <summary>\r\n            Return an implementation of <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange\"/> to negotiate the key exchange\r\n            part of the protocol.\r\n            </summary>\r\n            <returns>\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange\"/>\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetAuthentication\">\r\n            <summary>\r\n            Return an implementation of <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsAuthentication\"/> to handle authentication\r\n            part of the protocol.\r\n            </summary>\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetCompression\">\r\n            <summary>\r\n            Return an implementation of <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsCompression\"/> to handle record compression.\r\n            </summary>\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsClient.GetCipher\">\r\n            <summary>\r\n            Return an implementation of <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsCipher\"/> to use for encryption/decryption.\r\n            </summary>\r\n            <returns>\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsCipher\"/>\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsDHKeyExchange\">\r\n            <summary>\r\n            TLS 1.0 DH key exchange.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange\">\r\n            <summary>\r\n            A generic interface for key exchange implementations in TLS 1.0.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.SkipServerCertificate\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.ProcessServerCertificate(Org.BouncyCastle.Crypto.Tls.Certificate)\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.SkipServerKeyExchange\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.ProcessServerKeyExchange(System.IO.Stream)\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.ValidateCertificateRequest(Org.BouncyCastle.Crypto.Tls.CertificateRequest)\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.SkipClientCredentials\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.ProcessClientCredentials(Org.BouncyCastle.Crypto.Tls.TlsCredentials)\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.GenerateClientKeyExchange(System.IO.Stream)\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsKeyExchange.GeneratePremasterSecret\">\r\n            <exception cref=\"T:System.IO.IOException\"/>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsMac\">\r\n            <remarks>\r\n            A generic TLS MAC implementation, which can be used with any kind of\r\n            IDigest to act as an HMAC.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsMac.#ctor(Org.BouncyCastle.Crypto.IDigest,System.Byte[],System.Int32,System.Int32)\">\r\n             Generate a new instance of an TlsMac.\r\n            \r\n             @param digest    The digest to use.\r\n             @param key_block A byte-array where the key for this mac is located.\r\n             @param offset    The number of bytes to skip, before the key starts in the buffer.\r\n             @param len       The length of the key.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsMac.GetMacSecret\">\r\n            @return the MAC write secret\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.TlsMac.SequenceNumber\">\r\n            @return the current write sequence number\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsMac.IncSequenceNumber\">\r\n            Increment the current write sequence number\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.TlsMac.Size\">\r\n            @return The Keysize of the mac.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsMac.CalculateMac(Org.BouncyCastle.Crypto.Tls.ContentType,System.Byte[],System.Int32,System.Int32)\">\r\n             Calculate the mac for some given data.\r\n             <p/>\r\n             TlsMac will keep track of the sequence number internally.\r\n            \r\n             @param type    The message type of the message.\r\n             @param message A byte-buffer containing the message.\r\n             @param offset  The number of bytes to skip, before the message starts.\r\n             @param len     The length of the message.\r\n             @return A new byte-buffer containing the mac value.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsNullCipher\">\r\n            <summary>\r\n            A NULL cipher suite, for use during handshake.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler\">\r\n            <remarks>An implementation of all high level protocols in TLS 1.0.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.#ctor(System.IO.Stream,System.IO.Stream)\">\r\n            <remarks>Both streams can be the same object</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.#ctor(System.IO.Stream,System.IO.Stream,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <remarks>Both streams can be the same object</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.ProcessChangeCipherSpec(System.Byte[],System.Int32,System.Int32)\">\r\n             This method is called, when a change cipher spec message is received.\r\n            \r\n             @throws IOException If the message has an invalid content or the\r\n                                 handshake is not in the correct state.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.Connect(Org.BouncyCastle.Crypto.Tls.ICertificateVerifyer)\">\r\n            <summary>Connects to the remote system.</summary>\r\n            <param name=\"verifyer\">Will be used when a certificate is received to verify\r\n            that this certificate is accepted by the client.</param>\r\n            <exception cref=\"T:System.IO.IOException\">If handshake was not successful</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.ReadApplicationData(System.Byte[],System.Int32,System.Int32)\">\r\n             Read data from the network. The method will return immediately, if there is\r\n             still some data left in the buffer, or block until some application\r\n             data has been read from the network.\r\n            \r\n             @param buf    The buffer where the data will be copied to.\r\n             @param offset The position where the data will be placed in the buffer.\r\n             @param len    The maximum number of bytes to read.\r\n             @return The number of bytes read.\r\n             @throws IOException If something goes wrong during reading data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.WriteData(System.Byte[],System.Int32,System.Int32)\">\r\n             Send some application data to the remote system.\r\n             <p/>\r\n             The method will handle fragmentation internally.\r\n            \r\n             @param buf    The buffer with the data.\r\n             @param offset The position in the buffer where the data is placed.\r\n             @param len    The length of the data.\r\n             @throws IOException If something goes wrong during sending.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.OutputStream\">\r\n            <summary>A Stream which can be used to send data.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.InputStream\">\r\n            <summary>A Stream which can be used to read data.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.Stream\">\r\n            <summary>The secure bidirectional stream for this connection</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.FailWithError(Org.BouncyCastle.Crypto.Tls.AlertLevel,Org.BouncyCastle.Crypto.Tls.AlertDescription)\">\r\n             Terminate this connection with an alert.\r\n             <p/>\r\n             Can be used for normal closure too.\r\n            \r\n             @param alertLevel       The level of the alert, an be AlertLevel.fatal or AL_warning.\r\n             @param alertDescription The exact alert message.\r\n             @throws IOException If alert was fatal.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.Close\">\r\n            <summary>Closes this connection</summary>\r\n            <exception cref=\"T:System.IO.IOException\">If something goes wrong during closing.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsProtocolHandler.AssertEmpty(System.IO.MemoryStream)\">\r\n             Make sure the Stream is now empty. Fail otherwise.\r\n            \r\n             @param is The Stream to check.\r\n             @throws IOException If is is not empty.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsRsaKeyExchange\">\r\n            <summary>\r\n            TLS 1.0 RSA key exchange.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsSrpKeyExchange\">\r\n            <summary>\r\n            TLS 1.1 SRP key exchange.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsUtilities\">\r\n            <remarks>Some helper functions for MicroTLS.</remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.AlertDescription\">\r\n            <summary>\r\n            RFC 2246 7.2\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.AlertLevel\">\r\n            <summary>\r\n            RFC 2246 7.2\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Crypto.Tls.CertificateRequest.CertificateAuthorities\">\r\n            <returns>A <see cref=\"T:System.Collections.IList\"/> of X509Name</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.CipherSuite\">\r\n            <summary>\r\n            RFC 2246 A.5\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ClientCertificateType\">\r\n            <summary>\r\n            RFC 2246 7.4.4\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.CompressionMethod\">\r\n            <summary>\r\n            RFC 2246 6.1\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ContentType\">\r\n            <summary>\r\n            RFC 2246 6.2.1\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.DefaultTlsCipherFactory.CreateRC4Cipher(Org.BouncyCastle.Crypto.Tls.TlsClientContext,System.Int32,Org.BouncyCastle.Crypto.Tls.DigestAlgorithm)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.DefaultTlsCipherFactory.CreateAesCipher(Org.BouncyCastle.Crypto.Tls.TlsClientContext,System.Int32,Org.BouncyCastle.Crypto.Tls.DigestAlgorithm)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.DefaultTlsCipherFactory.CreateDesEdeCipher(Org.BouncyCastle.Crypto.Tls.TlsClientContext,System.Int32,Org.BouncyCastle.Crypto.Tls.DigestAlgorithm)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.DefaultTlsCipherFactory.CreateDigest(Org.BouncyCastle.Crypto.Tls.DigestAlgorithm)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ECCurveType\">\r\n            <summary>\r\n            RFC 4492 5.4\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ECCurveType.explicit_prime\">\r\n            Indicates the elliptic curve domain parameters are conveyed verbosely, and the\r\n            underlying finite field is a prime field.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ECCurveType.explicit_char2\">\r\n            Indicates the elliptic curve domain parameters are conveyed verbosely, and the\r\n            underlying finite field is a characteristic-2 field.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Crypto.Tls.ECCurveType.named_curve\">\r\n            Indicates that a named curve is used. This option SHOULD be used when applicable.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ECPointFormat\">\r\n            <summary>\r\n            RFC 4492 5.1.2\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.ExtensionType\">\r\n            <summary>\r\n            RFC 4366 2.3\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.HandshakeType\">\r\n            <summary>\r\n            RFC 2246 7.4\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.LegacyTlsAuthentication\">\r\n            <summary>\r\n            A temporary class to wrap old CertificateVerifyer stuff for new TlsAuthentication.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.LegacyTlsClient\">\r\n            <summary>\r\n            A temporary class to use LegacyTlsAuthentication \r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.NamedCurve\">\r\n            <summary>\r\n            RFC 4492 5.1.1\r\n            The named curves defined here are those specified in SEC 2 [13]. Note that many of\r\n            these curves are also recommended in ANSI X9.62 [7] and FIPS 186-2 [11]. Values 0xFE00\r\n            through 0xFEFF are reserved for private use. Values 0xFF01 and 0xFF02 indicate that the\r\n            client supports arbitrary prime and characteristic-2 curves, respectively (the curve\r\n            parameters must be encoded explicitly in ECParameters).\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.Ssl3Mac\">\r\n            HMAC implementation based on original internet draft for HMAC (RFC 2104)\r\n            \r\n            The difference is that padding is concatentated versus XORed with the key\r\n            \r\n            H(K + opad, H(K + ipad, text))\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.Ssl3Mac.#ctor(Org.BouncyCastle.Crypto.IDigest)\">\r\n            Base constructor for one of the standard digest algorithms that the byteLength of\r\n            the algorithm is know for. Behaviour is undefined for digests other than MD5 or SHA1.\r\n            \r\n            @param digest the digest.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.Ssl3Mac.Reset\">\r\n            Reset the mac generator.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsAgreementCredentials.GenerateAgreement(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsAuthentication.NotifyServerCertificate(Org.BouncyCastle.Crypto.Tls.Certificate)\">\r\n            <summary>\r\n            Called by the protocol handler to report the server certificate.\r\n            </summary>\r\n            <remarks>\r\n            This method is responsible for certificate verification and validation\r\n            </remarks>\r\n            <param name=\"serverCertificate\">The server <see cref=\"T:Org.BouncyCastle.Crypto.Tls.Certificate\"/> received</param>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsAuthentication.GetClientCredentials(Org.BouncyCastle.Crypto.Tls.CertificateRequest)\">\r\n            <summary>\r\n            Return client credentials in response to server's certificate request\r\n            </summary>\r\n            <param name=\"certificateRequest\">\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.CertificateRequest\"/> containing server certificate request details\r\n            </param>\r\n            <returns>\r\n            A <see cref=\"T:Org.BouncyCastle.Crypto.Tls.TlsCredentials\"/> to be used for client authentication\r\n            (or <c>null</c> for no client authentication)\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsCipherFactory.CreateCipher(Org.BouncyCastle.Crypto.Tls.TlsClientContext,Org.BouncyCastle.Crypto.Tls.EncryptionAlgorithm,Org.BouncyCastle.Crypto.Tls.DigestAlgorithm)\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsECDheKeyExchange\">\r\n            ECDHE key exchange (see RFC 4492)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Crypto.Tls.TlsECDHKeyExchange\">\r\n            ECDH key exchange (see RFC 4492)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Crypto.Tls.TlsSignerCredentials.GenerateCertificateSignature(System.Byte[])\">\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.AddMagnitudes(System.Int32[],System.Int32[])\">\r\n            return a = a + b - b preserved.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.CompareTo(System.Int32,System.Int32[],System.Int32,System.Int32[])\">\r\n            unsigned comparison on two arrays - note the arrays may\r\n            start with leading zeros.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.Divide(System.Int32[],System.Int32[])\">\r\n            return z = x / y - done in place (z value preserved, x contains the\r\n            remainder)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.IsProbablePrime(System.Int32)\">\r\n            return whether or not a BigInteger is probably prime with a\r\n            probability of 1 - (1/2)**certainty.\r\n            <p>From Knuth Vol 2, pg 395.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.ExtEuclid(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger@)\">\r\n             Calculate the numbers u1, u2, and u3 such that:\r\n            \r\n             u1 * a + u2 * b = u3\r\n            \r\n             where u3 is the greatest common divider of a and b.\r\n             a and b using the extended Euclid algorithm (refer p. 323\r\n             of The Art of Computer Programming vol 2, 2nd ed).\r\n             This also seems to have the side effect of calculating\r\n             some form of multiplicative inverse.\r\n            \r\n             @param a    First number to calculate gcd for\r\n             @param b    Second number to calculate gcd for\r\n             @param u1Out      the return object for the u1 value\r\n             @param u2Out      the return object for the u2 value\r\n             @return     The greatest common divisor of a and b\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.Square(System.Int32[],System.Int32[])\">\r\n            return w with w = x * x - w is assumed to have enough space.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.Multiply(System.Int32[],System.Int32[],System.Int32[])\">\r\n            return x with x = y * z - x is assumed to have enough space.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.GetMQuote\">\r\n            Calculate mQuote = -m^(-1) mod b with b = 2^32 (32 = word size)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.MultiplyMonty(System.Int32[],System.Int32[],System.Int32[],System.Int32[],System.UInt32,System.Boolean)\">\r\n            Montgomery multiplication: a = x * y * R^(-1) mod m\r\n            <br/>\r\n            Based algorithm 14.36 of Handbook of Applied Cryptography.\r\n            <br/>\r\n            <li> m, x, y should have length n </li>\r\n            <li> a should have length (n + 1) </li>\r\n            <li> b = 2^32, R = b^n </li>\r\n            <br/>\r\n            The result is put in x\r\n            <br/>\r\n            NOTE: the indices of x, y, m, a different in HAC and in Java\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.Remainder(System.Int32[],System.Int32[])\">\r\n            return x = x % y - done in place (y value preserved)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.ShiftLeft(System.Int32[],System.Int32)\">\r\n            do a left shift - this returns a new array.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.ShiftRightInPlace(System.Int32,System.Int32[],System.Int32)\">\r\n            do a right shift - this does it in place.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.ShiftRightOneInPlace(System.Int32,System.Int32[])\">\r\n            do a right shift by one - this does it in place.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.BigInteger.Subtract(System.Int32,System.Int32[],System.Int32,System.Int32[])\">\r\n            returns x = x - y - we assume x is >= y\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal\">\r\n            Class representing a simple version of a big decimal. A\r\n            <code>SimpleBigDecimal</code> is basically a\r\n            {@link java.math.BigInteger BigInteger} with a few digits on the right of\r\n            the decimal point. The number of (binary) digits on the right of the decimal\r\n            point is called the <code>scale</code> of the <code>SimpleBigDecimal</code>.\r\n            Unlike in {@link java.math.BigDecimal BigDecimal}, the scale is not adjusted\r\n            automatically, but must be set manually. All <code>SimpleBigDecimal</code>s\r\n            taking part in the same arithmetic operation must have equal scale. The\r\n            result of a multiplication of two <code>SimpleBigDecimal</code>s returns a\r\n            <code>SimpleBigDecimal</code> with double scale.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal.GetInstance(Org.BouncyCastle.Math.BigInteger,System.Int32)\">\r\n            Returns a <code>SimpleBigDecimal</code> representing the same numerical\r\n            value as <code>value</code>.\r\n            @param value The value of the <code>SimpleBigDecimal</code> to be\r\n            created. \r\n            @param scale The scale of the <code>SimpleBigDecimal</code> to be\r\n            created. \r\n            @return The such created <code>SimpleBigDecimal</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal.#ctor(Org.BouncyCastle.Math.BigInteger,System.Int32)\">\r\n            Constructor for <code>SimpleBigDecimal</code>. The value of the\r\n            constructed <code>SimpleBigDecimal</code> Equals <code>bigInt / \r\n            2<sup>scale</sup></code>.\r\n            @param bigInt The <code>bigInt</code> value parameter.\r\n            @param scale The scale of the constructed <code>SimpleBigDecimal</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Abc.Tnaf\">\r\n            Class holding methods for point multiplication based on the window\r\n            &#964;-adic nonadjacent form (WTNAF). The algorithms are based on the\r\n            paper \"Improved Algorithms for Arithmetic on Anomalous Binary Curves\"\r\n            by Jerome A. Solinas. The paper first appeared in the Proceedings of\r\n            Crypto 1997.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.Tnaf.Width\">\r\n            The window width of WTNAF. The standard value of 4 is slightly less\r\n            than optimal for running time, but keeps space requirements for\r\n            precomputation low. For typical curves, a value of 5 or 6 results in\r\n            a better running time. When changing this value, the\r\n            <code>&#945;<sub>u</sub></code>'s must be computed differently, see\r\n            e.g. \"Guide to Elliptic Curve Cryptography\", Darrel Hankerson,\r\n            Alfred Menezes, Scott Vanstone, Springer-Verlag New York Inc., 2004,\r\n            p. 121-122\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.Tnaf.Pow2Width\">\r\n            2<sup>4</sup>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.Tnaf.Alpha0\">\r\n            The <code>&#945;<sub>u</sub></code>'s for <code>a=0</code> as an array\r\n            of <code>ZTauElement</code>s.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.Tnaf.Alpha0Tnaf\">\r\n            The <code>&#945;<sub>u</sub></code>'s for <code>a=0</code> as an array\r\n            of TNAFs.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.Tnaf.Alpha1\">\r\n            The <code>&#945;<sub>u</sub></code>'s for <code>a=1</code> as an array\r\n            of <code>ZTauElement</code>s.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.Tnaf.Alpha1Tnaf\">\r\n            The <code>&#945;<sub>u</sub></code>'s for <code>a=1</code> as an array\r\n            of TNAFs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.Norm(System.SByte,Org.BouncyCastle.Math.EC.Abc.ZTauElement)\">\r\n            Computes the norm of an element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code>.\r\n            @param mu The parameter <code>&#956;</code> of the elliptic curve.\r\n            @param lambda The element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code>.\r\n            @return The norm of <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.Norm(System.SByte,Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal,Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal)\">\r\n            Computes the norm of an element <code>&#955;</code> of\r\n            <code><b>R</b>[&#964;]</code>, where <code>&#955; = u + v&#964;</code>\r\n            and <code>u</code> and <code>u</code> are real numbers (elements of\r\n            <code><b>R</b></code>). \r\n            @param mu The parameter <code>&#956;</code> of the elliptic curve.\r\n            @param u The real part of the element <code>&#955;</code> of\r\n            <code><b>R</b>[&#964;]</code>.\r\n            @param v The <code>&#964;</code>-adic part of the element\r\n            <code>&#955;</code> of <code><b>R</b>[&#964;]</code>.\r\n            @return The norm of <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.Round(Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal,Org.BouncyCastle.Math.EC.Abc.SimpleBigDecimal,System.SByte)\">\r\n            Rounds an element <code>&#955;</code> of <code><b>R</b>[&#964;]</code>\r\n            to an element of <code><b>Z</b>[&#964;]</code>, such that their difference\r\n            has minimal norm. <code>&#955;</code> is given as\r\n            <code>&#955; = &#955;<sub>0</sub> + &#955;<sub>1</sub>&#964;</code>.\r\n            @param lambda0 The component <code>&#955;<sub>0</sub></code>.\r\n            @param lambda1 The component <code>&#955;<sub>1</sub></code>.\r\n            @param mu The parameter <code>&#956;</code> of the elliptic curve. Must\r\n            equal 1 or -1.\r\n            @return The rounded element of <code><b>Z</b>[&#964;]</code>.\r\n            @throws ArgumentException if <code>lambda0</code> and\r\n            <code>lambda1</code> do not have same scale.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.ApproximateDivisionByN(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,System.SByte,System.Int32,System.Int32)\">\r\n            Approximate division by <code>n</code>. For an integer\r\n            <code>k</code>, the value <code>&#955; = s k / n</code> is\r\n            computed to <code>c</code> bits of accuracy.\r\n            @param k The parameter <code>k</code>.\r\n            @param s The curve parameter <code>s<sub>0</sub></code> or\r\n            <code>s<sub>1</sub></code>.\r\n            @param vm The Lucas Sequence element <code>V<sub>m</sub></code>.\r\n            @param a The parameter <code>a</code> of the elliptic curve.\r\n            @param m The bit length of the finite field\r\n            <code><b>F</b><sub>m</sub></code>.\r\n            @param c The number of bits of accuracy, i.e. the scale of the returned\r\n            <code>SimpleBigDecimal</code>.\r\n            @return The value <code>&#955; = s k / n</code> computed to\r\n            <code>c</code> bits of accuracy.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.TauAdicNaf(System.SByte,Org.BouncyCastle.Math.EC.Abc.ZTauElement)\">\r\n            Computes the <code>&#964;</code>-adic NAF (non-adjacent form) of an\r\n            element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>.\r\n            @param mu The parameter <code>&#956;</code> of the elliptic curve.\r\n            @param lambda The element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code>.\r\n            @return The <code>&#964;</code>-adic NAF of <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.Tau(Org.BouncyCastle.Math.EC.F2mPoint)\">\r\n            Applies the operation <code>&#964;()</code> to an\r\n            <code>F2mPoint</code>. \r\n            @param p The F2mPoint to which <code>&#964;()</code> is applied.\r\n            @return <code>&#964;(p)</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.GetMu(Org.BouncyCastle.Math.EC.F2mCurve)\">\r\n            Returns the parameter <code>&#956;</code> of the elliptic curve.\r\n            @param curve The elliptic curve from which to obtain <code>&#956;</code>.\r\n            The curve must be a Koblitz curve, i.e. <code>a</code> Equals\r\n            <code>0</code> or <code>1</code> and <code>b</code> Equals\r\n            <code>1</code>. \r\n            @return <code>&#956;</code> of the elliptic curve.\r\n            @throws ArgumentException if the given ECCurve is not a Koblitz\r\n            curve.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.GetLucas(System.SByte,System.Int32,System.Boolean)\">\r\n            Calculates the Lucas Sequence elements <code>U<sub>k-1</sub></code> and\r\n            <code>U<sub>k</sub></code> or <code>V<sub>k-1</sub></code> and\r\n            <code>V<sub>k</sub></code>.\r\n            @param mu The parameter <code>&#956;</code> of the elliptic curve.\r\n            @param k The index of the second element of the Lucas Sequence to be\r\n            returned.\r\n            @param doV If set to true, computes <code>V<sub>k-1</sub></code> and\r\n            <code>V<sub>k</sub></code>, otherwise <code>U<sub>k-1</sub></code> and\r\n            <code>U<sub>k</sub></code>.\r\n            @return An array with 2 elements, containing <code>U<sub>k-1</sub></code>\r\n            and <code>U<sub>k</sub></code> or <code>V<sub>k-1</sub></code>\r\n            and <code>V<sub>k</sub></code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.GetTw(System.SByte,System.Int32)\">\r\n            Computes the auxiliary value <code>t<sub>w</sub></code>. If the width is\r\n            4, then for <code>mu = 1</code>, <code>t<sub>w</sub> = 6</code> and for\r\n            <code>mu = -1</code>, <code>t<sub>w</sub> = 10</code> \r\n            @param mu The parameter <code>&#956;</code> of the elliptic curve.\r\n            @param w The window width of the WTNAF.\r\n            @return the auxiliary value <code>t<sub>w</sub></code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.GetSi(Org.BouncyCastle.Math.EC.F2mCurve)\">\r\n            Computes the auxiliary values <code>s<sub>0</sub></code> and\r\n            <code>s<sub>1</sub></code> used for partial modular reduction. \r\n            @param curve The elliptic curve for which to compute\r\n            <code>s<sub>0</sub></code> and <code>s<sub>1</sub></code>.\r\n            @throws ArgumentException if <code>curve</code> is not a\r\n            Koblitz curve (Anomalous Binary Curve, ABC).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.PartModReduction(Org.BouncyCastle.Math.BigInteger,System.Int32,System.SByte,Org.BouncyCastle.Math.BigInteger[],System.SByte,System.SByte)\">\r\n            Partial modular reduction modulo\r\n            <code>(&#964;<sup>m</sup> - 1)/(&#964; - 1)</code>.\r\n            @param k The integer to be reduced.\r\n            @param m The bitlength of the underlying finite field.\r\n            @param a The parameter <code>a</code> of the elliptic curve.\r\n            @param s The auxiliary values <code>s<sub>0</sub></code> and\r\n            <code>s<sub>1</sub></code>.\r\n            @param mu The parameter &#956; of the elliptic curve.\r\n            @param c The precision (number of bits of accuracy) of the partial\r\n            modular reduction.\r\n            @return <code>&#961; := k partmod (&#964;<sup>m</sup> - 1)/(&#964; - 1)</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.MultiplyRTnaf(Org.BouncyCastle.Math.EC.F2mPoint,Org.BouncyCastle.Math.BigInteger)\">\r\n            Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint}\r\n            by a <code>BigInteger</code> using the reduced <code>&#964;</code>-adic\r\n            NAF (RTNAF) method.\r\n            @param p The F2mPoint to Multiply.\r\n            @param k The <code>BigInteger</code> by which to Multiply <code>p</code>.\r\n            @return <code>k * p</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.MultiplyTnaf(Org.BouncyCastle.Math.EC.F2mPoint,Org.BouncyCastle.Math.EC.Abc.ZTauElement)\">\r\n            Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint}\r\n            by an element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>\r\n            using the <code>&#964;</code>-adic NAF (TNAF) method.\r\n            @param p The F2mPoint to Multiply.\r\n            @param lambda The element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code>.\r\n            @return <code>&#955; * p</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.MultiplyFromTnaf(Org.BouncyCastle.Math.EC.F2mPoint,System.SByte[])\">\r\n            Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint}\r\n            by an element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>\r\n            using the <code>&#964;</code>-adic NAF (TNAF) method, given the TNAF\r\n            of <code>&#955;</code>.\r\n            @param p The F2mPoint to Multiply.\r\n            @param u The the TNAF of <code>&#955;</code>..\r\n            @return <code>&#955; * p</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.TauAdicWNaf(System.SByte,Org.BouncyCastle.Math.EC.Abc.ZTauElement,System.SByte,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.EC.Abc.ZTauElement[])\">\r\n            Computes the <code>[&#964;]</code>-adic window NAF of an element\r\n            <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>.\r\n            @param mu The parameter &#956; of the elliptic curve.\r\n            @param lambda The element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code> of which to compute the\r\n            <code>[&#964;]</code>-adic NAF.\r\n            @param width The window width of the resulting WNAF.\r\n            @param pow2w 2<sup>width</sup>.\r\n            @param tw The auxiliary value <code>t<sub>w</sub></code>.\r\n            @param alpha The <code>&#945;<sub>u</sub></code>'s for the window width.\r\n            @return The <code>[&#964;]</code>-adic window NAF of\r\n            <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.Tnaf.GetPreComp(Org.BouncyCastle.Math.EC.F2mPoint,System.SByte)\">\r\n            Does the precomputation for WTNAF multiplication.\r\n            @param p The <code>ECPoint</code> for which to do the precomputation.\r\n            @param a The parameter <code>a</code> of the elliptic curve.\r\n            @return The precomputation array for <code>p</code>. \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Abc.ZTauElement\">\r\n            Class representing an element of <code><b>Z</b>[&#964;]</code>. Let\r\n            <code>&#955;</code> be an element of <code><b>Z</b>[&#964;]</code>. Then\r\n            <code>&#955;</code> is given as <code>&#955; = u + v&#964;</code>. The\r\n            components <code>u</code> and <code>v</code> may be used directly, there\r\n            are no accessor methods.\r\n            Immutable class.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.ZTauElement.u\">\r\n            The &quot;real&quot; part of <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Abc.ZTauElement.v\">\r\n            The &quot;<code>&#964;</code>-adic&quot; part of <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Abc.ZTauElement.#ctor(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for an element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code>.\r\n            @param u The &quot;real&quot; part of <code>&#955;</code>.\r\n            @param v The &quot;<code>&#964;</code>-adic&quot; part of\r\n            <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.ECCurve\">\r\n            <remarks>Base class for an elliptic curve.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.ECCurve.DecodePoint(System.Byte[])\">\r\n            Decode a point on this curve from its ASN.1 encoding. The different\r\n            encodings are taken account of, including point compression for\r\n            <code>F<sub>p</sub></code> (X9.62 s 4.2.1 pg 17).\r\n            @return The decoded point.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.FpCurve\">\r\n            Elliptic curve over Fp\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.F2mCurve\">\r\n            Elliptic curves over F2m. The Weierstrass equation is given by\r\n            <code>y<sup>2</sup> + xy = x<sup>3</sup> + ax<sup>2</sup> + b</code>.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.m\">\r\n            The exponent <code>m</code> of <code>F<sub>2<sup>m</sup></sub></code>.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.k1\">\r\n            TPB: The integer <code>k</code> where <code>x<sup>m</sup> +\r\n            x<sup>k</sup> + 1</code> represents the reduction polynomial\r\n            <code>f(z)</code>.<br/>\r\n            PPB: The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.k2\">\r\n            TPB: Always set to <code>0</code><br/>\r\n            PPB: The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.k3\">\r\n            TPB: Always set to <code>0</code><br/>\r\n            PPB: The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.n\">\r\n            The order of the base point of the curve.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.h\">\r\n            The cofactor of the curve.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.infinity\">\r\n            The point at infinity on this curve.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.mu\">\r\n            The parameter <code>&#956;</code> of the elliptic curve if this is\r\n            a Koblitz curve.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mCurve.si\">\r\n            The auxiliary values <code>s<sub>0</sub></code> and\r\n            <code>s<sub>1</sub></code> used for partial modular reduction for\r\n            Koblitz curves.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.#ctor(System.Int32,System.Int32,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for Trinomial Polynomial Basis (TPB).\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k The integer <code>k</code> where <code>x<sup>m</sup> +\r\n            x<sup>k</sup> + 1</code> represents the reduction\r\n            polynomial <code>f(z)</code>.\r\n            @param a The coefficient <code>a</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param b The coefficient <code>b</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.#ctor(System.Int32,System.Int32,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for Trinomial Polynomial Basis (TPB).\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k The integer <code>k</code> where <code>x<sup>m</sup> +\r\n            x<sup>k</sup> + 1</code> represents the reduction\r\n            polynomial <code>f(z)</code>.\r\n            @param a The coefficient <code>a</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param b The coefficient <code>b</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param n The order of the main subgroup of the elliptic curve.\r\n            @param h The cofactor of the elliptic curve, i.e.\r\n            <code>#E<sub>a</sub>(F<sub>2<sup>m</sup></sub>) = h * n</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for Pentanomial Polynomial Basis (PPB).\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param a The coefficient <code>a</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param b The coefficient <code>b</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for Pentanomial Polynomial Basis (PPB).\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param a The coefficient <code>a</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param b The coefficient <code>b</code> in the Weierstrass equation\r\n            for non-supersingular elliptic curves over\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param n The order of the main subgroup of the elliptic curve.\r\n            @param h The cofactor of the elliptic curve, i.e.\r\n            <code>#E<sub>a</sub>(F<sub>2<sup>m</sup></sub>) = h * n</code>.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.F2mCurve.IsKoblitz\">\r\n            Returns true if this is a Koblitz curve (ABC curve).\r\n            @return true if this is a Koblitz curve (ABC curve), false otherwise\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.GetMu\">\r\n            Returns the parameter <code>&#956;</code> of the elliptic curve.\r\n            @return <code>&#956;</code> of the elliptic curve.\r\n            @throws ArgumentException if the given ECCurve is not a\r\n            Koblitz curve.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.GetSi\">\r\n            @return the auxiliary values <code>s<sub>0</sub></code> and\r\n            <code>s<sub>1</sub></code> used for partial modular reduction for\r\n            Koblitz curves.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.solveQuadradicEquation(Org.BouncyCastle.Math.EC.ECFieldElement)\">\r\n             Solves a quadratic equation <code>z<sup>2</sup> + z = beta</code>(X9.62\r\n             D.1.6) The other solution is <code>z + 1</code>.\r\n            \r\n             @param beta\r\n                        The value to solve the qradratic equation for.\r\n             @return the solution for <code>z<sup>2</sup> + z = beta</code> or\r\n                     <code>null</code> if no solution exists.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mCurve.IsTrinomial\">\r\n             Return true if curve uses a Trinomial basis.\r\n            \r\n             @return true if curve Trinomial, false otherwise.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.FpFieldElement.FieldName\">\r\n             return the field name for this field.\r\n            \r\n             @return the string \"Fp\".\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.FpFieldElement.Sqrt\">\r\n            return a sqrt root - the routine verifies that the calculation\r\n            returns the right value - if none exists it returns null.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.F2mFieldElement\">\r\n            Class representing the Elements of the finite field\r\n            <code>F<sub>2<sup>m</sup></sub></code> in polynomial basis (PB)\r\n            representation. Both trinomial (Tpb) and pentanomial (Ppb) polynomial\r\n            basis representations are supported. Gaussian normal basis (GNB)\r\n            representation is not supported.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.Gnb\">\r\n            Indicates gaussian normal basis representation (GNB). Number chosen\r\n            according to X9.62. GNB is not implemented at present.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.Tpb\">\r\n            Indicates trinomial basis representation (Tpb). Number chosen\r\n            according to X9.62.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.Ppb\">\r\n            Indicates pentanomial basis representation (Ppb). Number chosen\r\n            according to X9.62.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.representation\">\r\n            Tpb or Ppb.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.m\">\r\n            The exponent <code>m</code> of <code>F<sub>2<sup>m</sup></sub></code>.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.k1\">\r\n            Tpb: The integer <code>k</code> where <code>x<sup>m</sup> +\r\n            x<sup>k</sup> + 1</code> represents the reduction polynomial\r\n            <code>f(z)</code>.<br/>\r\n            Ppb: The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.k2\">\r\n            Tpb: Always set to <code>0</code><br/>\r\n            Ppb: The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.k3\">\r\n            Tpb: Always set to <code>0</code><br/>\r\n            Ppb: The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.x\">\r\n            The <code>IntArray</code> holding the bits.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.F2mFieldElement.t\">\r\n            The number of <code>int</code>s required to hold <code>m</code> bits.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mFieldElement.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for Ppb.\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.\r\n            @param x The BigInteger representing the value of the field element.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mFieldElement.#ctor(System.Int32,System.Int32,Org.BouncyCastle.Math.BigInteger)\">\r\n            Constructor for Tpb.\r\n            @param m  The exponent <code>m</code> of\r\n            <code>F<sub>2<sup>m</sup></sub></code>.\r\n            @param k The integer <code>k</code> where <code>x<sup>m</sup> +\r\n            x<sup>k</sup> + 1</code> represents the reduction\r\n            polynomial <code>f(z)</code>.\r\n            @param x The BigInteger representing the value of the field element.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mFieldElement.CheckFieldElements(Org.BouncyCastle.Math.EC.ECFieldElement,Org.BouncyCastle.Math.EC.ECFieldElement)\">\r\n            Checks, if the ECFieldElements <code>a</code> and <code>b</code>\r\n            are elements of the same field <code>F<sub>2<sup>m</sup></sub></code>\r\n            (having the same representation).\r\n            @param a field element.\r\n            @param b field element to be compared.\r\n            @throws ArgumentException if <code>a</code> and <code>b</code>\r\n            are not elements of the same field\r\n            <code>F<sub>2<sup>m</sup></sub></code> (having the same\r\n            representation).\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.F2mFieldElement.Representation\">\r\n            @return the representation of the field\r\n            <code>F<sub>2<sup>m</sup></sub></code>, either of\r\n            {@link F2mFieldElement.Tpb} (trinomial\r\n            basis representation) or\r\n            {@link F2mFieldElement.Ppb} (pentanomial\r\n            basis representation).\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.F2mFieldElement.M\">\r\n            @return the degree <code>m</code> of the reduction polynomial\r\n            <code>f(z)</code>.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.F2mFieldElement.K1\">\r\n            @return Tpb: The integer <code>k</code> where <code>x<sup>m</sup> +\r\n            x<sup>k</sup> + 1</code> represents the reduction polynomial\r\n            <code>f(z)</code>.<br/>\r\n            Ppb: The integer <code>k1</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.F2mFieldElement.K2\">\r\n            @return Tpb: Always returns <code>0</code><br/>\r\n            Ppb: The integer <code>k2</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Math.EC.F2mFieldElement.K3\">\r\n            @return Tpb: Always set to <code>0</code><br/>\r\n            Ppb: The integer <code>k3</code> where <code>x<sup>m</sup> +\r\n            x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>\r\n            represents the reduction polynomial <code>f(z)</code>.<br/>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.ECPoint\">\r\n            base class for points on elliptic curves.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.ECPoint.SetPreCompInfo(Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            Sets the <code>PreCompInfo</code>. Used by <code>ECMultiplier</code>s\r\n            to save the precomputation for this <code>ECPoint</code> to store the\r\n            precomputation result for use by subsequent multiplication.\r\n            @param preCompInfo The values precomputed by the\r\n            <code>ECMultiplier</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.ECPoint.AssertECMultiplier\">\r\n            Sets the appropriate <code>ECMultiplier</code>, unless already set. \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.ECPointBase.GetEncoded(System.Boolean)\">\r\n            return the field element encoded with point compression. (S 4.3.6)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.ECPointBase.Multiply(Org.BouncyCastle.Math.BigInteger)\">\r\n            Multiplies this <code>ECPoint</code> by the given number.\r\n            @param k The multiplicator.\r\n            @return <code>k * this</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.FpPoint\">\r\n            Elliptic curve points over Fp\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.FpPoint.#ctor(Org.BouncyCastle.Math.EC.ECCurve,Org.BouncyCastle.Math.EC.ECFieldElement,Org.BouncyCastle.Math.EC.ECFieldElement)\">\r\n             Create a point which encodes with point compression.\r\n            \r\n             @param curve the curve to use\r\n             @param x affine x co-ordinate\r\n             @param y affine y co-ordinate\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.FpPoint.#ctor(Org.BouncyCastle.Math.EC.ECCurve,Org.BouncyCastle.Math.EC.ECFieldElement,Org.BouncyCastle.Math.EC.ECFieldElement,System.Boolean)\">\r\n             Create a point that encodes with or without point compresion.\r\n            \r\n             @param curve the curve to use\r\n             @param x affine x co-ordinate\r\n             @param y affine y co-ordinate\r\n             @param withCompression if true encode with point compression\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.FpPoint.AssertECMultiplier\">\r\n            Sets the default <code>ECMultiplier</code>, unless already set. \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.F2mPoint\">\r\n            Elliptic curve points over F2m\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.#ctor(Org.BouncyCastle.Math.EC.ECCurve,Org.BouncyCastle.Math.EC.ECFieldElement,Org.BouncyCastle.Math.EC.ECFieldElement)\">\r\n            @param curve base curve\r\n            @param x x point\r\n            @param y y point\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.#ctor(Org.BouncyCastle.Math.EC.ECCurve,Org.BouncyCastle.Math.EC.ECFieldElement,Org.BouncyCastle.Math.EC.ECFieldElement,System.Boolean)\">\r\n            @param curve base curve\r\n            @param x x point\r\n            @param y y point\r\n            @param withCompression true if encode with point compression.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.#ctor(Org.BouncyCastle.Math.EC.ECCurve)\">\r\n            Constructor for point at infinity\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.CheckPoints(Org.BouncyCastle.Math.EC.ECPoint,Org.BouncyCastle.Math.EC.ECPoint)\">\r\n            Check, if two <code>ECPoint</code>s can be added or subtracted.\r\n            @param a The first <code>ECPoint</code> to check.\r\n            @param b The second <code>ECPoint</code> to check.\r\n            @throws IllegalArgumentException if <code>a</code> and <code>b</code>\r\n            cannot be added.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.AddSimple(Org.BouncyCastle.Math.EC.F2mPoint)\">\r\n            Adds another <code>ECPoints.F2m</code> to <code>this</code> without\r\n            checking if both points are on the same curve. Used by multiplication\r\n            algorithms, because there all points are a multiple of the same point\r\n            and hence the checks can be omitted.\r\n            @param b The other <code>ECPoints.F2m</code> to add to\r\n            <code>this</code>.\r\n            @return <code>this + b</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.SubtractSimple(Org.BouncyCastle.Math.EC.F2mPoint)\">\r\n            Subtracts another <code>ECPoints.F2m</code> from <code>this</code>\r\n            without checking if both points are on the same curve. Used by\r\n            multiplication algorithms, because there all points are a multiple\r\n            of the same point and hence the checks can be omitted.\r\n            @param b The other <code>ECPoints.F2m</code> to subtract from\r\n            <code>this</code>.\r\n            @return <code>this - b</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.F2mPoint.AssertECMultiplier\">\r\n            Sets the appropriate <code>ECMultiplier</code>, unless already set. \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.ECMultiplier\">\r\n            Interface for classes encapsulating a point multiplication algorithm\r\n            for <code>ECPoint</code>s.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.ECMultiplier.Multiply(Org.BouncyCastle.Math.EC.ECPoint,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            Multiplies the <code>ECPoint p</code> by <code>k</code>, i.e.\r\n            <code>p</code> is added <code>k</code> times to itself.\r\n            @param p The <code>ECPoint</code> to be multiplied.\r\n            @param k The factor by which <code>p</code> i multiplied.\r\n            @return <code>p</code> multiplied by <code>k</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.FpNafMultiplier\">\r\n            Class implementing the NAF (Non-Adjacent Form) multiplication algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.FpNafMultiplier.Multiply(Org.BouncyCastle.Math.EC.ECPoint,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            D.3.2 pg 101\r\n            @see org.bouncycastle.math.ec.multiplier.ECMultiplier#multiply(org.bouncycastle.math.ec.ECPoint, java.math.BigInteger)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo\">\r\n            Interface for classes storing precomputation data for multiplication\r\n            algorithms. Used as a Memento (see GOF patterns) for\r\n            <code>WNafMultiplier</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.ReferenceMultiplier.Multiply(Org.BouncyCastle.Math.EC.ECPoint,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            Simple shift-and-add multiplication. Serves as reference implementation\r\n            to verify (possibly faster) implementations in\r\n            {@link org.bouncycastle.math.ec.ECPoint ECPoint}.\r\n            \r\n            @param p The point to multiply.\r\n            @param k The factor by which to multiply.\r\n            @return The result of the point multiplication <code>k * p</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.WNafMultiplier\">\r\n            Class implementing the WNAF (Window Non-Adjacent Form) multiplication\r\n            algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WNafMultiplier.WindowNaf(System.SByte,Org.BouncyCastle.Math.BigInteger)\">\r\n            Computes the Window NAF (non-adjacent Form) of an integer.\r\n            @param width The width <code>w</code> of the Window NAF. The width is\r\n            defined as the minimal number <code>w</code>, such that for any\r\n            <code>w</code> consecutive digits in the resulting representation, at\r\n            most one is non-zero.\r\n            @param k The integer of which the Window NAF is computed.\r\n            @return The Window NAF of the given width, such that the following holds:\r\n            <code>k = &#8722;<sub>i=0</sub><sup>l-1</sup> k<sub>i</sub>2<sup>i</sup>\r\n            </code>, where the <code>k<sub>i</sub></code> denote the elements of the\r\n            returned <code>sbyte[]</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WNafMultiplier.Multiply(Org.BouncyCastle.Math.EC.ECPoint,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            Multiplies <code>this</code> by an integer <code>k</code> using the\r\n            Window NAF method.\r\n            @param k The integer by which <code>this</code> is multiplied.\r\n            @return A new <code>ECPoint</code> which equals <code>this</code>\r\n            multiplied by <code>k</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.WNafPreCompInfo\">\r\n            Class holding precomputation data for the WNAF (Window Non-Adjacent Form)\r\n            algorithm.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Multiplier.WNafPreCompInfo.preComp\">\r\n            Array holding the precomputed <code>ECPoint</code>s used for the Window\r\n            NAF multiplication in <code>\r\n            {@link org.bouncycastle.math.ec.multiplier.WNafMultiplier.multiply()\r\n            WNafMultiplier.multiply()}</code>.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Multiplier.WNafPreCompInfo.twiceP\">\r\n            Holds an <code>ECPoint</code> representing twice(this). Used for the\r\n            Window NAF multiplication in <code>\r\n            {@link org.bouncycastle.math.ec.multiplier.WNafMultiplier.multiply()\r\n            WNafMultiplier.multiply()}</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.WTauNafMultiplier\">\r\n            Class implementing the WTNAF (Window\r\n            <code>&#964;</code>-adic Non-Adjacent Form) algorithm.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WTauNafMultiplier.Multiply(Org.BouncyCastle.Math.EC.ECPoint,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint}\r\n            by <code>k</code> using the reduced <code>&#964;</code>-adic NAF (RTNAF)\r\n            method.\r\n            @param p The F2mPoint to multiply.\r\n            @param k The integer by which to multiply <code>k</code>.\r\n            @return <code>p</code> multiplied by <code>k</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WTauNafMultiplier.MultiplyWTnaf(Org.BouncyCastle.Math.EC.F2mPoint,Org.BouncyCastle.Math.EC.Abc.ZTauElement,Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo,System.SByte,System.SByte)\">\r\n            Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint}\r\n            by an element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code> using\r\n            the <code>&#964;</code>-adic NAF (TNAF) method.\r\n            @param p The F2mPoint to multiply.\r\n            @param lambda The element <code>&#955;</code> of\r\n            <code><b>Z</b>[&#964;]</code> of which to compute the\r\n            <code>[&#964;]</code>-adic NAF.\r\n            @return <code>p</code> multiplied by <code>&#955;</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WTauNafMultiplier.MultiplyFromWTnaf(Org.BouncyCastle.Math.EC.F2mPoint,System.SByte[],Org.BouncyCastle.Math.EC.Multiplier.PreCompInfo)\">\r\n            Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint}\r\n            by an element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>\r\n            using the window <code>&#964;</code>-adic NAF (TNAF) method, given the\r\n            WTNAF of <code>&#955;</code>.\r\n            @param p The F2mPoint to multiply.\r\n            @param u The the WTNAF of <code>&#955;</code>..\r\n            @return <code>&#955; * p</code>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Math.EC.Multiplier.WTauNafPreCompInfo\">\r\n            Class holding precomputation data for the WTNAF (Window\r\n            <code>&#964;</code>-adic Non-Adjacent Form) algorithm.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Math.EC.Multiplier.WTauNafPreCompInfo.preComp\">\r\n            Array holding the precomputed <code>F2mPoint</code>s used for the\r\n            WTNAF multiplication in <code>\r\n            {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply()\r\n            WTauNafMultiplier.multiply()}</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WTauNafPreCompInfo.#ctor(Org.BouncyCastle.Math.EC.F2mPoint[])\">\r\n            Constructor for <code>WTauNafPreCompInfo</code>\r\n            @param preComp Array holding the precomputed <code>F2mPoint</code>s\r\n            used for the WTNAF multiplication in <code>\r\n            {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply()\r\n            WTauNafMultiplier.multiply()}</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Math.EC.Multiplier.WTauNafPreCompInfo.GetPreComp\">\r\n            @return the array holding the precomputed <code>F2mPoint</code>s\r\n            used for the WTNAF multiplication in <code>\r\n            {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply()\r\n            WTauNafMultiplier.multiply()}</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.BasicOcspResp\">\r\n            <remarks>\r\n            <code>\r\n            BasicOcspResponse ::= SEQUENCE {\r\n            \ttbsResponseData\t\tResponseData,\r\n            \tsignatureAlgorithm\tAlgorithmIdentifier,\r\n            \tsignature\t\t\tBIT STRING,\r\n            \tcerts\t\t\t\t[0] EXPLICIT SEQUENCE OF Certificate OPTIONAL\r\n            }\r\n            </code>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspResp.GetTbsResponseData\">\r\n            <returns>The DER encoding of the tbsResponseData field.</returns>\r\n            <exception cref=\"T:Org.BouncyCastle.Ocsp.OcspException\">In the event of an encoding error.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspResp.GetCertificates(System.String)\">\r\n            <returns>The certificates, if any, associated with the response.</returns>\r\n            <exception cref=\"T:Org.BouncyCastle.Ocsp.OcspException\">In the event of an encoding error.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspResp.Verify(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Verify the signature against the tbsResponseData object we contain.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspResp.GetEncoded\">\r\n            <returns>The ASN.1 encoded representation of this object.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator\">\r\n            Generator for basic OCSP response objects.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.#ctor(Org.BouncyCastle.Ocsp.RespID)\">\r\n            basic constructor\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            construct with the responderID to be the SHA-1 keyHash of the passed in public key.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.AddResponse(Org.BouncyCastle.Ocsp.CertificateID,Org.BouncyCastle.Ocsp.CertificateStatus)\">\r\n             Add a response for a particular Certificate ID.\r\n            \r\n             @param certID certificate ID details\r\n             @param certStatus status of the certificate - null if okay\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.AddResponse(Org.BouncyCastle.Ocsp.CertificateID,Org.BouncyCastle.Ocsp.CertificateStatus,Org.BouncyCastle.Asn1.X509.X509Extensions)\">\r\n             Add a response for a particular Certificate ID.\r\n            \r\n             @param certID certificate ID details\r\n             @param certStatus status of the certificate - null if okay\r\n             @param singleExtensions optional extensions\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.AddResponse(Org.BouncyCastle.Ocsp.CertificateID,Org.BouncyCastle.Ocsp.CertificateStatus,System.DateTime,Org.BouncyCastle.Asn1.X509.X509Extensions)\">\r\n             Add a response for a particular Certificate ID.\r\n            \r\n             @param certID certificate ID details\r\n             @param nextUpdate date when next update should be requested\r\n             @param certStatus status of the certificate - null if okay\r\n             @param singleExtensions optional extensions\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.AddResponse(Org.BouncyCastle.Ocsp.CertificateID,Org.BouncyCastle.Ocsp.CertificateStatus,System.DateTime,System.DateTime,Org.BouncyCastle.Asn1.X509.X509Extensions)\">\r\n             Add a response for a particular Certificate ID.\r\n            \r\n             @param certID certificate ID details\r\n             @param thisUpdate date this response was valid on\r\n             @param nextUpdate date when next update should be requested\r\n             @param certStatus status of the certificate - null if okay\r\n             @param singleExtensions optional extensions\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.SetResponseExtensions(Org.BouncyCastle.Asn1.X509.X509Extensions)\">\r\n             Set the extensions for the response.\r\n            \r\n             @param responseExtensions the extension object to carry.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.BasicOcspRespGenerator.SignatureAlgNames\">\r\n             Return an IEnumerable of the signature names supported by the generator.\r\n            \r\n             @return an IEnumerable containing recognised names.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.CertificateID.#ctor(System.String,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Math.BigInteger)\">\r\n            create from an issuer certificate and the serial number of the\r\n            certificate it signed.\r\n            @exception OcspException if any problems occur creating the id fields.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.CertificateID.SerialNumber\">\r\n            return the serial number for the certificate associated\r\n            with this request.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.CertificateID.DeriveCertificateID(Org.BouncyCastle.Ocsp.CertificateID,Org.BouncyCastle.Math.BigInteger)\">\r\n             Create a new CertificateID for a new serial number derived from a previous one\r\n             calculated for the same CA certificate.\r\n            \r\n             @param original the previously calculated CertificateID for the CA.\r\n             @param newSerialNumber the serial number for the new certificate of interest.\r\n            \r\n             @return a new CertificateID for newSerialNumber\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.OcspReq\">\r\n             <pre>\r\n             OcspRequest     ::=     SEQUENCE {\r\n                   tbsRequest                  TBSRequest,\r\n                   optionalSignature   [0]     EXPLICIT Signature OPTIONAL }\r\n            \r\n               TBSRequest      ::=     SEQUENCE {\r\n                   version             [0]     EXPLICIT Version DEFAULT v1,\r\n                   requestorName       [1]     EXPLICIT GeneralName OPTIONAL,\r\n                   requestList                 SEQUENCE OF Request,\r\n                   requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }\r\n            \r\n               Signature       ::=     SEQUENCE {\r\n                   signatureAlgorithm      AlgorithmIdentifier,\r\n                   signature               BIT STRING,\r\n                   certs               [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL}\r\n            \r\n               Version         ::=             INTEGER  {  v1(0) }\r\n            \r\n               Request         ::=     SEQUENCE {\r\n                   reqCert                     CertID,\r\n                   singleRequestExtensions     [0] EXPLICIT Extensions OPTIONAL }\r\n            \r\n               CertID          ::=     SEQUENCE {\r\n                   hashAlgorithm       AlgorithmIdentifier,\r\n                   issuerNameHash      OCTET STRING, -- Hash of Issuer's DN\r\n                   issuerKeyHash       OCTET STRING, -- Hash of Issuers public key\r\n                   serialNumber        CertificateSerialNumber }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReq.GetTbsRequest\">\r\n            Return the DER encoding of the tbsRequest field.\r\n            @return DER encoding of tbsRequest\r\n            @throws OcspException in the event of an encoding error.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.OcspReq.SignatureAlgOid\">\r\n            return the object identifier representing the signature algorithm\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReq.GetCertificates(System.String)\">\r\n             If the request is signed return a possibly empty CertStore containing the certificates in the\r\n             request. If the request is not signed the method returns null.\r\n            \r\n             @return null if not signed, a CertStore otherwise\r\n             @throws OcspException\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.OcspReq.IsSigned\">\r\n             Return whether or not this request is signed.\r\n            \r\n             @return true if signed false otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReq.Verify(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            Verify the signature against the TBSRequest object we contain.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReq.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReqGenerator.AddRequest(Org.BouncyCastle.Ocsp.CertificateID)\">\r\n             Add a request for the given CertificateID.\r\n            \r\n             @param certId certificate ID of interest\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReqGenerator.AddRequest(Org.BouncyCastle.Ocsp.CertificateID,Org.BouncyCastle.Asn1.X509.X509Extensions)\">\r\n             Add a request with extensions\r\n            \r\n             @param certId certificate ID of interest\r\n             @param singleRequestExtensions the extensions to attach to the request\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReqGenerator.SetRequestorName(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n             Set the requestor name to the passed in X509Principal\r\n            \r\n             @param requestorName a X509Principal representing the requestor name.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspReqGenerator.Generate\">\r\n             Generate an unsigned request\r\n            \r\n             @return the OcspReq\r\n             @throws OcspException\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.OcspReqGenerator.SignatureAlgNames\">\r\n             Return an IEnumerable of the signature names supported by the generator.\r\n            \r\n             @return an IEnumerable containing recognised names.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.OcspResp.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.OCSPRespGenerator\">\r\n            base generator for an OCSP response - at the moment this only supports the\r\n            generation of responses containing BasicOCSP responses.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Ocsp.OcspRespStatus.Successful\">\r\n            note 4 is not used.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.RespID\">\r\n            Carrier for a ResponderID.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.RevokedStatus\">\r\n            wrapper for the RevokedInfo object\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.RevokedStatus.RevocationReason\">\r\n            return the revocation reason. Note: this field is optional, test for it\r\n            with hasRevocationReason() first.\r\n            @exception InvalidOperationException if a reason is asked for and none is avaliable\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Ocsp.SingleResp.GetCertStatus\">\r\n             Return the status object for the response - null indicates good.\r\n            \r\n             @return the status object for the response, null if it is good.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Ocsp.SingleResp.NextUpdate\">\r\n             return the NextUpdate value - note: this is an optional field so may\r\n             be returned as null.\r\n            \r\n             @return nextUpdate, or null if not present.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Ocsp.UnknownStatus\">\r\n            wrapper for the UnknownInfo object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.AgreementUtilities\">\r\n            <remarks>\r\n             Utility class for creating IBasicAgreement objects from their names/Oids\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.CipherUtilities\">\r\n            <remarks>\r\n             Cipher Utility class contains methods that can not be specifically grouped into other classes.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.CipherUtilities.GetObjectIdentifier(System.String)\">\r\n            <summary>\r\n            Returns a ObjectIdentifier for a give encoding.\r\n            </summary>\r\n            <param name=\"mechanism\">A string representation of the encoding.</param>\r\n            <returns>A DerObjectIdentifier, null if the Oid is not available.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.DigestUtilities\">\r\n            <remarks>\r\n             Utility class for creating IDigest objects from their names/Oids\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.DigestUtilities.GetObjectIdentifier(System.String)\">\r\n            <summary>\r\n            Returns a ObjectIdentifier for a given digest mechanism.\r\n            </summary>\r\n            <param name=\"mechanism\">A string representation of the digest meanism.</param>\r\n            <returns>A DerObjectIdentifier, null if the Oid is not available.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.DotNetUtilities\">\r\n            <summary>\r\n            A class containing methods to interface the BouncyCastle world to the .NET Crypto world.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.DotNetUtilities.ToX509Certificate(Org.BouncyCastle.Asn1.X509.X509CertificateStructure)\">\r\n            <summary>\r\n            Create an System.Security.Cryptography.X509Certificate from an X509Certificate Structure.\r\n            </summary>\r\n            <param name=\"x509Struct\"></param>\r\n            <returns>A System.Security.Cryptography.X509Certificate.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.MacUtilities\">\r\n            <remarks>\r\n             Utility class for creating HMac object from their names/Oids\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.PbeUtilities\">\r\n             <summary>\r\n            \r\n             </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.PbeUtilities.GetObjectIdentifier(System.String)\">\r\n            <summary>\r\n            Returns a ObjectIdentifier for a give encoding.\r\n            </summary>\r\n            <param name=\"mechanism\">A string representation of the encoding.</param>\r\n            <returns>A DerObjectIdentifier, null if the Oid is not available.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.SecureRandom.#ctor(Org.BouncyCastle.Crypto.Prng.IRandomGenerator)\">\r\n            <summary>Use the specified instance of IRandomGenerator as random source.</summary>\r\n            <remarks>\r\n            This constructor performs no seeding of either the <c>IRandomGenerator</c> or the\r\n            constructed <c>SecureRandom</c>. It is the responsibility of the client to provide\r\n            proper seed material as necessary/appropriate for the given <c>IRandomGenerator</c>\r\n            implementation.\r\n            </remarks>\r\n            <param name=\"generator\">The source to generate all random bytes from.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.SecurityUtilityException.#ctor\">\r\n            base constructor.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.SecurityUtilityException.#ctor(System.String)\">\r\n             create a SecurityUtilityException with the given message.\r\n            \r\n             @param message the message to be carried with the exception.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.SignerUtilities\">\r\n            <summary>\r\n             Signer Utility class contains methods that can not be specifically grouped into other classes.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Security.SignerUtilities.GetObjectIdentifier(System.String)\">\r\n            <summary>\r\n            Returns a ObjectIdentifier for a give encoding.\r\n            </summary>\r\n            <param name=\"mechanism\">A string representation of the encoding.</param>\r\n            <returns>A DerObjectIdentifier, null if the Oid is not available.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Security.WrapperUtilities\">\r\n            <remarks>\r\n             Utility class for creating IWrapper objects from their names/Oids\r\n            </remarks>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.OpenSsl.PemReader\">\r\n            Class for reading OpenSSL PEM encoded streams containing \r\n            X509 certificates, PKCS8 encoded keys and PKCS7 objects.\r\n            <p>\r\n            In the case of PKCS7 objects the reader will return a CMS ContentInfo object. Keys and\r\n            Certificates will be returned using the appropriate java.security type.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.#ctor(System.IO.TextReader)\">\r\n             Create a new PemReader\r\n            \r\n             @param reader the Reader\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.#ctor(System.IO.TextReader,Org.BouncyCastle.OpenSsl.IPasswordFinder)\">\r\n             Create a new PemReader with a password finder\r\n            \r\n             @param reader the Reader\r\n             @param pFinder the password finder\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.ReadCertificate(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n             Reads in a X509Certificate.\r\n            \r\n             @return the X509Certificate\r\n             @throws IOException if an I/O error occured\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.ReadCrl(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n             Reads in a X509CRL.\r\n            \r\n             @return the X509Certificate\r\n             @throws IOException if an I/O error occured\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.ReadCertificateRequest(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n             Reads in a PKCS10 certification request.\r\n            \r\n             @return the certificate request.\r\n             @throws IOException if an I/O error occured\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.ReadAttributeCertificate(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n             Reads in a X509 Attribute Certificate.\r\n            \r\n             @return the X509 Attribute Certificate\r\n             @throws IOException if an I/O error occured\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.ReadPkcs7(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n             Reads in a PKCS7 object. This returns a ContentInfo object suitable for use with the CMS\r\n             API.\r\n            \r\n             @return the X509Certificate\r\n             @throws IOException if an I/O error occured\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemReader.ReadPrivateKey(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n            Read a Key Pair\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.OpenSsl.PemWriter\">\r\n            <remarks>General purpose writer for OpenSSL PEM objects.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.PemWriter.#ctor(System.IO.TextWriter)\">\r\n            <param name=\"writer\">The TextWriter object to write the output to.</param>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.OpenSsl.MiscPemGenerator\">\r\n            PEM generator for the original set of PEM objects used in Open SSL.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.Pkcs8Generator.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n             Constructor for an unencrypted private key PEM object.\r\n            \r\n             @param key private key to be encoded.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.OpenSsl.Pkcs8Generator.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.String)\">\r\n             Constructor for an encrypted private key PEM object.\r\n            \r\n             @param key       private key to be encoded\r\n             @param algorithm encryption algorithm to use\r\n             @param provider  provider to use\r\n             @throws NoSuchAlgorithmException if algorithm/mode cannot be found\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest\">\r\n             <remarks>\r\n             A class for verifying and creating Pkcs10 Certification requests.\r\n             </remarks>\r\n             <code>\r\n             CertificationRequest ::= Sequence {\r\n               certificationRequestInfo  CertificationRequestInfo,\r\n               signatureAlgorithm        AlgorithmIdentifier{{ SignatureAlgorithms }},\r\n               signature                 BIT STRING\r\n             }\r\n            \r\n             CertificationRequestInfo ::= Sequence {\r\n               version             Integer { v1(0) } (v1,...),\r\n               subject             Name,\r\n               subjectPKInfo   SubjectPublicKeyInfo{{ PKInfoAlgorithms }},\r\n               attributes          [0] Attributes{{ CRIAttributes }}\r\n              }\r\n            \r\n              Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}\r\n            \r\n              Attr { ATTRIBUTE:IOSet } ::= Sequence {\r\n                type    ATTRIBUTE.&amp;id({IOSet}),\r\n                values  Set SIZE(1..MAX) OF ATTRIBUTE.&amp;Type({IOSet}{\\@type})\r\n              }\r\n             </code>\r\n             see <a href=\"http://www.rsasecurity.com/rsalabs/node.asp?id=2132\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest.#ctor(System.String,Org.BouncyCastle.Asn1.X509.X509Name,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Asn1.Asn1Set,Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n             <summary>\r\n             Instantiate a Pkcs10CertificationRequest object with the necessary credentials.\r\n             </summary>\r\n            <param name=\"signatureAlgorithm\">Name of Sig Alg.</param>\r\n             <param name=\"subject\">X509Name of subject eg OU=\"My unit.\" O=\"My Organisatioin\" C=\"au\" </param>\r\n             <param name=\"publicKey\">Public Key to be included in cert reqest.</param>\r\n             <param name=\"attributes\">ASN1Set of Attributes.</param>\r\n             <param name=\"signingKey\">Matching Private key for nominated (above) public key to be used to sign the request.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest.GetPublicKey\">\r\n            <summary>\r\n            Get the public key.\r\n            </summary>\r\n            <returns>The public key.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest.Verify\">\r\n            <summary>\r\n            Verify Pkcs10 Cert Request is valid.\r\n            </summary>\r\n            <returns>true = valid.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequestDelaySigned\">\r\n             <remarks>\r\n             A class for creating and verifying Pkcs10 Certification requests (this is an extension on <see cref=\"T:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest\"/>).\r\n             The requests are made using delay signing. This is useful for situations where\r\n             the private key is in another environment and not directly accessible (e.g. HSM)\r\n             So the first step creates the request, then the signing is done outside this\r\n             object and the signature is then used to complete the request.\r\n             </remarks>\r\n             <code>\r\n             CertificationRequest ::= Sequence {\r\n               certificationRequestInfo  CertificationRequestInfo,\r\n               signatureAlgorithm        AlgorithmIdentifier{{ SignatureAlgorithms }},\r\n               signature                 BIT STRING\r\n             }\r\n            \r\n             CertificationRequestInfo ::= Sequence {\r\n               version             Integer { v1(0) } (v1,...),\r\n               subject             Name,\r\n               subjectPKInfo   SubjectPublicKeyInfo{{ PKInfoAlgorithms }},\r\n               attributes          [0] Attributes{{ CRIAttributes }}\r\n              }\r\n            \r\n              Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}\r\n            \r\n              Attr { ATTRIBUTE:IOSet } ::= Sequence {\r\n                type    ATTRIBUTE.&amp;id({IOSet}),\r\n                values  Set SIZE(1..MAX) OF ATTRIBUTE.&amp;Type({IOSet}{\\@type})\r\n              }\r\n             </code>\r\n             see <a href=\"http://www.rsasecurity.com/rsalabs/node.asp?id=2132\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequestDelaySigned.#ctor(System.String,Org.BouncyCastle.Asn1.X509.X509Name,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Asn1.Asn1Set)\">\r\n            <summary>\r\n            Instantiate a Pkcs10CertificationRequest object with the necessary credentials.\r\n            </summary>\r\n            <param name=\"signatureAlgorithm\">Name of Sig Alg.</param>\r\n            <param name=\"subject\">X509Name of subject eg OU=\"My unit.\" O=\"My Organisatioin\" C=\"au\" </param>\r\n            <param name=\"publicKey\">Public Key to be included in cert reqest.</param>\r\n            <param name=\"attributes\">ASN1Set of Attributes.</param>\r\n            <remarks>\r\n            After the object is constructed use the <see cref=\"M:Org.BouncyCastle.Pkcs.Pkcs10CertificationRequestDelaySigned.GetDataToSign\"/> and finally the\r\n            SignRequest methods to finalize the request.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs12Store.GetCertificate(System.String)\">\r\n            simply return the cert entry for the private key\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkcs.Pkcs12Utilities\">\r\n            Utility class for reencoding PKCS#12 files to definite length.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs12Utilities.ConvertToDefiniteLength(System.Byte[])\">\r\n             Just re-encode the outer layer of the PKCS#12 file to definite length encoding.\r\n            \r\n             @param berPKCS12File - original PKCS#12 file\r\n             @return a byte array representing the DER encoding of the PFX structure\r\n             @throws IOException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkcs.Pkcs12Utilities.ConvertToDefiniteLength(System.Byte[],System.Char[])\">\r\n             Re-encode the PKCS#12 structure to definite length encoding at the inner layer\r\n             as well, recomputing the MAC accordingly.\r\n            \r\n             @param berPKCS12File - original PKCS12 file.\r\n             @param provider - provider to use for MAC calculation.\r\n             @return a byte array representing the DER encoding of the PFX structure.\r\n             @throws IOException on parsing, encoding errors.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.CertStatus.RevocationDate\">\r\n            <summary>\r\n            Returns the revocationDate.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.CertStatus.Status\">\r\n            <summary>\r\n            Returns the certStatus.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixAttrCertChecker.GetSupportedExtensions\">\r\n            Returns an immutable <code>Set</code> of X.509 attribute certificate\r\n            extensions that this <code>PkixAttrCertChecker</code> supports or\r\n            <code>null</code> if no extensions are supported.\r\n            <p>\r\n            Each element of the set is a <code>String</code> representing the\r\n            Object Identifier (OID) of the X.509 extension that is supported.\r\n            </p>\r\n            <p>\r\n            All X.509 attribute certificate extensions that a\r\n            <code>PkixAttrCertChecker</code> might possibly be able to process\r\n            should be included in the set.\r\n            </p>\r\n            \r\n            @return an immutable <code>Set</code> of X.509 extension OIDs (in\r\n                    <code>String</code> format) supported by this\r\n                    <code>PkixAttrCertChecker</code>, or <code>null</code> if no\r\n                    extensions are supported\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixAttrCertChecker.Check(Org.BouncyCastle.X509.IX509AttributeCertificate,Org.BouncyCastle.Pkix.PkixCertPath,Org.BouncyCastle.Pkix.PkixCertPath,System.Collections.ICollection)\">\r\n            Performs checks on the specified attribute certificate. Every handled\r\n            extension is rmeoved from the <code>unresolvedCritExts</code>\r\n            collection.\r\n            \r\n            @param attrCert The attribute certificate to be checked.\r\n            @param certPath The certificate path which belongs to the attribute\r\n                       certificate issuer public key certificate.\r\n            @param holderCertPath The certificate path which belongs to the holder\r\n                       certificate.\r\n            @param unresolvedCritExts a <code>Collection</code> of OID strings\r\n                       representing the current set of unresolved critical extensions\r\n            @throws CertPathValidatorException if the specified attribute certificate\r\n                        does not pass the check.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixAttrCertChecker.Clone\">\r\n            Returns a clone of this object.\r\n            \r\n            @return a copy of this <code>PkixAttrCertChecker</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixAttrCertPathBuilder.Build(Org.BouncyCastle.Pkix.PkixBuilderParameters)\">\r\n             Build and validate a CertPath using the given parameter.\r\n            \r\n             @param params PKIXBuilderParameters object containing all information to\r\n                        build the CertPath\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixAttrCertPathValidator\">\r\n            CertPathValidatorSpi implementation for X.509 Attribute Certificates la RFC 3281.\r\n            \r\n            @see org.bouncycastle.x509.ExtendedPkixParameters\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixAttrCertPathValidator.Validate(Org.BouncyCastle.Pkix.PkixCertPath,Org.BouncyCastle.Pkix.PkixParameters)\">\r\n            Validates an attribute certificate with the given certificate path.\r\n            \r\n            <p>\r\n            <code>params</code> must be an instance of\r\n            <code>ExtendedPkixParameters</code>.\r\n            </p><p>\r\n            The target constraints in the <code>params</code> must be an\r\n            <code>X509AttrCertStoreSelector</code> with at least the attribute\r\n            certificate criterion set. Obey that also target informations may be\r\n            necessary to correctly validate this attribute certificate.\r\n            </p><p>\r\n            The attribute certificate issuer must be added to the trusted attribute\r\n            issuers with {@link ExtendedPkixParameters#setTrustedACIssuers(Set)}.\r\n            </p>\r\n            @param certPath The certificate path which belongs to the attribute\r\n                       certificate issuer public key certificate.\r\n            @param params The PKIX parameters.\r\n            @return A <code>PKIXCertPathValidatorResult</code> of the result of\r\n                    validating the <code>certPath</code>.\r\n            @throws InvalidAlgorithmParameterException if <code>params</code> is\r\n                        inappropriate for this validator.\r\n            @throws CertPathValidatorException if the verification fails.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixBuilderParameters\">\r\n            <summary>\r\n            Summary description for PkixBuilderParameters.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixBuilderParameters.GetInstance(Org.BouncyCastle.Pkix.PkixParameters)\">\r\n             Returns an instance of <code>PkixBuilderParameters</code>.\r\n             <p>\r\n             This method can be used to get a copy from other\r\n             <code>PKIXBuilderParameters</code>, <code>PKIXParameters</code>,\r\n             and <code>ExtendedPKIXParameters</code> instances.\r\n             </p>\r\n            \r\n             @param pkixParams The PKIX parameters to create a copy of.\r\n             @return An <code>PkixBuilderParameters</code> instance.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixBuilderParameters.GetExcludedCerts\">\r\n            <summary>\r\n            Excluded certificates are not used for building a certification path.\r\n            </summary>\r\n            <returns>the excluded certificates.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixBuilderParameters.SetExcludedCerts(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n            <summary>\r\n            Sets the excluded certificates which are not used for building a\r\n            certification path. If the <code>ISet</code> is <code>null</code> an\r\n            empty set is assumed.\r\n            </summary>\r\n            <remarks>\r\n            The given set is cloned to protect it against subsequent modifications.\r\n            </remarks>\r\n            <param name=\"excludedCerts\">The excluded certificates to set.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixBuilderParameters.SetParams(Org.BouncyCastle.Pkix.PkixParameters)\">\r\n            Can alse handle <code>ExtendedPKIXBuilderParameters</code> and\r\n            <code>PKIXBuilderParameters</code>.\r\n            \r\n            @param params Parameters to set.\r\n            @see org.bouncycastle.x509.ExtendedPKIXParameters#setParams(java.security.cert.PKIXParameters)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixBuilderParameters.Clone\">\r\n             Makes a copy of this <code>PKIXParameters</code> object. Changes to the\r\n             copy will not affect the original and vice versa.\r\n            \r\n             @return a copy of this <code>PKIXParameters</code> object\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPath\">\r\n             An immutable sequence of certificates (a certification path).<br />\r\n             <br />\r\n             This is an abstract class that defines the methods common to all CertPaths.\r\n             Subclasses can handle different kinds of certificates (X.509, PGP, etc.).<br />\r\n             <br />\r\n             All CertPath objects have a type, a list of Certificates, and one or more\r\n             supported encodings. Because the CertPath class is immutable, a CertPath\r\n             cannot change in any externally visible way after being constructed. This\r\n             stipulation applies to all public fields and methods of this class and any\r\n             added or overridden by subclasses.<br />\r\n             <br />\r\n             The type is a string that identifies the type of Certificates in the\r\n             certification path. For each certificate cert in a certification path\r\n             certPath, cert.getType().equals(certPath.getType()) must be true.<br />\r\n             <br />\r\n             The list of Certificates is an ordered List of zero or more Certificates.\r\n             This List and all of the Certificates contained in it must be immutable.<br />\r\n             <br />\r\n             Each CertPath object must support one or more encodings so that the object\r\n             can be translated into a byte array for storage or transmission to other\r\n             parties. Preferably, these encodings should be well-documented standards\r\n             (such as PKCS#7). One of the encodings supported by a CertPath is considered\r\n             the default encoding. This encoding is used if no encoding is explicitly\r\n             requested (for the {@link #getEncoded()} method, for instance).<br />\r\n             <br />\r\n             All CertPath objects are also Serializable. CertPath objects are resolved\r\n             into an alternate {@link CertPathRep} object during serialization. This\r\n             allows a CertPath object to be serialized into an equivalent representation\r\n             regardless of its underlying implementation.<br />\r\n             <br />\r\n             CertPath objects can be created with a CertificateFactory or they can be\r\n             returned by other classes, such as a CertPathBuilder.<br />\r\n             <br />\r\n             By convention, X.509 CertPaths (consisting of X509Certificates), are ordered\r\n             starting with the target certificate and ending with a certificate issued by\r\n             the trust anchor. That is, the issuer of one certificate is the subject of\r\n             the following one. The certificate representing the\r\n             {@link TrustAnchor TrustAnchor} should not be included in the certification\r\n             path. Unvalidated X.509 CertPaths may not follow these conventions. PKIX\r\n             CertPathValidators will detect any departure from these conventions that\r\n             cause the certification path to be invalid and throw a\r\n             CertPathValidatorException.<br />\r\n             <br />\r\n             <strong>Concurrent Access</strong><br />\r\n             <br />\r\n             All CertPath objects must be thread-safe. That is, multiple threads may\r\n             concurrently invoke the methods defined in this class on a single CertPath\r\n             object (or more than one) with no ill effects. This is also true for the List\r\n             returned by CertPath.getCertificates.<br />\r\n             <br />\r\n             Requiring CertPath objects to be immutable and thread-safe allows them to be\r\n             passed around to various pieces of code without worrying about coordinating\r\n             access. Providing this thread-safety is generally not difficult, since the\r\n             CertPath and List objects in question are immutable.\r\n            \r\n             @see CertificateFactory\r\n             @see CertPathBuilder\r\n            <summary>\r\n            CertPath implementation for X.509 certificates.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.SortCerts(System.Collections.IList)\">\r\n            @param certs\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.#ctor(System.Collections.ICollection)\">\r\n             Creates a CertPath of the specified type.\r\n             This constructor is protected because most users should use\r\n             a CertificateFactory to create CertPaths.\r\n             @param type the standard name of the type of Certificatesin this path\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.#ctor(System.IO.Stream,System.String)\">\r\n             Creates a CertPath of the specified type.\r\n             This constructor is protected because most users should use\r\n             a CertificateFactory to create CertPaths.\r\n            \r\n             @param type the standard name of the type of Certificatesin this path\r\n            \r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixCertPath.Encodings\">\r\n             Returns an iteration of the encodings supported by this\r\n             certification path, with the default encoding\r\n             first. Attempts to modify the returned Iterator via its\r\n             remove method result in an UnsupportedOperationException.\r\n            \r\n             @return an Iterator over the names of the supported encodings (as Strings)\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.Equals(System.Object)\">\r\n             Compares this certification path for equality with the specified object.\r\n             Two CertPaths are equal if and only if their types are equal and their\r\n             certificate Lists (and by implication the Certificates in those Lists)\r\n             are equal. A CertPath is never equal to an object that is not a CertPath.<br />\r\n             <br />\r\n             This algorithm is implemented by this method. If it is overridden, the\r\n             behavior specified here must be maintained.\r\n            \r\n             @param other\r\n                        the object to test for equality with this certification path\r\n            \r\n             @return true if the specified object is equal to this certification path,\r\n                     false otherwise\r\n            \r\n             @see Object#hashCode() Object.hashCode()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.GetEncoded\">\r\n             Returns the encoded form of this certification path, using\r\n             the default encoding.\r\n            \r\n             @return the encoded bytes\r\n             @exception CertificateEncodingException if an encoding error occurs\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.GetEncoded(System.String)\">\r\n             Returns the encoded form of this certification path, using\r\n             the specified encoding.\r\n            \r\n             @param encoding the name of the encoding to use\r\n             @return the encoded bytes\r\n             @exception CertificateEncodingException if an encoding error\r\n             occurs or the encoding requested is not supported\r\n            \r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixCertPath.Certificates\">\r\n            <summary>\r\n            Returns the list of certificates in this certification\r\n            path.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPath.ToAsn1Object(Org.BouncyCastle.X509.X509Certificate)\">\r\n             Return a DERObject containing the encoded certificate.\r\n            \r\n             @param cert the X509Certificate object to be encoded\r\n            \r\n             @return the DERObject\r\n            \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathBuilder\">\r\n             Implements the PKIX CertPathBuilding algorithm for BouncyCastle.\r\n            \r\n             @see CertPathBuilderSpi\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathBuilder.Build(Org.BouncyCastle.Pkix.PkixBuilderParameters)\">\r\n             Build and validate a CertPath using the given parameter.\r\n            \r\n             @param params PKIXBuilderParameters object containing all information to\r\n                        build the CertPath\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathBuilderException\">\r\n            <summary>\r\n            Summary description for PkixCertPathBuilderException.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathBuilderResult\">\r\n            <summary>\r\n            Summary description for PkixCertPathBuilderResult.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathChecker.Init(System.Boolean)\">\r\n                     * Initializes the internal state of this <code>PKIXCertPathChecker</code>.\r\n                     * <p>\r\n                     * The <code>forward</code> flag specifies the order that certificates\r\n                     * will be passed to the {@link #check check} method (forward or reverse). A\r\n                     * <code>PKIXCertPathChecker</code> <b>must</b> support reverse checking\r\n                     * and <b>may</b> support forward checking.\r\n            \t\t * </p>\r\n                     * \r\n                     * @param forward\r\n                     *            the order that certificates are presented to the\r\n                     *            <code>check</code> method. If <code>true</code>,\r\n                     *            certificates are presented from target to most-trusted CA\r\n                     *            (forward); if <code>false</code>, from most-trusted CA to\r\n                     *            target (reverse).\r\n                     * @exception CertPathValidatorException\r\n                     *                if this <code>PKIXCertPathChecker</code> is unable to\r\n                     *                check certificates in the specified order; it should never\r\n                     *                be thrown if the forward flag is false since reverse\r\n                     *                checking must be supported\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathChecker.IsForwardCheckingSupported\">\r\n            Indicates if forward checking is supported. Forward checking refers to\r\n            the ability of the <code>PKIXCertPathChecker</code> to perform its\r\n            checks when certificates are presented to the <code>check</code> method\r\n            in the forward direction (from target to most-trusted CA).\r\n            \r\n            @return <code>true</code> if forward checking is supported,\r\n                    <code>false</code> otherwise\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathChecker.GetSupportedExtensions\">\r\n                     * Returns an immutable <code>Set</code> of X.509 certificate extensions\r\n                     * that this <code>PKIXCertPathChecker</code> supports (i.e. recognizes,\r\n                     * is able to process), or <code>null</code> if no extensions are\r\n                     * supported.\r\n                     * <p>\r\n                     * Each element of the set is a <code>String</code> representing the\r\n                     * Object Identifier (OID) of the X.509 extension that is supported. The OID\r\n                     * is represented by a set of nonnegative integers separated by periods.\r\n                     * </p><p>\r\n                     * All X.509 certificate extensions that a <code>PKIXCertPathChecker</code>\r\n                     * might possibly be able to process should be included in the set.\r\n            \t\t * </p>\r\n                     * \r\n                     * @return an immutable <code>Set</code> of X.509 extension OIDs (in\r\n                     *         <code>String</code> format) supported by this\r\n                     *         <code>PKIXCertPathChecker</code>, or <code>null</code> if no\r\n                     *         extensions are supported\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathChecker.Check(Org.BouncyCastle.X509.X509Certificate,System.Collections.ICollection)\">\r\n            Performs the check(s) on the specified certificate using its internal\r\n            state and removes any critical extensions that it processes from the\r\n            specified collection of OID strings that represent the unresolved\r\n            critical extensions. The certificates are presented in the order\r\n            specified by the <code>init</code> method.\r\n            \r\n            @param cert\r\n                       the <code>Certificate</code> to be checked\r\n            @param unresolvedCritExts\r\n                       a <code>Collection</code> of OID strings representing the\r\n                       current set of unresolved critical extensions\r\n            @exception CertPathValidatorException\r\n                           if the specified certificate does not pass the check\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathChecker.Clone\">\r\n            Returns a clone of this object. Calls the <code>Object.clone()</code>\r\n            method. All subclasses which maintain state must support and override\r\n            this method, if necessary.\r\n            \r\n            @return a copy of this <code>PKIXCertPathChecker</code>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathValidator\">\r\n            The <i>Service Provider Interface</i> (<b>SPI</b>)\r\n            for the {@link CertPathValidator CertPathValidator} class. All\r\n            <code>CertPathValidator</code> implementations must include a class (the\r\n            SPI class) that extends this class (<code>CertPathValidatorSpi</code>)\r\n            and implements all of its methods. In general, instances of this class\r\n            should only be accessed through the <code>CertPathValidator</code> class.\r\n            For details, see the Java Cryptography Architecture.<br />\r\n            <br />\r\n            <b>Concurrent Access</b><br />\r\n            <br />\r\n            Instances of this class need not be protected against concurrent\r\n            access from multiple threads. Threads that need to access a single\r\n            <code>CertPathValidatorSpi</code> instance concurrently should synchronize\r\n            amongst themselves and provide the necessary locking before calling the\r\n            wrapping <code>CertPathValidator</code> object.<br />\r\n            <br />\r\n            However, implementations of <code>CertPathValidatorSpi</code> may still\r\n            encounter concurrency issues, since multiple threads each\r\n            manipulating a different <code>CertPathValidatorSpi</code> instance need not\r\n            synchronize.\r\n            <summary>\r\n            CertPathValidatorSpi implementation for X.509 Certificate validation a la RFC\r\n            3280.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathValidatorException\">\r\n             An exception indicating one of a variety of problems encountered when \r\n             validating a certification path. <br />\r\n             <br />\r\n             A <code>CertPathValidatorException</code> provides support for wrapping\r\n             exceptions. The {@link #getCause getCause} method returns the throwable, \r\n             if any, that caused this exception to be thrown. <br />\r\n             <br />\r\n             A <code>CertPathValidatorException</code> may also include the \r\n             certification path that was being validated when the exception was thrown \r\n             and the index of the certificate in the certification path that caused the \r\n             exception to be thrown. Use the {@link #getCertPath getCertPath} and\r\n             {@link #getIndex getIndex} methods to retrieve this information.<br />\r\n             <br />\r\n             <b>Concurrent Access</b><br />\r\n             <br />\r\n             Unless otherwise specified, the methods defined in this class are not\r\n             thread-safe. Multiple threads that need to access a single\r\n             object concurrently should synchronize amongst themselves and\r\n             provide the necessary locking. Multiple threads each manipulating\r\n             separate objects need not synchronize.\r\n            \r\n             @see CertPathValidator\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorException.#ctor(System.String)\">\r\n            <summary>\r\n            Creates a <code>PkixCertPathValidatorException</code> with the given detail\r\n            message. A detail message is a <code>String</code> that describes this\r\n            particular exception. \r\n            </summary>\r\n            <param name=\"message\">the detail message</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorException.#ctor(System.String,System.Exception)\">\r\n            <summary>\r\n            Creates a <code>PkixCertPathValidatorException</code> with the specified\r\n            detail message and cause.\r\n            </summary>\r\n            <param name=\"message\">the detail message</param>\r\n            <param name=\"cause\">the cause (which is saved for later retrieval by the\r\n            {@link #getCause getCause()} method). (A <code>null</code>\r\n            value is permitted, and indicates that the cause is\r\n            nonexistent or unknown.)</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorException.#ctor(System.String,System.Exception,Org.BouncyCastle.Pkix.PkixCertPath,System.Int32)\">\r\n            <summary>\r\n            Creates a <code>PkixCertPathValidatorException</code> with the specified\r\n            detail message, cause, certification path, and index.\r\n            </summary>\r\n            <param name=\"message\">the detail message (or <code>null</code> if none)</param>\r\n            <param name=\"cause\">the cause (or <code>null</code> if none)</param>\r\n            <param name=\"certPath\">the certification path that was in the process of being\r\n            validated when the error was encountered</param>\r\n            <param name=\"index\">the index of the certificate in the certification path that</param>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   * \r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixCertPathValidatorException.Message\">\r\n            <summary>\r\n            Returns the detail message for this <code>CertPathValidatorException</code>.\r\n            </summary>\r\n            <returns>the detail message, or <code>null</code> if neither the message nor cause were specified</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixCertPathValidatorException.CertPath\">\r\n            Returns the certification path that was being validated when the\r\n            exception was thrown.\r\n            \r\n            @return the <code>CertPath</code> that was being validated when the\r\n                    exception was thrown (or <code>null</code> if not specified)\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixCertPathValidatorException.Index\">\r\n            Returns the index of the certificate in the certification path that\r\n            caused the exception to be thrown. Note that the list of certificates in\r\n            a <code>CertPath</code> is zero based. If no index has been set, -1 is\r\n            returned.\r\n            \r\n            @return the index that has been set, or -1 if none has been set\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathValidatorResult\">\r\n            <summary>\r\n            Summary description for PkixCertPathValidatorResult.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities\">\r\n            <summary>\r\n            Summary description for PkixCertPathValidatorUtilities.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.KEY_CERT_SIGN\">\r\n            <summary>\r\n            key usage bits\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.FindTrustAnchor(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n            <summary>\r\n            Search the given Set of TrustAnchor's for one that is the\r\n            issuer of the given X509 certificate.\r\n            </summary>\r\n            <param name=\"cert\">the X509 certificate</param>\r\n            <param name=\"trustAnchors\">a Set of TrustAnchor's</param>\r\n            <returns>the <code>TrustAnchor</code> object if found or\r\n            <code>null</code> if not.\r\n            </returns>\r\n            @exception\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.GetIssuerPrincipal(System.Object)\">\r\n            <summary>\r\n            Returns the issuer of an attribute certificate or certificate.\r\n            </summary>\r\n            <param name=\"cert\">The attribute certificate or certificate.</param>\r\n            <returns>The issuer as <code>X500Principal</code>.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.GetNextWorkingKey(System.Collections.IList,System.Int32)\">\r\n             Return the next working key inheriting DSA parameters if necessary.\r\n             <p>\r\n             This methods inherits DSA parameters from the indexed certificate or\r\n             previous certificates in the certificate chain to the returned\r\n             <code>PublicKey</code>. The list is searched upwards, meaning the end\r\n             certificate is at position 0 and previous certificates are following.\r\n             </p>\r\n             <p>\r\n             If the indexed certificate does not contain a DSA key this method simply\r\n             returns the public key. If the DSA key already contains DSA parameters\r\n             the key is also only returned.\r\n             </p>\r\n            \r\n             @param certs The certification path.\r\n             @param index The index of the certificate which contains the public key\r\n                        which should be extended with DSA parameters.\r\n             @return The public key of the certificate in list position\r\n                     <code>index</code> extended with DSA parameters if applicable.\r\n             @throws Exception if DSA parameters cannot be inherited.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.FindCertificates(Org.BouncyCastle.X509.Store.X509CertStoreSelector,System.Collections.IList)\">\r\n            <summary>\r\n            Return a Collection of all certificates or attribute certificates found\r\n            in the X509Store's that are matching the certSelect criteriums.\r\n            </summary>\r\n            <param name=\"certSelect\">a {@link Selector} object that will be used to select\r\n            the certificates</param>\r\n            <param name=\"certStores\">a List containing only X509Store objects. These\r\n            are used to search for certificates.</param>\r\n            <returns>a Collection of all found <see cref=\"T:Org.BouncyCastle.X509.X509Certificate\"/> or\r\n            org.bouncycastle.x509.X509AttributeCertificate objects.\r\n            May be empty but never <code>null</code>.</returns>\r\n            <exception cref=\"T:System.Exception\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.GetCrlIssuersFromDistributionPoint(Org.BouncyCastle.Asn1.X509.DistributionPoint,System.Collections.ICollection,Org.BouncyCastle.X509.Store.X509CrlStoreSelector,Org.BouncyCastle.Pkix.PkixParameters)\">\r\n             Add the CRL issuers from the cRLIssuer field of the distribution point or\r\n             from the certificate if not given to the issuer criterion of the\r\n             <code>selector</code>.\r\n             <p>\r\n             The <code>issuerPrincipals</code> are a collection with a single\r\n             <code>X500Principal</code> for <code>X509Certificate</code>s. For\r\n             {@link X509AttributeCertificate}s the issuer may contain more than one\r\n             <code>X500Principal</code>.\r\n             </p>\r\n            \r\n             @param dp The distribution point.\r\n             @param issuerPrincipals The issuers of the certificate or attribute\r\n                        certificate which contains the distribution point.\r\n             @param selector The CRL selector.\r\n             @param pkixParams The PKIX parameters containing the cert stores.\r\n             @throws Exception if an exception occurs while processing.\r\n             @throws ClassCastException if <code>issuerPrincipals</code> does not\r\n             contain only <code>X500Principal</code>s.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.GetCompleteCrls(Org.BouncyCastle.Asn1.X509.DistributionPoint,System.Object,System.DateTime,Org.BouncyCastle.Pkix.PkixParameters)\">\r\n             Fetches complete CRLs according to RFC 3280.\r\n            \r\n             @param dp The distribution point for which the complete CRL\r\n             @param cert The <code>X509Certificate</code> or\r\n                        {@link org.bouncycastle.x509.X509AttributeCertificate} for\r\n                        which the CRL should be searched.\r\n             @param currentDate The date for which the delta CRLs must be valid.\r\n             @param paramsPKIX The extended PKIX parameters.\r\n             @return A <code>Set</code> of <code>X509CRL</code>s with complete\r\n                     CRLs.\r\n             @throws Exception if an exception occurs while picking the CRLs\r\n                         or no CRLs are found.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.GetDeltaCrls(System.DateTime,Org.BouncyCastle.Pkix.PkixParameters,Org.BouncyCastle.X509.X509Crl)\">\r\n             Fetches delta CRLs according to RFC 3280 section 5.2.4.\r\n            \r\n             @param currentDate The date for which the delta CRLs must be valid.\r\n             @param paramsPKIX The extended PKIX parameters.\r\n             @param completeCRL The complete CRL the delta CRL is for.\r\n             @return A <code>Set</code> of <code>X509CRL</code>s with delta CRLs.\r\n             @throws Exception if an exception occurs while picking the delta\r\n                         CRLs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.FindIssuerCerts(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Pkix.PkixBuilderParameters)\">\r\n             Find the issuer certificates of a given certificate.\r\n            \r\n             @param cert\r\n                        The certificate for which an issuer should be found.\r\n             @param pkixParams\r\n             @return A <code>Collection</code> object containing the issuer\r\n                     <code>X509Certificate</code>s. Never <code>null</code>.\r\n            \r\n             @exception Exception\r\n                            if an error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCertPathValidatorUtilities.GetExtensionValue(Org.BouncyCastle.X509.IX509Extension,Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            <summary>\r\n            Extract the value of the given extension, if it exists.\r\n            </summary>\r\n            <param name=\"ext\">The extension object.</param>\r\n            <param name=\"oid\">The object identifier to obtain.</param>\r\n            <returns>Asn1Object</returns>\r\n            <exception cref=\"T:System.Exception\">if the extension cannot be read.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.IntersectIP(Org.BouncyCastle.Utilities.Collections.ISet,Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Returns the intersection of the permitted IP ranges in\r\n             <code>permitted</code> with <code>ip</code>.\r\n            \r\n             @param permitted A <code>Set</code> of permitted IP addresses with\r\n                              their subnet mask as byte arrays.\r\n             @param ips       The IP address with its subnet mask.\r\n             @return The <code>Set</code> of permitted IP ranges intersected with\r\n                     <code>ip</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.UnionIP(Org.BouncyCastle.Utilities.Collections.ISet,System.Byte[])\">\r\n             Returns the union of the excluded IP ranges in <code>excluded</code>\r\n             with <code>ip</code>.\r\n            \r\n             @param excluded A <code>Set</code> of excluded IP addresses with their\r\n                             subnet mask as byte arrays.\r\n             @param ip       The IP address with its subnet mask.\r\n             @return The <code>Set</code> of excluded IP ranges unified with\r\n                     <code>ip</code> as byte arrays.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.UnionIPRange(System.Byte[],System.Byte[])\">\r\n             Calculates the union if two IP ranges.\r\n            \r\n             @param ipWithSubmask1 The first IP address with its subnet mask.\r\n             @param ipWithSubmask2 The second IP address with its subnet mask.\r\n             @return A <code>Set</code> with the union of both addresses.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.IntersectIPRange(System.Byte[],System.Byte[])\">\r\n             Calculates the interesction if two IP ranges.\r\n            \r\n             @param ipWithSubmask1 The first IP address with its subnet mask.\r\n             @param ipWithSubmask2 The second IP address with its subnet mask.\r\n             @return A <code>Set</code> with the single IP address with its subnet\r\n                     mask as a byte array or an empty <code>Set</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.IpWithSubnetMask(System.Byte[],System.Byte[])\">\r\n             Concatenates the IP address with its subnet mask.\r\n            \r\n             @param ip         The IP address.\r\n             @param subnetMask Its subnet mask.\r\n             @return The concatenated IP address with its subnet mask.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.ExtractIPsAndSubnetMasks(System.Byte[],System.Byte[])\">\r\n             Splits the IP addresses and their subnet mask.\r\n            \r\n             @param ipWithSubmask1 The first IP address with the subnet mask.\r\n             @param ipWithSubmask2 The second IP address with the subnet mask.\r\n             @return An array with two elements. Each element contains the IP address\r\n                     and the subnet mask in this order.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.MinMaxIPs(System.Byte[],System.Byte[],System.Byte[],System.Byte[])\">\r\n             Based on the two IP addresses and their subnet masks the IP range is\r\n             computed for each IP address - subnet mask pair and returned as the\r\n             minimum IP address and the maximum address of the range.\r\n            \r\n             @param ip1         The first IP address.\r\n             @param subnetmask1 The subnet mask of the first IP address.\r\n             @param ip2         The second IP address.\r\n             @param subnetmask2 The subnet mask of the second IP address.\r\n             @return A array with two elements. The first/second element contains the\r\n                     min and max IP address of the first/second IP address and its\r\n                     subnet mask.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.CheckPermittedIP(Org.BouncyCastle.Utilities.Collections.ISet,System.Byte[])\">\r\n             Checks if the IP <code>ip</code> is included in the permitted ISet\r\n             <code>permitted</code>.\r\n            \r\n             @param permitted A <code>Set</code> of permitted IP addresses with\r\n                              their subnet mask as byte arrays.\r\n             @param ip        The IP address.\r\n             @throws PkixNameConstraintValidatorException\r\n                      if the IP is not permitted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.checkExcludedIP(Org.BouncyCastle.Utilities.Collections.ISet,System.Byte[])\">\r\n             Checks if the IP <code>ip</code> is included in the excluded ISet\r\n             <code>excluded</code>.\r\n            \r\n             @param excluded A <code>Set</code> of excluded IP addresses with their\r\n                             subnet mask as byte arrays.\r\n             @param ip       The IP address.\r\n             @throws PkixNameConstraintValidatorException\r\n                      if the IP is excluded.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.IsIPConstrained(System.Byte[],System.Byte[])\">\r\n             Checks if the IP address <code>ip</code> is constrained by\r\n             <code>constraint</code>.\r\n            \r\n             @param ip         The IP address.\r\n             @param constraint The constraint. This is an IP address concatenated with\r\n                               its subnetmask.\r\n             @return <code>true</code> if constrained, <code>false</code>\r\n                     otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.unionEmail(System.String,System.String,Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             The common part of <code>email1</code> and <code>email2</code> is\r\n             added to the union <code>union</code>. If <code>email1</code> and\r\n             <code>email2</code> have nothing in common they are added both.\r\n            \r\n             @param email1 Email address constraint 1.\r\n             @param email2 Email address constraint 2.\r\n             @param union  The union.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.intersectEmail(System.String,System.String,Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             The most restricting part from <code>email1</code> and\r\n             <code>email2</code> is added to the intersection <code>intersect</code>.\r\n            \r\n             @param email1    Email address constraint 1.\r\n             @param email2    Email address constraint 2.\r\n             @param intersect The intersection.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.checkPermitted(Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n             Checks if the given GeneralName is in the permitted ISet.\r\n            \r\n             @param name The GeneralName\r\n             @throws PkixNameConstraintValidatorException\r\n                      If the <code>name</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.checkExcluded(Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n             Check if the given GeneralName is contained in the excluded ISet.\r\n            \r\n             @param name The GeneralName.\r\n             @throws PkixNameConstraintValidatorException\r\n                      If the <code>name</code> is\r\n                      excluded.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.IntersectPermittedSubtree(Org.BouncyCastle.Asn1.Asn1Sequence)\">\r\n             Updates the permitted ISet of these name constraints with the intersection\r\n             with the given subtree.\r\n            \r\n             @param permitted The permitted subtrees\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.AddExcludedSubtree(Org.BouncyCastle.Asn1.X509.GeneralSubtree)\">\r\n             Adds a subtree to the excluded ISet of these name constraints.\r\n            \r\n             @param subtree A subtree with an excluded GeneralName.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.Max(System.Byte[],System.Byte[])\">\r\n             Returns the maximum IP address.\r\n            \r\n             @param ip1 The first IP address.\r\n             @param ip2 The second IP address.\r\n             @return The maximum IP address.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.Min(System.Byte[],System.Byte[])\">\r\n             Returns the minimum IP address.\r\n            \r\n             @param ip1 The first IP address.\r\n             @param ip2 The second IP address.\r\n             @return The minimum IP address.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.CompareTo(System.Byte[],System.Byte[])\">\r\n             Compares IP address <code>ip1</code> with <code>ip2</code>. If ip1\r\n             is equal to ip2 0 is returned. If ip1 is bigger 1 is returned, -1\r\n             otherwise.\r\n            \r\n             @param ip1 The first IP address.\r\n             @param ip2 The second IP address.\r\n             @return 0 if ip1 is equal to ip2, 1 if ip1 is bigger, -1 otherwise.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.Or(System.Byte[],System.Byte[])\">\r\n             Returns the logical OR of the IP addresses <code>ip1</code> and\r\n             <code>ip2</code>.\r\n            \r\n             @param ip1 The first IP address.\r\n             @param ip2 The second IP address.\r\n             @return The OR of <code>ip1</code> and <code>ip2</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixNameConstraintValidator.StringifyIP(System.Byte[])\">\r\n             Stringifies an IPv4 or v6 address with subnet mask.\r\n            \r\n             @param ip The IP with subnet mask.\r\n             @return The stringified IP address.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixParameters\">\r\n            <summary>\r\n            Summary description for PkixParameters.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Pkix.PkixParameters.PkixValidityModel\">\r\n            This is the default PKIX validity model. Actually there are two variants\r\n            of this: The PKIX model and the modified PKIX model. The PKIX model\r\n            verifies that all involved certificates must have been valid at the\r\n            current time. The modified PKIX model verifies that all involved\r\n            certificates were valid at the signing time. Both are indirectly choosen\r\n            with the {@link PKIXParameters#setDate(java.util.Date)} method, so this\r\n            methods sets the Date when <em>all</em> certificates must have been\r\n            valid.\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Pkix.PkixParameters.ChainValidityModel\">\r\n            This model uses the following validity model. Each certificate must have\r\n            been valid at the moment where is was used. That means the end\r\n            certificate must have been valid at the time the signature was done. The\r\n            CA certificate which signed the end certificate must have been valid,\r\n            when the end certificate was signed. The CA (or Root CA) certificate must\r\n            have been valid, when the CA certificate was signed and so on. So the\r\n            {@link PKIXParameters#setDate(java.util.Date)} method sets the time, when\r\n            the <em>end certificate</em> must have been valid. <p/> It is used e.g.\r\n            in the German signature law.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.#ctor(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Creates an instance of PKIXParameters with the specified Set of\r\n             most-trusted CAs. Each element of the set is a TrustAnchor.<br />\r\n             <br />\r\n             Note that the Set is copied to protect against subsequent modifications.\r\n            \r\n             @param trustAnchors\r\n                        a Set of TrustAnchors\r\n            \r\n             @exception InvalidAlgorithmParameterException\r\n                            if the specified Set is empty\r\n                            <code>(trustAnchors.isEmpty() == true)</code>\r\n             @exception NullPointerException\r\n                            if the specified Set is <code>null</code>\r\n             @exception ClassCastException\r\n                            if any of the elements in the Set are not of type\r\n                            <code>java.security.cert.TrustAnchor</code>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetTargetCertConstraints\">\r\n             Returns the required constraints on the target certificate. The\r\n             constraints are returned as an instance of CertSelector. If\r\n             <code>null</code>, no constraints are defined.<br />\r\n             <br />\r\n             Note that the CertSelector returned is cloned to protect against\r\n             subsequent modifications.\r\n            \r\n             @return a CertSelector specifying the constraints on the target\r\n                     certificate (or <code>null</code>)\r\n            \r\n             @see #setTargetCertConstraints(CertSelector)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetTargetCertConstraints(Org.BouncyCastle.X509.Store.IX509Selector)\">\r\n             Sets the required constraints on the target certificate. The constraints\r\n             are specified as an instance of CertSelector. If null, no constraints are\r\n             defined.<br />\r\n             <br />\r\n             Note that the CertSelector specified is cloned to protect against\r\n             subsequent modifications.\r\n            \r\n             @param selector\r\n                        a CertSelector specifying the constraints on the target\r\n                        certificate (or <code>null</code>)\r\n            \r\n             @see #getTargetCertConstraints()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetInitialPolicies\">\r\n             Returns an immutable Set of initial policy identifiers (OID strings),\r\n             indicating that any one of these policies would be acceptable to the\r\n             certificate user for the purposes of certification path processing. The\r\n             default return value is an empty <code>Set</code>, which is\r\n             interpreted as meaning that any policy would be acceptable.\r\n            \r\n             @return an immutable <code>Set</code> of initial policy OIDs in String\r\n                     format, or an empty <code>Set</code> (implying any policy is\r\n                     acceptable). Never returns <code>null</code>.\r\n            \r\n             @see #setInitialPolicies(java.util.Set)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetInitialPolicies(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Sets the <code>Set</code> of initial policy identifiers (OID strings),\r\n             indicating that any one of these policies would be acceptable to the\r\n             certificate user for the purposes of certification path processing. By\r\n             default, any policy is acceptable (i.e. all policies), so a user that\r\n             wants to allow any policy as acceptable does not need to call this\r\n             method, or can call it with an empty <code>Set</code> (or\r\n             <code>null</code>).<br />\r\n             <br />\r\n             Note that the Set is copied to protect against subsequent modifications.<br />\r\n             <br />\r\n            \r\n             @param initialPolicies\r\n                        a Set of initial policy OIDs in String format (or\r\n                        <code>null</code>)\r\n            \r\n             @exception ClassCastException\r\n                            if any of the elements in the set are not of type String\r\n            \r\n             @see #getInitialPolicies()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetCertPathCheckers(System.Collections.IList)\">\r\n             Sets a <code>List</code> of additional certification path checkers. If\r\n             the specified List contains an object that is not a PKIXCertPathChecker,\r\n             it is ignored.<br />\r\n             <br />\r\n             Each <code>PKIXCertPathChecker</code> specified implements additional\r\n             checks on a certificate. Typically, these are checks to process and\r\n             verify private extensions contained in certificates. Each\r\n             <code>PKIXCertPathChecker</code> should be instantiated with any\r\n             initialization parameters needed to execute the check.<br />\r\n             <br />\r\n             This method allows sophisticated applications to extend a PKIX\r\n             <code>CertPathValidator</code> or <code>CertPathBuilder</code>. Each\r\n             of the specified PKIXCertPathCheckers will be called, in turn, by a PKIX\r\n             <code>CertPathValidator</code> or <code>CertPathBuilder</code> for\r\n             each certificate processed or validated.<br />\r\n             <br />\r\n             Regardless of whether these additional PKIXCertPathCheckers are set, a\r\n             PKIX <code>CertPathValidator</code> or <code>CertPathBuilder</code>\r\n             must perform all of the required PKIX checks on each certificate. The one\r\n             exception to this rule is if the RevocationEnabled flag is set to false\r\n             (see the {@link #setRevocationEnabled(boolean) setRevocationEnabled}\r\n             method).<br />\r\n             <br />\r\n             Note that the List supplied here is copied and each PKIXCertPathChecker\r\n             in the list is cloned to protect against subsequent modifications.\r\n            \r\n             @param checkers\r\n                        a List of PKIXCertPathCheckers. May be null, in which case no\r\n                        additional checkers will be used.\r\n             @exception ClassCastException\r\n                            if any of the elements in the list are not of type\r\n                            <code>java.security.cert.PKIXCertPathChecker</code>\r\n             @see #getCertPathCheckers()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetCertPathCheckers\">\r\n             Returns the List of certification path checkers. Each PKIXCertPathChecker\r\n             in the returned IList is cloned to protect against subsequent modifications.\r\n            \r\n             @return an immutable List of PKIXCertPathCheckers (may be empty, but not\r\n                     <code>null</code>)\r\n            \r\n             @see #setCertPathCheckers(java.util.List)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.AddCertPathChecker(Org.BouncyCastle.Pkix.PkixCertPathChecker)\">\r\n             Adds a <code>PKIXCertPathChecker</code> to the list of certification\r\n             path checkers. See the {@link #setCertPathCheckers setCertPathCheckers}\r\n             method for more details.\r\n             <p>\r\n             Note that the <code>PKIXCertPathChecker</code> is cloned to protect\r\n             against subsequent modifications.</p>\r\n            \r\n             @param checker a <code>PKIXCertPathChecker</code> to add to the list of\r\n             checks. If <code>null</code>, the checker is ignored (not added to list).\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetParams(Org.BouncyCastle.Pkix.PkixParameters)\">\r\n             Method to support <code>Clone()</code> under J2ME.\r\n             <code>super.Clone()</code> does not exist and fields are not copied.\r\n            \r\n             @param params Parameters to set. If this are\r\n                        <code>ExtendedPkixParameters</code> they are copied to.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixParameters.IsUseDeltasEnabled\">\r\n            Whether delta CRLs should be used for checking the revocation status.\r\n            Defaults to <code>false</code>.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixParameters.ValidityModel\">\r\n            The validity model.\r\n            @see #CHAIN_VALIDITY_MODEL\r\n            @see #PKIX_VALIDITY_MODEL\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetStores(System.Collections.IList)\">\r\n             Sets the Bouncy Castle Stores for finding CRLs, certificates, attribute\r\n             certificates or cross certificates.\r\n             <p>\r\n             The <code>IList</code> is cloned.\r\n             </p>\r\n            \r\n             @param stores A list of stores to use.\r\n             @see #getStores\r\n             @throws ClassCastException if an element of <code>stores</code> is not\r\n                         a {@link Store}.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.AddStore(Org.BouncyCastle.X509.Store.IX509Store)\">\r\n             Adds a Bouncy Castle {@link Store} to find CRLs, certificates, attribute\r\n             certificates or cross certificates.\r\n             <p>\r\n             This method should be used to add local stores, like collection based\r\n             X.509 stores, if available. Local stores should be considered first,\r\n             before trying to use additional (remote) locations, because they do not\r\n             need possible additional network traffic.\r\n             </p><p>\r\n             If <code>store</code> is <code>null</code> it is ignored.\r\n             </p>\r\n            \r\n             @param store The store to add.\r\n             @see #getStores\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.AddAdditionalStore(Org.BouncyCastle.X509.Store.IX509Store)\">\r\n             Adds an additional Bouncy Castle {@link Store} to find CRLs, certificates,\r\n             attribute certificates or cross certificates.\r\n             <p>\r\n             You should not use this method. This method is used for adding additional\r\n             X.509 stores, which are used to add (remote) locations, e.g. LDAP, found\r\n             during X.509 object processing, e.g. in certificates or CRLs. This method\r\n             is used in PKIX certification path processing.\r\n             </p><p>\r\n             If <code>store</code> is <code>null</code> it is ignored.\r\n             </p>\r\n            \r\n             @param store The store to add.\r\n             @see #getStores()\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetAdditionalStores\">\r\n             Returns an <code>IList</code> of additional Bouncy Castle\r\n             <code>Store</code>s used for finding CRLs, certificates, attribute\r\n             certificates or cross certificates.\r\n            \r\n             @return an immutable <code>IList</code> of additional Bouncy Castle\r\n                     <code>Store</code>s. Never <code>null</code>.\r\n            \r\n             @see #addAddionalStore(Store)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetStores\">\r\n             Returns an <code>IList</code> of Bouncy Castle\r\n             <code>Store</code>s used for finding CRLs, certificates, attribute\r\n             certificates or cross certificates.\r\n            \r\n             @return an immutable <code>IList</code> of Bouncy Castle\r\n                     <code>Store</code>s. Never <code>null</code>.\r\n            \r\n             @see #setStores(IList)\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.PkixParameters.IsAdditionalLocationsEnabled\">\r\n             Returns if additional {@link X509Store}s for locations like LDAP found\r\n             in certificates or CRLs should be used.\r\n            \r\n             @return Returns <code>true</code> if additional stores are used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetAdditionalLocationsEnabled(System.Boolean)\">\r\n             Sets if additional {@link X509Store}s for locations like LDAP found in\r\n             certificates or CRLs should be used.\r\n            \r\n             @param enabled <code>true</code> if additional stores are used.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetTargetConstraints\">\r\n             Returns the required constraints on the target certificate or attribute\r\n             certificate. The constraints are returned as an instance of\r\n             <code>IX509Selector</code>. If <code>null</code>, no constraints are\r\n             defined.\r\n            \r\n             <p>\r\n             The target certificate in a PKIX path may be a certificate or an\r\n             attribute certificate.\r\n             </p><p>\r\n             Note that the <code>IX509Selector</code> returned is cloned to protect\r\n             against subsequent modifications.\r\n             </p>\r\n             @return a <code>IX509Selector</code> specifying the constraints on the\r\n                     target certificate or attribute certificate (or <code>null</code>)\r\n             @see #setTargetConstraints\r\n             @see X509CertStoreSelector\r\n             @see X509AttributeCertStoreSelector\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetTargetConstraints(Org.BouncyCastle.X509.Store.IX509Selector)\">\r\n             Sets the required constraints on the target certificate or attribute\r\n             certificate. The constraints are specified as an instance of\r\n             <code>IX509Selector</code>. If <code>null</code>, no constraints are\r\n             defined.\r\n             <p>\r\n             The target certificate in a PKIX path may be a certificate or an\r\n             attribute certificate.\r\n             </p><p>\r\n             Note that the <code>IX509Selector</code> specified is cloned to protect\r\n             against subsequent modifications.\r\n             </p>\r\n            \r\n             @param selector a <code>IX509Selector</code> specifying the constraints on\r\n                        the target certificate or attribute certificate (or\r\n                        <code>null</code>)\r\n             @see #getTargetConstraints\r\n             @see X509CertStoreSelector\r\n             @see X509AttributeCertStoreSelector\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetTrustedACIssuers\">\r\n             Returns the trusted attribute certificate issuers. If attribute\r\n             certificates is verified the trusted AC issuers must be set.\r\n             <p>\r\n             The returned <code>ISet</code> consists of <code>TrustAnchor</code>s.\r\n             </p><p>\r\n             The returned <code>ISet</code> is immutable. Never <code>null</code>\r\n             </p>\r\n            \r\n             @return Returns an immutable set of the trusted AC issuers.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetTrustedACIssuers(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Sets the trusted attribute certificate issuers. If attribute certificates\r\n             is verified the trusted AC issuers must be set.\r\n             <p>\r\n             The <code>trustedACIssuers</code> must be a <code>ISet</code> of\r\n             <code>TrustAnchor</code>\r\n             </p><p>\r\n             The given set is cloned.\r\n             </p>\r\n            \r\n             @param trustedACIssuers The trusted AC issuers to set. Is never\r\n                        <code>null</code>.\r\n             @throws ClassCastException if an element of <code>stores</code> is not\r\n                         a <code>TrustAnchor</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetNecessaryACAttributes\">\r\n             Returns the neccessary attributes which must be contained in an attribute\r\n             certificate.\r\n             <p>\r\n             The returned <code>ISet</code> is immutable and contains\r\n             <code>String</code>s with the OIDs.\r\n             </p>\r\n            \r\n             @return Returns the necessary AC attributes.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetNecessaryACAttributes(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Sets the neccessary which must be contained in an attribute certificate.\r\n             <p>\r\n             The <code>ISet</code> must contain <code>String</code>s with the\r\n             OIDs.\r\n             </p><p>\r\n             The set is cloned.\r\n             </p>\r\n            \r\n             @param necessaryACAttributes The necessary AC attributes to set.\r\n             @throws ClassCastException if an element of\r\n                         <code>necessaryACAttributes</code> is not a\r\n                         <code>String</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetProhibitedACAttributes\">\r\n             Returns the attribute certificates which are not allowed.\r\n             <p>\r\n             The returned <code>ISet</code> is immutable and contains\r\n             <code>String</code>s with the OIDs.\r\n             </p>\r\n            \r\n             @return Returns the prohibited AC attributes. Is never <code>null</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetProhibitedACAttributes(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Sets the attribute certificates which are not allowed.\r\n             <p>\r\n             The <code>ISet</code> must contain <code>String</code>s with the\r\n             OIDs.\r\n             </p><p>\r\n             The set is cloned.\r\n             </p>\r\n            \r\n             @param prohibitedACAttributes The prohibited AC attributes to set.\r\n             @throws ClassCastException if an element of\r\n                         <code>prohibitedACAttributes</code> is not a\r\n                         <code>String</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.GetAttrCertCheckers\">\r\n             Returns the attribute certificate checker. The returned set contains\r\n             {@link PKIXAttrCertChecker}s and is immutable.\r\n            \r\n             @return Returns the attribute certificate checker. Is never\r\n                     <code>null</code>.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixParameters.SetAttrCertCheckers(Org.BouncyCastle.Utilities.Collections.ISet)\">\r\n             Sets the attribute certificate checkers.\r\n             <p>\r\n             All elements in the <code>ISet</code> must a {@link PKIXAttrCertChecker}.\r\n             </p>\r\n             <p>\r\n             The given set is cloned.\r\n             </p>\r\n            \r\n             @param attrCertCheckers The attribute certificate checkers to set. Is\r\n                        never <code>null</code>.\r\n             @throws ClassCastException if an element of <code>attrCertCheckers</code>\r\n                         is not a <code>PKIXAttrCertChecker</code>.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.PkixPolicyNode\">\r\n            <summary>\r\n            Summary description for PkixPolicyNode.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixPolicyNode.#ctor(System.Collections.IList,System.Int32,Org.BouncyCastle.Utilities.Collections.ISet,Org.BouncyCastle.Pkix.PkixPolicyNode,Org.BouncyCastle.Utilities.Collections.ISet,System.String,System.Boolean)\">\r\n            Constructors\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.ReasonsMask\">\r\n            <summary>\r\n            This class helps to handle CRL revocation reasons mask. Each CRL handles a\r\n            certain set of revocation reasons.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.ReasonsMask.#ctor(System.Int32)\">\r\n            <summary>\r\n            Constructs are reason mask with the reasons.\r\n            </summary>\r\n            <param name=\"reasons\">The reasons.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.ReasonsMask.#ctor\">\r\n            <summary>\r\n            A reason mask with no reason.\r\n            </summary>\r\n        </member>\r\n        <member name=\"F:Org.BouncyCastle.Pkix.ReasonsMask.AllReasons\">\r\n            <summary>\r\n            A mask with all revocation reasons.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.ReasonsMask.AddReasons(Org.BouncyCastle.Pkix.ReasonsMask)\">\r\n             Adds all reasons from the reasons mask to this mask.\r\n            \r\n             @param mask The reasons mask to add.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.ReasonsMask.IsAllReasons\">\r\n            <summary>\r\n            Returns <code>true</code> if this reasons mask contains all possible\r\n            reasons.\r\n            </summary>\r\n            <returns>true if this reasons mask contains all possible reasons.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.ReasonsMask.Intersect(Org.BouncyCastle.Pkix.ReasonsMask)\">\r\n            <summary>\r\n            Intersects this mask with the given reasons mask.\r\n            </summary>\r\n            <param name=\"mask\">mask The mask to intersect with.</param>\r\n            <returns>The intersection of this and teh given mask.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.ReasonsMask.HasNewReasons(Org.BouncyCastle.Pkix.ReasonsMask)\">\r\n            <summary>\r\n            Returns <c>true</c> if the passed reasons mask has new reasons.\r\n            </summary>\r\n            <param name=\"mask\">The reasons mask which should be tested for new reasons.</param>\r\n            <returns><c>true</c> if the passed reasons mask has new reasons.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.ReasonsMask.Reasons\">\r\n            <summary>\r\n            Returns the reasons in this mask.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3280CertPathUtilities.ProcessCrlB2(Org.BouncyCastle.Asn1.X509.DistributionPoint,System.Object,Org.BouncyCastle.X509.X509Crl)\">\r\n             If the complete CRL includes an issuing distribution point (IDP) CRL\r\n             extension check the following:\r\n             <p>\r\n             (i) If the distribution point name is present in the IDP CRL extension\r\n             and the distribution field is present in the DP, then verify that one of\r\n             the names in the IDP matches one of the names in the DP. If the\r\n             distribution point name is present in the IDP CRL extension and the\r\n             distribution field is omitted from the DP, then verify that one of the\r\n             names in the IDP matches one of the names in the cRLIssuer field of the\r\n             DP.\r\n             </p>\r\n             <p>\r\n             (ii) If the onlyContainsUserCerts boolean is asserted in the IDP CRL\r\n             extension, verify that the certificate does not include the basic\r\n             constraints extension with the cA boolean asserted.\r\n             </p>\r\n             <p>\r\n             (iii) If the onlyContainsCACerts boolean is asserted in the IDP CRL\r\n             extension, verify that the certificate includes the basic constraints\r\n             extension with the cA boolean asserted.\r\n             </p>\r\n             <p>\r\n             (iv) Verify that the onlyContainsAttributeCerts boolean is not asserted.\r\n             </p>\r\n            \r\n             @param dp   The distribution point.\r\n             @param cert The certificate.\r\n             @param crl  The CRL.\r\n             @throws AnnotatedException if one of the conditions is not met or an error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3280CertPathUtilities.ProcessCrlB1(Org.BouncyCastle.Asn1.X509.DistributionPoint,System.Object,Org.BouncyCastle.X509.X509Crl)\">\r\n             If the DP includes cRLIssuer, then verify that the issuer field in the\r\n             complete CRL matches cRLIssuer in the DP and that the complete CRL\r\n             contains an\r\n                  g distribution point extension with the indirectCRL\r\n             boolean asserted. Otherwise, verify that the CRL issuer matches the\r\n             certificate issuer.\r\n            \r\n             @param dp   The distribution point.\r\n             @param cert The certificate ot attribute certificate.\r\n             @param crl  The CRL for <code>cert</code>.\r\n             @throws AnnotatedException if one of the above conditions does not apply or an error\r\n                                        occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3280CertPathUtilities.ProcessCrlF(Org.BouncyCastle.X509.X509Crl,System.Object,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Pkix.PkixParameters,System.Collections.IList)\">\r\n             Obtain and validate the certification path for the complete CRL issuer.\r\n             If a key usage extension is present in the CRL issuer's certificate,\r\n             verify that the cRLSign bit is set.\r\n            \r\n             @param crl                CRL which contains revocation information for the certificate\r\n                                       <code>cert</code>.\r\n             @param cert               The attribute certificate or certificate to check if it is\r\n                                       revoked.\r\n             @param defaultCRLSignCert The issuer certificate of the certificate <code>cert</code>.\r\n             @param defaultCRLSignKey  The public key of the issuer certificate\r\n                                       <code>defaultCRLSignCert</code>.\r\n             @param paramsPKIX         paramsPKIX PKIX parameters.\r\n             @param certPathCerts      The certificates on the certification path.\r\n             @return A <code>Set</code> with all keys of possible CRL issuer\r\n                     certificates.\r\n             @throws AnnotatedException if the CRL is not valid or the status cannot be checked or\r\n                                        some error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3280CertPathUtilities.CheckCrl(Org.BouncyCastle.Asn1.X509.DistributionPoint,Org.BouncyCastle.Pkix.PkixParameters,Org.BouncyCastle.X509.X509Certificate,System.DateTime,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Pkix.CertStatus,Org.BouncyCastle.Pkix.ReasonsMask,System.Collections.IList)\">\r\n             Checks a distribution point for revocation information for the\r\n             certificate <code>cert</code>.\r\n            \r\n             @param dp                 The distribution point to consider.\r\n             @param paramsPKIX         PKIX parameters.\r\n             @param cert               Certificate to check if it is revoked.\r\n             @param validDate          The date when the certificate revocation status should be\r\n                                       checked.\r\n             @param defaultCRLSignCert The issuer certificate of the certificate <code>cert</code>.\r\n             @param defaultCRLSignKey  The public key of the issuer certificate\r\n                                       <code>defaultCRLSignCert</code>.\r\n             @param certStatus         The current certificate revocation status.\r\n             @param reasonMask         The reasons mask which is already checked.\r\n             @param certPathCerts      The certificates of the certification path.\r\n             @throws AnnotatedException if the certificate is revoked or the status cannot be checked\r\n                                        or some error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3280CertPathUtilities.CheckCrls(Org.BouncyCastle.Pkix.PkixParameters,Org.BouncyCastle.X509.X509Certificate,System.DateTime,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Collections.IList)\">\r\n             Checks a certificate if it is revoked.\r\n            \r\n             @param paramsPKIX       PKIX parameters.\r\n             @param cert             Certificate to check if it is revoked.\r\n             @param validDate        The date when the certificate revocation status should be\r\n                                     checked.\r\n             @param sign             The issuer certificate of the certificate <code>cert</code>.\r\n             @param workingPublicKey The public key of the issuer certificate <code>sign</code>.\r\n             @param certPathCerts    The certificates of the certification path.\r\n             @throws AnnotatedException if the certificate is revoked or the status cannot be checked\r\n                                        or some error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3280CertPathUtilities.ProcessCrlC(Org.BouncyCastle.X509.X509Crl,Org.BouncyCastle.X509.X509Crl,Org.BouncyCastle.Pkix.PkixParameters)\">\r\n             If use-deltas is set, verify the issuer and scope of the delta CRL.\r\n            \r\n             @param deltaCRL    The delta CRL.\r\n             @param completeCRL The complete CRL.\r\n             @param pkixParams  The PKIX paramaters.\r\n             @throws AnnotatedException if an exception occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3281CertPathUtilities.CheckCrls(Org.BouncyCastle.X509.IX509AttributeCertificate,Org.BouncyCastle.Pkix.PkixParameters,Org.BouncyCastle.X509.X509Certificate,System.DateTime,System.Collections.IList)\">\r\n            Checks if an attribute certificate is revoked.\r\n            \r\n            @param attrCert Attribute certificate to check if it is revoked.\r\n            @param paramsPKIX PKIX parameters.\r\n            @param issuerCert The issuer certificate of the attribute certificate\r\n                       <code>attrCert</code>.\r\n            @param validDate The date when the certificate revocation status should\r\n                       be checked.\r\n            @param certPathCerts The certificates of the certification path to be\r\n                       checked.\r\n            \r\n            @throws CertPathValidatorException if the certificate is revoked or the\r\n                        status cannot be checked or some error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3281CertPathUtilities.ProcessAttrCert1(Org.BouncyCastle.X509.IX509AttributeCertificate,Org.BouncyCastle.Pkix.PkixParameters)\">\r\n            Searches for a holder public key certificate and verifies its\r\n            certification path.\r\n            \r\n            @param attrCert the attribute certificate.\r\n            @param pkixParams The PKIX parameters.\r\n            @return The certificate path of the holder certificate.\r\n            @throws Exception if\r\n                        <ul>\r\n                        <li>no public key certificate can be found although holder\r\n                        information is given by an entity name or a base certificate\r\n                        ID</li>\r\n                        <li>support classes cannot be created</li>\r\n                        <li>no certification path for the public key certificate can\r\n                        be built</li>\r\n                        </ul>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.Rfc3281CertPathUtilities.CheckCrl(Org.BouncyCastle.Asn1.X509.DistributionPoint,Org.BouncyCastle.X509.IX509AttributeCertificate,Org.BouncyCastle.Pkix.PkixParameters,System.DateTime,Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.Pkix.CertStatus,Org.BouncyCastle.Pkix.ReasonsMask,System.Collections.IList)\">\r\n            \r\n            Checks a distribution point for revocation information for the\r\n            certificate <code>attrCert</code>.\r\n            \r\n            @param dp The distribution point to consider.\r\n            @param attrCert The attribute certificate which should be checked.\r\n            @param paramsPKIX PKIX parameters.\r\n            @param validDate The date when the certificate revocation status should\r\n                       be checked.\r\n            @param issuerCert Certificate to check if it is revoked.\r\n            @param reasonMask The reasons mask which is already checked.\r\n            @param certPathCerts The certificates of the certification path to be\r\n                       checked.\r\n            @throws Exception if the certificate is revoked or the status\r\n                        cannot be checked or some error occurs.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Pkix.TrustAnchor\">\r\n            <summary>\r\n            A trust anchor or most-trusted Certification Authority (CA).\r\n            \r\n            This class represents a \"most-trusted CA\", which is used as a trust anchor\r\n            for validating X.509 certification paths. A most-trusted CA includes the\r\n            public key of the CA, the CA's name, and any constraints upon the set of\r\n            paths which may be validated using this key. These parameters can be\r\n            specified in the form of a trusted X509Certificate or as individual\r\n            parameters.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.TrustAnchor.#ctor(Org.BouncyCastle.X509.X509Certificate,System.Byte[])\">\r\n             <summary>\r\n             Creates an instance of TrustAnchor with the specified X509Certificate and\r\n             optional name constraints, which are intended to be used as additional\r\n             constraints when validating an X.509 certification path.\r\n            \tThe name constraints are specified as a byte array. This byte array\r\n            \tshould contain the DER encoded form of the name constraints, as they\r\n            \twould appear in the NameConstraints structure defined in RFC 2459 and\r\n            \tX.509. The ASN.1 definition of this structure appears below.\r\n            \t\r\n            \t<pre>\r\n            \tNameConstraints ::= SEQUENCE {\r\n            \t\tpermittedSubtrees       [0]     GeneralSubtrees OPTIONAL,\r\n            \t\texcludedSubtrees        [1]     GeneralSubtrees OPTIONAL }\r\n            \t   \r\n             GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree\r\n             \r\n            \t\tGeneralSubtree ::= SEQUENCE {\r\n            \t\tbase                    GeneralName,\r\n            \t\tminimum         [0]     BaseDistance DEFAULT 0,\r\n            \t\tmaximum         [1]     BaseDistance OPTIONAL }\r\n            \t\t\r\n            \t\tBaseDistance ::= INTEGER (0..MAX)\r\n            \r\n            \t\tGeneralName ::= CHOICE {\r\n            \t\totherName                       [0]     OtherName,\r\n            \t\trfc822Name                      [1]     IA5String,\r\n            \t\tdNSName                         [2]     IA5String,\r\n            \t\tx400Address                     [3]     ORAddress,\r\n            \t\tdirectoryName                   [4]     Name,\r\n            \t\tediPartyName                    [5]     EDIPartyName,\r\n            \t\tuniformResourceIdentifier       [6]     IA5String,\r\n            \t\tiPAddress                       [7]     OCTET STRING,\r\n            \t\tregisteredID                    [8]     OBJECT IDENTIFIER}\r\n            \t</pre>\r\n            \t\r\n            \tNote that the name constraints byte array supplied is cloned to protect\r\n            \tagainst subsequent modifications.\r\n             </summary>\r\n             <param name=\"trustedCert\">a trusted X509Certificate</param>\r\n             <param name=\"nameConstraints\">a byte array containing the ASN.1 DER encoding of a\r\n             NameConstraints extension to be used for checking name\r\n             constraints. Only the value of the extension is included, not\r\n             the OID or criticality flag. Specify null to omit the\r\n             parameter.</param>\r\n             <exception cref=\"T:System.ArgumentNullException\">if the specified X509Certificate is null</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.TrustAnchor.#ctor(Org.BouncyCastle.Asn1.X509.X509Name,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[])\">\r\n            <summary>\r\n            Creates an instance of <c>TrustAnchor</c> where the\r\n            most-trusted CA is specified as an X500Principal and public key.\r\n            </summary>\r\n            <remarks>\r\n            <p>\r\n            Name constraints are an optional parameter, and are intended to be used\r\n            as additional constraints when validating an X.509 certification path.\r\n            </p><p>\r\n            The name constraints are specified as a byte array. This byte array\r\n            contains the DER encoded form of the name constraints, as they\r\n            would appear in the NameConstraints structure defined in RFC 2459\r\n            and X.509. The ASN.1 notation for this structure is supplied in the\r\n            documentation for the other constructors.\r\n            </p><p>\r\n            Note that the name constraints byte array supplied here is cloned to\r\n            protect against subsequent modifications.\r\n            </p>\r\n            </remarks>\r\n            <param name=\"caPrincipal\">the name of the most-trusted CA as X509Name</param>\r\n            <param name=\"pubKey\">the public key of the most-trusted CA</param>\r\n            <param name=\"nameConstraints\">\r\n            a byte array containing the ASN.1 DER encoding of a NameConstraints extension to\r\n            be used for checking name constraints. Only the value of the extension is included,\r\n            not the OID or criticality flag. Specify <c>null</c> to omit the parameter.\r\n            </param>\r\n            <exception cref=\"T:System.ArgumentNullException\">\r\n            if <c>caPrincipal</c> or <c>pubKey</c> is null\r\n            </exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.TrustAnchor.#ctor(System.String,Org.BouncyCastle.Crypto.AsymmetricKeyParameter,System.Byte[])\">\r\n            <summary>\r\n            Creates an instance of <code>TrustAnchor</code> where the most-trusted\r\n            CA is specified as a distinguished name and public key. Name constraints\r\n            are an optional parameter, and are intended to be used as additional\r\n            constraints when validating an X.509 certification path.\r\n            <br/>\r\n            The name constraints are specified as a byte array. This byte array\r\n            contains the DER encoded form of the name constraints, as they would\r\n            appear in the NameConstraints structure defined in RFC 2459 and X.509.\r\n            </summary>\r\n            <param name=\"caName\">the X.500 distinguished name of the most-trusted CA in RFC\r\n            2253 string format</param>\r\n            <param name=\"pubKey\">the public key of the most-trusted CA</param>\r\n            <param name=\"nameConstraints\">a byte array containing the ASN.1 DER encoding of a\r\n            NameConstraints extension to be used for checking name\r\n            constraints. Only the value of the extension is included, not \r\n            the OID or criticality flag. Specify null to omit the \r\n            parameter.</param>\r\n            throws NullPointerException, IllegalArgumentException\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.TrustAnchor.TrustedCert\">\r\n            <summary>\r\n            Returns the most-trusted CA certificate.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.TrustAnchor.CA\">\r\n            <summary>\r\n            Returns the name of the most-trusted CA as an X509Name.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.TrustAnchor.CAName\">\r\n            <summary>\r\n            Returns the name of the most-trusted CA in RFC 2253 string format.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Pkix.TrustAnchor.CAPublicKey\">\r\n            <summary>\r\n            Returns the public key of the most-trusted CA.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.TrustAnchor.setNameConstraints(System.Byte[])\">\r\n            <summary>\r\n            Decode the name constraints and clone them if not null.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.TrustAnchor.ToString\">\r\n            <summary>\r\n            Returns a formatted string describing the <code>TrustAnchor</code>.\r\n            </summary>\r\n            <returns>a formatted string describing the <code>TrustAnchor</code></returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Pkix.PkixCrlUtilities.FindCrls(Org.BouncyCastle.X509.Store.X509CrlStoreSelector,System.Collections.IList)\">\r\n            <summary>\r\n            crl checking\r\n            Return a Collection of all CRLs found in the X509Store's that are\r\n            matching the crlSelect criteriums.\r\n            </summary>\r\n            <param name=\"crlSelect\">a {@link X509CRLStoreSelector} object that will be used\r\n            to select the CRLs</param>\r\n            <param name=\"crlStores\">a List containing only {@link org.bouncycastle.x509.X509Store\r\n            X509Store} objects. These are used to search for CRLs</param>\r\n            <returns>a Collection of all found {@link X509CRL X509CRL} objects. May be\r\n            empty but never <code>null</code>.\r\n            </returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Tsp.TimeStampRequest\">\r\n            Base class for an RFC 3161 Time Stamp Request.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequest.#ctor(System.Byte[])\">\r\n             Create a TimeStampRequest from the past in byte array.\r\n            \r\n             @param req byte array containing the request.\r\n             @throws IOException if the request is malformed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequest.#ctor(System.IO.Stream)\">\r\n             Create a TimeStampRequest from the past in input stream.\r\n            \r\n             @param in input stream containing the request.\r\n             @throws IOException if the request is malformed.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequest.Validate(System.Collections.IList,System.Collections.IList,System.Collections.IList)\">\r\n             Validate the timestamp request, checking the digest to see if it is of an\r\n             accepted type and whether it is of the correct length for the algorithm specified.\r\n            \r\n             @param algorithms a set of string OIDS giving accepted algorithms.\r\n             @param policies if non-null a set of policies we are willing to sign under.\r\n             @param extensions if non-null a set of extensions we are willing to accept.\r\n             @throws TspException if the request is invalid, or processing fails.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequest.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Tsp.TimeStampRequestGenerator\">\r\n            Generator for RFC 3161 Time Stamp Request objects.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequestGenerator.AddExtension(System.String,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            add a given extension field for the standard extensions tag (tag 3)\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequestGenerator.AddExtension(System.String,System.Boolean,System.Byte[])\">\r\n            add a given extension field for the standard extensions tag\r\n            The value parameter becomes the contents of the octet string associated\r\n            with the extension.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequestGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            add a given extension field for the standard extensions tag (tag 3)\r\n            @throws IOException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampRequestGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,System.Byte[])\">\r\n            add a given extension field for the standard extensions tag\r\n            The value parameter becomes the contents of the octet string associated\r\n            with the extension.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Tsp.TimeStampResponse\">\r\n            Base class for an RFC 3161 Time Stamp Response object.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampResponse.#ctor(System.Byte[])\">\r\n             Create a TimeStampResponse from a byte array containing an ASN.1 encoding.\r\n            \r\n             @param resp the byte array containing the encoded response.\r\n             @throws TspException if the response is malformed.\r\n             @throws IOException if the byte array doesn't represent an ASN.1 encoding.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampResponse.#ctor(System.IO.Stream)\">\r\n             Create a TimeStampResponse from an input stream containing an ASN.1 encoding.\r\n            \r\n             @param input the input stream containing the encoded response.\r\n             @throws TspException if the response is malformed.\r\n             @throws IOException if the stream doesn't represent an ASN.1 encoding.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampResponse.Validate(Org.BouncyCastle.Tsp.TimeStampRequest)\">\r\n             Check this response against to see if it a well formed response for\r\n             the passed in request. Validation will include checking the time stamp\r\n             token if the response status is GRANTED or GRANTED_WITH_MODS.\r\n            \r\n             @param request the request to be checked against\r\n             @throws TspException if the request can not match this response.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampResponse.GetEncoded\">\r\n            return the ASN.1 encoded representation of this object.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Tsp.TimeStampResponseGenerator\">\r\n            Generator for RFC 3161 Time Stamp Responses.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampResponseGenerator.Generate(Org.BouncyCastle.Tsp.TimeStampRequest,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Utilities.Date.DateTimeObject)\">\r\n             Return an appropriate TimeStampResponse.\r\n             <p>\r\n             If genTime is null a timeNotAvailable error response will be returned.\r\n            \r\n             @param request the request this response is for.\r\n             @param serialNumber serial number for the response token.\r\n             @param genTime generation time for the response token.\r\n             @param provider provider to use for signature calculation.\r\n             @return\r\n             @throws NoSuchAlgorithmException\r\n             @throws NoSuchProviderException\r\n             @throws TSPException\r\n             </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampResponseGenerator.GenerateFailResponse(Org.BouncyCastle.Asn1.Cmp.PkiStatus,System.Int32,System.String)\">\r\n             Generate a TimeStampResponse with chosen status and FailInfoField.\r\n            \r\n             @param status the PKIStatus to set.\r\n             @param failInfoField the FailInfoField to set.\r\n             @param statusString an optional string describing the failure.\r\n             @return a TimeStampResponse with a failInfoField and optional statusString\r\n             @throws TSPException in case the response could not be created\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampToken.Validate(Org.BouncyCastle.X509.X509Certificate)\">\r\n            Validate the time stamp token.\r\n            <p>\r\n            To be valid the token must be signed by the passed in certificate and\r\n            the certificate must be the one referred to by the SigningCertificate\r\n            attribute included in the hashed attributes of the token. The\r\n            certificate must also have the ExtendedKeyUsageExtension with only\r\n            KeyPurposeID.IdKPTimeStamping and have been valid at the time the\r\n            timestamp was created.\r\n            </p>\r\n            <p>\r\n            A successful call to validate means all the above are true.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampToken.ToCmsSignedData\">\r\n             Return the underlying CmsSignedData object.\r\n            \r\n             @return the underlying CMS structure.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampToken.GetEncoded\">\r\n             Return a ASN.1 encoded byte stream representing the encoded object.\r\n            \r\n             @throws IOException if encoding fails.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampTokenGenerator.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String)\">\r\n            basic creation - only the default attributes will be included here.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TimeStampTokenGenerator.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.X509.X509Certificate,System.String,System.String,Org.BouncyCastle.Asn1.Cms.AttributeTable,Org.BouncyCastle.Asn1.Cms.AttributeTable)\">\r\n            create with a signer with extra signed/unsigned attributes.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Tsp.TimeStampTokenInfo.Nonce\">\r\n            @return the nonce value, null if there isn't one.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Tsp.TspAlgorithms\">\r\n            Recognised hash algorithms for the time stamp protocol.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TspUtil.GetSignatureTimestamps(Org.BouncyCastle.Cms.SignerInformation)\">\r\n             Fetches the signature time-stamp attributes from a SignerInformation object.\r\n             Checks that the MessageImprint for each time-stamp matches the signature field.\r\n             (see RFC 3161 Appendix A).\r\n            \r\n             @param signerInfo a SignerInformation to search for time-stamps\r\n             @return a collection of TimeStampToken objects\r\n             @throws TSPValidationException\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TspUtil.ValidateCertificate(Org.BouncyCastle.X509.X509Certificate)\">\r\n             Validate the passed in certificate as being of the correct type to be used\r\n             for time stamping. To be valid it must have an ExtendedKeyUsage extension\r\n             which has a key purpose identifier of id-kp-timeStamping.\r\n            \r\n             @param cert the certificate of interest.\r\n             @throws TspValidationException if the certicate fails on one of the check points.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Tsp.TspUtil.GetDigestAlgName(System.String)\">\r\n            <summary>\r\n            Return the digest algorithm using one of the standard JCA string\r\n            representations rather than the algorithm identifier (if possible).\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Tsp.TspValidationException\">\r\n            Exception thrown if a TSP request or response fails to validate.\r\n            <p>\r\n            If a failure code is associated with the exception it can be retrieved using\r\n            the getFailureCode() method.</p>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.Tsp.TspValidationException.FailureCode\">\r\n             Return the failure code associated with this exception - if one is set.\r\n            \r\n             @return the failure code if set, -1 otherwise.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Arrays\">\r\n            <summary> General array utilities.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Arrays.AreEqual(System.Byte[],System.Byte[])\">\r\n            <summary>\r\n            Are two arrays equal.\r\n            </summary>\r\n            <param name=\"a\">Left side.</param>\r\n            <param name=\"b\">Right side.</param>\r\n            <returns>True if equal.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Arrays.ConstantTimeAreEqual(System.Byte[],System.Byte[])\">\r\n            <summary>\r\n            A constant time equals comparison - does not terminate early if\r\n            test will fail.\r\n            </summary>\r\n            <param name=\"a\">first array</param>\r\n            <param name=\"b\">second array</param>\r\n            <returns>true if arrays equal, false otherwise.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.BigIntegers\">\r\n            BigInteger utilities.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.BigIntegers.AsUnsignedByteArray(Org.BouncyCastle.Math.BigInteger)\">\r\n             Return the passed in value as an unsigned byte array.\r\n            \r\n             @param value value to be converted.\r\n             @return a byte array without a leading zero byte if present in the signed encoding.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.BigIntegers.AsUnsignedByteArray(System.Int32,Org.BouncyCastle.Math.BigInteger)\">\r\n             Return the passed in value as an unsigned byte array of specified length, zero-extended as necessary.\r\n            \r\n             @param length desired length of result array.\r\n             @param n value to be converted.\r\n             @return a byte array of specified length, with leading zeroes as necessary given the size of n.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.BigIntegers.CreateRandomInRange(Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Math.BigInteger,Org.BouncyCastle.Security.SecureRandom)\">\r\n            Return a random BigInteger not less than 'min' and not greater than 'max'\r\n            \r\n            @param min the least value that may be generated\r\n            @param max the greatest value that may be generated\r\n            @param random the source of randomness\r\n            @return a random BigInteger value in the range [min,max]\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Date.DateTimeUtilities.DateTimeToUnixMs(System.DateTime)\">\r\n            <summary>\r\n            Return the number of milliseconds since the Unix epoch (1 Jan., 1970 UTC) for a given DateTime value.\r\n            </summary>\r\n            <param name=\"dateTime\">A UTC DateTime value not before epoch.</param>\r\n            <returns>Number of whole milliseconds after epoch.</returns>\r\n            <exception cref=\"T:System.ArgumentException\">'dateTime' is before epoch.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Date.DateTimeUtilities.UnixMsToDateTime(System.Int64)\">\r\n            <summary>\r\n            Create a DateTime value from the number of milliseconds since the Unix epoch (1 Jan., 1970 UTC).\r\n            </summary>\r\n            <param name=\"unixMs\">Number of milliseconds since the epoch.</param>\r\n            <returns>A UTC DateTime value</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Date.DateTimeUtilities.CurrentUnixMs\">\r\n            <summary>\r\n            Return the current number of milliseconds since the Unix epoch (1 Jan., 1970 UTC).\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Encode(System.Byte[])\">\r\n             encode the input data producing a base 64 encoded byte array.\r\n            \r\n             @return a byte array containing the base 64 encoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Encode(System.Byte[],System.Int32,System.Int32)\">\r\n             encode the input data producing a base 64 encoded byte array.\r\n            \r\n             @return a byte array containing the base 64 encoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Encode(System.Byte[],System.IO.Stream)\">\r\n             Encode the byte data to base 64 writing it to the given output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Encode(System.Byte[],System.Int32,System.Int32,System.IO.Stream)\">\r\n             Encode the byte data to base 64 writing it to the given output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Decode(System.Byte[])\">\r\n             decode the base 64 encoded input data. It is assumed the input data is valid.\r\n            \r\n             @return a byte array representing the decoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Decode(System.String)\">\r\n             decode the base 64 encoded string data - whitespace will be ignored.\r\n            \r\n             @return a byte array representing the decoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64.Decode(System.String,System.IO.Stream)\">\r\n             decode the base 64 encoded string data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64Encoder.Encode(System.Byte[],System.Int32,System.Int32,System.IO.Stream)\">\r\n             encode the input data producing a base 64 output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64Encoder.Decode(System.Byte[],System.Int32,System.Int32,System.IO.Stream)\">\r\n             decode the base 64 encoded byte data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Base64Encoder.DecodeString(System.String,System.IO.Stream)\">\r\n             decode the base 64 encoded string data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.BufferedDecoder\">\r\n            <summary>\r\n             A buffering class to allow translation from one format to another to\r\n                be done in discrete chunks.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.BufferedDecoder.#ctor(Org.BouncyCastle.Utilities.Encoders.ITranslator,System.Int32)\">\r\n            <summary>\r\n            Create a buffered Decoder.\r\n            </summary>\r\n            <param name=\"translator\">The translater to use.</param>\r\n            <param name=\"bufferSize\">The size of the buffer.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.BufferedDecoder.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Process one byte of data.\r\n            </summary>\r\n            <param name=\"input\">Data in.</param>\r\n            <param name=\"output\">Byte array for the output.</param>\r\n            <param name=\"outOff\">The offset in the output byte array to start writing from.</param>\r\n            <returns>The amount of output bytes.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.BufferedDecoder.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Process data from a byte array.\r\n            </summary>\r\n            <param name=\"input\">The input data.</param>\r\n            <param name=\"inOff\">Start position within input data array.</param>\r\n            <param name=\"len\">Amount of data to process from input data array.</param>\r\n            <param name=\"outBytes\">Array to store output.</param>\r\n            <param name=\"outOff\">Position in output array to start writing from.</param>\r\n            <returns>The amount of output bytes.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.BufferedEncoder\">\r\n            <summary>\r\n            A class that allows encoding of data using a specific encoder to be processed in chunks.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.BufferedEncoder.#ctor(Org.BouncyCastle.Utilities.Encoders.ITranslator,System.Int32)\">\r\n            <summary>\r\n            Create.\r\n            </summary>\r\n            <param name=\"translator\">The translator to use.</param>\r\n            <param name=\"bufferSize\">Size of the chunks.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.BufferedEncoder.ProcessByte(System.Byte,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Process one byte of data.\r\n            </summary>\r\n            <param name=\"input\">The byte.</param>\r\n            <param name=\"outBytes\">An array to store output in.</param>\r\n            <param name=\"outOff\">Offset within output array to start writing from.</param>\r\n            <returns></returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.BufferedEncoder.ProcessBytes(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Process data from a byte array.\r\n            </summary>\r\n            <param name=\"input\">Input data Byte array containing data to be processed.</param>\r\n            <param name=\"inOff\">Start position within input data array.</param>\r\n            <param name=\"len\">Amount of input data to be processed.</param>\r\n            <param name=\"outBytes\">Output data array.</param>\r\n            <param name=\"outOff\">Offset within output data array to start writing to.</param>\r\n            <returns>The amount of data written.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.Hex\">\r\n            <summary>\r\n            Class to decode and encode Hex.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Encode(System.Byte[])\">\r\n             encode the input data producing a Hex encoded byte array.\r\n            \r\n             @return a byte array containing the Hex encoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Encode(System.Byte[],System.Int32,System.Int32)\">\r\n             encode the input data producing a Hex encoded byte array.\r\n            \r\n             @return a byte array containing the Hex encoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Encode(System.Byte[],System.IO.Stream)\">\r\n             Hex encode the byte data writing it to the given output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Encode(System.Byte[],System.Int32,System.Int32,System.IO.Stream)\">\r\n             Hex encode the byte data writing it to the given output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Decode(System.Byte[])\">\r\n             decode the Hex encoded input data. It is assumed the input data is valid.\r\n            \r\n             @return a byte array representing the decoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Decode(System.String)\">\r\n             decode the Hex encoded string data - whitespace will be ignored.\r\n            \r\n             @return a byte array representing the decoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.Hex.Decode(System.String,System.IO.Stream)\">\r\n             decode the Hex encoded string data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexEncoder.Encode(System.Byte[],System.Int32,System.Int32,System.IO.Stream)\">\r\n             encode the input data producing a Hex output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexEncoder.Decode(System.Byte[],System.Int32,System.Int32,System.IO.Stream)\">\r\n             decode the Hex encoded byte data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexEncoder.DecodeString(System.String,System.IO.Stream)\">\r\n             decode the Hex encoded string data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.HexTranslator\">\r\n            <summary>\r\n            A hex translator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexTranslator.GetEncodedBlockSize\">\r\n            <summary>\r\n            Return encoded block size.\r\n            </summary>\r\n            <returns>2</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexTranslator.Encode(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Encode some data.\r\n            </summary>\r\n            <param name=\"input\">Input data array.</param>\r\n            <param name=\"inOff\">Start position within input data array.</param>\r\n            <param name=\"length\">The amount of data to process.</param>\r\n            <param name=\"outBytes\">The output data array.</param>\r\n            <param name=\"outOff\">The offset within the output data array to start writing from.</param>\r\n            <returns>Amount of data encoded.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexTranslator.GetDecodedBlockSize\">\r\n            <summary>\r\n            Returns the decoded block size.\r\n            </summary>\r\n            <returns>1</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.HexTranslator.Decode(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)\">\r\n            <summary>\r\n            Decode data from a byte array.\r\n            </summary>\r\n            <param name=\"input\">The input data array.</param>\r\n            <param name=\"inOff\">Start position within input data array.</param>\r\n            <param name=\"length\">The amounty of data to process.</param>\r\n            <param name=\"outBytes\">The output data array.</param>\r\n            <param name=\"outOff\">The position within the output data array to start writing from.</param>\r\n            <returns>The amount of data written.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.IEncoder\">\r\n            Encode and decode byte arrays (typically from binary to 7-bit ASCII\r\n            encodings).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.ITranslator\">\r\n            <summary>\r\n            Translator interface.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.UrlBase64\">\r\n            Convert binary data to and from UrlBase64 encoding.  This is identical to\r\n            Base64 encoding, except that the padding character is \".\" and the other \r\n            non-alphanumeric characters are \"-\" and \"_\" instead of \"+\" and \"/\".\r\n            <p>\r\n            The purpose of UrlBase64 encoding is to provide a compact encoding of binary\r\n            data that is safe for use as an URL parameter. Base64 encoding does not\r\n            produce encoded values that are safe for use in URLs, since \"/\" can be \r\n            interpreted as a path delimiter; \"+\" is the encoded form of a space; and\r\n            \"=\" is used to separate a name from the corresponding value in an URL \r\n            parameter.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.UrlBase64.Encode(System.Byte[])\">\r\n             Encode the input data producing a URL safe base 64 encoded byte array.\r\n            \r\n             @return a byte array containing the URL safe base 64 encoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.UrlBase64.Encode(System.Byte[],System.IO.Stream)\">\r\n             Encode the byte data writing it to the given output stream.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.UrlBase64.Decode(System.Byte[])\">\r\n             Decode the URL safe base 64 encoded input data - white space will be ignored.\r\n            \r\n             @return a byte array representing the decoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.UrlBase64.Decode(System.Byte[],System.IO.Stream)\">\r\n             decode the URL safe base 64 encoded byte data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.UrlBase64.Decode(System.String)\">\r\n             decode the URL safe base 64 encoded string data - whitespace will be ignored.\r\n            \r\n             @return a byte array representing the decoded data.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Encoders.UrlBase64.Decode(System.String,System.IO.Stream)\">\r\n             Decode the URL safe base 64 encoded string data writing it to the given output stream,\r\n             whitespace characters will be ignored.\r\n            \r\n             @return the number of bytes produced.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Encoders.UrlBase64Encoder\">\r\n            Convert binary data to and from UrlBase64 encoding.  This is identical to\r\n            Base64 encoding, except that the padding character is \".\" and the other \r\n            non-alphanumeric characters are \"-\" and \"_\" instead of \"+\" and \"/\".\r\n            <p>\r\n            The purpose of UrlBase64 encoding is to provide a compact encoding of binary\r\n            data that is safe for use as an URL parameter. Base64 encoding does not\r\n            produce encoded values that are safe for use in URLs, since \"/\" can be \r\n            interpreted as a path delimiter; \"+\" is the encoded form of a space; and\r\n            \"=\" is used to separate a name from the corresponding value in an URL \r\n            parameter.\r\n            </p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.IO.Streams.PipeAllLimited(System.IO.Stream,System.Int64,System.IO.Stream)\">\r\n            <summary>\r\n            Pipe all bytes from <c>inStr</c> to <c>outStr</c>, throwing <c>StreamFlowException</c> if greater\r\n            than <c>limit</c> bytes in <c>inStr</c>.\r\n            </summary>\r\n            <param name=\"inStr\">\r\n            A <see cref=\"T:System.IO.Stream\"/>\r\n            </param>\r\n            <param name=\"limit\">\r\n            A <see cref=\"T:System.Int64\"/>\r\n            </param>\r\n            <param name=\"outStr\">\r\n            A <see cref=\"T:System.IO.Stream\"/>\r\n            </param>\r\n            <returns>The number of bytes actually transferred, if not greater than <c>limit</c></returns>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.IO.Pem.PemObjectGenerator.Generate\">\r\n            <returns>\r\n            A <see cref=\"T:Org.BouncyCastle.Utilities.IO.Pem.PemObject\"/>\r\n            </returns>\r\n            <exception cref=\"T:Org.BouncyCastle.Utilities.IO.Pem.PemGenerationException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.IO.Pem.PemObjectParser.ParseObject(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n            <param name=\"obj\">\r\n            A <see cref=\"T:Org.BouncyCastle.Utilities.IO.Pem.PemObject\"/>\r\n            </param>\r\n            <returns>\r\n            A <see cref=\"T:System.Object\"/>\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.IO.Pem.PemReader.ReadPemObject\">\r\n            <returns>\r\n            A <see cref=\"T:Org.BouncyCastle.Utilities.IO.Pem.PemObject\"/>\r\n            </returns>\r\n            <exception cref=\"T:System.IO.IOException\"></exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.IO.Pem.PemWriter\">\r\n            A generic PEM writer, based on RFC 1421\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.IO.Pem.PemWriter.#ctor(System.IO.TextWriter)\">\r\n             Base constructor.\r\n            \r\n             @param out output stream to use.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.IO.Pem.PemWriter.GetOutputSize(Org.BouncyCastle.Utilities.IO.Pem.PemObject)\">\r\n             Return the number of bytes or characters required to contain the\r\n             passed in object if it is PEM encoded.\r\n            \r\n             @param obj pem object to be output\r\n             @return an estimate of the number of bytes\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Net.IPAddress.IsValid(System.String)\">\r\n             Validate the given IPv4 or IPv6 address.\r\n            \r\n             @param address the IP address as a string.\r\n            \r\n             @return true if a valid address, false otherwise\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Net.IPAddress.IsValidWithNetMask(System.String)\">\r\n             Validate the given IPv4 or IPv6 address and netmask.\r\n            \r\n             @param address the IP address as a string.\r\n            \r\n             @return true if a valid address with netmask, false otherwise\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Net.IPAddress.IsValidIPv4(System.String)\">\r\n             Validate the given IPv4 address.\r\n             \r\n             @param address the IP address as a string.\r\n            \r\n             @return true if a valid IPv4 address, false otherwise\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Utilities.Net.IPAddress.IsValidIPv6(System.String)\">\r\n             Validate the given IPv6 address.\r\n            \r\n             @param address the IP address as a string.\r\n            \r\n             @return true if a valid IPv4 address, false otherwise\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Strings\">\r\n            <summary> General string utilities.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Zlib.ZDeflaterOutputStream\">\r\n            <summary>\r\n            Summary description for DeflaterOutputStream.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Utilities.Zlib.ZInflaterInputStream\">\r\n            <summary>\r\n            Summary description for DeflaterOutputStream.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Apache.Bzip2.BZip2Constants\">\r\n             Base class for both the compress and decompress classes.\r\n             Holds common arrays, and static data.\r\n            \r\n             @author <a href=\"mailto:keiron@aftexsw.com\">Keiron Liddle</a>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Apache.Bzip2.CBZip2InputStream\">\r\n             An input stream that decompresses from the BZip2 format (with the file\r\n             header chars) to be read as any other stream.\r\n            \r\n             @author <a href=\"mailto:keiron@aftexsw.com\">Keiron Liddle</a>\r\n            \r\n             <b>NB:</b> note this class has been modified to read the leading BZ from the\r\n             start of the BZIP2 stream to make it compatible with other PGP programs.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Apache.Bzip2.CBZip2OutputStream\">\r\n             An output stream that compresses into the BZip2 format (with the file\r\n             header chars) into another stream.\r\n            \r\n             @author <a href=\"mailto:keiron@aftexsw.com\">Keiron Liddle</a>\r\n            \r\n             TODO:    Update to BZip2 1.0.1\r\n             <b>NB:</b> note this class has been modified to add a leading BZ to the\r\n             start of the BZIP2 stream to make it compatible with other PGP programs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.Apache.Bzip2.CBZip2OutputStream.WriteByte(System.Byte)\">\r\n            \r\n             modified by Oliver Merkel, 010128\r\n            \r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.Apache.Bzip2.CRC\">\r\n             A simple class the hold and calculate the CRC for sanity checking\r\n             of the data.\r\n            \r\n             @author <a href=\"mailto:keiron@aftexsw.com\">Keiron Liddle</a>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.AttributeCertificateHolder\">\r\n            <remarks>\r\n            The Holder object.\r\n            <pre>\r\n            Holder ::= SEQUENCE {\r\n            \tbaseCertificateID   [0] IssuerSerial OPTIONAL,\r\n            \t\t-- the issuer and serial number of\r\n            \t\t-- the holder's Public Key Certificate\r\n            \tentityName          [1] GeneralNames OPTIONAL,\r\n            \t\t-- the name of the claimant or role\r\n            \tobjectDigestInfo    [2] ObjectDigestInfo OPTIONAL\r\n            \t\t-- used to directly authenticate the holder,\r\n            \t\t-- for example, an executable\r\n            }\r\n            </pre>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.AttributeCertificateHolder.#ctor(System.Int32,System.String,System.String,System.Byte[])\">\r\n             Constructs a holder for v2 attribute certificates with a hash value for\r\n             some type of object.\r\n             <p>\r\n             <code>digestedObjectType</code> can be one of the following:\r\n             <ul>\r\n             <li>0 - publicKey - A hash of the public key of the holder must be\r\n             passed.</li>\r\n             <li>1 - publicKeyCert - A hash of the public key certificate of the\r\n             holder must be passed.</li>\r\n             <li>2 - otherObjectDigest - A hash of some other object type must be\r\n             passed. <code>otherObjectTypeID</code> must not be empty.</li>\r\n             </ul>\r\n             </p>\r\n             <p>This cannot be used if a v1 attribute certificate is used.</p>\r\n            \r\n             @param digestedObjectType The digest object type.\r\n             @param digestAlgorithm The algorithm identifier for the hash.\r\n             @param otherObjectTypeID The object type ID if\r\n                        <code>digestedObjectType</code> is\r\n                        <code>otherObjectDigest</code>.\r\n             @param objectDigest The hash value.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.AttributeCertificateHolder.DigestedObjectType\">\r\n             Returns the digest object type if an object digest info is used.\r\n             <p>\r\n             <ul>\r\n             <li>0 - publicKey - A hash of the public key of the holder must be\r\n             passed.</li>\r\n             <li>1 - publicKeyCert - A hash of the public key certificate of the\r\n             holder must be passed.</li>\r\n             <li>2 - otherObjectDigest - A hash of some other object type must be\r\n             passed. <code>otherObjectTypeID</code> must not be empty.</li>\r\n             </ul>\r\n             </p>\r\n            \r\n             @return The digest object type or -1 if no object digest info is set.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.AttributeCertificateHolder.DigestAlgorithm\">\r\n             Returns the other object type ID if an object digest info is used.\r\n            \r\n             @return The other object type ID or <code>null</code> if no object\r\n                     digest info is set.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.AttributeCertificateHolder.GetObjectDigest\">\r\n             Returns the hash if an object digest info is used.\r\n            \r\n             @return The hash or <code>null</code> if no object digest info is set.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.AttributeCertificateHolder.OtherObjectTypeID\">\r\n             Returns the digest algorithm ID if an object digest info is used.\r\n            \r\n             @return The digest algorithm ID or <code>null</code> if no object\r\n                     digest info is set.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.AttributeCertificateHolder.GetEntityNames\">\r\n             Return any principal objects inside the attribute certificate holder entity names field.\r\n            \r\n             @return an array of IPrincipal objects (usually X509Name), null if no entity names field is set.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.AttributeCertificateHolder.GetIssuer\">\r\n             Return the principals associated with the issuer attached to this holder\r\n            \r\n             @return an array of principals, null if no BaseCertificateID is set.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.AttributeCertificateHolder.SerialNumber\">\r\n             Return the serial number associated with the issuer attached to this holder.\r\n            \r\n             @return the certificate serial number, null if no BaseCertificateID is set.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.AttributeCertificateIssuer\">\r\n            Carrying class for an attribute certificate issuer.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.AttributeCertificateIssuer.#ctor(Org.BouncyCastle.Asn1.X509.AttCertIssuer)\">\r\n             Set the issuer directly with the ASN.1 structure.\r\n            \r\n             @param issuer The issuer\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.AttributeCertificateIssuer.GetPrincipals\">\r\n            <summary>Return any principal objects inside the attribute certificate issuer object.</summary>\r\n            <returns>An array of IPrincipal objects (usually X509Principal).</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.Extension.AuthorityKeyIdentifierStructure\">\r\n            <remarks>A high level authority key identifier.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Extension.AuthorityKeyIdentifierStructure.#ctor(Org.BouncyCastle.Asn1.Asn1OctetString)\">\r\n             Constructor which will take the byte[] returned from getExtensionValue()\r\n            \r\n             @param encodedValue a DER octet encoded string with the extension structure in it.\r\n             @throws IOException on parsing errors.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Extension.AuthorityKeyIdentifierStructure.#ctor(Org.BouncyCastle.X509.X509Certificate)\">\r\n             Create an AuthorityKeyIdentifier using the passed in certificate's public\r\n             key, issuer and serial number.\r\n            \r\n             @param certificate the certificate providing the information.\r\n             @throws CertificateParsingException if there is a problem processing the certificate\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Extension.AuthorityKeyIdentifierStructure.#ctor(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n             Create an AuthorityKeyIdentifier using just the hash of the\r\n             public key.\r\n            \r\n             @param pubKey the key to generate the hash from.\r\n             @throws InvalidKeyException if there is a problem using the key.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.Extension.SubjectKeyIdentifierStructure\">\r\n            A high level subject key identifier.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Extension.SubjectKeyIdentifierStructure.#ctor(Org.BouncyCastle.Asn1.Asn1OctetString)\">\r\n             Constructor which will take the byte[] returned from getExtensionValue()\r\n            \r\n             @param encodedValue a DER octet encoded string with the extension structure in it.\r\n             @throws IOException on parsing errors.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.IX509AttributeCertificate\">\r\n            <remarks>Interface for an X.509 Attribute Certificate.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.IX509AttributeCertificate.Version\">\r\n            <summary>The version number for the certificate.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.IX509AttributeCertificate.SerialNumber\">\r\n            <summary>The serial number for the certificate.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.IX509AttributeCertificate.NotBefore\">\r\n            <summary>The UTC DateTime before which the certificate is not valid.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.IX509AttributeCertificate.NotAfter\">\r\n            <summary>The UTC DateTime after which the certificate is not valid.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.IX509AttributeCertificate.Holder\">\r\n            <summary>The holder of the certificate.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.IX509AttributeCertificate.Issuer\">\r\n            <summary>The issuer details for the certificate.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.IX509AttributeCertificate.GetAttributes\">\r\n            <summary>Return the attributes contained in the attribute block in the certificate.</summary>\r\n            <returns>An array of attributes.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.IX509AttributeCertificate.GetAttributes(System.String)\">\r\n            <summary>Return the attributes with the same type as the passed in oid.</summary>\r\n            <param name=\"oid\">The object identifier we wish to match.</param>\r\n            <returns>An array of matched attributes, null if there is no match.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.IX509AttributeCertificate.GetEncoded\">\r\n            <summary>Return an ASN.1 encoded byte array representing the attribute certificate.</summary>\r\n            <returns>An ASN.1 encoded byte array.</returns>\r\n            <exception cref=\"T:System.IO.IOException\">If the certificate cannot be encoded.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.IX509Extension.GetCriticalExtensionOids\">\r\n            <summary>\r\n            Get all critical extension values, by oid\r\n            </summary>\r\n            <returns>IDictionary with string (OID) keys and Asn1OctetString values</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.IX509Extension.GetNonCriticalExtensionOids\">\r\n            <summary>\r\n            Get all non-critical extension values, by oid\r\n            </summary>\r\n            <returns>IDictionary with string (OID) keys and Asn1OctetString values</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.PrincipalUtilities\">\r\n            <remarks>\r\n            A utility class that will extract X509Principal objects from X.509 certificates.\r\n            <p>\r\n            Use this in preference to trying to recreate a principal from a string, not all\r\n            DNs are what they should be, so it's best to leave them encoded where they\r\n            can be.</p>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.PrincipalUtilities.GetIssuerX509Principal(Org.BouncyCastle.X509.X509Certificate)\">\r\n            <summary>Return the issuer of the given cert as an X509Principal.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.PrincipalUtilities.GetSubjectX509Principal(Org.BouncyCastle.X509.X509Certificate)\">\r\n            <summary>Return the subject of the given cert as an X509Principal.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.PrincipalUtilities.GetIssuerX509Principal(Org.BouncyCastle.X509.X509Crl)\">\r\n            <summary>Return the issuer of the given CRL as an X509Principal.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector\">\r\n             This class is an <code>Selector</code> like implementation to select\r\n             attribute certificates from a given set of criteria.\r\n            \r\n             @see org.bouncycastle.x509.X509AttributeCertificate\r\n             @see org.bouncycastle.x509.X509Store\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.Match(System.Object)\">\r\n            <summary>\r\n            Decides if the given attribute certificate should be selected.\r\n            </summary>\r\n            <param name=\"obj\">The attribute certificate to be checked.</param>\r\n            <returns><code>true</code> if the object matches this selector.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.AttributeCert\">\r\n            <summary>The attribute certificate which must be matched.</summary>\r\n            <remarks>If <c>null</c> is given, any will do.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.AttributeCertificateValid\">\r\n            <summary>The criteria for validity</summary>\r\n            <remarks>If <c>null</c> is given any will do.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.Holder\">\r\n            <summary>The holder.</summary>\r\n            <remarks>If <c>null</c> is given any will do.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.Issuer\">\r\n            <summary>The issuer.</summary>\r\n            <remarks>If <c>null</c> is given any will do.</remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.SerialNumber\">\r\n            <summary>The serial number.</summary>\r\n            <remarks>If <c>null</c> is given any will do.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.AddTargetName(Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n             Adds a target name criterion for the attribute certificate to the target\r\n             information extension criteria. The <code>X509AttributeCertificate</code>\r\n             must contain at least one of the specified target names.\r\n             <p>\r\n             Each attribute certificate may contain a target information extension\r\n             limiting the servers where this attribute certificate can be used. If\r\n             this extension is not present, the attribute certificate is not targeted\r\n             and may be accepted by any server.\r\n             </p>\r\n            \r\n             @param name The name as a GeneralName (not <code>null</code>)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.AddTargetName(System.Byte[])\">\r\n             Adds a target name criterion for the attribute certificate to the target\r\n             information extension criteria. The <code>X509AttributeCertificate</code>\r\n             must contain at least one of the specified target names.\r\n             <p>\r\n             Each attribute certificate may contain a target information extension\r\n             limiting the servers where this attribute certificate can be used. If\r\n             this extension is not present, the attribute certificate is not targeted\r\n             and may be accepted by any server.\r\n             </p>\r\n            \r\n             @param name a byte array containing the name in ASN.1 DER encoded form of a GeneralName\r\n             @throws IOException if a parsing error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.SetTargetNames(System.Collections.IEnumerable)\">\r\n            Adds a collection with target names criteria. If <code>null</code> is\r\n            given any will do.\r\n            <p>\r\n            The collection consists of either GeneralName objects or byte[] arrays representing\r\n            DER encoded GeneralName structures.\r\n            </p>\r\n            \r\n            @param names A collection of target names.\r\n            @throws IOException if a parsing error occurs.\r\n            @see #AddTargetName(byte[])\r\n            @see #AddTargetName(GeneralName)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.GetTargetNames\">\r\n            Gets the target names. The collection consists of <code>List</code>s\r\n            made up of an <code>Integer</code> in the first entry and a DER encoded\r\n            byte array or a <code>String</code> in the second entry.\r\n            <p>The returned collection is immutable.</p>\r\n            \r\n            @return The collection of target names\r\n            @see #setTargetNames(Collection)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.AddTargetGroup(Org.BouncyCastle.Asn1.X509.GeneralName)\">\r\n             Adds a target group criterion for the attribute certificate to the target\r\n             information extension criteria. The <code>X509AttributeCertificate</code>\r\n             must contain at least one of the specified target groups.\r\n             <p>\r\n             Each attribute certificate may contain a target information extension\r\n             limiting the servers where this attribute certificate can be used. If\r\n             this extension is not present, the attribute certificate is not targeted\r\n             and may be accepted by any server.\r\n             </p>\r\n            \r\n             @param group The group as GeneralName form (not <code>null</code>)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.AddTargetGroup(System.Byte[])\">\r\n             Adds a target group criterion for the attribute certificate to the target\r\n             information extension criteria. The <code>X509AttributeCertificate</code>\r\n             must contain at least one of the specified target groups.\r\n             <p>\r\n             Each attribute certificate may contain a target information extension\r\n             limiting the servers where this attribute certificate can be used. If\r\n             this extension is not present, the attribute certificate is not targeted\r\n             and may be accepted by any server.\r\n             </p>\r\n            \r\n             @param name a byte array containing the group in ASN.1 DER encoded form of a GeneralName\r\n             @throws IOException if a parsing error occurs.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.SetTargetGroups(System.Collections.IEnumerable)\">\r\n             Adds a collection with target groups criteria. If <code>null</code> is\r\n             given any will do.\r\n             <p>\r\n             The collection consists of <code>GeneralName</code> objects or <code>byte[]</code>\r\n             representing DER encoded GeneralNames.\r\n             </p>\r\n            \r\n             @param names A collection of target groups.\r\n             @throws IOException if a parsing error occurs.\r\n             @see #AddTargetGroup(byte[])\r\n             @see #AddTargetGroup(GeneralName)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509AttrCertStoreSelector.GetTargetGroups\">\r\n             Gets the target groups. The collection consists of <code>List</code>s\r\n             made up of an <code>Integer</code> in the first entry and a DER encoded\r\n             byte array or a <code>String</code> in the second entry.\r\n             <p>The returned collection is immutable.</p>\r\n            \r\n             @return The collection of target groups.\r\n             @see #setTargetGroups(Collection)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.Store.X509CertPairStoreSelector\">\r\n            <remarks>\r\n            This class is an <code>IX509Selector</code> implementation to select\r\n            certificate pairs, which are e.g. used for cross certificates. The set of\r\n            criteria is given from two <code>X509CertStoreSelector</code> objects,\r\n            each of which, if present, must match the respective component of a pair.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CertPairStoreSelector.CertPair\">\r\n            <summary>The certificate pair which is used for testing on equality.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CertPairStoreSelector.ForwardSelector\">\r\n            <summary>The certificate selector for the forward part.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CertPairStoreSelector.ReverseSelector\">\r\n            <summary>The certificate selector for the reverse part.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509CertPairStoreSelector.Match(System.Object)\">\r\n            <summary>\r\n            Decides if the given certificate pair should be selected. If\r\n            <c>obj</c> is not a <code>X509CertificatePair</code>, this method\r\n            returns <code>false</code>.\r\n            </summary>\r\n            <param name=\"obj\">The <code>X509CertificatePair</code> to be tested.</param>\r\n            <returns><code>true</code> if the object matches this selector.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CertStoreSelector.Policy\">\r\n            <summary>\r\n            An <code>ISet</code> of <code>DerObjectIdentifier</code> objects.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.Store.X509CollectionStore\">\r\n            A simple collection backed store.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509CollectionStore.#ctor(System.Collections.ICollection)\">\r\n             Basic constructor.\r\n            \r\n             @param collection - initial contents for the store, this is copied.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509CollectionStore.GetMatches(Org.BouncyCastle.X509.Store.IX509Selector)\">\r\n             Return the matches in the collection for the passed in selector.\r\n            \r\n             @param selector the selector to match against.\r\n             @return a possibly empty collection of matching objects.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.Store.X509CollectionStoreParameters\">\r\n            <remarks>This class contains a collection for collection based <code>X509Store</code>s.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509CollectionStoreParameters.#ctor(System.Collections.ICollection)\">\r\n            <summary>\r\n            Constructor.\r\n            <p>\r\n            The collection is copied.\r\n            </p>\r\n            </summary>\r\n            <param name=\"collection\">The collection containing X.509 object types.</param>\r\n            <exception cref=\"T:System.ArgumentNullException\">If collection is null.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509CollectionStoreParameters.GetCollection\">\r\n            <summary>Returns a copy of the <code>ICollection</code>.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.Store.X509CollectionStoreParameters.ToString\">\r\n            <summary>Returns a formatted string describing the parameters.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.Issuers\">\r\n            <summary>\r\n            An <code>ICollection</code> of <code>X509Name</code> objects\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.AttrCertChecking\">\r\n             The attribute certificate being checked. This is not a criterion.\r\n             Rather, it is optional information that may help a {@link X509Store} find\r\n             CRLs that would be relevant when checking revocation for the specified\r\n             attribute certificate. If <code>null</code> is specified, then no such\r\n             optional information is provided.\r\n            \r\n             @param attrCert the <code>IX509AttributeCertificate</code> being checked (or\r\n                         <code>null</code>)\r\n             @see #getAttrCertificateChecking()\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.CompleteCrlEnabled\">\r\n             If <code>true</code> only complete CRLs are returned. Defaults to\r\n             <code>false</code>.\r\n            \r\n             @return <code>true</code> if only complete CRLs are returned.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.DeltaCrlIndicatorEnabled\">\r\n             Returns if this selector must match CRLs with the delta CRL indicator\r\n             extension set. Defaults to <code>false</code>.\r\n            \r\n             @return Returns <code>true</code> if only CRLs with the delta CRL\r\n                     indicator extension are selected.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.IssuingDistributionPoint\">\r\n             The issuing distribution point.\r\n             <p>\r\n             The issuing distribution point extension is a CRL extension which\r\n             identifies the scope and the distribution point of a CRL. The scope\r\n             contains among others information about revocation reasons contained in\r\n             the CRL. Delta CRLs and complete CRLs must have matching issuing\r\n             distribution points.</p>\r\n             <p>\r\n             The byte array is cloned to protect against subsequent modifications.</p>\r\n             <p>\r\n             You must also enable or disable this criteria with\r\n             {@link #setIssuingDistributionPointEnabled(bool)}.</p>\r\n            \r\n             @param issuingDistributionPoint The issuing distribution point to set.\r\n                                             This is the DER encoded OCTET STRING extension value.\r\n             @see #getIssuingDistributionPoint()\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.IssuingDistributionPointEnabled\">\r\n             Whether the issuing distribution point criteria should be applied.\r\n             Defaults to <code>false</code>.\r\n             <p>\r\n             You may also set the issuing distribution point criteria if not a missing\r\n             issuing distribution point should be assumed.</p>\r\n            \r\n             @return Returns if the issuing distribution point check is enabled.\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.Store.X509CrlStoreSelector.MaxBaseCrlNumber\">\r\n             The maximum base CRL number. Defaults to <code>null</code>.\r\n            \r\n             @return Returns the maximum base CRL number.\r\n             @see #setMaxBaseCRLNumber(BigInteger)\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.SubjectPublicKeyInfoFactory\">\r\n            <summary>\r\n            A factory to produce Public Key Info Objects.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Create a Subject Public Key Info object for a given public key.\r\n            </summary>\r\n            <param name=\"key\">One of ElGammalPublicKeyParameters, DSAPublicKeyParameter, DHPublicKeyParameters, RsaKeyParameters or ECPublicKeyParameters</param>\r\n            <returns>A subject public key info object.</returns>\r\n            <exception cref=\"T:System.Exception\">Throw exception if object provided is not one of the above.</exception>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509AttrCertParser.ReadAttrCert(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509AttrCertParser.ReadAttrCerts(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509AttrCertParser.ReadAttrCert(System.IO.Stream)\">\r\n            Generates a certificate object and initializes it with the data\r\n            read from the input stream inStream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509AttrCertParser.ReadAttrCerts(System.IO.Stream)\">\r\n            Returns a (possibly empty) collection view of the certificates\r\n            read from the given input stream inStream.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509Attribute\">\r\n            Class for carrying the values in an X.509 Attribute.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Attribute.#ctor(Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            @param at an object representing an attribute.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Attribute.#ctor(System.String,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n             Create an X.509 Attribute with the type given by the passed in oid and\r\n             the value represented by an ASN.1 Set containing value.\r\n            \r\n             @param oid type of the attribute\r\n             @param value value object to go into the atribute's value set.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Attribute.#ctor(System.String,Org.BouncyCastle.Asn1.Asn1EncodableVector)\">\r\n             Create an X.59 Attribute with the type given by the passed in oid and the\r\n             value represented by an ASN.1 Set containing the objects in value.\r\n            \r\n             @param oid type of the attribute\r\n             @param value vector of values to go in the attribute's value set.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509Certificate\">\r\n            <summary>\r\n            An Object representing an X509 Certificate.\r\n            Has static methods for loading Certificates encoded in many forms that return X509Certificate Objects.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.IsValidNow\">\r\n            <summary>\r\n            Return true if the current time is within the start and end times nominated on the certificate.\r\n            </summary>\r\n            <returns>true id certificate is valid for the current time.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.IsValid(System.DateTime)\">\r\n            <summary>\r\n            Return true if the nominated time is within the start and end times nominated on the certificate.\r\n            </summary>\r\n            <param name=\"time\">The time to test validity against.</param>\r\n            <returns>True if certificate is valid for nominated time.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.CheckValidity\">\r\n            <summary>\r\n            Checks if the current date is within certificate's validity period.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.CheckValidity(System.DateTime)\">\r\n            <summary>\r\n            Checks if the given date is within certificate's validity period.\r\n            </summary>\r\n            <exception cref=\"T:Org.BouncyCastle.Security.Certificates.CertificateExpiredException\">if the certificate is expired by given date</exception>\r\n            <exception cref=\"T:Org.BouncyCastle.Security.Certificates.CertificateNotYetValidException\">if the certificate is not yet valid on given date</exception>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.Version\">\r\n            <summary>\r\n            Return the certificate's version.\r\n            </summary>\r\n            <returns>An integer whose value Equals the version of the cerficate.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.SerialNumber\">\r\n            <summary>\r\n            Return a <see cref=\"T:Org.BouncyCastle.Math.BigInteger\">BigInteger</see> containing the serial number.\r\n            </summary>\r\n            <returns>The Serial number.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.IssuerDN\">\r\n            <summary>\r\n            Get the Issuer Distinguished Name. (Who signed the certificate.)\r\n            </summary>\r\n            <returns>And X509Object containing name and value pairs.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.SubjectDN\">\r\n            <summary>\r\n            Get the subject of this certificate.\r\n            </summary>\r\n            <returns>An X509Name object containing name and value pairs.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.NotBefore\">\r\n            <summary>\r\n            The time that this certificate is valid from.\r\n            </summary>\r\n            <returns>A DateTime object representing that time in the local time zone.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.NotAfter\">\r\n            <summary>\r\n            The time that this certificate is valid up to.\r\n            </summary>\r\n            <returns>A DateTime object representing that time in the local time zone.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.GetTbsCertificate\">\r\n            <summary>\r\n            Return the Der encoded TbsCertificate data.\r\n            This is the certificate component less the signature.\r\n            To Get the whole certificate call the GetEncoded() member.\r\n            </summary>\r\n            <returns>A byte array containing the Der encoded Certificate component.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.GetSignature\">\r\n            <summary>\r\n            The signature.\r\n            </summary>\r\n            <returns>A byte array containg the signature of the certificate.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.SigAlgName\">\r\n            <summary>\r\n            A meaningful version of the Signature Algorithm. (EG SHA1WITHRSA)\r\n            </summary>\r\n            <returns>A sting representing the signature algorithm.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.SigAlgOid\">\r\n            <summary>\r\n            Get the Signature Algorithms Object ID.\r\n            </summary>\r\n            <returns>A string containg a '.' separated object id.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.GetSigAlgParams\">\r\n            <summary>\r\n            Get the signature algorithms parameters. (EG DSA Parameters)\r\n            </summary>\r\n            <returns>A byte array containing the Der encoded version of the parameters or null if there are none.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.IssuerUniqueID\">\r\n            <summary>\r\n            Get the issuers UID.\r\n            </summary>\r\n            <returns>A DerBitString.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509Certificate.SubjectUniqueID\">\r\n            <summary>\r\n            Get the subjects UID.\r\n            </summary>\r\n            <returns>A DerBitString.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.GetKeyUsage\">\r\n            <summary>\r\n            Get a key usage guidlines.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.GetPublicKey\">\r\n            <summary>\r\n            Get the public key of the subject of the certificate.\r\n            </summary>\r\n            <returns>The public key parameters.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.GetEncoded\">\r\n            <summary>\r\n            Return a Der encoded version of this certificate.\r\n            </summary>\r\n            <returns>A byte array.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Certificate.Verify(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Verify the certificate's signature using the nominated public key.\r\n            </summary>\r\n            <param name=\"key\">An appropriate public key parameter object, RsaPublicKeyParameters, DsaPublicKeyParameters or ECDsaPublicKeyParameters</param>\r\n            <returns>True if the signature is valid.</returns>\r\n            <exception cref=\"T:System.Exception\">If key submitted is not of the above nominated types.</exception>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509CertificatePair\">\r\n            <remarks>\r\n            This class contains a cross certificate pair. Cross certificates pairs may\r\n            contain two cross signed certificates from two CAs. A certificate from the\r\n            other CA to this CA is contained in the forward certificate, the certificate\r\n            from this CA to the other CA is contained in the reverse certificate.\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertificatePair.#ctor(Org.BouncyCastle.X509.X509Certificate,Org.BouncyCastle.X509.X509Certificate)\">\r\n            <summary>Constructor</summary>\r\n            <param name=\"forward\">Certificate from the other CA to this CA.</param>\r\n            <param name=\"reverse\">Certificate from this CA to the other CA.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertificatePair.#ctor(Org.BouncyCastle.Asn1.X509.CertificatePair)\">\r\n            <summary>Constructor from a ASN.1 CertificatePair structure.</summary>\r\n            <param name=\"pair\">The <c>CertificatePair</c> ASN.1 object.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509CertificatePair.Forward\">\r\n            <summary>Returns the certificate from the other CA to this CA.</summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509CertificatePair.Reverse\">\r\n            <summary>Returns the certificate from this CA to the other CA.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509CertificateParser\">\r\n            class for dealing with X509 certificates.\r\n            <p>\r\n            At the moment this will deal with \"-----BEGIN CERTIFICATE-----\" to \"-----END CERTIFICATE-----\"\r\n            base 64 encoded certs, as well as the BER binaries of certificates and some classes of PKCS#7\r\n            objects.</p>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertificateParser.ReadCertificate(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertificateParser.ReadCertificates(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertificateParser.ReadCertificate(System.IO.Stream)\">\r\n            Generates a certificate object and initializes it with the data\r\n            read from the input stream inStream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertificateParser.ReadCertificates(System.IO.Stream)\">\r\n            Returns a (possibly empty) collection view of the certificates\r\n            read from the given input stream inStream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertPairParser.ReadCertPair(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CertPairParser.ReadCertPairs(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509Crl\">\r\n             The following extensions are listed in RFC 2459 as relevant to CRLs\r\n            \r\n             Authority Key Identifier\r\n             Issuer Alternative Name\r\n             CRL Number\r\n             Delta CRL Indicator (critical)\r\n             Issuing Distribution Point (critical)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Crl.ToString\">\r\n             Returns a string representation of this CRL.\r\n            \r\n             @return a string representation of this CRL.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509Crl.IsRevoked(Org.BouncyCastle.X509.X509Certificate)\">\r\n             Checks whether the given certificate is on this CRL.\r\n            \r\n             @param cert the certificate to check for.\r\n             @return true if the given certificate is on this CRL,\r\n             false otherwise.\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509CrlEntry\">\r\n             The following extensions are listed in RFC 2459 as relevant to CRL Entries\r\n            \r\n             ReasonCode Hode Instruction Code Invalidity Date Certificate Issuer\r\n             (critical)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CrlEntry.#ctor(Org.BouncyCastle.Asn1.X509.CrlEntry,System.Boolean,Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n             Constructor for CRLEntries of indirect CRLs. If <code>isIndirect</code>\r\n             is <code>false</code> {@link #getCertificateIssuer()} will always\r\n             return <code>null</code>, <code>previousCertificateIssuer</code> is\r\n             ignored. If this <code>isIndirect</code> is specified and this CrlEntry\r\n             has no certificate issuer CRL entry extension\r\n             <code>previousCertificateIssuer</code> is returned by\r\n             {@link #getCertificateIssuer()}.\r\n            \r\n             @param c\r\n                        TbsCertificateList.CrlEntry object.\r\n             @param isIndirect\r\n                        <code>true</code> if the corresponding CRL is a indirect\r\n                        CRL.\r\n             @param previousCertificateIssuer\r\n                        Certificate issuer of the previous CrlEntry.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CrlParser.ReadCrl(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CrlParser.ReadCrls(System.Byte[])\">\r\n            <summary>\r\n            Create loading data from byte array.\r\n            </summary>\r\n            <param name=\"input\"></param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CrlParser.ReadCrl(System.IO.Stream)\">\r\n            Generates a certificate revocation list (CRL) object and initializes\r\n            it with the data read from the input stream inStream.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509CrlParser.ReadCrls(System.IO.Stream)\">\r\n             Returns a (possibly empty) collection view of the CRLs read from\r\n             the given input stream inStream.\r\n            \r\n             The inStream may contain a sequence of DER-encoded CRLs, or\r\n             a PKCS#7 CRL set.  This is a PKCS#7 SignedData object, with the\r\n             only significant field being crls.  In particular the signature\r\n             and the contents are ignored.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509ExtensionBase.GetNonCriticalExtensionOids\">\r\n            <summary>\r\n            Get non critical extensions.\r\n            </summary>\r\n            <returns>A set of non critical extension oids.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509ExtensionBase.GetCriticalExtensionOids\">\r\n            <summary>\r\n            Get any critical extensions.\r\n            </summary>\r\n            <returns>A sorted list of critical entension.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509ExtensionBase.GetExtensionValue(System.String)\">\r\n            <summary>\r\n            Get the value of a given extension.\r\n            </summary>\r\n            <param name=\"oid\">The object ID of the extension. </param>\r\n            <returns>An Asn1OctetString object if that extension is found or null if not.</returns>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509KeyUsage\">\r\n             A holding class for constructing an X509 Key Usage extension.\r\n            \r\n             <pre>\r\n                id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }\r\n            \r\n                KeyUsage ::= BIT STRING {\r\n                     digitalSignature        (0),\r\n                     nonRepudiation          (1),\r\n                     keyEncipherment         (2),\r\n                     dataEncipherment        (3),\r\n                     keyAgreement            (4),\r\n                     keyCertSign             (5),\r\n                     cRLSign                 (6),\r\n                     encipherOnly            (7),\r\n                     decipherOnly            (8) }\r\n             </pre>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509KeyUsage.#ctor(System.Int32)\">\r\n             Basic constructor.\r\n            \r\n             @param usage - the bitwise OR of the Key Usage flags giving the\r\n             allowed uses for the key.\r\n             e.g. (X509KeyUsage.keyEncipherment | X509KeyUsage.dataEncipherment)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509SignatureUtilities.GetDigestAlgName(Org.BouncyCastle.Asn1.DerObjectIdentifier)\">\r\n            Return the digest algorithm using one of the standard JCA string\r\n            representations rather than the algorithm identifier (if possible).\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509V1CertificateGenerator\">\r\n            <summary>\r\n            Class to Generate X509V1 Certificates.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.#ctor\">\r\n            <summary>\r\n            Default Constructor.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.Reset\">\r\n            <summary>\r\n            Reset the generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetSerialNumber(Org.BouncyCastle.Math.BigInteger)\">\r\n            <summary>\r\n            Set the certificate's serial number.\r\n            </summary>\r\n            <remarks>Make serial numbers long, if you have no serial number policy make sure the number is at least 16 bytes of secure random data.\r\n            You will be surprised how ugly a serial number collision can get.</remarks>\r\n            <param name=\"serialNumber\">The serial number.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetIssuerDN(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n            <summary>\r\n            Set the issuer distinguished name.\r\n            The issuer is the entity whose private key is used to sign the certificate.\r\n            </summary>\r\n            <param name=\"issuer\">The issuers DN.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetNotBefore(System.DateTime)\">\r\n            <summary>\r\n            Set the date that this certificate is to be valid from.\r\n            </summary>\r\n            <param name=\"date\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetNotAfter(System.DateTime)\">\r\n            <summary>\r\n            Set the date after which this certificate will no longer be valid.\r\n            </summary>\r\n            <param name=\"date\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetSubjectDN(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n            <summary>\r\n            Set the subject distinguished name.\r\n            The subject describes the entity associated with the public key.\r\n            </summary>\r\n            <param name=\"subject\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetPublicKey(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Set the public key that this certificate identifies.\r\n            </summary>\r\n            <param name=\"publicKey\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.SetSignatureAlgorithm(System.String)\">\r\n            <summary>\r\n            Set the signature algorithm that will be used to sign this certificate.\r\n            This can be either a name or an OID, names are treated as case insensitive.\r\n            </summary>\r\n            <param name=\"signatureAlgorithm\">string representation of the algorithm name</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Generate a new X509Certificate.\r\n            </summary>\r\n            <param name=\"privateKey\">The private key of the issuer used to sign this certificate.</param>\r\n            <returns>An X509Certificate.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V1CertificateGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Generate a new X509Certificate specifying a SecureRandom instance that you would like to use.\r\n            </summary>\r\n            <param name=\"privateKey\">The private key of the issuer used to sign this certificate.</param>\r\n            <param name=\"random\">The Secure Random you want to use.</param>\r\n            <returns>An X509Certificate.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509V1CertificateGenerator.SignatureAlgNames\">\r\n            <summary>\r\n            Allows enumeration of the signature names supported by the generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509V2AttributeCertificate\">\r\n            <summary>An implementation of a version 2 X.509 Attribute Certificate.</summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator\">\r\n            <remarks>Class to produce an X.509 Version 2 AttributeCertificate.</remarks>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.Reset\">\r\n            <summary>Reset the generator</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.SetHolder(Org.BouncyCastle.X509.AttributeCertificateHolder)\">\r\n            <summary>Set the Holder of this Attribute Certificate.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.SetIssuer(Org.BouncyCastle.X509.AttributeCertificateIssuer)\">\r\n            <summary>Set the issuer.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.SetSerialNumber(Org.BouncyCastle.Math.BigInteger)\">\r\n            <summary>Set the serial number for the certificate.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.SetSignatureAlgorithm(System.String)\">\r\n            <summary>\r\n            Set the signature algorithm. This can be either a name or an OID, names\r\n            are treated as case insensitive.\r\n            </summary>\r\n            <param name=\"signatureAlgorithm\">The algorithm name.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.AddAttribute(Org.BouncyCastle.X509.X509Attribute)\">\r\n            <summary>Add an attribute.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.AddExtension(System.String,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            <summary>Add a given extension field for the standard extensions tag.</summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.AddExtension(System.String,System.Boolean,System.Byte[])\">\r\n            <summary>\r\n            Add a given extension field for the standard extensions tag.\r\n            The value parameter becomes the contents of the octet string associated\r\n            with the extension.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Generate an X509 certificate, based on the current issuer and subject.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Generate an X509 certificate, based on the current issuer and subject,\r\n            using the supplied source of randomness, if required.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509V2AttributeCertificateGenerator.SignatureAlgNames\">\r\n            <summary>\r\n            Allows enumeration of the signature names supported by the generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509V2CrlGenerator\">\r\n            class to produce an X.509 Version 2 CRL.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.Reset\">\r\n            reset the generator\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.SetIssuerDN(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n            Set the issuer distinguished name - the issuer is the entity whose private key is used to sign the\r\n            certificate.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddCrlEntry(Org.BouncyCastle.Math.BigInteger,System.DateTime,System.Int32)\">\r\n             Reason being as indicated by CrlReason, i.e. CrlReason.KeyCompromise\r\n             or 0 if CrlReason is not to be used\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddCrlEntry(Org.BouncyCastle.Math.BigInteger,System.DateTime,System.Int32,System.DateTime)\">\r\n             Add a CRL entry with an Invalidity Date extension as well as a CrlReason extension.\r\n             Reason being as indicated by CrlReason, i.e. CrlReason.KeyCompromise\r\n             or 0 if CrlReason is not to be used\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddCrlEntry(Org.BouncyCastle.Math.BigInteger,System.DateTime,Org.BouncyCastle.Asn1.X509.X509Extensions)\">\r\n             Add a CRL entry with extensions.\r\n            \r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddCrl(Org.BouncyCastle.X509.X509Crl)\">\r\n             Add the CRLEntry objects contained in a previous CRL.\r\n            \r\n             @param other the X509Crl to source the other entries from.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.SetSignatureAlgorithm(System.String)\">\r\n             Set the signature algorithm. This can be either a name or an oid, names\r\n             are treated as case insensitive.\r\n            \r\n             @param signatureAlgorithm string representation of the algorithm name.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddExtension(System.String,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            add a given extension field for the standard extensions tag (tag 0)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            add a given extension field for the standard extensions tag (tag 0)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddExtension(System.String,System.Boolean,System.Byte[])\">\r\n            add a given extension field for the standard extensions tag (tag 0)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,System.Byte[])\">\r\n            add a given extension field for the standard extensions tag (tag 0)\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>Generate an X509 CRL, based on the current issuer and subject.</summary>\r\n            <param name=\"privateKey\">The key used for signing.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V2CrlGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>Generate an X509 CRL, based on the current issuer and subject.</summary>\r\n            <param name=\"privateKey\">The key used for signing.</param>\r\n            <param name=\"random\">A user-defined source of randomness.</param>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509V2CrlGenerator.SignatureAlgNames\">\r\n            <summary>\r\n            Allows enumeration of the signature names supported by the generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:Org.BouncyCastle.X509.X509V3CertificateGenerator\">\r\n            <summary>\r\n            A class to Generate Version 3 X509Certificates.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.Reset\">\r\n            <summary>\r\n            Reset the Generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetSerialNumber(Org.BouncyCastle.Math.BigInteger)\">\r\n            <summary>\r\n            Set the certificate's serial number.\r\n            </summary>\r\n            <remarks>Make serial numbers long, if you have no serial number policy make sure the number is at least 16 bytes of secure random data.\r\n            You will be surprised how ugly a serial number collision can Get.</remarks>\r\n            <param name=\"serialNumber\">The serial number.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetIssuerDN(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n            <summary>\r\n            Set the distinguished name of the issuer.\r\n            The issuer is the entity which is signing the certificate.\r\n            </summary>\r\n            <param name=\"issuer\">The issuer's DN.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetNotBefore(System.DateTime)\">\r\n            <summary>\r\n            Set the date that this certificate is to be valid from.\r\n            </summary>\r\n            <param name=\"date\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetNotAfter(System.DateTime)\">\r\n            <summary>\r\n            Set the date after which this certificate will no longer be valid.\r\n            </summary>\r\n            <param name=\"date\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetSubjectDN(Org.BouncyCastle.Asn1.X509.X509Name)\">\r\n            <summary>\r\n            Set the DN of the entity that this certificate is about.\r\n            </summary>\r\n            <param name=\"subject\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetPublicKey(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Set the public key that this certificate identifies.\r\n            </summary>\r\n            <param name=\"publicKey\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetSignatureAlgorithm(System.String)\">\r\n            <summary>\r\n            Set the signature algorithm that will be used to sign this certificate.\r\n            </summary>\r\n            <param name=\"signatureAlgorithm\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetSubjectUniqueID(System.Boolean[])\">\r\n            <summary>\r\n            Set the subject unique ID - note: it is very rare that it is correct to do this.\r\n            </summary>\r\n            <param name=\"uniqueID\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.SetIssuerUniqueID(System.Boolean[])\">\r\n            <summary>\r\n            Set the issuer unique ID - note: it is very rare that it is correct to do this.\r\n            </summary>\r\n            <param name=\"uniqueID\"/>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.AddExtension(System.String,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            <summary>\r\n            Add a given extension field for the standard extensions tag (tag 3).\r\n            </summary>\r\n            <param name=\"oid\">string containing a dotted decimal Object Identifier.</param>\r\n            <param name=\"critical\">Is it critical.</param>\r\n            <param name=\"extensionValue\">The value.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,Org.BouncyCastle.Asn1.Asn1Encodable)\">\r\n            <summary>\r\n            Add an extension to this certificate.\r\n            </summary>\r\n            <param name=\"oid\">Its Object Identifier.</param>\r\n            <param name=\"critical\">Is it critical.</param>\r\n            <param name=\"extensionValue\">The value.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.AddExtension(System.String,System.Boolean,System.Byte[])\">\r\n            <summary>\r\n            Add an extension using a string with a dotted decimal OID.\r\n            </summary>\r\n            <param name=\"oid\">string containing a dotted decimal Object Identifier.</param>\r\n            <param name=\"critical\">Is it critical.</param>\r\n            <param name=\"extensionValue\">byte[] containing the value of this extension.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.AddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,System.Byte[])\">\r\n            <summary>\r\n            Add an extension to this certificate.\r\n            </summary>\r\n            <param name=\"oid\">Its Object Identifier.</param>\r\n            <param name=\"critical\">Is it critical.</param>\r\n            <param name=\"extensionValue\">byte[] containing the value of this extension.</param>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.CopyAndAddExtension(System.String,System.Boolean,Org.BouncyCastle.X509.X509Certificate)\">\r\n            <summary>\r\n            Add a given extension field for the standard extensions tag (tag 3),\r\n            copying the extension value from another certificate.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.CopyAndAddExtension(Org.BouncyCastle.Asn1.DerObjectIdentifier,System.Boolean,Org.BouncyCastle.X509.X509Certificate)\">\r\n            add a given extension field for the standard extensions tag (tag 3)\r\n            copying the extension value from another certificate.\r\n            @throws CertificateParsingException if the extension cannot be extracted.\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter)\">\r\n            <summary>\r\n            Generate an X509Certificate.\r\n            </summary>\r\n            <param name=\"privateKey\">The private key of the issuer that is signing this certificate.</param>\r\n            <returns>An X509Certificate.</returns>\r\n        </member>\r\n        <member name=\"M:Org.BouncyCastle.X509.X509V3CertificateGenerator.Generate(Org.BouncyCastle.Crypto.AsymmetricKeyParameter,Org.BouncyCastle.Security.SecureRandom)\">\r\n            <summary>\r\n            Generate an X509Certificate using your own SecureRandom.\r\n            </summary>\r\n            <param name=\"privateKey\">The private key of the issuer that is signing this certificate.</param>\r\n            <param name=\"random\">You Secure Random instance.</param>\r\n            <returns>An X509Certificate.</returns>\r\n        </member>\r\n        <member name=\"P:Org.BouncyCastle.X509.X509V3CertificateGenerator.SignatureAlgNames\">\r\n            <summary>\r\n            Allows enumeration of the signature names supported by the generator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTree.Add(System.IComparable,System.Object)\">\r\n            <summary>\r\n             Add\r\n             args: ByVal key As IComparable, ByVal data As Object\r\n             key is object that implements IComparable interface\r\n             performance tip: change to use use int type (such as the hashcode)\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTree.RestoreAfterInsert(System.util.collections.OrderedTreeNode)\">\r\n            <summary>\r\n             RestoreAfterInsert\r\n             Additions to red-black trees usually destroy the red-black \r\n             properties. Examine the tree and restore. Rotations are normally \r\n             required to restore it\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTree.RotateLeft(System.util.collections.OrderedTreeNode)\">\r\n            <summary>\r\n             RotateLeft\r\n             Rebalance the tree by rotating the nodes to the left\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTree.RotateRight(System.util.collections.OrderedTreeNode)\">\r\n            <summary>\r\n             RotateRight\r\n             Rebalance the tree by rotating the nodes to the right\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.GetData(System.IComparable)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.GetMinKey”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.GetMaxKey”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.GetMinValue”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.GetMaxValue”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.GetEnumerator”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:System.util.collections.OrderedTree.Keys”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“P:System.util.collections.OrderedTree.Values”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.Elements”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.IsEmpty”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.Remove(System.IComparable)”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.Delete(System.util.collections.OrderedTreeNode)”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"M:System.util.collections.OrderedTree.RestoreAfterDelete(System.util.collections.OrderedTreeNode)\">\r\n            <summary>\r\n             RestoreAfterDelete\r\n             Deletions from red-black trees may destroy the red-black \r\n             properties. Examine the tree and restore. Rotations are normally \r\n             required to restore it\r\n            </summary>\r\n        </member>\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.RemoveMin”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.RemoveMax”忽略有格式错误的 XML 注释 -->\r\n        <!-- 对于成员“M:System.util.collections.OrderedTree.Clear”忽略有格式错误的 XML 注释 -->\r\n        <member name=\"P:System.util.collections.OrderedTreeEnumerator.Key\">\r\n            <summary>\r\n            Key\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.OrderedTreeEnumerator.Value\">\r\n            <summary>\r\n            Data\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTreeEnumerator.#ctor(System.util.collections.OrderedTreeNode,System.Boolean,System.Boolean,System.util.collections.OrderedTreeNode)\">\r\n            <summary>\r\n             Determine order, walk the tree and push the nodes onto the stack\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTreeEnumerator.HasMoreElements\">\r\n            <summary>\r\n             HasMoreElements\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTreeEnumerator.NextElement\">\r\n            <summary>\r\n             NextElement\r\n            </summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.OrderedTreeEnumerator.MoveNext\">\r\n            <summary>\r\n             MoveNext\r\n             For .NET compatibility\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.OrderedTreeNode.Key\">\r\n            <summary>\r\n            Key\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.OrderedTreeNode.Data\">\r\n            <summary>\r\n            Data\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.OrderedTreeNode.Color\">\r\n            <summary>\r\n            Color\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.OrderedTreeNode.Left\">\r\n            <summary>\r\n            Left\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.OrderedTreeNode.Right\">\r\n            <summary>\r\n             Right\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:System.util.collections.ReadOnlyDictionary`2\">\r\n            <summary>\r\n            Provides the base class for a generic read-only dictionary.\r\n            </summary>\r\n            <typeparam name=\"TKey\">\r\n            The type of keys in the dictionary.\r\n            </typeparam>\r\n            <typeparam name=\"TValue\">\r\n            The type of values in the dictionary.\r\n            </typeparam>\r\n            <remarks>\r\n            <para>\r\n            An instance of the <b>ReadOnlyDictionary</b> generic class is\r\n            always read-only. A dictionary that is read-only is simply a\r\n            dictionary with a wrapper that prevents modifying the\r\n            dictionary; therefore, if changes are made to the underlying\r\n            dictionary, the read-only dictionary reflects those changes. \r\n            See <see cref=\"T:System.Collections.Generic.Dictionary`2\"/> for a modifiable version of \r\n            this class.\r\n            </para>\r\n            <para>\r\n            <b>Notes to Implementers</b> This base class is provided to \r\n            make it easier for implementers to create a generic read-only\r\n            custom dictionary. Implementers are encouraged to extend this\r\n            base class instead of creating their own. \r\n            </para>\r\n            </remarks>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.#ctor(System.Collections.Generic.IDictionary{`0,`1})\">\r\n            <summary>\r\n            Initializes a new instance of the\r\n            <see cref=\"T:ReadOnlyDictionary`2\" /> class that wraps\r\n            the supplied <paramref name=\"dictionaryToWrap\"/>.\r\n            </summary>\r\n            <param name=\"dictionaryToWrap\">The <see cref=\"T:IDictionary`2\" />\r\n            that will be wrapped.</param>\r\n            <exception cref=\"T:System.ArgumentNullException\">\r\n            Thrown when the dictionary is null.\r\n            </exception>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.Count\">\r\n            <summary>\r\n            Gets the number of key/value pairs contained in the\r\n            <see cref=\"T:ReadOnlyDictionary`2\"></see>.\r\n            </summary>\r\n            <value>The number of key/value pairs.</value>\r\n            <returns>The number of key/value pairs contained in the\r\n            <see cref=\"T:ReadOnlyDictionary`2\"></see>.</returns>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.Keys\">\r\n            <summary>Gets a collection containing the keys in the\r\n            <see cref=\"T:ReadOnlyDictionary{TKey,TValue}\"></see>.</summary>\r\n            <value>A <see cref=\"T:System.Collections.Generic.Dictionary`2.KeyCollection\"/> \r\n            containing the keys.</value>\r\n            <returns>A\r\n            <see cref=\"T:System.Collections.Generic.Dictionary`2.KeyCollection\"/>\r\n            containing the keys in the\r\n            <see cref=\"T:System.Collections.Generic.Dictionary`2\"></see>.\r\n            </returns>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.Values\">\r\n            <summary>\r\n            Gets a collection containing the values of the\r\n            <see cref=\"T:ReadOnlyDictionary`2\"/>.\r\n            </summary>\r\n            <value>The collection of values.</value>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey,TValue}}#IsReadOnly\">\r\n            <summary>Gets a value indicating whether the dictionary is read-only.\r\n            This value will always be true.</summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.System#Collections#ICollection#IsSynchronized\">\r\n            <summary>\r\n            Gets a value indicating whether access to the dictionary\r\n            is synchronized (thread safe).\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.System#Collections#ICollection#SyncRoot\">\r\n            <summary>\r\n            Gets an object that can be used to synchronize access to dictionary.\r\n            </summary>\r\n        </member>\r\n        <member name=\"P:System.util.collections.ReadOnlyDictionary`2.Item(`0)\">\r\n            <summary>\r\n            Gets or sets the value associated with the specified key.\r\n            </summary>\r\n            <returns>\r\n            The value associated with the specified key. If the specified key\r\n            is not found, a get operation throws a \r\n            <see cref=\"T:System.Collections.Generic.KeyNotFoundException\" />,\r\n            and a set operation creates a new element with the specified key.\r\n            </returns>\r\n            <param name=\"key\">The key of the value to get or set.</param>\r\n            <exception cref=\"T:System.ArgumentNullException\">\r\n            Thrown when the key is null.\r\n            </exception>\r\n            <exception cref=\"T:System.Collections.Generic.KeyNotFoundException\">\r\n            The property is retrieved and key does not exist in the collection.\r\n            </exception>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#IDictionary{TKey,TValue}#Add(`0,`1)\">\r\n            <summary>This method is not supported by the \r\n            <see cref=\"T:ReadOnlyDictionary`2\"/>.</summary>\r\n            <param name=\"key\">\r\n            The object to use as the key of the element to add.</param>\r\n            <param name=\"value\">\r\n            The object to use as the value of the element to add.</param>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.ContainsKey(`0)\">\r\n            <summary>Determines whether the <see cref=\"T:ReadOnlyDictionary`2\" />\r\n            contains the specified key.</summary>\r\n            <returns>\r\n            True if the <see cref=\"T:ReadOnlyDictionary`2\" /> contains\r\n            an element with the specified key; otherwise, false.\r\n            </returns>\r\n            <param name=\"key\">The key to locate in the\r\n            <see cref=\"T:ReadOnlyDictionary`2\"></see>.</param>\r\n            <exception cref=\"T:System.ArgumentNullException\">\r\n            Thrown when the key is null.\r\n            </exception>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#IDictionary{TKey,TValue}#Remove(`0)\">\r\n            <summary>\r\n            This method is not supported by the <see cref=\"T:ReadOnlyDictionary`2\"/>.\r\n            </summary>\r\n            <param name=\"key\">The key of the element to remove.</param>\r\n            <returns>\r\n            True if the element is successfully removed; otherwise, false.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.TryGetValue(`0,`1@)\">\r\n            <summary>\r\n            Gets the value associated with the specified key.\r\n            </summary>\r\n            <param name=\"key\">The key of the value to get.</param>\r\n            <param name=\"value\">When this method returns, contains the value\r\n            associated with the specified key, if the key is found;\r\n            otherwise, the default value for the type of the value parameter.\r\n            This parameter is passed uninitialized.</param>\r\n            <returns>\r\n            <b>true</b> if the <see cref=\"T:ReadOnlyDictionary`2\" /> contains\r\n            an element with the specified key; otherwise, <b>false</b>.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey,TValue}}#Add(System.Collections.Generic.KeyValuePair{`0,`1})\">\r\n            <summary>This method is not supported by the\r\n            <see cref=\"T:ReadOnlyDictionary`2\"/>.</summary>\r\n            <param name=\"item\">\r\n            The object to add to the <see cref=\"T:ICollection`1\"/>.\r\n            </param>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey,TValue}}#Clear\">\r\n            <summary>This method is not supported by the \r\n            <see cref=\"T:ReadOnlyDictionary`2\"/>.</summary>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey,TValue}}#Contains(System.Collections.Generic.KeyValuePair{`0,`1})\">\r\n            <summary>\r\n            Determines whether the <see cref=\"T:ICollection`1\"/> contains a\r\n            specific value.\r\n            </summary>\r\n            <param name=\"item\">\r\n            The object to locate in the <see cref=\"T:ICollection`1\"/>.\r\n            </param>\r\n            <returns>\r\n            <b>true</b> if item is found in the <b>ICollection</b>; \r\n            otherwise, <b>false</b>.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey,TValue}}#CopyTo(System.Collections.Generic.KeyValuePair{`0,`1}[],System.Int32)\">\r\n            <summary>\r\n            Copies the elements of the ICollection to an Array, starting at a\r\n            particular Array index. \r\n            </summary>\r\n            <param name=\"array\">The one-dimensional Array that is the\r\n            destination of the elements copied from ICollection.\r\n            The Array must have zero-based indexing.\r\n            </param>\r\n            <param name=\"arrayIndex\">\r\n            The zero-based index in array at which copying begins.\r\n            </param>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey,TValue}}#Remove(System.Collections.Generic.KeyValuePair{`0,`1})\">\r\n            <summary>This method is not supported by the\r\n            <see cref=\"T:ReadOnlyDictionary`2\"/>.</summary>\r\n            <param name=\"item\">\r\n            The object to remove from the ICollection.\r\n            </param>\r\n            <returns>Will never return a value.</returns>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#Generic#IEnumerable{System#Collections#Generic#KeyValuePair{TKey,TValue}}#GetEnumerator\">\r\n            <summary>\r\n            Returns an enumerator that iterates through the collection.\r\n            </summary>\r\n            <returns>\r\n            A IEnumerator that can be used to iterate through the collection.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#IEnumerable#GetEnumerator\">\r\n            <summary>\r\n            Returns an enumerator that iterates through a collection.\r\n            </summary>\r\n            <returns>\r\n            An IEnumerator that can be used to iterate through the collection.\r\n            </returns>\r\n        </member>\r\n        <member name=\"M:System.util.collections.ReadOnlyDictionary`2.System#Collections#ICollection#CopyTo(System.Array,System.Int32)\">\r\n            <summary>\r\n            For a description of this member, see <see cref=\"M:System.Collections.ICollection.CopyTo(System.Array,System.Int32)\"/>. \r\n            </summary>\r\n            <param name=\"array\">\r\n            The one-dimensional Array that is the destination of the elements copied from \r\n            ICollection. The Array must have zero-based indexing.\r\n            </param>\r\n            <param name=\"index\">\r\n            The zero-based index in Array at which copying begins.\r\n            </param>\r\n        </member>\r\n        <member name=\"T:System.util.ListIterator`1\">\r\n            <summary>\r\n            Summary description for ListIterator.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:System.util.Properties\">\r\n            <summary>\r\n            Summary description for Properties.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:System.util.Util\">\r\n            <summary>\r\n            Summary description for Util.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:System.util.zlib.ZDeflaterOutputStream\">\r\n            <summary>\r\n            Summary description for DeflaterOutputStream.\r\n            </summary>\r\n        </member>\r\n        <member name=\"T:System.util.zlib.ZInflaterInputStream\">\r\n            <summary>\r\n            Summary description for DeflaterOutputStream.\r\n            </summary>\r\n        </member>\r\n    </members>\r\n</doc>\r\n"
  },
  {
    "path": "App/MainForm.Designer.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tpartial class MainForm\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 必需的设计器变量。\r\n\t\t/// </summary>\r\n\t\tprivate System.ComponentModel.IContainer components = null;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 清理所有正在使用的资源。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"disposing\">如果应释放托管资源，为 true；否则为 false。</param>\r\n\t\tprotected override void Dispose (bool disposing) {\r\n\t\t\tif (disposing && (components != null)) {\r\n\t\t\t\tcomponents.Dispose ();\r\n\t\t\t}\r\n\t\t\tbase.Dispose (disposing);\r\n\t\t}\r\n\r\n\t\t#region Windows 窗体设计器生成的代码\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设计器支持所需的方法 - 不要\r\n\t\t/// 使用代码编辑器修改此方法的内容。\r\n\t\t/// </summary>\r\n\t\tprivate void InitializeComponent () {\r\n\t\t\tthis.components = new System.ComponentModel.Container();\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Select;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Copy;\r\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Delete;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator3;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAllPdfFiles;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAllImages;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAllFolders;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator _ItemTypeSeparator;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectAll;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InvertSelection;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SelectNone;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ToolBox;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem toolStripMenuItem23;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Patcher;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Merger;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Rename;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _OcrImages;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _GenerateBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _InfoExchanger;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Imaging;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Extract;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExtractImages;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RenderPages;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Explorer;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ExportInfoFile;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator5;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ShowGeneralToolbar;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _CustomizeToolbarCommand;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _LogWindow;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Help;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _CreateShortcut;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _CheckUpdate;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _VisitHomePage;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _About;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Open;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem dummyToolStripMenuItem;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _ImportBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Action;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SaveBookmark;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SaveAsInfoFile;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator _configSeparator;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _AppOptions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _RestoreOptions;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _SaveOptions;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator11;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Exit;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Close;\r\n\t\t\tSystem.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Options;\r\n\t\t\tSystem.Windows.Forms.ToolStripButton _CustomizeToolbar;\r\n\t\t\tSystem.Windows.Forms.ToolStripMenuItem _Properties;\r\n\t\t\tthis.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\tthis._ToolTip = new System.Windows.Forms.ToolTip(this.components);\r\n\t\t\tthis._SaveConfigDialog = new System.Windows.Forms.SaveFileDialog();\r\n\t\t\tthis._OpenConfigDialog = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis._MainMenu = new System.Windows.Forms.MenuStrip();\r\n\t\t\tthis._File = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._RecentFiles = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._ResetOptions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._OpenPdfDialog = new System.Windows.Forms.OpenFileDialog();\r\n\t\t\tthis.statusStrip1 = new System.Windows.Forms.StatusStrip();\r\n\t\t\tthis._MainStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\r\n\t\t\tthis._GeneralToolbar = new System.Windows.Forms.ToolStrip();\r\n\t\t\tthis._FunctionContainer = new PDFPatcher.Functions.FunctionTabContainer();\r\n\t\t\tthis._FullScreenDisplay = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Select = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Copy = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Delete = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_SelectAllPdfFiles = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectAllImages = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectAllFolders = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ItemTypeSeparator = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_SelectAll = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InvertSelection = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SelectNone = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ToolBox = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripMenuItem23 = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Patcher = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Merger = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Rename = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_OcrImages = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_GenerateBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_InfoExchanger = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Imaging = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Extract = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExtractImages = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RenderPages = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Explorer = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ExportInfoFile = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_ShowGeneralToolbar = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CustomizeToolbarCommand = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_LogWindow = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Help = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CreateShortcut = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CheckUpdate = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_VisitHomePage = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_About = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Open = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tdummyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_ImportBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_Action = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SaveBookmark = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SaveAsInfoFile = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_configSeparator = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_AppOptions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_RestoreOptions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_SaveOptions = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_Exit = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_Close = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\ttoolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r\n\t\t\t_Options = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\t_CustomizeToolbar = new System.Windows.Forms.ToolStripButton();\r\n\t\t\t_Properties = new System.Windows.Forms.ToolStripMenuItem();\r\n\t\t\tthis._MainMenu.SuspendLayout();\r\n\t\t\tthis.statusStrip1.SuspendLayout();\r\n\t\t\tthis._GeneralToolbar.SuspendLayout();\r\n\t\t\tthis.SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// _Select\r\n\t\t\t// \r\n\t\t\t_Select.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r\n\t\t\t_Select.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Copy,\r\n            _Delete,\r\n            toolStripSeparator3,\r\n            _SelectAllPdfFiles,\r\n            _SelectAllImages,\r\n            _SelectAllFolders,\r\n            _ItemTypeSeparator,\r\n            _SelectAll,\r\n            _InvertSelection,\r\n            _SelectNone});\r\n\t\t\t_Select.Image = ((System.Drawing.Image)(resources.GetObject(\"_Select.Image\")));\r\n\t\t\t_Select.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Select.Name = \"_Select\";\r\n\t\t\t_Select.Size = new System.Drawing.Size(59, 24);\r\n\t\t\t_Select.Text = \"选择(&Z)\";\r\n\t\t\t_Select.DropDownOpening += new System.EventHandler(this.MenuOpening);\r\n\t\t\t_Select.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// _Copy\r\n\t\t\t// \r\n\t\t\t_Copy.Image = ((System.Drawing.Image)(resources.GetObject(\"_Copy.Image\")));\r\n\t\t\t_Copy.Name = \"_Copy\";\r\n\t\t\t_Copy.ShortcutKeyDisplayString = \"Ctrl+C\";\r\n\t\t\t_Copy.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_Copy.Text = \"复制选中项\";\r\n\t\t\t// \r\n\t\t\t// _Delete\r\n\t\t\t// \r\n\t\t\t_Delete.Image = ((System.Drawing.Image)(resources.GetObject(\"_Delete.Image\")));\r\n\t\t\t_Delete.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_Delete.Name = \"_Delete\";\r\n\t\t\t_Delete.ShortcutKeyDisplayString = \"Delete\";\r\n\t\t\t_Delete.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_Delete.Text = \"删除选中项\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator3\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator3.Name = \"toolStripSeparator3\";\r\n\t\t\ttoolStripSeparator3.Size = new System.Drawing.Size(178, 6);\r\n\t\t\t// \r\n\t\t\t// _SelectAllPdfFiles\r\n\t\t\t// \r\n\t\t\t_SelectAllPdfFiles.Image = ((System.Drawing.Image)(resources.GetObject(\"_SelectAllPdfFiles.Image\")));\r\n\t\t\t_SelectAllPdfFiles.Name = \"_SelectAllPdfFiles\";\r\n\t\t\t_SelectAllPdfFiles.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_SelectAllPdfFiles.Text = \"选中所有 PDF 文件\";\r\n\t\t\t// \r\n\t\t\t// _SelectAllImages\r\n\t\t\t// \r\n\t\t\t_SelectAllImages.Image = ((System.Drawing.Image)(resources.GetObject(\"_SelectAllImages.Image\")));\r\n\t\t\t_SelectAllImages.Name = \"_SelectAllImages\";\r\n\t\t\t_SelectAllImages.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_SelectAllImages.Text = \"选中所有图片\";\r\n\t\t\t// \r\n\t\t\t// _SelectAllFolders\r\n\t\t\t// \r\n\t\t\t_SelectAllFolders.Image = ((System.Drawing.Image)(resources.GetObject(\"_SelectAllFolders.Image\")));\r\n\t\t\t_SelectAllFolders.Name = \"_SelectAllFolders\";\r\n\t\t\t_SelectAllFolders.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_SelectAllFolders.Text = \"选中所有文件夹\";\r\n\t\t\t// \r\n\t\t\t// _ItemTypeSeparator\r\n\t\t\t// \r\n\t\t\t_ItemTypeSeparator.Name = \"_ItemTypeSeparator\";\r\n\t\t\t_ItemTypeSeparator.Size = new System.Drawing.Size(178, 6);\r\n\t\t\t// \r\n\t\t\t// _SelectAll\r\n\t\t\t// \r\n\t\t\t_SelectAll.Image = ((System.Drawing.Image)(resources.GetObject(\"_SelectAll.Image\")));\r\n\t\t\t_SelectAll.Name = \"_SelectAll\";\r\n\t\t\t_SelectAll.ShortcutKeyDisplayString = \"Ctrl+A\";\r\n\t\t\t_SelectAll.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_SelectAll.Text = \"全部选中\";\r\n\t\t\t// \r\n\t\t\t// _InvertSelection\r\n\t\t\t// \r\n\t\t\t_InvertSelection.Name = \"_InvertSelection\";\r\n\t\t\t_InvertSelection.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_InvertSelection.Text = \"反转选择\";\r\n\t\t\t// \r\n\t\t\t// _SelectNone\r\n\t\t\t// \r\n\t\t\t_SelectNone.Name = \"_SelectNone\";\r\n\t\t\t_SelectNone.Size = new System.Drawing.Size(181, 22);\r\n\t\t\t_SelectNone.Text = \"取消选择\";\r\n\t\t\t// \r\n\t\t\t// _ToolBox\r\n\t\t\t// \r\n\t\t\t_ToolBox.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r\n\t\t\t_ToolBox.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            toolStripMenuItem23,\r\n            _Imaging,\r\n            _Explorer,\r\n            _ExportInfoFile,\r\n            toolStripSeparator5,\r\n            _ShowGeneralToolbar,\r\n            this._FullScreenDisplay,\r\n            _CustomizeToolbarCommand,\r\n            _LogWindow});\r\n\t\t\t_ToolBox.Image = ((System.Drawing.Image)(resources.GetObject(\"_ToolBox.Image\")));\r\n\t\t\t_ToolBox.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_ToolBox.Name = \"_ToolBox\";\r\n\t\t\t_ToolBox.Size = new System.Drawing.Size(73, 24);\r\n\t\t\t_ToolBox.Text = \"工具箱(&G)\";\r\n\t\t\t_ToolBox.DropDownOpening += new System.EventHandler(this.MenuOpening);\r\n\t\t\t_ToolBox.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// toolStripMenuItem23\r\n\t\t\t// \r\n\t\t\ttoolStripMenuItem23.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Patcher,\r\n            _Merger,\r\n            _Rename,\r\n            _OcrImages,\r\n            _GenerateBookmark,\r\n            _InfoExchanger});\r\n\t\t\ttoolStripMenuItem23.Name = \"toolStripMenuItem23\";\r\n\t\t\ttoolStripMenuItem23.Size = new System.Drawing.Size(198, 22);\r\n\t\t\ttoolStripMenuItem23.Text = \"处理PDF文件(&C)\";\r\n\t\t\ttoolStripMenuItem23.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// _Patcher\r\n\t\t\t// \r\n\t\t\t_Patcher.Image = ((System.Drawing.Image)(resources.GetObject(\"_Patcher.Image\")));\r\n\t\t\t_Patcher.Name = \"_Patcher\";\r\n\t\t\t_Patcher.Size = new System.Drawing.Size(233, 22);\r\n\t\t\t_Patcher.Tag = \"Patcher\";\r\n\t\t\t_Patcher.Text = \"批量修改 &PDF 文件...\";\r\n\t\t\t// \r\n\t\t\t// _Merger\r\n\t\t\t// \r\n\t\t\t_Merger.Image = ((System.Drawing.Image)(resources.GetObject(\"_Merger.Image\")));\r\n\t\t\t_Merger.Name = \"_Merger\";\r\n\t\t\t_Merger.Size = new System.Drawing.Size(233, 22);\r\n\t\t\t_Merger.Tag = \"Merger\";\r\n\t\t\t_Merger.Text = \"合并 P&DF 和图片文件...\";\r\n\t\t\t// \r\n\t\t\t// _Rename\r\n\t\t\t// \r\n\t\t\t_Rename.Image = ((System.Drawing.Image)(resources.GetObject(\"_Rename.Image\")));\r\n\t\t\t_Rename.Name = \"_Rename\";\r\n\t\t\t_Rename.Size = new System.Drawing.Size(233, 22);\r\n\t\t\t_Rename.Tag = \"Rename\";\r\n\t\t\t_Rename.Text = \"批量重命名 PD&F 文件...\";\r\n\t\t\t_Rename.ToolTipText = \"根据 PDF 文档的属性重命名 PDF 文件\";\r\n\t\t\t// \r\n\t\t\t// _OcrImages\r\n\t\t\t// \r\n\t\t\t_OcrImages.Image = ((System.Drawing.Image)(resources.GetObject(\"_OcrImages.Image\")));\r\n\t\t\t_OcrImages.Name = \"_OcrImages\";\r\n\t\t\t_OcrImages.Size = new System.Drawing.Size(233, 22);\r\n\t\t\t_OcrImages.Tag = \"Ocr\";\r\n\t\t\t_OcrImages.Text = \"识别图像文本(&S)...\";\r\n\t\t\t// \r\n\t\t\t// _GenerateBookmark\r\n\t\t\t// \r\n\t\t\t_GenerateBookmark.Image = global::PDFPatcher.Properties.Resources.AutoBookmark;\r\n\t\t\t_GenerateBookmark.Name = \"_GenerateBookmark\";\r\n\t\t\t_GenerateBookmark.Size = new System.Drawing.Size(233, 22);\r\n\t\t\t_GenerateBookmark.Tag = \"BookmarkGenerator\";\r\n\t\t\t_GenerateBookmark.Text = \"自动生成书签(&Z)...\";\r\n\t\t\t// \r\n\t\t\t// _InfoExchanger\r\n\t\t\t// \r\n\t\t\t_InfoExchanger.Image = ((System.Drawing.Image)(resources.GetObject(\"_InfoExchanger.Image\")));\r\n\t\t\t_InfoExchanger.Name = \"_InfoExchanger\";\r\n\t\t\t_InfoExchanger.Size = new System.Drawing.Size(233, 22);\r\n\t\t\t_InfoExchanger.Tag = \"InfoExchanger\";\r\n\t\t\t_InfoExchanger.Text = \"批量导出或导入信息文件(&X)...\";\r\n\t\t\t_InfoExchanger.Visible = false;\r\n\t\t\t// \r\n\t\t\t// _Imaging\r\n\t\t\t// \r\n\t\t\t_Imaging.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Extract,\r\n            _ExtractImages,\r\n            _RenderPages});\r\n\t\t\t_Imaging.Name = \"_Imaging\";\r\n\t\t\t_Imaging.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_Imaging.Text = \"提取文档内容(&T)\";\r\n\t\t\t_Imaging.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// _Extract\r\n\t\t\t// \r\n\t\t\t_Extract.Image = ((System.Drawing.Image)(resources.GetObject(\"_Extract.Image\")));\r\n\t\t\t_Extract.Name = \"_Extract\";\r\n\t\t\t_Extract.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_Extract.Tag = \"ExtractPages\";\r\n\t\t\t_Extract.Text = \"提取页面或拆分文档(&Y)...\";\r\n\t\t\t// \r\n\t\t\t// _ExtractImages\r\n\t\t\t// \r\n\t\t\t_ExtractImages.Image = ((System.Drawing.Image)(resources.GetObject(\"_ExtractImages.Image\")));\r\n\t\t\t_ExtractImages.Name = \"_ExtractImages\";\r\n\t\t\t_ExtractImages.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_ExtractImages.Tag = \"ExtractImages\";\r\n\t\t\t_ExtractImages.Text = \"提取图片(&T)...\";\r\n\t\t\t// \r\n\t\t\t// _RenderPages\r\n\t\t\t// \r\n\t\t\t_RenderPages.Image = global::PDFPatcher.Properties.Resources.RenderDocument;\r\n\t\t\t_RenderPages.Name = \"_RenderPages\";\r\n\t\t\t_RenderPages.Size = new System.Drawing.Size(208, 22);\r\n\t\t\t_RenderPages.Tag = \"RenderPages\";\r\n\t\t\t_RenderPages.Text = \"转换页面为图片(&Z)...\";\r\n\t\t\t// \r\n\t\t\t// _Explorer\r\n\t\t\t// \r\n\t\t\t_Explorer.Image = ((System.Drawing.Image)(resources.GetObject(\"_Explorer.Image\")));\r\n\t\t\t_Explorer.Name = \"_Explorer\";\r\n\t\t\t_Explorer.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_Explorer.Tag = \"Inspector\";\r\n\t\t\t_Explorer.Text = \"文档结构探查器(&W)...\";\r\n\t\t\t// \r\n\t\t\t// _ExportInfoFile\r\n\t\t\t// \r\n\t\t\t_ExportInfoFile.Image = ((System.Drawing.Image)(resources.GetObject(\"_ExportInfoFile.Image\")));\r\n\t\t\t_ExportInfoFile.Name = \"_ExportInfoFile\";\r\n\t\t\t_ExportInfoFile.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_ExportInfoFile.Tag = \"InfoExchanger\";\r\n\t\t\t_ExportInfoFile.Text = \"导出导入信息文件(&D)...\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator5\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator5.Name = \"toolStripSeparator5\";\r\n\t\t\ttoolStripSeparator5.Size = new System.Drawing.Size(195, 6);\r\n\t\t\t// \r\n\t\t\t// _ShowGeneralToolbar\r\n\t\t\t// \r\n\t\t\t_ShowGeneralToolbar.Name = \"_ShowGeneralToolbar\";\r\n\t\t\t_ShowGeneralToolbar.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_ShowGeneralToolbar.Text = \"显示常用工具栏(&G)\";\r\n\t\t\t// \r\n\t\t\t// _CustomizeToolbarCommand\r\n\t\t\t// \r\n\t\t\t_CustomizeToolbarCommand.Image = ((System.Drawing.Image)(resources.GetObject(\"_CustomizeToolbarCommand.Image\")));\r\n\t\t\t_CustomizeToolbarCommand.Name = \"_CustomizeToolbarCommand\";\r\n\t\t\t_CustomizeToolbarCommand.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_CustomizeToolbarCommand.Text = \"自定义常用工具栏(&Z)...\";\r\n\t\t\t// \r\n\t\t\t// _LogWindow\r\n\t\t\t// \r\n\t\t\t_LogWindow.Image = ((System.Drawing.Image)(resources.GetObject(\"_LogWindow.Image\")));\r\n\t\t\t_LogWindow.Name = \"_LogWindow\";\r\n\t\t\t_LogWindow.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_LogWindow.Tag = \"\";\r\n\t\t\t_LogWindow.Text = \"程序输出信息(&S)...\";\r\n\t\t\t// \r\n\t\t\t// _Help\r\n\t\t\t// \r\n\t\t\t_Help.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _CreateShortcut,\r\n            this.toolStripSeparator14,\r\n            _CheckUpdate,\r\n            _VisitHomePage,\r\n            _About});\r\n\t\t\t_Help.Name = \"_Help\";\r\n\t\t\t_Help.Size = new System.Drawing.Size(60, 24);\r\n\t\t\t_Help.Text = \"帮助(&B)\";\r\n\t\t\t_Help.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// _CreateShortcut\r\n\t\t\t// \r\n\t\t\t_CreateShortcut.Image = ((System.Drawing.Image)(resources.GetObject(\"_CreateShortcut.Image\")));\r\n\t\t\t_CreateShortcut.Name = \"_CreateShortcut\";\r\n\t\t\t_CreateShortcut.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_CreateShortcut.Text = \"创建桌面快捷方式(&C)\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator14\r\n\t\t\t// \r\n\t\t\tthis.toolStripSeparator14.Name = \"toolStripSeparator14\";\r\n\t\t\tthis.toolStripSeparator14.Size = new System.Drawing.Size(195, 6);\r\n\t\t\t// \r\n\t\t\t// _CheckUpdate\r\n\t\t\t// \r\n\t\t\t_CheckUpdate.Image = ((System.Drawing.Image)(resources.GetObject(\"_CheckUpdate.Image\")));\r\n\t\t\t_CheckUpdate.Name = \"_CheckUpdate\";\r\n\t\t\t_CheckUpdate.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_CheckUpdate.Text = \"检查新的版本(&X)...\";\r\n\t\t\t// \r\n\t\t\t// _VisitHomePage\r\n\t\t\t// \r\n\t\t\t_VisitHomePage.Image = ((System.Drawing.Image)(resources.GetObject(\"_VisitHomePage.Image\")));\r\n\t\t\t_VisitHomePage.Name = \"_VisitHomePage\";\r\n\t\t\t_VisitHomePage.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_VisitHomePage.Text = \"访问程序主页(&Z)...\";\r\n\t\t\t// \r\n\t\t\t// _About\r\n\t\t\t// \r\n\t\t\t_About.Image = ((System.Drawing.Image)(resources.GetObject(\"_About.Image\")));\r\n\t\t\t_About.Name = \"_About\";\r\n\t\t\t_About.Size = new System.Drawing.Size(198, 22);\r\n\t\t\t_About.Tag = \"About\";\r\n\t\t\t_About.Text = \"关于本程序及作者(&G)...\";\r\n\t\t\t// \r\n\t\t\t// _Open\r\n\t\t\t// \r\n\t\t\t_Open.Image = ((System.Drawing.Image)(resources.GetObject(\"_Open.Image\")));\r\n\t\t\t_Open.Name = \"_Open\";\r\n\t\t\t_Open.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D)));\r\n\t\t\t_Open.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Open.Text = \"打开文件...\";\r\n\t\t\t// \r\n\t\t\t// dummyToolStripMenuItem\r\n\t\t\t// \r\n\t\t\tdummyToolStripMenuItem.Enabled = false;\r\n\t\t\tdummyToolStripMenuItem.Name = \"dummyToolStripMenuItem\";\r\n\t\t\tdummyToolStripMenuItem.Size = new System.Drawing.Size(184, 22);\r\n\t\t\tdummyToolStripMenuItem.Text = \"最近打开的文件列表\";\r\n\t\t\t// \r\n\t\t\t// _ImportBookmark\r\n\t\t\t// \r\n\t\t\t_ImportBookmark.Image = ((System.Drawing.Image)(resources.GetObject(\"_ImportBookmark.Image\")));\r\n\t\t\t_ImportBookmark.Name = \"_ImportBookmark\";\r\n\t\t\t_ImportBookmark.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));\r\n\t\t\t_ImportBookmark.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_ImportBookmark.Text = \"导入书签(&D)...\";\r\n\t\t\t_ImportBookmark.ToolTipText = \"从其它文件导入书签到当前文档\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator2\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator2.Name = \"toolStripSeparator2\";\r\n\t\t\ttoolStripSeparator2.Size = new System.Drawing.Size(220, 6);\r\n\t\t\t// \r\n\t\t\t// _Action\r\n\t\t\t// \r\n\t\t\t_Action.Image = global::PDFPatcher.Properties.Resources.Save;\r\n\t\t\t_Action.Name = \"_Action\";\r\n\t\t\t_Action.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));\r\n\t\t\t_Action.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Action.Text = \"保存 PDF 文件(&C)...\";\r\n\t\t\t// \r\n\t\t\t// _SaveBookmark\r\n\t\t\t// \r\n\t\t\t_SaveBookmark.Image = global::PDFPatcher.Properties.Resources.ExportInfoFile;\r\n\t\t\t_SaveBookmark.Name = \"_SaveBookmark\";\r\n\t\t\t_SaveBookmark.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q)));\r\n\t\t\t_SaveBookmark.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_SaveBookmark.Text = \"保存书签文件(&Q)\";\r\n\t\t\t_SaveBookmark.ToolTipText = \"将书签保存为 XML 格式的信息文件，可用于迁移书签\";\r\n\t\t\t// \r\n\t\t\t// _SaveAsInfoFile\r\n\t\t\t// \r\n\t\t\t_SaveAsInfoFile.Image = ((System.Drawing.Image)(resources.GetObject(\"_SaveAsInfoFile.Image\")));\r\n\t\t\t_SaveAsInfoFile.Name = \"_SaveAsInfoFile\";\r\n\t\t\t_SaveAsInfoFile.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_SaveAsInfoFile.Text = \"换名保存书签文件(&H)...\";\r\n\t\t\t// \r\n\t\t\t// _configSeparator\r\n\t\t\t// \r\n\t\t\t_configSeparator.Name = \"_configSeparator\";\r\n\t\t\t_configSeparator.Size = new System.Drawing.Size(220, 6);\r\n\t\t\t// \r\n\t\t\t// _AppOptions\r\n\t\t\t// \r\n\t\t\t_AppOptions.Image = ((System.Drawing.Image)(resources.GetObject(\"_AppOptions.Image\")));\r\n\t\t\t_AppOptions.Name = \"_AppOptions\";\r\n\t\t\t_AppOptions.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_AppOptions.Tag = \"Options\";\r\n\t\t\t_AppOptions.Text = \"程序配置(&P)...\";\r\n\t\t\t// \r\n\t\t\t// _RestoreOptions\r\n\t\t\t// \r\n\t\t\t_RestoreOptions.Name = \"_RestoreOptions\";\r\n\t\t\t_RestoreOptions.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_RestoreOptions.Text = \"加载程序配置(&J)...\";\r\n\t\t\t// \r\n\t\t\t// _SaveOptions\r\n\t\t\t// \r\n\t\t\t_SaveOptions.Name = \"_SaveOptions\";\r\n\t\t\t_SaveOptions.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_SaveOptions.Text = \"保存程序配置(&B)...\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator11\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator11.Name = \"toolStripSeparator11\";\r\n\t\t\ttoolStripSeparator11.Size = new System.Drawing.Size(220, 6);\r\n\t\t\t// \r\n\t\t\t// _Exit\r\n\t\t\t// \r\n\t\t\t_Exit.Name = \"_Exit\";\r\n\t\t\t_Exit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));\r\n\t\t\t_Exit.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Exit.Text = \"退出程序(&T)\";\r\n\t\t\t// \r\n\t\t\t// _Close\r\n\t\t\t// \r\n\t\t\t_Close.Image = global::PDFPatcher.Properties.Resources.Close;\r\n\t\t\t_Close.Name = \"_Close\";\r\n\t\t\t_Close.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F4)));\r\n\t\t\t_Close.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Close.Text = \"关闭当前功能(&G)\";\r\n\t\t\t// \r\n\t\t\t// toolStripSeparator1\r\n\t\t\t// \r\n\t\t\ttoolStripSeparator1.Name = \"toolStripSeparator1\";\r\n\t\t\ttoolStripSeparator1.Size = new System.Drawing.Size(220, 6);\r\n\t\t\t// \r\n\t\t\t// _Options\r\n\t\t\t// \r\n\t\t\t_Options.Image = ((System.Drawing.Image)(resources.GetObject(\"_Options.Image\")));\r\n\t\t\t_Options.Name = \"_Options\";\r\n\t\t\t_Options.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G)));\r\n\t\t\t_Options.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Options.Tag = \"PatcherOptions\";\r\n\t\t\t_Options.Text = \"功能设置(&S)...\";\r\n\t\t\t// \r\n\t\t\t// _CustomizeToolbar\r\n\t\t\t// \r\n\t\t\t_CustomizeToolbar.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r\n\t\t\t_CustomizeToolbar.Image = ((System.Drawing.Image)(resources.GetObject(\"_CustomizeToolbar.Image\")));\r\n\t\t\t_CustomizeToolbar.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\t_CustomizeToolbar.Name = \"_CustomizeToolbar\";\r\n\t\t\t_CustomizeToolbar.Size = new System.Drawing.Size(23, 22);\r\n\t\t\t_CustomizeToolbar.Text = \"修改常用工具栏按钮\";\r\n\t\t\t// \r\n\t\t\t// _Properties\r\n\t\t\t// \r\n\t\t\t_Properties.Image = global::PDFPatcher.Properties.Resources.Property;\r\n\t\t\t_Properties.Name = \"_Properties\";\r\n\t\t\t_Properties.Size = new System.Drawing.Size(223, 22);\r\n\t\t\t_Properties.Text = \"文档属性(&X)...\";\r\n\t\t\t_Properties.ToolTipText = \"查看并编辑当前文档的元数据属性\";\r\n\t\t\t// \r\n\t\t\t// _ToolTip\r\n\t\t\t// \r\n\t\t\tthis._ToolTip.IsBalloon = true;\r\n\t\t\tthis._ToolTip.ShowAlways = true;\r\n\t\t\t// \r\n\t\t\t// _SaveConfigDialog\r\n\t\t\t// \r\n\t\t\tthis._SaveConfigDialog.DefaultExt = \"json\";\r\n\t\t\tthis._SaveConfigDialog.Title = \"保存应用程序配置信息\";\r\n\t\t\t// \r\n\t\t\t// _OpenConfigDialog\r\n\t\t\t// \r\n\t\t\tthis._OpenConfigDialog.DefaultExt = \"json\";\r\n\t\t\tthis._OpenConfigDialog.Title = \"打开应用程序配置文件\";\r\n\t\t\t// \r\n\t\t\t// _MainMenu\r\n\t\t\t// \r\n\t\t\tthis._MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._File,\r\n            _ToolBox,\r\n            _Select,\r\n            _Help});\r\n\t\t\tthis._MainMenu.Location = new System.Drawing.Point(0, 0);\r\n\t\t\tthis._MainMenu.Name = \"_MainMenu\";\r\n\t\t\tthis._MainMenu.Padding = new System.Windows.Forms.Padding(1, 0, 0, 0);\r\n\t\t\tthis._MainMenu.Size = new System.Drawing.Size(604, 24);\r\n\t\t\tthis._MainMenu.TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// _File\r\n\t\t\t// \r\n\t\t\tthis._File.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r\n\t\t\tthis._File.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _Open,\r\n            this._RecentFiles,\r\n            _ImportBookmark,\r\n            toolStripSeparator1,\r\n            _Close,\r\n            toolStripSeparator2,\r\n            _Action,\r\n            _SaveBookmark,\r\n            _SaveAsInfoFile,\r\n            _configSeparator,\r\n            _Properties,\r\n            _Options,\r\n            this._ResetOptions,\r\n            _AppOptions,\r\n            _RestoreOptions,\r\n            _SaveOptions,\r\n            toolStripSeparator11,\r\n            _Exit});\r\n\t\t\tthis._File.Image = ((System.Drawing.Image)(resources.GetObject(\"_File.Image\")));\r\n\t\t\tthis._File.ImageTransparentColor = System.Drawing.Color.Magenta;\r\n\t\t\tthis._File.Name = \"_File\";\r\n\t\t\tthis._File.Size = new System.Drawing.Size(64, 24);\r\n\t\t\tthis._File.Text = \"文件(&W)\";\r\n\t\t\tthis._File.DropDownOpening += new System.EventHandler(this.MenuOpening);\r\n\t\t\tthis._File.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// _RecentFiles\r\n\t\t\t// \r\n\t\t\tthis._RecentFiles.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            dummyToolStripMenuItem});\r\n\t\t\tthis._RecentFiles.Name = \"_RecentFiles\";\r\n\t\t\tthis._RecentFiles.Size = new System.Drawing.Size(223, 22);\r\n\t\t\tthis._RecentFiles.Text = \"最近打开的文件\";\r\n\t\t\tthis._RecentFiles.DropDownOpening += new System.EventHandler(this.RecentFileMenuOpening);\r\n\t\t\tthis._RecentFiles.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.MenuCommand);\r\n\t\t\t// \r\n\t\t\t// _ResetOptions\r\n\t\t\t// \r\n\t\t\tthis._ResetOptions.Image = ((System.Drawing.Image)(resources.GetObject(\"_ResetOptions.Image\")));\r\n\t\t\tthis._ResetOptions.Name = \"_ResetOptions\";\r\n\t\t\tthis._ResetOptions.Size = new System.Drawing.Size(223, 22);\r\n\t\t\tthis._ResetOptions.Text = \"重置当前功能(&Z)...\";\r\n\t\t\t// \r\n\t\t\t// _OpenPdfDialog\r\n\t\t\t// \r\n\t\t\tthis._OpenPdfDialog.Title = \"请选择需要打开的 PDF 文档\";\r\n\t\t\t// \r\n\t\t\t// statusStrip1\r\n\t\t\t// \r\n\t\t\tthis.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);\r\n\t\t\tthis.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            this._MainStatusLabel});\r\n\t\t\tthis.statusStrip1.Location = new System.Drawing.Point(0, 453);\r\n\t\t\tthis.statusStrip1.Name = \"statusStrip1\";\r\n\t\t\tthis.statusStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 1, 0);\r\n\t\t\tthis.statusStrip1.Size = new System.Drawing.Size(604, 22);\r\n\t\t\tthis.statusStrip1.TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// _MainStatusLabel\r\n\t\t\t// \r\n\t\t\tthis._MainStatusLabel.Name = \"_MainStatusLabel\";\r\n\t\t\tthis._MainStatusLabel.Size = new System.Drawing.Size(0, 0);\r\n\t\t\t// \r\n\t\t\t// _GeneralToolbar\r\n\t\t\t// \r\n\t\t\tthis._GeneralToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r\n            _CustomizeToolbar});\r\n\t\t\tthis._GeneralToolbar.Location = new System.Drawing.Point(0, 24);\r\n\t\t\tthis._GeneralToolbar.Name = \"_GeneralToolbar\";\r\n\t\t\tthis._GeneralToolbar.Padding = new System.Windows.Forms.Padding(0);\r\n\t\t\tthis._GeneralToolbar.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;\r\n\t\t\tthis._GeneralToolbar.Size = new System.Drawing.Size(604, 25);\r\n\t\t\tthis._GeneralToolbar.TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// _FunctionContainer\r\n\t\t\t// \r\n\t\t\tthis._FunctionContainer.DisplayStyle = System.Windows.Forms.TabStyle.IE8;\r\n\t\t\t// \r\n\t\t\t// \r\n\t\t\t// \r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.BorderColor = System.Drawing.SystemColors.ControlDark;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.BorderColorHot = System.Drawing.SystemColors.ControlDark;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.BorderColorSelected = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(157)))), ((int)(((byte)(185)))));\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.CloserColor = System.Drawing.Color.DarkGray;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.CloserColorActive = System.Drawing.Color.Red;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.FocusTrack = false;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.HotTrack = true;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.Opacity = 1F;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.Overlap = 0;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.Padding = new System.Drawing.Point(6, 5);\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.Radius = 3;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.SelectedTextStyle = System.Drawing.FontStyle.Regular;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.ShowTabCloser = true;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.TextColor = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.TextColorDisabled = System.Drawing.SystemColors.ControlDark;\r\n\t\t\tthis._FunctionContainer.DisplayStyleProvider.TextColorSelected = System.Drawing.SystemColors.ControlText;\r\n\t\t\tthis._FunctionContainer.Dock = System.Windows.Forms.DockStyle.Fill;\r\n\t\t\tthis._FunctionContainer.DoubleClickCloseTab = false;\r\n\t\t\tthis._FunctionContainer.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;\r\n\t\t\tthis._FunctionContainer.HotTrack = true;\r\n\t\t\tthis._FunctionContainer.Location = new System.Drawing.Point(0, 49);\r\n\t\t\tthis._FunctionContainer.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1);\r\n\t\t\tthis._FunctionContainer.MiddleClickCloseTab = false;\r\n\t\t\tthis._FunctionContainer.Name = \"_FunctionContainer\";\r\n\t\t\tthis._FunctionContainer.SelectedIndex = 0;\r\n\t\t\tthis._FunctionContainer.Size = new System.Drawing.Size(604, 404);\r\n\t\t\tthis._FunctionContainer.TabIndex = 2;\r\n\t\t\t// \r\n\t\t\t// _FullScreenDisplay\r\n\t\t\t// \r\n\t\t\tthis._FullScreenDisplay.Name = \"_FullScreenDisplay\";\r\n\t\t\tthis._FullScreenDisplay.ShortcutKeys = System.Windows.Forms.Keys.F11;\r\n\t\t\tthis._FullScreenDisplay.Size = new System.Drawing.Size(198, 22);\r\n\t\t\tthis._FullScreenDisplay.Text = \"全屏显示\";\r\n\t\t\t// \r\n\t\t\t// MainForm\r\n\t\t\t// \r\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r\n\t\t\tthis.ClientSize = new System.Drawing.Size(604, 475);\r\n\t\t\tthis.Controls.Add(this._FunctionContainer);\r\n\t\t\tthis.Controls.Add(this.statusStrip1);\r\n\t\t\tthis.Controls.Add(this._GeneralToolbar);\r\n\t\t\tthis.Controls.Add(this._MainMenu);\r\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\r\n\t\t\tthis.MainMenuStrip = this._MainMenu;\r\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1);\r\n\t\t\tthis.Name = \"MainForm\";\r\n\t\t\tthis.Text = \"PDF 补丁丁\";\r\n\t\t\tthis._MainMenu.ResumeLayout(false);\r\n\t\t\tthis._MainMenu.PerformLayout();\r\n\t\t\tthis.statusStrip1.ResumeLayout(false);\r\n\t\t\tthis.statusStrip1.PerformLayout();\r\n\t\t\tthis._GeneralToolbar.ResumeLayout(false);\r\n\t\t\tthis._GeneralToolbar.PerformLayout();\r\n\t\t\tthis.ResumeLayout(false);\r\n\t\t\tthis.PerformLayout();\r\n\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate System.Windows.Forms.ToolTip _ToolTip;\r\n\t\tprivate System.Windows.Forms.SaveFileDialog _SaveConfigDialog;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenConfigDialog;\r\n\t\tprivate System.Windows.Forms.MenuStrip _MainMenu;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _File;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _RecentFiles;\r\n\t\tprivate System.Windows.Forms.ToolStripSeparator toolStripSeparator14;\r\n\t\tprivate System.Windows.Forms.OpenFileDialog _OpenPdfDialog;\r\n\t\tprivate System.Windows.Forms.StatusStrip statusStrip1;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _ResetOptions;\r\n\t\tprivate System.Windows.Forms.ToolStrip _GeneralToolbar;\r\n\t\tprivate PDFPatcher.Functions.FunctionTabContainer _FunctionContainer;\r\n\t\tprivate System.Windows.Forms.ToolStripStatusLabel _MainStatusLabel;\r\n\t\tprivate System.Windows.Forms.ToolStripMenuItem _FullScreenDisplay;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "App/MainForm.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Windows.Forms;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Functions;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic partial class MainForm : Form\r\n\t{\r\n\t\tstatic readonly Dictionary<Function, FunctionControl> __FunctionControls = new Dictionary<Function, FunctionControl>();\r\n\r\n\t\tReportControl _LogControl;\r\n\t\t#region 公共功能\r\n\t\tBackgroundWorker _Worker;\r\n\t\treadonly FormState _formState = new FormState();\r\n\t\tbool _FullScreen;\r\n\t\t///<summary>获取或指定全屏显示的值。</summary>\r\n\t\t[Browsable(false)]\r\n\t\tpublic bool FullScreen {\r\n\t\t\tget => _FullScreen;\r\n\t\t\tset {\r\n\t\t\t\tif (value == _FullScreen) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_FullScreen = value;\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\t_MainMenu.Visible = _GeneralToolbar.Visible = false;\r\n\t\t\t\t\t_formState.Maximize(this);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_MainMenu.Visible = true;\r\n\t\t\t\t\t_GeneralToolbar.Visible = AppContext.Toolbar.ShowGeneralToolbar;\r\n\t\t\t\t\t_formState.Restore(this);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设置控件的提示信息。\r\n\t\t/// </summary>\r\n\t\tinternal void SetTooltip(Control control, string text) {\r\n\t\t\t_ToolTip.SetToolTip(control, text);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取或设置状态栏文本。\r\n\t\t/// </summary>\r\n\t\tinternal string StatusText {\r\n\t\t\tget => _MainStatusLabel.Text;\r\n\t\t\tset => _MainStatusLabel.Text = value;\r\n\t\t}\r\n\r\n\t\t#region Worker\r\n\t\t///<summary>获取或指定后台进程。</summary>\r\n\t\tinternal BackgroundWorker GetWorker() {\r\n\t\t\tif (_Worker == null) {\r\n\t\t\t\t_Worker = new BackgroundWorker {\r\n\t\t\t\t\tWorkerReportsProgress = true,\r\n\t\t\t\t\tWorkerSupportsCancellation = true\r\n\t\t\t\t};\r\n\t\t\t\t_Worker.DoWork += Worker_DoWork;\r\n\t\t\t\t_Worker.ProgressChanged += Worker_ProgressChanged;\r\n\t\t\t\t_Worker.RunWorkerCompleted += Worker_RunWorkerCompleted;\r\n\t\t\t\tTracker.SetWorker(_Worker);\r\n\t\t\t}\r\n\t\t\treturn _Worker;\r\n\t\t}\r\n\t\tinternal bool IsWorkerBusy => _Worker?.IsBusy == true;\r\n\r\n\t\tvoid Worker_DoWork(object sender, DoWorkEventArgs e) {\r\n\t\t\t_Worker.ReportProgress(0);\r\n\t\t\tFileHelper.ResetOverwriteMode();\r\n\t\t\tAppContext.Abort = false;\r\n\t\t}\r\n\r\n\t\tvoid Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {\r\n\t\t\t_MainMenu.Enabled = _GeneralToolbar.Enabled = _FunctionContainer.Enabled = true;\r\n\t\t\tforeach (TabPage item in _FunctionContainer.TabPages) {\r\n\t\t\t\titem.Enabled = true;\r\n\t\t\t}\r\n\t\t\tif (e.Error == null || e.Cancelled == false) {\r\n\t\t\t\t_LogControl.Complete();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void ResetWorker() {\r\n\t\t\tif (_Worker != null) {\r\n\t\t\t\tif (_Worker.IsBusy) {\r\n\t\t\t\t\tthrow new InvalidOperationException(\"Worker is busy. Can't be reset.\");\r\n\t\t\t\t}\r\n\t\t\t\t_Worker.Dispose();\r\n\t\t\t\t_Worker = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) {\r\n\t\t\tvar s = e.UserState as string;\r\n\t\t\tif (s == \"INC\") {\r\n\t\t\t\t_LogControl.IncrementProgress(e.ProgressPercentage);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\telse if (s == \"GOAL\") {\r\n\t\t\t\t_LogControl.SetGoal(e.ProgressPercentage);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\telse if (s == \"TINC\") {\r\n\t\t\t\t_LogControl.IncrementTotalProgress();\r\n\t\t\t}\r\n\t\t\telse if (s == \"TGOAL\") {\r\n\t\t\t\t_LogControl.SetTotalGoal(e.ProgressPercentage);\r\n\t\t\t}\r\n\t\t\tif (e.ProgressPercentage > 0) {\r\n\t\t\t\t_LogControl.SetProgress(e.ProgressPercentage);\r\n\t\t\t}\r\n\t\t\telse if (e.ProgressPercentage == 0) {\r\n\t\t\t\t_MainMenu.Enabled = _GeneralToolbar.Enabled = _FunctionContainer.Enabled = false;\r\n\t\t\t\tforeach (TabPage item in _FunctionContainer.TabPages) {\r\n\t\t\t\t\titem.Enabled = false;\r\n\t\t\t\t}\r\n\t\t\t\t_LogControl.Reset();\r\n\t\t\t\tShowLogControl();\r\n\t\t\t}\r\n\t\t\telse if (s != null) {\r\n\t\t\t\t_LogControl.PrintMessage(s, (Tracker.Category)e.ProgressPercentage);\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tinternal FunctionControl GetFunctionControl(Function functionName) {\r\n\t\t\tif (__FunctionControls.TryGetValue(functionName, out FunctionControl f) && f.IsDisposed == false) {\r\n\t\t\t\treturn f;\r\n\t\t\t}\r\n\t\t\tswitch (functionName) {\r\n\t\t\t\tcase Function.FrontPage:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new FrontPageControl();\r\n\t\t\t\tcase Function.Patcher:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new PatcherControl();\r\n\t\t\t\tcase Function.Merger:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new MergerControl();\r\n\t\t\t\tcase Function.BookmarkGenerator:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new AutoBookmarkControl();\r\n\t\t\t\tcase Function.InfoExchanger:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new InfoExchangerControl();\r\n\t\t\t\tcase Function.ExtractPages:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new ExtractPageControl();\r\n\t\t\t\tcase Function.ExtractImages:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new ExtractImageControl();\r\n\t\t\t\tcase Function.Editor:\r\n\t\t\t\t\tvar b = new EditorControl();\r\n\t\t\t\t\tb.DocumentChanged += OnDocumentChanged;\r\n\t\t\t\t\treturn b;\r\n\t\t\t\tcase Function.Ocr:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new OcrControl();\r\n\t\t\t\tcase Function.RenderPages:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new RenderImageControl();\r\n\t\t\t\tcase Function.About:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new AboutControl();\r\n\t\t\t\tcase Function.Inspector:\r\n\t\t\t\t\tvar d = new DocumentInspectorControl();\r\n\t\t\t\t\td.DocumentChanged += OnDocumentChanged;\r\n\t\t\t\t\treturn d;\r\n\t\t\t\tcase Function.Rename:\r\n\t\t\t\t\treturn __FunctionControls[functionName] = new RenameControl();\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid OnDocumentChanged(object sender, DocumentChangedEventArgs args) {\r\n\t\t\tFilePath p = args.Path;\r\n\t\t\t_MainStatusLabel.Text = p.ToString();\r\n\t\t\tif (!p.IsValidPath) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar t = p.FileNameWithoutExtension;\r\n\t\t\tif (t.Length > 20) {\r\n\t\t\t\tt = t.Substring(0, 17) + \"...\";\r\n\t\t\t}\r\n\t\t\tif (sender is Control f) {\r\n\t\t\t\tf = f.Parent;\r\n\t\t\t\tif (f == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tf.Text = t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tpublic MainForm() {\r\n\t\t\tInitializeComponent();\r\n\t\t\tthis.OnFirstLoad(OnLoad);\r\n\t\t}\r\n\r\n\t\tprotected override void WndProc(ref Message m) {\r\n\t\t\tbase.WndProc(ref m);\r\n\t\t\tif (m.Msg == FormHelper.ProcMsg) {\r\n\t\t\t\tOpenFiles(FormHelper.GetCopyDataContent(ref m).Split('\\n'));\r\n\t\t\t\tActivate();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected override void OnFormClosing(FormClosingEventArgs e) {\r\n\t\t\tbase.OnFormClosing(e);\r\n\t\t\tint n = 0;\r\n\t\t\tforeach (var item in _FunctionContainer.GetPrimaryControlsInTabs<IDocumentEditor>()) {\r\n\t\t\t\tif (item.IsDirty) {\r\n\t\t\t\t\tn++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (n != 0\r\n\t\t\t\t&& this.ConfirmYesBox(Messages.ConfirmCloseNDirtyDocument.Replace(\"<N>\", n.ToText())) == false) {\r\n\t\t\t\te.Cancel = true;\r\n\t\t\t}\r\n\t\t\telse if (FullScreen) {\r\n\t\t\t\tFullScreen = false;\r\n\t\t\t\te.Cancel = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid OnLoad() {\r\n\t\t\tProcessor.PdfHelper.ToggleReaderDebugMode(true); // 打开容错模式\r\n\t\t\tProcessor.PdfHelper.ToggleUnethicalMode(true); // 打开强制读取加密文档模式\r\n\r\n\t\t\tbool firstLoad;\r\n\t\t\ttry {\r\n\t\t\t\tfirstLoad = AppContext.Load(null) == false;\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\t// ignore loading exception\r\n\t\t\t\tfirstLoad = true;\r\n\t\t\t}\r\n\t\t\t_MainMenu.ScaleIcons(16);\r\n\t\t\tText = Constants.AppName + \" [\" + Application.ProductVersion + \"]\";\r\n\t\t\tMinimumSize = Size;\r\n\t\t\tAllowDrop = true;\r\n\t\t\tDragEnter += (s, args) => args.FeedbackDragFileOver(Constants.FileExtensions.Pdf);\r\n\t\t\tDragDrop += (s, args) => OpenFiles(args.DropFileOver(Constants.FileExtensions.Pdf));\r\n\t\t\tFormClosed += MainForm_FormClosed;\r\n\r\n\t\t\tAppContext.WindowStatus.Position(this);\r\n\t\t\tSetupCustomizeToolbar();\r\n\t\t\tif (_GeneralToolbar.Visible = AppContext.Toolbar.ShowGeneralToolbar) {\r\n\t\t\t\tScaleToolbar();\r\n\t\t\t}\r\n\r\n\t\t\t_OpenPdfDialog.DefaultExt = Constants.FileExtensions.Pdf;\r\n\t\t\t_OpenPdfDialog.Filter = Constants.FileExtensions.PdfOrXmlFilter;\r\n\r\n\t\t\t_LogControl = new ReportControl {\r\n\t\t\t\tLocation = _FunctionContainer.Location,\r\n\t\t\t\tSize = _FunctionContainer.Size,\r\n\t\t\t\tAnchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right\r\n\t\t\t};\r\n\t\t\tControls.Add(_LogControl);\r\n\t\t\tHideLogControl();\r\n\t\t\t_LogControl.VisibleChanged += (s, args) => _FunctionContainer.Visible = !_LogControl.Visible;\r\n\t\t\t_OpenConfigDialog.FileName = _SaveConfigDialog.FileName = Constants.AppName + \"配置文件\" + Constants.FileExtensions.Json;\r\n\t\t\t_OpenConfigDialog.Filter = _SaveConfigDialog.Filter = Constants.FileExtensions.JsonFilter;\r\n\t\t\t_FunctionContainer.Font = new Font(SystemFonts.CaptionFont.FontFamily.Name, 9);\r\n\t\t\t_FunctionContainer.ImageList = new ImageList();\r\n\t\t\t_FunctionContainer.DisplayStyleProvider.SelectedTextStyle = FontStyle.Bold;\r\n\t\t\t_FunctionContainer.AllowDrop = true;\r\n\t\t\t_FunctionContainer.MiddleClickCloseTab = true;\r\n\t\t\t_FunctionContainer.DoubleClickCloseTab = true;\r\n\t\t\t_FunctionContainer.TabClosing += (s, args) => {\r\n\t\t\t\tif (_FunctionContainer.SafeCloseTab(args.TabPage)) {\r\n\t\t\t\t\t_MainStatusLabel.Text = String.Empty;\r\n\t\t\t\t}\r\n\t\t\t\targs.Cancel = true;\r\n\t\t\t};\r\n\t\t\t_FunctionContainer.Selected += SelectedFunctionChanged;\r\n\t\t\t_FunctionContainer.Deselected += FunctionDeselected;\r\n\r\n\t\t\t// 关闭启动屏幕窗口\r\n\t\t\tusing (var closeSplashEvent = new System.Threading.EventWaitHandle(false,\r\n\t\t\t\tSystem.Threading.EventResetMode.ManualReset, \"CloseSplashScreenEvent\" + Constants.AppEngName)) {\r\n\t\t\t\tcloseSplashEvent.Set();\r\n\t\t\t}\r\n\r\n\t\t\tSelectFunctionList(Function.FrontPage);\r\n\r\n\t\t\t_GeneralToolbar.ItemClicked += MenuCommand;\r\n\t\t\tif (AppContext.CheckUpdateDate < DateTime.Today) {\r\n\t\t\t\tCheckUpdate();\r\n\t\t\t\tif (AppContext.CheckUpdateInterval != Int32.MaxValue) {\r\n\t\t\t\t\tAppContext.CheckUpdateDate = DateTime.Today + TimeSpan.FromDays(AppContext.CheckUpdateInterval);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar ca = Environment.GetCommandLineArgs();\r\n\t\t\tif (ca.HasContent()) {\r\n\t\t\t\tOpenFiles(ca);\r\n\t\t\t}\r\n#if DEBUG\r\n\t\t\tiTextSharp.text.io.StreamUtil.AddToResourceSearch(\"iTextAsian.dll\");\r\n#endif\r\n\t\t}\r\n\r\n\t\tvoid OpenFiles(string[] files) {\r\n\t\t\tforeach (var item in files) {\r\n\t\t\t\tvar p = new FilePath(item);\r\n\t\t\t\tif (p.ExistsFile && p.HasExtension(Constants.FileExtensions.Pdf)) {\r\n\t\t\t\t\tOpenFileWithEditor(p.ToFullPath());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid CheckUpdate() {\r\n\t\t\tvar client = new System.Net.WebClient();\r\n\t\t\tclient.DownloadDataCompleted += (s, args) => {\r\n\t\t\t\tif (args.Error != null) {\r\n\t\t\t\t\tgoto Exit;\r\n\t\t\t\t}\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar x = new System.Xml.XmlDocument();\r\n\t\t\t\t\tx.Load(new System.IO.MemoryStream(args.Result));\r\n\t\t\t\t\tvar r = x.DocumentElement;\r\n\t\t\t\t\tvar u = r.GetAttribute(\"url\");\r\n\t\t\t\t\tif (String.IsNullOrEmpty(u) == false\r\n\t\t\t\t\t\t&& new Version(ProductVersion) < new Version(r.GetAttribute(\"version\"))\r\n\t\t\t\t\t\t&& this.ConfirmOKBox(\"发现新版本，是否前往下载？\")) {\r\n\t\t\t\t\t\tthis.ShowDialog<UpdateForm>();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"版本信息文件格式错误，请稍候重试。\");\r\n\t\t\t\t}\r\n\t\t\tExit:\r\n\t\t\t\tclient.Dispose();\r\n\t\t\t\tclient = null;\r\n\t\t\t};\r\n\t\t\tclient.DownloadDataAsync(new Uri(Constants.AppUpdateFile));\r\n\t\t}\r\n\r\n\t\tvoid MenuCommand(object sender, ToolStripItemClickedEventArgs e) {\r\n\t\t\tvar ci = e.ClickedItem;\r\n\t\t\tvar t = ci.Tag as string;\r\n\t\t\tif (String.IsNullOrEmpty(t) == false) {\r\n\t\t\t\tSelectFunctionList((Function)Enum.Parse(typeof(Function), t));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tci.HidePopupMenu();\r\n\t\t\tif (ci.OwnerItem == _RecentFiles) {\r\n\t\t\t\tvar f = GetActiveFunctionControl() as FunctionControl;\r\n\t\t\t\tf.RecentFileItemClicked?.Invoke(_MainMenu, e);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tExecuteCommand(ci.Name);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ExecuteCommand(string commandName) {\r\n\t\t\tif (commandName == Commands.ResetOptions) {\r\n\t\t\t\tif (GetActiveFunctionControl() is IResettableControl f\r\n\t\t\t\t\t&& FormHelper.YesNoBox(\"是否将当前功能恢复为默认设置？\") == DialogResult.Yes) {\r\n\t\t\t\t\tf.Reset();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.RestoreOptions && _OpenConfigDialog.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\tif (AppContext.Load(_OpenConfigDialog.FileName) == false) {\r\n\t\t\t\t\tFormHelper.ErrorBox(\"无法加载指定的配置文件。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (Control item in __FunctionControls.Values) {\r\n\t\t\t\t\t(item as IResettableControl)?.Reload();\r\n\t\t\t\t}\r\n\t\t\t\tSetupCustomizeToolbar();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.SaveOptions && _SaveConfigDialog.ShowDialog() == DialogResult.OK) {\r\n\t\t\t\tAppContext.Save(_SaveConfigDialog.FileName, false, false);\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.LogWindow) {\r\n\t\t\t\tShowLogControl();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.CreateShortcut) {\r\n\t\t\t\tShellHelper.CreateShortcut();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.VisitHomePage) {\r\n\t\t\t\tShellHelper.VisitHomePage();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.CheckUpdate) {\r\n\t\t\t\tthis.ShowDialog<UpdateForm>();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.Close) {\r\n\t\t\t\tif (_FunctionContainer.SelectedTab.Tag.CastOrDefault<Function>() == Function.FrontPage) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_FunctionContainer.SelectedTab.Dispose();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.CustomizeToolbar || commandName == \"_CustomizeToolbarCommand\") {\r\n\t\t\t\tthis.ShowDialog<CustomizeToolbarForm>();\r\n\t\t\t\tSetupCustomizeToolbar();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.ShowGeneralToolbar) {\r\n\t\t\t\t_FunctionContainer.SuspendLayout();\r\n\t\t\t\tif (_GeneralToolbar.Visible = AppContext.Toolbar.ShowGeneralToolbar = !AppContext.Toolbar.ShowGeneralToolbar) {\r\n\t\t\t\t\tScaleToolbar();\r\n\t\t\t\t}\r\n\t\t\t\t_FunctionContainer.PerformLayout();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.Exit) {\r\n\t\t\t\tClose();\r\n\t\t\t}\r\n\t\t\telse if (commandName == Commands.FullScreenDisplay) {\r\n\t\t\t\tFullScreen = !FullScreen;\r\n\t\t\t}\r\n\t\t\telse if (GetActiveFunctionControl() is FunctionControl f) {\r\n\t\t\t\tif (commandName == Commands.Action && f.DefaultButton != null) {\r\n\t\t\t\t\tf.DefaultButton.PerformClick();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tf.ExecuteCommand(commandName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SetupCustomizeToolbar() {\r\n\t\t\tAppContext.Toolbar.RemoveInvalidButtons();\r\n\t\t\tfor (int i = _GeneralToolbar.Items.Count - 1; i > 0; i--) {\r\n\t\t\t\t_GeneralToolbar.Items[i].Dispose();\r\n\t\t\t}\r\n\t\t\tforeach (var item in AppContext.Toolbar.Buttons) {\r\n\t\t\t\tif (item.Visible == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_GeneralToolbar.Items.Add(item.CreateButton());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ScaleToolbar() {\r\n\t\t\t_GeneralToolbar.ScaleIcons(16);\r\n\t\t}\r\n\r\n\t\tControl GetActiveFunctionControl() {\r\n\t\t\treturn _FunctionContainer.FirstControlInActiveTab;\r\n\t\t}\r\n\r\n\t\tinternal void OpenFileWithEditor(FilePath path) {\r\n\t\t\tpath = path.ToFullPath();\r\n\t\t\tEditorControl c;\r\n\t\t\tforeach (var editor in GetOpenedDocumentEditors()) {\r\n\t\t\t\tif ((c = editor as EditorControl) != null && path.Equals(c.DocumentPath)) {\r\n\t\t\t\t\t_FunctionContainer.SelectedTab = (TabPage)c.Parent;\r\n\t\t\t\t\t_FunctionContainer.Invalidate();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tc = SelectFunctionList(Function.Editor) as EditorControl;\r\n\t\t\tif (String.IsNullOrEmpty(path)) {\r\n\t\t\t\tc.ExecuteCommand(Commands.Open);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tc.ExecuteCommand(Commands.OpenFile, path);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tIEnumerable<IDocumentEditor> GetOpenedDocumentEditors() {\r\n\t\t\tforeach (TabPage item in _FunctionContainer.TabPages) {\r\n\t\t\t\tif (item.Controls.Count != 0 && item.Controls[0] is IDocumentEditor editor) {\r\n\t\t\t\t\tyield return editor;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal FunctionControl SelectFunctionList(Function func) {\r\n\t\t\tif (func == Function.PatcherOptions) {\r\n\t\t\t\tthis.ShowDialog<PatcherOptionForm>();\r\n\t\t\t}\r\n\t\t\telse if (func == Function.MergerOptions) {\r\n\t\t\t\tthis.ShowDialog<MergerOptionForm>();\r\n\t\t\t}\r\n\t\t\telse if (func == Function.InfoFileOptions) {\r\n\t\t\t\tthis.ShowDialog<InfoFileOptionControl>();\r\n\t\t\t}\r\n\t\t\telse if (func == Function.Options) {\r\n\t\t\t\tthis.ShowDialog<AppOptionForm>();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tHideLogControl();\r\n\t\t\t\tvar p = (GetActiveFunctionControl() as IDocumentSource)?.DocumentPath;\r\n\t\t\t\tvar c = GetFunctionControl(func);\r\n\t\t\t\tforeach (TabPage item in _FunctionContainer.TabPages) {\r\n\t\t\t\t\tif (item.Controls.Count > 0 && item.Controls[0] == c) {\r\n\t\t\t\t\t\t_FunctionContainer.SelectedTab = item;\r\n\t\t\t\t\t\tif (String.IsNullOrEmpty(p) == false\r\n\t\t\t\t\t\t\t&& c is IDocumentSource tc\r\n\t\t\t\t\t\t\t&& String.IsNullOrEmpty(tc.DocumentPath)) {\r\n\t\t\t\t\t\t\tc.ExecuteCommand(Commands.OpenFile, p);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn c;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar t = new TabPage(c.FunctionName) {\r\n\t\t\t\t\tFont = SystemFonts.SmallCaptionFont\r\n\t\t\t\t};\r\n\t\t\t\tvar im = _FunctionContainer.ImageList.Images;\r\n\t\t\t\tfor (int i = im.Count - 1; i >= 0; i--) {\r\n\t\t\t\t\tif (im[i] == c.IconImage) {\r\n\t\t\t\t\t\tt.ImageIndex = i;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (t.ImageIndex < 0) {\r\n\t\t\t\t\tim.Add(c.IconImage);\r\n\t\t\t\t\tt.ImageIndex = im.Count - 1;\r\n\t\t\t\t}\r\n\t\t\t\tt.Tag = func;\r\n\t\t\t\t_FunctionContainer.TabPages.Add(t);\r\n\t\t\t\tc.Size = t.ClientSize;\r\n\t\t\t\tc.Dock = DockStyle.Fill;\r\n\t\t\t\tt.Controls.Add(c);\r\n\t\t\t\t_FunctionContainer.SelectedTab = t;\r\n\t\t\t\tif (func != Function.Editor && String.IsNullOrEmpty(p) == false) {\r\n\t\t\t\t\tc.ExecuteCommand(Commands.OpenFile, p);\r\n\t\t\t\t}\r\n\t\t\t\tAcceptButton = c.DefaultButton;\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvoid FunctionDeselected(object sender, TabControlEventArgs args) {\r\n\t\t\tif (GetActiveFunctionControl() is FunctionControl c) {\r\n\t\t\t\tc.OnDeselected();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SelectedFunctionChanged(object sender, TabControlEventArgs args) {\r\n\t\t\tif (GetActiveFunctionControl() is FunctionControl c) {\r\n\t\t\t\tc.OnSelected();\r\n\t\t\t\t_MainStatusLabel.Text = c is IDocumentEditor b ? b.DocumentPath : Messages.Welcome;\r\n\t\t\t\tAcceptButton = c.DefaultButton;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal string ShowPdfFileDialog() {\r\n\t\t\treturn _OpenPdfDialog.ShowDialog() == DialogResult.OK ? _OpenPdfDialog.FileName : null;\r\n\t\t}\r\n\r\n\t\tvoid MainForm_FormClosed(object sender, FormClosedEventArgs e) {\r\n\t\t\tAppContext.Save(null, true, true);\r\n\t\t}\r\n\r\n\t\tvoid HideLogControl() {\r\n\t\t\t_LogControl.Hide();\r\n\t\t}\r\n\t\tvoid ShowLogControl() {\r\n\t\t\t_LogControl.Show();\r\n\t\t}\r\n\r\n\t\tvoid MenuOpening(object sender, EventArgs e) {\r\n\t\t\tif (GetActiveFunctionControl() is FunctionControl f) {\r\n\t\t\t\tf.SetupMenu(sender as ToolStripMenuItem);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid RecentFileMenuOpening(object sender, EventArgs e) {\r\n\t\t\tif (GetActiveFunctionControl() is FunctionControl f && f.ListRecentFiles != null) {\r\n\t\t\t\tf.ListRecentFiles(sender, e);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/MainForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <metadata name=\"_Select.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Copy.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\r\n  <data name=\"_Copy.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAG8SURBVDhPjZFNSwJRFIZnWyBF+3a6kDCjFm0Ci4Iy\r\n        KjIK3LgJSguJjIoKwWU/IPwFfRIStSgEMU33Ltu1CKECow91/Na3c6a8jGOCA+/MudxzHu5zRwIgLfl8\r\n        s5TVFtEveL3S/P4+9ymZWxyXpvs6lVnlRQ0uuVLBR6GAt1wOyUwGz+k0bmIx8B7FoAbUgQJAi7VsqYT3\r\n        bBYvX194SqXw+PqK07s72gZ4n2JoCZjZ2VmXy2V8yrICCSUSOI9GceD3i4y5XNc03KAkAFMejztPCt/5\r\n        vAK5isfRjpIATLjdG0UayNIAQ66osR0lARh1OjdL1SpyNMSQwMMD1Ep1yNHJiYjBavUKwMjy8lalVkOB\r\n        hhgSiESgVtKehHVYWwCGHY7tKgHKNMSQy3AYaiUtJEk1awvAoN2+W6OiQhoMuQiFoFbSQvhiWVsATDbb\r\n        Hn1Ro1Mw5CwYhFpJC/ksFsHaAtBrsfgYwA+f5Pj2FmolLSRNa9am1l9Al9m8ojOZDuvRT07eq5W0EP7F\r\n        rC0ANCR1GI1KeoaGmpS0kBzVfz2NAF1/P+s0KbEO3wlfLP+dItV/PY2A7oEBJVql/8I9AKQf6RnM9xYG\r\n        na4AAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Delete.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Delete.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFsSURBVDhPrVG7SgNBFL2QIoVWWmgXdAkiioIRFINmQsR0\r\n        plALtYgYfBQ2KaxEWNDCysbC0srGX4kPMNgoaJFCQURsFBG5zpl7s2TZtdIDh5nzWnYT+jfwWsHn9Wnm\r\n        jYJRKwJkrmO7agm+K3nfkvnsgHF+VXKRh8Br7WCjEdFnedIFfLrnTuiPcjZ4CO5xHY1tYXnMvC+NM5/s\r\n        Cm0BGn6QYax5M9O54HUuY97mR5iPt4V2AO08jNWHRldnYTyXBszL7CDz4ZYQQ1A1MnS0Ho/Homeeimnm\r\n        /dUQ4SHT2u9o5FKmkU8xH1WZdxaF9g4Pmdbi8ZDtMvcT3fLa1VKY1kOGjtbDuMt0mtvRDhlvzjhCO081\r\n        Mmh0dSaoD7eZm6F2Ga9MOULDDzL10WlmOie67k/KGP+3JXS9LxkUcHcdzdGF1pjoIp3wL9MJ5oUM47zy\r\n        EpHvhNfawUYjQa2H/PNe4ppH8T+SBTLXsV21/gqiH0YlVZLkitJ3AAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"toolStripSeparator3.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectAllPdfFiles.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_SelectAllPdfFiles.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAixJREFUOE+Nkk1IVHEUxS+IK9sHrlw0CwVpEYRECylIFxNkWrhwoeA4SQ058Shw\r\n        RgfatGpju9KIaYIoEhWSgiwybKiwMj/QSm2KNzMMg+l8f9/OHf/zHhEMHfjBu++dc978512q6PzIyOlz\r\n        Hs9ANbo8nkPK/q+6XC57slDg39ksR1Ip1hMJ/hmPcyAWKzM9P8/iOet2W1RkXx+Jbq4T8TfwHWyAVfAZ\r\n        vAeLo6O8ouv8YHaWRWeGhy/8VSLmXyACoiAEtsEa+ABeg9VgkG/5fAaWtja3ihMtwfADBEG4tpa5VOJA\r\n        QwOvYH4H5sBGOFwukV8ix7Fq2kUVJ1qE4SvYAnpzM+eWlznU38+fML8Bz8B2NGqUSMEpp/OSihO9heEL\r\n        kKOE7XbW+/o47ffzWmsrv8C9GRDa2zNK5I896XA4VJzoJQx+sNXRwcXNTd71ejm9sMAM87qm8WM8i+KL\r\n        VErk65wYHLys4kRPYXgOOBDg0NgYL1mt/Kq+nmdqavgJ7t8HO8mkURJJp/m4zeZUcaJJGIRpxRSQoLz5\r\n        EZgAu9iLSonsybHe3isqTvQQe+CDyQvugbtgHNwBt8Hc0BDH8NZKSSyX46M9PZqKmzrS3X21hEUpFIuc\r\n        B1lsZSaf5xQCiUzGKIljFq+KmTrc2XlNNq2EPahWksQsXhUzZWlvd0mBqFpJCtfiVTFTB1tarqt8WXKc\r\n        ohQBKcqBDMqymMWrYqYONDXZ6hobb/wP4t1PEf0B0acbCXs9gqQAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_SelectAllImages.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_SelectAllImages.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIzSURBVDhPjZJdSFNhGMd3NZNqGOsD8ybDUyqOQRmb\r\n        UV0EYQOTRAMvJPDiaKMNWYwGy7GIYHYTQRdZN2GsoA+IkgyNcA2j6CKIPBejSNrYGjY09+k+/z3PWifG\r\n        WdSBP8/7nPf//M57nvdRASjrlNt9gjTyD7X0u1yqPqdTrpMXtDGaKhSwms1iOZ1GOJlEMJHA13i8rCd+\r\n        P9hDEmoC6OWZRC6HGBV+W1vDUiyGQDQKKRLBYjiMuzMzZAPYRxJ+18mAXofDnCTASipVE3Ld65UlmEzj\r\n        CkCP3X42nc/jBx3/bxA+Cf8OexWA4zabJUM9eP9IW0Nb5TUD2KsAHLNaresEWHzaWCVpeiekZySKnHNj\r\n        2asAHDWbx3LFIny3WxF43oxPs7vwea4ZS74WBN+0lSPnfDvsVQCOiKItTwCx+zAeX92HoG8vQq9a8f2j\r\n        Aeur/YhJXQj527CcyYC9CsDB4eFzhVIJvTodLD0G+poOkdd6JCMnaXsM6Wgfom/15TlhrwJgGBqyFwlw\r\n        QKtFtyDg9KFOXDF34cOCSNvXEA5Y8GXeiDhdNXsVgP2Dg+dLtJhyb8Cdi/W4d3kz7ns0WHi4HSuh3Xg3\r\n        3YQXNxvAw8ZeBUA/MOCgiNkbmj+a1MA31QBpfhv83i2YozxFs1LxVgP2mEwXKMIjqmVNjKgx6azDywf1\r\n        uOWqw8SoGjxsFW81YIfReImi/PDvcE+4sXw7fMU8J1nKK95qwKaODnFje7vnf8TeX3VQ/QQocLSW8bqV\r\n        FAAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_SelectAllFolders.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_SelectAllFolders.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKvSURBVDhPjZJbSJNhGMefi8gOGBEWKJHVhVE3ZVl0\r\n        kzdFqSCUJHpRS8sTauqwzDIPm1sTD8NytHQ6MM9maSbpMrNEQVyWpZQ1LE2T3NR5mGfnv+97qa9WXfTA\r\n        D/7wPO+P/8VLABgv0yiQQ/KfBOoVRL5JSSQIOhSUajGkYeRFAIzN52DpToF1MB8YvmuLsRT8bawkwFbQ\r\n        Lic5JquwYr6H+S8qjLVHQac+iif1Shsan+ZAIfF4zD0O5fAWBG0yUljHK7A8Usywjlfi7cNorHDLf8HP\r\n        qYSEMEHQIqX0ZVMploYLGXzOkIXghArwyQMulADh5UCxHqjtBpZXVuAdFxcuCJqTKWvpWxEWBgsYfM6X\r\n        e0JWpUfaAz0klXoklutR0dYLgwmYt1rhKRZHCoLGRMpe+KrF7Oc7DD63aP3/ql3yrAPGacCytIRjERFR\r\n        gqAhgVRzAxpYDCoGn6tT7PD6/mYOBwZfO69eh1HLHMwLC3APDhYLgrp4Us9+UmOqN5vB5xrpevQ174Sh\r\n        cTs+NDiz2vFlOlQaFmGam8NhkShWENTEkcby8RYmejIYfH6UsQWL0/4Y6z2CodY9rHaMVoeCrmUMz8xg\r\n        v59fnCCoiiXt1DslxroUDD5Xp+/gVjKY+oMw0HKI1dbU1WFoehpGLu/y8koQBGXRVDzRnQ5Tp5TB56Kr\r\n        qzH83gkd1Q5oyt/AaotiRNgmVsLDw7lnk5tbkCDIDaFa8xsFRjqSGWauhfriKrTW2qP4xjrcvrSW1dbk\r\n        XQZ/qwkl942urr++cpaIlE03D072NYQtjuolGH8lQ6HUndX9CV/7tM/uPv6Wk5CNIPMsUW4wnVQHUW7F\r\n        ta3PO0t8+q/42g1wR/LfsXdxiTy+l8j7ANEaR0dbAfeYcs4TKUW0L/MMXU/1o9tE5PQH9hw/hug7muSh\r\n        bCuCcYIAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_ItemTypeSeparator.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectAll.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_SelectAll.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHQSURBVDhPpZPdS1NxHMa/99F91yKEmOSFFzK6KJBE\r\n        40gjdtEIb5YuWmZuzbmJiDf5P/SuRRfJam1asxYKERhF0KWIoubb1HzZ+3Du8Tw/+J0br7YOPPD8Ds/n\r\n        8DkHjjiGhw0z3VXGkBtDQ25UeZEVeyh0p2webj/arShkyEpHIHC3VC7j5uAKQt8LuB7JI/gthwEzRjgD\r\n        /2waD2dSaH97CO/XA/Ql9tWWDFm55vN5isfHaL/3B/ZIAV2xFIKTuxiI7aA/uo3+D0n4I1vwvd+E990G\r\n        vOF1tSVDVlp7e3vypRJst2aVQXDqH2Z+51RefFq2+tPJRatzS4astHg89zNHR7jQEVUGfMDY9Cpexlfw\r\n        JrGO5x+X8GxqCa8+/8WT2AIeRxfUlgxZuex2PzgsFlF7dcIySPzKqtBAdxrozi0ZsnLJ5fLuFQqoaQmf\r\n        Mnj9Zc0yGDfvaQNuyZCV5s5O304+j/Ntcctg+mdahQa600B3bsmQlSan05/M5XDRPnfKgO+tDcbMszbg\r\n        lgxZaXQ4AhvZLJqd85ZB/EdKhQa600B3bsmQlTrDCK1lMrji2qwoZMjKOZttJGl+0dV0uqKQIStnGxq6\r\n        ztTXj1YTsmL+E/8RyAkWl85tVYbA9AAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_InvertSelection.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SelectNone.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Select.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH/SURBVDhPnZHfS1NhHMbf29F9QXcWBOJFBPZjYQzToqhB\r\n        UAssvMhk1WIVi5EeXUtK648I+gOii6AfN5uIttbyOFOHiJmNpdWazcZ29sOd7el9DpxDQjfbCw883xc+\r\n        D8/7fcXFQMDpCgbdzYisuDA0dA1NHrLinKJcr8uhWwW6pus4/rGGzpgOR3QLxyJldEwVcXRSw5GJPA6N\r\n        53Aw/AftoU2QISvO+v0evV43Ap5kYQSMZnQ8+lU1AoLrRQS+FYwAJZnDwOqmEUCGrDjt892s1GpWg/64\r\n        htH5DB5+SmMk/gMP1HXcn17DcCwFJZrE4PuvGIisggxZcdLr9ZZ03WowNr+BLTlTkcVFy0/MzVk+NDMD\r\n        MmRFl8dzq1Cton9sA5eGU3DeTsBx5R0OnH+DfadeYE/3c+w98RKtZ8LyToX98md0Xv0JMmSFw+2+k6tU\r\n        jABFvnnw9W+EVM3Qs7dJyz999cXyDCBDVnT09fmy5XLDDciQFYd7e+9mSqVtO8jJmeIOTM8dmJ47IENW\r\n        tPf0+NPFovULDIgtLyO6tAR1ZQVTiQQmFxbwQc7js7MIx+NGABmyYr/Lde+7pm1rkJUzxQamZwPTM4AM\r\n        WdHqdCprhcJ/GzDAbMCAfxuQISt22e0jabnRVD7fkMiQFbaWlhs72toeNyOyQh6b1E6p3Q1KMsL2FzoD\r\n        tHKcosAUAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_ToolBox.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripMenuItem23.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Patcher.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Patcher.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAsdJREFUOE9901lIVGEUB/CvRGixF18E60EwH1REqYd8CTRhFB3DbVIDCcM0lxZh\r\n        yHDUgUCsB0FsnsyGGCdsoWU0pTR3VGq0Wdx1XGbGcSYXCneb5d+515tRQQd+D/e753/ud+98w37VpfLy\r\n        RIlcnvs/aXL5aaH930qWyfK2XC5829vD8vY2bJubsGxswLy+ztP09oLrSSkrCxIi+/WFsepJxjBDTGSK\r\n        jBE9+UyGKyowarPhaWsruEoqLb3+xxCu2UqWySqxk3kyTrSkh4wtLeGhWn0gKDa2TIgzZqCGBbJEHN7e\r\n        gMcDc0AARun6E+kgUw4HP4TbCfc6Yqm0UIgzNkwN02SO2MLC8GNkBPacHOjouo+8J/OrqwdDuAGi4uIi\r\n        Ic7YADUYCfcqjrw82LKzsTM4iPGoKHyktSbyprsbnTodWgYG+A8bU1h4Q4gz1kkNg2QuORnu2Vl8V6mw\r\n        098P0BMnpVK8pHtGqxUGiwW6hQX+17mQn39LiDPWQg0fCMxm2GtrYRCL0eXvjyYvL7yi9QbSrdejt78a\r\n        fe9KsNamgSL9akPNuZt+/IDX1MDRCN4SLsg9+QV5TEYss9APFWG5Kx1upRKDDxp3G6+olWA4zJ7ROVBT\r\n        k4o8IUpSTx6ROqLOykLHQD101lxMzClQfrsAmppOGO4abEOVdef5XXB1NiPjjocOimltjTdDX356ZQVb\r\n        dDLXdhxQfa1EfGY0YhKSoFIuQlHgnr58bDFCiDMWnppawp209qEhtGm10JpM6DEaset0wuywITotGmdS\r\n        YiG3miFrdzljMp0Kxp4fFeKMBcXFybgBXHnoMLncbjiJg3aRmHgR8QliNNr1qKe1iKrm5lN5UyeF6H75\r\n        RUbeE/J8ca/jpkESiQQikYgftEt/tm3aEdcrxH6XT0jItePBwVV/O+HrO3EkMLCGvw4NvU+qfMLDc+n7\r\n        HmKMsZ/XiRYLs2lecgAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Merger.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Merger.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAwBJREFUOE+N0mtIU2EYB/B3qxCpoE9Z+CG1DDHtQgQS9iGDSFDwFhnUB8GaWZAu\r\n        L2FOw1UqmpULL0XZxjLFS5rOu07HaLg506biPZdtWqSWWmbo+fecOl2gD/XA78M57/N/ec97Hvazjqem\r\n        BpKz/7BDaP+7QpKTJZ9WVjC3vIx3nz/DtriI1wsLsM7Pf1et04HvCZXJ3IXIj+pm7OYgYxgho2SI9JMe\r\n        YiTmlBT02Wx4XFcHvoKTkqLI70345knyjrwnU+QVGSAm0kH67XYo1Opf3P39k4U4Y73UMEHsZHrdOoDj\r\n        YHVxwcs1DDWbGMqJ9n4mWgrT0VxwAx1FOYj32/Ukw41J8o6wAGam4DAZJzZvb3y1WDAVGYl2etbEhkJX\r\n        Xoy26nK0VVWgvboC+lqiqVgy1ZfO5+wX6dlzanxJ+E+Zlkhgi4jAksEAk68vjHlpuNr5BecbOcQ0cUjU\r\n        ckh7zqHeusINTUyvZnqJTKyNggYyHhyM1bExfFCp0H/3OlpkUpRFHcYdeTzy5VehvpkBZVYm7sll6DV3\r\n        4+37j6vJ20VGpqFwI4HViqncXPQGBKBVJkGXRo2uBiWM9Q9gbijCi2YVLB2lMJTehvaBHPPLHBe7RWxk\r\n        lRTmVQuqiC7nGt6Y/THY6AxLrSuhS322DX31WzGkz0dORhZGFrB6abO4k5XQHKgppCKPyEPSfkuOovST\r\n        0Cvd8abDFfbO3Zgd88O0eSeG9XmoKszFEs3EaQexRfiZjO0PD0/g6OXozAwsujqcCwpBQpg3nmbvxbgp\r\n        iFZSMDt8FJOWEiT5eszFHfLRBjkyhRBnbE9YWCI/ac1dXTC1aFClcENhLEMBqcymyWxmKMsSw9J+HxEH\r\n        PZoiXZ0cAh3ZWiHOmPuxY1f4Dfga1LdirLcGfQYl+jvVGO1Rw/6qGMPdSkwOGBG+z02rkkaKzzozByHO\r\n        mJOPT5qQh0p2GYroaBTESOkEUuRdlEJxQYr8mDhknDqBA67OlUHrRaLQjX+cYIOX15n1np7p/4Pv/ZFi\r\n        7BuU0iASw/TUhgAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Rename.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Rename.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDhPjZPdS5NhFMAP3rYudpF15QeogUwKusiE\r\n        dSGNHJTQWs3YCCabtnSsza2xtSkULZsaiH9ANy4ZQygvRBFi6EXzMqyLuhkFcyqj2qf7Pp3z4IYDpR74\r\n        cXgfzvm95z3P84J6crKBe1NTt4mRf9Bx1+uFO243wGWFAvjhGKPZchl/Fwp4kMthLJPBn+k0/kilBB82\r\n        N5FziE4hkEgk0NzeLmxHPEoXi5igwngyidFEAr/t7eHX3V38EothYHUVeXEe0SkETU1N0NzWBoNOJ2PK\r\n        kODj1hbOzc/jWjiML+fmcHl9XUgWFhfrdCqVnrqAOdfaCrfs9rFcqYR/qP1f2SxOU/FJnfDncC5IpdIH\r\n        JHHWuNDSsjBLRTOzs+gnpv1+fD0zg28DgQYJCwas1nGQy+VPotEonobP5xMxsLTU0AkPVmE2m0GlUpnj\r\n        8TjqX+xjvyGCXQPLeFG5hte035H3vV6viO9XVhoGy6fTbzJZYHh4eCxJmycJeN/hcIi4vrEhZlKTHBwe\r\n        4nWj0QoWi8VUpKmfBnUpYpjOvzZYlvA96dPrbeByuQbdbvdojXG73b+9vY0RJhJBg8GAnyh+3tnBFL21\r\n        JkmR9KpOZwcqAo/HI3g8MQFXhoaeVumilCsVLBFanQ7zdKw5Ksjk83UJXzbOrQtMNhtcUqsZJ9+0UCiE\r\n        Go0GgxTvU3wXDDZIsiTlXCEYsVigS6ms8YwFvKrVar2TAv0fxzvhy8a5cFOjgfO9vcd5flQvFn9OhUUE\r\n        i4pEnmQFeuZc6NO+gY4bD+FsT49AIpMZz3R3v/ofJDKZ8S9oxY1XC8E7XAAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_OcrImages.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_OcrImages.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAu\r\n        IgAALiIBquLdkgAAAllJREFUOE91019IU2EYBvBHqoOnTs3NFroGcxelLWMVXkgRRRDioF1ZYUS6KHUm\r\n        jCjGTNlGRhGpWIrrD7TMgplSFgmuWlEzlC7qprKLLoKZEF1ITNMyt55vOpIxBz/2/Tnvs3ffx0E8Hk8B\r\n        YSUptIrk+bXU5+alWUwUV5BjwRHKJvEx0sYF0lIB4pcdjWZ0tljgm5vFPc7LIhHdeqMxb1qSpJhWq/3L\r\n        gLyUAGTQclpLp7++Q1cFEO6ug4/zVjo3NpZ70WDQTVqtpU3JusXFObSVDtIlekJPv39BoNWCCwzz+avh\r\n        YkDUYFD2pAZkUsnH5yh/dB62pmJ4HLnoFh3YVbh/djMudxxA44dncIoAnU7alS5gPx+0n9LD9eIaPDNT\r\n        eHwyG33ubbjFvQ6qIYter/upVks70wXsI0eNAvdxCc0cD9WqMRjqxB2Oz9A6ylSplEmz2VyQEpAIUZO4\r\n        PrevHN6GQvTwL4zO/kGIa4eI1xsHb2HabrfnLwpIEB2oyEQu6qsvQK8NeMtrHOG8i4pJIwIcjlo+9z9A\r\n        FO8lJ135FcVNz3bcYHGozYrb1QrefPuEIe4NU7MsS78Dgd0lHK+mDBEgz0RR2l4GJ0/8Otvu9R1GO1vv\r\n        4V7/Qy/6ufajfhOCgz4lqChybHxcFeReHWWldtBGV6mFKslGr0dfInRCwvujwIQsy7GGHaoHUxOJg9WI\r\n        gGSIaCmLxGGKb/ESrSERfpdGBgbwWZKWzYXD6lecJztI3sJSsII0lFNUtGXYZMqPVFUdG/X7K8WBizNI\r\n        V5Se1+vV0QYqJL6NcfwD7Csg08GXW4UAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_GenerateBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_InfoExchanger.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_InfoExchanger.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAINSURBVDhPjZJfSFNhGMbPfUnd2Z2BLWg4JpQ4Vwg2\r\n        koQ2igxURBBcNdaSxXRsZYYXeeGVSGRXQTjc5ZSQvPBG9DYICgkvIuEsjVG5//+fnvfQzpFy2gcPh/N9\r\n        z/M77/eeVwGg6c7kpJO6e4zO3Z6YUG6Fw8rNUEiTDuDBvUy5jJ+FAr5ns1DTaeykUviaTGpaWl+HeCjT\r\n        oQBu3k8Vi0gw+G1/H18SCXze3cWneBwfVRWRlRXaAPFRpn8ArmDQkybgRyZzKGRuYUGXqafnCaWIdMCN\r\n        QMCbLZXwi+XXg0glch3xUpIxANf9/gc59iCZyx0JEYB4KckYgGs+ny9PQDqfrwt5u7GB6OoqHF7vw86R\r\n        EcU2NGQArno8o8VKBVn2oR7kdSxGK9A2MDB2qb+/zexyGYBOt9tfIiDPPtQgKr/6YXsb7zY38WZ5GS+j\r\n        Uah7exqE4dAFp7NdB9iHhx+Vq1UUeI0aJMOZyPEpexWe/b3OOhxPdUD74GBATFJFDRJnBe+3thBbW8OL\r\n        SATT8/PYYSNlNXZ0TJ2x2y/rgIt9fePyjTIBByEHe/JsdlayOGW1Pj/d2nqFEKMH1t7eoBxWWUU9yKvF\r\n        RYRnZnCeg9TU1aU0d3cbAG4+FoCsoyAybOKlJGMAGm22KS39Z8l1pCfSWAHJL5Y5KfBdvJRkDMDJlhb3\r\n        CbN5+n8k3gaLRWmwWJTfD6TTCWZqcZ4AAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Imaging.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Extract.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Extract.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAfdJREFUOE+FkT1IW1EYhjM5ZZeCU9HJiDi5iCI6VFBRac1iHASNhlRqNWIwmKWt\r\n        U4fqIAgKglGSQRHUiAi28QcEKSr4Cw7JJSooSgj3kh+S1++7SY75Uy+83HN5v/PwnHM1AHLy2W5vovS8\r\n        kuL02YyNqbTZbL1KLIbHcBh3igIpGISXsuLxgDtKSWo2ZzOnxWrtkyMRPMgybgIBXN/f4+z2Fo71daoB\r\n        7ikqRN1AWhnKbaOjC2sHB1jZ38e5JAnI5Py8SHFDg00A3lJe3t3Fmc+XYcLdp4EBswC8p7xEoNM0iERz\r\n        9WZzvwA0WiwmJRrFk6xkQNKVf8/NiY4ta4zGbwLAOiE6QiAUyoGklF3b26J7Ituqrq7vAsA6EQLIdAf5\r\n        IKzs3NoSXZAAlQbDkACwTjQeh0JFPggrL25uqt2Pv48Yc/1DhV4/LACsE6NFmO4hH4SVHW632hmcfjRN\r\n        n6PCMusUANaJ0yJKx8iGjK160T5ziS/JtM9eYcoPlNo9/rKfRx0qIKmDGB0jG9I8+R8TEmA6BQzHLxm8\r\n        AD5adw5VgK61dYQB/GRDBh0nqB/fSeSXR31X7gGFprXDD2Z3wqCoutqe2J54+Dh8J3yx/HcitE7OaKps\r\n        G9Dqp2+0nc4O/lYB2vLybq1ON/5maIZnC+osRwW1X//wGoDmGf2OAjpoA1ceAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_ExtractImages.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_ExtractImages.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAi1JREFUOE+lk19IU2EYh8/VQBhEeBG7iFVELKJQmAgigSRIg0lFuZspREo5LdCh\r\n        FovRhf8giFbWYrSUSppCZDZx6cSYStbUlhJpK8p0XjgyaizmRJ/ON8UYBE068PA7L/x4Oc/h+yTgv0ga\r\n        TlqtepmzW0CftOC4xXJOzpQf0U9aoK+tNa3KL3k2KGiRC471PCHnmXYwueChH7qnQPREP2nB0aqqyuW1\r\n        NZqe/8IxAq5xePAaOieg9SXcGQb/VwiGQfREP8m7sK7O5R4d5VhjDeV2Gw7PK9q8ftoH/dztW0+3f5rF\r\n        CERXVsivqLiwZW9nn5dv0Rjf43EOl5VVbXq/eZz+T0TP0jlAZzBOOBYju6TEvOkdeKLmfc9OZno38Kj5\r\n        6N3Fp8HdBPvViVn0zPe9OAOrLESjZBoMtZLwED6n83JoLs/m84CGOZ+G0MgBInMFrEQMLE3nMj+8P+Fd\r\n        /2KJi48GWVyOs0+ns0jCQ/jkqlToNBqsxkzarmjxtubwI1wtf3Q94S+lzPqyEt7FHSGymkd/7i29+nS7\r\n        VlsqCQ/h03UtLUH39TSe2ZT02pVM9adjdc9S5Jzh1AZF9z5gD8Ghpsmxgw0BoyQ8hE9LtWKTW2YF9hoF\r\n        XbfTKLw5wY05+RC9g+K3fzBPw55LQ2OS8BA+85HIXzG3T5LfNLROoy+R2fIh22HqGVNV9hol4bEtI6Mh\r\n        VXIve1AaHAvKkg6j/IOSb2MqKI7UBBR55+XbImak38qMwNWohUA+AAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_RenderPages.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Explorer.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Explorer.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAr1JREFUOE+N01tIk2Ecx/HdiMS6EbQu8sLBvBGlQCXdRUIkKdiFtsCLeeGFmWXE\r\n        0krNE4ZIUUQKXZiplcd5auk8zDTdcsPmPO6gttmm23zzgOAJT9uv/zv0BemiXviwh/H8v3sfeMYD4HWr\r\n        qOgGuf0PwpP9J7hFUn5++s7RETb297Gyuwvn9jYWt7Zg39z0kqtUYPfcLCgIPhUY5/FezVLnJ7GQOWIk\r\n        k+QH0RcWwuB0or67m/YDiXl5dwgX4bGbl8gKWSPL5BcxER0ZJkaXCxV1dZzg+Ph8LjBFG2zERRgfH8Dj\r\n        gVUgQJ+fHz4EBqIiKAgtCgWUWi0mbTbvcRKys+9xAT0NzpMF4gwLw87EBHpSUiC7ngBlaTlm5EqY7Azk\r\n        Ayq00DEs6+uIk0ozuYCGBqcJexQmPR1qiQRfZR0Ybh2Arq0P8980mHOsQm9h8J79fnwc1zIz73OBQRrU\r\n        koXERLitVsiLizGqmYHOzECl1KGnuh1DJheGjC6oDDbIurpwNSPjARdQ0HAfgd2O5fJyvImNxeCnL+it\r\n        7sBoRz/M9AZWZgMG+xq+G5dQ09iIK2lpUi7QTsMs+bFif38oXrz1/vIsDZuIbXXTa8RgRadSCVFq6kMu\r\n        0ET3oI4GP5Ja8ozPx8v4BPQ3dmNmYATmqVks0BvYfm/gXX0TNHo9Lksk2VzgZBGenPzYQwsjXZrXlZWo\r\n        aW7D/CKD9a09WOxONDTL0NrajgaZDOFiceFfgYti8RP6RP/YGDrValTU1uJuVhZycnNRWVWFHnr10rIy\r\n        9PYO4lJMzOfo6OhzpwLBcXFP2QD7eOgyHbndOCT79P/YOzzE7sEBluhGFpWUQKudRkREhFQkEl3gAuej\r\n        okq808cPexw3GyJs6IDsUczmcIAfEKA2mx2IjIx8xAXOhoam8UNCyv7HGYEgx9fX97lQKEz6A0bGn34K\r\n        6LnaAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_ExportInfoFile.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_ExportInfoFile.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAjJJREFUOE+Fk0FIU3Ecx3cKhN08SNcwCLG6JA/kgYgbc85NRrqD6C6zLbacsZHD\r\n        4RJhtUO3RnWqkx6kk1Ful0gmnXoLtRStIa3xGO3girHhNrdv/99/8tzzBf3hw//33vv9Pu/3/v//0wFQ\r\n        Iet0y4zXZyxffH4RJRhfWrIy3FJnZxrRKAiK6V4b3e3FhBLcjkQ8lWYTst0ORCKc7NgYsqUSZz2VAuUw\r\n        rv5TYA+H75ZrNfy02YBwmJOxWLCfz+OrLGN1Y4OlAZTHUCSKwBYKeSv1On5YrWjOz3MyIyPIFApcEl9Z\r\n        Ueg2mxc1Aksw6CPB0egoGoEAhzrIFYuKhDqhz6FcjcA0NzdbbTTwnb217vdzDs1mFFhBu4QElKsRGHw+\r\n        f40t4gErqnm9nP3hYRyXyypJjl1TrkYw4PHcrzPBnsmEmtvN+WI0oliuqCR5FlOuRiC6XIFTFuywoqrL\r\n        xdk2GvDn5EQliW4eQ1x4ntYIBKcz2GRBemgIjZkZjjQ4iFK1qpJMr8kQnki/hfjRlEpwa3LyAQk2RRGf\r\n        WCHxgcUP32bheHmIiTMcr77hhQzciO1K1x9tTymCmxPjITbjjSAgl0wim0hgva8PtvhnPM0B3j1geuec\r\n        4AFwZWFLUgTXrFZ2/FqDOmmwBa2zbQ2u7sIQ22rxOMVn4SPQ5X0nXb6XOO+gq7+f/jxlkISghaXdoS2m\r\n        cyIuJqF3PCvpnWvqNdD39t7p6OmJ/Y9LA7O/OkTn+1YddH8B7KTLCzNS/AAAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"toolStripSeparator5.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ShowGeneralToolbar.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_CustomizeToolbarCommand.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_CustomizeToolbarCommand.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAQ9JREFUOE/lUDFqhFAU9Ao2CpZb5BLeQExnkaQQTLGumyA2CaigeAR7T2DpQWwC\r\n        ewILFUELEUHhxfkYIYteIBkY3vsz834x3B9BGIanIAiel3m+56qfkPM879H3fRPEzo4B13Vfqqr6oh1A\r\n        h4+caZrXeZ4JxM6OAcdxLhCnafrFLMtYGD5yiqLYy4f4lLCzY8CyrOs4jjQMw8Y0TSmOY4IOHzlJkp54\r\n        nv8EsbNjwDCMt77vKUkS6rqOzSiK2A4d/hrdh6Zp723bkm3bG+u6ZoQOH7nDElVVtZumoaIoSNd1Nn8I\r\n        HT5yhyXKsvya5/kN5ZRluRFv6PCROyxxKeRBEISzKIof94QOf83tl/ivwXHfxSsWzwVUgTEAAAAASUVO\r\n        RK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_LogWindow.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_LogWindow.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGKSURBVDhPpZNPi0FRGIff8gXkI9jYm42VlY2FQllM\r\n        s53MnyalqbGY9XyIKUkpaUhEEkldwzWN0VU0o6wkikRRJPrNeW/RTFnMNaeefqfznqfeczqHAPwL8ng8\r\n        RsG5wKsRdozkdrsvarVau9frodv9QqfTQauloNFooF6vQ9RQrTJvYv4BWW7h/f0T+fxrm11yOp03xWIR\r\n        hUJBLOaRy+WQyWSQSqWQTCYRj8cRi8UQjUYRiUQQDocRCoUQDAah0+m8fIQrcZaTBrvkcrmud7sdzl6M\r\n        2G63qFQqavt7uDvOwWCg1vewwy45HI7bzWaD9XqtCXbYJbvdfrdarSD5fVgul+odyLJ8oFwu/0pGURSw\r\n        wy7ZbDbfYrHAbDbTBDvsktVq9c/nc3ifgclkAkmSkE6n1fw5bzaban0PO+ySxWK5n06nGA6HmmCHXTKb\r\n        zQ/j8RiBQAD9fh+JREI8mqqapVLpQDabVZP3MOywSyaT6ZFbGo1GmmCHXTIYDJd6vf7pFNg9+sO0cHTx\r\n        74C+Ae2m7hiEPU+bAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <data name=\"_ToolBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALESURBVDhPfdNbSFNxHAfwf4TQxfBRsB4E80FFlHrIl0AT\r\n        pugMr6mBlGEuL12EkeFtEIi9CGJ7Mhsy150u05SyvOOkNtvFu87LNueWOgrvNrdvv3M8GRX0g8/D+Z/f\r\n        93f+5+w/9qsuVFYmZchk+f+TLpOdFNr/rZTycsnG7i6+7exgaXMT9vV1WNfWYFld5an7+sD1pFZUBAuR\r\n        vfrCWO0EY5gmZjJJRomBfCZDVVUYsdvxqL0dXCWXlV37YwjXbCNLZIU4yBwZI1rSS0YXF3FfpdoXHBdX\r\n        IcQZM1LDPFkkTh8fwOuFJTAQI3T9iXSSSaeTH8LthHsdsVRaJMQZG6KGKTJL7OHh+DE8DEdeHvR03U/e\r\n        kbmVlf0h3ABRSUmxEGdMQw0mwr2KUyKBPTcXW4ODGIuOxkdaayGve3rQpdejTaPhP2xsUdF1Ic5YFzUM\r\n        ktmUFHhmZvBdqcTWwABAT5yQSvGC7plsNhitVujn5/lf51xBwU0hzlgbNbwnsFjgqK+HUSxGd0AAWg4e\r\n        xEtabyY9BgP6BmrR/7YUrg415JlXmuvO3PDnB7yiBo5a8IZwQe7Jz8lDMmydgUFXjKXuTHgUCgzKmrcf\r\n        X1Ip+AFP6RyoqElJmgitopE8IA1ElZODTk0j9LZ8jM/KUXmrEOq6LhjvGO266oaz/BCuTmdl3fbSQTG7\r\n        XLxp+vJTy8vYoJPp2nJC+bUaCdkxiE1MhlKxAHmhe+rikYVIIc5YRFpaKXfSPuh06NBqoTWb0WsyYdvt\r\n        hsVpR0x6DE6lxkFms+Byk8Udm+2WM/bssBBnLDg+vpwbwJWXDtOuxwM3cdIukpLOIyFRjCcOAxppLbKm\r\n        tfWEZPK4EN0r/6iou0KeL+51PDQoIyMDIpGIH7RNf7ZN2hHXK8R+l29o6NWjISE1fzvm5zd+KCiojr8O\r\n        C7tHanwjIvLp+x5gjLGfae8To0giklcAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Help.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_CreateShortcut.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_CreateShortcut.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADzSURBVDhPY/j//z9FGKsgKRirICkYqyApGEPAdvYz\r\n        EDa2n/viDDK2m/N8JrpaEMYQsJr+CISNA1Y8vznz6f//dRe+f54BpC2m3D+DrhaEMQQksrYyKFceZtBt\r\n        vdDqPvHE/6rb//9nHvv8Wa/9EvEGKJUfLNDvu3wz7Pz//84TTvwvu/X/P9BQ4gwQz9hcoNly4qbnqf//\r\n        FRqO35TM2d4KooEGE2cAb8zyM7bH//+XKttzky9uZQHIRULJ64xBGF0tCGMIcIYuMGYNmH2GLXBOAdAw\r\n        sJeAmsEYXS0IYxUkBWMVJAVjFSQFYxUkBWMVJB7/ZwAAMnjTFsqoud8AAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_CheckUpdate.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_CheckUpdate.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHuSURBVDhPpU/Ba9JxHBW8h/kn7CIddpEFHoYnY3j4\r\n        hQpCm6dGrBUxiMCICuoQGZ2CLgMnCM6DSInDpXgowv1sU0JxDsN2kVDQRElBEe31ex/6eanDxr7wfu/3\r\n        Pp/33u/7MwC4EAxer3dBw6qGjXOA/gUp8Hg8PlVVK/V6HbVaDcfHFZRKX1EoHCGfz+PgQEUu90XjgqZL\r\n        ODw8QTqdqzAnBS6X6042m0Umk9EWaaRSKSSTSSQSCcTjccRiMUSjUUQiEYTDYYRCIQSDQRiNxg39F25r\r\n        L/+cb9Uq9rQwmefH6Ymwfv7mDAa32705m80wnU7nqJbLWHe58NLvF6Yuf96b7+lnTgoURbk7mUwwHo8F\r\n        pWIRN1ZWEH31BKfFrDD1u503cw/9zEmB0+m8NxqNMBwOUVBVXF9exnYggNz2QwQcl4WpOeeePvqZkwKH\r\n        w7E1GAzQ6/VwbWlJrs0vf/+4i5/1I2Fqzrmnj37mpMBut9/v9/vodDqCT+9DmLTr+PB6C4+uXhKm5lz3\r\n        0M+cFNhstgfdbhfNZlOwv/sWv3+1sLN6BblnijA157qHfuakwGq1+tvtNhqNhuD52hpuLi7iqc+HdUUR\r\n        puZc99DPnBRYLJbHvFar1Toz6GdOCsxm8y2TyfTivGBOCvi4CP47PDtg+AP5hsNBK4PnIQAAAABJRU5E\r\n        rkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_VisitHomePage.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_VisitHomePage.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIoSURBVDhPfdHtS1NxFAfwM9ifUD4UBK2gB3tRECW0\r\n        rfLWYpFW1n0R5itBYgnS0HBQWDGQBmUNC1cUKcYoo16sIihBKqUHpRRBMNR8As1IK4uk9HS+p/sbEdWL\r\n        D/fcc7/fHz+4lEFEmSLL5aJssUgs/sUrbjm8uRkusleTXxQ6T7zTvw7wizs36usZMGN39eiu0Nz0KOMp\r\n        CP52wGaRul5Xx/0dDxVm7Cpt35VPQ685HsorFwR/HrBVPLhWW6vFgc5HCjN2B4JBvtt4kU8Vb6gQBL8f\r\n        YImWy7GYFprK8jjVmFCYscM327L4oH9lcseqTAoIc8B28fhCNKrB4a5WTtgefjU4pTBjh2/I7Pb5GB10\r\n        cUBAtJ+rrtbAWM8ThdLgxBeF2eyRQRYddHHAi+Vud438ktKZkW4e721XuPbT1E2F2eyRQRYddGmh3GKb\r\n        J4uSxwsPfR3r4cm+5/+FDLLooEu5SxZQQ1UBhL6N9/LUQKdqazrDkU3ZCrPZI4MsOujSpXDQKJt994Y/\r\n        D3ep+L4cflmzX2E2e2SQNT2KH7aM8u/v+/WKcD5/KbedLODus0V8P2yl98gga3p0usRrhOc+vOVZuSIk\r\n        7BXcEglw67F8LvVQeo8MsqZHJ4rWG5Xz0yP8Y7JPNRSv4XtH/PwsulcO2ZneI4Os6VHFnhwjwjMTPP9x\r\n        VCVL1vHt0EaF2eyRQdb0aIv8CUdCdMBaudgyt7tZxBzN2JnvTlY6RD8Bq4z5p17q7ucAAAAASUVORK5C\r\n        YII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"_About.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_About.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAG6SURBVDhPnYxPKINxGMff3y5qBxclfy7UxkWtLGnv\r\n        amtTS69thx1QDmqlXdw4MAlJuUikjINycdhBNDcXB0nIxa4k9BYlOVjRy+P5/sxv795y8atPPb/v83m+\r\n        GhFpTUI4cTcLkWa2yqSRORx5+1dBJtrRcTmZyZTG0ulS0Ou9ROZwKgUN/HFQGIzF3jP9/TScTFJc19+R\r\n        OZxKwUCbUAy2C61e04pnO7NUutiQYEaGnd1VBbm4S7GRcM211Na+fBS36e08J8GMDDu7qwrW+WNjPhuq\r\n        Ocbh6/GKBDMy7OyuKljrc1Wxari2Hg5mSk+HiwQwI3N6qgDPWye00W6hLfdKYvvjXcX7wiwBzMiwgwMX\r\n        r6rA8RoXesTJ3rRBADOyn1Xl/VUQZw6yyVbzdneKQDbRaiIr79RzFnQym8x5KpWioWSEno+WJJiRYVd2\r\n        4FYVDLjd7iuPx/NoGIaUw+Ew5fN5SSgUkhl2cODixl5wGggErGAwSNFoVMr8J8uyJJiRRSIRgqPruoUb\r\n        e8EdJF6oAr/fT6ZpSjD/FsCBixt7wQTzxbwxj8w1c+Xz+UYAz0Xmhnli4HwyE6rg/5D2DXLVhphIeTwb\r\n        AAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Open.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Open.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJSSURBVDhPjZBdSFNhHIfPorvoootugm6SXSR4Y5GR\r\n        hgWGrk8NCvtYhGkyN8od19xyOKTFkuzDrJFkLmXLPlxOw036WDWpKILZGrNlUrnSyFCbc27T7df7ngvP\r\n        RhO6eOA5nP/7nPf8GQAcSwqr9xHk/wmdpWcYPrCnmjW8GARrfgbW5MCVp25YBkbQ4xlNwu77BTpLoGcS\r\n        AruVCjrQ9X4ExlefUNv5EiKtAfpOexIN3U+w8oDqXHqZmllbqkoI7FIqre7v6HgzxGF1/0BNey8mwmH8\r\n        DIXgn57Gt0AA3U4nMiWnH+zVaISFanVCYOcptcXlh4l8nUKdbbbidzCI0akpDI+Pwzs2BrPNRsYBclhC\r\n        EPKBHYqae+9G0Nbv46AubbyPyZmZpEiTybSAUCTS8IHtVbV33n6FkSySQl1y8S7+zM7+E6E3ob9TIJfL\r\n        +EBBVZ359Re0OLwc1I83dCBIdpAq4ieeJ5Od4AP5rK6tfxjXH3k4qJfV30YoGk0ZoYvdUl5eyQe2yfWt\r\n        zz/jmv0DB/VjehPCc3MpI5ORCHJKSlg+kFd5vsUxhKZeNwf1o7p2zM3Pp4wEyHOWWKzgA1tPXmp+7MPl\r\n        ngEO6kfqbmE+FksZCRLPLC5WLgQEObIbhr6PuNDl4qB+WGtEPB5PGQkRzygqUvGBjRLNZpnBpWp1TjQ+\r\n        9OCqbRAHNTfJKyBOiNEQIUpiERKLEF+dm6vlA1kSeot8Qbb07Jr9Zyzieqt36fpD3uUZGfrFWJaWVpEc\r\n        yJYygk0V1NMFGyQywbpSHcMwqxaHWfEXhcCu4hm3kHoAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"dummyToolStripMenuItem.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ImportBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_ImportBookmark.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH0SURBVDhPjZLPSyJhGMftHB2D/oA8RAR7WCrCIPpl\r\n        ZmNIeOnQxVZDyULZhCEJIdg/YP8F99SpDtWt6FpB0W60rCyZiCCElM46M45+e543HWaYXdiBD+/MO9/n\r\n        M++87+MCIAjt7QlKPT1Z4qBDtjvfZSWTcQVl2ayzCiQictXff439fTB8z3MWBv8poBdRpdVCKRgEMhlB\r\n        YXkZhddXweHFBThDuP8qoMmNuq7jKRBAW5YFeb8f9+UyvpdK+HZ8TDGAc4S7W2cKAul0TGk28ShJaO3s\r\n        CPKLi8hXKkLyNZczcft8uw6BP5WK/yHB76UlGMmkgFdQrFZNCa+Ef4ezDoF3a2tTNQz8oq82EwnBT58P\r\n        lVrNJmEBZx2C2Xg8odEmPlCRHosJ7hcW8Fyv2yRFeuasQzAVjW7rJPjh9UKLRAR38/OoKopNUqZnzjoE\r\n        nnA42Wy3cUtFajgsuJmbw0ujYZM8qyo46xCMr62lWiS4npmBsb4uuJqeRo0KrJIXTQNnHYKPq6ufWXA+\r\n        OYlLKmTOPB4oVGCV1KhXOOsQfAiF0jTiaGwMxdNTFE5OcDg6igYVWCXcbJ2sXTAkSTKNaNMqeCUGbahO\r\n        x6pRb1gl3GydrF0wMDGRpdG8WMLwxvLp8BFzn6g0drJ2Qd/IyKfe4eEv/wNn3+vgegOoFsiZQGyBOgAA\r\n        AABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"toolStripSeparator2.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Action.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SaveBookmark.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SaveAsInfoFile.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_SaveAsInfoFile.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI7SURBVDhPdY7dS5NhGMaf993YiTvZyf6E+gc66WAe\r\n        hH2CCmvLj2LilDbJF2NuiGNrljFzNVHLdqBkXxuOUjqwDMwoN93qICIpUGiLAkcE4gpJhu3quZ+a+A73\r\n        wI/r4X6u+/e+TK/XM1mWVUiSxPg5xHGUpeoAYPsKSvwXdVLqdDpWVVUlOKXpZHbN8D+BwWBo4pKeSnCB\r\n        i5J6RqOREbS8KzCZTBez2SwqEQwGRVKPw2oVRS0wm81KLpdDa/93HGlP48CJaRw8+RyHz66B5n6/XyT1\r\n        LN3dzBoIqAV2u/1CPp/fV0Bzj8cjMjw2tsKXzxN8+TrHKQRdXV0dhUIBlVAURWQimcSfYhFFvrUa+4lW\r\n        zVBYCHp7e+u8Xq+jxMRALDP/OIHldBpLqRTsbW0i36+s4Nf2Nn7v7ODD5A+0aG4MCwFfYj6fT+Cx9TGb\r\n        JnTz3XgOG7y8vrkJa2OjyBI0p3fqqQRuW4CdkweIyNvIN9wK30W9xYI7U1Mix6NRrG9t4UsmD3qn3q7A\r\n        bbvEmuWrJcaXRjN4MfixIvROPSFwVvtZg3x5L5Ovh9YweOY+rlnvqaBZqOEB3tz+CuoJgVX2l/OQvhJu\r\n        jmF5OYXFxYSA7jQbbXmE5MhnUE8ITsvecuIkoOLc3AJ6akYwMzMr7jSb6HiKV+FVUE8I6iWPijrJXV0r\r\n        uWb7jk9sTE/Pi1+Px5+B7pH2J4i6XmIh9AnUEYIm+Qqnn1lknxDwB3ZMctYclRxJrVYb2gvNSvDOKAD2\r\n        FwTf/mk2rA8eAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_configSeparator.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_AppOptions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_AppOptions.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGRSURBVDhPpZO/S4JRFIYv+A+IEbQEIZG0BNni5OTi\r\n        IKjgEK1hP4gggpagrabWpkw+kERSRBBF/HDJ/LQ0UVBS0MVBQxEFBUWUt+9cqElE7cLDeziXB+653MsA\r\n        /Atms9nUMvsy9gUhR82sVuuBJEmFSqWCcrmEYrGIfD6HTCaDVCoFeQ+JBPEu159IJvNIp78QibwVyGVm\r\n        s/lEFEVEo1G5GUE4HEYwGEQgEIDf74fX64XH44Hb7YbL5YIgCHA6nXA4HFAoFHYa4UieZalFLrNYLMeT\r\n        yQQf3xLG4zHPvRc1r2dBDrnMZDKdjkYj7Ho28JC75zkcDlGtVkGj0V38Eo/H/5IccpnRaDwbDAbo9/vY\r\n        eV7nOQ/kkMsMBsN5r9dDp9NZCHLIZXq9/qLb7UIshdFqtXhuC2u8ngU55DKdTnfZbrex9bSKu9cbnvV6\r\n        HdlsFj6fj78Dylgs9kcoFAI55DKtVnvVbDZRq9Ww+bjCcx7IIZdpNJprOlKj0VgIcshlKpXqUKlU3i4D\r\n        uVN/2CJMbc4P2A8Zf+kAI/4jBAAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <metadata name=\"_RestoreOptions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_SaveOptions.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator11.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Exit.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Close.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"toolStripSeparator1.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_Options.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_Options.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\r\n        vAAADrwBlbxySQAAAqtJREFUOE+F0ktIVFEABuABcVG5cxGICxeKIEpCmyEJRAtUnIWl4FawTDLK1EQb\r\n        FXugJdqgmzIzNYfx0UMFLTXNTGes8a0jMz6bdGbE1MInljN//7npjRbRhY9zH//57z2HqwAgicvLU9HF\r\n        //A9zB+ST86p1Unb+/v4treHlZ0d2La28GVzE9aNDUlzby9E5nxOjt9fBcMKRbGZPTM0SxYy0Sh9oqHc\r\n        XEzabNC2tTEPxGRnXyK5RCHCi7RCq+SgBZoiI70nk92OstpamV9kpFouGGPgM9lp2d0dcLlg9fHBJK8/\r\n        UhdZlpelEvElYjnR6emX5YIhBqZpnmxBQfgxMQFHYiJGeP2B3tDC6qpcIgoiUlNT5AI9A+MklrKclARb\r\n        QgJ2DQZMhYbiLe+10KueHnSPjKBVr5c29kxKyhW5oJsBA83HxMA5N4fvNTXY7e8H+EZzejoa+Wx8cRGv\r\n        +/rwRKeDgV8Ylpx8VS5oZaCdYLXCUVqKsehovPPyQoubG17wflF4OCq1WmjKy+F0OlHX1ISM3Nz+rKys\r\n        B1LBS4aE5gNNJCaKNzfQvagorK+vob2zA0tLS+jq7oLdboNarS6XCur4H9QyWENVVEkV9Jhue3ggQ6VC\r\n        w/NGmM1mzHGJYqysrvoaEhJyXalUnpLWIZyMj7/h4sns2ppkhjt/v6wMw8PD0HPzZmasuJaWJo393CNx\r\n        Pzg4OFMuOBEbm8kRnYOD6DAaYZydRUV9PTTcl+qaZzCZ5uFwbEtjiaZ0zdfXV+3v739aLvCLiLgpCsTh\r\n        4s+0zw37ScUlGoyNTeNplRYDA6N4+KhSuo6Li9cxyoUeFBxXKm+JyYeHWI6TRXfuFqCwsAh5+fmwWBzS\r\n        GB6lMoWFna1l5E+BR2DghWMBAQX/ctTbW3fE09MgRpH9PQ+KX6DEi0hG/YRhAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_CustomizeToolbar.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <data name=\"_CustomizeToolbar.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEPSURBVDhP5VAxaoRQFPQKNgqWW+QS3kBMZ5GkEEyxrpsg\r\n        NgmooHgEe09g6UFsAnsCCxVBCxFB4cX5GCGLXiAZGN77M/N+MdwfQRiGpyAInpd5vueqn5DzPO/R930T\r\n        xM6OAdd1X6qq+qIdQIePnGma13meCcTOjgHHcS4Qp2n6xSzLWBg+coqi2MuH+JSws2PAsqzrOI40DMPG\r\n        NE0pjmOCDh85SZKeeJ7/BLGzY8AwjLe+7ylJEuq6js0oitgOHf4a3Yemae9t25Jt2xvrumaEDh+5wxJV\r\n        VbWbpqGiKEjXdTZ/CB0+coclyrL8muf5DeWUZbkRb+jwkTsscSnkQRCEsyiKH/eEDn/N7Zf4r8Fx38Ur\r\n        Fs8FVIExAAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_Properties.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\r\n    <value>False</value>\r\n  </metadata>\r\n  <metadata name=\"_ToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_SaveConfigDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>118, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_OpenConfigDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>275, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_MainMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>432, 17</value>\r\n  </metadata>\r\n  <data name=\"_ResetOptions.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m\r\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALASURBVDhPXZLdS5NhGMafMxHxQKfOKSp44IHIFFQm\r\n        ky2YzIbivqUT5wd5oowOXAcOxD4OrMOQoqxsukjUlpaGmWROZ6m1fJ2taXMwQbNl4EH/wNVzP00SX/ix\r\n        i/v+XTcvL2Mmk4mZzWZmtVqZzWZjdrs9u7m5Wcuh53ISerS0I4dc6lD37IEUvtS4XK7e9fX17ePjYxwd\r\n        HQkor62tbff09PSSQ+75AykWi6XJ4/GMUuHr+Dg+ulxY1OkElLf57PDwAMPDw6PkUkccMBqNxAW+8Mbj\r\n        cSx3dEAyGPCL//7p7hYk2tuxWV8vdrHYHoaGhrzUoS5rbGyUO53Ovv39ON61OvDdZsPPtjZ80etx+lD+\r\n        4XDgm9EonN3dXXR1dfVRlxkMBt3S0vvw6qOH+FRXh6jVKgr+mppkHSLTLMIPBDQaBIYeYHZ2Jkxdptfr\r\n        W+i15jo7ETGZsKRSCWZKS5FIJBCNRvEkOxuPMzMFc0qlcIPBz6Au0+l0TkmS8KK6GtsNDZjngq+gAKNc\r\n        DgaDCIVCGMnIgDfJVFGRcAOBAKjLtFrtFRInKiuxUVuLqaws+Lg4zqFyLBYTmWbEK4VCuH6/H9RlarW6\r\n        Q5K2MNXahmX+2vNcOmUyydnZa7lcuH7/CqjLVCrVxclJ387C4D28LC7Gem4uVrm4wKFvcHJyIjLNiOd5\r\n        eZi/cxcej3eHuqyqqkphsdgGNjfDmDCa8TY/HyGZDCtcpjJBeYvzJidHOBsbWzCbLQPUZRUVFay8vNzQ\r\n        33/TFwrt4WlDE55x+QMnnIQyzWgnSVH09d3wUYe6TKlUsrKystSSkpIWt/v6dCRyiMX7I/BecuC2Ik9A\r\n        mWaRyAHc7mvT5FKHuqcHWGFhYapcLjep1ZrBsbGZWDT6m/8H/kMz2pFDLnXOH2AymYylp6cXpKWl2TlX\r\n        ObeSULbTjhxy/x1Qsr+c8frHFzb/LgAAAABJRU5ErkJggg==\r\n</value>\r\n  </data>\r\n  <data name=\"_File.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIsSURBVDhPjZJNSFRxFMUviCvbB65cNAsFaRGERAspSBcT\r\n        ZFq4cKHgOEkNOfEocEYH2rRqY7vSiGmCKBIVkoIsMmyosDI/0EptijczDIPpfH/fzh3/8x4RDB34wbvv\r\n        nXPe/Oddquj8yMjpcx7PQDW6PJ5Dyv6vulwue7JQ4N/ZLEdSKdYTCf4Zj3MgFiszPT/P4jnrdltUZF8f\r\n        iW6uE/E38B1sgFXwGbwHi6OjvKLr/GB2lkVnhocv/FUi5l8gAqIgBLbBGvgAXoPVYJBv+XwGlrY2t4oT\r\n        LcHwAwRBuLaWuVTiQEMDr2B+B+bARjhcLpFfIsexatpFFSdahOEr2AJ6czPnlpc51N/PnzC/Ac/AdjRq\r\n        lEjBKafzkooTvYXhC5CjhO121vv6OO3381prK7/AvRkQ2tszSuSPPelwOFSc6CUMfrDV0cHFzU3e9Xo5\r\n        vbDADPO6pvFjPIvii1RK5OucGBy8rOJET2F4DjgQ4NDYGC9Zrfyqvp5namr4Ce7fBzvJpFESSaf5uM3m\r\n        VHGiSRiEacUUkKC8+RGYALvYi0qJ7Mmx3t4rKk70EHvgg8kL7oG7YBzcAbfB3NAQx/DWSkksl+OjPT2a\r\n        ips60t19tYRFKRSLnAdZbGUmn+cUAolMxiiJYxavipk63Nl5TTathD2oVpLELF4VM2Vpb3dJgahaSQrX\r\n        4lUxUwdbWq6rfFlynKIUASnKgQzKspjFq2KmDjQ12eoaG2/8D+LdTxH9AdGnGwl7PYKkAAAAAElFTkSu\r\n        QmCC\r\n</value>\r\n  </data>\r\n  <metadata name=\"_OpenPdfDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>539, 17</value>\r\n  </metadata>\r\n  <metadata name=\"statusStrip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>677, 17</value>\r\n  </metadata>\r\n  <metadata name=\"_GeneralToolbar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>793, 17</value>\r\n  </metadata>\r\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        AAABAAQAAAAAAAEAIACtpQAARgAAADAwAAABACAAqCUAAPOlAAAgIAAAAQAgAKgQAACbywAAEBAAAAEA\r\n        IABoBAAAQ9wAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAIABJREFUeJzsvXmwbtlV\r\n        H/Zba+/zfd+9b+zu191q1N0SmiVLjZAMyCJGCCTAxsRWwCYDOHGSiqcUxM7gMq64XAn+y065XKkKdspJ\r\n        UQVxJRSkXLELiGxhCSMijAaQRIMkWlILqVutHl53v373ft85e6+VP/Zw1tnnfO/1+G63uKvq3u8Me1h7\r\n        WGv99trDAU7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7plE7p\r\n        lE7plE7plE7plE7plE7plE7ppUR00gyc0im9GEj1hxzweQaeYCAQcAcBPeGhYS4jt3cKrBR4WIC1ArcK\r\n        8KFIBD0B1p8TnSqAU/pDSUng73XAeYeHn3SX/cYx98w8MCBEtGEiyfKhRk5IVVkBp6rHoupUpJMQjuOl\r\n        uBbc/mQEXhleKgrhVAGc0h8aSkL/CY+HDv3lVeed2zrmlSPqHbN3QGSiyNh1TFAClEA6lRElBUgVpFBW\r\n        bAZRdaI6RFUnIiHEuIkhHMdLl24OQB+IPj6cUJGvS6cK4JS+7kn1bR2A7rHHnvBd5ztm75mdJwoOO+eI\r\n        ouvJOSJhQJjIMYoCmMtItuosqqRAFFWWlYYI9VHXIap2USQGkSHEeBguDkPArbsBuG8ggtzg4l+TThXA\r\n        KX3dkuqbVnjIdY+vufOeOuajjtl72rEHsx8oeCJ2gLj8yxSUYRQAATQOAUgBQAEFSKFRABb1JIBEVY6q\r\n        ElVdXKkElS7oWoKIDDHq0PdhuHRpNwD39y8WRXCqAE7p645U39bhoWGVBF9WzlFHO+qId93A3BGRJ2JP\r\n        IXoQO4I4ELsAYSJlgBlQRpYPMsOAZPWzAsjWHyDxKlHBESpRvQtJEeig6sNKdJCVDiI6iMRht9P+0qXY\r\n        A/f1J+0nOFUAp/R1Q6pg4B3ry5f7VdfJyjlZUa8rYuoG0hVz6ADyFKkjij6AHRF5QB1FciBlQBzBUbq2\r\n        1r/QqAA0IwCABC4hAECiUxdUJUA1qPeDqgQR6pMiQC+iQ4zozx+7HW7v+pP0EZwqgFP6uiDVt3V4eLu+\r\n        solr53TN/cGKnK6S4GNFIXRE1AVCRgDiEckTyIPUAUkBCMghCT5DlhQAACZBUgICqLBCAI1AGgJAOajT\r\n        oIrBQ4KqH9TpoIo+KQL0sqI+RvTD0O1uuunRHXD/7iTQwKkCOKWXNKmCgFesL1++Zb1a7TbMWPGg64F1\r\n        nQQfqyz4KyJ0JNQR0IHEg8gLyEPUEcgBykkZKANsx/9FTrKAkiokWX6QQCEKjWCKAAIrBQBBVQOcDqo6\r\n        OPWDKnp16Isi6CLvZLXbhcC7hAZevyX6+Xgj6+9UAZzSS5YS5H/b5skntxvvZc1Dt0mCrysiXVPEKhLW\r\n        SfCTIgDQCaGDqE+KQF1CAeIAZoE6SFIA2Q8AMnJSHYAQAaDMHAERKEVNKCBAKShrYGCAYlDVARkBOEWv\r\n        Qjv16EVo10XayYp3Mbrddnu0vXTp7PZGDglOFcApvSRJ9V0eDz+8ubIZNt5vNtzLenCyYfZriromwiqS\r\n        rpPgYwXoSog6EqxA4gnUgSQjAPKUFUAWegZo9AFQlhMdEQAsAoCIKkVAAzNHqAaFDlAelDEAGFiT5VdO\r\n        v06xU0c7Vdp54Z12YRsj7fp+vb3ppie2RPftbkQ9+huRySmd0vNJqu/yjzzy4MHm4HDjHW14GDbB+w0T\r\n        rznGTWRdFwRA5NZCWJHQiiAdEVZC6FTgCegIcCB4EDkCHAQJBRARoEwAdf6vv9mv3vdWjb/z5W3/E7+m\r\n        crmHQhgQMASgmP4QVRFUEcA0MEmAoofyIIyOCR0pOlXywnBOolMhF5w4GZi76Hi12tLjj58l1VfjRiiB\r\n        Fw0C+JnVuwsv7a+lFw2/p3QydM/fUn/w1kcOzt3hDlbn4qZb8Tr6uGHVDXvZCLsNqa6JsRbSBP9J14Qk\r\n        +BCsmKkDxBNRB4EXIk/IjkAUHwAIBO4O/uJrV4d/7dtL/ho/+aWjx/+DX4HGOCIAjQqKrBrAGpR5gCQf\r\n        gCp6Zgxg7KDcq6MdK3ZwcafMW1XsnPJWXdyK8NZH3ko3bPt+fXzx4uNbovu3L2R9nigCaISeAHDzi4Xf\r\n        U/pDSi97t/oBT2wOHl8dDAib8KTb+E3cOKcH2PCaHW2IZO06XgvpmkFreF0BtIqKFTFWxPBKWImiI4IH\r\n        yBOLU6iHkiNSJ0QMgB2/8dzqlh/7Y5YHcvfc3emPvX23+wefYZUIJVGiCEgUUFBBBKMn0aiKHo56EQ3K\r\n        2DmvW4WuoqPOgR0FcuDoxCtzJGbHFBCpGzytVjs8/vhFqHp9IZHAiSiARvDzmAuu+S1KYGk55in9IaPN\r\n        pZ4Pz4YDutpt4sP9wfGx26zOhw2tdB3WdODXuobDmjxtIsuaO6zgdK3QFTGtidGBsRJVPyqC2FGG4wR4\r\n        QJ0CDpymAde3/5VvAhy3vKwu/kdv2N33vz8ienkHRVoFCAqUVgMGaAwiHJSoZ9VBCT0cdsHpmj1tlbWL\r\n        nr126PyKWXfEkSM7AOyYBgj80GnXDXr58gVVfZMS3du/EPV6wwUrC3/5c/nPA+je/qZXvfYbbr/5z61W\r\n        3bczu1dD6IKqdDIEyBARQ0AMEXGI0BjSfYxQUagClFZqQu1sqrlRaJ7VyWs57GvF5Bnl8JoZVZtouVak\r\n        FaHaPB9j5WQbHlK0xEXNa8w/uZq14SnHq6w2Yceb8b5mW1Ify59YH+MpaOQNpkywvDekaW9MWRqjuVBK\r\n        Y9olDtky1Uk13ZNu84QAXgvoOIDWAt4KaC2gbQR1EXyooCMBrQR0Jb3jAwEup186VOCR9EskoDMKupqY\r\n        JijonAIPAHQu3QNA99aAi79ypeWs0tWf2ODoHx1AbyfQBQbeQOCLDjjrQAcezB500IF8F6jzx7z2T8mh\r\n        fineufstORwe9Id8FR5HWPMxOzmmjo7UybF3fCyOj0Xk2Ed3HL0c7Xbb45tvvvOI6ENhL0PPkm4oAjDC\r\n        Xyx9B2D1prsvve71r77rbx+cPfe9FALjqS2w7UHDAMietREMYOUB9af44OudVhHqA7AOgAtQ+7uJAEfo\r\n        KiQ/3DpA1+kZfATWEUr5epX8deoFcAJ0AiAt5lMnAGt61gOr9/6da7J05icfgP+210GvOiBy2jQYGegZ\r\n        IAKiAiEAvXrEeA47OYfjzR24fPFb40buO77ryvvdLf2XKcDLIRGDiMAIEDhA2TkNEPUuymp1qHj4YVHF\r\n        0fO9h+CGiY4R/mL1OwCH73jFhffddfc3/E+rzdlDenILHN+Q2Y9TejpkrfVJkReoC8AmC/3GCn8AXBZ+\r\n        DklRuACss8BzTMrAJyd9us6L9tZF6CUpBkjunQr3sh7dO/db/0Lh/u9E+M1PAUJJ8DkpAYoM7Dj5FAOD\r\n        QvYt7hy0W4HPHECDG66ef+r9+qrj3+CL/CSdoafcSq/Siq+qk2Pn+EhYj0TcsfdyFEI4OnfupiOijxw/\r\n        r9X7fCa2jxYs/wrA2Xfcxj/2sgvr/9YPYHryCqAyYtwRF1+flsI+k/jXTZ+msNSmbQXk+eChTVufaUIm\r\n        7NOKthDItsEiPwvxnm677dlcO6tjIFlkisDKWPlVBFx+hiL8cRT+TQRWIVn9VUIAcBHq8jUE8DEJP2I6\r\n        0IcVyjEjAIV7y/9ynTpL5O/+ZYT7boVecaCOgUiAEDQ6wDEoCiAOulYgCCgqKCr0sQA6e9AdPrz6/qce\r\n        Gc6Hb44f8AAiCI4EpKxBVb0TgSPhQaPzGh9//Diqvik+n/6AGzkE4JzfCsDZew6v/vmbV2f/uzUOyB3l\r\n        1Y+280zGipi/tw9aSzXrgFR2ci6HbdNt850O1Kc0EQiMg/tJR98Tea+wtMKly+HIlH/O0LWTvZagtmFa\r\n        oU1OkXk9AcUBsFyfbdpLDNq4XRbcVfnNEL4I/UEchd9ny78OSZi7dK9uRADgCPVZCazSEEBZ0pqedRoW\r\n        8O0RfO5H91RMy+4G/jWvxfC7n4FGBiRb/6AAM1QY4CT0IJeqZpuUjF49AncrHDyBP/7Uv4nH4Y+7D3uQ\r\n        RmVxGxXuVIh9IJI4sEY/rGPXhfjIIyGqIjxfQ4EXXAFk61+8+h7A+nY+evMt3fC31+vz1NH66Qts26l0\r\n        9iBf5mu7gLPt8cWytgK7qICatHVPBGux9Zo9fcp2uShxqEl/UcHZ8E0RbVhq4kCnZaCmTqipp4nSIMNb\r\n        I+Q132vw29Z/nQuifG/S9AIlyVbbooA8/d5FKGXYn4cCVfizglAfAR+SxfcR6DJ68ALtJF2XYQALdC3o\r\n        Xvk/4JmQ+4YPINx/O3SXFIBGBpwDMQPiAFEoS3JQd8mtTFukOYe+B6+B9R+E7zr6CP7AvZsCOUTpEN2O\r\n        Y1iJeIcI5+OgGjuncb2mALwjAM/PUGA2xfECEWG0/hfu5qd+Yt1tDs6cvS29IphOkP/yKsxZZ67v2/tW\r\n        KNuIRlhs3FZAWyEqHbMNg+RFnqRnhaDypjASZJ7T3HJbftTGW+LzesKfM6qKrjwmY72NkrW827xaHrUp\r\n        HygrhobV2S5a8zfjW8e0a5jspFNJQt/lv3V27K0zIigOPxehKqPwb0JCAauQEIMLNb4eBGA1pLBd8ifo\r\n        OsDdFMAX/iaeCZG/Ce41BymNVcoPqwG6yfeHGaGsAkABOIjQw3HYwkRwZ8i7f3v83f1D8bxu9Yxucaii\r\n        GxKsI+uaoq6ZZU09Vs7R6vLlfqX6rufFeL+gCKBx/HkA60t0/JZD6v/4uZvuHuEigGqZWot6XTI9aWJ0\r\n        rVRcA+vW/t4oidoZDRNWmJes7Ax5NO+hpsxteVtebVrG4rZC1P7W6MXCA5PyW+i+FG/CtEU9WOC55LOQ\r\n        iH1OTRss8m/iezEWe3TSaRcBjek3owLVDPFdTE7BtSTY36VhgHYhhT3I8UtYn2cDytgfBH/nX28r4WmR\r\n        v/UzCF++AzpEqGSnX1CAFNoJiHy6JgX1qW70AKBjAB3Bn1vBH199xfaj8e7hZt51nQ6y5sGv0WvQDTkE\r\n        IoSBMXjG0HUSgCsDgOc8LXgjEICF/2du98c/tFqf4fWZm6YWBMAi/qZWmiwtdLolqz4J37yvNbCAEMrz\r\n        FgG0aSy+o+Uwk7SWrqmJuoRelrSPeVfDFSVA4z3ZAlrl1vJohB+oQjJTcLaeFjWf1Vo2v7aibboCdIpR\r\n        6MVA/+y8W+XpPYsI1hHKIcH+IvxdBA4lWeAuPy+owIfcMwl8AXAX/h6eDZF/GfzL7k5lYRnTz1OTusnO\r\n        yy4jgU3mdZNQAR8y3BlH9Pv9W/WynkXQA/S6Dr0eIOZNTTFtaqIeK+aj7vJldM8HCrgRCqAggA7AxTMd\r\n        vu3g/O2YWGg7prZWd9afGqg5EQxj8SyqKPFm4U0HtMJmt3+XcGritiVbumlh/+T1ghKq9zSyWW+tELfC\r\n        vnRj8i18axb8MqSqVnxJ0ZZ4Nj0dIf1E59qwRTm0SqVBIZTL0nr8S1pdsprwecquk/TrNTntugL9kx+g\r\n        KoIyvi+CVlBCJ0kR+DgOB1Yhjfs7AnmAOsL6G/8Fnos4dHf9Hvh8SisplQAtwwwOUGT04bMfI09X6iYC\r\n        mwj/jR3cg/0d8VE9F4+xQaQDCFbEbkURXSSsOGI1MK24P1h5f6UDdt2zZjjTC60ACOPUnwdwUxeHl63P\r\n        XJwLVXX6lc5ROp2OnbaRqYnQVI/4HstclceCRVXzvqII2JdNXob30qGpIAUjFFaASx6Vbauwyv0CIih8\r\n        qUEiaupqMmRq07ds5/ha0sI8Hkr5TV1NlGUJYx7VOlOTT0naDjdofGbTKPEKv0XwNTvqUKx/Hg5QnsbT\r\n        7MyTLPwoHn4j/IeN8Psi/ElQCQTqCN1d3w06/JN4bnSA9at+MSkVRloTkNEAVhE4MFOTPiReXVZQFOAu\r\n        eNCnwxm5rOfQY4Ooa4pYC7LlJ+qQTjPqiHedc6577LGHu3TU+bOnG6EACgJwAM54CQd+fYiZBVZMO3RR\r\n        BGKu63NM0UBex5Het0qgSdOmXdOlUTBaS1Y6dXXKUVr4YXlpBbL+NkikKr1ijY3AV0uahVSQ8lH7jjAR\r\n        1omlLnVg4kystcm/1rV53s5sqJq8bbxSbjIKpUEP7b2U9HXOj5ZypvQ05lV63qAAl61/RgRakUEcp/PW\r\n        WbjKOoGD7EfwReCyIohZQD2BCOBzgL/0y3g+iA6/D6s7vwfkCcSUNhuTZMUTgcOQLH4exqgTQEOaflwD\r\n        7ono5aoeIuo67rBGxBoD1iB0CQVQR4RuYOeZues63wGfeE7DgBvpA3AAVgRlxx6m9Y1lt9bMWAZrgC2E\r\n        VTFhxaRRnmNqwaylrRa3+VM7vVqEDkmjlzDlSLjau/NluaaqjUxalp8GZVTFYHijko40CMEgogkftuw2\r\n        7wYlVUQhJoxJR3Vcfl3Tl2zNTR1Tm3xRppYH0z4lLBfeDC+lbAXuu2zNOTv0qJy9mRUCkpJQzVN59Xkc\r\n        hb4sBS6Q20cABOoAPk/oXvZHsXrTP8PqNQOeTzFwl34Jm7fci9WrfxD+ZoAOMxLwofKqLgIbTb6AjeSZ\r\n        CQVEiYKuEGlFwArp8JJOSDpQ7IjQpQNN0dGOOmbv8fD6OQ0DXuh1AFZsixLA1AGko6UqUHcC05swrc8A\r\n        S9fFghcrS2PcGtQohXY8WjpyRQEGdZRsLNOThS/W6ltozWOasyk+mOdG0YDyyVRNWLR8Wb5tOQw/M0++\r\n        5bUtjwlX4rDNi5r3ghG9LaVt82xhSeEtL8jx+ddlReIFoAyZO6m/xfJjLRX6V+XgBbgwgM8NoPMRdOjB\r\n        B38adPB9oNV7QP6VeEGpez3cLT8HdwsA7CDHvwY9/n+guw9Cj+6FXhHoFYV+bQX1DNLEM0NBkE5VV1Dp\r\n        RLjzig6ShB4knkg9Ued7hvdM/vGOvOq7/LPdKHQjVgLuUQCN0EwWpyAFJ8VkLcDSiriJ0oCxcOWdUQLA\r\n        2FEngmWFuOnIreBURVAUi07zUCsYNqwto+XP/NYy0lhrLUsVXlsFSdM6qM9h6tkmVuopC55SE2dkeYzT\r\n        tkOpT5uvUdZF6Za2nCl6y44CDKjXDP+RnH7F+VeUAUlCJyzJB5AX8PDLt6DbtqCXfSvo8HtBF38QtLob\r\n        Lw5agw++Gzj47vkrHaBPfhD65C9CHvlX8G97CN6dPSDddSB4IulAlI8vI4+ILhB5F6InVk+k3jl1wBc9\r\n        nuWU4I1aCmyRwFSIbEedzYvDCJaMglY6zfSDLcnKtuigdEZqOuqkcwomHbwqCzTvWiG2CssqDJ0/qwna\r\n        OGjSNcqppm9Qhq2PGlmn161iqfmrqXdMA9T6LPybcEWhGd1Q60VsvRbFVeJrao/KYttWtq51dBN7ShZd\r\n        Y9peLJrW65Mmi9+NswP8jkO4e/4J6Oxb8ZIk6kAX3gu68F7wXcDZ3wDOyO4d8Qvvf/n26Kc+JPjCVQG8\r\n        I/EC55ngieCTciBHO3j28Hjo/LN2BN6olYBTmnTMTErTl6qjoIkRmjpNZ4SyFdCaTAnbWMcJlEXqqJOX\r\n        Ja2Gn2ppDf9WMGra1nzbciyEtUSWl5z/ZPaigQUTwWr4aZVZvVTDmpjyFb5tFFOfIpgNMdqy27yJF4Td\r\n        lqOhsiRXZDwSxputup2m4zpYARG4b38t/Ds/+tIV/j1EvGb/6h94xeFr/8m/S7xeQ/K3C0R8+oSZOEqf\r\n        MvNg54gG91h35NIJyc+cTlAB6PTPdjprsYs1sXHJPKO8/7qdJ6957Mu/eV8EqA1kldXEcdbSUme3r3Va\r\n        DsA4xHL6k9YwymtfmmTittH2klFIFkEsLrhaqM9ZHSwgIKuYF5Ka3hflWNbkZyF3BRVkflmAmN5rJ6Bb\r\n        Xn+tQr7kidyt54AdEanPR5enMwsju0DkgegGio6oc84dOOBtzwoF3IhpwD1vrNDSVNBK1CUrBox6g5vn\r\n        s85vOmWJOFEgRdEYmMtmvGozLNa2eq7b/K6lfHQexkLuyby7hfqG98X9CJZ/nfKz5OhrAMREcGfU5tcW\r\n        eqHuS3ssKeMF3VrzL8dwOkBZx3G/ZGWQN9Kg04wKFPK5n9nD99cHhcf+9f1IWwi9pK8WOSHNHzLV9BFT\r\n        CBNFZh4YeOJFiwDmPcag7BGO6ryTtHJTOjkTJrC9tSY27oQTA3cr9CVMhyJAPRK+pLNvZaLmf/usrhWy\r\n        WgtZaImywOS/CoZKvoZXNWksZVK/ZD3JNJ+qyNM6sc47NcFnyoFmyV1TiGtdledNe9q8WioWn0eBVyoo\r\n        wDw3f/L7ZxDv/8mlCnnJkxw/1h9/7Sc/plEdkRJE84kilL9izA7Ejogd7bwjOmDg1hetAphT26FKh5sJ\r\n        fBvWdN6ZlbXvy61ev/O2HXKfMmk7c8vTjN8WESzEF4tI2vgLz5b4XyrHxLrrnjT3KZSFfNpnszpdqqBG\r\n        aS62V0kvW/ki4NEogjL+L0invOsU4UP/K/TRX7hOIV5apHI5Hn38L34U+tAAyrAfzARmCPKHS5Qp/wJK\r\n        RAPjoasvIQVQqemEz4SbiQd+nuyicF6Djfq7ZNX3KolrpHXNaysc+3wK10j/eoJbkp2tH3gaca+V/rXi\r\n        zs5mwEIdLiEpg46KcJcJ44qEiuDnIQJnhSCE4UN/FXr1+VnJd9KkD/4WnvyHP/SFof+tJ6uQ0yjsaQ0j\r\n        MZFkwVcCRSaK/IjbcfpO4jOjE1IApdEbIa6GY6mjTKOPEfaMcZciLFno2smQLbIx79rEtZ11ycIvWfpZ\r\n        2ZpwReEsDYFahFTTajJq42lTDstza6yXhHQfEmvbZ0Y6KoKqTE05qX1e6jYLfs0r819mBurQT9NUISEP\r\n        DQA5ZvQf+BHolQ/t4eklQsMVHP2lb8Nue98xiBhCDFYqSgBULD4IwRHIcTp3bEWAEHN8uqZhQic0BMi9\r\n        YWalFvhfgrut0rCKYMnfZjcaVVLTGZdOVzLDDNv5J0aV5vzV/MnwuhBuCaXUFYgmrVm60+yX828UXuXZ\r\n        1FHbXfahn3JRy0+YDa2W0E274Mkqr6qQCvRv0rL1ICZscXb6nHafhwkD0H/iB6D9b+AlSTqg//jLEf4F\r\n        A5QtO0B5R5H5AyF/qzBkx08PJaINEV0g4IdeIgqg7vKzVtQKyYI1tL9WGtoiW+u81PEUWB6f6zRei0Ls\r\n        kmRgtLJLboiiOCqv2r404Y3lawtdFwc15ZztWDRlKEJiNUJbnkncpi5m9dnw107JVl7RlLtNr5RjYVgS\r\n        ioXHVCG0U8RLvTXHk6cYu4++G9r/q4VAL2LSK9h99ALkq3VJP13jD6CsBKY724goPmPhB07SCTj7Mx11\r\n        Yh0bCzrRBqVzEsZZgSrlJn5J31j1CT80Cni5n5ncMlyxAml+W9Zm5tl0/nZWYRKsmkGMwmzqZya8lifz\r\n        UdvyfpZHq4BmF/M8ZmsE2vvGzFslPAnTlN8SG8VFNPoAano6Kgj7zGwg02Ng++k/Adn+3Dz9FyFpeBT9\r\n        71yCPOSXJNEIeX1CMqn8ihYyPfyMlcDJDgEmFpUMnCfTp/K4Uk1cu0mHm+nAmdyVuK0k2EdW0ZDJi6Yd\r\n        DlYYyQjlAgyo4dvrItiljLmdeUGpVFZ1rJ8WUk/OEdCGJ6PEZnsFSrktUrF1UXiwSraU21R2K+xMk2wW\r\n        6720By08nyhoU3eLynKejQbC7t4fhhy/uNcJaPgK+s/ehvjo05HZfYdcPHc6AQWg49i/dGrJz6vw5w4g\r\n        2pSdxjgM0/FMR7XTd/UdMN1kY6waZV6q8iDUrxJWGTLCZ/kuvJesyzkBYpSWVV4lrjR5tguabF1UvnRa\r\n        JsAo0vLeWmA26wxMvVYeaLy20jQ5B6DhV3LZbHuJybPuYbD1X+rb1O9EeIsybIS9hiuoptS1ycOe3lRQ\r\n        sSafwO5z/zHkyX+EFyNp+Dx2n70T8XEyZ0vMg2EC/xJxE1J1aUz19OnkZgFqx8RodWbBrIUyEjlbUtv2\r\n        uELWCmLsYO24fAJJdc91iU/mHWGKHlorajq1LfNka6wRUJvHJAya90vlXUrTvtOxtVmn0e2MwSxNnZZr\r\n        yfK2Q6vKSquYbd2Vcpq06tCW5srfCn77a5uzTwpcA9B/+a9Ch1/Fi4t26D/3GshTGHlewzZXA+nMX/3o\r\n        Yx3P1ntVp8Ctz1gZnJACaCwu0PS9IkBYFiK7l3/SsRrBm+TRKJx2w451lqliksDMYmGaHoDZNF5N1wo+\r\n        xvQqqmj5N8LUyvSkbEWRtEai6T+KaX52iFPDNMrH/EyU3PTFeF3l2bRZ4anl0bZp+fMYURU1afvC74Lm\r\n        6XJfMMqSihIJgG6B/gvvhobLeLHQ8OWbIUflLvNaZvByVWUAnPc+279RCfhGCag+ocDPv1QUgOlMFh4v\r\n        WZi64Md2KmT4LaMQTayQmk4DE4+MACwIWIG6Ns2SZBWMJn4RxpJQC3dr/k0HL/EUSFudBVMYb5TBEiix\r\n        S3/tuL3u3tM8hWas8kSoTX2QSXjJy78IOBpFUYYHVhmgKX8tTKnX8lv4gYH5ub6iAtFEi5z+MnQmArBD\r\n        EnxplLYCegzEh1+HFwPFJ/8GwmNbc6RDVgDl6LfEdDrqiElzPRgUQAqQwEUp546vQKrai4izmv9p0wk6\r\n        ARXpkAeryMzRVJM5YhMWwKQT1Tl8KzjApLO3PXhmxCh3RnsEl+G18FYcXNTygmk7oWmz4lOYhWme1eYz\r\n        CqUtU0UCbVmMUFX/guXRHNNV/SeWT4xhltqnDCHYvKeFctRt3FaRWE1i+C1KQQGkxW0pg+J3iIWlHEap\r\n        NgUBQMjCsyZAGRjyvRTlmfILj12G9h/CSVP48t9Px3YEAGTQClCbX5VUQQKoqCL/kUBJFCJ1tZqyqEaB\r\n        BlFlvaReiSYV/LTohn4efKQikMb6WNYnnTz/iu1sMOEJ42EhFg6atJacqMUi23MH5hgetaPa6TXiPZ8t\r\n        X1I0Vlg5oZZr8QJBOg3JlLNFAW1e1XIuLWgyZVAadztW+G7OBLDptXVWHYr5urTHpOpKLzZZLKEgk1UK\r\n        m+vWNVafx/YkR1ClPCSgpDCKZo2UwnYizIHSAAAgAElEQVRZ+COlnYUoValICZ4wlToiTfxnxEJIqIYS\r\n        mhMoRAVCqvmsM054jpHeKUTLgZFKSUHc2u1r/GvSCS8FhoE+RnjbzkNInaNY4BaS1rRMz5ukb8IAo2W0\r\n        K85q46D5y17oyayBTcvw2satedF4zTz1+rc8Vuyqy+WseVrht1Z/X9gsYGRf5msy9YBSPqNsZzzoVCFU\r\n        wS9t2NQv2vg2H4wQuFh9pgqPKVL96m7NA5wUAQgYOAtTTkcYJEUxIFnbCCCekK0zZLx4aRgDTv0hJn4V\r\n        AARCShGgmKf9BazpiCRQVJUISIRGUWVRdaK6FeDRZ6UATqZW9nVq+1uhbG5oxXhtl+4Wa1VfFehHo1C2\r\n        eQumaVhEMgnL8/hR5rzaxFuhza062ZaLrMyKxZ6lkyPqQjmoCSPXUBQWsbR5iB3qLKXf1F0VZqMMq6A2\r\n        fc9C/uKHsD6BlhdFFtR0nLZmwdcNjZBeGIgu+31yvoGBwxwWDOoYWsJHTqfwAlAQ4Dc4aSIgAxFKS/uF\r\n        0qyFIDsCAVUSVaRDDxlB1YkDoioik0YFR9UyVo2CTRTtu3xC6jOnE94NWIgWL5NANVaakLRmma8HMIWZ\r\n        +XcC7Q1ZqzQTFCMwzHMBUFnOy1Id75v3VITEWFkG4BizIcsSv5MZhnxRhgxtXhNeKOVhFwfWcjRh9943\r\n        Qqsy5ce2xyw+Xbs9CpoQTefoT6x9uU57XqpvIOZPcPcE6gnoswWlLPSS70PqHFoQAN22UEE3mNbIB51w\r\n        dWamsuS9PiCIqIAQBBxUKEI0fwWF0ieQnEQPjuo5qrqo6mOMmwi86VmNcU4WF5VOUi2nYvLBieolL0LA\r\n        9YDZan0K/JwIK42wVnTsnHYLsR2n1ng6F/x2bG2M2+SZzWM2bjeQWBTTw0xoVBB1OGQSJxuvlNeOGXSM\r\n        YqPauirPRSbRUOG/LUuFUiPvM3SgeXsujzwVH0NBYItIaKE9anZZ8J2x4MKAFqsvIJctPLJiWOc8Bwa6\r\n        5F+h/IluUoaKA1xMn/96oY8CfxpEnQKSrX9RUjFv8svDABKKGim6qBGgoNCgQFDWQIqoylFVgirCShGD\r\n        IN4UQiT6+ZeQAiiCb1eOMZkVZjAdq0YAykm0ZfxZoGVd0ZbjUysNRvAXrX9+74xSAabow9LEB1AcdlmJ\r\n        sc4dlrbME885jWmVE42tgLR8Wwtax+mN9E+scU5LGqtdi91oMcdjPC3awyqbpv6yA1FBEFWoJA+Vxjza\r\n        XQBgJS4p5cWK+TdyFv4s+J5B8FARkBA00Ojl95TKOWT/jEuWVGMeJnQCRAWpQFmA1T5GbizxwfcA8itA\r\n        74DAoOiAXS5zz3nygyIUAaQBypGZ8ryBRlUEEAJUo2oXVTgIHQXcesuz9nCekAIgA7cx9uGiEKyH3fZv\r\n        ABMrUj+2wahnxrfm3S6hnVlJYFx/kNOyAjzpNybdfWPyYk2ZDWpYsNbVaVaEPf9xDrfPm9+Wo94bZUg2\r\n        AACJRkE1ZtnyO8urQUoGaSTWFRIVUQGJgiCKIEAUhYhCyoyVrTpTDiYGM+CY4B3DewaLglnBREB0oCjJ\r\n        sx8p/QbKlp5ByJa+Z6hLAgSf0AJFl04SGhzACnf+OX9F+3khPvMXQP2HEl/R5WGKy07LPAsQEUURRDiw\r\n        aoBigHJg0KCK4JSCeA0aNeg6ROnXEeifdQFPQAHQCN8ni05Mx3SUIGZ9V4TRaINiAW2Hdzw6iUq8Vmom\r\n        ljBbHWAUxjJWt9uHa/zCw4ICmKTbQGKrOOr78fGET6bR+i69t1rMOj/ZmfeZn8lR5haRFMTUop7Cl2mb\r\n        urCIoBoRoyJGYAgRQxCEKIjrNfC6O8F33Qr/+rvgN2t0d94KVk1CrQqS8RoM9A8+BNn26D/7FQxfeQRH\r\n        n3sQ7ijCQbAShWNNGwJd/oin5+ToiwylLPDk0qEhUYFVmT0XYFDAOYAUxAra/Gm8GIgP3gfE/xSgbP2H\r\n        PGOxY0AcBAQRBFIaoAhKNIhiYMZAiqAOg0qB/xqiShgGCcCnX0oKABihcAMrrYUuc8ItAq1kraidpstC\r\n        PFl51ght5cHkDUzn6Ce7AEuWGbkUS22ZW9qTQUjbWrUIYZNfSVsU43f3MAphHc4spAubphnsKzCZ29+3\r\n        V4SBcWbC1L9NPz9UBaIIhkHQ9xH9EBFefiv4nW8Gv/4ubO6+DSwKMgLPUab3otnxmX5Xr7gVcMDmzXek\r\n        5x4YvvRVbL/wRRx/7PeAhx7GSgSdKtw5Bg+ULHzI6yQ8gwaGegeK+aOiyiDnoF5AwaVjw4LCbf7z5Tq4\r\n        4bQGrwn6mEtoRh0Q0ndzy9SlCkeNCDFgWAl6KA+sOqhiUCBAMajqoLIKMR4Nly7dEp7NAqBCJ+gEbLG9\r\n        sZBlE0mxomrg5MyzlAXBwSxFJSNnRlAtZC5j6gJ1y7Bi6cz8IuDOQOXisFzSUrZo1UoXZ9aeOqjw3Ajj\r\n        5JnlBaac+V3hv+qwNryO1+wwQSGTTVeoylkFiFEwBMWuD9h5D/2Ot8C95+3YXLqQrLoqKIqx9MgCL+m+\r\n        HFTnswIoZ/4x0nFffnzWvfo2dK8/j7N/6jWIjz6Cq7/2KRz95n3wTwasNmm4QMIJDQQGVi63eRb4VRJ4\r\n        9MnnQeSgnYIO3oMXC9EZQB9Kgk9DPuxXPQBf2i+oYiDGIFEDsw4ABmUMXnQQ70MXaZC1DnF3GID18Fz4\r\n        Odl1APa7f3aA2e5OY07PxAhHtZKZqvUultOEqwrBKhwjWHW5qYG9RcDqUl4eFUabT+Vdp+lMUIfmsXZ2\r\n        yNkZDJgwk11vNC1HjWMQVCmXNuGq0OffOmWa69IOL+yGmpykRMEwRGz7iJ3z0O/9Vqze+y2gzSpZ9iz0\r\n        pI3gF7ivCio+lSrwWVFz+fpPQQX2mgHn4O44j3M//HbI+16L439zL44+/Dl0T0R0FwE3OGAFUADIKzSk\r\n        k4MxJCRF7Ot6Ie4iTnqyy5I7ewmCLSj4ZP3FgXbJr6EgxEBBAgYfMEBcz6K9KnoFelX0IuhZdIgRw8Wd\r\n        Ds/2o6CFTrBmrPDQtMOX9+U1kDposfJowrbW3m4cqnkZZVGhf/usQRdMo7W0r+uoohmX1Gk6w4sV1hKG\r\n        aPRxtAql5bERzkmAJevdIqnyO3H0NSiiLpwCVBUhKLZ9wHYbEL//HVi951tAB6ss3MuCX+5ZiuDDCL+O\r\n        Ft8K/ETwS5h07D2cB7EDn93gzPe/EQffcyeOf/Vz2H7g99FFQkcMbBjEGfazgpwmr78HaEgnB5Nv2uiZ\r\n        kj6AePm/hzz506CDbwaf/7vgg+999umt3wNsfyk5AtWBQkYBIZ12qjH5AESwA6EHqFfWYv0HjRh0hSH2\r\n        OuB2eU7WH3gxDAGqhWsEsh30F8tWhrvtTEFFCzDQeaHx22GAVSTW2egIdWag1TRFOCcopEEE9gCSJT59\r\n        RgrR1EHNw6RJaN63SguYDl0W3vGCYirDLDNcElX0fcTxNqB/5R3w/8n3obt0IYGgPKbfJ/hkHHxzwcdo\r\n        9Z191gp/UrrkPTQrgfTXgbsDHH7/6xC//RKOfuF3IF98DCsmsEsKIG+OA+3yJrqNggYFbZp6eZoUr/wD\r\n        hMf+a+gVU99PfQJ4+E8CG8Df8sfgb/pFAOefUbp08N0g+ZeA+CT8kpAACUOJECMNEtAj0OACehkwsGJX\r\n        rH8n6ENEf6GXAbj3JaoAqLmwgqFNOG1/CeN2MPPcerZrIjrC+ZLHRDc0CmKfwE6gtTZCb7O0kJzmPLZ9\r\n        sXwYxGY4QzXllRHgNkwVbBhEYTKtG6VaZpLiUCJIEOz6iKPjAPn3vgOb97w9CXw0Qn49wXe5PPbaFbiP\r\n        qWKw1n/2zKKArAy4AzjA3XIe5/7SN+P4w1/A9p/dh9UtDE8KYgeNWQn0uYnWAG++Fc+E5Kn/A/0DPwI5\r\n        olyVCwrkKtAf/TqGBy+iu+274C/9Mp6uKNHBdwBDgf8e6B2o9+NehchBAvUk1KtIr8S9U/Tq0XeRelmh\r\n        j70MuBX9c3H+FTrZwVFr9HGNewLqQpnF8DQNay/2osAFK23lI5YtwI2issrDKqd9hWghfLH814gy55mu\r\n        H0YXXioAteWYVlKyOoJtH3G0OYD/8R/A6q7bEtRXgDLcJ90j+IRlq26t/hIicM2zSRoE8h2UAuA9iDso\r\n        BxB5qOsARBy8626E153F9mfvhVzZoSOAD4yO3OVmOf/OtiIXSY8/jP4r34H4RKkava506UDov/ivER7Y\r\n        YPWKvwa+8Peumw9t7kx7HqJLwr9LfgAM6RTUGGgQod5H7JRox5F26rQXoR1H6iNRf2GrPV28t39aBbsO\r\n        LawAuYGUZj5GsrB18gDY+3lq+1ef75X4JhzP82+zFl3ewouFsO11myawXI59/C3dW8XTln2Jn5pvU44M\r\n        VmIUbLcBRzdfxPpv/ghWL78VLgpc1PQrAieaf9Mfi4ChSWi9jtC+fNHXSfqIp7fPdPzar194ZtPwANiB\r\n        XAewz38d4DoQpyEBeAV350Uc/vhbEW87xPAkIMcMEp/G09GBth7Y7a9qAND+0xg+v8b2o++FPLgCbTvQ\r\n        0OU0fBLOaP6CSxa870C7DrTtoI+vsPv4T2H3iUPIY//w2hkCyQF47EHHOY/gQOqKE3DAgJ0M3Icd9Spx\r\n        p0q7TtDLarcbBu5x+83XKdXTp5NbCQiMcHkCaWl8VhazTJbW5vHukuW1MHvmHCNza/Jslw0v7S9QSmjA\r\n        0ZT3am50ltUsftlEY4V/SVAn8RbSX5rXXxpiXAvVOK5z+9tdwPHNF3HwYz8Et+5AIvkMkLnlr1N6nPmw\r\n        Vp8wd/LNEMH1oL+9RxJ8l6A/UQd1aU8MKAIsIInA+gCHf+EtOPrpTwIPHSUkcOihA4AVAUdfW6hkQHcf\r\n        R/jMuyBf7aB6mHgXTcuIh+RQ3FvfZbNSOc2HCRgY+iCj//L/CL74d+Bf99+Ab/9b87jhEWDbgfqsUMpU\r\n        4M5DiaE9D7FHj0F2m4F3QrQj4Z10sotB+5tuenRH9PHnbWnjCR4IgoXx7x5YPBFmK7wLSddnbcOVePsk\r\n        o/AAzKRpFg9NuH28F2U2jrfnimkf/+XaKL598RaHPrZMNo2Upgiw3UYc33wRh//lD06FHzoqgezVr8Up\r\n        gjq7TnBfHngU+PxDwONPAQ88hrFOTdnvvgm49RB40+3gV900HQ5MlAGDnIfyCuCYhgIkaY1/PoKMBMAa\r\n        OPzRt+DoZz4FfO0IHSgNB3qC/N77wW/Mi4cAyOMfRPzsD0K+tIHSWWCVjh1KH91VYJC0gIg0TS0CQAHb\r\n        q/wbigJAWsBTDiEZklaTr64wPPBToPP/M9wf+c/g7vwbACdnYfyt/wK0zeP/IU8D9r4OAcJAQwzYdQN2\r\n        oryNA7abyLtA2J3buh3O3f+8QP9CJ+cDmEyZAVOPFo19OI8JEdVY/gKD1VwD42IXm64JC4xpWKpWV8f7\r\n        ErcIr+OFIUhBCkbAF8uKMY2lfQblfUnL6qUlua/hF5ROQVX1vlF87BBFsd0FbG++gDN/5QfhNqvG8qOO\r\n        9esQo1r59log934J+Nh9oC98FbwdTNtaNFf4IeBzX6v86UEHfeNtwLu/EfzOly9MD3oQxawEpCIpirn4\r\n        EelorRXh8D+8B8f/9FMIX7uKjjxoTZD7z2H42TcCtxwDT6wgWwL8BaATEASInKYOWYGVpOW5Bd0MGPkH\r\n        gCPTTuVvyKtQJS1SQt7eCzD0q2vEr/wcov486EIP7DrgkcME+3sHQlcdgqQ++WMCDXqs/dDzTq/Kbt3T\r\n        LnbDtt/ttrj1zi3R4nfsnjWd3BDACmJ7P1ECY8cFdDzIYhHO53QmOwPzr+b3FvLbDjrhL+dLQD1fX41Q\r\n        XatcS6gC5hETkqkUozzQhDe8VQua382GEPaZUZx2azWolkM0L/A5OMDZv/xn4DYdKEoqqhF+ZDbrfgsL\r\n        +wnQfgv99d8Fffh3wdt+LLutgwkqsop4bB86HkAf/wrwsQegZzz0B14Het9rQRe6Oi0I1wEUAVmlZb9Z\r\n        +KgsrBSqSuDgh9+C4//tt8BP9nDnkdYBPHYIfXwD+AjqYoLrIfsp2IE0JhQSJH19eHJOpWm78lu/QYDx\r\n        YI8hK/ghKYH0AV8Gdi4phSc2qQ36LPyUrX7v876A5AOQLfVhSzu96rbdGdkO0m8xrLY337zbPddFP0t0\r\n        stuBgbGD7RsQMxmrRmmTR5RsDXInIxOGTNiSBrAsnDXfRviKIDk3va8owxRktiWX5mktCXIphw1TeLQK\r\n        p5bBKKvKchO+tfiUIVRewqxQxKjYEuPwz38vus0alBVRgf2p3NbyYyL4YEB+/XeAD34KvAuZp7zCcVKX\r\n        bbs0CtHWYWH3aAD9X/dC/vlnoT/6RvCffV1WAgyKK2ikbP1pPF9F8lmBsSgBxvp9b0b/Tz8N3gagU5By\r\n        FnxKW4adgDgmgfeajYsAQUBe04pCb/qSZbnUe0Dqf57zNmVOh5QMeYNZz2mM3zOI3Hiace9H4Y8OFH1S\r\n        CuJAYAw7HoZj2vIV3e0O/S48qLtX3HOwI/rt583xZ+lkFMAiVJ8FmspQeQZKHV5MZ7Owd9JaVgnsw9N7\r\n        BI3daEVtUnZdger83lrhybXJvm7DhSmH4Xu2B8AqFcuyTsNbpVDInD8oothuA9x7vg3rOy7VKb4ZzLeC\r\n        X68B+eojwP/9EdDXHgdZvibt0ZbDVt6e8tR3KQ0+CtB//EnI++8HfuKPgl91EZAOpJTm+oXyzj8ClLMS\r\n        SMtpSRnu0i3gd7wSw4c+j9V5jIeNMCfBH3RUBKJp1qIXwCm0z9unywKtfU7AUt89g8rpxI6Tf2CXkACx\r\n        y6cc5Sk/4jT2jz7x2ucVgOJAQxoCDDs3yBXZ9Su3HR6J23MHmy3wke2cieeHTnYWYPLMdAwtYdQ8z/eh\r\n        WM3WypvrCu2XOlrbURukUEji2KjUhGnn9WdOtjZLizryddRmIVAjPLNE9gRr1zG0YfKQSZnzLr7bcdO/\r\n        cw+qgrWCXv+mgg8WxI/fB/rlj4N3w1Qoot3glMtW26/haVKsfe1XghDoC09CfvxXEf/yN8G995VJCRTB\r\n        FyQkUJ1x5Topgc3bX4WnPnMZ8atPwp9NS4YVMcFyFhA4Ofx8Hv9rOn+TfJ4aLl8snvhTTJ2XE4gDUpqS\r\n        rD4NSdEglGcOdvtv3f0X83RicQJKngY85n77JO8wyLa7enD80Aeubl/xZ/ebyedKJzcEsBayPrSXC9Zk\r\n        clBGE74aEMIcltvbYi2NdZrs7LNpaxagjDqsRbdLfdvzBybNZRUYUHc2ZnQ+FR5TJ2rjmuuZYsnvJnxY\r\n        hZMuYx/Qw+Hcn/vONLa3wwkr+Gzv07Re/MBvgz/4OyAuiIeyMzPOy0p76nFRGVu+m3rKQfk4QP/+xxC/\r\n        cgT3I38k+wFotP6Rk/VXBokDlKHqAO1x8H33YPvT/xZ8FOGkCHf67gaCJAQwCOAjQAwtaIBN+7QKoOy4\r\n        HHI7B05Dj4KCQkIiyIqAYob/Q5ofpSFvBUYa91NZa9B7AIzdkevpYdlitdk+8Stx99QXb3lenX4tvQjO\r\n        BMzUInQ7ZrdWf3GRD819BTUNTPvjBB3oGDfqNHwJWxSFYMyDDPP1vlE2bSEV45h/qazl2tF4NJp93uiz\r\n        GZ8gjPsgpkwIFP0gcN/+ZvhL5zAV/iVFkB2tDog/9+vgT34xV1dOM5/RN1WIpb5yeQrv1rk7W3Vp68vG\r\n        VVhfN5GC/8/fRXzwKtx/9W1JCSilLcGaBVCKInAg6aFwcGcd3D2vQPzoF8GeQUGBKCCX+NcYU5t0DJAm\r\n        7/+gafqv8FD51dFold2jodSHmQoUSlC/WPwhK6qQTwDKm3+oH5UCYgcaHNQR+qvc43G/feJe3oaj1Qsq\r\n        /MCJTgPuubfPBQmK742UycL0pZV7s7zyA3bjGJnUeOaxIOgKxIjJmXtLgr5EC6vwZlHyvHc9cKTEIRNp\r\n        X50xT082as4diFHRs8P577zHrL68tuCDgPgvf3sU/lk5ppa6/hKmdWTjtPVlAELKl8f24BxPABClZD/0\r\n        JcRLZ+D+/bcAMSuBmASsIADVvioBqMf6ba/D0YcfhNeYlwpHYCcARZCj5PCEIJ1hmMvfZyVgP3VeFqTZ\r\n        7drlBGNHoHKQacwVKEUZZUXRp3sMPO4AFE6+ASEgOqgwhuiHq5+knfT8gsF+Syc8BGiu7fvYLJm1naVQ\r\n        2bFXBfU6dVb9CiWoweFE9Uy5dOItTfMvJNkslNODlyy0/bVj5NaKW6tvvxug9uV1iIDJ15GJ0gxDPpMv\r\n        be8VbP7Mt4PPrcfyLwl+hf+K+JufB33w06CyiWipPdqylGPIJ0jlOm1YeLDDs1IO2x4EEAj0C/ci3nIW\r\n        7jtflX0CyZuu6gD0SQlID8ADOoC9Q/ddb0H4wKfSqXtMAEfAUxL67Pwjp6keyhqEyFPFFTMCLdY/ZsRS\r\n        zvYvR5gzZcF345BA0zXtspJQnxRB9g+gT7MFugG2D7v+6Tf+c6cbrwA0V6Id/06svmaobKi1gqpp+oVM\r\n        IvUQSp3GaTtjqwRCyGnlBmWXOoL9AEhLooDGjCAa3kqGscDkhv9WINovBQly3u3Y05QHhMmhHlEBinm6\r\n        Lwd0CdbGIWDwHme/6RuN9cco9I3gg4D4lceAX/wYuHwCLDboZandPE8flA1P7RDA1v2kbDT6FZybohvS\r\n        OgxkYsSf/QTiXTfBveLmNH4Wcwy49iD1QB4GQD2617wCx7/0GYgEuJVPimWISejzmYJpOlDzl4mQhgJF\r\n        KZV2rNVgFIDj5JDUggA4tyGnrcwx+wFCrp+hbATK8L93aepQHbDd1+FeODoZBFAgap1nzxRNZRdqhYcZ\r\n        4+EWRfh1tMyTODCKpjU/pjPG3PhltR9x6tASsfeEYkJ6r9nq2XJIWaa2UJCCLApst8Hqtx+bss8W1zRK\r\n        rlyXM/kdA0pQJkQw+O2vBZ9dA2iEvsRr/AD68x+BG8KIXtrzBsg8K8MvgoHHpt5KWGBUWpOywZQrU4yp\r\n        nko7EwGdS30jKngbEP/xbwA/+SfGdflxA9IhedN1SFZYAyAD2HegN7wK8ukvwAlAPkI5t3UeMlHUfNy4\r\n        GF7LYgM38i2ljDnfIV/HzG/xAwQGtlmwuYz/szKoS4c9CHlPwI0z+hM6oSFA7ggxoH50U/NYf+L40um1\r\n        tbjV+mVrab3Mti4LNC0CMln9R2NCCiBYK5o7N2uaEiqJlXhWIIKMSiDKlJdaBiPYPg+yK49iFE2JY4Si\r\n        zPOXLb153/sUGdgyJl+FgjCEiIPvejPqRp1S7CL4k3sgfPBe8IOPo644bUDL5L5a6vJQGvS2UIZSrwqz\r\n        qtO8K8pOkMrhLNJzCa7HCP7KEwi/+Bn473kDyoeyIB0gPi2rlQBoANSDELF5+1uw/f++BH8eIHUgzbsV\r\n        SaFdtvyCXE8C7HRcF1EdgLmeFXkaMPeVqEBIpxfXD34w5Q9/ZIuvPvXfIQ8HAo1rBE5I+IEXxV6AAhNN\r\n        z7Jz/8Vase29o+ZehOml0QgAe2NtNFmXWSRjYYPkzSnW+lDq2PWz0zaJzLvkdGcOQtOxGRiP78a0HJNI\r\n        ZOpA85p4N8ZhTsqq3FtBqwIkieXbboK7/ey8XmwZ8nSXHvfA+z+ZtvpaxFSbhqocjkelZWW4F4WZ8hMS\r\n        LC7xHI3tMVnJSKNiiZqFkkdFzw4sAvnnn4a+81WgzRp1PC4EyDoPAwJUPKAB7kIHvflm6BNXQGuFlt1+\r\n        Hml2YDDrATRdtx9ItiUq4/q6I1CLEikoIH/2C3lYEAh1NqCsDCTkYYcxDjeYTtAJaDpWmb6ym0hKZ3XF\r\n        WhZLIqhn/9ulptPBfrbebJRrTt/70UrWVw2kViRFUBaFaEkPuZMb61vTN0qk3BcrzZg6+orgB9PwdT9E\r\n        gxrKTIU9EQjIH8jAOEtS3hEqFJchwn/Lq7KTcMraBAXk5+GDvws/hKYiYBBNKQeNz4vg1/qw1nzkJQ3d\r\n        TF0VlONMezTVN8JuTeX0NQHAObgQEf7fz6D7gXsw+cKwIPsGfFrnHyNUAtzr3wD51U8AZZJih7QYqDgA\r\n        iwOAU70kHaTT6iBOCrDnsc5jUgQUKfkO7LcKI6XNPmV2IND4ZeOizAnzA2JuEJ3QUmD7azp2u87eOoMU\r\n        xqNO03Ss4BNGa2mFtP5qakDxeaze8kXjsxBzg9MomOSy1TL8L3rFkDp4GctOxrg6OizLHH4VnBIPKS/W\r\n        qYKy8/wMgEo5jPLEeJb/+m2vnEP/FgUUtj/0ewnGTijzVjz89n3YU3/2vlh9W/9l/FyVPCWILMGMsW2d\r\n        GnRmZhrIMfCrnwX+1D2j8Kfva6XfiKwIOpBErF//eux++VPQzuVtEpoWA4UAgJP1Lla5dAO7bDujNyp5\r\n        lECS3ykyAtD8tWOXhwVkoH4pR1buBNRDW08ABZz8eclV0+v0mR0mlzn4fUqyhJs4CIHpODkLcAlcYHUs\r\n        K/P2JK6SGrA6u7IwLMZp7kvjkk2rjddcl1WHk3JY/ssDoxSyxz91wPRcVKEXD+FuOzsX+srbeD184n5w\r\n        P8wdkxW+W8FWs5FpVmE5TVsOnfJPNmxBE5oVhVkpOamf/FsUZxYY7iOGj/0Bum+62wg/xl8tSMnDnb8F\r\n        engB2u/yzKlA4wDA5w1QOioA6HiCmiMkBZFZsY7AqnQ4je2FktEQTdZeGv4n5QhZCZyA5Gc64UNBm2cW\r\n        RgYdoasaQV78JaNNsQzLixDVoUZ+xbnBNE5h2IRHHRcBQTHxcLcyYHkDzOo/mvos2jIg88KuCWMFzzLV\r\n        VGJd0JTKoarAN9xsHFmY/hImAikf+Tz8ZGOT5a2UOUcsjr62LOW6Hqfe1oepd5h2sGUr7WFnUmx9AuOQ\r\n        gBmsivCR+4B77jZCnwVT2DzLf7feBP2DBzIyIBC6cRzutI7HtR524sal08ojP1lfpGFmRjTFB1HbEwDi\r\n        /v6iSP2q7KbcZ+BeQDq5IcBSX66WysJAK8DmXelQ5UuxliZp207W3FfLCgAuC08JuEBLZwPuU2b2unjt\r\n        lwSx8OiQOgfjTYoAACAASURBVFsVGFvuJWorMT9yaR2DDAK666bp3H/Jc8H7T/c9NFq88m5J8NoDVSbK\r\n        guaLmkr50MRpeSdzQUgKpC4CWkBWAKARBAL9/kOj4BUv/UTwyzMC3XYL5ItfHldOogguEmzPz9IqwcxL\r\n        ++1dLfHmxZjUSRk2iEF+S+H3fQz2BhBfP8gLlKvpfCOR6SxF0Gm5I5W54SXhn3V4k++1yLmc5jU659Ol\r\n        VpgWAwB1xVtr+W1dLJZpIfFy6RjqPPwb7hjrmnX8I2A8kw+If/Ao6HiY52Prq7ybPLP8UfpUVxnLzsrf\r\n        VgJN02jLAEpDG++mfWBSH+k57QbE+x8bBT4iWesFheBedcdcvU94ze2R11LUz5XXGQYaLf5S/SzdOwY6\r\n        P+1XNr98fQIA4IQUQGkoS+0Otr3nAyI1UOeaCqdp52mpwltaVj7FgpX0feOAXLKc9XqPoBrUPPsDkle7\r\n        c8tWGjAQmJrnNtyCRQagJOBzq71CPx7tpQi/99A4QbFkmWeyS2PeoFwOP63bGRU+s2KrB7nossIoCIiR\r\n        6sguOKp1kG6IgfC5r47CvviX3tFmk7YNt/pTMbbHjI+Gx/J8MrSheXtPDJqO5bAZGwfvYrW9wHQyCmCm\r\n        0bPwt40ywaQYX9rNLmTi29acCHp+3pa2zM3X/IzSKXPahLmmr9arfQ5MWrLlfxJXG2dXIzzF8UYYfSEw\r\n        z2wZavhJ4eC/8ea54Jf0zJ5/feyptEZ+SanNC4hJTydk62qGay1fk9823FIepSJyOMV0oZQNAgI5hj52\r\n        xVh6ngq/ccO4l9+Git1t3oyxPWaoZE9dtGWahTOWrmyjtj4ou97hRMT/pGcBSuHbgyurl3zfmEnzqj1K\r\n        sN2Gr2nrqPnLc7u6rtXYdVwn46KemZfO8G2/EjRbuYep5i9ltPflsu5F4GkdWJ5n04BFYdq6a3mIZvrP\r\n        1ovJohiu+x8rttSUdSl9E3fCX14BWGZhJtuqbXlNXVl+bJIlr0ISmw1VpgCa/hEAfcAMAcq7gghyeLVK\r\n        trYhMJmVse1h+WtXZk7qptSbUViT06Q0lcEeAWfbpNbTjaeTWwo8ucfYGFZjVmqte74sH9lwZSqlEVg7\r\n        rMDCdelM5XFs1vBbxdBOwZW4ZN/bd5ZvHXlpOzjIbObxzfsm3ZI9Gh6tMtNcjrpE2oYz1/W5Tn0yrcJr\r\n        h2Yt2Xqp7eExLs9urOCkDA1zFVZn4aobqmw9FNK5bm49/u1fXRe2kA4wCrRtjxJ5CY1OlKERfDTPQ1xQ\r\n        FrNEToROZghQyQjWxDFIY+ct98DYCch0iGJFyxRbu4x4yTfQCoUKEAbU/eC2gy54zKeOyda62vwwjVt5\r\n        p6mCKx0/hGTxLPy3ZZ1AFsN/6cQSp4tzWmcr2WeKcvQ2M4Pszspp5czrcOKALH9GIEPAfLbAdvwWDTV1\r\n        rJIXW5XnVpE2/LXKpMB/ixIUUEpfN9C23m0ZuIkXhvnMT1GYtUymqmpfzumpAnEw/Nh+U+pScVLWHziR\r\n        7cDApGfYL/HYDlHvTXh7GINN0ApY2/HsEuPa1xQza1SszoS/lh8rhJjzXflqrIAtS1t+W67KkM6KPvJo\r\n        whVrad/bJcOt0dozFalfurxnLUpbLlv/bR3RiJ4mSrHEsfzrlG/7sdWiAEqcNv9Jvyh82Lo1bLVy1dZH\r\n        256T9iv9oyi8zKc29Wr7kTb3EwXX1F0px8nJPoCTUADGYEwf2lvb0O07YALTOU8VVahmA1tBp+l9eQ9K\r\n        QwhG2p04cTYtSQU1/Fvl0ljotgO05bYC7aiZCmzKPhHctl7yfVlEU5Yqt3sA2nTK9VEPbFzzsolYZ1Fa\r\n        JdkkzjQOZdpqqMGbOG1ZSz3EiHom46y/jA8UGH2QreBnP4D1C05pD5O2HJXPWWSbESpSKkm5vIw8NNvK\r\n        Z3mX/G88vTgWAlmZs0dr13eNABUhdmxOoCFMPKxtJrM8m3wISOvqZbpHoLXYrQUpHXpBV82EpAhQtZaE\r\n        +uUju0uwFZJ29eKsMzb8scsHXTY8zeTbKIhWMVYHGZrfxuLZtCft0fC9hARqUy0pOgWo7J1fWigz1oFq\r\n        Xvlo2F9GALlC7JCyRR912zlPy1jLk28m/C8o6xpP0/RflHH2agEY7N16+ALTi2Mp8F4tawTMhmWabhSq\r\n        v0u9fU/GS5i3dGLOVnRybPc1ylAb8jqNaMMQzcuxN94eBbSodDJNdt814ZbWM0zSo4W6XUqn5HWd9pjE\r\n        WXq2VABabo8FUiXQHTePZn7ysoAAGmWylrvpbzOrv4f3az2fvDfPl8px3Tp44elknYDF8tiOuKQcZpaM\r\n        ps/3riZbSHdpTrfNvyiZfWlei7d9+S/FWXIYXi9tm+a+fGnpT1Edf4TG85+pWaNy7TIZQS7rKZYiXa98\r\n        +8oxaxOaK/h8K6qgm87OmW19FwDCg18zi56a1xPn7nX+lsox471Rdta5O2ftROiEPw2mI6xqrejMM0oY\r\n        d7yVdZ0L87Uwac2OAIdxVJVwxoFElNdty4JVL9BVp/y3eU/KaPjGGHySF3ThZJ02Lcu/zbfUYVPuer2A\r\n        YGYK0fzN3pv0J+Pq/K/kL5I2b83QTMNnFUyTWPNqVgflwJRo6t0ci5a6g6J79R3Tci50HwDAbkhnHU7q\r\n        NL8v5xJ4ox1tH1lKr9zQQju0U7gxYDx+Xud1fgJ0gghAp5ajdsJspWbWoxmvigJDNNNFNMZpOzfsb6Pl\r\n        a5wskKGkV/Jren6NvwxHJzy24SYW1nS+IS7ssGs1WnmuJi1TT2TiRE1Tce00IC/9NkqsCj5N49o8yvDF\r\n        8lXaY/GUJquITB3OykpTfqKODjTbVhivRYDgPfydt7SZLtMXHwDNpu8KD7ndJ+2h0zwnVt1qWzTtW8pY\r\n        FGQw5VCTVEnvZLTACSCAxoLus/x2LXjdDmw7Xa7gcpBmZ/ZV12BWJWOs/JYf1XRIQ1l0Ynm0MNIBk+Wc\r\n        1TosWQqbZy5HzGEmi55y/ChpIUvZ3ViRkeFn4oAzHbNaMBnTsQKGpWtrgVqB0GWkQfncgaUxbKGYO3w5\r\n        Qcm2byMvk7RtXULSEV32pLSajlWohKgCvPJlUx6upZu/9ijYZwVW2mMGQ3IZNTQos1h5GoPPUJfpC6qp\r\n        HLYvTHjLCo8J9WMwN5hO9kiwcg2g6RWjRxmat2qahSETi5Lvh5AgqOemM+3LI7+IMk6bzRSEUQSexwUe\r\n        Ec021ZYfU04u5UBSIEPADFLWe0mHSDgd49iVdlwEE6NwlXyijGfXt2P5tvzt80WI29SDMxtZRMavNU06\r\n        dUE1Oh6U6swU7cx6NsocyKsYFbM6Lda0ZNM5KBQBgu5bXtvwPi9OIX70cdDKo9ZnCCMfEzSUhT3E1G4u\r\n        t/0SIpzkm5/Z9tjLm+adoDxP6wbRyR4Jdq0AdnNJOYSydo49VJbyekKVkInlzNYb+TdETPZiLyXteFQq\r\n        pfV0X+B5MaYNq8Cqy7B23x5wzVYU6TDSulzZWEkFJuvYg0zTq3K1oJiWUMHTMjwCIE+NOUre8mCg8hIV\r\n        X4ozW4RnFrMkn/0I19obX9LK7REDMLDDhbe+cr5nfyn641fAV64AB10uB3I55DrlyB8VtadCzerMQIJB\r\n        rl0OIBmTejr0yQg/cKKbgaz5KvemEiTm77Sb/eBlwU4V3KbStMTj3LgLDsJqLQUTZ1RLlBuonONPyMc8\r\n        7cl7ERMiCXMM5pwBzQd6cqOA2rJI+q5cWUyyNAVVFKIdutih1ZKHZ9+woJZhz8uogISxToDRepW17kv1\r\n        UfcH5Dax6f7/7b1pzGzJeR72VJ1zuvtb7p17Z4YccrgPN5HiIpKiNmuhZEUURVkSLDuA4yjIgkROYieG\r\n        BARJ7MRB4NgKIP2IgSAQkB+GHciyYyeGLEGUCNHkSKIoiUNS3GeGw+FwOJtmudu3dPc5pyo/qt6qp95T\r\n        /d0Rpfv1MOqa+W53n1Pbu7+1vZXmLJgeCn/cnaZNgTyc91gvezR/4c2bvS/VHXf/w5gZBC+sbRUchuAg\r\n        Rc8Kyvt8AG3SppnCIUbDqHw65oSLfTqLH29R2qICEM1Hv1mGeCwo5/Pl8VxZn4JnosDKLrKWZ9hlbLnB\r\n        Mgr+JRCFPDcmEGiUgymmOpooxoDpWfwxDNlyioMya0M/B7YWzIAaDnnuyMWMDQmM0oebWf/02+c/9pDY\r\n        KqWRTnSZk2uPwMjzJuKVw1oZqh9RuEwOLCptDaMKi20Il7HNhuIzROdwXA1YO+DiD7ylApun9sNvA8B8\r\n        7oEwAegRlYB4EyYosllcpx/kPAZKnvQ+R/YR6528MB66GKSAIcyblvgKCDTqZQj658kDEIRyDDyOtFsw\r\n        g8+BO9n6NA1CJIgRk5lsSd5HQsdx6KDG+oYKSX+S1Yey+oqptCW1EZU60nAxvt1gRY2NY9ENSQRPcFXA\r\n        oZIorLa7iWX0ZX4R9rbN9CgUGZWd0CPizVe8Ad47L8tsDdGD6514JyZEGZJJOB/qcOsBq5Me3fvfBXsw\r\n        LycLK/AaB4zXrqN59kq4Ilwqq/GV0ENvPGID4SJfiTIbGQ4yAAl/pmxDcCjewpbcf2CbHkBjSvdeXLBJ\r\n        AEXSsoL0LmrR1tTHokwsYENEYYX0luoVYtbq1XVbBYdTcOhDdkkpiRU1gQqNmhuoedRiKbRAspUS72Uc\r\n        psJeAz1ZJ00Pm0/1yXCiBoe0JyfprKKHUQgTODZ4+imlcGBUfBjheof1akB/50Vc/qG3xpl8KeSQ4yqU\r\n        yX38c+gaesHnTRgOYPMchyhLMQaF5waVDyU9FByTm6i3lLajACSWX7EEZEJYqbQWH5O2Ds6F65vZBZNQ\r\n        S2J9vCrDiOZnQN7Gaqkh5/PBoAkzmexxyKoDgGLTkYajVoe48F2TmbZrEC6TICuq3dDk3mqhjgIsTG4w\r\n        zUPNF9/bJob0ig+8j0OULrvEk8AnMR/TQ9oWevS0crNJYWmcwuS+JJqHoZAfPfp+xNI0OPwPv7fET+00\r\n        c/zz6xXMgw+HqEfaOgs8acKSQrR1LdC4AAcvu5pYgRZeQ1+EnhKz0vvgqYxDnbZbSls4DchLQ/KMvsgd\r\n        8cmKTiQgj+EaG1xWII+pazPTiXBUhzHZC+GMA4/1dSVxjMfWMr2meoEKHLXky+VLKddE61IsT5rMeNo3\r\n        b21WiDzm3sRYWgE0dvoMBt47eGNhOgMzjnF/AUkQexjDEIYAbZtxNO8yPgUGaEESmFBaYUmRnsHhGHF6\r\n        OmD+178b3avvoJl/kiISfHk3PvQoGoxxBWagNXfiLQOEuBCO+uGDAM+ZHpu8KcJ9wVfxmQRpKYDXBub8\r\n        NcF2zwIIAooz7chWVJgJwGT9FQgWdM3BQJA1Lu8uS8zh6acae3mEuoprwU2uS8p2TVA0vKF8sk9d3P8I\r\n        R9qkFP/0BJ1zwLoSjUj3IzErwQMTYY7PXMTJSLCe9Tdpz8dqHNarEavTHsPg4AUOKFi5j6MD1j2NyX2G\r\n        m+qe0ia+l4tiDQIuIm09gL4Pwt/88Nuw/72vnxSfyk6A369WwO/dByshvmddWIUpdoQqMy445NuJinZM\r\n        hivhgPFNmaWuiTFTSRuUc0pbDAmmkMH7xQWhrQ1jsV62g2oEirUbEC5r9DSpogWcNLQIoRzRtIY2bZhY\r\n        B3kb8nymLhotkp/SVybAxBvoxywcCReSOa5QNDbAIfBqC5EmI4n5hnjLskW8b1D+NuCfqivwY6QJh/XK\r\n        4dQb2LfeifV9T2HPA93cwsyb6NoTPjVdZMXDAcV6uEE5VBLcpuXAODYmOJwD+t7h9GQAvvUeXPgr76xb\r\n        fqnf0DyAAYZPfhHt2KOYG7BNmPHvx1yPCDZb+PUItI6CnsY82tsrAczDu3T5KVeraWrjRCe2kra8D0AJ\r\n        JYg5kiDG5RkZU7sapgxNLJlMrGKbrmqavzv9wJTdEhc7dVmEXTFfWvoROJhRDDC3wZVMM/4kBPJ7oL54\r\n        Kp+ycJnIjNLe4FXeDdYmCS7VaaRJj/XK4eR4jYN/8B7M33UXrv6D38PRhx/Fvm/RzVrYLty1l2bRa/0S\r\n        RcTKmoWAv/M77wBv8vTCesDp8YjuR9+KC3/lXeU2Z/3Hy24GcNeOYD/7AEy6O8JnRQfQMqzexyBC7uOy\r\n        nyFW1TglgyX1Awi7OrkuRnjkn7SvgfOcb9qSB1DRnAmvbBmQGUPGqTIhwwpD6hAisIPA2URIi09Qfhbc\r\n        aGUlbn+t/9o6Fwxgpv3wyCsXa7V0JPkATFxSbsvH957yGcorSrBgzJukWJePAnd81GPxX70b83feBQC4\r\n        9He+A8ff8mLc+IU/wN6Bx3xh0bZNuJyT3VvuY1G34MOXzwowBQcGznmMo8dqOWBpLPb+4+/EwXveQPQk\r\n        70j+Kq61++BH0RSrIdIHU/KVNXl/SEF/gssDBYwagcnr9BWUEy08wpBN32vx5yogSC0xspN1VW6stcGK\r\n        ypi5iOiCvH6ffqPUD0yIQoiVpTaelul0fcqqpf4bTLlDwSQNGoTNTKMnN1Tl0QpQvst5AKNfsMDXFNQZ\r\n        yQSw1usxCf/+j9xT4ObgR+/B7A2Xce0ffgz94zewWARvoJm1MI7hUH1L+pBoxc/IY/HeYRyAdT9itRww\r\n        vOQSLv2X3xMm/OhMTZkUjg0A4zDcdz/sk09n65/QRAo6wR/5anTlsKDAkcJr8VrVudHzMsGbbXiCkMuc\r\n        f3oBRAQiqxUVcNLytRtxZKaWBbqwimRNz2IY7kvNlZfLIrkN7qe07yvV8hBhwiyxDufLI6cFc2qgteCo\r\n        tgslQM+fpwLw8FivRhzfWGPxX78b+++7B5qnAaB742Xc+Y/fh+v/56dx4/95ELPlCrN5g9Z4NDCw1sS5\r\n        UaKBVnzF8+jqj8DoRgx9mHhctw32/tq7cPnH3hLyJre/YvmLPx9OCD55BfYPPwfLYb0mNIDiF19OAE9C\r\n        n9VooGEUnlV05xOgTvgKJa2et7b+s00vDA+gwmwFw0hyrrSYRXmVfyM+Ky/0I4PAEKuBrqXakL+q6Dcw\r\n        i3yypdF918ZDD5dq11rpHywURdlaX4H1asQ4+iD8P3JPzlxrxwAX/9O34fCvvQlH/+zzuPHLX0S7GtF1\r\n        DbqZRdMYGGviBkEz7b5HjOEXAnm40aPvHfr1iGHWYu/H34I7f/zNsPuLzYJ7hjLwyzXwK78DOwwb8FRB\r\n        2Vjhq+fFS/rdJh6k5475qsLj55y2pwAKDRn/KY4Ixwwe4XlaCYhlbuoxGfIiqF49/tQWujjnj7zHe2aV\r\n        xtbtMCyqjyY4Lt47uOUAP3p452nPkp/0y0Rraq2BNcG6pvprXoXqUlUBbEjr9YjDn/k27L3vDOFXjG0v\r\n        tLj402/Dxb/xNpx+6FGc/JuHcPrJp9Ec92ia0F9rRQFkHHkfDvKMo8c4OLhFh/atd2H/B1+Hve96FfLV\r\n        3uzak7AnD5H/wnu/XMP98odhj06ngjgZMUWiyPJrja+0Uj6Ld5iHJzygecTk4CmytLqltN2QYMUY3ufn\r\n        PKOaDsv4KVFjsaqlm2xYMeo7MlF0u5wHPjDKysd5ATvNz9lJcXkAPrq342rEuBowDA7j4DGODi4qgZow\r\n        28agsRbtzKDrLJrWorEGTWtgkkWpcGXBwPRjMsTI6cJ/8U4s3ncPNuL4JmnvL74Cez/wCgDA8g+ewvrj\r\n        T8HdWGP14NXYNvXNAO1rb0d31yEuvP0l6F57exZ6n/OcKex85VZUDP50DfdLH4Z99joNQwh+zQNDnP3X\r\n        QG5SBMxnVd6r8Jf0UfMIny5dxY1g3Xa25Gx3FcAjTmqhYtVMZuCzLJ5mUm0ha1tEPTA5qaXVPEd/Yc5k\r\n        y1q1CCFE9TgCY+/Q9wPWyxH9coB95W3o3nYX5q+7Hc3dB5i98fZwg29hyUJVwxNH6B+4gtUnn8TRvY/B\r\n        PH2M2bzFbGaTQjApf80DMVPcbECiv/er8O99NcxBV8frBi+glhbvvguLb31JRplHWLpN3+V5RegTDuV7\r\n        Xdg1jf1yDfd/fQT2mWtn7KWpeBCh9NnWH0AZA4AaLgxZxRLVykh90m5hgM4/bWkIoDRigUj5HfN0Niyd\r\n        FccmaxojW96i8rS+yxZSE4Y5wKv3Lm4caRShqA/SlAPG0aNfj1ivguCbN96Jvb94Dy79hVfCXuimFk2G\r\n        NQbE4B7tSw/R3n2Ivfe8AviZd6N/4Dkc/+pDuPHrD2O2XGO+aNDNGjRNVAQTvPhpVzeR4Ws34P7+R2H/\r\n        h+8qlcCERhvquWmiDtSUZyGAJOiSX39ny79ew/2TD8M+cz0uxFQ66OmLtClbrnsdDERrUl+Wn8Dkyseb\r\n        2p3wrA981cnux02V3Nq0JQXARFLcOREyBKLOmxDog+++Y6bi47q1wAoJ95tcvoqPJ3HiW3LPklXKTOqB\r\n        MJm1clierrE2Dbp3vQKX/723o33JAQk7spUvhL72jPIC6N5wOy797O1w/9nbcfRLX8DRv7wf8+MBi0WD\r\n        tjNpB/QELzptsHLN40dw//1H4P/2u2Ffc9tNBF0p8JulTRY2yUTFuyo8AfU9/rknrgD/7PfQ3DjNpxEn\r\n        Aix00koouoEzm8+P6CvIk8KYaKnK99ozXUbgNBTjYuK6nWva7jKgR6mx2d1LeDGZAJ0JPV7HLbxpoC0C\r\n        OfHvch3a5eKtnYXXYbKF6PSBH2krKybvPIa1x2rZ4/RkwPzH3oI7f+xNsIczEnqQkJNwW64YmDIUtRW7\r\n        Zg9nuPjTb4f762/C1f/po7jxscewd9BhPmtgWwuTLKif8tQmTyA2Y6+s4P/uvXD//jfDptUAKvOn5dGa\r\n        pdeyJbRhPIkQWx+GEwZwv/sAzK9/BkZm0jnsW1GX1B/5SPJym10TvEzhq7SdnBVBVPx8ElJPGAs/Mlwa\r\n        vsbSWQTFg1tI210GLBiKGZaFWTGysWEdNR04UQqkkH/l/pPVnh5oUb8bQwKqy4e8box75o97uFfdgUs/\r\n        9a1hUstAufbIBGehn3gEN/EGKNmDGW7/+fdg9Ykncf2/vRfj6YDFXou2tbF3JivSTQPjirEyjQF+6fNw\r\n        9z0F8zfeDvPi/Wm5M5RINWkrqgUeUAJF5UQxx3f+yjH8P78P5pFnYBpqoMpLzEfIeCj4ST6Jr/TBLjYg\r\n        k7qUhKf6RHFx+z7yVWXC70+rXL/OtN1lQGCDO4/MDExc54KW5jh6XI+e8JP32pWcWByUBPAol/+KveSA\r\n        9wbOOaxOB5wc9Vj85Dtx+CNvVoJPgsvCjMoz/m1N0VahMDyXC0/n73wJ7vhXP4Er/82H4b74LPb2O3Rz\r\n        W+Zjb4dh1IIW8W6Mh3ngWfif+RDcj78e5kfugTnsqODNkkepmBXOCaRqX4DSCwDgT3v433oA5sP3hw0+\r\n        etenlC14R33nPAUufFgOTIFVax1SEsp8w22l4lQu5TOZr+YUz2KLafs7ATcJpU7DmGOs14ZNbCk2tVfl\r\n        3UqZlD8u/3U+hiAL98uNo8PyZMDp4HHpv3s/utdczq6+aP2aBbfIFmaT0DtVTk8SakB8GBbc8X/8EK7+\r\n        zx/F8YcewT66aZxQLqe9ggk+Q/+MNzC/8iX43/wK3HtfHRTBwZ+SZbSlLtxxogUL/gcfgPnwA7DLIeSf\r\n        eYr1uKH+mpWv/Wa+MpsK5O6WfFqx8pvKFMrCAUsfJ7gpCtUW0nZjAsr32m9J3gMrFUZblwHCOI6319Z8\r\n        UmYOGc/ZJl/hjGkRwMebYjx812B0HsuTHqvbDnHHz74X9mBWjvOBqfWXCSotzDbWXwg9K4bYT1kqFQ+H\r\n        IxUTri79j9+Fk3fcheOf/wM0jcHemYp1gyJlZMX6zXLIiuB7Xg7zvlfXhwaM56p1Jjefn+v+ecA/ewz/\r\n        Gw/C/P4jsKd9qRh6ZUV1m2cqfHkXrb4O3y3uvvSnaTDZJixtGIPqIR6DwFcWZVSogv8yX4UVpu24Atsf\r\n        AvDvgglMCJ+03hDwnd2ueQzxLBuH+uEmxI//dDEUlvf5vD5HxeXkHNypw3I9YnXpIi7/7R+Gnc+mQi2W\r\n        wSIrAq9+8wTdRFlUvAGnvIFinFp6A/s/+lrAANf//sdw280ELb0zKp8IgQGvqJijNcyvPAD/rx+Af/VF\r\n        +O9/JfDWO2Ffe6ksX1Msm4Zb5AW4R68CX3wO5mOPAl+7CstBUjxXhGAQTl0QHjlccyZPmUzbcYi0xjRJ\r\n        e9aEuq3dzIs+/VO22bV5w5gsNUqsCl3EOWAlOwLPP235LABxi7b6awrNNR1sIQlw4QpGJAthUpFaHdSW\r\n        Qb6+WVxCldU5j9XpiPXFQ1z+m++Nwh/rZgEWRYCb/DaYPrN/Nt7A/vtfC5Os0wYvSA8NDOcVmtDvVQ61\r\n        ZgyAR27A/OPPAfDw+x38N98B3HMZeOudwH4L+6rbuAFGOAAD95WrwHEPfPZp4KvXYO5/BlZCwIvl3YtB\r\n        O/ikoYZnPYbJuxSsReWRZwLLqt9wuQwhpmtidGSC31Oe1IRXv+Mn81xjgzcwDJGv/JQuHnFu6/zHAeev\r\n        AOQ0X2fJJYzcaKJbxOGii/X9WIfE/5PTXjBRk445PBgM6Qtf/pbUuzzRJ3EKZzEQ5DpeGeUNPOJsvzO4\r\n        /LfeD7s3z4Iqwme1dVe/JViI8WFc+6WngMevAY88ExikwM8IvP5O4JWXYd78IpjD9k/mDXhg9k23K+VH\r\n        X0lZhEkNFQaNvaAhbsVWLjov1ZrlCPOZZ4DPPwf86kMBVjdSmDNSUrG81QpdhG10kbYRTlmiW6mAr9Rd\r\n        OAcs18FipzE1KV0gK5KJy24yHa3NVj/hYox8RQbFR5zz7UwJNhPjII4lHLMY93FFV5FJIcHnFiYCtuMB\r\n        9ENg5Fls3gDpYIbWzmIpgYD01gBdlxnGG6Dvc4jmZAVATB3rYCYXSnofXLDWB9cNPrhtiw5YD/CDw9B7\r\n        nJ72uPi3fgJ2b5Hj7SW3nqyyUUxBisH9/peBzz0G87knYGcqKIQ3AS8Cx4PPAIin5t5+N/COl8J+36tz\r\n        uzVrGAXNPXINq7/3u9j/p+9nJJaMKo8NgmCs1gF+CS/ooxIswm8xUj3Ro0Uxtu/7GNmIvSdosQAAIABJ\r\n        REFULTE1XIuQk/qPICQSpt0YwDQxmtKg6lU4WLvpmNoDWK8zXxUTdmz1rYqMjJIezDuG66q9iwpvNWT8\r\n        AEGxLGZlvcn7qnlLtz5tbyfgCGA55K2QadyukMGbe2Y2XxhqTLAWqz57EslVUy6gEJbHcImHIrEHB7g+\r\n        H/+1AOYtnBmxOuoxe++3o7s7RqIVodZCnsb6ALv548e/DPuhz8JeizvW9lq6b9DHYJoOycwnJgqn6cyn\r\n        Hwc+8wT8Bx6Af/8bYb/nVdQGuf8GcF+5Bvwvvw17WpkHSd7WlBxwCLiU02k9hS0T8y973i0AYzOuEk7H\r\n        oEzTEgQrYhK8LrrXa/EszNTjk/v6xKo3AGwHNGN5MrQ4TOaDoC99HlP3ceWg2GNAHqFBiF6caIjgvazE\r\n        JSfj4z0FZEEwYJ7amCQfwoKNQ5iwlDbm7A2YKZ3OMW3vLIAIbE87r4TBWKN6lFZfiL4e8mmuRFyT6/YI\r\n        TDOnCL5NRPooDJ2bCQ5B1NrRGiQj8LKX4NJ3vy1fQuHdVPDlt7hzFnBPPAf8+idhv/p0aEqWfXiDUbIG\r\n        bA2VB2MtMG9gjtbAL38G7sMPA//Bt8C++lJRzn3lahD+5RCj2tZwr6yu5luhRxrCgFzd+NmytUTFWpLS\r\n        4D0Ico1YumTUB6XD7rUWVFmfF/rLicx1nJPQuz/FlV5LWHSisx7/dJYm30zoR/IyFG7YcWhM5KuYqTGx\r\n        n77MnMrE5eTGZm/JGmAvegO9Wok4x7TlmIBm+puRLto5XfIZLUPfU5jl/JGsIhAYTYf0MibcDNuPmUGY\r\n        J+T76IBxjdFYLE/WOPjJb49jb2FUiTRTUQRxGDB+4iGYD34Sdr2OM8ptaS2dU+GiGQ9AUmRqltsAME8d\r\n        wf2jj2H8iTeh+Z5XBWXz8DXg534bdilLZj7PF9QOmhTegNKEaWJRkBLfydxLAUccI0uftXvN9ODAqpJn\r\n        0QWaJoGldqWPAwC3Lud95m30nLSiq/AExGrTuxmd8fAIY3aesyjgEaNkaJ6B8lkLLCzVEYvrEHKjy3AI\r\n        DmdtiDy8OuNquFuYXhgRgWqpNSGGO5CFc8VjJxIWVrzWAIu2fA+gmDPoyAUbPSaWMjoi/ekK7bvehu6u\r\n        O6P1J4GyqCsCAOPHvgD7bz8RZuJlRllkxiHPCE/gIGZpbJzZNhl+sox2PcD/80/DXVnCfMtdwM99BHYZ\r\n        XRQZSiW4WJAZJ0Y9JsvFnzJGFjikL0MfbnCezCxSEmupBTN3Irr4kR6Onnsq4BCHjCZ4A0AMsHoTK8p1\r\n        AIHusmIgXe838BX3MVl90iyFMvMZjmVU7Lpt6U/yMuNwy9rgDVTbvrVpu8eBNyVjaIYfWdNvvGEnluma\r\n        M9ZTtWWI1ifNDpd1j6NDjwaH734bMCrB1+v9pAjGj30B9iP3BeEXj0SE/3nBgTocZvrDGAPzwQeBDz4I\r\n        w6sSAJDmQ7gMudpForHuJkXBcLgaHH5aZhM92Nvi/Hub6ZFS74GRrKjguIB9QxLXW9qtwlHp61lw6B/P\r\n        G44xr3iwR3XOafsbgWoeFzzd+GMofl7FNQOitezKNfGUhfLxb6lKlmdk30GUm3Hw8Pe8GthfhCrlog4W\r\n        fPV7/KOHYD5yH91B5/O14rLRSA9zGBxrs/eyKQ8iDBw7wSMyqQ3u+MZdjYSfWmLlwN95X4aMd00lnySx\r\n        snq/PpNP/5bvXZvpkYK/qjzOA8s+7/7ka8nFVdeCJ3zVKzgmeShpelR5FVMYmR7Lgfpncj8EDpl4TRfT\r\n        nG/a8lkAg2J8qhGq7/grEOQRZqKjKyUCx4yZylA7NRfUIi/P9CP8EIJUzr//2zBaC+Pjvnjv0/ck+AYx\r\n        Eu2zwL0fhzW0SiHJuTwerxHZkrX0nI+4rsCTp3xAMbxZtEBvgGW8RIUjLom1ZFxqfE2UJEk431hUjNWl\r\n        rLL63Eepo7D8opBYSUe6Cj1ESPlkI8drpKoyapWS41EKEMfihvCqtFiCo1XPccZ3witPgi5mccjH3oDC\r\n        by3Q7TmlLc4BVFxS+a5P9enJKPhg9RebxpbK6vPuq+IMtvIWovUZb6wwvOylaO+4BCfCD60EENzuONHj\r\n        7/1DuoSicEFie4rBxNVoGmARZ8YBFSKNhF/rDUtCn+CP37sm4MYjT15OEuNImXMt+FMEZ5hEYdTGyHw2\r\n        YkJoKq+FLMV/IO9sUIpmEoJrQ79r9CgUmGo/zRGQ1Z/QwJT91Cgq0ObLOSe+vk57LVtI2z8NyLupinf0\r\n        XO/km7f5MkWxxIV7W2M0tkAiNIZ+B6J4GIxtC7zjTRitqQg/YLyBTd+B8bMPwD71VBj3F0KkGCT9jF9k\r\n        ZlxbycK6sLUXRQaCG5gwvoFyv2ucyWXI+nJHpQ0dqKVYqkMYRvEYWdNXt6mVsOp+IVwWcSWIZ9j9FGca\r\n        J3x5SgEXSgFkay0Xv4pynuwvITrAKEXEPEqASH5jaQVqUDAQHs45bTEkmCARmLhNAIottalYRNLo8hIO\r\n        76LSdbBAsCaXd5UTWN57jP0I8+bXY2xK999G4Tfew6dnHv4TfxTDdjNcbDHIEvLzBIfuN6FJW0nZiFLg\r\n        r2a5Td4+zDEFqkrAkMLQ1jNn0coy5U1Xak0CMkwVst4FWLj/upx8cZWdfKrOYuik6uI83KeEr/jcxU1M\r\n        xk7bqSmcCQ8poS68hGj50x4Un0leIf15pS1NPz4fiI2yHkTw0QEnfTlJxOW0a8trwOwGTrSuh1sO6C/c\r\n        Bne4gLM2/hk4azFai9EajOmZQf+5B2BPTqbwFH0nCeKda6MnOJiBlSWehI4ixjOIylJZpyHue/eIcfal\r\n        apOb0E2lCmv95neKa8cROO3jpadmWgXhN60oTBwDU76T932se9TjZKogKcTChSizM94nSjCmxFc8WWvy\r\n        d/md5iGEl5jfJD8/82GZ8qSP81qEzyrezy9tOSioVgTMWLV3Ksm+gIXaw13sOyeG14EbOJ8HsBzgVyOG\r\n        N7wMEOsPAzN6GHgYF4YD1nl4GBjnYR7+ar60o0g1JtNwxe8FHDWYtYVneFQ+78PM8jpeRb4p2Iit9W+T\r\n        G1qji4LFI65A+JIeAErPjAWnIqgMx5IEpsAFsLk/wJR3zuIzDScC/oYxLBPzEIAVU6EgKt1LeHFhJaA4\r\n        48Iw8Of5py3fDEQMUt2VJl8j9gsFH5+NYzwXHpeP2DLyJBprcmEw+b0e044y7xzGu18M2BBg03gf1tu9\r\n        hzEe1ht4E5+vVpg//BWYOaOx0n+BgV1ob8o84wicxBNkslde31nIcNUOkPQxFoIDEtPKRKW2inqFoNbn\r\n        oj0pXlNQhMvRASdxnV7mBZjWNaHT7nA/qh1+NQXLtDwrHz0/sx8q/+iB03VeDUjoVkMJLdcJjmj11wPK\r\n        OQfOsx2rz2m7k4AJgXosFVNiTo1wEWquDMqis4XZxNjqtQnyMt5xCWjMZOnPmnDph3Fx/P/I4/kCSt1x\r\n        7YkUoa+oX4VF4WdmyizCgGfBxbgQIU9zAc9HCWyoq+K4VH6UVlIbOn4GhRtdvtoWJe3J67aMyms2vKul\r\n        TUqRFWBBC11IhjryqMaXz7Mvtzi9QKICb8DCBsVffGlsOF03sbjEhVpT83MgL9Msg9UZ3vSabP1p9t+L\r\n        MrAe1gHm6WdDFN1aJ2uGkn/rbbiyrKkV4cRgnWHBZrT5BBFmWQa0yLEDrFICz4cJa80mK0YIrsFxs/r1\r\n        e6ZHbYPMTQw9dW5z32/Wn1YtM1eZqEJkFnhe/uMbrYt8vl71OaXtLwMWyyyouEh+mleSLAcW9ao8mywC\r\n        55eQYHsdsHIYa9bf+7giGVcBjEf71cfSQcOi7/oBL0nVcDHvNt8Np60Xw1J1Pw2wH+AoLL/ztJWXlAJX\r\n        WOB+w2cNUIEtLc9SX5i2NdhrMACZHr0D1n3Zj5tZcgPlAcbE3qPmAVYWXVsuB6YsJtfNbRX1UxuIOJDN\r\n        QDys8UC5fL0dV+AFcBhIaWn+PlnyISszb8tw3ROfngjAZbVLyYwSd4CNNsSr4U0/yfpHheDdBiYo6FhQ\r\n        G4qbspWZbJShyvQORk/lawJpTLiJuLXlEEArAajfNS+l+OQ2CInGx8MsXV2x1+qetBOFIMFLQjGzQDeL\r\n        3oCbCrWuzHA9lFKXeXgmPBHbakykBy1npv4BBS0mQxNuU9HZQHk17A343K8tpO2dQjjbv6ffgml619pA\r\n        LBaCQlCECeQ751NtaSEyHmMTl/zoc5DvshTYWPiq1t7E7WqMCEOTlhVhMZMOExq0S0zKzgDeOLh4riFd\r\n        zOmAyYWc8pvnUzR+Ju5GxeSlm25q+SvFJF9tmCCCaWMdJj5rtbKvpZq7YhRcuji9a22eJzH8zpNiQfmZ\r\n        qlEGgZc6U1lLcGzH4uu0XQ+goJeiUKIha+qoZVdRi8p214JXWRPTd71RpDpMCG0NjQ2GLc78J6tvshfg\r\n        fVgKzP0lN86rPkgnCxnyYb/+KMtN0erU1rQn1kLqim0mPMYyzsC+5kXTuwoIxtL9JyWU+q4FTfUrtWky\r\n        HPNZfXlRO2Z8xRYrbBAMDNMyHjvWgptcdKXMeeei1MXeQQ0OCF9Fekj+gg9BeAe1T13SfTPU3uk6xDao\r\n        eijbUQhbVABay8ZnUMRjqvNGs8GHqLIz2r7JdQjziICk4AzSJhFPiLkOmzVkB6BLW37DMMDFnX/GeTjv\r\n        Ef4TwWQrXrHeNZiMwBGXzWZ6/dxTPytupeTjMFUAfD/Ar4bNQwBH5ZgeqY81q1/zEgh3A4BxFWCYt1Nc\r\n        p/zKaqZxNQiPMaXlWYbXK9qZsi5RbpMlVBZ+wp3eGyJ8NW+zZ8MKQ+9pqHqBMa/wKy0zb+SN6r6MW5+2\r\n        Pwcw0YSCaASmlfBP+p18F29g3oZhQREjDpiM8T1Is8ffzsVNJ6FM3gKMeBhIBN8EJRA9gdED3rk4F8EW\r\n        Sglta8Khn9WQmVHTe02bgRpL71lZEfMwUwtMow+bmZYD3OApbLkwJCuB+M5GgWLZ4OEIWzwr4biG3BV9\r\n        hiPRowsh2Yp+U5/Zy0uKOsLlorXkzTNMc3k8a4PFHn3ZzxoMqR2CQ+JQ1ozBsgcGE70a5WGwN8eKgWlu\r\n        EPq1WueDTEx7xvesrZx8PZ+05VUAYWAinGwH7doYPw5hAkV2hbHGF0GQgJ6zNngEfEpLewLJ64jYl00n\r\n        cT+7NSYOAWTvv4/egAi+SROCy9e+Eu7Jx0uDyXMRxuY+ATFajAQxJdilAufCttfk1bAV2+QiRthWsgko\r\n        9vW1d+XoOiL4/J2UgJ0wuAhaxK8xEQ4bnnURDuenZYyJm4FWQQnMamcdWJDJozDIcEiUJe6Y4Mya4KY3\r\n        FkBbegpcpPAqfAzN1mUe0XCwUhYBPl0RXyk61E4TSltrV3ovDL78lknHFLpuE41vXdrCJKDPn4LAdJBG\r\n        3EGPIgZ8Y4GDeQwtBXIHpVjMv+rDLjROxpeIl+QQ8qaowgCMCTJ7/1fSxB9P/g1NkycEG4vlK18KN/rI\r\n        d576FZWY9+WNMJ0JcHQUZKKYLIr1rIbQN+dLWBmH8sghMOl6DcAHh2b0aF52e3D15RwAf6fJwP6zT8W9\r\n        DGyliBbSiPNZITQW2J/lcNe6TIKjDwqtWOZiL4a+u7iDsF9H4Zf33A8TjMHBnOL5KRxzSjsgkduS4BzW\r\n        hDr25/ncf+GNkuCuhrCP3+u6URoig6zEha94OMBp3oa2//zeDVjRdqwp5XKFPdKQiy4gbNmDZrhQMIlz\r\n        YUw9J8urx63rMV/QoLwRYw2a566hbxpYH/b9Oxs+eR7AOQ//za9F3zt0C4+GBZnonuHogutpEWCa2cAo\r\n        NVfVIG+pZTh4+zIQ1sgTHEHhOA/0vcPB616a3XwZFzsyc9ET8M8cR/1rct95uIRIq4EmyGT1guEQi53m\r\n        Ikz2zmSOY96UQzLxAHqiR3HcmWgm+wL4am0RNlfBobbmkiQiENNjEcf7AgegPEZkBTUnT0gr58mcBeEj\r\n        eYc27NPgHaQuHhTKARHPLW1vGbBiEIpPICDypE879AAE5juY58CQukwomL0B1hPOZ6s/Ubkhk20M9p/8\r\n        42Tp+9ZisBZ9tP7sAQwX93Htza/HqE8lkkOT4VgHJtdeTdfqLtB3hsNnb4G9F+V+joMDXv8y2MWMrH62\r\n        +BNP4GtXYXk3IyuDGhyn65IeAsdMZs4VLALHOsKRuhsF7FTBods0CDg6mOcYgEDow8mavLdau5jyhnhm\r\n        TA+DwFeHEQ6Gv0hCD7HuhJeTdYCxMCoaji60IXB4gmNLLsB2PACB1Zjs1q9qYzgTtGYf7wDY6zLy9jrS\r\n        2jRcSN6Fj9anDxF3PPJMrE8ZS2vUGJi9OW579FE8nOYBggdgXJ4QbJyHM+Hd9Xe8GZfvfwjthTaMpWs3\r\n        GUvf1mRFm4r10ZuLkjdEXg3jij0OhOL9yqF906voRh9lFg0/A/Clp2FEGCV8ubRRm7AyyHcy7Ik3cAYc\r\n        qRAyPeYxmMtK0U4nuaFJh4VPpwQ3JIHDICor1YDgYK34akIP5GEBVzH47A0gtqEndhln4r1w8M+x4r1s\r\n        IW1vCNDaQFyZgGptPIYZCTsJfBmRPmvC5BJ81tpy/DXVz+UcsFTMIlYJJgvSPNRrDHDxiT+GX67h9udR\r\n        6AFrfHb/45Cg8R43fvDdOPrN30bnl+jaFqaNE0uDUgKSxghH1+ZjszU42P1kb0AesCCbMDE59CP6g31c\r\n        evfryxOBcsuv3E8YK/cnK5gnr8HMbRhaLdpMD5kgk6u4WLEyPbpID7sBDlA/hB4rV4EvZwUyPRKc4n2k\r\n        ALGUn5dga3yl6ZHc8fj9OPLVYhaeb+QraSfCc9oTHYhf07yDJ37N5Er1JhywtjjfdP5DAG8CovfndFYd\r\n        QdvvzzLx9OSKfFmPgWADucSLLpTl+ja5gPohtxsfN9bg8n2fxdA0eeKvVe5/Y9E3YXjw1I++B6uTAc6N\r\n        oQ/7s+nWWEnSx36IcLgM42IW4bAEMzIeMhLpMzCP8x4rbzH/vndMXf8N34dPPYami1b2gPFnMhwLudNA\r\n        0yKmPs74i0U2RtFDytH3oi6miYlDvJIeGEbgeJWjKsMoN91v5oOCvtwXVbYfgeMlLdkpONhocJdZEwlM\r\n        BoS/WX42OIKDy1e8jHNK568A4jVXxew8kJE+o1leeeYByCytMcGKnKyCRZDUNUFry5VN/Fe0gdz2LJbh\r\n        eHarAWbZ4+7fuS+tAqS/llYG6Nm1H3g3rrz85VifuuD9S908W80WCxEumVg67bPH0zXA4SxO/ImSI/+b\r\n        lWH86jqLddNifNGd2Hv7G+JNOqwE6grBf/IRmIsLtXFnEz3EwilrJVbveB0nZ2O5NuI2LQMS8HrfgYAz\r\n        i8LP8R6XfaCzWNYkiD4XFIs9b6Y0l2hQ8zaPv0FCzgB7H1ZUCjhkBapy6CwpEILHIFxkejiLtPfZ6p+u\r\n        M54LHjW5vXNOWzwLACRNLptAhDDW5GW/SWxAcSdN0KRHbH2QtbzXbXAdMV9j8qPRh7rWI4wBXvTgl9E+\r\n        d5WEXryBJn3nvyd+6i/haLToV0OaSA7LZfPoDZjNBO+jheObaBval57gkM+sDL136Ncey7XBwfd/WxRu\r\n        G3fmmTAXUAh/+HTPHsM+dx1GBILxlNzjqICEHosubhwiWEgRoXcBh8OY6dbYor+l616SJF/0gWj1yeVP\r\n        y3Q+401WVLTVF/5I9cdyFkHB7PEEMsMc61iPwNEyh2qzyCsGaZ8HeajslRgTPbj4XeZv1uS9JIQJXIg8\r\n        sgV7fO4tAkR0Gl/a4kV4Pm+Bg0VmoqI8MenJOtwPfyLrryDCsLUgInsfJm+O13mmPa3bejStxev+xQeC\r\n        gLfN1AuIQwLxBI5e93I8+u++DyfX1liLEhB6z1vyBrSljZm8y3CINZ24hB6sELzzWK8cTp5ZYv5t70T3\r\n        ojtJ6G38rCuB4SOfR5NmgAxtRVVKMj3zYWLtYEGBTLUZR4SjD5OICQ4t6fyT3i2HMEm4XBM9ODMJjVhm\r\n        DuGdhhlE66Jo/CGeX5qUY1iEHghepvBVoofuC+PAI51dEFqy1Zc83FbTBKXEHsY5phdASDBCHgutuMQN\r\n        AoL6ATjVgSFZa+tZ4Zu5U/H96CngZO6PMQYv/8Tn8LmTJdaHezEISNwSLN9lf0D8fPbf+XaY0yVe/S9/\r\n        HbjNoFvYeFEIIhzzIBgSsKM2E1ZYitqgMORzzqFfeZzc6NF+z3dg7+3fRBN/gkPZ7lcKql+uYR95CsbQ\r\n        8IS7UvCo0CK+a0ygx3oATofNeF4xTmswcCP0fBxpBYPLU969Nt8bCVAV4h0Q/ySFoKq0Jrjp66Fc1iwQ\r\n        AOIrDUfFqHCeQdNRlzfAXpOXs7czB7jNqMAgrV2zPvTFIBD8wqxuRSe/K8hOn5oYnv5SpwB4LNwar/+N\r\n        30YHwBoDR0OB5BWwJ9Ba/PFPvAcP/+T7cHxlhdXxgHFw0QDENucNcGGereiE8LW+Zxx57zEODqvTEcfX\r\n        1zDf951YfPc74KyF9yZ4AA70qTyBERg//iAaNyqPtGL5RSFrjw0IlvcCzXEU/T2Lm2sWlMtVvAVpt7XA\r\n        hcX08FcyHFQXW3xuWsM0a2i8Lm1VBJr7UdWUnAeVPJRaG3A363KfbmavblHakgIQVw0l8Yojq/JJCLQm\r\n        j+EM5UtVUN6ibt22fGWGMyUh9juYC3N80wd+C5e/8hhmAGaIYQisKeYFgkLIiuCP//L340v/0U/i2tLg\r\n        5MYK/XII5/Olz9YAB12wZMxriod1v53z6HuHk6MBRysD//4fwOx730XhysPFJmkYkD5tmhgcn7wK88n7\r\n        w/2FCQe+bLOKMrGkkSYG2RvYV0Eza4JX4Fzyadi5T0oJ7cVNNHrbeJGvhjfVljYCMmY/6MIOvTMn4hh+\r\n        wQcNNSZ/ChcGAY6Drpyz2BQt6hzSlucAoJS+qRgQZZmcp70CKJlAvkodSr4nf14RjuvsHTB6WGvwzb/8\r\n        b9DBoIPBDEAX/4wogtYWimBoLZ754e/AF//ef44nX/IKHD23wumNHuvliLF38LL5padJP2mbfxsT7pJw\r\n        Huv1iNOjEUdX1zi+88XAf/JX0X77W5Pwyx0GozVwMDT2N3lOYAD8Rz8Ny5NtItgivOmTFPJEWE1+7H15\r\n        NfemXYRaIdcmEiUxXeT14OhyEOR+ym/tkRftav4wKHAu5fpxM89wec2TBf0mmQmuCAePKorJxPNP25sD\r\n        oMnnSWIh5u+rodxOO9H6itA3S5vaBtKarZm3uPPhr+BVH7gXX/vh74WDQQNghIdDGNqPxmBsTNwgFKIH\r\n        W+Nw9IZX4MGf+5t49gMfw93/92/i4JnrmC1adMbDjg7WhrMHuhsegHfhvIEbPPq1w3o1Yn1wCPcT34X2\r\n        O98GOIfRefjRwcebbHyKAR6YzMqcQETg8NkH0Tz7bLb+G4GnT1bMnM0jjJ9Xevy8Aa9c7nka2cIYyBr6\r\n        vM078LhfNQ/gDFksnjFfnZXvZv0/q6ykCRxbkvyYtngYSH1Pn/GLp5djnFntp5N15U+xLr5kSqPKsOfA\r\n        xzW5Mnm/7GFGhzf+q1/F8ZtehxuvuhsjgAYmTa7bKHoTReAcrPF49n3fiSvv/Xbc/oGP4baPfhqXf/8z\r\n        aDqLtjVoWptD0BHoY+8wDB5j77B66xswvv0NsH/h7bCjx+gcfNSgPgEUn5msEOAc7Bjeu6efg/3ofTAH\r\n        s+z9MDKMQpg+xsqMP6EHpnzM+KxF5qkJUm16hrvpkbcB75G7rj0oJqimLfOG8/FGo8o14XpYr/u6qZ/8\r\n        rFYXEHAvu173ujiu3E7a7iqAMBpQzuSm9z7Pmk+OexJXpne6LnlcoYLX+RUX8ft+hB083vZz/zs+8fN/\r\n        F+uDvagEUCgDVgRDY2CNgTUO3oQ4A8+87ztx5b3fga9dP8HhJ76I/S8/hv3PfCkFHwkghzaHN70G4yte\r\n        AvdNr0azNw9bj50LIm8Ab3wQ9mjx5ZMO+qdn5mQF/6u/icbFdfqFRO0ByklYQo4cmkmn4mKe1Rjp4SZF\r\n        pqmizNNvLsO05BemTvd+DMIzj9upuRr+UQQrUUphqb0XZSC09qug6Gz4N5STzN4ExXPkw1mVeVfLeMvT\r\n        liMC+anmrKpMJp4ibHGASJC+SYXXrEKlKdTee3SrFb75F34RX/zZn54oAYtSEVgAozUYbAPvXFg2dAbe\r\n        ObhLB7j2nnfgxvd+C5rRJeG2zqN1HtY5NC4MExrn4Z1DY3y8hVtsvvgepBAG9gmiV7Dq0XzgN2DT1eUa\r\n        VuUBcExCeT+hEQlo7bAMC3vte/JAqO2CZlxGHgndlee3kWC+8l7xQMpnqLhRfKXKcePF3n+vyqu2tcHb\r\n        yIDnm7a3CmCQkaK/c55FC1ycxbj5xECJaAYF0hMdDIrVBN5RWFwWSu8BpE0rPEkVl23MXovDJ57Em37h\r\n        F7F3vMQcYTJQVgi69NsUz7y1023FjSwjNsXvXh85bmR1waQoxflZvqx0tAZja+FiPmcNxnUP+2sfgL12\r\n        NYz7u7j8lMaegm+ff2uh07PixTJmxJd4EpJVz2oXFlhZeQ7jXZRn2nEfQXB0KFYxUvIZHPjcH+7XIi5j\r\n        drT8J3wgns9kOVTx02Sy0hRgpjYTbwqsMW9rw9L2gpc1zzdtcStwRXPz2JCZwMa93vstcpd9ifzqM7Ji\r\n        ieGFIYgYbBVY+xsD7M0Co8Q4fcYYHDz5FN74C7+IxckScxL2UhGY+Bd+N8U+gooSaNUho6YU9IlC0Iqg\r\n        CGVuMA49ul/9NTRXr4SIPwvZC89CLThQVtoQEilaUsJrYyI95OAW0XSyCqCEzxCN2EKz8Qd/J9rJAZvD\r\n        RQ4LL3RKdVEfWNHzYSQNR7qbYQNPTLyhinfAOE18zHzHMNuwBHwh0oP7fM5pS8uAGwiXvhZqNZebR28g\r\n        bUXl+riuojFkIlVe6Tzys7WAHJRhIkdaHTz1JN78d/4hLjzyWLT4eYmwVAalIjDWlFuL+WARhRzTf2PT\r\n        YLDkCbDAN9ELiO/wzLM4/Ce/hO7qczAzExhtQVZfYNRnDZhMSTmbAAAgAElEQVT506dS1Lzddt4AF+ng\r\n        lkaupmOxtZhph1LBiKLm/rYCR+0mKClTVj3tk6pTvi/aQOs2RTFFwQ+pPzX4qG1uNPWNhz8mwHFxTmN+\r\n        pXDOOW03IlAxToKSQ2WVBaHW5mAPPIFVuJKKiCkvVVg7IMQdmTXx8Af3hd1UoOtXeMP/+r/hrg/+dhR4\r\n        kzyCPBxAeseKwMn+AR4CtLynIJ87kGPH4wbrz+9mH/8ULv/yv0AzrmMn9Q1KBIO47umHwKgtFhSuWDBM\r\n        DpiZ0Guo/vjbEB2krkmdzAsiSLHirg0TLmcJeuozCxMpsaIfUia225hwGjG9U8MivslaH5oyKMf2qbxW\r\n        ID7yFSsMr+hwvmlLy4BkUQHlLqF8lzMgHfxJ58KpDHtlmjtYoRT5fZmPtf5JH9a5+Zy84gkYwFiLl/7r\r\n        X8PFT38OT/zVv4TTV74MI/JegR7xMFn8G2DSJOEQVwu8AewYJvm8MWgQdg16Y+Dhopfo4cc45DYezQjI\r\n        KkADoHviSdzxmx/G3tceC3v8BbTTPsTz4/P5jCLBfaJBQagpc3JeCU3WS7wxQyglmmmkcZYiL/32iq4C\r\n        xx67zTx81F2X8gwvMQnH9PM+njzk+HGaNyqPtXIo8nA9kscDJ0NoZ3+G0uvZTtriKoDJmnOizUkQhXlW\r\n        8fBJYqhC4jHFJA8LgOpSIAtDEgSqZ/TA9XUYr83b8mISsl7GeBw+/BW87uf+EZ7+4R/Esz/43Vjv78HC\r\n        hNUAeAwIu3GzEghz+AMQLHoS8KgIRoPGuMA+xsDH74Gx5TnQnZ7i0u/8AV5070dhNjFU74HrqzCHIodo\r\n        BOZ0qYh2fdkCsxCZAMSS6UHeF1vKRCrtelMzYjHTBJlBVcgAoAcwrCI9GlRpXpQXQ8KWGCXPrfpwyKxY\r\n        WargQfNOeq0UTUaU+k7lewdcX4Y9APPtLsS9AC4GUQRP3yOxJIQWn5XnMNNCo3m8XGFwmTDEmyVzUlud\r\n        yZd2JAaR/DHvadz0os+dlx2GsQYv/uBv4Y57fxfX3vImPP2jP4TlnZdLqw9EpRAUgWFvoG3izr6oCMZ4\r\n        14l4B4jPAexduYq7f/3DuPzFB9GuV8G1bGwQzNR31dfjIZw23J+Xm0+SJeQHFYFkevQqbr9BiV+mR9EO\r\n        6gpBUmszHKkrRBf4TI+DmfJO5Hvls2jKxACxq3zlmHgIRVsmzA8UfIXSuwfK55K6CEcR69KU5U82wHGO\r\n        absXg2wy3pJWQw6cWCCIvsuxTlmWSmV0vYoJDIIGlvsFZw1wRLH4C0ZAYIAbNa097XyzWuL2+z6Jyx//\r\n        JI5f+xo8963vxNV3vgXrgz00NCwwACxMVArRS2hstvjiCcQhQXNyijs+8Xm85A8+iUsPPZLn2MSyG4JD\r\n        wgB7BffgSzj4PdOFFSzT46TPeTXjG+QDW0wPKZPykXcgySIEHJGNPV0T3HIdKDbBcRMrWuWp2Oha8UiC\r\n        g2guocS6iOSNfKV+GxNWR+YEx8lqc8TvYcxwbCFt1wNgxmNGcz7HywNQrK9yuXkbT9QJs/p8TVTt1DAn\r\n        j3yhhKzJ3jYPbu1qmAqFjBVPYkBHnhvQ/ZcS3uPwj76Iw/u+gFd4j+OX340bb3wtjl79MixffAduvOZl\r\n        WB3sp2FBPMuH0RrgZIULX/4aLjz5DG575DG86IEv47bHn8xCz9O3owB0BhwMi1if9Qbro8toeuh8mh5W\r\n        3BU/vd6LvzPeND06C9y2CEIn0Zx10nBMbjiitjyCEB7HCFKsgPTn4gy+OstQy7tRwXFxkekx6Z/JcOjd\r\n        leeQzl8BuHgJxKIrx2JCpNUYIqmkE1NmOj5LVoaWbST0kngLaS97LMSaXoR5PQQX7HAWow6J9m5yXTye\r\n        lDTWrI/SAqshXjuVwTh87HEcPkZXiZkIR2dzP0cXLLjeAqv7zsK8iuGtE04Q4Jg1IcKOI1OnvRqBYyHe\r\n        AMFsEFxxiYZTKOH4Q6wlW32p+0Td71ckM4VR4Nif5Q06BxGOWl1J4Bxwg7Y48zvG0WlfwqaH+OxNFqHl\r\n        11PLr+vh7wxHS3w1I77SZYEpPs4hbccDOI1j0UOyPiPimEwfkVXMPm/j+XObEXY6lKHACsXiZfCM0tzE\r\n        5HxgnlmsV6zoxXmYsV0PZRFmnDQWncfJNOTLRwaHcnINJcPN2zLyLXxeedCpsDwVIZB2b6zIK7LRis4i\r\n        flR4a2a20z5Evjmk2IXOAzfWm62l9GOh4PA+4E28D1FaZ7pjlGf0QQHOmkAPb4IbfWEeriEXOnOdEvb8\r\n        tK/zlcRbTP2J5fXOQLb6MtewHEr+Y+Ut8Na8LOfDuQs5ryA7MW+bh0nHInTd9tKWLgbxYSx6TcY+hiK/\r\n        Sh713RqKCCTEdcCRWDhVji3VfgSTLYDOuyJvoLVBgA6iN8AWWdffO+DaaR7DFW34sj0T+3PI8QFNYM6j\r\n        VeVCDZWqbaj+LIcszNr6yBwHF07ewAhcc0EIzsKVpGQtxQsz8XALWbia92SwgebcJ6/oEdfO9+O1XEJz\r\n        XdYj4PLaso6rAga/AY5YRxUO+m782fSQtBRjRxumEhzrm9P8FqctzQFEhpGxD7wa57O/aaJ2ZmvpghZN\r\n        YcHN1GOQW2wP5jngqAizHP/U7qxDWC7b68KOMxOtz6U5cDLGcNHafWM4gBy6nGCQ/iyoXrGyyz7fLMP5\r\n        pV7jA3PKGNcQHP1Yd0v9CFyPwryI3kBrIxzsLbEVjX9aEddm+xYxek56Fq3+ss/wa1oYD7RthIPocRwi\r\n        MWf6kWV2CEOURZetcxu9muVYv1tRYOHJSiMPFSyLWYjLx0jkwLKafrKS1NlyzmHeRjhc6YFKfwSOvehl\r\n        wASaylyNhCHfQtryKoB2j335zsZ4bZ3JBFi7PK7Ve9iFtsbSTKwnopjg2p8OJHRUXoYLp31wmQ+7oADE\r\n        i+giw3oapiR+StqE3EKpNx766GTYYgLTp3GtMDG5tMYHBlvE7a/sSlsTJ5b6PM8w2UgVlYtMkCVvIN45\r\n        cESTTmn5TgkT4w2RHuJNCI2G6OpyXal8xIVcjSXzDNI/g3gDj56VV4K3omXYzkZvINJGPCc956MTy78V\r\n        L4y2FUsY8uRNGvqQ/kQ49uLNVJ7eyxDlZK2GCdQ38c725dr06GXO2gDHFtIWVwGE2Zhg9F0QzVb/ZCjX\r\n        h/lLmnVlK0P1GuIA2dij485zvd5Fb4DG1DMAHWttMyV2UUf0XvYFjvg+XUuOzECe3gMRDoodV5tP2KMJ\r\n        y35EYlJWBI4myNiKXpplRSh94zbSbs34LllhOQXo8xh5QkvC96wJgtuIEkfZPxNxNCM42KuRegSORA8E\r\n        wyBezbIv8xeIor5pvnIuT3Ry0h6JXJCS+IppHz81HJQ1ZXIjcOQyPbzJcGxhL8B2IwIZ9Tsh1pSn1voY\r\n        Rimt0Us5spjWBist9wayBk/uHHXAIlhlIb5jjY9ouRCt6BDi4Yv1kYsf+NTgxOiYkLc1mfl6H66fEiOT\r\n        lip9XjqTuQe50DTBUbHw0saFOcEheIxlxYovlRWFzTiWSwz0HnqGQ1ZJCnrQ5QeFF4TovaijruwV8W8v\r\n        cCzyvoHimm4SOBlTH8SjvAZBoVlTtp/dQaQjvtbmCz48Sr4qGIvqsCacCJXDVEU2X/ZPaHpBhihr1JOP\r\n        cCi+Knj0fNKWJgGRmUmYnAUPiLepuCBAyeorzQsE5pEwy3K6jenJioVT0trigq1DTPrCKkcCOwBHp0G5\r\n        DD7mU3UWQS1MZm6BozF0uafUL/2MfW6bDIeXOiWPod/EhfK7sD5xE1CxvRdBYI/imHqQ3W0snKTISNfA\r\n        x6WwlQ30WA3IR21JCQvS2wa40AVhU3orfdE7OYVuc5roG9S9A9Kc82Ez06INQ6hhKOmW+hMfyhBHdv+t\r\n        28D5S9r9mcpQRzuZe7G5j0xb2Z7JiiF5Gg0w28srEEJPbsd54MZppIfHn499AJJYgBJjiADHB/0YrGZ6\r\n        p4XYxIskWxRjcD6wUgT/0NwY81qECZkl3/0e25NqPSmi1B+qSvuDbEwmcPhc0BukOYtaeCv+TC46W1FS\r\n        JE1cvpSxqFZSwninPfWDlCaniTPgo9LQMLJXEq2lzI5rumovRvoveUSwjA3Hvpdx/T/1UfVZhmFS3lO9\r\n        k2EA4X0YIxwaVuEJEzwluZouvdZKWDVTsKcJpxcvLgLfnOiVgk1wnG/a7mGgIpHQTZ7pfAhj5EMZ6wPl\r\n        KoLBRIAmPzTjofQGOOClbl+EEcgMURt3FvCw4FMfZk1w+Rs7fa1TsnBKOjWKFmRFZW5gE+zFp8pSKJCz\r\n        GNTny1knNzTX6Kr7UXlmkL2aI7pRt1BclXp4g9JGOM/gNbmc1VbgFvzfFCXqRYJjHW64mvDF9tL2QoLR\r\n        R/guVgKEH3rGZQ/mwdLx9dNAXe5SsYqgTMxc9AYuzuMWWSnjcx26cnYb2eXWZ+oTPAIrQhsXoos5Gb+S\r\n        m6yfs7UsG0DCmTXBqzmYlf2theuqPasKkHokfwezSA9dLyboyn0wG2jCcCGueMzj5p6ahvTlZ2EA1LvU\r\n        lhJ8oc3hjPiq1m/Kr+HapOMkv8BxMJvWubHsrU9biggkX84iDDJhdL71WG6g4PFVslwgIax4EiyQXLlM\r\n        6vRy+B6ZQHzks0YwffCmYvCL7/2Yl770YSd2MQ3nMQSzqYKQ8o2+XGNPdav8tVOSk7aRSaEDgfZy2UVN\r\n        cAiHXLHGvyFhTcOaKDwOwMpl/BbGoqKkUp2VdqQtDhwjTa/i3A7zJwsnu/4yb0NZJ6MP3bbz8RQl8yqm\r\n        fHKOabthwbXAbMoHlW8Yw26vYtzMzFRV3chWVY8/KV8ar/lMoBpjFzqlplymjyeeaz/mXWt8TRjnB0oF\r\n        9rzwBZpN10q20rdN32t9QaUvfYUe1VGQmVQx7RPV7U0Jhw4WerM+195LG7VRwDACVxmOM9q42ZKd5oGC\r\n        Hlpxb0LIrU8vjGVAfn6zckC20sfrsJQiY8+b4pCpQooAyHu3e1cvsqkq+e4r388qIylFORrCCkCVsc3m\r\n        egsl5Es4NvXx7Icb+s6CWSnK9NBw6OZM5bdeSnU+766bAluvG9w3g+Jg06b8OnlM+epmaYJGerCJryRZ\r\n        lJ7lOaftDAGet8ujEJO8RKqg98DV0/rR14kl1iY8PloNQfNvItLNUiEIZ7ikZ6Xe1eHgVHMt2b1eDuFc\r\n        gsChXdSN6floueirplBdG8owHMBUEVRIMKlvNYQ61n8C39iTAvHxn6/LtY6FavTQ9kN+JBqYso5lhOMs\r\n        vtqi+w9sNSz4WWmjf1hJfqr9029tTX35u6jyz8oNYy48SxlsaIvH40Z1MnU/Wreawqsy1CYfv2bKod7X\r\n        ntXKbLD4MuwyKo+eJNXVFPR6PnQ5S5I20eF5uvEyDKx6rUQHvnviT2QHtucBbD8kWC0Jwic70yqMJ8s2\r\n        jckTKkyQQh6FiMRY3sdlmjZsLulV/VxfmrPw9fd1QJCs0aQeKi+XXRTj5IqQA+VEFe9xkOWm63TgqegH\r\n        SjTejO8YFYXeUHMpXGFn4mYmS3Ar2hXtRhqwIhc4btAW56IdZBdfP5+OBVDQgV8VeFH8luhhMb18xOT+\r\n        ajwyvIsYu/AGB05VdWw5vTAVQHEoiF8oC74/y6erEgNFQnr9LJaXXXbSjlTWeOC2vbBJ5mRd8lMidIVg\r\n        z0d516yGJKvhAAphSBUo2FNSfbIGuLQIm0uO9ck+5LgFCS6VoSZLVXi4P7HCfTooMxGOM5i9wDGQtgbL\r\n        aTmhB++M1O2nn8poaD7aCBMpp0QPKqhjKBQ8p3/L98h3Go5aP7eUtq8ACsKrd5vwMpMtsyBBj5+yPFNs\r\n        o42VTRieFINY5f027MMXK3qW0t4kLDXDVPvd0RZmjmI0qUf658vnCYaK17JHm2hkIu0sZVXDf1UJV/Lq\r\n        rdgJFqNwX6kgBWzRAMR8cjT7+iqHJKsZe/279q7isBR5hB4N7csQhVSL1pN4TiMkVs502Y8H0I6WdGwY\r\n        dbyfY9rSHIC4fJ4QG3/LX7JSJBTyrrP5TLmBIkSlKXb9EMvJg7Sey1bZhp10hbXhP2S3cPKe++xL99Gj\r\n        zDdvA7Nxt1gYkjXhDPHPaO6lsnxQqGszHotqiAbMhFpZeoZB0UzqnLUUq1/KGxRLdwkmk9s0BEv6rZI8\r\n        nzel0LIylP4l+AkZ2lvy6ruUNwKHnZbjGAcFoqWDHsV8zWR4FJM1QSkLbg3hsbrJ6danrXgA3iNcVsmW\r\n        GyitXCKiRrAPrtTahf3i1iDt96/uaCOmLDqRGqFyPizbXF8G66/dOz7LztI6EUaT4ZHnE43vczCMC/Oy\r\n        La6fd82BLJHXeVGWkxBh/ZDrZeBZmArXlfFiNrwnnBnEUG5j3kKbNupQfzfuzeBusWKI5eQYsGyg8fLe\r\n        UDUbaMx913xQ8Bfz1Rh27KUmSJFN+IHrEDqB+kj9GX30xoas8FhZbyEeILAtBbDuYeazDS+BqbRUmKcf\r\n        gStx04aMn4XQXJk+EQfFkJz9lI6iboohmKzZhn4VgNSYnPrhERjuymkePydBUxYmNXEzQfIZjiK4hZ+W\r\n        udmJxkkZ+l3wqwmMfXXcMC+jablBYfLxaCAcpz0Z6NhxzMtW/Cxc6b5PXHXuR/zeD8CVUc1n6P6y5QbK\r\n        zT1KKQNxXqnPx47Z+ER4XS0W5DmkrQwB+us3SuuT3FrKZBCDSQgRKkR2MXbbtZViEqiKtOWWV5GAYvXl\r\n        bLheyzfRqu3FQzbV2Xm/oXkf3NdFl3+ztYBHOm57/TTGPNCwauvl6TtyfoHjSJ3VL/CAwNjpHjxmas7r\r\n        p+VmTTjtp2klZR0yPbRyKfLKK6INC7aE0DqOyrhWDXzoyzydBiPvYUObiO9nbYSD+q5Xho76yFdMD+p3\r\n        8g4YBqXQnA87JI/0DkDO64G9DsPytAbkLU9b8QBWf/ws5i+6PT9ICpaQdDALRDIIAnR9pTQokCaZ+gG4\r\n        4siK6nxAsa9frIxHmC0/klnmDQrEIgSrmDWhj6dqm22a8NIKJsKxPwvvFk1gbBfLaAO2dsBzp+F0oByp\r\n        TbiJTOrlO8r2lutw84++RIWPSTcALuzF+Y0uwHG8RnbXQQwqVtMDxgKHbQjwIQrthigZ6oPgdT0GOAp6\r\n        FMCUnhpPGp6ug8DUhoVShdCjawAzCxb2iOghdWYk5MIHXYw2jAjHMp9jSHIcv6zFG5jlMkVHYt01p0lW\r\n        kzjMWXofYZIgKLMG6y+fIEVbOsd0/i0a4OSrj2eryljjo5wpso0PhL59n25PIQvEY6jjVdC4fMFEMVbL\r\n        xeEQNPyRCABKD1Ws/F4X2p4RqkafLUOhMwyVjwI1IloxU8JRwM9M7qMVXSqGZsspfTVBCK+sgBvKWnrK\r\n        AxOE8fb90AfBVzpQJcJP3klyUyNi5PIRbwIuLu/l6L58MCbtY4iRjq+dlvcrpHp96YF4hF1zRxI0RXsv\r\n        kZ4LoUeM1ehdvIhDVjoUTZJAxzqKy0eYr8i74kk/4asrK1IUvuSVpDxMqP/qkoxKxCnTz/gIx16Kr7h8\r\n        +ElsI23BA7AYjk+wevIZzF9yZ0YggMKNPu3DNsyL86jpfZhkSt6ArjcieD0Czy2BgzYLGrgNBCtzzHe2\r\n        SdukBWwMStGR5u+HsDyYApLGOnnSi5PxwTKv+xAYQgKMJjiWQbCSO0n96KMVPWiz2y1gipU+7SMc0czw\r\n        kqgwnAQQ7Sicej9mT6SAXeGJf56uAz0uRHpYH/bKz1tVF7IwAGHy7rll9GpawhVlFgteaAmT6wJysJMJ\r\n        HCqces1jYDJrvoLZzFfMDz3N1aQYj7EBUbTLPg5bCD594M0CuLgX2w6w9o9ewXjlOraRzsMDKHS/MNr1\r\n        zz8EPzqVRTGfaNO0ocUEgUxWlMuIJUW0Pj1wVZgj/hXambnClATda4N2JiLhaBXro7kG1V3lI+Y+OUzb\r\n        7Sxwx36c44hlxXOQ3z5GQL56mif0jMCxUmNLKi9e0V7F6h+tQ19SJGFhVqXAJvrA5DEtb2gRK7pPsf+k\r\n        n1KvZ/yR6XQ+Wv016nMRMe21wO2LDXBQ7EAzLVrCENtIfLAiejShjckdfURrH2MIXl0qpbOJr1R/Ci8s\r\n        0vf6GiefehgK/1593rJ0Xh5ACYgxGI+XOL7/URx+2+sAmDxemvhv8d0yau1ZtACF1tbMQxbiuZMchCFd\r\n        NkmaPTVl4hh5HiaJxE1cs7VU9JCfFuHGXfhoATZgYWJ9EAKCyFiU7/hji9/HuYHDWfidcFUgNZc1Jtyr\r\n        J4wGH63lemotdTqM8y7CzLU8Jz15A3Ey8TCGG+e5mtSv+Fmlh8IlJ2uyFyapsPqalgR/rQ2tHST8e/Iy\r\n        babHpA2qox+BKyfBq4HJ7v6m1JhQr/AVEK8IX2H10LNwp2v46fj/lgs/cOsVQBUIb0KE2fVzR1g/cYzZ\r\n        PZcj0uOx2Nos/OjzWe396Np3TbDUJ3GZpRBoavDGmlxBqpt5Z68LE12weUx7vM4XTEgZzQ+zGAqrie/n\r\n        XVAYvdxcQ0MLjyC4snx52AI+XuF1eT8I9gldhFnwtgnjfO57TYntd4HZxJq4qJQkDiDvOuS6uiYIgmzo\r\n        2V8Eay9huieG2QBHQ7D8Ejiz80ER3ujLS1t0Wkbt1ajttgzSootXlUUF46JXdxrvVq7Kiw/K4kKEwyBM\r\n        XN5Y1S8YNeSd7c8CPYwNNL1jL+DtuCf4CRbngevqpuTaMFD4NYV3R+Cr0x7umR7jlSVgPIzd6IzfUkVw\r\n        3nMA3sOMBr6BDRq3/9o1NM0emlcugMuLIHB6Dzsz3zFZH/YGZnFmevBIkzhagRuuL75oDFmA+H4dN59M\r\n        LrYkAhvElYo4yy1jPWvCBJnA4YxSPDHJPYDicaSVhjEu4ynga8E0DNXbRgGWyTEgKKEby9CHLgoTkN1l\r\n        Ef6LiyAAPAQxBrjtQujnDQpvrU8owgC9AS7t5Ys5LyN4TldPK7fqerL6vHQbhwpNvD+PLx+R49qQWPpU\r\n        D2/ZPaQ9/Mm192EO5XhNXg25HfJ1NQZ8pXkGABfj8u31ZYaDPbRiNyLRQuC4MKedf8hzLyOAKxb+6gAD\r\n        D9/N4E8MPAyffDqXdO4KYIBddRj3488wNL86oDEWuNMABwiMdGNZ38NukL2BvS64YcYERN++R1biZslE\r\n        qx/dOAOk9d+Tvj6WFErOyMrIzLhYZBEguZnoRtztp6sR63NtBey5fDGnnCATOPQmlLR6gMx0+10+SSje\r\n        xhF5RSnGnSG4Ylu3LYLyYMHnFYpLXVg6vEp72AVfnO9oANDkmHp7COWuy0qLJBIkz0LsAy0P5xmXo4/7\r\n        AWJkYEtKgbcjz+I1W3w3gNQp+/gP51mYVxxGHDm/zEksohcFBMNwx37E51oVUrSRtD+L9Iy/xQs76eGX\r\n        FrjewvQDPCywmMMsAz4H2NW0slubzkMBePrrT31ztTPjfilgHugBPN3BX2mBgzGsmTdrmNMzrkw6ZSsa\r\n        mbgVYcYGIUZS4PnSDgQhFat/VrnDuZooUkLFqTHhZN5pPx0n8hZZnhsQy2eRPYsisQVDvLADcWUCQUj1\r\n        zLi0I32Uy0T2W2Acwm01LNjsccjvAwuYsdwzwVbPGGC5Aq7GJcJ5PIMw9kAvV62LUCoLLLPmMw+s4rv1\r\n        EIZKjoZS2vLLxZ57bYBBPDY9EcfK4uIMODFBqYyTiZSQEj1mea5GFh9qNCzwjMxXHnAnA9yzK+AEMMsG\r\n        xrcBtfMOaB38taOEi1PfXEWQBJaZW5rOcxLQATi97mePXDTru/VGkCSvg4G/1sJfAcaxg1sv4I6PMS57\r\n        jOOAcRjgRodhGDCOI9w4wjsHtC28czDjGOvy8PHf1IXkivvUKWNs6Mo4wntf6nTy8GANTNPFKoJV8Wnc\r\n        h+SyeyrkjYfxoR9wDhh7eDfSkNHHPnj4tITXwvsRxrtYv+TOUDFf5D4ErRbKqn5kKEJ9TbiSyoP5K7vD\r\n        BVyRyfPKloN3w+SWYZ8nK2IzNuJIr/SUCC5KiWIJmoOKqLqlfiOrNFoyn0/ygB9x08s4DM3Y115bi8Y2\r\n        aNoObdeinc3QdXN0e3voFnvojEU369C2HZpFi2ZvBjPrAD/AkEdhANzws0cAnCJuFfsTAvR1pfOYBBTh\r\n        dwCOnnAHf/gye/QdMHmBdLJsG42E8QCsgd9bAN0MfhiAfoAfRqAfYMYBZggKwHsPQ5OsImBJoL0IGhRj\r\n        xc9mlt4bKQBizCQu7H5mCH10W/PRdB//N9I4fDeLCiHn08IaSjRZ4rivBUv4hCNWCsa3cTtAWWf+EQXf\r\n        FPIdFIIBTEKAuNOiShE/DWC7uG8/v+FjBOmp8QVtCzgtosLNqjooMMnd0NmAEu7p969HVgxgKoFYz8he\r\n        TdaGIVTbAu0cZjYH0l8HzOfwsxn8rAO6Dr618MbAyGVBEBYy/nG3/3EAR8jycsu9gPPYByDAjABuHPvu\r\n        gef84tEEukHhDIjRS95l9qYik8RkEssry8Ep/05WVrJRvYgTOsXwsfCAPTVoSqqYVLwkVVFeFF0UAW+i\r\n        YiBYqWD2MrI/klbktEAnsE1WRIplTGohCmsqrVr2WckVuPaEp0pKtIra1ajc4WnGYd6vxP0xUeeJ5mdY\r\n        N8mA2fD9PJPPXWStTj3KUyXhPW+/EK/zmaF79Nh39wO4gSArIje3NN1qBcAewADgBMDjD42XPjR4E2bG\r\n        6H41rdvFintvEpNE85wQmARQCunmjXybSoZPAS7lO7MsKY8iulAWKEP990arKJNaNEVnpb/ZwicR0DqM\r\n        99AXe/XJQVDj0EIMbmI7zETTZQhEWQbdagrM6C+JVry1mbNJ3bHTJgo2OylZpRnVb00XDeCmd+eVBLjQ\r\n        T9mImLmtVKQTE2WA3mN84HTxIQCPI8jIgP+feAAi/CMCUCsAT5349lNfWs0/nrhB3GcqWLBREnqf0ZHN\r\n        DjVWCq5kzE9N6hQzZpAv1tpaWeh6fe6PlPOqz2CmRjIUOXbFlHE9SKAJVo4dIRmD8TTT80sZnUVnct9M\r\n        7pBYYJpVlz6apGR9roC/GPU41hQmHzYAAAU4SURBVGG405LBs0PDSC+pXlj/55Wyit2qByAfEf5gE4hR\r\n        hVWAfCwhKXKDL151Hz9x9lMAnkKQkQHZC/iGVgBAAGBEmN1cA7gO4KGvreYf/NI1f3/pS1MJCA8ZpF15\r\n        tRNehB6jH8RKCm3MWjjVjwmzG2RXX8qyDJio7cVN9/I7VeynK3hREibt8wOT64NiFv4shwTle0/1cAeS\r\n        rTamCOzjacY/g1SWL9WUSQotWXSjsJ+sfiyVvC2fPYsoMBlNm4T4ZjJwyw3l2SlpXIKTUsCYiXgvzdwX\r\n        nji6/6s3/AcBPIQgG2sEWTmXPQHnsQqgPYBTBE332Qeu+73VozdW77pw+1s6+KyMTGau8BE5fsLt2qeq\r\n        SUS20F641YPGuyCuz0rFM2PKrD+QpUYKSn3BH5fWkCXEFxvvRAhNXPkQoyeur6GoPjKBmHwYnyFKTpEp\r\n        cRNc0CiM1NWyXz5MRBXv2VPyGf8F2mMH4knI4M2IBtiQiEyC/6QvYiM+uUeKDs/bumu6n2Mqwrgj94OU\r\n        Oh8slOd9P7r7vvC1z37pqRsfBPBZBJk4xdQDuKWpuXmWrz/9v+NX8Jeb1wClLZO53TWA02vL4frXnrm+\r\n        PNhfXLp44WAvS0bI5Z2H8x7OefjRhWA9zsO7MX7GPyOIZmyH38lSkVwa3hST+CyNgEtAlMwXeUg4siHM\r\n        OYjPo0oRM6tclzylnwTFkBT6OMZkHvNFiCxVHf8oADGF05GUmjGlUkzvc2aTv6R6MpZ1W6TUSkRRZC9Z\r\n        AWCcsEekXKiNyWz4fnYiefy6k7EG1jbhr2nQNC1s26JpOrRt/N42sG0D21gYwD/+1HPP3Xvf/R998sqN\r\n        ewF8CsAjAK4ijP+XyB6A+6n1v72lmu089wHIMGCJoAQaAF8BsLpxur76kfvuf/Ti/Y++7p5X3PWaOy9f\r\n        vHy4vzfv2rZFNIqBwbJJCl4Bua4+LSRFgRMr6BNvyfgrWK5CPJP11rYkP8u2N7GtZ+c4WjeyarmctMfL\r\n        hLl+ePISoiAmB4KsP7eWLHrhy7Mu0AqqfC7LoqFM3hNQ9Dn5BfJLuxScu2xIe0slHsouFlZT04V6NU1e\r\n        fU77cVb60wq/tOfTfI3Jm0Kjp+O996t1P1w5Xq6uXj+58vDjTz98/ejkSwAeAPAggCcAXMNU+M/Fpfmz\r\n        wcFN0j+dfb9Y/hbADMAcwD7Cxt8LCLvHXwrg7vh3R3w3Q/ZSzqWvu7RLf0ZJBHhE8HaPATyLIPCPxc8r\r\n        CMt+xwgKYBXzDjgH6w+c71kA9gL0szUCIp5AmAy5gLCbXCJhPJ+B4C7t0gspefpbI4zvbyC4+jcQBP4k\r\n        Ppex/7laf+AchSp6AewJtAiegPwt4ucMQIdg+WMEiJ0C2KVvuMQKYES5ErZCcPdX9DeA1v/Pw/oD5yxU\r\n        Sgk0CEqgi38z+t7G9xZ5qXKnAHbpGymJAPNO2AFBCYgikO/Fuv95CT+wBaEiJWCQhVw8ggZT4d9Z/136\r\n        Rk3iAWglIJ8DPfc4Z+EHtiRYUQlI+1b9ifAb7Nz/XfrGTl79ibA79ecB4LyFH9iyYClFwMMDFvqd8O/S\r\n        N3LitUpRAqwUtiL4kl4QwkWKAPh6d3Xs0i69cFN1o8I2BX+XdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmX\r\n        dmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmX\r\n        dmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXdmmXtpT+PyvkbQUGkeVrAAAAAElFTkSu\r\n        QmCCKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowFBBqMCQQajAkEGowJBBqMCQQajAkEGowJBBqMCQQajAkEGowJBBqMCQQajAkEGowJB\r\n        BqMCQQajAkEGowJBBqMCQQajAkEGowJBBqMCQQajAkEGowJBBqMCQQajAkEGowJBBqMCQQajAkEGowJB\r\n        BqMCQQajAkEGowJBBqMCQQajAkEGowJBBqMCQQajAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAABBBqMBQQajAkEGowVBBqMIQQajCkEGowtBBqMLQQajC0EGowtBBqMLQQajC0EGowtB\r\n        BqMLQQajC0EGowtBBqMLQQajC0EGowtBBqMLQQajC0EGowtBBqMLQQajC0EGowtBBqMLQQajC0EGowtB\r\n        BqMLQQajC0EGowtBBqMLQQajC0EGowtBBqMLQQajC0EGowpBBqMIQQajBUEGowJBBqMBAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowFBBqMDQQajB0EGow5BBqMUQQajGEEGoxpBBqMaQQajGkEGoxpB\r\n        BqMaQQajGkEGoxpBBqMaQQajGkEGoxpBBqMaQQajGkEGoxpBBqMaQQajGkEGoxpBBqMaQQajGkEGoxpB\r\n        BqMaQQajGkEGoxpBBqMaQQajGkEGoxpBBqMaQQajGkEGoxpBBqMaQQajGkEGoxhBBqMUQQajDkEGowdB\r\n        BqMDQQajAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowJBBqMHQQajEUEGox9BBqMuQQajN0EGozpB\r\n        BqM6QQajO0EGoztBBqM7QQajO0EGoztBBqM7QQajO0EGoztBBqM7QQajO0EGoztBBqM7QQajO0EGoztB\r\n        BqM7QQajO0EGoztBBqM7QQajO0EGoztBBqM7QQajO0EGoztBBqM7QQajO0EGoztBBqM6QQajOkEGozdB\r\n        BqMuQQajH0EGoxFBBqMHQQajAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowNBBqMNQQajIUEGozxB\r\n        BqNRQQajXEEGo19BBqNfQQajX0EGo19BBqNfQQajX0EGo19BBqNfQQajX0EGo19BBqNfQQajX0EGo19B\r\n        BqNfQQajX0EGo19BBqNfQQajX0EGo19BBqNfQQajX0EGo19BBqNfQQajX0EGo19BBqNfQQajX0EGo19B\r\n        BqNfQQajX0EGo1xBBqNRQQajPEEGoyFBBqMNQQajAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowVB\r\n        BqMWQQajNjQIwoB4S/Xde0n1+2kz6P9eJ9//XSbf/1sk3f9ZI9z/WCHb/1Yg2/9UHtn/UhzY/1Ab1/9P\r\n        Gdb/TRfV/0sW0/9IFNL/RxPR/0US0P9DEdD/Qg/O/0AOzf8/Dc3/PQzM/z0Ly/87Csv/OgrL/zoKy/85\r\n        Csv/OQrL/zkKy/85Csv/OQrL/0YW0/tnOObdXivQgEEGozZBBqMWQQajBQAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowdBBqMfMgjDcSUL4/t+VP//e0v3/2k05/9dJ+D/XCbf/1ol3f9ZJN3/WCHc/1Yg2v9U\r\n        Htn/Uh3Y/1Ab1/9OGdb/TRjU/0sW1P9JFNL/RxPR/0US0f9DEc//QQ/O/0AOzv8/Dcz/PgzM/zwLy/87\r\n        Csv/OgrL/zoKy/85Csv/OQrL/zkKy/85Csv/OQrL/0UW1P9sPu7/flL9+zMIw3JBBqMfQQajBwAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMkKAvd0yUL4/9+U///e0v3/2k05/9eJ+D/XCbf/1ok3v9Z\r\n        I93/VyLb/1Yg2/9UH9n/Uh3Y/1Ab1/9PGdb/TBjU/0oW0/9JFNL/RxPR/0US0P9DEdD/QQ/O/0AOzv8/\r\n        DM3/PQzM/zwLy/87Csv/OgrL/zkKy/85Csv/OQrL/zkKy/85Csv/OQrL/0YX1P9sPu7/f1P//ygL3dRB\r\n        BqMkQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMlJQvj+iUL4/98Xf//eGz+/3Zy//93\r\n        c///d3P//3dz//93c///dnP//3Zz//93c///d3P//3dz//93c///d3P//3dz//93c///dnP//3d0//93\r\n        c///d3P//3dz//92c///d3P//3dz//93c///dnP//3dz//93c///d3P//3dz//93c///dXL+/29j9/9v\r\n        T/P/flT//yUL4/pBBqMlQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/z8r7P93\r\n        cv//dnL//3Zy//93cv//dnL//3dy//92cv//d3L//3Zy//93cv//dnL//3hz//95dP//enb//3x5//+A\r\n        fP//g4D//4eE//+LiP//kIz//5KQ//+Ukf//k5D//5GO//+Niv//iYX//4WC//+Bfv//fXr//3t3//95\r\n        df//eHP//3Zy//92cv//e13//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhB\r\n        BqMmJQvj/2de+v92cf//dnH//3dw//92cP//d3D//3Zx//92cf//dnH//3dx//92cf//dnD//3Zw//92\r\n        cf//dnH//3Zx//92cP//dnH//3Zx//92cf//dnH//3dw//92cP//dnH//3Zx//92cf//dnH//3Zw//92\r\n        cf//dnH//3Zw//92cf//dnH//3Zw//92cf//eWv//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowhBBqMmJQvj/3Ru/v92cP//dnD//3Zv//92b///dW///3Zv//92cP//dm///3Zw//92\r\n        cP//dnD//3Zv//92b///dm///3Zv//91cP//dXD//3Zv//92b///dnD//3Zv//92cP//dm///3Zw//92\r\n        b///dm///3Zv//92b///dm///3Zv//92cP//dnD//3Vv//92b///dnD//yUL4/9BBqMmQQajCAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Vu//92bv//dW7//3Zu//91bv//dW7//3Vu//91\r\n        bv//dm7//3Vu//92bv//dm7//3Vu//91bv//dW7//3Vu//92bv//dm7//3Zu//92bv//dm7//3Vt//91\r\n        bv//dm3//3Vu//92bv//dW7//3Vu//91bv//dW7//3Zu//91bv//dm7//3Vt//92bv//dW7//yUL4/9B\r\n        BqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Vs//91bP//dWz//3Zs//91\r\n        bP//dWz//3Vs//91bP//dWz+/4R6+P/Iwt//8/TD//v/sP/2+LH/5eLC/7mv3f+AdPj/dWv+/3Vs//91\r\n        bP//dWz//3Vs//91bP//dmz//3Vt//91bP//dWz//3Vt//91bP//dW3//3Vs//91bP//dWz//3Vt//91\r\n        bP//dWz//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Vr//91\r\n        av//dWr//3Vr//90av//dWv//3Vr//91af7/jILz//P1xP/8/7T/+f2s//LzuP/r6MT/5N3S/9zS3//O\r\n        wOv/g3X7/3Vp/v90a///dWr//3Vq//90a///dWr//3Vr//90a///dGr//3Rq//90a///dWr//3Rq//91\r\n        av//dWr//3Vr//90a///dWv//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhB\r\n        BqMmJQvj/3Rp//90af//dGn//3Rp//90af//dGn//3Rp//+Dd/T/8vS2//r9q//r6bj/qJXR/4Ro3v+D\r\n        ZuH/nofi/8y97v/Mu/n/wbX+/3xw/P90af//dWn//3Vp//91af//dGn//3Rp//90aP//dWn//3Vp//90\r\n        af//dGj//3Rp//90af//dWj//3Rp//91af//dGn//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowhBBqMmJQvj/3Nn//9zZ///dGf//3Rn//9zZ///dGf//3Nk/f/Dvcr/8/S2/+XiwP99\r\n        YeH/aU3u/2tT8v9rU/L/aU3u/3dZ6v/BtP3/xMr//6Kl/P9zZP3/c2f//3Rn//9zZ///c2f//3Rn//90\r\n        Z///dGf//3Rn//9zZ///dGf//3Nn//90Z///dGf//3Rn//9zZ///c2f//yUL4/9BBqMmQQajCAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Rl//9zZf//c2X//3Rl//9zZf//c2X//3Fe+v/k\r\n        4MX/6OTK/6SP3P9rUvL/cF36/3Fh/P9xYfz/cF36/2tS8v+UhfP/wtX//7vV/v9wXvr/c2X//3Nl//9z\r\n        Zf//dGX//3Nl//90Zv//c2X//3Rl//9zZf//c2X//3Nl//90Zf//dGX//3Rl//9zZf//c2X//yUL4/9B\r\n        BqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Jj//9zY///c2P//3Nj//9z\r\n        Y///c2P//29Z+P/i29T/39ba/4Vr6v9vW/r/c2L+/3Nj//9zY///cmL+/29b+v9+bPL/wN///7/m//9v\r\n        Wfj/c2T//3Nj//9zY///c2P//3Nj//9yY///c2P//3Nj//9zY///c2P//3Nj//9zY///cmT//3Nj//9z\r\n        Y///c2P//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Jh//9y\r\n        Yf//cmH//3Nh//9yYf//cmH//21W9//ZzuT/1snp/4Rr8f9xXfz/cmH//3Jh//9yYf//c2H//3Fe/f9r\r\n        UPP/v+f//73u//9tVvf/cmH//3Jh//9zYf//cmL//3Jh//9yYf//cmH//3Jh//9yYf//c2H//3Jh//9y\r\n        Yf//cmH//3Nh//9yYf//cmH//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhB\r\n        BqMmJQvj/3Je//9yX///cl///3Jf//9xX///cl///21U9//KufH/zr33/5mC9/9xXPz/cl///3Jf//9y\r\n        X///cl///3Je/v9tUvb/ve///7z0//9tVPf/cl///3Jf//9yX///cl///3Jf//9yX///cl///3Ff//9y\r\n        X///cl///3Ff//9yX///cl///3Jf//9yXv//cl///yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowhBBqMmJQvj/3Fd//9xXf//cl3//3Fd//9xXP//cV3//21T+P+jiff/yLv//8C5/v9/\r\n        a/v/clz+/3Fd//9xXf//cV3//3pt/v9yW/f/vPX//7v5//9sUvf/cV3//3Fd//9xXf//clz//3Jd//9x\r\n        Xf//cV3//3Fd//9xXf//cVz//3Fd//9xXf//cVz//3Fd//9yXf//cV3//yUL4/9BBqMmQQajCAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3Fa//9xW///cVv//3Fb//9wWv//cVv//25U+v9y\r\n        VPD/v7/9/8TO//+8y/7/l5f8/4N5/f+De/3/lqD8/7jn/v+t1/z/u/v//7r+//9rT/f/cVv//3Fb//9x\r\n        Wv//cVr//3Fa//9xW///cVv//3Fb//9wWv//cFv//3Fb//9wW///cVr//3Fa//9xW///cFv//yUL4/9B\r\n        BqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/3BZ//9wWP//cFj//3BY//9w\r\n        WP//cVj//3BX/f9rTfX/dVjt/7vO/f/A3///v+T//77q//+97///vPX//7v5//+ZtPb/uv7//7v8//9r\r\n        Tfb/gn79/6PH/f+6/v//uvz//7v4//+98v//pbv9/4N5/f9wV/7/cFj//3FY//9wWP//cFj//3BZ//9w\r\n        Wf//cFj//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/29W//9w\r\n        Vv//b1b//3BW//9vVv//b1b//29X//9uUvz/aUjz/29Q7P+bpPX/t+L9/7zz//+7+P//sOT7/4OB8P9j\r\n        Oej/u/n//7v4//+Xqfn/u/n//7v7//+6/v//u/z//7z2//+97///v+j//8Df//+dm/3/blT+/3BW//9v\r\n        V///b1f//29W//9wVv//b1b//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhB\r\n        BqMmJQvj/29U//9vVP//b1T//29U//9vVP//b1T//29U//9vU/7/bVD8/2pI9f9mP+7/Yznp/2I35/9i\r\n        N+f/ZDvq/2dD8f9nQ/H/vPT//7z0//+brvf/vPb//7Dh+/+HjO//d2Xr/3dk6/+JhO//tND7/8Hc///D\r\n        0v//npH8/25S/v9vVP//b1T//29U//9vVP//b1T//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowhBBqMmJQvj/25R//9uUf//blL//25S//9uUv//b1L//29S//9uUv//b1L//25Q/f9r\r\n        TPr/akr4/2pJ9/9qSff/a0v5/2xO/P9pSPb/ve///73v//9jOOn/hH3x/2hE6v9mP+//Z0Ly/2hD8v9l\r\n        P+//aELq/52a9P/D0P//xcT//4Jn+/9uUP7/b1H//25S//9uUf//blL//yUL4/9BBqMmQQajCAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/25Q//9uT///bk///25Q//9uUP//bk///25Q//9t\r\n        UP//bk///25P//9uUP//bk///25P//9uUP//blD//25Q//9qRvf/vur//77r//9nQPH/aUP1/2pG9/9s\r\n        Svv/bU38/21N/P9sS/v/aUT1/2pE7f+2uvv/x8L//6qS+/9tTPz/blD//21Q//9tT///bk///yUL4/9B\r\n        BqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/21N//9tTf//bU3//25N//9t\r\n        Tf//bU7//21N//9uTf//bU3//21N//9uTf//bk3//25O//9tTv//bU7//21N//9pRff/v+P//7/l//9p\r\n        Q/b/bEz9/2xN/v9uTf//bk3//21O//9uTv//bEz9/2hC9f+Md/L/x8L//8m3//9qR/r/bU7//25N//9u\r\n        Tf//bU3//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/2xL//9t\r\n        TP//bUv//21L//9tS///bUz//21L//9tS///bEv//21L//9tTP//bEz//21L//9tS///bUv//2xM//9p\r\n        Qvf/wdz//8Df//9uTPf/bUz//21M//9tS///bEv//21L//9tS///bUv//2tH+/94ZvT/r8X//6O+//9W\r\n        Zfr/Wmv//2Fh//9mWP//bE7//yUL4/9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhB\r\n        BqMmJQvj/21J//9sSf//bUn//2xJ//9sSf//bEn//2xJ//9tSf//bEn//2xJ//9tSv//bUn//2xJ//9t\r\n        Sf//bUn//2xJ//9oQff/wtT//8LX//9+Zfj/bEj+/2xJ//9tSf//bUn//2xJ//9sSf//Z1D//11i/f9h\r\n        g/j/h83//3/H//9Hg/v/SYj//0yC//9RfP//V3D//yQd5v9BBqMmQQajCAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowhBBqMmJQvj/2xH//9sR///bEf//2tH//9rR///bEf//2xH//9sR///bEf//2tH//9s\r\n        R///a0f//2xH//9sR///bEf//2tH//9oPvf/xMv//8TO//+PfPj/a0X9/2tH//9sR///bEf//2xH//9l\r\n        VP//Wmn//056/f9YqPv/ZdL//1zN//82ofz/OKP//zye//9AlP//SIj//yNS7f8sf9tPLzy8CwAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/2tF//9rRf//bEX//2tF//9rRf//a0X//2tF//9r\r\n        Rf//a0X//2tF//9rRf//a0X//2xF//9rRf//bEX//2tF//9nPvj/ppP4/8fC//+5tP3/b0n7/2tE//9r\r\n        Rf//a0X//2VO//9ZZ///TX3//0SV/f9Q0v7/RdT//zTK/v8nwP7/J7///yq6//8yrv//OqD//yJy8v8l\r\n        qe15IbjzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/2tD//9rQ///a0P//2tD//9r\r\n        Q///a0P//2tD//9rQ///a0P//2tD//9rQ///a0P//2tD//9rQ///a0P//2pD//9oPvr/fFPw/8m3/v/I\r\n        uv//oo38/3BJ/f9rQ///aUT//11g//9Pef//RZX+/2TT/f/P9v7/hef//znX//871v//Ptf//3Lj//+6\r\n        7///edL//yGR9v8jufSVIsj6XRfU/xQAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowhBBqMmJQvj/2tB//9q\r\n        Qf//akH//2pB//9rQf//akH//2pB//9rQf//akH//2tB//9qQf//akH//2pB//9rQf//akH//2tB//9p\r\n        P/z/ZTbz/59/7f/Ovvb/zLr7/7yo/f+Rd/3/dm39/2OE/v9Zqf7/UNX+/1zh/v////////////j8///T\r\n        8v//8fv/////////////euL//x+s+v8iv/iwH878eCHS/0EAiakDAAAAAAAAAAAAAAAAAAAAAEEGowhB\r\n        BqMlJQvj/2o///9qP///aj///2o///9qQP//aj///2lA//9qP///aj///2o///9qP///aj///2o///9q\r\n        P///aj///2k///9pP/7/Zzr6/2Ix7/+ig+b/1Mft/9DA8//Muvr/q77//4jL//9m0v//Rdb//0DZ////\r\n        ////////////////////////////////////g+X//x7C/f8gyPrEIc78jSHT/1Yg1v8PAAAAAAAAAAAA\r\n        AAAAAAAAAEEGowdBBqMlJQvj/2k9//9pPf//aT3//2k+//9pPf//aT3//2o9//9qPf//aj3//2o9//9p\r\n        Pv//aT3//2o9//9pPf//aT3//2k+//9pPv//aTz+/2c4+P9iL+//flPk/7KZ4//Uyer/qsT1/4LD/f9e\r\n        zP//NMj9/yvU///+/v//////////////////////////////////h+X//x3S//8fyvvTIM/9miDT/2Mh\r\n        1v8dAAAAAAAAAAAAAAAAAAAAAEEGowdBBqMjJQvj/2k7//9pPP//aTz//2k8//9pO///aTz//2k8//9p\r\n        PP//aTz//2g8//9pO///aTz//2k8//9pPP//aTv//2k7//9pPP//aTv//2g7/v9nOPr/ZDLz/2Es7P9e\r\n        LOn/UFDt/0N08v80mPf/J7v8/3nk////////////////////////////////////////we///yvT//8e\r\n        zfzaHtD9oR7T/2kd1f8rAAAAAAAAAAAAAAAAAAAAAEEGowVBBqMeJQvj/2k6//9oOv//aDv//2k6//9p\r\n        Ov//aDr//2g6//9pOv//aDr//2g6//9pOv//aDr//2g6//9oOv//aTr//2g6//9oO///aTr//2k6//9o\r\n        Ov7/Zzj8/2Y2+v9kOPj/VFf5/0Z5+/84mv3/Yc/+//r+////////////////////////////////////\r\n        /////////4zn//8ezv3YH9H+nx7T/2kk0P8wAAAAAAAAAAAAAAAAAAAAAEEGowNBBqMVJQvj+Wg4//9o\r\n        OP//aDn//2g5//9oOf//aDn//2g5//9pOf//aDn//2g5//9oOP//aDj//2g5//9oOP//aDj//2g5//9o\r\n        Of//aDn//2g5//9oOf//aDn//2g4//9pOf//WVn//0p3//9OoP//7vn/////////////////////////\r\n        //////////////////////////z+//9Y2/3YHtH+lR7T/2Ekzv8iAAAAAAAAAAAAAAAAAAAAAEEGowFB\r\n        BqMKJgvgyGc2/v9oOP//aDf//2g3//9oN///aDf//2g3//9oN///aDf//2g3//9oN///aDj//2c3//9o\r\n        N///Zzf//2g3//9oN///aDj//2g4//9oN///Zzf//2c4//9oN///XU///05u//9cm/7/ptn//+T4////\r\n        ////////////////////////////////////7/z//7Hp/v1k3P7JH9P/hCHT/1Iqyf8SAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAABBBqMDKQvaRVou+v5oNv//aDf//2c2//9nNv//aDf//2c2//9nNv//Zzb//2g2//9n\r\n        Nv//Zzf//2c2//9oNv//Zzb//2c2//9nNv//Zzb//2g2//9nNv//Zzb//2g2//9nNv//YkL//1Rh//9G\r\n        fv//OZj//yyz//8w0f//ouz//////////////////8v0/v9N2/7/Isn//x/E/NYe0f6cH9L/bh/R/z4x\r\n        2f8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQajAlAl8n5nNf//aDX//2c1//9nNf//ZzX//2c1//9o\r\n        Nf//ZzX//2c1//9oNf//ZzX//2c1//9oNf//aDT//2c1//9nNf//aDX//2c1//9nNf//ZzX//2c1//9n\r\n        Nf//ZzX//1tQ//9Pa///Q4T//zad//8tsf//KMX//+P5////////+f3//znV//8lwf//KL//4h/P/qQe\r\n        0/98IdL/UR3V/yIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnNP9QZzT/02c0//xn\r\n        NP//ZzT//2c0//9nNP//ZzT//2c0//9nNP//ZzT//2c0//9nNP//ZzT//2c0//9nNP//ZzT//2c0//9n\r\n        NP//ZzT//2c0//9nNP//ZzT//2M8//9YVf//TW///0OD//85l///MqX//2jI///+/v//j9f+/yy0//Un\r\n        wP/MHtP/mh7T/3sg0/9YH9X/MADQ/wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd1f8RH9b/NR/S/1Uf0/9wH9P/hR7T/5SD\r\n        5v++H9P/mx/T/5If0/+DH9L/bSHS/1Ef1f8wAND/CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMdn/Ch/W/ycf\r\n        1f9AINP/Ux/T/2Af0/9nH9P/Zh/V/18h0v9RIND/PSLP/yQ/2/8EAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAg1v8PJs7+IB3V/ysf1f8xH9X/MR7V/yoh1v8eFtT+CwAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAPwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADg\r\n        AAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAA\r\n        BwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADg\r\n        AAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAA\r\n        BwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAAAwAA4AAAAAABAADg\r\n        AAAAAAEAAOAAAAAAAQAA4AAAAAABAADgAAAAAAEAAOAAAAAAAQAA4AAAAAABAADwAAAAAAEAAPgAAAAA\r\n        AwAA/gAAAAADAAD////+AAcAAP////8ADwAA/////8A/AAD///////8AACgAAAAgAAAAQAAAAAEAIAAA\r\n        AAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEGowNBBqMKQQajDkEGoxBBBqMQQQajEEEGoxBB\r\n        BqMQQQajEEEGoxBBBqMQQQajEEEGoxBBBqMQQQajEEEGoxBBBqMQQQajEEEGoxBBBqMQQQajEEEGoxBB\r\n        BqMQQQajEEEGoxBBBqMPQQajCkEGowMAAAAAAAAAAAAAAABBBqMDQQajEEEGoyJBBqMtQQajMEEGozBB\r\n        BqMwQQajMEEGozBBBqMwQQajMEEGozBBBqMwQQajMEEGozBBBqMwQQajMEEGozBBBqMwQQajMEEGozBB\r\n        BqMwQQajMEEGozBBBqMwQQajMEEGoy1BBqMiQQajEEEGowMAAAAAAAAAAEEGowk2CLsyeUz1vW056/pd\r\n        J9//WyXe/1kj3P9XIdv/VR/a/1Ic2P9PGtb/TRjU/0oV0/9IFNL/RRLQ/0MQz/9ADs7/Pw3N/z0MzP87\r\n        Csv/OgrL/zkKy/85Csv/OQrL/zkKy/9NH9n/fFD7+igL3cA2CLsyQQajCQAAAAAAAAAAQQajDicL3rd/\r\n        VP7/bTnr/14n3/9bJt7/WSPc/1ch2/9UHtr/UhzY/08a1/9NGNX/ShXU/0gU0v9FEtD/QhDP/0AOzv8+\r\n        Dcz/PQvM/zwKy/86Csv/OQrL/zkKy/85Csv/OQrL/00f2f99Ufv/JQvj/ycL3rhBBqMOAAAAAAAAAABB\r\n        BqMQJQvi8n5Y/v91Zvr/d3P//3d0//93dP//d3T//3d0//93dP//d3T//3d0//93dP//d3T//3d0//93\r\n        dP//d3T//3d0//93dP//d3T//3d0//93dP//d3T//3d0//93dP//d3P//3hr/v8vFub/JQvi+EEGoxAA\r\n        AAAAAAAAAEEGoxAlC+P/eWv//3d0//93dP//d3T//3d0//93dP//d3T//3d0//93dP//eHX//3t4//9+\r\n        e///goD//4eF//+Niv//ko///5SS//+TkP//joz//4mG//+Egf//f3z//3t4//95dv//d3T//2FY+P8l\r\n        C+P/QQajEAAAAAAAAAAAQQajECUL4/92cf//dnP//3dy//92c///d3L//3Zy//92cv//d3P//3Zz//92\r\n        c///d3P//3Zy//92cv//d3L//3Zz//92c///d3P//3dy//93cv//d3P//3dz//92cv//d3L//3Zy//93\r\n        c///dXD//yUL4/9BBqMQAAAAAAAAAABBBqMQJQvj/3Zw//93cf//dnH//3Zw//92cP7/hX34/9LO2f/8\r\n        /7f/9/qv/+3rwf++td//gHf4/3Zv/v92cf//dnH//3dx//92cP//dnD//3Zx//92cf//dnD//3dx//93\r\n        cP//dnH//3dw//92cf//JQvj/0EGoxAAAAAAAAAAAEEGoxAlC+P/dW7//3Zu//91bv//dW7//4V89f/z\r\n        9bv/+v6r/+Hevv/IvdH/0cXb/9bK6f/Htfj/fnT8/3Zv//92b///dm7//3Vu//91bv//dm7//3Zv//91\r\n        b///dm7//3Zv//91b///dm///3Zu//8lC+P/QQajEAAAAAAAAAAAQQajECUL4/91bP//dW3//3Vs//90\r\n        av3/zcnE//Lyuf+4q9H/Z0no/2hK6v9nSOj/pI3z/8fB//+prPz/dGn9/3Vs//91bP//dWz//3Vs//91\r\n        bP//dWz//3Vs//91bf//dWz//3Vs//91bP//dW3//yUL4/9BBqMQAAAAAAAAAABBBqMQJQvj/3Rq//91\r\n        av//dGr//3Ji+v/p5cn/1MrU/2lN7P9uWvX/cWD4/29b9f9pTez/uMD8/8De//9yYvr/dGr//3Rp//91\r\n        av//dGr//3Vq//90av//dGn//3Vq//91av//dWn//3Rq//91af//JQvj/0EGoxAAAAAAAAAAAEEGoxAl\r\n        C+P/dGf//3Rn//9zZ///b1z4/9zS3/+6qef/bln1/3Nl/v90Z///c2X+/25Z9v+epff/vun//29c+P90\r\n        Z///dGf//3Rn//90Z///dGf//3Rn//9zZ///c2f//3Rn//90Z///dGf//3Rn//8lC+P/QQajEAAAAAAA\r\n        AAAAQQajECUL4/9zZP//c2T//3Nk//9uWPf/0cHy/7+s9/9vWvj/c2X//3Nk//9zZP//cFz6/5OZ9f+8\r\n        8v//blj3/3Nk//9zZP//c2T//3Nl//9zZP//c2T//3Nk//9zZP//c2T//3Nk//9zZP//dGT//yUL4/9B\r\n        BqMQAAAAAAAAAABBBqMQJQvj/3Nh//9zYf//cmH//25X+P+plfj/x8H//6Od/P9xX/7/cmL//3Fg/v+R\r\n        mfz/mKn3/7v6//9tVvf/cmH//3Jh//9zYf//cmH//3Jh//9zYf//cmH//3Jh//9yYf//cmH//3Jh//9z\r\n        Yf//JQvj/0EGoxAAAAAAAAAAAEEGoxAlC+P/cl7//3Je//9xXv//blb6/3JW7/+9yP3/wdn//7XP/f+q\r\n        xP3/s9z+/7z3//+08P3/uv7//21T9/96cP7/lav9/5Wr/f+WqP3/jZL9/3Fd/v9yXv//cl7//3Fd//9y\r\n        Xv//cl7//3Je//8lC+P/QQajEAAAAAAAAAAAQQajECUL4/9xW///cFv//3Fb//9wV/3/a031/3BT7f+i\r\n        r/f/ve3//7z0//+17v3/j53z/46Y8v+7+P//l6v5/7v5//+6/f//u/z//7z0//++6v//ts3+/39v/f9x\r\n        Wv7/cVr//3Fb//9wWv//cVv//yUL4/9BBqMQAAAAAAAAAABBBqMQJQvj/3BY//9wWP//cFf//3BX//9t\r\n        U/z/akv1/2ZB7f9jO+n/Yzvo/2Q96v9lQOz/kJf0/7zy//+brvf/tur9/4SD8f95a+7/eWju/6Kv+P/B\r\n        2///vsX+/3lg/P9wV///cFf//3BX//9wV///JQvj/0EGoxAAAAAAAAAAAEEGoxAlC+P/b1T//29U//9v\r\n        VP//b1T//29U//9uUv3/bE76/2tL+P9rS/f/a0z4/2tK9/+Slfb/vuz//2M66v9qSO3/ZkHv/2hF8v9n\r\n        Q/H/ZDzr/5KH8//Ey///pJD8/25S/f9vVP//b1T//29U//8lC+P/QQajEAAAAAAAAAAAQQajECUL4/9u\r\n        Uf//blH//25R//9uUf//blH//25R//9vUf//blH//25R//9uUf//bUz7/5KQ9/+/5P//Z0Hy/2tK+f9s\r\n        S/v/bU79/2xN/P9kUvn/WFjx/46+/f+Twv//WG37/2Jl//9tVf//blD//yUL4/9BBqMQAAAAAAAAAABB\r\n        BqMQJQvj/21N//9uTf//bU3//25N//9tTf//bk3//21O//9tTf//bk7//25N//9rSfv/lIr3/8Hb//90\r\n        V/f/bkz+/21O//9sUP//X2j//1B9/v9Fh/r/X738/2bL//9Ak/z/R47//1F+//9kXP//JQvj/0EGoxAA\r\n        AAAAAAAAAEEGoxAlC+P/bUr//21K//9sSv//bUr//21K//9tS///bUr//2xK//9sSv//bUr//2tG+/+U\r\n        gvf/w9D//35l9/9rSf7/bUv//1tn//9Mg///P5n//zOp/f84zP7/OND//yu3/v8zrv//Ppz//0uG//8k\r\n        Kuf/QQajEAAAAAAAAAAAQQajECUL4/9rR///bEf//2tH//9sRv//bEf//2xH//9sR///bEf//2xH//9s\r\n        R///akP7/4lq9f/Hwf//p5r6/2tE/P9gW///T3v//z6Z//9fx///TNf+/zjX//9J2v//Stn+/27g//8s\r\n        uP//O57//yNc7v8xbdEeAAAAAAAAAABBBqMQJQvj/2tD//9rRP//a0T//2tE//9rRP//a0T//2tE//9r\r\n        RP//a0T//2pE//9qQvz/ZTjy/76p9//Jt/7/ln37/1dp/v9FjP//Mq3//5bo/v//////6Pv//9/2///7\r\n        /v//9fz//x3T//8vsv//Inby/yWz8U8AAAAAAAAAAEEGoxAlC+P/akH//2pB//9qQf//akH//2tB//9q\r\n        Qf//akH//2tB//9qQf//akH//2tA/v9nOvj/d0zq/8y87P/CwfT/iLb9/1m9/v8xzv//mez/////////\r\n        ///////////////z+///Utr+/yXC//8hiPX/IsD2aD/b/wQAAAAAQQajECUL4/9qPv//aj7//2o+//9q\r\n        Pv//aT7//2o+//9qP///aj///2o///9qPv//aj///2k9/P9lNfT/cEHo/56a5P+Tz/D/X8z6/y3Q//+y\r\n        7v////////////////////////j8//9z3v//Isr//yCQ9v8iwPdxE9P+DQAAAABBBqMQJQvj/2k7//9p\r\n        O///aTz//2k8//9pPP//aTv//2k8//9oPP//aTv//2k8//9pPP//aTz+/2g5/P9lM/X/Wz7w/0hn8f82\r\n        kvb/ctb9//7+/////////////////////////////9f2/v8lyP//II/2/yK/928f1f8QAAAAAEEGow4l\r\n        C+P/aTr//2g5//9pOf//aDn//2k5//9pOf//aDn//2g5//9oOf//aDn//2g5//9oOf//aTr//2g4/f9j\r\n        PPr/T2T6/0WS/P/d9P//////////////////////////////////+f3//2fQ/v8hgvT/I7/2YSrX/wYA\r\n        AAAAQQajCSUL4/ZnOP//aDf//2g3//9oOP//Zzj//2g3//9oN///Zzf//2g3//9oOP//aDf//2g4//9o\r\n        N///aDf//2g4//9YWf//RX7//zWi//9Jzv//nOr/////////////3/f//3Th//8qy///MqX//yJt8fsi\r\n        v/ZHAAAAAAAAAABBBqMDJgvhrW0+//9nNv//Zzb//2g1//9nNv//aDb//2c2//9nNf//aDX//2c2//9n\r\n        Nv//aDb//2c1//9nNv//aDb//2FE//9RZ///Qof//zOk//8ovP//x/P///z+//9H2P//Jr7//zGo//84\r\n        hfz/I2HuySO99BoAAAAAAAAAAAAAAAApCtoVek38tWk1+vxnNP7/ZzT//2c0//9nNP//ZzT//2c0//9n\r\n        NP//ZzT//2c0//9nNP//ZzT//2c0//9nNP//ZzT//11K//9PaP//Q4L//zmX//9NsP//hcz//zOk//85\r\n        l///RYj//ihm8dAhl/Q8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/W/x8e1f9DH9X/XyDU/3Ef\r\n        0/94HtX/cyDT/2If1f9HI87/IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHZ/wUh\r\n        1v8eINb/LSHW/zMf1f8vJM//ISLW/wcAAAAAAAAAAAAAAAAAAAAAwAAAA4AAAAGAAAABgAAAAYAAAAGA\r\n        AAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGA\r\n        AAABgAAAAYAAAAGAAAAAgAAAAIAAAACAAAAAgAAAAYAAAAHAAAAD///wB///+A8oAAAAEAAAACAAAAAB\r\n        ACAAAAAAAEAEAAAAAAAAAAAAAAAAAAAAAAAAJQvjSnVC8udcJt//WSPc/1Uf2f9QGtf/TBfU/0cT0v9D\r\n        EM//Pw7N/zwLy/86Csv/OQrL/zkKy/9cLuTkJQvjSiUL4+Z2X/n/d3P+/3d0//93dP//eHX//3t4//+A\r\n        ff//h4X//5CN//+Ukv//kY7//4mG//+Bfv7/dGP2/zEa5+olC+P/d3P//313+f/a2M//+f2s/+voxP/A\r\n        teT/enP7/3d0//93dP//d3T//3d0//93dP//d3T//3dz//8lC+P/JQvj/3Vu/f/W1cH/1tHI/5B95P+M\r\n        eOr/uaf5/6+w/f91bv3/d3D//3Zw//92cf//d3H//3Zx//92cf//JQvj/yUL4/9yZfr/4tvU/4126P9s\r\n        VPD/a1Tw/4V28v/A3///cmX6/3Vs//91bP//dWz//3Vs//91bP//dWz//yUL4/8lC+P/b1z3/9HB8v+I\r\n        cPT/cV/5/3Fg+v9rUvH/ve///29c9/90Z///dGf//3Rn//90Z///c2b//3Rn//8lC+P/JQvj/25W9/+u\r\n        pPr/s7X8/4iB+/+Jh/3/laH5/7v7//9tVvf/cmH//3Jh//9yYf//cmH//3Nh//9yYf//JQvj/yUL4/9t\r\n        U/r/bk/w/6m6+v+97f//u/j//5as9/+7+f//mKz6/7v7//+7/P//ve///5yi/f9wWf7/cVv//yUL4/8l\r\n        C+P/blL9/2pK9/9mQe//ZT3s/2Y/7v9lPez/ve///5ah9/+Lj/X/cX3z/22o+f91zf7/d6r9/2le/v8l\r\n        C+P/JQvj/21N//9tS/3/akf6/2pF9/9pRfj/Zz/z/7/j//9jOOz/V2/2/yG6//8hvf//McP//yK9//8U\r\n        uv7/JVDu/yUL4/9rR///a0b//2xH//9rR///a0f//2c/9//C1P//dGH2/0Kq/v+b4f//5Pb//2/U///M\r\n        8P7/zPD+/y22/v8lC+P/a0H//2pB//9qQf//a0H//2pB//9mOvf/x7///36L+/9Dvf//Vs3/////////\r\n        ////9/3//3vX//8ywv//JQvj/2k7//9pPP//aTz//2k8//9pPP//Zjb4/6CC7v+huvj/PcT//7bq////\r\n        ///////////////Y9P7/LMH//yUL4/9nN///aDf//2c4//9nN///aDj//2U0+/9iLPD/gJzq/5zi///7\r\n        /v///////////////////P3//8rv/v8lC+PmbTr5/2c0/v9nNP//ZzT//2c0//9mM/7/ZC/4/2Av8P9L\r\n        pPv/Ssn//3zZ////////p+b//zbC//8xq/v8JQvjSXVC8eZcJ9//WSPd/1Uf2v9RG9f/TBbU/0cT0v9E\r\n        D87/QAzL/0E/2f9KwP3/y/D+/0nE/v9PdvDxJQ3jSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\r\n</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "App/Model/AutoBookmarkCondition.cs",
    "content": "﻿using System;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\nusing PowerJson;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic abstract class AutoBookmarkCondition : ICloneable\r\n\t{\r\n\t\t[XmlAttribute(Constants.AutoBookmark.IsInclusive)]\r\n\t\tpublic bool IsInclusive { get; set; }\r\n\r\n\t\tpublic abstract string Description { get; }\r\n\t\tpublic abstract string Name { get; }\r\n\r\n\t\tpublic abstract object Clone();\r\n\t\tinternal abstract AutoBookmarkFilter CreateFilter();\r\n\t\tinternal abstract bool IsTextLineFilter { get; }\r\n\r\n\t\t[JsonTypeAlias(ThisName)]\r\n\t\tpublic class MultiCondition : AutoBookmarkCondition\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"条件组\";\r\n\t\t\treadonly Collection<AutoBookmarkCondition> _Conditions = new Collection<AutoBookmarkCondition>();\r\n\r\n\t\t\t[XmlElement(FontNameCondition.ThisName, typeof(FontNameCondition))]\r\n\t\t\t[XmlElement(TextSizeCondition.ThisName, typeof(TextSizeCondition))]\r\n\t\t\t[XmlElement(PageRangeCondition.ThisName, typeof(PageRangeCondition))]\r\n\t\t\t[XmlElement(TextCondition.ThisName, typeof(TextCondition))]\r\n\t\t\t[JsonField(\"条件\")]\r\n\t\t\tpublic Collection<AutoBookmarkCondition> Conditions => _Conditions;\r\n\r\n\t\t\tpublic MultiCondition() { }\r\n\r\n\t\t\tpublic MultiCondition(AutoBookmarkCondition condition) {\r\n\t\t\t\tif (condition is MultiCondition m) {\r\n\t\t\t\t\tforeach (var item in m.Conditions) {\r\n\t\t\t\t\t\tConditions.Add(item.Clone() as AutoBookmarkCondition);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tConditions.Add(condition);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Description {\r\n\t\t\t\tget {\r\n\t\t\t\t\tvar s = new string[Conditions.Count];\r\n\t\t\t\t\tfor (int i = 0; i < s.Length; i++) {\r\n\t\t\t\t\t\ts[i] = _Conditions[i].Description;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn String.Join(\";\", s);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Name => \"多条件组合\";\r\n\r\n\t\t\tinternal override bool IsTextLineFilter {\r\n\t\t\t\tget {\r\n\t\t\t\t\tforeach (var item in Conditions) {\r\n\t\t\t\t\t\tif (item.IsTextLineFilter) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override object Clone() {\r\n\t\t\t\tvar m = new MultiCondition();\r\n\t\t\t\tforeach (var item in Conditions) {\r\n\t\t\t\t\tm.Conditions.Add(item.Clone() as AutoBookmarkCondition);\r\n\t\t\t\t}\r\n\t\t\t\treturn m;\r\n\t\t\t}\r\n\r\n\t\t\tinternal override AutoBookmarkFilter CreateFilter() {\r\n\t\t\t\treturn new MultiConditionFilter(this);\r\n\t\t\t}\r\n\t\t}\r\n\t\t[JsonTypeAlias(ThisName)]\r\n\t\tpublic class FontNameCondition : AutoBookmarkCondition\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"字体名称\";\r\n\t\t\t/// <summary>\r\n\t\t\t/// 需要调整级别的字体名称。\r\n\t\t\t/// </summary>\r\n\t\t\t[XmlAttribute(ThisName)]\r\n\t\t\tpublic string FontName { get; set; }\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// 是否匹配字体全名。\r\n\t\t\t/// </summary>\r\n\t\t\t[XmlAttribute(\"匹配字体全名\")]\r\n\t\t\tpublic bool MatchFullName { get; set; }\r\n\r\n\t\t\tpublic override string Description => String.Concat(ThisName, (MatchFullName ? \"为\" : \"包含\"), \"“\", FontName, \"”\");\r\n\r\n\t\t\tpublic override string Name => ThisName;\r\n\r\n\t\t\tinternal override bool IsTextLineFilter => false;\r\n\r\n\t\t\tpublic FontNameCondition() { }\r\n\r\n\t\t\tinternal FontNameCondition(string fontName, bool matchFullName) {\r\n\t\t\t\tFontName = fontName;\r\n\t\t\t\tMatchFullName = matchFullName;\r\n\t\t\t}\r\n\r\n\t\t\tinternal override AutoBookmarkFilter CreateFilter() {\r\n\t\t\t\treturn new FontNameFilter(FontName, MatchFullName);\r\n\t\t\t}\r\n\t\t\tpublic override object Clone() {\r\n\t\t\t\treturn new FontNameCondition(FontName, MatchFullName);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\t[JsonTypeAlias(ThisName)]\r\n\t\tpublic class TextSizeCondition : AutoBookmarkCondition\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"字体尺寸\";\r\n\t\t\tfloat _minSize, _maxSize;\r\n\t\t\tstring _description;\r\n\r\n\t\t\t[XmlAttribute(\"最小尺寸\")]\r\n\t\t\t[DefaultValue(0)]\r\n\t\t\tpublic float MinSize {\r\n\t\t\t\tget => _minSize;\r\n\t\t\t\tset {\r\n\t\t\t\t\t_minSize = value;\r\n\t\t\t\t\t_description = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t[XmlAttribute(\"最大尺寸\")]\r\n\t\t\t[DefaultValue(0)]\r\n\t\t\tpublic float MaxSize {\r\n\t\t\t\tget => _maxSize;\r\n\t\t\t\tset {\r\n\t\t\t\t\t_maxSize = value;\r\n\t\t\t\t\t_description = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Description {\r\n\t\t\t\tget {\r\n\t\t\t\t\tif (_description == null) {\r\n\t\t\t\t\t\tUpdateRangeDescription();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn _description;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpublic override string Name => ThisName;\r\n\r\n\t\t\tinternal override bool IsTextLineFilter => false;\r\n\r\n\t\t\tpublic TextSizeCondition() { }\r\n\r\n\t\t\tinternal TextSizeCondition(float size) {\r\n\t\t\t\tSetRange(size, size);\r\n\t\t\t}\r\n\r\n\t\t\tinternal TextSizeCondition(float minSize, float maxSize) {\r\n\t\t\t\tSetRange(minSize, maxSize);\r\n\t\t\t}\r\n\r\n\t\t\tprivate void UpdateRangeDescription() {\r\n\t\t\t\t_description = ThisName + (_minSize == _maxSize ? \"等于\" + _minSize.ToText() : \"介于\" + _minSize.ToText() + \"和\" + _maxSize.ToText());\r\n\t\t\t}\r\n\r\n\t\t\tpublic override object Clone() {\r\n\t\t\t\tvar f = new TextSizeCondition() { _minSize = _minSize, _maxSize = _maxSize };\r\n\t\t\t\tf.UpdateRangeDescription();\r\n\t\t\t\treturn f;\r\n\t\t\t}\r\n\r\n\t\t\tinternal void SetRange(float a, float b) {\r\n\t\t\t\tif (a > b) {\r\n\t\t\t\t\t_minSize = b;\r\n\t\t\t\t\t_maxSize = a;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_minSize = a;\r\n\t\t\t\t\t_maxSize = b;\r\n\t\t\t\t}\r\n\t\t\t\t_description = null;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tinternal override AutoBookmarkFilter CreateFilter() {\r\n\t\t\t\treturn new TextSizeFilter(_minSize, _maxSize);\r\n\t\t\t}\r\n\t\t}\r\n\t\t[JsonTypeAlias(ThisName)]\r\n\t\tpublic class TextPositionCondition : AutoBookmarkCondition\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"文本坐标\";\r\n\t\t\tbyte _position;\r\n\t\t\tfloat _minValue, _maxValue;\r\n\t\t\tstring _description;\r\n\r\n\t\t\t[XmlAttribute(\"坐标值\")]\r\n\t\t\t[DefaultValue(0)]\r\n\t\t\tpublic byte Position {\r\n\t\t\t\tget => _position;\r\n\t\t\t\tset {\r\n\t\t\t\t\t_position = value;\r\n\t\t\t\t\t_description = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t[XmlAttribute(\"坐标最小值\")]\r\n\t\t\t[DefaultValue(0)]\r\n\t\t\tpublic float MinValue {\r\n\t\t\t\tget => _minValue;\r\n\t\t\t\tset {\r\n\t\t\t\t\t_minValue = value;\r\n\t\t\t\t\t_description = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t[XmlAttribute(\"坐标最大值\")]\r\n\t\t\t[DefaultValue(0)]\r\n\t\t\tpublic float MaxValue {\r\n\t\t\t\tget => _maxValue;\r\n\t\t\t\tset {\r\n\t\t\t\t\t_maxValue = value;\r\n\t\t\t\t\t_description = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Description {\r\n\t\t\t\tget {\r\n\t\t\t\t\tif (_description == null) {\r\n\t\t\t\t\t\tUpdateRangeDescription();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn _description;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpublic override string Name => ThisName;\r\n\r\n\t\t\tinternal override bool IsTextLineFilter => false;\r\n\r\n\t\t\tpublic TextPositionCondition() { }\r\n\r\n\t\t\tinternal TextPositionCondition(byte position, float value) {\r\n\t\t\t\tSetRange(position, value, value);\r\n\t\t\t}\r\n\r\n\t\t\tinternal TextPositionCondition(byte position, float value1, float value2) {\r\n\t\t\t\tSetRange(position, value1, value2);\r\n\t\t\t}\r\n\r\n\t\t\tprivate void UpdateRangeDescription() {\r\n\t\t\t\t_description = String.Concat(ThisName,\r\n\t\t\t\t\t_position == 1 ? \"上\" : _position == 2 ? \"下\" : _position == 3 ? \"左\" : _position == 4 ? \"右\" : String.Empty,\r\n\t\t\t\t\t\"坐标\",\r\n\t\t\t\t\t_minValue == _maxValue\r\n\t\t\t\t\t\t? \"等于\" + ValueHelper.ToText(_minValue)\r\n\t\t\t\t\t\t: \"介于\" + ValueHelper.ToText(_minValue) + \"和\" + _maxValue\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tpublic override object Clone() {\r\n\t\t\t\tvar f = new TextPositionCondition() {\r\n\t\t\t\t\t_position = _position,\r\n\t\t\t\t\t_minValue = _minValue,\r\n\t\t\t\t\t_maxValue = _maxValue\r\n\t\t\t\t};\r\n\t\t\t\tf.UpdateRangeDescription();\r\n\t\t\t\treturn f;\r\n\t\t\t}\r\n\r\n\t\t\tinternal void SetRange(byte position, float value1, float value2) {\r\n\t\t\t\t_position = position;\r\n\t\t\t\tif (value1 > value2) {\r\n\t\t\t\t\t_minValue = value2;\r\n\t\t\t\t\t_maxValue = value1;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_minValue = value1;\r\n\t\t\t\t\t_maxValue = value2;\r\n\t\t\t\t}\r\n\t\t\t\t_description = null;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tinternal override AutoBookmarkFilter CreateFilter() {\r\n\t\t\t\treturn new TextPositionFilter(_position, _minValue, _maxValue);\r\n\t\t\t}\r\n\t\t}\r\n\t\t[JsonTypeAlias(ThisName)]\r\n\t\tpublic class PageRangeCondition : AutoBookmarkCondition\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"页码范围\";\r\n\r\n\t\t\t[XmlAttribute(ThisName)]\r\n\t\t\tpublic string PageRange { get; set; }\r\n\r\n\t\t\tpublic override string Description => \"页码范围为“\" + PageRange + \"”\";\r\n\r\n\t\t\tpublic override string Name => ThisName;\r\n\r\n\t\t\tinternal override bool IsTextLineFilter => false;\r\n\r\n\t\t\tpublic override object Clone() {\r\n\t\t\t\treturn new PageRangeCondition() { PageRange = PageRange };\r\n\t\t\t}\r\n\r\n\t\t\tinternal override AutoBookmarkFilter CreateFilter() {\r\n\t\t\t\treturn new PageRangeFilter(PageRange);\r\n\t\t\t}\r\n\t\t}\r\n\t\t[JsonTypeAlias(ThisName)]\r\n\t\tpublic class TextCondition : AutoBookmarkCondition\r\n\t\t{\r\n\t\t\tinternal const string ThisName = \"文本内容\";\r\n\r\n\t\t\t[XmlElement(\"文本模式\")]\r\n\t\t\tpublic MatchPattern Pattern { get; set; }\r\n\r\n\t\t\tpublic override string Description => String.Concat(ThisName,\r\n\t\t\t\t\tPattern.MatchCase ? \"区分大小写\" : String.Empty,\r\n\t\t\t\t\tPattern.FullMatch ? \"完全匹配\" : \"符合\",\r\n\t\t\t\t\tPattern.UseRegularExpression ? \"正则表达式\" : String.Empty,\r\n\t\t\t\t\tPattern.Text);\r\n\r\n\t\t\tpublic override string Name => ThisName;\r\n\r\n\t\t\tinternal override bool IsTextLineFilter => true;\r\n\r\n\t\t\tpublic override object Clone() {\r\n\t\t\t\treturn new TextCondition(Pattern);\r\n\t\t\t}\r\n\r\n\t\t\tinternal override AutoBookmarkFilter CreateFilter() {\r\n\t\t\t\treturn new TextFilter(Pattern);\r\n\t\t\t}\r\n\r\n\t\t\tpublic TextCondition() {\r\n\t\t\t\tPattern = new MatchPattern();\r\n\t\t\t}\r\n\t\t\tprivate TextCondition(MatchPattern pattern) {\r\n\t\t\t\tPattern = pattern.Clone() as MatchPattern;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/AutoBookmarkContext.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tsealed class AutoBookmarkContext\r\n\t{\r\n\t\tinternal int CurrentPageNumber { get; set; }\r\n\t\tinternal int TotalPageNumber { get; set; }\r\n\t\tinternal bool IsTextMerged { get; set; }\r\n\t\tinternal TextInfo TextInfo { get; set; }\r\n\t\tinternal TextLine TextLine { get; set; }\r\n\t\tinternal iTextSharp.text.Rectangle PageBox { get; set; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/BookmarkSettings.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Xml;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t/// <summary>\r\n\t/// 在合并文件功能中使用的书签设置。\r\n\t/// </summary>\r\n\tpublic class BookmarkSettings : ICloneable, IXmlSerializable\r\n\t{\r\n\t\tpublic string Title { get; set; }\r\n\t\tpublic bool IsBold { get; set; }\r\n\t\tpublic bool IsItalic { get; set; }\r\n\t\tpublic bool IsOpened { get; set; }\r\n\t\tpublic bool GoToTop { get; set; }\r\n\t\tpublic Color ForeColor { get; set; }\r\n\r\n\t\tpublic BookmarkSettings() {\r\n\t\t\tForeColor = Color.Transparent;\r\n\t\t}\r\n\r\n\t\tpublic BookmarkSettings(string title) {\r\n\t\t\tTitle = title;\r\n\t\t}\r\n\r\n\t\tpublic BookmarkSettings Clone() {\r\n\t\t\treturn (BookmarkSettings)MemberwiseClone();\r\n\t\t}\r\n\r\n\t\tpublic BookmarkSettings(BookmarkElement element) {\r\n\t\t\tTitle = element.Title;\r\n\t\t\tIsBold = (element.TextStyle & FontStyle.Bold) == FontStyle.Bold;\r\n\t\t\tIsItalic = (element.TextStyle & FontStyle.Italic) == FontStyle.Italic;\r\n\t\t\tIsOpened = element.IsOpen;\r\n\t\t\tForeColor = element.ForeColor;\r\n\t\t}\r\n\r\n\t\t#region ICloneable 成员\r\n\r\n\t\tobject ICloneable.Clone() {\r\n\t\t\treturn Clone();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IXmlSerializable 成员\r\n\r\n\t\tpublic System.Xml.Schema.XmlSchema GetSchema() {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tpublic void ReadXml(XmlReader reader) {\r\n\t\t\tif (reader.Read() == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tTitle = reader.GetAttribute(\"title\");\r\n\t\t\tIsBold = reader.GetValue(\"bold\", false);\r\n\t\t\tIsItalic = reader.GetValue(\"italic\", false);\r\n\t\t\tIsOpened = reader.GetValue(\"opened\", false);\r\n\t\t\tGoToTop = reader.GetValue(\"goToTop\", false);\r\n\t\t\tstring c = reader.GetAttribute(\"color\");\r\n\t\t\tForeColor = c is null ? Color.Transparent : Color.FromArgb(c.ToInt32());\r\n\t\t}\r\n\r\n\t\tpublic void WriteXml(XmlWriter writer) {\r\n\t\t\twriter.WriteStartElement(\"bookmark\");\r\n\t\t\twriter.WriteValue(\"title\", Title, null);\r\n\t\t\twriter.WriteValue(\"bold\", IsBold, false);\r\n\t\t\twriter.WriteValue(\"italic\", IsItalic, false);\r\n\t\t\twriter.WriteValue(\"opened\", IsOpened, false);\r\n\t\t\twriter.WriteValue(\"goToTop\", GoToTop, false);\r\n\t\t\twriter.WriteValue(\"color\", ForeColor.ToArgb(), Color.Transparent.ToArgb());\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/BookmarkStatus.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic enum BookmarkStatus\r\n\t{\r\n\t\t[XmlEnum(\"保持不变\")]\r\n\t\tAsIs,\r\n\t\t[XmlEnum(\"全部关闭\")]\r\n\t\tCollapseAll,\r\n\t\t[XmlEnum(\"全部打开\")]\r\n\t\tExpandAll,\r\n\t\t[XmlEnum(\"打开首层\")]\r\n\t\tExpandTop\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/Bound.cs",
    "content": "﻿using System;\r\nusing System.Diagnostics;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[DebuggerDisplay(\"T={Top},L={Left},B={Bottom},R={Right}; H={Height},W={Width}\")]\r\n\tpublic class Bound\r\n\t{\r\n\t\tinternal float Top { get; private set; }\r\n\t\tinternal float Left { get; private set; }\r\n\t\tinternal float Bottom { get; private set; }\r\n\t\tinternal float Right { get; private set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取此区域坐标是否属于笛卡尔坐标系。\r\n\t\t/// </summary>\r\n\t\tinternal bool IsTopUp { get; private set; }\r\n\t\t/// <summary>\r\n\t\t/// 获取此坐标区域是否属于绘图坐标系。\r\n\t\t/// </summary>\r\n\t\tinternal bool IsTopDown { get; private set; }\r\n\r\n\t\tinternal float Height { get; private set; }\r\n\t\tinternal float Width { get; private set; }\r\n\r\n\t\tinternal float Middle { get; private set; }\r\n\t\tinternal float Center { get; private set; }\r\n\r\n\t\tprivate Bound() {\r\n\t\t\tIsTopDown = true;\r\n\t\t\tIsTopUp = true;\r\n\t\t}\r\n\r\n\t\tpublic Bound(float left, float bottom, float right, float top) {\r\n\t\t\tif (right < left) {\r\n\t\t\t\tDebug.WriteLine(\"右端坐标不能小于左端坐标。\");\r\n\t\t\t\tvar t = right;\r\n\t\t\t\tright = left;\r\n\t\t\t\tleft = t;\r\n\t\t\t}\r\n\t\t\tLeft = left;\r\n\t\t\tBottom = bottom;\r\n\t\t\tRight = right;\r\n\t\t\tTop = top;\r\n\t\t\tRecalculateSize();\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 创建宽度和高度均为 0 的区域（点）实例。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"x\">横坐标。</param>\r\n\t\t/// <param name=\"y\">纵坐标。</param>\r\n\t\tpublic Bound(float x, float y) : this(x, y, x, y) {\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 从指定区域复制副本。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"source\">需要复制副本的区域。</param>\r\n\t\tpublic Bound(Bound source) : this(source.Left, source.Bottom, source.Right, source.Top) {\r\n\t\t}\r\n\r\n\t\tprivate void RecalculateSize() {\r\n\t\t\tIsTopUp = Top >= Bottom;\r\n\t\t\tIsTopDown = Top <= Bottom;\r\n\t\t\tHeight = IsTopUp ? Top - Bottom : Bottom - Top;\r\n\t\t\tMiddle = (Top + Bottom) / 2;\r\n\t\t\tWidth = Right - Left;\r\n\t\t\tCenter = (Left + Right) / 2;\r\n\t\t}\r\n\r\n\t\tinternal Bound Merge(Bound source) {\r\n\t\t\t// 笛卡尔坐标\r\n\t\t\tif (IsTopUp) {\r\n\t\t\t\tif (Top < source.Top) {\r\n\t\t\t\t\tTop = source.Top;\r\n\t\t\t\t}\r\n\t\t\t\tif (Bottom > source.Bottom) {\r\n\t\t\t\t\tBottom = source.Bottom;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (Top > source.Top) {\r\n\t\t\t\t\tTop = source.Top;\r\n\t\t\t\t}\r\n\t\t\t\tif (Bottom < source.Bottom) {\r\n\t\t\t\t\tBottom = source.Bottom;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (Left > source.Left) {\r\n\t\t\t\tLeft = source.Left;\r\n\t\t\t}\r\n\t\t\tif (Right < source.Right) {\r\n\t\t\t\tRight = source.Right;\r\n\t\t\t}\r\n\t\t\tRecalculateSize();\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取区域 <paramref name=\"other\"/> 到当前区域之间的距离。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"other\">另一个区域。</param>\r\n\t\t/// <param name=\"writingDirection\">假设书写方向。</param>\r\n\t\t/// <returns><paramref name=\"other\"/> 相对于此区域的距离关系。</returns>\r\n\t\tinternal DistanceInfo GetDistance(Bound other, WritingDirection writingDirection) {\r\n\t\t\tif (IsTopDown != other.IsTopDown && IsTopUp != other.IsTopUp) {\r\n\t\t\t\tthrow new ArgumentException(\"区域坐标系不同。\");\r\n\t\t\t}\r\n\r\n\t\t\tfloat hd = float.MaxValue, vd = float.MaxValue;\r\n\t\t\tvar hp = DistanceInfo.Placement.Unknown;\r\n\t\t\tvar vp = DistanceInfo.Placement.Unknown;\r\n\t\t\tfloat au, ad, bu, bd;\r\n\t\t\tif (IsTopDown) {\r\n\t\t\t\tau = Top;\r\n\t\t\t\tad = Bottom;\r\n\t\t\t\tbu = other.Top;\r\n\t\t\t\tbd = other.Bottom;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tau = -Top;\r\n\t\t\t\tad = -Bottom;\r\n\t\t\t\tbu = -other.Top;\r\n\t\t\t\tbd = -other.Bottom;\r\n\t\t\t}\r\n\r\n\t\t\tbool ov = false;\r\n\t\t\tif (IntersectWith(other)) {\r\n\t\t\t\tov = true;\r\n\t\t\t\thd = other.Center - Center;\r\n\t\t\t\tif (hd > 0) {\r\n\t\t\t\t\thp = DistanceInfo.Placement.Right;\r\n\t\t\t\t}\r\n\t\t\t\telse if (hd < 0) {\r\n\t\t\t\t\thp = DistanceInfo.Placement.Left;\r\n\t\t\t\t\thd = -hd;\r\n\t\t\t\t}\r\n\t\t\t\tvd = other.Middle - Middle;\r\n\t\t\t\tif (vd > 0) {\r\n\t\t\t\t\tvp = IsTopUp ? DistanceInfo.Placement.Up : DistanceInfo.Placement.Down;\r\n\t\t\t\t}\r\n\t\t\t\telse if (vd < 0) {\r\n\t\t\t\t\tvp = IsTopUp ? DistanceInfo.Placement.Down : DistanceInfo.Placement.Up;\r\n\t\t\t\t}\r\n\t\t\t\tif (vd == 0 && hd == 0) {\r\n\t\t\t\t\treturn new DistanceInfo(DistanceInfo.Placement.Overlapping, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\telse if (vd == 0) {\r\n\t\t\t\t\treturn new DistanceInfo(DistanceInfo.Placement.Overlapping | hp, hd, vd);\r\n\t\t\t\t}\r\n\t\t\t\telse if (hp == 0) {\r\n\t\t\t\t\treturn new DistanceInfo(DistanceInfo.Placement.Overlapping | vp, hd, vd);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn new DistanceInfo(DistanceInfo.Placement.Overlapping, hd, vd);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (other.Left >= Right) {\r\n\t\t\t\thp = DistanceInfo.Placement.Right;\r\n\t\t\t\thd = other.Left - Right;\r\n\t\t\t}\r\n\t\t\telse if (other.Right <= Left) {\r\n\t\t\t\thp = DistanceInfo.Placement.Left;\r\n\t\t\t\thd = Left - other.Right;\r\n\t\t\t}\r\n\t\t\tif (bd <= au) {\r\n\t\t\t\tvp = DistanceInfo.Placement.Up;\r\n\t\t\t\tvd = au - bd;\r\n\t\t\t}\r\n\t\t\telse if (bu >= ad) {\r\n\t\t\t\tvp = DistanceInfo.Placement.Down;\r\n\t\t\t\tvd = bu - ad;\r\n\t\t\t}\r\n\t\t\tif (hp == DistanceInfo.Placement.Unknown && vp == DistanceInfo.Placement.Unknown) {\r\n\t\t\t\tthrow new ArgumentOutOfRangeException(\"位置错误。\");\r\n\t\t\t}\r\n\t\t\tvar v = new DistanceInfo(ov ? DistanceInfo.Placement.Overlapping | vp : vp, hd, vd);\r\n\t\t\tvar h = new DistanceInfo(ov ? DistanceInfo.Placement.Overlapping | hp : hp, hd, vd);\r\n\t\t\treturn writingDirection switch {\r\n\t\t\t\tWritingDirection.Vertical => hp != DistanceInfo.Placement.Unknown ? h : v,\r\n\t\t\t\tWritingDirection.Horizontal => vp != DistanceInfo.Placement.Unknown ? v : h,\r\n\t\t\t\t_ => (hd < vd) ? h : v\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 返回当前区域是否和指定区域在同一行上（中心点是否落在 <paramref name=\"other\"/> 的两个边缘之间）。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"other\">需要比较的区域。</param>\r\n\t\t/// <param name=\"direction\">比较方向。</param>\r\n\t\t/// <returns>在同一行上时返回 true。</returns>\r\n\t\tinternal bool IsAlignedWith(Bound other, WritingDirection direction) {\r\n\t\t\treturn direction switch {\r\n\t\t\t\tWritingDirection.Horizontal => IsTopDown\r\n\t\t\t\t\t? (other.Top < Middle && Middle < other.Bottom || Top < other.Middle && other.Middle < Bottom)\r\n\t\t\t\t\t: (other.Bottom < Middle && Middle < other.Top || Bottom < other.Middle && other.Middle < Top),\r\n\t\t\t\tWritingDirection.Vertical => other.Left < Center && Center < other.Right\r\n\t\t\t\t\t\t|| Left < other.Center && other.Center < Right,\r\n\t\t\t\t_ => IntersectWith(other),\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal bool IntersectWith(Bound other) {\r\n\t\t\treturn other.Left < Right && Left < other.Right &&\r\n\t\t\t\t(IsTopDown\r\n\t\t\t\t\t? (other.Top < Bottom && Top < other.Bottom)\r\n\t\t\t\t\t: (other.Bottom < Top && Bottom < other.Top));\r\n\t\t}\r\n\r\n\t\tinternal bool Contains(float x, float y) {\r\n\t\t\tfloat x1, x2, y1, y2;\r\n\t\t\tx1 = Left;\r\n\t\t\tx2 = Right;\r\n\t\t\tif (IsTopUp) {\r\n\t\t\t\ty1 = Bottom;\r\n\t\t\t\ty2 = Top;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ty1 = Top;\r\n\t\t\t\ty2 = Bottom;\r\n\t\t\t}\r\n\t\t\treturn x1 <= x && x <= x2 && y1 <= y && y <= y2;\r\n\t\t}\r\n\r\n\t\tpublic static bool operator ==(Bound a, Bound b) {\r\n\t\t\treturn a.Top == b.Top && a.Bottom == b.Bottom && a.Left == b.Left && a.Right == b.Right;\r\n\t\t}\r\n\t\tpublic static bool operator !=(Bound a, Bound b) {\r\n\t\t\treturn a.Top != b.Top || a.Bottom != b.Bottom || a.Left != b.Left || a.Right != b.Right;\r\n\t\t}\r\n\t\tpublic override bool Equals(object obj) {\r\n\t\t\treturn this == (Bound)obj;\r\n\t\t}\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn Top.GetHashCode() ^ Bottom.GetHashCode() ^ Left.GetHashCode() ^ Right.GetHashCode();\r\n\t\t}\r\n\t\tpublic static implicit operator System.Drawing.RectangleF(Bound bound) {\r\n\t\t\treturn new System.Drawing.RectangleF(Math.Min(bound.Left, bound.Right), Math.Min(bound.Top, bound.Bottom), Math.Abs(bound.Left - bound.Right), Math.Abs(bound.Top - bound.Bottom));\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/CIELab.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define CIE L*a*b*.\r\n\t/// </summary>\r\n\tpublic struct CIELab\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty CIELab structure.\r\n\t\t/// </summary>\r\n\t\tpublic static readonly CIELab Empty = new CIELab();\r\n\r\n\t\t#region Fields\r\n\t\tprivate double l;\r\n\t\tprivate double a;\r\n\t\tprivate double b;\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(CIELab item1, CIELab item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.L == item2.L\r\n\t\t\t\t&& item1.A == item2.A\r\n\t\t\t\t&& item1.B == item2.B\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(CIELab item1, CIELab item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.L != item2.L\r\n\t\t\t\t|| item1.A != item2.A\r\n\t\t\t\t|| item1.B != item2.B\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets L component.\r\n\t\t/// </summary>\r\n\t\tpublic double L {\r\n\t\t\tget => l;\r\n\t\t\tset => l = value;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets a component.\r\n\t\t/// </summary>\r\n\t\tpublic double A {\r\n\t\t\tget => a;\r\n\t\t\tset => a = value;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets a component.\r\n\t\t/// </summary>\r\n\t\tpublic double B {\r\n\t\t\tget => b;\r\n\t\t\tset => b = value;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tpublic CIELab(double l, double a, double b) {\r\n\t\t\tthis.l = l;\r\n\t\t\tthis.a = a;\r\n\t\t\tthis.b = b;\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (CIELab)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn L.GetHashCode() ^ a.GetHashCode() ^ b.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/CIEXYZ.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define CIE XYZ.\r\n\t/// </summary>\r\n\tpublic struct CIEXYZ\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty CIEXYZ structure.\r\n\t\t/// </summary>\r\n\t\tpublic static readonly CIEXYZ Empty = new CIEXYZ();\r\n\t\t/// <summary>\r\n\t\t/// Gets the CIE D65 (white) structure.\r\n\t\t/// </summary>\r\n\t\tpublic static readonly CIEXYZ D65 = new CIEXYZ(0.9505, 1.0, 1.0890);\r\n\r\n\t\t#region Fields\r\n\t\tprivate double x;\r\n\t\tprivate double y;\r\n\t\tprivate double z;\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(CIEXYZ item1, CIEXYZ item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.X == item2.X\r\n\t\t\t\t&& item1.Y == item2.Y\r\n\t\t\t\t&& item1.Z == item2.Z\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(CIEXYZ item1, CIEXYZ item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.X != item2.X\r\n\t\t\t\t|| item1.Y != item2.Y\r\n\t\t\t\t|| item1.Z != item2.Z\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets X component.\r\n\t\t/// </summary>\r\n\t\tpublic double X {\r\n\t\t\tget => x;\r\n\t\t\tset => x = (value > 0.9505) ? 0.9505 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets Y component.\r\n\t\t/// </summary>\r\n\t\tpublic double Y {\r\n\t\t\tget => y;\r\n\t\t\tset => y = (value > 1.0) ? 1.0 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets Z component.\r\n\t\t/// </summary>\r\n\t\tpublic double Z {\r\n\t\t\tget => z;\r\n\t\t\tset => z = (value > 1.089) ? 1.089 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tpublic CIEXYZ(double x, double y, double z) {\r\n\t\t\tthis.x = (x > 0.9505) ? 0.9505 : ((x < 0) ? 0 : x);\r\n\t\t\tthis.y = (y > 1.0) ? 1.0 : ((y < 0) ? 0 : y);\r\n\t\t\tthis.z = (z > 1.089) ? 1.089 : ((z < 0) ? 0 : z);\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (CIEXYZ)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/CMYK.cs",
    "content": "﻿using System;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define CMYK.\r\n\t/// </summary>\r\n\tpublic struct CMYK\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty CMYK structure;\r\n\t\t/// </summary>\r\n\t\tpublic readonly static CMYK Empty = new CMYK();\r\n\r\n\t\t#region Fields\r\n\t\tprivate double c;\r\n\t\tprivate double m;\r\n\t\tprivate double y;\r\n\t\tprivate double k;\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(CMYK item1, CMYK item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Cyan == item2.Cyan\r\n\t\t\t\t&& item1.Magenta == item2.Magenta\r\n\t\t\t\t&& item1.Yellow == item2.Yellow\r\n\t\t\t\t&& item1.Black == item2.Black\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(CMYK item1, CMYK item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Cyan != item2.Cyan\r\n\t\t\t\t|| item1.Magenta != item2.Magenta\r\n\t\t\t\t|| item1.Yellow != item2.Yellow\r\n\t\t\t\t|| item1.Black != item2.Black\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\tpublic double Cyan {\r\n\t\t\tget => c;\r\n\t\t\tset {\r\n\t\t\t\tc = value;\r\n\t\t\t\tc = (c > 1) ? 1 : ((c < 0) ? 0 : c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic double Magenta {\r\n\t\t\tget => m;\r\n\t\t\tset {\r\n\t\t\t\tm = value;\r\n\t\t\t\tm = (m > 1) ? 1 : ((m < 0) ? 0 : m);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic double Yellow {\r\n\t\t\tget => y;\r\n\t\t\tset {\r\n\t\t\t\ty = value;\r\n\t\t\t\ty = (y > 1) ? 1 : ((y < 0) ? 0 : y);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic double Black {\r\n\t\t\tget => k;\r\n\t\t\tset {\r\n\t\t\t\tk = value;\r\n\t\t\t\tk = (k > 1) ? 1 : ((k < 0) ? 0 : k);\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates an instance of a CMYK structure.\r\n\t\t/// </summary>\r\n\t\tpublic CMYK(double c, double m, double y, double k) {\r\n\t\t\tthis.c = c;\r\n\t\t\tthis.m = m;\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.k = k;\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (CMYK)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn Cyan.GetHashCode() ^ Magenta.GetHashCode() ^ Yellow.GetHashCode() ^ Black.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/ColorSpaceHelper.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Provides methods to convert from a color space to an other.\r\n\t/// </summary>\r\n\tpublic static class ColorSpaceHelper\r\n\t{\r\n\t\t#region Color processing\r\n\t\t/// <summary>\r\n\t\t/// Gets the \"distance\" between two colors.\r\n\t\t/// RGB colors must be normalized (eg. values in [0.0, 1.0]).\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"r1\">First color red component.</param>\r\n\t\t/// <param name=\"g1\">First color green component.</param>\r\n\t\t/// <param name=\"b1\">First color blue component.</param>\r\n\t\t/// <param name=\"r2\">Second color red component.</param>\r\n\t\t/// <param name=\"g2\">Second color green component.</param>\r\n\t\t/// <param name=\"b2\">Second color blue component.</param>\r\n\t\tpublic static double GetColorDistance(double r1, double g1, double b1, double r2, double g2, double b2) {\r\n\t\t\tdouble a = r2 - r1;\r\n\t\t\tdouble b = g2 - g1;\r\n\t\t\tdouble c = b2 - b1;\r\n\r\n\t\t\treturn Math.Sqrt(a * a + b * b + c * c);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets the \"distance\" between two colors.\r\n\t\t/// RGB colors must be normalized (eg. values in [0.0, 1.0]).\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"color1\">First color [r,g,b]</param>\r\n\t\t/// <param name=\"color2\">Second color [r,g,b]</param>\r\n\t\tpublic static double GetColorDistance(double[] color1, double[] color2) {\r\n\t\t\treturn GetColorDistance(color1[0], color1[1], color1[2], color2[0], color2[1], color2[2]);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets the \"distance\" between two colors.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"color1\">First color.</param>\r\n\t\t/// <param name=\"color2\">Second color.</param>\r\n\t\tpublic static double GetColorDistance(Color c1, Color c2) {\r\n\t\t\tvar rgb1 = new double[]{\r\n\t\t\t\t\t\t\t\t\t\t\t(double)c1.R/255.0,\r\n\t\t\t\t\t\t\t\t\t\t\t(double)c1.G/255.0,\r\n\t\t\t\t\t\t\t\t\t\t\t(double)c1.B/255.0\r\n\t\t\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\tvar rgb2 = new double[]{\r\n\t\t\t\t\t\t\t\t\t\t\t(double)c2.R/255.0,\r\n\t\t\t\t\t\t\t\t\t\t\t(double)c2.G/255.0,\r\n\t\t\t\t\t\t\t\t\t\t\t(double)c2.B/255.0\r\n\t\t\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\treturn GetColorDistance(rgb1[0], rgb1[1], rgb1[2], rgb2[0], rgb2[1], rgb2[2]);\r\n\t\t}\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Light Spectrum processing\r\n\t\t/// <summary>\r\n\t\t/// Gets visible colors (color wheel).\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"alpha\">\r\n\t\t/// The alpha value used for each colors.\r\n\t\t/// </param>\r\n\t\tpublic static Color[] GetWheelColors(int alpha) {\r\n\t\t\tColor temp;\r\n\t\t\tint colorCount = 6 * 256;\r\n\t\t\tvar colors = new Color[colorCount];\r\n\r\n\t\t\tfor (int i = 0; i < colorCount; i++) {\r\n\t\t\t\ttemp = HSBtoColor((int)((double)(i * 255.0) / colorCount), 255, 255);\r\n\t\t\t\tcolors[i] = Color.FromArgb(alpha, temp.R, temp.G, temp.B);\r\n\t\t\t}\r\n\r\n\t\t\treturn colors;\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets visible spectrum colors.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"alpha\">The alpha value used for each colors.</param>\r\n\t\tpublic static Color[] GetSpectrumColors(int alpha) {\r\n\t\t\tvar colors = new Color[256 * 6];\r\n\t\t\t//for(int i=127; i<256; i++) colors[i-127] = Color.FromArgb(alpha, i, 0, 0);\r\n\t\t\tfor (int i = 0; i < 256; i++) colors[i] = Color.FromArgb(alpha, 255, i, 0);\r\n\t\t\tfor (int i = 0; i < 256; i++) colors[i + (256)] = Color.FromArgb(alpha, 255 - i, 255, 0);\r\n\t\t\tfor (int i = 0; i < 256; i++) colors[i + (256 * 2)] = Color.FromArgb(alpha, 0, 255, i);\r\n\t\t\tfor (int i = 0; i < 256; i++) colors[i + (256 * 3)] = Color.FromArgb(alpha, 0, 255 - i, 255);\r\n\t\t\tfor (int i = 0; i < 256; i++) colors[i + (256 * 4)] = Color.FromArgb(alpha, i, 0, 255);\r\n\t\t\tfor (int i = 0; i < 256; i++) colors[i + (256 * 5)] = Color.FromArgb(alpha, 255, 0, 255 - i);\r\n\t\t\t//for(int i=0; i<128; i++) colors[i+(128+256*6)] = Color.FromArgb(alpha, 255-i, 0, 0);\r\n\r\n\t\t\treturn colors;\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets visible spectrum colors.\r\n\t\t/// </summary>\r\n\t\tpublic static Color[] GetSpectrumColors() {\r\n\t\t\treturn GetSpectrumColors(255);\r\n\t\t}\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Hexa convert\r\n\t\t/// <summary>\r\n\t\t/// Gets the int equivalent for a hexadecimal value.\r\n\t\t/// </summary>\r\n\t\tprivate static int GetIntFromHex(string strHex) {\r\n\t\t\tswitch (strHex) {\r\n\t\t\t\tcase (\"A\"): {\r\n\t\t\t\t\t\treturn 10;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase (\"B\"): {\r\n\t\t\t\t\t\treturn 11;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase (\"C\"): {\r\n\t\t\t\t\t\treturn 12;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase (\"D\"): {\r\n\t\t\t\t\t\treturn 13;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase (\"E\"): {\r\n\t\t\t\t\t\treturn 14;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase (\"F\"): {\r\n\t\t\t\t\t\treturn 15;\r\n\t\t\t\t\t}\r\n\t\t\t\tdefault: {\r\n\t\t\t\t\t\treturn int.Parse(strHex);\r\n\t\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts a Hex color to a .net Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"hexColor\">The desired hexadecimal color to convert.</param>\r\n\t\tpublic static Color HexToColor(string hexColor) {\r\n\t\t\tstring r, g, b;\r\n\r\n\t\t\tif (hexColor == String.Empty) {\r\n\t\t\t\treturn Color.Empty;\r\n\t\t\t}\r\n\r\n\t\t\thexColor = hexColor.Trim();\r\n\t\t\tif (hexColor[0] == '#') hexColor = hexColor.Substring(1, hexColor.Length - 1);\r\n\r\n\t\t\tr = hexColor.Substring(0, 2);\r\n\t\t\tg = hexColor.Substring(2, 2);\r\n\t\t\tb = hexColor.Substring(4, 2);\r\n\r\n\t\t\tr = Convert.ToString(16 * GetIntFromHex(r.Substring(0, 1)) + GetIntFromHex(r.Substring(1, 1)));\r\n\t\t\tg = Convert.ToString(16 * GetIntFromHex(g.Substring(0, 1)) + GetIntFromHex(g.Substring(1, 1)));\r\n\t\t\tb = Convert.ToString(16 * GetIntFromHex(b.Substring(0, 1)) + GetIntFromHex(b.Substring(1, 1)));\r\n\r\n\t\t\treturn Color.FromArgb(Convert.ToInt32(r), Convert.ToInt32(g), Convert.ToInt32(b));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts a RGB color format to an hexadecimal color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"r\">The Red value.</param>\r\n\t\t/// <param name=\"g\">The Green value.</param>\r\n\t\t/// <param name=\"b\">The Blue value.</param>\r\n\t\tpublic static string RGBToHex(int r, int g, int b) {\r\n\t\t\treturn String.Format(\"#{0:x2}{1:x2}{2:x2}\", (int)r, (int)g, (int)b);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts a RGB color format to an hexadecimal color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"r\">The color to convert.</param>\r\n\t\tpublic static string RGBToHex(Color c) {\r\n\t\t\treturn RGBToHex(c.R, c.G, c.B);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region HSB convert\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"hsv\">The HSB structure to convert.</param>\r\n\t\tpublic static RGB HSBtoRGB(HSB hsb) {\r\n\t\t\tdouble r = 0;\r\n\t\t\tdouble g = 0;\r\n\t\t\tdouble b = 0;\r\n\r\n\t\t\tif (hsb.Saturation == 0) {\r\n\t\t\t\tr = g = b = hsb.Brightness;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// the color wheel consists of 6 sectors. Figure out which sector you're in.\r\n\t\t\t\tdouble sectorPos = hsb.Hue / 60.0;\r\n\t\t\t\tint sectorNumber = (int)(Math.Floor(sectorPos));\r\n\t\t\t\t// get the fractional part of the sector\r\n\t\t\t\tdouble fractionalSector = sectorPos - sectorNumber;\r\n\r\n\t\t\t\t// calculate values for the three axes of the color. \r\n\t\t\t\tdouble p = hsb.Brightness * (1.0 - hsb.Saturation);\r\n\t\t\t\tdouble q = hsb.Brightness * (1.0 - (hsb.Saturation * fractionalSector));\r\n\t\t\t\tdouble t = hsb.Brightness * (1.0 - (hsb.Saturation * (1 - fractionalSector)));\r\n\r\n\t\t\t\t// assign the fractional colors to r, g, and b based on the sector the angle is in.\r\n\t\t\t\tswitch (sectorNumber) {\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tr = hsb.Brightness;\r\n\t\t\t\t\t\tg = t;\r\n\t\t\t\t\t\tb = p;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\tr = q;\r\n\t\t\t\t\t\tg = hsb.Brightness;\r\n\t\t\t\t\t\tb = p;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tr = p;\r\n\t\t\t\t\t\tg = hsb.Brightness;\r\n\t\t\t\t\t\tb = t;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\tr = p;\r\n\t\t\t\t\t\tg = q;\r\n\t\t\t\t\t\tb = hsb.Brightness;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\tr = t;\r\n\t\t\t\t\t\tg = p;\r\n\t\t\t\t\t\tb = hsb.Brightness;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\tr = hsb.Brightness;\r\n\t\t\t\t\t\tg = p;\r\n\t\t\t\t\t\tb = q;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn new RGB(\r\n\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", r * 255.0))),\r\n\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", g * 255.0))),\r\n\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", b * 255.0)))\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"h\">Hue value.</param>\r\n\t\t/// <param name=\"s\">Saturation value.</param>\r\n\t\t/// <param name=\"b\">Brigthness value.</param>\r\n\t\tpublic static RGB HSBtoRGB(double h, double s, double b) {\r\n\t\t\treturn HSBtoRGB(new HSB(h, s, b));\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"hsb\">the HSB structure to convert.</param>\r\n\t\tpublic static Color HSBtoColor(HSB hsb) {\r\n\t\t\tvar rgb = HSBtoRGB(hsb);\r\n\r\n\t\t\treturn Color.FromArgb(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary> \r\n\t\t/// Converts HSB to a .net Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"h\">Hue value (must be between 0 and 360).</param>\r\n\t\t/// <param name=\"s\">Saturation value (must be between 0 and 1).</param>\r\n\t\t/// <param name=\"b\">Brightness value (must be between 0 and 1).</param>\r\n\t\tpublic static Color HSBtoColor(double h, double s, double b) {\r\n\t\t\treturn HSBtoColor(new HSB(h, s, b));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"h\">Hue value.</param>\r\n\t\t/// <param name=\"s\">Saturation value.</param>\r\n\t\t/// <param name=\"b\">Brightness value.</param>\r\n\t\tpublic static Color HSBtoColor(int h, int s, int b) {\r\n\t\t\tdouble hue = 0, sat = 0, val = 0;\r\n\r\n\t\t\t// Scale Hue to be between 0 and 360. Saturation and value scale to be between 0 and 1.\r\n\t\t\tif (h > 360 || s > 1 || b > 1) {\r\n\t\t\t\thue = ((double)h / 255.0 * 360.0) % 360.0;\r\n\t\t\t\tsat = (double)s / 255.0;\r\n\t\t\t\tval = (double)b / 255.0;\r\n\t\t\t}\r\n\r\n\t\t\treturn HSBtoColor(new HSB(hue, sat, val));\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to HSL.\r\n\t\t/// </summary>\r\n\t\tpublic static HSL HSBtoHSL(double h, double s, double b) {\r\n\t\t\tvar rgb = HSBtoRGB(new HSB(h, s, b));\r\n\r\n\t\t\treturn RGBtoHSL(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to CMYK.\r\n\t\t/// </summary>\r\n\t\tpublic static CMYK HSBtoCMYK(double h, double s, double b) {\r\n\t\t\tvar rgb = HSBtoRGB(new HSB(h, s, b));\r\n\r\n\t\t\treturn RGBtoCMYK(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSB to CMYK.\r\n\t\t/// </summary>\r\n\t\tpublic static YUV HSBtoYUV(double h, double s, double b) {\r\n\t\t\tvar rgb = HSBtoRGB(new HSB(h, s, b));\r\n\r\n\t\t\treturn RGBtoYUV(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region HSL convert\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"h\">Hue, must be in [0, 360].</param>\r\n\t\t/// <param name=\"s\">Saturation, must be in [0, 1].</param>\r\n\t\t/// <param name=\"l\">Luminance, must be in [0, 1].</param>\r\n\t\tpublic static RGB HSLtoRGB(double h, double s, double l) {\r\n\t\t\tif (s == 0) {\r\n\t\t\t\t// achromatic color (gray scale)\r\n\t\t\t\treturn new RGB(\r\n\t\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", l * 255.0))),\r\n\t\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", l * 255.0))),\r\n\t\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", l * 255.0)))\r\n\t\t\t\t\t);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tdouble q = (l < 0.5) ? (l * (1.0 + s)) : (l + s - (l * s));\r\n\t\t\t\tdouble p = (2.0 * l) - q;\r\n\r\n\t\t\t\tdouble Hk = h / 360.0;\r\n\t\t\t\tvar T = new double[3];\r\n\t\t\t\tT[0] = Hk + (1.0 / 3.0);    // Tr\r\n\t\t\t\tT[1] = Hk;              // Tb\r\n\t\t\t\tT[2] = Hk - (1.0 / 3.0);    // Tg\r\n\r\n\t\t\t\tfor (int i = 0; i < 3; i++) {\r\n\t\t\t\t\tif (T[i] < 0) T[i] += 1.0;\r\n\t\t\t\t\tif (T[i] > 1) T[i] -= 1.0;\r\n\r\n\t\t\t\t\tif ((T[i] * 6) < 1) {\r\n\t\t\t\t\t\tT[i] = p + ((q - p) * 6.0 * T[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ((T[i] * 2.0) < 1) //(1.0/6.0)<=T[i] && T[i]<0.5\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tT[i] = q;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ((T[i] * 3.0) < 2) // 0.5<=T[i] && T[i]<(2.0/3.0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tT[i] = p + (q - p) * ((2.0 / 3.0) - T[i]) * 6.0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse T[i] = p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new RGB(\r\n\t\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", T[0] * 255.0))),\r\n\t\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", T[1] * 255.0))),\r\n\t\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", T[2] * 255.0)))\r\n\t\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"hsl\">The HSL structure to convert.</param>\r\n\t\tpublic static RGB HSLtoRGB(HSL hsl) {\r\n\t\t\treturn HSLtoRGB(hsl.Hue, hsl.Saturation, hsl.Luminance);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to .net Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"hsl\">The HSL structure to convert.</param>\r\n\t\tpublic static Color HSLtoColor(double h, double s, double l) {\r\n\t\t\tvar rgb = HSLtoRGB(h, s, l);\r\n\r\n\t\t\treturn Color.FromArgb(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to .net Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"hsl\">The HSL structure to convert.</param>\r\n\t\tpublic static Color HSLtoColor(HSL hsl) {\r\n\t\t\treturn HSLtoColor(hsl.Hue, hsl.Saturation, hsl.Luminance);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to HSB.\r\n\t\t/// </summary>\r\n\t\tpublic static HSB HSLtoHSB(double h, double s, double l) {\r\n\t\t\tvar rgb = HSLtoRGB(h, s, l);\r\n\r\n\t\t\treturn RGBtoHSB(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to CMYK.\r\n\t\t/// </summary>\r\n\t\tpublic static CMYK HSLtoCMYK(double h, double s, double l) {\r\n\t\t\tvar rgb = HSLtoRGB(h, s, l);\r\n\r\n\t\t\treturn RGBtoCMYK(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts HSL to YUV.\r\n\t\t/// </summary>\r\n\t\tpublic static YUV HSLtoYUV(double h, double s, double l) {\r\n\t\t\tvar rgb = HSLtoRGB(h, s, l);\r\n\r\n\t\t\treturn RGBtoYUV(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region RGB convert\r\n\t\t/// <summary> \r\n\t\t/// Converts RGB to HSL.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"red\">Red value, must be in [0,255].</param>\r\n\t\t/// <param name=\"green\">Green value, must be in [0,255].</param>\r\n\t\t/// <param name=\"blue\">Blue value, must be in [0,255].</param>\r\n\t\tpublic static HSL RGBtoHSL(int red, int green, int blue) {\r\n\t\t\tdouble h = 0, s = 0, l = 0;\r\n\r\n\t\t\t// normalizes red-green-blue values\r\n\t\t\tdouble nRed = (double)red / 255.0;\r\n\t\t\tdouble nGreen = (double)green / 255.0;\r\n\t\t\tdouble nBlue = (double)blue / 255.0;\r\n\r\n\t\t\tdouble max = Math.Max(nRed, Math.Max(nGreen, nBlue));\r\n\t\t\tdouble min = Math.Min(nRed, Math.Min(nGreen, nBlue));\r\n\r\n\t\t\t// hue\r\n\t\t\tif (max == min) {\r\n\t\t\t\th = 0; // undefined\r\n\t\t\t}\r\n\t\t\telse if (max == nRed && nGreen >= nBlue) {\r\n\t\t\t\th = 60.0 * (nGreen - nBlue) / (max - min);\r\n\t\t\t}\r\n\t\t\telse if (max == nRed && nGreen < nBlue) {\r\n\t\t\t\th = 60.0 * (nGreen - nBlue) / (max - min) + 360.0;\r\n\t\t\t}\r\n\t\t\telse if (max == nGreen) {\r\n\t\t\t\th = 60.0 * (nBlue - nRed) / (max - min) + 120.0;\r\n\t\t\t}\r\n\t\t\telse if (max == nBlue) {\r\n\t\t\t\th = 60.0 * (nRed - nGreen) / (max - min) + 240.0;\r\n\t\t\t}\r\n\r\n\t\t\t// luminance\r\n\t\t\tl = (max + min) / 2.0;\r\n\r\n\t\t\t// saturation\r\n\t\t\tif (l == 0 || max == min) {\r\n\t\t\t\ts = 0;\r\n\t\t\t}\r\n\t\t\telse if (0 < l && l <= 0.5) {\r\n\t\t\t\ts = (max - min) / (max + min);\r\n\t\t\t}\r\n\t\t\telse if (l > 0.5) {\r\n\t\t\t\ts = (max - min) / (2 - (max + min)); //(max-min > 0)?\r\n\t\t\t}\r\n\r\n\t\t\treturn new HSL(\r\n\t\t\t\tDouble.Parse(String.Format(\"{0:0.##}\", h)),\r\n\t\t\t\tDouble.Parse(String.Format(\"{0:0.##}\", s)),\r\n\t\t\t\tDouble.Parse(String.Format(\"{0:0.##}\", l))\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t/// <summary> \r\n\t\t/// Converts RGB to HSL.\r\n\t\t/// </summary>\r\n\t\tpublic static HSL RGBtoHSL(RGB rgb) {\r\n\t\t\treturn RGBtoHSL(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary> \r\n\t\t/// Converts Color to HSL.\r\n\t\t/// </summary>\r\n\t\tpublic static HSL RGBtoHSL(Color c) {\r\n\t\t\treturn RGBtoHSL(c.R, c.G, c.B);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary> \r\n\t\t/// Converts RGB to HSB.\r\n\t\t/// </summary> \r\n\t\tpublic static HSB RGBtoHSB(int red, int green, int blue) {\r\n\t\t\tdouble r = ((double)red / 255.0);\r\n\t\t\tdouble g = ((double)green / 255.0);\r\n\t\t\tdouble b = ((double)blue / 255.0);\r\n\r\n\t\t\tdouble max = Math.Max(r, Math.Max(g, b));\r\n\t\t\tdouble min = Math.Min(r, Math.Min(g, b));\r\n\r\n\t\t\tdouble h = 0.0;\r\n\t\t\tif (max == r && g >= b) {\r\n\t\t\t\tif (max - min == 0) h = 0.0;\r\n\t\t\t\telse h = 60 * (g - b) / (max - min);\r\n\t\t\t}\r\n\t\t\telse if (max == r && g < b) {\r\n\t\t\t\th = 60 * (g - b) / (max - min) + 360;\r\n\t\t\t}\r\n\t\t\telse if (max == g) {\r\n\t\t\t\th = 60 * (b - r) / (max - min) + 120;\r\n\t\t\t}\r\n\t\t\telse if (max == b) {\r\n\t\t\t\th = 60 * (r - g) / (max - min) + 240;\r\n\t\t\t}\r\n\r\n\t\t\tdouble s = (max == 0) ? 0.0 : (1.0 - ((double)min / (double)max));\r\n\r\n\t\t\treturn new HSB(h, s, (double)max);\r\n\t\t}\r\n\r\n\t\t/// <summary> \r\n\t\t/// Converts RGB to HSB.\r\n\t\t/// </summary> \r\n\t\tpublic static HSB RGBtoHSB(RGB rgb) {\r\n\t\t\treturn RGBtoHSB(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary> \r\n\t\t/// Converts RGB to HSB.\r\n\t\t/// </summary> \r\n\t\tpublic static HSB RGBtoHSB(Color c) {\r\n\t\t\treturn RGBtoHSB(c.R, c.G, c.B);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CMYK\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"red\">Red vaue must be in [0, 255].</param>\r\n\t\t/// <param name=\"green\">Green vaue must be in [0, 255].</param>\r\n\t\t/// <param name=\"blue\">Blue vaue must be in [0, 255].</param>\r\n\t\tpublic static CMYK RGBtoCMYK(int red, int green, int blue) {\r\n\t\t\tdouble c = (double)(255 - red) / 255;\r\n\t\t\tdouble m = (double)(255 - green) / 255;\r\n\t\t\tdouble y = (double)(255 - blue) / 255;\r\n\r\n\t\t\tdouble min = (double)Math.Min(c, Math.Min(m, y));\r\n\t\t\tif (min == 1.0) {\r\n\t\t\t\treturn new CMYK(0, 0, 0, 1);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn new CMYK((c - min) / (1 - min), (m - min) / (1 - min), (y - min) / (1 - min), min);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CMYK\r\n\t\t/// </summary>\r\n\t\tpublic static CMYK RGBtoCMYK(Color c) {\r\n\t\t\treturn RGBtoCMYK(c.R, c.G, c.B);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CMYK\r\n\t\t/// </summary>\r\n\t\tpublic static CMYK RGBtoCMYK(RGB rgb) {\r\n\t\t\treturn RGBtoCMYK(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to YUV.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"red\">red must be in [0, 255].</param>\r\n\t\t/// <param name=\"green\">green must be in [0, 255].</param>\r\n\t\t/// <param name=\"blue\">blue must be in [0, 255].</param>\r\n\t\tpublic static YUV RGBtoYUV(int red, int green, int blue) {\r\n\t\t\tvar yuv = new YUV();\r\n\r\n\t\t\t// normalizes red/green/blue values\r\n\t\t\tdouble nRed = (double)red / 255.0;\r\n\t\t\tdouble nGreen = (double)green / 255.0;\r\n\t\t\tdouble nBlue = (double)blue / 255.0;\r\n\r\n\t\t\t// converts\r\n\t\t\tyuv.Y = 0.299 * nRed + 0.587 * nGreen + 0.114 * nBlue;\r\n\t\t\tyuv.U = -0.1471376975169300226 * nRed - 0.2888623024830699774 * nGreen + 0.436 * nBlue;\r\n\t\t\tyuv.V = 0.615 * nRed - 0.5149857346647646220 * nGreen - 0.1000142653352353780 * nBlue;\r\n\r\n\t\t\treturn yuv;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to YUV.\r\n\t\t/// </summary>\r\n\t\tpublic static YUV RGBtoYUV(Color c) {\r\n\t\t\treturn RGBtoYUV(c.R, c.G, c.B);\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to YUV.\r\n\t\t/// </summary>\r\n\t\tpublic static YUV RGBtoYUV(RGB rgb) {\r\n\t\t\treturn RGBtoYUV(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CIE XYZ (CIE 1931 color space)\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"red\">Red must be in [0, 255].</param>\r\n\t\t/// <param name=\"green\">Green must be in [0, 255].</param>\r\n\t\t/// <param name=\"blue\">Blue must be in [0, 255].</param>\r\n\t\tpublic static CIEXYZ RGBtoXYZ(int red, int green, int blue) {\r\n\t\t\t// normalize red, green, blue values\r\n\t\t\tdouble rLinear = (double)red / 255.0;\r\n\t\t\tdouble gLinear = (double)green / 255.0;\r\n\t\t\tdouble bLinear = (double)blue / 255.0;\r\n\r\n\t\t\t// convert to a sRGB form\r\n\t\t\tdouble r = (rLinear > 0.04045) ? Math.Pow((rLinear + 0.055) / (1 + 0.055), 2.2) : (rLinear / 12.92);\r\n\t\t\tdouble g = (gLinear > 0.04045) ? Math.Pow((gLinear + 0.055) / (1 + 0.055), 2.2) : (gLinear / 12.92);\r\n\t\t\tdouble b = (bLinear > 0.04045) ? Math.Pow((bLinear + 0.055) / (1 + 0.055), 2.2) : (bLinear / 12.92);\r\n\r\n\t\t\t// converts\r\n\t\t\treturn new CIEXYZ(\r\n\t\t\t\t(r * 0.4124 + g * 0.3576 + b * 0.1805),\r\n\t\t\t\t(r * 0.2126 + g * 0.7152 + b * 0.0722),\r\n\t\t\t\t(r * 0.0193 + g * 0.1192 + b * 0.9505)\r\n\t\t\t\t);\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CIEXYZ.\r\n\t\t/// </summary>\r\n\t\tpublic static CIEXYZ RGBtoXYZ(RGB rgb) {\r\n\t\t\treturn RGBtoXYZ(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CIEXYZ.\r\n\t\t/// </summary>\r\n\t\tpublic static CIEXYZ RGBtoXYZ(Color c) {\r\n\t\t\treturn RGBtoXYZ(c.R, c.G, c.B);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CIELab.\r\n\t\t/// </summary>\r\n\t\tpublic static CIELab RGBtoLab(int red, int green, int blue) {\r\n\t\t\treturn XYZtoLab(RGBtoXYZ(red, green, blue));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CIELab.\r\n\t\t/// </summary>\r\n\t\tpublic static CIELab RGBtoLab(RGB rgb) {\r\n\t\t\treturn XYZtoLab(RGBtoXYZ(rgb.Red, rgb.Green, rgb.Blue));\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// Converts RGB to CIELab.\r\n\t\t/// </summary>\r\n\t\tpublic static CIELab RGBtoLab(System.Drawing.Color color) {\r\n\t\t\treturn XYZtoLab(RGBtoXYZ(color.R, color.G, color.B));\r\n\t\t}\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region CMYK convert\r\n\t\t/// <summary>\r\n\t\t/// 将四色分量（必须为 0～1）转换为 RGB 颜色。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"c\">青</param>\r\n\t\t/// <param name=\"m\">紫</param>\r\n\t\t/// <param name=\"y\">黄</param>\r\n\t\t/// <param name=\"k\">黑</param>\r\n\t\t/// <returns>颜色。</returns>\r\n\t\tpublic static Color CMYKtoColor(float c, float m, float y, float k) {\r\n\t\t\treturn CMYKtoColor((double)c, (double)m, (double)y, (double)k);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将四色分量（必须为 0～1）转换为 RGB 颜色。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"c\">青</param>\r\n\t\t/// <param name=\"m\">紫</param>\r\n\t\t/// <param name=\"y\">黄</param>\r\n\t\t/// <param name=\"k\">黑</param>\r\n\t\t/// <returns>颜色。</returns>\r\n\t\tpublic static Color CMYKtoColor(double c, double m, double y, double k) {\r\n\t\t\treturn CMYKtoColor(new CMYK(c, m, y, k));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CMYK to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"cmyk\"></param>\r\n\t\tpublic static Color CMYKtoColor(CMYK cmyk) {\r\n\t\t\tint red = Convert.ToInt32((1 - cmyk.Cyan) * (1 - cmyk.Black) * 255);\r\n\t\t\tint green = Convert.ToInt32((1 - cmyk.Magenta) * (1 - cmyk.Black) * 255);\r\n\t\t\tint blue = Convert.ToInt32((1 - cmyk.Yellow) * (1 - cmyk.Black) * 255);\r\n\r\n\t\t\treturn Color.FromArgb(red, green, blue);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CMYK to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"c\">Cyan value (must be between 0 and 1).</param>\r\n\t\t/// <param name=\"m\">Magenta value (must be between 0 and 1).</param>\r\n\t\t/// <param name=\"y\">Yellow value (must be between 0 and 1).</param>\r\n\t\t/// <param name=\"k\">Black value (must be between 0 and 1).</param>\r\n\t\tpublic static RGB CMYKtoRGB(double c, double m, double y, double k) {\r\n\t\t\tint red = Convert.ToInt32((1.0 - c) * (1.0 - k) * 255.0);\r\n\t\t\tint green = Convert.ToInt32((1.0 - m) * (1.0 - k) * 255.0);\r\n\t\t\tint blue = Convert.ToInt32((1.0 - y) * (1.0 - k) * 255.0);\r\n\r\n\t\t\treturn new RGB(red, green, blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CMYK to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"cmyk\"></param>\r\n\t\tpublic static RGB CMYKtoRGB(CMYK cmyk) {\r\n\t\t\treturn CMYKtoRGB(cmyk.Cyan, cmyk.Magenta, cmyk.Yellow, cmyk.Black);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CMYK to HSL.\r\n\t\t/// </summary>\r\n\t\tpublic static HSL CMYKtoHSL(double c, double m, double y, double k) {\r\n\t\t\tvar rgb = CMYKtoRGB(c, m, y, k);\r\n\r\n\t\t\treturn RGBtoHSL(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CMYK to HSB.\r\n\t\t/// </summary>\r\n\t\tpublic static HSB CMYKtoHSB(double c, double m, double y, double k) {\r\n\t\t\tvar rgb = CMYKtoRGB(c, m, y, k);\r\n\r\n\t\t\treturn RGBtoHSB(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CMYK to YUV.\r\n\t\t/// </summary>\r\n\t\tpublic static YUV CMYKtoYUV(double c, double m, double y, double k) {\r\n\t\t\tvar rgb = CMYKtoRGB(c, m, y, k);\r\n\r\n\t\t\treturn RGBtoYUV(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region YUV convert\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to RGB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"y\">Y must be in [0, 1].</param>\r\n\t\t/// <param name=\"u\">U must be in [-0.436, +0.436].</param>\r\n\t\t/// <param name=\"v\">V must be in [-0.615, +0.615].</param>\r\n\t\tpublic static RGB YUVtoRGB(double y, double u, double v) {\r\n\t\t\treturn new RGB {\r\n\t\t\t\tRed = Convert.ToInt32((y + 1.139837398373983740 * v) * 255),\r\n\t\t\t\tGreen = Convert.ToInt32((y - 0.3946517043589703515 * u - 0.5805986066674976801 * v) * 255),\r\n\t\t\t\tBlue = Convert.ToInt32((y + 2.032110091743119266 * u) * 255)\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to RGB.\r\n\t\t/// </summary>\r\n\t\tpublic static RGB YUVtoRGB(YUV yuv) {\r\n\t\t\treturn YUVtoRGB(yuv.Y, yuv.U, yuv.V);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to a .net Color.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"y\">Y must be in [0, 1].</param>\r\n\t\t/// <param name=\"u\">U must be in [-0.436, +0.436].</param>\r\n\t\t/// <param name=\"v\">V must be in [-0.615, +0.615].</param>\r\n\t\tpublic static Color YUVtoColor(double y, double u, double v) {\r\n\t\t\tvar rgb = YUVtoRGB(y, u, v);\r\n\r\n\t\t\treturn Color.FromArgb(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to a .net Color.\r\n\t\t/// </summary>\r\n\t\tpublic static Color YUVtoColor(YUV yuv) {\r\n\t\t\tvar rgb = YUVtoRGB(yuv);\r\n\r\n\t\t\treturn Color.FromArgb(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to HSL.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"y\">Y must be in [0, 1].</param>\r\n\t\t/// <param name=\"u\">U must be in [-0.436, +0.436].</param>\r\n\t\t/// <param name=\"v\">V must be in [-0.615, +0.615].</param>\r\n\t\tpublic static HSL YUVtoHSL(double y, double u, double v) {\r\n\t\t\tvar rgb = YUVtoRGB(y, u, v);\r\n\r\n\t\t\treturn RGBtoHSL(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to HSB.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"y\">Y must be in [0, 1].</param>\r\n\t\t/// <param name=\"u\">U must be in [-0.436, +0.436].</param>\r\n\t\t/// <param name=\"v\">V must be in [-0.615, +0.615].</param>\r\n\t\tpublic static HSB YUVtoHSB(double y, double u, double v) {\r\n\t\t\tvar rgb = YUVtoRGB(y, u, v);\r\n\r\n\t\t\treturn RGBtoHSB(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts YUV to CMYK.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"y\">Y must be in [0, 1].</param>\r\n\t\t/// <param name=\"u\">U must be in [-0.436, +0.436].</param>\r\n\t\t/// <param name=\"v\">V must be in [-0.615, +0.615].</param>\r\n\t\tpublic static CMYK YUVtoCMYK(double y, double u, double v) {\r\n\t\t\tvar rgb = YUVtoRGB(y, u, v);\r\n\r\n\t\t\treturn RGBtoCMYK(rgb.Red, rgb.Green, rgb.Blue);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region CIE XYZ convert\r\n\t\t/// <summary>\r\n\t\t/// Converts CIEXYZ to RGB structure.\r\n\t\t/// </summary>\r\n\t\tpublic static RGB XYZtoRGB(double x, double y, double z) {\r\n\t\t\tvar Clinear = new double[3];\r\n\t\t\tClinear[0] = x * 3.2410 - y * 1.5374 - z * 0.4986; // red\r\n\t\t\tClinear[1] = -x * 0.9692 + y * 1.8760 - z * 0.0416; // green\r\n\t\t\tClinear[2] = x * 0.0556 - y * 0.2040 + z * 1.0570; // blue\r\n\r\n\t\t\tfor (int i = 0; i < 3; i++) {\r\n\t\t\t\tClinear[i] = (Clinear[i] <= 0.0031308) ? 12.92 * Clinear[i] : (1 + 0.055) * Math.Pow(Clinear[i], (1.0 / 2.4)) - 0.055;\r\n\t\t\t}\r\n\r\n\t\t\treturn new RGB(\r\n\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", Clinear[0] * 255.0))),\r\n\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", Clinear[1] * 255.0))),\r\n\t\t\t\tConvert.ToInt32(Double.Parse(String.Format(\"{0:0.00}\", Clinear[2] * 255.0)))\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CIEXYZ to RGB structure.\r\n\t\t/// </summary>\r\n\t\tpublic static RGB XYZtoRGB(CIEXYZ xyz) {\r\n\t\t\treturn XYZtoRGB(xyz.X, xyz.Y, xyz.Z);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// XYZ to L*a*b* transformation function.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"t\"></param>\r\n\t\t/// <returns></returns>\r\n\t\tprivate static double Fxyz(double t) {\r\n\t\t\treturn ((t > 0.008856) ? Math.Pow(t, (1.0 / 3.0)) : (7.787 * t + 16.0 / 116.0));\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CIEXYZ to CIELab structure.\r\n\t\t/// </summary>\r\n\t\tpublic static CIELab XYZtoLab(double x, double y, double z) {\r\n\t\t\tvar lab = CIELab.Empty;\r\n\r\n\t\t\tlab.L = 116.0 * Fxyz(y / CIEXYZ.D65.Y) - 16;\r\n\t\t\tlab.A = 500.0 * (Fxyz(x / CIEXYZ.D65.X) - Fxyz(y / CIEXYZ.D65.Y));\r\n\t\t\tlab.B = 200.0 * (Fxyz(y / CIEXYZ.D65.Y) - Fxyz(z / CIEXYZ.D65.Z));\r\n\r\n\t\t\treturn lab;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CIEXYZ to CIELab structure.\r\n\t\t/// </summary>\r\n\t\tpublic static CIELab XYZtoLab(CIEXYZ xyz) {\r\n\t\t\treturn XYZtoLab(xyz.X, xyz.Y, xyz.Z);\r\n\t\t}\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region CIE L*a*b* convert\r\n\t\t/// <summary>\r\n\t\t/// Converts CIELab to CIEXYZ.\r\n\t\t/// </summary>\r\n\t\tpublic static CIEXYZ LabtoXYZ(double l, double a, double b) {\r\n\t\t\tdouble theta = 6.0 / 29.0;\r\n\r\n\t\t\tdouble fy = (l + 16) / 116.0;\r\n\t\t\tdouble fx = fy + (a / 500.0);\r\n\t\t\tdouble fz = fy - (b / 200.0);\r\n\r\n\t\t\treturn new CIEXYZ(\r\n\t\t\t\t(fx > theta) ? CIEXYZ.D65.X * (fx * fx * fx) : (fx - 16.0 / 116.0) * 3 * (theta * theta) * CIEXYZ.D65.X,\r\n\t\t\t\t(fy > theta) ? CIEXYZ.D65.Y * (fy * fy * fy) : (fy - 16.0 / 116.0) * 3 * (theta * theta) * CIEXYZ.D65.Y,\r\n\t\t\t\t(fz > theta) ? CIEXYZ.D65.Z * (fz * fz * fz) : (fz - 16.0 / 116.0) * 3 * (theta * theta) * CIEXYZ.D65.Z\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CIELab to CIEXYZ.\r\n\t\t/// </summary>\r\n\t\tpublic static CIEXYZ LabtoXYZ(CIELab lab) {\r\n\t\t\treturn LabtoXYZ(lab.L, lab.A, lab.B);\r\n\t\t}\r\n\r\n\r\n\t\t/// <summary>\r\n\t\t/// Converts CIELab to RGB.\r\n\t\t/// </summary>\r\n\t\tpublic static RGB LabtoRGB(double l, double a, double b) {\r\n\t\t\treturn XYZtoRGB(LabtoXYZ(l, a, b));\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// Converts CIELab to RGB.\r\n\t\t/// </summary>\r\n\t\tpublic static RGB LabtoRGB(CIELab lab) {\r\n\t\t\treturn XYZtoRGB(LabtoXYZ(lab));\r\n\t\t}\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/HSB.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define HSB.\r\n\t/// </summary>\r\n\tpublic struct HSB\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty HSB structure;\r\n\t\t/// </summary>\r\n\t\tpublic static readonly HSB Empty = new HSB();\r\n\r\n\t\t#region Fields\r\n\t\tprivate double hue;\r\n\t\tprivate double saturation;\r\n\t\tprivate double brightness;\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(HSB item1, HSB item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Hue == item2.Hue\r\n\t\t\t\t&& item1.Saturation == item2.Saturation\r\n\t\t\t\t&& item1.Brightness == item2.Brightness\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(HSB item1, HSB item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Hue != item2.Hue\r\n\t\t\t\t|| item1.Saturation != item2.Saturation\r\n\t\t\t\t|| item1.Brightness != item2.Brightness\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the hue component.\r\n\t\t/// </summary>\r\n\t\t[Description(\"Hue component\"),]\r\n\t\tpublic double Hue {\r\n\t\t\tget => hue;\r\n\t\t\tset => hue = (value > 360) ? 360 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets saturation component.\r\n\t\t/// </summary>\r\n\t\t[Description(\"Saturation component\"),]\r\n\t\tpublic double Saturation {\r\n\t\t\tget => saturation;\r\n\t\t\tset => saturation = (value > 1) ? 1 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the brightness component.\r\n\t\t/// </summary>\r\n\t\t[Description(\"Brightness component\"),]\r\n\t\tpublic double Brightness {\r\n\t\t\tget => brightness;\r\n\t\t\tset => brightness = (value > 1) ? 1 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates an instance of a HSB structure.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"h\">Hue value.</param>\r\n\t\t/// <param name=\"s\">Saturation value.</param>\r\n\t\t/// <param name=\"b\">Brightness value.</param>\r\n\t\tpublic HSB(double h, double s, double b) {\r\n\t\t\thue = (h > 360) ? 360 : ((h < 0) ? 0 : h);\r\n\t\t\tsaturation = (s > 1) ? 1 : ((s < 0) ? 0 : s);\r\n\t\t\tbrightness = (b > 1) ? 1 : ((b < 0) ? 0 : b);\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (HSB)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn Hue.GetHashCode() ^ Saturation.GetHashCode() ^ Brightness.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/HSL.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define HSL.\r\n\t/// </summary>\r\n\tpublic struct HSL\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty HSL structure;\r\n\t\t/// </summary>\r\n\t\tpublic static readonly HSL Empty = new HSL();\r\n\r\n\t\t#region Fields\r\n\t\tprivate double hue;\r\n\t\tprivate double saturation;\r\n\t\tprivate double luminance;\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(HSL item1, HSL item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Hue == item2.Hue\r\n\t\t\t\t&& item1.Saturation == item2.Saturation\r\n\t\t\t\t&& item1.Luminance == item2.Luminance\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(HSL item1, HSL item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Hue != item2.Hue\r\n\t\t\t\t|| item1.Saturation != item2.Saturation\r\n\t\t\t\t|| item1.Luminance != item2.Luminance\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the hue component.\r\n\t\t/// </summary>\r\n\t\t[Description(\"Hue component\"),]\r\n\t\tpublic double Hue {\r\n\t\t\tget => hue;\r\n\t\t\tset => hue = (value > 360) ? 360 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets saturation component.\r\n\t\t/// </summary>\r\n\t\t[Description(\"Saturation component\"),]\r\n\t\tpublic double Saturation {\r\n\t\t\tget => saturation;\r\n\t\t\tset => saturation = (value > 1) ? 1 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Gets or sets the luminance component.\r\n\t\t/// </summary>\r\n\t\t[Description(\"Luminance component\"),]\r\n\t\tpublic double Luminance {\r\n\t\t\tget => luminance;\r\n\t\t\tset => luminance = (value > 1) ? 1 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates an instance of a HSL structure.\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"h\">Hue value.</param>\r\n\t\t/// <param name=\"s\">Saturation value.</param>\r\n\t\t/// <param name=\"l\">Lightness value.</param>\r\n\t\tpublic HSL(double h, double s, double l) {\r\n\t\t\thue = (h > 360) ? 360 : ((h < 0) ? 0 : h);\r\n\t\t\tsaturation = (s > 1) ? 1 : ((s < 0) ? 0 : s);\r\n\t\t\tluminance = (l > 1) ? 1 : ((l < 0) ? 0 : l);\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (HSL)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn Hue.GetHashCode() ^ Saturation.GetHashCode() ^ Luminance.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/RGB.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define RGB.\r\n\t/// </summary>\r\n\tpublic struct RGB\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty RGB structure;\r\n\t\t/// </summary>\r\n\t\tpublic static readonly RGB Empty = new RGB();\r\n\r\n\t\t#region Fields\r\n\t\tprivate int red;\r\n\t\tprivate int green;\r\n\t\tprivate int blue;\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(RGB item1, RGB item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Red == item2.Red\r\n\t\t\t\t&& item1.Green == item2.Green\r\n\t\t\t\t&& item1.Blue == item2.Blue\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(RGB item1, RGB item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Red != item2.Red\r\n\t\t\t\t|| item1.Green != item2.Green\r\n\t\t\t\t|| item1.Blue != item2.Blue\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\t[Description(\"Red component.\"),]\r\n\t\tpublic int Red {\r\n\t\t\tget => red;\r\n\t\t\tset => red = (value > 255) ? 255 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t[Description(\"Green component.\"),]\r\n\t\tpublic int Green {\r\n\t\t\tget => green;\r\n\t\t\tset => green = (value > 255) ? 255 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\r\n\t\t[Description(\"Blue component.\"),]\r\n\t\tpublic int Blue {\r\n\t\t\tget => blue;\r\n\t\t\tset => blue = (value > 255) ? 255 : ((value < 0) ? 0 : value);\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tpublic RGB(int R, int G, int B) {\r\n\t\t\tred = (R > 255) ? 255 : ((R < 0) ? 0 : R);\r\n\t\t\tgreen = (G > 255) ? 255 : ((G < 0) ? 0 : G);\r\n\t\t\tblue = (B > 255) ? 255 : ((B < 0) ? 0 : B);\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (RGB)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn Red.GetHashCode() ^ Green.GetHashCode() ^ Blue.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ColorSpaces/YUV.cs",
    "content": "﻿using System;\r\n\r\nnamespace Devcorp.Controls.Design\r\n{\r\n\t/// <summary>\r\n\t/// Structure to define YUV.\r\n\t/// </summary>\r\n\tpublic struct YUV\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// Gets an empty YUV structure.\r\n\t\t/// </summary>\r\n\t\tpublic static readonly YUV Empty = new YUV();\r\n\r\n\t\t#region Fields\r\n\t\tprivate double y;\r\n\t\tprivate double u;\r\n\t\tprivate double v;\r\n\t\t#endregion\r\n\r\n\t\t#region Operators\r\n\t\tpublic static bool operator ==(YUV item1, YUV item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Y == item2.Y\r\n\t\t\t\t&& item1.U == item2.U\r\n\t\t\t\t&& item1.V == item2.V\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(YUV item1, YUV item2) {\r\n\t\t\treturn (\r\n\t\t\t\titem1.Y != item2.Y\r\n\t\t\t\t|| item1.U != item2.U\r\n\t\t\t\t|| item1.V != item2.V\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region Accessors\r\n\t\tpublic double Y {\r\n\t\t\tget => y;\r\n\t\t\tset {\r\n\t\t\t\ty = value;\r\n\t\t\t\ty = (y > 1) ? 1 : ((y < 0) ? 0 : y);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic double U {\r\n\t\t\tget => u;\r\n\t\t\tset {\r\n\t\t\t\tu = value;\r\n\t\t\t\tu = (u > 0.436) ? 0.436 : ((u < -0.436) ? -0.436 : u);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic double V {\r\n\t\t\tget => v;\r\n\t\t\tset {\r\n\t\t\t\tv = value;\r\n\t\t\t\tv = (v > 0.615) ? 0.615 : ((v < -0.615) ? -0.615 : v);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>\r\n\t\t/// Creates an instance of a YUV structure.\r\n\t\t/// </summary>\r\n\t\tpublic YUV(double y, double u, double v) {\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.u = u;\r\n\t\t\tthis.v = v;\r\n\t\t}\r\n\r\n\t\t#region Methods\r\n\t\tpublic override bool Equals(Object obj) {\r\n\t\t\tif (obj == null || GetType() != obj.GetType()) return false;\r\n\r\n\t\t\treturn (this == (YUV)obj);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn Y.GetHashCode() ^ U.GetHashCode() ^ V.GetHashCode();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/CoordinateTranslationSettings.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinternal sealed class CoordinateTranslationSettings\r\n\t{\r\n\t\tinternal float XScale { get; set; }\r\n\t\tinternal float YScale { get; set; }\r\n\t\tinternal float XTranslation { get; set; }\r\n\t\tinternal float YTranslation { get; set; }\r\n\r\n\t\tpublic CoordinateTranslationSettings() {\r\n\t\t\tXScale = YScale = 1;\r\n\t\t}\r\n\r\n\t\tpublic CoordinateTranslationSettings(float xScale, float yScale, float xTranslation, float yTranslation) {\r\n\t\t\tXScale = xScale;\r\n\t\t\tYScale = yScale;\r\n\t\t\tXTranslation = xTranslation;\r\n\t\t\tYTranslation = yTranslation;\r\n\t\t}\r\n\r\n\t\tinternal iTextSharp.text.pdf.parser.Matrix GetMatrix() {\r\n\t\t\treturn new iTextSharp.text.pdf.parser.Matrix(XScale, 0, 0, YScale, XTranslation, YTranslation);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/DistanceInfo.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"{Location}={Distance}\")]\r\n\tsealed class DistanceInfo\r\n\t{\r\n\t\t[Flags]\r\n\t\tinternal enum Placement\r\n\t\t{\r\n\t\t\tUnknown = 0,\r\n\t\t\tOverlapping = 1,\r\n\t\t\tLeft = 2,\r\n\t\t\tRight = 4,\r\n\t\t\tUp = 8,\r\n\t\t\tDown = 16\r\n\t\t}\r\n\r\n\t\tinternal Placement Location { get; }\r\n\t\tinternal float DistanceX { get; }\r\n\t\tinternal float DistanceY { get; }\r\n\t\tinternal bool IsOverlapping => (Location & Placement.Overlapping) != Placement.Unknown;\r\n\t\tinternal bool IsLeft => (Location & Placement.Left) != Placement.Unknown;\r\n\t\tinternal bool IsRight => (Location & Placement.Right) != Placement.Unknown;\r\n\t\tinternal bool IsAbove => (Location & Placement.Up) != Placement.Unknown;\r\n\t\tinternal bool IsBelow => (Location & Placement.Down) != Placement.Unknown;\r\n\t\tinternal bool IsVerticallyAligned => (Location & (Placement.Up | Placement.Down)) != Placement.Unknown;\r\n\t\tinternal bool IsHorizontallyAligned => (Location & (Placement.Left | Placement.Right)) != Placement.Unknown;\r\n\r\n\t\tinternal float MinDistance => (Location & Placement.Left) != Placement.Unknown || (Location & Placement.Right) != Placement.Unknown\r\n\t\t\t\t\t? DistanceX\r\n\t\t\t\t\t: (Location & Placement.Down) != Placement.Unknown || (Location & Placement.Up) != Placement.Unknown\r\n\t\t\t\t\t? DistanceY : DistanceRadial;\r\n\t\tinternal float DistanceRadial => DistanceX == Single.MaxValue || DistanceY == Single.MaxValue\r\n\t\t\t\t\t? Single.MaxValue\r\n\t\t\t\t\t: (float)Math.Sqrt(DistanceX * DistanceX + DistanceY * DistanceY);\r\n\r\n\t\tinternal DistanceInfo(Placement location, float distanceX, float distanceY) {\r\n\t\t\tLocation = location;\r\n\t\t\tDistanceX = distanceX;\r\n\t\t\tDistanceY = distanceY;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/DocumentObject.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"Name = {Name}({FriendlyName}); Value = {Value}; {HasChildren}\")]\r\n\tpublic sealed class DocumentObject : IHierarchicalObject<DocumentObject>\r\n\t{\r\n\t\tstatic readonly string[] __ReversalRefNames = [\"Parent\", \"Prev\", \"First\", \"Last\", \"P\"];\r\n\t\tstatic readonly int[] __CompoundTypes = [PdfObject.DICTIONARY, PdfObject.ARRAY, PdfObject.STREAM];\r\n\t\tstatic readonly DocumentObject[] __Leaf = [];\r\n\r\n\t\tinternal PdfPathDocument OwnerDocument { get; }\r\n\t\tinternal DocumentObject Parent { get; }\r\n\t\tinternal string Name { get; set; }\r\n\t\tinternal PdfObject Value { get; set; }\r\n\t\tinternal string Description { get; set; }\r\n\t\tinternal object ExtensiveObject { get; set; }\r\n\t\tinternal PdfObjectType Type { get; private set; }\r\n\t\tinternal bool IsKeyObject { get; set; }\r\n\t\tinternal object ImageKey { get; set; }\r\n\t\t/// <summary>\r\n\t\t/// 获取友好形式的名称。\r\n\t\t/// </summary>\r\n\t\tinternal string FriendlyName { get; set; }\r\n\t\t/// <summary>\r\n\t\t/// 获取友好形式的值。\r\n\t\t/// </summary>\r\n\t\tinternal string FriendlyValue { get; set; }\r\n\r\n\t\tpublic string LiteralValue => GetItemValueText(Value, ExtensiveObject as PdfObject);\r\n\t\tpublic bool HasChildren {\r\n\t\t\tget {\r\n\t\t\t\tif (Type != PdfObjectType.Normal\r\n\t\t\t\t\t&& (Type == PdfObjectType.Trailer\r\n\t\t\t\t\t\t|| Type == PdfObjectType.Pages\r\n\t\t\t\t\t\t|| Type == PdfObjectType.Page\r\n\t\t\t\t\t\t|| Type == PdfObjectType.PageCommands\r\n\t\t\t\t\t\t|| Type == PdfObjectType.Hidden\r\n\t\t\t\t\t\t|| Type == PdfObjectType.PageCommand && Children.Count > 0)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tvar po = Value ?? ExtensiveObject as PdfObject;\r\n\t\t\t\tif (po == null) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (PdfHelper.CompoundTypes.Contains(po.Type)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\telse if (po.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\tif (Type == PdfObjectType.GoToPage) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (ExtensiveObject is not PdfObject r) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (r.Type == PdfObject.DICTIONARY && Parent.Type == PdfObjectType.Outline && Name == \"Next\") {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn r.Type == PdfObject.DICTIONARY && __ReversalRefNames.Contains(Name) == false\r\n\t\t\t\t\t\t|| r.Type == PdfObject.ARRAY\r\n\t\t\t\t\t\t|| r.Type == PdfObject.STREAM\r\n\t\t\t\t\t\t;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tIList<DocumentObject> _Children;\r\n\t\tpublic ICollection<DocumentObject> Children {\r\n\t\t\tget {\r\n\t\t\t\tif (_Children == null) {\r\n\t\t\t\t\tPopulateChildren(false);\r\n\t\t\t\t\t_Children ??= __Leaf;\r\n\t\t\t\t}\r\n\t\t\t\treturn _Children;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal DocumentObject(PdfPathDocument ownerDocument, DocumentObject parent, string name, PdfObject value) :\r\n\t\t\tthis(ownerDocument, parent, name, value, PdfObjectType.Normal) {\r\n\t\t}\r\n\t\tinternal DocumentObject(PdfPathDocument ownerDocument, DocumentObject parent, string name, PdfObject value, PdfObjectType type) {\r\n\t\t\tOwnerDocument = ownerDocument;\r\n\t\t\tParent = parent;\r\n\t\t\tif (value != null) {\r\n\t\t\t\tif (value.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\tvar r = PdfReader.GetPdfObjectRelease(value);\r\n\t\t\t\t\tif (r != null) {\r\n\t\t\t\t\t\tExtensiveObject = r;\r\n\t\t\t\t\t\tif (r.Type == PdfObject.DICTIONARY) {\r\n\t\t\t\t\t\t\tint page = ownerDocument.GetPageNumber(value as PdfIndirectReference);\r\n\t\t\t\t\t\t\tif (page > 0) {\r\n\t\t\t\t\t\t\t\tDescription = $\"指向第 {page} 页\";\r\n\t\t\t\t\t\t\t\ttype = PdfObjectType.GoToPage;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (PdfName.FONT.Equals(((PdfDictionary)r).GetAsName(PdfName.TYPE)) && parent.Name == \"Font\") {\r\n\t\t\t\t\t\t\t\tvar fontName = ((PdfDictionary)r).GetAsName(PdfName.BASEFONT);\r\n\t\t\t\t\t\t\t\tif (fontName != null) {\r\n\t\t\t\t\t\t\t\t\tDescription = PdfName.DecodeName(fontName.ToString());\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (r.Type == PdfObject.STREAM) {\r\n\t\t\t\t\t\t\tvar subType = ((PdfDictionary)r).GetAsName(PdfName.SUBTYPE);\r\n\t\t\t\t\t\t\tif (PdfName.IMAGE.Equals(subType)) {\r\n\t\t\t\t\t\t\t\ttype = PdfObjectType.Image;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (PdfName.FORM.Equals(subType)) {\r\n\t\t\t\t\t\t\t\ttype = PdfObjectType.Form;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (parent?.Name == \"AP\"\r\n\t\t\t\t\t\t\t\t&& PdfName.ANNOT.Equals((PdfReader.GetPdfObjectRelease(parent.Parent?.Value) as PdfDictionary)?.GetAsName(PdfName.TYPE))) {\r\n\t\t\t\t\t\t\t\ttype = PdfObjectType.Form;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (value.Type == PdfObject.DICTIONARY) {\r\n\t\t\t\t\tif (parent != null && (parent.Type == PdfObjectType.Page || parent.Type == PdfObjectType.Form) && name == \"Resources\") {\r\n\t\t\t\t\t\ttype = PdfObjectType.Resources;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tName = name; Value = value; Type = type;\r\n\t\t}\r\n\r\n\t\tinternal bool RemoveChildByName(string name) {\r\n\t\t\tif (!HasChildren) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor (int i = _Children.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (_Children[i].Name == name) {\r\n\t\t\t\t\tif (_Children is Array) {\r\n\t\t\t\t\t\t_Children = new List<DocumentObject>(_Children);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_Children.RemoveAt(i);\r\n\t\t\t\t\tvar po = Value;\r\n\t\t\t\t\tif (po != null) {\r\n\t\t\t\t\t\twhile (po.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\t\t\tpo = PdfReader.GetPdfObject(po);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (po.Type == PdfObject.ARRAY) {\r\n\t\t\t\t\t\t\t((PdfArray)po).Remove(i);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (po.Type == PdfObject.DICTIONARY || po.Type == PdfObject.STREAM) {\r\n\t\t\t\t\t\t\t((PdfDictionary)po).Remove(new PdfName(name));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tinternal DocumentObject FindReferenceAncestor() {\r\n\t\t\tvar d = this;\r\n\t\t\tdo {\r\n\t\t\t\tif (d.Value?.Type == PdfObject.INDIRECT) {\r\n\t\t\t\t\treturn d;\r\n\t\t\t\t}\r\n\t\t\t} while ((d = d.Parent) != null);\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tinternal bool UpdateDocumentObject(object value) {\r\n\t\t\tif (Value is not PdfObject po) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tswitch (po.Type) {\r\n\t\t\t\tcase PdfObject.STRING:\r\n\t\t\t\t\tvar s = value as string;\r\n\t\t\t\t\tif (s == ((PdfString)po).ToUnicodeString()) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tValue = s.ToPdfString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.NUMBER:\r\n\t\t\t\t\tdouble n;\r\n\t\t\t\t\tif (((string)value).TryParse(out n)) {\r\n\t\t\t\t\t\tValue = new PdfNumber(n);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tcase PdfObject.NAME:\r\n\t\t\t\t\tValue = new PdfName((string)value); break;\r\n\t\t\t\tcase PdfObject.BOOLEAN:\r\n\t\t\t\t\tValue = new PdfBoolean((bool)value); break;\r\n\t\t\t}\r\n\t\t\tif (Parent != null) {\r\n\t\t\t\tif ((Parent.ExtensiveObject ?? Parent.Value) is PdfDictionary pd) {\r\n\t\t\t\t\tpd.Put(new PdfName(Name), Value);\r\n\t\t\t\t\t_Children = null;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tif ((Parent.ExtensiveObject ?? Parent.Value) is PdfArray pa) {\r\n\t\t\t\t\tpa.ArrayList[Int32.Parse(Name) - 1] = Value;\r\n\t\t\t\t\t_Children = null;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tDocumentObject GetPageObject() {\r\n\t\t\tvar p = this;\r\n\t\t\twhile (p?.Type != PdfObjectType.Page) {\r\n\t\t\t\tp = p.Parent;\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\t}\r\n\r\n\t\tprivate static string GetItemValueText(PdfObject po, PdfObject eo) {\r\n\t\t\tif (po == null && eo == null) {\r\n\t\t\t\tgoto Exit;\r\n\t\t\t}\r\n\t\t\tif (po == null) {\r\n\t\t\t\tpo = eo;\r\n\t\t\t\teo = null;\r\n\t\t\t}\r\n\t\t\tswitch (po.Type) {\r\n\t\t\t\tcase PdfObject.DICTIONARY: return $\"<<{((PdfDictionary)po).Size} 子项>>\";\r\n\t\t\t\tcase PdfObject.INDIRECT:\r\n\t\t\t\t\treturn eo == null || __CompoundTypes.Contains(eo.Type)\r\n\t\t\t\t\t\t? ((PdfIndirectReference)po).ToString()\r\n\t\t\t\t\t\t: $\"{(PdfIndirectReference)po}→{GetItemValueText(null, eo)}\";\r\n\t\t\t\tcase PdfObject.NAME: return PdfHelper.DecodeKeyName(po);\r\n\t\t\t\tcase PdfObject.NUMBER: return ((PdfNumber)po).DoubleValue.ToText();\r\n\t\t\t\tcase PdfObject.STRING: return ((PdfString)po).Decode(null);\r\n\t\t\t\tcase PdfObject.STREAM: goto case PdfObject.DICTIONARY;\r\n\t\t\t\tcase PdfObject.ARRAY: return PdfHelper.GetArrayString((PdfArray)po);\r\n\t\t\t\tcase PdfObject.BOOLEAN: return ((PdfBoolean)po).ToString();\r\n\t\t\t\tcase PdfObject.NULL: return \"Null\";\r\n\t\t\t}\r\n\t\tExit:\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tinternal string GetContextName() {\r\n\t\t\tvar d = this;\r\n\t\t\tstring contextName = null;\r\n\t\t\tif (d.Type != PdfObjectType.Normal) {\r\n\t\t\t\tswitch (d.Type) {\r\n\t\t\t\t\tcase PdfObjectType.Page:\r\n\t\t\t\t\t\treturn \"Page\";\r\n\t\t\t\t\tcase PdfObjectType.Image:\r\n\t\t\t\t\t\treturn \"Image\";\r\n\t\t\t\t\tcase PdfObjectType.Form:\r\n\t\t\t\t\t\treturn \"Form\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twhile ((!d.IsKeyObject || String.IsNullOrEmpty(contextName = d.Name)) && (d = d.Parent) != null) {\r\n\t\t\t}\r\n\t\t\treturn contextName;\r\n\t\t}\r\n\r\n\t\tinternal IList<DocumentObject> PopulateChildren(bool refresh) {\r\n\t\t\tif (refresh) {\r\n\t\t\t\t_Children = null;\r\n\t\t\t}\r\n\t\t\tif (_Children == null) {\r\n\t\t\t\tif (Type == PdfObjectType.Page && Value == null) {\r\n\t\t\t\t\tValue = OwnerDocument.Document.GetPageN((int)ExtensiveObject);\r\n\t\t\t\t}\r\n\t\t\t\telse if (Type != PdfObjectType.Normal) {\r\n\t\t\t\t\tPopulateChildrenForSpecialObject();\r\n\t\t\t\t}\r\n\t\t\t\tif (_Children == null) {\r\n\t\t\t\t\tPopulateChildrenForNormalObject();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn _Children;\r\n\t\t}\r\n\r\n\t\tprivate void PopulateChildrenForNormalObject() {\r\n\t\t\tvar po = (ExtensiveObject as PdfObject) ?? Value;\r\n\t\t\t_Children = __Leaf;\r\n\t\t\tif (po == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (po.Type == PdfObject.DICTIONARY || po.Type == PdfObject.STREAM) {\r\n\t\t\t\tvar pd = po as PdfDictionary;\r\n\t\t\t\tvar cs = Type == PdfObjectType.Page || Type == PdfObjectType.Form; // 是否有 content stream\r\n\t\t\t\tvar r = new DocumentObject[pd.Size + (cs ? 1 : 0)];\r\n\t\t\t\tvar n = 0;\r\n\t\t\t\tforeach (var item in pd) {\r\n\t\t\t\t\tvar d = new DocumentObject(OwnerDocument, this, PdfHelper.DecodeKeyName(item.Key), item.Value);\r\n\t\t\t\t\tr[n++] = d;\r\n\t\t\t\t\tvar i = PdfStructInfo.GetInfo(GetContextName(), d.Name);\r\n\t\t\t\t\tif (i.Name != null && i.IsKeyObject) {\r\n\t\t\t\t\t\td.IsKeyObject = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (String.IsNullOrEmpty(i.ImageKey) == false) {\r\n\t\t\t\t\t\td.ImageKey = i.ImageKey;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (cs) {\r\n\t\t\t\t\tr[n++] = new DocumentObject(OwnerDocument, this, Constants.Content.Operators, null, PdfObjectType.PageCommands) { IsKeyObject = true };\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tswitch (Type) {\r\n\t\t\t\t\t\tcase PdfObjectType.Trailer: {\r\n\t\t\t\t\t\t\t\tvar d = Array.Find(r, (o) => o.Name == \"Root\");\r\n\t\t\t\t\t\t\t\tif (d != null) {\r\n\t\t\t\t\t\t\t\t\td.Type = PdfObjectType.Root;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase PdfObjectType.Root: {\r\n\t\t\t\t\t\t\t\tvar d = Array.Find(r, (o) => o.Name == \"Outlines\");\r\n\t\t\t\t\t\t\t\tif (d != null) {\r\n\t\t\t\t\t\t\t\t\td.Type = PdfObjectType.Outline;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase PdfObjectType.Outline: {\r\n\t\t\t\t\t\t\t\tvar o = new List<DocumentObject>(r);\r\n\t\t\t\t\t\t\t\tvar or = pd.Get(PdfName.FIRST);\r\n\t\t\t\t\t\t\t\tpd = PdfReader.GetPdfObject(or) as PdfDictionary;\r\n\t\t\t\t\t\t\t\tif (pd != null) {\r\n\t\t\t\t\t\t\t\t\to.Add(new DocumentObject(OwnerDocument, this, Constants.Bookmark, or, PdfObjectType.Outline) {\r\n\t\t\t\t\t\t\t\t\t\tDescription = pd.Contains(PdfName.TITLE) ? pd.GetAsString(PdfName.TITLE).ToUnicodeString() : null\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\twhile ((or = pd.Get(PdfName.NEXT)) != null\r\n\t\t\t\t\t\t\t\t\t\t&& (pd = PdfReader.GetPdfObject(or) as PdfDictionary) != null) {\r\n\t\t\t\t\t\t\t\t\t\to.Add(new DocumentObject(OwnerDocument, this, Constants.Bookmark, or, PdfObjectType.Outline) {\r\n\t\t\t\t\t\t\t\t\t\t\tDescription = pd.Contains(PdfName.TITLE) ? pd.GetAsString(PdfName.TITLE).ToUnicodeString() : null\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t_Children = o;\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t_Children = r;\r\n\t\t\t}\r\n\t\t\telse if (po.Type == PdfObject.ARRAY) {\r\n\t\t\t\tvar pd = (PdfArray)po;\r\n\t\t\t\tvar r = new DocumentObject[pd.Size];\r\n\t\t\t\tvar n = 0;\r\n\t\t\t\tforeach (var item in pd.ArrayList) {\r\n\t\t\t\t\tvar d = new DocumentObject(OwnerDocument, this, (++n).ToText(), item);\r\n\t\t\t\t\tr[n - 1] = d;\r\n\t\t\t\t\tvar i = PdfStructInfo.GetInfo(GetContextName(), d.Name);\r\n\t\t\t\t\tif (i.Name != null && i.IsKeyObject) {\r\n\t\t\t\t\t\td.IsKeyObject = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (String.IsNullOrEmpty(i.ImageKey) == false) {\r\n\t\t\t\t\t\td.ImageKey = i.ImageKey;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t_Children = r;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void PopulateChildrenForSpecialObject() {\r\n\t\t\tvar pdf = OwnerDocument.Document;\r\n\t\t\tswitch (Type) {\r\n\t\t\t\tcase PdfObjectType.Pages: {\r\n\t\t\t\t\t\tif (pdf.NumberOfPages == 0) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar r = PageRangeCollection.Parse(ExtensiveObject as string, 1, pdf.NumberOfPages, true);\r\n\t\t\t\t\t\tvar pn = new DocumentObject[r.TotalPages];\r\n\t\t\t\t\t\tvar i = 0;\r\n\t\t\t\t\t\tforeach (var item in r) {\r\n\t\t\t\t\t\t\tforeach (var p in item) {\r\n\t\t\t\t\t\t\t\tpn[i++] = new DocumentObject(OwnerDocument, this, $\"第{p}页\", null, PdfObjectType.Page) { ExtensiveObject = p };\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_Children = pn;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase PdfObjectType.PageCommands: {\r\n\t\t\t\t\t\t// 解释页面指令\r\n\t\t\t\t\t\tvar cp = new PdfPageCommandProcessor();\r\n\t\t\t\t\t\tif (Parent.Type == PdfObjectType.Page) {\r\n\t\t\t\t\t\t\tvar pn = (int)Parent.ExtensiveObject;\r\n\t\t\t\t\t\t\tcp.ProcessContent(pdf.GetPageContent(pn), pdf.GetPageN(pn).GetAsDict(PdfName.RESOURCES));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (Parent.Type == PdfObjectType.Form) {\r\n\t\t\t\t\t\t\tvar form = PdfReader.GetPdfObjectRelease(Parent.Value) as PRStream;\r\n\t\t\t\t\t\t\tcp.ProcessContent(PdfReader.GetStreamBytes(form),\r\n\t\t\t\t\t\t\t\tnew CompositePdfDictionary(form.GetAsDict(PdfName.RESOURCES),\r\n\t\t\t\t\t\t\t\t\tpdf.GetPageN((int)GetPageObject().ExtensiveObject).GetAsDict(PdfName.RESOURCES))\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tforeach (var item in cp.Commands) {\r\n\t\t\t\t\t\t\tPopulatePageCommand(item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (cp.LastError != null) {\r\n\t\t\t\t\t\t\tDescription = cp.LastError;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase PdfObjectType.PageCommand:\r\n\t\t\t\t\t_Children = __Leaf;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObjectType.Hidden: {\r\n\t\t\t\t\t\tvar ul = PdfHelper.ListUnusedObjects(pdf, AppContext.LoadPartialPdfFile);\r\n\t\t\t\t\t\tExtensiveObject = ul;\r\n\t\t\t\t\t\tvar uo = new List<DocumentObject>();\r\n\t\t\t\t\t\tforeach (var item in ul) {\r\n\t\t\t\t\t\t\tvar u = pdf.GetPdfObjectRelease(item);\r\n\t\t\t\t\t\t\tif (u != null) {\r\n\t\t\t\t\t\t\t\tuo.Add(new DocumentObject(OwnerDocument, this, item.ToText(), u));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_Children = uo;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void PopulatePageCommand(PdfPageCommand item) {\r\n\t\t\tstring fn;\r\n\t\t\tvar op = item.Name.ToString();\r\n\t\t\tif (!PdfPageCommand.GetFriendlyCommandName(op, out fn)) {\r\n\t\t\t\tfn = \"未知操作符\";\r\n\t\t\t}\r\n\t\t\tvar o = new DocumentObject(OwnerDocument, this, fn, null, PdfObjectType.PageCommand) {\r\n\t\t\t\tFriendlyName = fn + \"(\" + op + \")\",\r\n\t\t\t\tExtensiveObject = op\r\n\t\t\t};\r\n\t\t\tif (item.Type == PdfPageCommandType.Text) {\r\n\t\t\t\tvar t = item as TextCommand;\r\n\t\t\t\to.FriendlyValue = t.TextInfo.PdfString.GetFriendlyValue();\r\n\t\t\t\to.Description = t.TextInfo.Text;\r\n\t\t\t\tif (item.Name.ToString() == \"TJ\") {\r\n\t\t\t\t\tvar a = item.Operands[0] as PdfArray;\r\n\t\t\t\t\tif (a.Size > 0) {\r\n\t\t\t\t\t\tvar pt = item as PaceAndTextCommand;\r\n\t\t\t\t\t\tvar i = 0;\r\n\t\t\t\t\t\tCreateChildrenList(ref o._Children);\r\n\t\t\t\t\t\tforeach (var ti in a.ArrayList) {\r\n\t\t\t\t\t\t\tvar d = new DocumentObject(OwnerDocument, o, (++i).ToText(), ti);\r\n\t\t\t\t\t\t\tif (ti.Type == PdfObject.STRING) {\r\n\t\t\t\t\t\t\t\td.FriendlyValue = ((PdfString)ti).GetFriendlyValue();\r\n\t\t\t\t\t\t\t\td.Description = pt.DecodedTexts[i - 1];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\to._Children.Add(d);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (item.Type == PdfPageCommandType.Font) {\r\n\t\t\t\tvar f = item as FontCommand;\r\n\t\t\t\to.FriendlyValue = String.Concat(\r\n\t\t\t\t\tConstants.Content.OperandNames.ResourceName, \"：\", f.ResourceName.ToString(), \"; \",\r\n\t\t\t\t\tConstants.Content.OperandNames.Size, \"：\", f.FontSize.DoubleValue.ToText()\r\n\t\t\t\t\t);\r\n\t\t\t\to.Description = f.FontName;\r\n\t\t\t}\r\n\t\t\telse if (item.Type == PdfPageCommandType.Enclosure) {\r\n\t\t\t\tif (item.Operands.HasContent()) {\r\n\t\t\t\t\tvar i = 0;\r\n\t\t\t\t\tCreateChildrenList(ref o._Children);\r\n\t\t\t\t\tforeach (var t in item.Operands) {\r\n\t\t\t\t\t\to._Children.Add(new DocumentObject(OwnerDocument, o, (++i).ToText(), t));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar e = (EnclosingCommand)item;\r\n\t\t\t\tif (!e.HasCommand) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var cmd in e.Commands) {\r\n\t\t\t\t\to.PopulatePageCommand(cmd);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (item.Type == PdfPageCommandType.InlineImage) {\r\n\t\t\t\tvar s = (PdfImageData)item.Operands[0];\r\n\t\t\t\tCreateChildrenList(ref o._Children);\r\n\t\t\t\tforeach (var ii in s) {\r\n\t\t\t\t\to._Children.Add(new DocumentObject(OwnerDocument, o, PdfHelper.DecodeKeyName(ii.Key), ii.Value));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (item.Type == PdfPageCommandType.Invalid) {\r\n\t\t\t\to.Description = ((InvalidCommand)item).Error;\r\n\t\t\t\to.ExtensiveObject = \"?\";\r\n\t\t\t\tif (item.Operands.HasContent()) {\r\n\t\t\t\t\tvar i = 0;\r\n\t\t\t\t\tCreateChildrenList(ref o._Children);\r\n\t\t\t\t\tforeach (var t in item.Operands) {\r\n\t\t\t\t\t\to._Children.Add(new DocumentObject(OwnerDocument, o, (++i).ToText(), t));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\to.FriendlyValue = item.GetOperandsText();\r\n\t\t\t}\r\n\t\t\tCreateChildrenList(ref _Children);\r\n\t\t\t_Children.Add(o);\r\n\t\t}\r\n\r\n\t\tstatic void CreateChildrenList(ref IList<DocumentObject> list) {\r\n\t\t\tif (list == null || list == __Leaf) {\r\n\t\t\t\tlist = new List<DocumentObject>();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class CompositePdfDictionary(PdfDictionary primary, PdfDictionary auxiliary) : PdfDictionary\r\n\t\t{\r\n\t\t\tpublic new IEnumerable<PdfName> Keys => GetKeyValues().Select(i => i.Key);\r\n\t\t\tpublic override int Size => (primary?.Size ?? 0) + (auxiliary?.Size ?? 0);\r\n\t\t\tpublic override PdfObject GetDirectObject(PdfName key) {\r\n\t\t\t\tvar po = primary?.GetDirectObject(key);\r\n\t\t\t\tif (po is PdfDictionary pd) {\r\n\t\t\t\t\tif (auxiliary != null) {\r\n\t\t\t\t\t\tvar ao = auxiliary.GetDirectObject(key);\r\n\t\t\t\t\t\treturn ao is PdfDictionary ad ? new CompositePdfDictionary(pd, ad) : pd;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treturn pd;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn primary?.GetDirectObject(key) ?? auxiliary?.GetDirectObject(key);\r\n\t\t\t}\r\n\t\t\tpublic override bool Contains(PdfName key) {\r\n\t\t\t\treturn primary?.Contains(key) ?? auxiliary?.Contains(key) ?? false;\r\n\t\t\t}\r\n\t\t\tpublic new IEnumerator<KeyValuePair<PdfName, PdfObject>> GetEnumerator() {\r\n\t\t\t\treturn GetKeyValues().GetEnumerator();\r\n\t\t\t}\r\n\t\t\tpublic IEnumerable<KeyValuePair<PdfName, PdfObject>> GetKeyValues() {\r\n\t\t\t\tif (primary != null) {\r\n\t\t\t\t\tforeach (var item in primary) {\r\n\t\t\t\t\t\tyield return new KeyValuePair<PdfName, PdfObject>(item.Key, item.Value);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (auxiliary != null) {\r\n\t\t\t\t\tforeach (var item in auxiliary) {\r\n\t\t\t\t\t\tif (primary?.Contains(item.Key) == false) {\r\n\t\t\t\t\t\t\tyield return new KeyValuePair<PdfName, PdfObject>(item.Key, item.Value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/FontInfo.cs",
    "content": "﻿using System;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tsealed class FontInfo : CMapAwareDocumentFont\r\n\t{\r\n\t\t[Flags]\r\n\t\tinternal enum CjkFontType\r\n\t\t{\r\n\t\t\tUnknown,\r\n\t\t\tCJK = 0x01,\r\n\t\t\tChinese = 0x02 + CJK,\r\n\t\t\tGb18030Chinese = 0x0100 + Chinese,\r\n\t\t\tBig5Chinese = 0x0200 + Chinese,\r\n\t\t\tJapanese = 0x04 + CJK,\r\n\t\t\tKorean = 0x08 + CJK,\r\n\t\t\tUnicode = 0x4000,\r\n\t\t\tNone = 0x8000\r\n\t\t}\r\n\r\n\t\treadonly static Encoding __GbkEncoding = System.Text.Encoding.GetEncoding(\"gbk\");\r\n\t\treadonly static PdfName[] __GbkEncodingNames = [new PdfName(\"GBK-EUC-H\"), new PdfName(\"GBK-EUC-V\"), new PdfName(\"GB-EUC-H\"), new PdfName(\"GB-EUC-V\"), PdfName.WIN_ANSI_ENCODING];\r\n\t\treadonly static string[] __gbkFontNames = [\"宋体\", \"黑体\", \"楷体_GB2312\", \"仿宋体\", \"仿宋_GB2312\", \"隶书\", \"幼圆\"];\r\n\t\treadonly static PdfName[] __IdentityEncodingNames = [new PdfName(\"Identity-H\"), new PdfName(\"Identity-V\")];\r\n\t\tpublic const int DefaultDefaultWidth = 1000;\r\n\r\n\t\treadonly PdfDictionary _Font;\r\n\t\tPdfDictionary _FontDescriptor;\r\n\t\tinternal PdfDictionary FontDescriptor {\r\n\t\t\tget {\r\n\t\t\t\tif (_FontDescriptor == null) {\r\n\t\t\t\t\t_FontDescriptor = _Font.Locate<PdfArray>(PdfName.DESCENDANTFONTS).Locate<PdfDictionary>(0).Locate<PdfDictionary>(PdfName.FONTDESCRIPTOR);\r\n\t\t\t\t\t_FontDescriptor ??= new PdfDictionary();\r\n\t\t\t\t}\r\n\t\t\t\treturn _FontDescriptor;\r\n\t\t\t}\r\n\t\t}\r\n\t\tstring _FontName;\r\n\t\tinternal string FontName {\r\n\t\t\tget {\r\n\t\t\t\tif (_FontName == null) {\r\n\t\t\t\t\tvar f = FontDescriptor.GetAsName(PdfName.FONTNAME);\r\n\t\t\t\t\tif (f != null) {\r\n\t\t\t\t\t\t_FontName = PdfName.DecodeName(f.ToString());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar fn = PostscriptFontName;\r\n\t\t\t\t\t\tvar i = fn.LastIndexOf(',');\r\n\t\t\t\t\t\tif (i != -1) {\r\n\t\t\t\t\t\t\tfn = fn.Substring(0, i);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_FontName = fn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 删除子集的名称\r\n\t\t\t\t\t_FontName = PdfDocumentFont.RemoveSubsetPrefix(_FontName);\r\n\t\t\t\t}\r\n\t\t\t\treturn _FontName;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tCjkFontType _CjkFontType = CjkFontType.Unknown;\r\n\t\tinternal CjkFontType CjkType {\r\n\t\t\tget {\r\n\t\t\t\tif (_CjkFontType == CjkFontType.Unknown) {\r\n\t\t\t\t\tInitCjkFontType();\r\n\t\t\t\t}\r\n\t\t\t\treturn _CjkFontType;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tint _DefaultWidth = -1;\r\n\t\tpublic int DefaultWidth {\r\n\t\t\tget {\r\n\t\t\t\tif (_DefaultWidth == -1) {\r\n\t\t\t\t\tvar w = _Font.Locate<PdfNumber>(PdfName.DESCENDANTFONTS, 0, PdfName.DW);\r\n\t\t\t\t\t_DefaultWidth = w == null ? DefaultDefaultWidth : w.IntValue;\r\n\t\t\t\t}\r\n\t\t\t\treturn _DefaultWidth;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void InitCjkFontType() {\r\n\t\t\tif (_Font.Contains(PdfName.TOUNICODE)) {\r\n\t\t\t\t_CjkFontType = CjkFontType.None;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar encoding = _Font.GetAsName(PdfName.ENCODING);\r\n\t\t\tvar fn = FontName.ToUpperInvariant();\r\n\t\t\tvar c = __gbkFontNames.Contains(fn) || __GbkEncodingNames.Contains(encoding);\r\n\t\t\t_CjkFontType = c ? CjkFontType.Chinese : CjkFontType.None;\r\n\t\t\tif (_CjkFontType != CjkFontType.None) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tc = __IdentityEncodingNames.Contains(encoding);\r\n\t\t\tif (c) {\r\n\t\t\t\t_CjkFontType = CjkFontType.Unicode;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treadonly int _FontID = -1;\r\n\t\tinternal int FontID => _FontID;\r\n\r\n\t\tpublic FontInfo(PdfDictionary font, int refNumber)\r\n\t\t\t: base(font) {\r\n\t\t\t_Font = font;\r\n\t\t\t_FontID = refNumber;\r\n\t\t}\r\n\t\tpublic FontInfo(PRIndirectReference refFont) : base(refFont) {\r\n\t\t\t_Font = (PdfDictionary)PdfReader.GetPdfObjectRelease(refFont);\r\n\t\t\t_FontID = refFont.Number;\r\n\t\t}\r\n\r\n\t\tstatic byte[] __CidSlot = new byte[2];\r\n\t\tinternal int DecodeCidToUnicode(iTextSharp.text.pdf.fonts.cmaps.CMapCidUni cMap, int cid) {\r\n\t\t\tstring s;\r\n\t\t\tif (AppContext.Encodings.TextEncoding != null) {\r\n\t\t\t\t__CidSlot[0] = (byte)(cid >> 8);\r\n\t\t\t\t__CidSlot[1] = (byte)cid;\r\n\t\t\t\ts = AppContext.Encodings.TextEncoding.GetString(__CidSlot);\r\n\t\t\t}\r\n\t\t\telse if (cMap != null) {\r\n\t\t\t\treturn cMap.Lookup(cid);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t__CidSlot[0] = (byte)(cid >> 8);\r\n\t\t\t\t__CidSlot[1] = (byte)cid;\r\n\t\t\t\ts = Decode(__CidSlot, 0, 2);\r\n\t\t\t}\r\n\t\t\tif (s.Length == 0) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\treturn s[0];\r\n\t\t}\r\n\r\n\t\tinternal string DecodeTextBytes(byte[] bytes) {\r\n\t\t\tif (AppContext.Encodings.TextEncoding != null) {\r\n\t\t\t\treturn AppContext.Encodings.TextEncoding.GetString(bytes);\r\n\t\t\t}\r\n\t\t\tif (CjkType == CjkFontType.Chinese) {\r\n\t\t\t\treturn __GbkEncoding.GetString(bytes);\r\n\t\t\t}\r\n\t\t\treturn Decode(bytes, 0, bytes.Length);\r\n\t\t}\r\n\t\tinternal string DecodeText(PdfString text) {\r\n\t\t\treturn DecodeTextBytes(text.GetBytes());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/GeneralInfo.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[XmlRoot(Constants.Info.ThisName)]\r\n\tpublic class GeneralInfo\r\n\t{\r\n\t\t[XmlAttribute(\"指定文档元数据属性\")]\r\n\t\tpublic bool SpecifyMetaData { get; set; }\r\n\t\t[XmlAttribute(\"重写XML元数据属性\")]\r\n\t\tpublic bool RewriteXmp { get; set; }\r\n\r\n\t\t[XmlAttribute(Constants.Info.Title)]\r\n\t\tpublic string Title { get; set; }\r\n\t\t[XmlAttribute(Constants.Info.Author)]\r\n\t\tpublic string Author { get; set; }\r\n\t\t[XmlAttribute(Constants.Info.Subject)]\r\n\t\tpublic string Subject { get; set; }\r\n\t\t[XmlAttribute(Constants.Info.Keywords)]\r\n\t\tpublic string Keywords { get; set; }\r\n\r\n\t\t[XmlIgnore]\r\n\t\tpublic string Creator { get; set; }\r\n\t\t[XmlIgnore]\r\n\t\tpublic string Producer { get; set; }\r\n\t\t[XmlIgnore]\r\n\t\tpublic string CreationDate { get; set; }\r\n\t\t[XmlIgnore]\r\n\t\tpublic string ModDate { get; set; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/GraphicsState.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf.parser;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinternal sealed class GraphicsState\r\n\t{\r\n\t\tinternal Matrix TransMatrix { get; set; }\r\n\t\tinternal float CharacterSpacing { get; set; }\r\n\t\tinternal float WordSpacing { get; set; }\r\n\t\tinternal float HorizontalScaling { get; set; }\r\n\t\tinternal float Leading { get; set; }\r\n\t\tinternal int FontID { get; set; }\r\n\t\tinternal FontInfo Font { get; set; }\r\n\t\tinternal float FontSize { get; set; }\r\n\t\tinternal int RenderMode { get; set; }\r\n\t\tinternal float Rise { get; set; }\r\n\t\tinternal bool KnockOut { get; set; }\r\n\r\n\t\t/**\r\n         * Constructs a new Graphics State object with the default values.\r\n         */\r\n\t\tpublic GraphicsState() {\r\n\t\t\tTransMatrix = new Matrix();\r\n\t\t\tCharacterSpacing = 0;\r\n\t\t\tWordSpacing = 0;\r\n\t\t\tHorizontalScaling = 1.0f;\r\n\t\t\tLeading = 0;\r\n\t\t\tFont = null;\r\n\t\t\tFontSize = 0;\r\n\t\t\tRenderMode = 0;\r\n\t\t\tRise = 0;\r\n\t\t\tKnockOut = true;\r\n\t\t}\r\n\r\n\t\tpublic GraphicsState Copy() {\r\n\t\t\treturn MemberwiseClone() as GraphicsState;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/IHierarchicalObject.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinterface IHierarchicalObject<T>\r\n\t{\r\n\t\tbool HasChildren { get; }\r\n\t\tICollection<T> Children { get; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ITextRegion.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinterface ITextRegion\r\n\t{\r\n\t\tstring Text { get; }\r\n\t\tBound Region { get; }\r\n\t}\r\n\r\n\tinterface IDirectionalBoundObject : ITextRegion\r\n\t{\r\n\t\tWritingDirection Direction { get; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/InsertBookmarkPositionType.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic enum InsertBookmarkPositionType\r\n\t{\r\n\t\tUndefined,\r\n\t\tAfterCurrent,\r\n\t\tAsChild,\r\n\t\tAfterParent,\r\n\t\tBeforeCurrent,\r\n\t\tAfterGrandParent,\r\n\t\tLastRoot\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/Margins.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic class Margins\r\n\t{\r\n\t\t[XmlAttribute(Constants.Coordinates.Top)]\r\n\t\tpublic float Top { get; set; }\r\n\t\t[XmlAttribute(Constants.Coordinates.Right)]\r\n\t\tpublic float Right { get; set; }\r\n\t\t[XmlAttribute(Constants.Coordinates.Left)]\r\n\t\tpublic float Left { get; set; }\r\n\t\t[XmlAttribute(Constants.Coordinates.Bottom)]\r\n\t\tpublic float Bottom { get; set; }\r\n\t\t[XmlAttribute(Constants.Coordinates.ScaleFactor)]\r\n\t\tpublic bool IsRelative { get; set; }\r\n\r\n\t\tpublic bool IsEmpty => Top == 0 && Bottom == 0 && Left == 0 && Right == 0;\r\n\r\n\t\tpublic Margins() {\r\n\t\t}\r\n\r\n\t\tpublic Margins(float left, float top, float right, float bottom) {\r\n\t\t\tTop = top;\r\n\t\t\tLeft = left;\r\n\t\t\tBottom = bottom;\r\n\t\t\tRight = right;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/MatchPattern.cs",
    "content": "﻿using System;\r\nusing System.Text.RegularExpressions;\r\nusing System.Xml;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic sealed class MatchPattern : ICloneable, IXmlSerializable\r\n\t{\r\n\t\t[XmlAttribute(\"名称\")]\r\n\t\tpublic string Name { get; set; }\r\n\r\n\t\t[XmlAttribute(\"匹配模板\")]\r\n\t\tpublic string Text { get; set; }\r\n\r\n\t\t[XmlAttribute(\"匹配大小写\")]\r\n\t\tpublic bool MatchCase { get; set; }\r\n\r\n\t\t[XmlAttribute(\"匹配全标题\")]\r\n\t\tpublic bool FullMatch { get; set; }\r\n\r\n\t\t[XmlAttribute(\"使用正则表达式\")]\r\n\t\tpublic bool UseRegularExpression { get; set; }\r\n\r\n\t\tpublic MatchPattern() {\r\n\t\t}\r\n\r\n\t\tpublic MatchPattern(string text, bool matchCase, bool fullMatch, bool useRegExp) {\r\n\t\t\tText = text;\r\n\t\t\tMatchCase = matchCase;\r\n\t\t\tFullMatch = fullMatch;\r\n\t\t\tUseRegularExpression = useRegExp;\r\n\t\t}\r\n\r\n\t\tpublic IMatcher CreateMatcher() {\r\n\t\t\tif (UseRegularExpression) {\r\n\t\t\t\treturn new RegexMatcher(this);\r\n\t\t\t}\r\n\t\t\treturn new SimpleMatcher(this);\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn String.IsNullOrEmpty(Name)\r\n\t\t\t\t? $\"{(UseRegularExpression ? \"正则表达式\" : \"文本\")}{(MatchCase ? \"区分大小写\" : String.Empty)}匹配 {Text}\"\r\n\t\t\t\t: $\"匹配{Name}\";\r\n\t\t}\r\n\r\n\t\t#region ICloneable 成员\r\n\r\n\t\tpublic object Clone() {\r\n\t\t\treturn new MatchPattern(Text, MatchCase, FullMatch, UseRegularExpression);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IXmlSerializable 成员\r\n\r\n\t\tpublic System.Xml.Schema.XmlSchema GetSchema() {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tpublic void ReadXml(XmlReader reader) {\r\n\t\t\tif (reader.Read() == false || reader.Name != \"pattern\") {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tName = reader.GetAttribute(\"name\");\r\n\t\t\tText = reader.GetAttribute(\"text\");\r\n\t\t\tMatchCase = reader.GetValue(\"matchCase\", false);\r\n\t\t\tFullMatch = reader.GetValue(\"fullMatch\", false);\r\n\t\t\tUseRegularExpression = reader.GetValue(\"useRegex\", false);\r\n\t\t}\r\n\r\n\t\tpublic void WriteXml(XmlWriter writer) {\r\n\t\t\twriter.WriteStartElement(\"pattern\");\r\n\t\t\twriter.WriteValue(\"name\", Name, null);\r\n\t\t\twriter.WriteValue(\"text\", Text, null);\r\n\t\t\twriter.WriteValue(\"matchCase\", MatchCase, false);\r\n\t\t\twriter.WriteValue(\"fullMatch\", FullMatch, false);\r\n\t\t\twriter.WriteValue(\"useRegex\", UseRegularExpression, false);\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tpublic interface IMatcher\r\n\t\t{\r\n\t\t\tbool Matches(string text);\r\n\t\t\tstring Replace(string text, string replacement);\r\n\t\t}\r\n\t\tsealed class RegexMatcher(MatchPattern pattern) : IMatcher\r\n\t\t{\r\n\t\t\treadonly Regex _regex = new Regex(pattern.Text,\r\n\t\t\t\t\t\t\t RegexOptions.Compiled | RegexOptions.CultureInvariant | (pattern.MatchCase ? RegexOptions.None : RegexOptions.IgnoreCase));\r\n\t\t\treadonly bool _fullMatch = pattern.FullMatch;\r\n\r\n\t\t\tpublic bool Matches(string text) {\r\n\t\t\t\tvar m = _regex.Match(text);\r\n\t\t\t\treturn m.Success && (_fullMatch == false || text.Length == m.Length);\r\n\t\t\t}\r\n\t\t\tpublic string Replace(string text, string replacement) {\r\n\t\t\t\treturn _regex.Replace(text, replacement);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsealed class SimpleMatcher(MatchPattern pattern) : IMatcher\r\n\t\t{\r\n\t\t\treadonly bool _fullMatch = pattern.FullMatch;\r\n\t\t\treadonly string _text = pattern.Text;\r\n\t\t\treadonly StringComparison _comparison = pattern.MatchCase ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;\r\n\r\n\t\t\tpublic bool Matches(string text) {\r\n\t\t\t\tif (String.IsNullOrEmpty(text)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tif (_fullMatch && text.Length != _text.Length) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tvar i = text.IndexOf(_text, _comparison);\r\n\t\t\t\treturn i != -1 && (_fullMatch == false || i == 0);\r\n\t\t\t}\r\n\t\t\tpublic string Replace(string text, string replacement) {\r\n\t\t\t\treturn Replace(text, _text, replacement, _comparison);\r\n\t\t\t}\r\n\t\t\tstatic string Replace(string original, string pattern, string replacement, StringComparison comparisonType) {\r\n\t\t\t\treturn Replace(original, pattern, replacement, comparisonType, -1);\r\n\t\t\t}\r\n\r\n\t\t\tstatic string Replace(string original, string pattern, string replacement, StringComparison comparisonType, int stringBuilderInitialSize) {\r\n\t\t\t\tif (original == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (String.IsNullOrEmpty(pattern)) {\r\n\t\t\t\t\treturn original;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar posCurrent = 0;\r\n\t\t\t\tvar lenPattern = pattern.Length;\r\n\t\t\t\tvar idxNext = original.IndexOf(pattern, comparisonType);\r\n\t\t\t\tvar result = StringBuilderCache.Acquire(stringBuilderInitialSize < 0 ? Math.Min(4096, original.Length) : stringBuilderInitialSize);\r\n\r\n\t\t\t\twhile (idxNext >= 0) {\r\n\t\t\t\t\tresult.Append(original, posCurrent, idxNext - posCurrent)\r\n\t\t\t\t\t\t.Append(replacement);\r\n\r\n\t\t\t\t\tposCurrent = idxNext + lenPattern;\r\n\r\n\t\t\t\t\tidxNext = original.IndexOf(pattern, posCurrent, comparisonType);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresult.Append(original, posCurrent, original.Length - posCurrent);\r\n\r\n\t\t\t\treturn StringBuilderCache.GetStringAndRelease(result);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PDFStructInfo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n<PDF xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"PDFStructInfo.xsd\">\r\n\t<Global>\r\n\t\t<Info Token=\"ColorSpace\" Name=\"ɫ\" Description=\"ȾͼƬıɫ&#13;&#10;ɫУDeviceRGBɫDeviceGrayҶȡڰףDeviceCMYKϻƺɫӡˢ Indexedָɫɫ256ɫ\"/>\r\n\t\t<Info Token=\"DecodeParms\" Name=\"ѹ\"/>\r\n\t\t<Info Token=\"PieceInfo\" Name=\"˽Ϣ\"/>\r\n\t\t<Info Token=\"Filter\" Name=\"ѹʽ\" Description=\"ѹݵķʽ\">\r\n\t\t\t<RefInfo Token=\"DecodeParms\"/>\r\n\t\t</Info>\r\n\t\t<Info Token=\"Length\" Name=\"\"/>\r\n\t\t<Info Token=\"ProcSet\" Name=\"̼\" Description=\"ҳעʹõĹ̼ϣProcedure SetУPDFTextıImageBڰͼ񣩺 ImageCɫͼ\"/>\r\n\t\t<Info Token=\"Resources\" Name=\"Դ\" Description=\"ҳ桢עʹõͼƬȶԴ\">\r\n\t\t\t<Info Token=\"XObject\" Name=\"ⲿ\" Description=\"ʾȾҳָʹõĶ&#13;&#10;Щҳָ֮ⶨģʳΪⲿ󡱣External Object&#13;&#10;ҳָУʹáDoʾⲿ\">\r\n\t\t\t\t<Info Token=\"Image\" Name=\"ͼƬ\">\r\n\t\t\t\t\t<Info Token=\"Subtype\" Name=\"ⲿ\" Description=\"Image ʾͼƬ\"/>\r\n\t\t\t\t\t<Info Token=\"Height\" Name=\"ͼƬԭʼ߶\" Description=\"λ\" Required=\"true\"/>\r\n\t\t\t\t\t<Info Token=\"Width\" Name=\"ͼƬԭʼ\" Description=\"λ\" Required=\"true\"/>\r\n\t\t\t\t\t<Info Token=\"BitsPerComponent\" Name=\"عλ\" Description=\"ɫλȡֵɫΪ&#xD;&#xA;1˫ɫ&#xD;&#xA;24 ɫ&#xD;&#xA;416 ɫ&#xD;&#xA;816256 ɫϡ\"/>\r\n\t\t\t\t\t<Info Token=\"ImageMask\" Name=\"ɰ\" Description=\"ɰͼ˫ɫͼһ£ɰͼĶǲܱѡеġ\"/>\r\n\t\t\t\t\t<Info Token=\"Decode\" Name=\"\"/>\r\n\t\t\t\t\t<Info Token=\"Mask\" Name=\"ɰͼɰɫ\"/>\r\n\t\t\t\t\t<Info Token=\"SMask\" Name=\"ɰͼ\"/>\r\n\t\t\t\t\t<Info Token=\"Interpolate\" Name=\"ֵ\" Description=\"Ƿòֵ㷨ʾͼ\"/>\r\n\t\t\t\t\t<Info Token=\"Filter\" Name=\"ѹʽ\" Description=\"ѹͼ㷨㷨УDCTDecodeJPEG ѹFlateDecode൱ PNG ѹCCITTFaxDecode  JBIG2DecodeЧ˫ɫͼѹ㷨JPXDecodeJPEG2000 ѹ\">\r\n\t\t\t\t\t</Info>\r\n\t\t\t\t</Info>\r\n\t\t\t\t<Info Token=\"Form\" Name=\"\" Description=\"д֮⣬ΪһǶ PDF ҳ\">\r\n\t\t\t\t\t<Info Token=\"Subtype\" Name=\"ⲿ\" Description=\"Form ʾ\"/>\r\n\t\t\t\t\t<Info Token=\"BBox\" Name=\"߿\"/>\r\n\t\t\t\t</Info>\r\n\t\t\t</Info>\r\n\t\t\t<Info Token=\"Font\" Name=\"\">\r\n\t\t\t\t<Info Token=\"BaseFont\" Name=\"\"/>\r\n\t\t\t\t<Info Token=\"Subtype\" Name=\"\" Description=\"ȡֵʾ£&#xD;&#xA;Type0ɶ϶ɵĸ壻&#xD;&#xA;Type1ʹ PostScript Type 1 壻&#xD;&#xA;MMType1Multiple Master Type1 壻&#xD;&#xA;Type3 PDF ͼβ壻&#xD;&#xA;TrueTypeʹ True Type 壻&#xD;&#xA;CIDFontType0ʹ Type 1 ַʶ壨CID Font&#xD;&#xA;CIDFontType2ʹ True Type ַʶ塣&#xD;&#xA;ַʶͨɴַɵֿ⣬纺֡ PDF ĵʱTJ ַָʶֵַַָʶͨͳһֵҪȡıָıҪ ToUnicode תַʶתΪͳһʾַ\"/>\r\n\t\t\t\t<Info Token=\"Encoding\" Name=\"\" Description=\"õı뷽ʽ\"/>\r\n\t\t\t\t<Info Token=\"BaseEncoding\" Name=\"\" Description=\"õĻ뷽ʽ\"/>\r\n\t\t\t\t<Info Token=\"Differences\" Name=\"\" Description=\"õıĲ𣨲Ӧ True Type 壩\"/>\r\n\t\t\t\t<Info Token=\"DescendantFonts\" Name=\"Ӽ\"/>\r\n\t\t\t\t<Info Token=\"FirstChar\" Name=\"ȱַ\"/>\r\n\t\t\t\t<Info Token=\"LastChar\" Name=\"ȱβַ\"/>\r\n\t\t\t\t<Info Token=\"Widths\" Name=\"ȱ\" Description=\"ʾ FirstChar  LastChar Χڸַȵ飬ÿֵַ 1000 ǵλ\"/>\r\n\t\t\t\t<Info Token=\"FontDescriptor\" Name=\"Ϣ\">\r\n\t\t\t\t\t<Info Token=\"FontName\" Name=\"\"/>\r\n\t\t\t\t\t<Info Token=\"FontBBox\" Name=\"߿\"/>\r\n\t\t\t\t\t<Info Token=\"Ascent\" Name=\"߸߶\" Description=\"ַϷ\"/>\r\n\t\t\t\t\t<Info Token=\"Descent\" Name=\"\" Description=\"ַײ·룬ֵӦΪ\"/>\r\n\t\t\t\t\t<Info Token=\"AvgWidth\" Name=\"ƽ\"/>\r\n\t\t\t\t\t<Info Token=\"MaxWidth\" Name=\"\"/>\r\n\t\t\t\t\t<Info Token=\"CharSet\" Name=\"ַ\"/>\r\n\t\t\t\t\t<Info Token=\"FontFamily\" Name=\"\" Description=\"ʽƵƣ Times Bold ItalicTimes б壩Ϊ Times\"/>\r\n\t\t\t\t\t<Info Token=\"FontWeight\" Name=\"\" Description=\"ϸ̶\"/>\r\n\t\t\t\t\t<Info Token=\"Lang\" Name=\"\"/>\r\n\t\t\t\t\t<Info Token=\"ItalicAngle\" Name=\"бǶ\" Description=\"ķʱбǶ\"/>\r\n\t\t\t\t\t<Info Token=\"FontFile\" Name=\"Ƕ\" Description=\"Ƕ Type 0 \" ImageKey=\"Font\"/>\r\n\t\t\t\t\t<Info Token=\"FontFile2\" Name=\"Ƕ\" Description=\"Ƕ True Type \" ImageKey=\"Font\"/>\r\n\t\t\t\t\t<Info Token=\"FontFile3\" Name=\"Ƕ\" Description=\"ָ͵Ƕ\" ImageKey=\"Font\"/>\r\n\t\t\t\t\t<Info Token=\"Length1\" Name=\"ѹĳ\" Description=\"Ƕѹֽ\"/>\r\n\t\t\t\t</Info>\r\n\t\t\t\t<Info Token=\"ToUnicode\" Name=\"ͳһӳ\" Description=\"Ƕַʶֵͳһֵתӳ\"/>\r\n\t\t\t\t<Info Token=\"FontBBox\" Name=\"߿\"/>\r\n\t\t\t\t<Info Token=\"CharProcs\" Name=\"ַƹ\" Description=\"źڻָֵ\"/>\r\n\t\t\t\t<Info Token=\"FontMatrix\" Name=\"\" Description=\"ϵתΪıϵת\"/>\r\n\t\t\t\t<Info Token=\"Resources\" Name=\"Դ\" Description=\" Type 3 ʹõͼԴ\"/>\r\n\t\t\t\t<Info Token=\"CIDSystemInfo\" Name=\"ַʶϵͳϢ\"/>\r\n\t\t\t\t<Info Token=\"DW\" Name=\"Ĭַ\" Description=\"ĬΪ 1000\"/>\r\n\t\t\t\t<Info Token=\"W\" Name=\"οб\" Description=\"ʾCIDַȵ飨ÿֵַ 1000 ǵλȣ&#xD;&#xA;ĬϿֵ DW ֵָ&#xD;&#xA;ַָʽ&#xD;&#xA;ٵַȣ&#xD;&#xA;ַֹ&#xD;&#xA;ַȵĸʽΪַһ飬硰120 [400 325 500]ʾַ 120  122 ĿȷֱΪ 400325  500 λ&#xD;&#xA;ַֹȵĸʽΪʼַַȣ硰7080 8080 1000ʾַ 7080  8080 ĿΪ 1000 λ\"/>\r\n\t\t\t\t<Info Token=\"DW2\" Name=\"ĬַȺ͸߶\" Description=\"ĬΪ[880 -1000]\"/>\r\n\t\t\t\t<Info Token=\"W2\" Name=\"ַȺ͸߶\"/>\r\n\t\t\t\t<Info Token=\"CIDToGIDMap\" Name=\"ַʶַʶӳ\" Description=\"Ĭ£ַʶַڵλ\"/>\r\n\t\t\t</Info>\r\n\t\t\t<RefInfo Token=\"ProcSet\"/>\r\n\t\t\t<RefInfo Token=\"ColorSpace\"/>\r\n\t\t</Info>\r\n\t\t<Info Token=\"AP\" Name=\"ʽ\"/>\r\n\t\t<Info Token=\"BS\" Name=\"߿ʽ\"/>\r\n\t\t<Info Token=\"C\" Name=\"ɫ\"/>\r\n\t\t<Info Token=\"D\" Name=\"תضλõĶ\"/>\r\n\t\t<Info Token=\"Dests\" Name=\"תĿ\"/>\r\n\t\t<Info Token=\"Dest\" Name=\"תĿ\" />\r\n\t\t<Info Token=\"A\" Name=\"\" />\r\n\t\t<Info Token=\"Matrix\" Name=\"ڻͼתþ\"/>\r\n\t\t<Info Token=\"Rect\" Name=\"\"/>\r\n\t\t<Info Token=\"Type\" Name=\"ֵ\"/>\r\n\t\t<Info Token=\"SubType\" Name=\"\"/>\r\n\t\t<Info Token=\"StructParent\" Name=\"ĵṹϼڵ\"/>\r\n\t</Global>\r\n\t<Info Token=\"Trailer\" Name=\"ĵڵ\">\r\n\t\t<Info Token=\"Root\" Name=\"ĵ¼\" ImageKey=\"Trailer\" Required=\"true\">\r\n\t\t\t<Info Token=\"Pages\" Name=\"ĵҳ漯\" Description=\"ĵҳ\" ImageKey=\"Pages\" Required=\"true\">\r\n\t\t\t\t<Info Token=\"Kids\" Name=\"ĵҳӼ\">\r\n\t\t\t\t\t<Info Token=\"Count\" Name=\"ҳ\"/>\r\n\t\t\t\t\t<Info Token=\"Kids\" Name=\"ĵҳӼ\"/>\r\n\t\t\t\t</Info>\r\n\t\t\t\t<Info Token=\"Parent\" Name=\"ϼҳ漯\"/>\r\n\t\t\t\t<Info Token=\"Count\" Name=\"ҳ\"/>\r\n\t\t\t</Info>\r\n\t\t\t<Info Token=\"Outlines\" Name=\"ĵǩ\" ImageKey=\"Outlines\">\r\n\t\t\t\t<Info Token=\"First\" Name=\"һǩ\" />\r\n\t\t\t\t<Info Token=\"Last\" Name=\"һǩ\" />\r\n\t\t\t\t<Info Token=\"Parent\" Name=\"ϼǩ\" />\r\n\t\t\t\t<Info Token=\"Prev\" Name=\"ǰһǩ\" />\r\n\t\t\t\t<Info Token=\"Next\" Name=\"һǩ\" />\r\n\t\t\t\t<Info Token=\"Title\" Name=\"ǩı\" />\r\n\t\t\t\t<Info Token=\"C\" Name=\"ɫ\"/>\r\n\t\t\t\t<Info Token=\"F\" Name=\"ʽ\" Description=\"1б壻2壻3б\"/>\r\n\t\t\t\t<Info Token=\"Count\" Name=\"ǩ\" Description=\"ǰ㼶ǩǩĬϴ򿪣ǩĬ۵\" />\r\n\t\t\t\t<RefInfo Token=\"Dest\"/>\r\n\t\t\t\t<RefInfo Token=\"A\"/>\r\n\t\t\t</Info>\r\n\t\t\t<Info Token=\"StructTreeRoot\" Name=\"ĵṹ\"/>\r\n\t\t\t<Info Token=\"Metadata\" Name=\"ԪϢ\" Description=\"һΪXML\"/>\r\n\t\t\t<Info Token=\"PageLabels\" Name=\"ҳǩ\">\r\n\t\t\t\t<Info Token=\"Nums\" Name=\"ҳǩֵŷʽ\"/>\r\n\t\t\t</Info>\r\n\t\t\t<Info Token=\"Names\" Name=\"λ\" Description=\"ĵضλãΪǩҳӵתĿ꣩\"/>\r\n\t\t\t<Info Token=\"AcroForm\" Name=\"\"/>\r\n\t\t\t<Info Token=\"ViewerPreferences\" Name=\"Ķ趨\"/>\r\n\t\t\t<Info Token=\"PageMode\" Name=\"ʼģʽ\"/>\r\n\t\t\t<Info Token=\"PageLayout\" Name=\"ҳ沼\"/>\r\n\t\t\t<Info Token=\"OpenAction\" Name=\"򿪶\" Description=\"ĵʱԶִеĶ\"/>\r\n\t\t\t<Info Token=\"AA\" Name=\"⶯\" Description=\"¼Ķ\"/>\r\n\t\t\t<Info Token=\"Perms\" Name=\"Ȩ\"/>\r\n\t\t</Info>\r\n\t\t<Info Token=\"ID\" Name=\"ĵ\" Description=\"ʶĵݱǣĵд˱\"/>\r\n\t\t<Info Token=\"Info\" Name=\"ĵϢ\" ImageKey=\"Info\">\r\n\t\t\t<Info Token=\"Title\" Name=\"ĵ\"/>\r\n\t\t\t<Info Token=\"Producer\" Name=\"\"/>\r\n\t\t\t<Info Token=\"Creator\" Name=\"\"/>\r\n\t\t\t<Info Token=\"CreationDate\" Name=\"\"/>\r\n\t\t\t<Info Token=\"ModDate\" Name=\"޸\"/>\r\n\t\t\t<Info Token=\"Subject\" Name=\"\"/>\r\n\t\t\t<Info Token=\"Keywords\" Name=\"ؼ\"/>\r\n\t\t</Info>\r\n\t\t<Info Token=\"Size\" Name=\"Ŀ\" Description=\"PDF ĵĿĿ\" />\r\n\t\t<Info Token=\"Encrypt\" Name=\"Ϣ\" />\r\n\t</Info>\r\n\t<Info Token=\"Pages\" Name=\"ĵҳ漯\" Description=\"ĵҳ\">\r\n\t\t<Info Token=\"Page\" Name=\"ĵҳ\" Required=\"true\">\r\n\t\t\t<Info Token=\"Contents\" Name=\"ҳ\" Description=\"ҳָڵ㡣\" Required=\"true\"/>\r\n\t\t\t<Info Token=\"ArtBox\" Name=\"ݱ߿\" Description=\"¡ҡĸֵ\"/>\r\n\t\t\t<Info Token=\"BleedBox\" Name=\"Ѫ߿\" Description=\"¡ҡĸֵ\"/>\r\n\t\t\t<Info Token=\"CropBox\" Name=\"ȡ߿\" Description=\"ʾȡҳ߿Ŀɼ¡ҡĸֵɣȡ߿Ӧҳ߿޶ҪСĵʾӡ򣬿ɵ˱߿ֵҪʾӡҪͬʱ˱߿ҳ߿\"/>\r\n\t\t\t<Info Token=\"MediaBox\" Name=\"ҳ߿\" Description=\"ʾĵ¡ҡĸֵɣPDF ʹõѿϵҳ½ǵΪ (0,0)ҳ MediaBox ָҳ߿\" Required=\"true\"/>\r\n\t\t\t<Info Token=\"TrimBox\" Name=\"ü߿\" Description=\"¡ҡĸֵ\"/>\r\n\t\t\t<Info Token=\"Thumb\" Name=\"ҳͼ\"/>\r\n\t\t\t<Info Token=\"Annots\" Name=\"ҳע\">\r\n\t\t\t\t<Info Token=\"Rect\" Name=\"ע\"/>\r\n\t\t\t\t<Info Token=\"Contents\" Name=\"עı\"/>\r\n\t\t\t\t<Info Token=\"P\" Name=\"עҳ\"/>\r\n\t\t\t\t<Info Token=\"NM\" Name=\"ע\" Description=\"ͬҳΨһʶעıʶ\"/>\r\n\t\t\t\t<Info Token=\"M\" Name=\"޸ʱ\"/>\r\n\t\t\t\t<Info Token=\"F\" Name=\"־λ\"/>\r\n\t\t\t\t<Info Token=\"AP\" Name=\"ע\">\r\n\t\t\t\t\t<Info Token=\"N\" Name=\"ʽ\">\r\n\t\t\t\t\t\t<Info Token=\"MK\" Name=\"ʽ\">\r\n\t\t\t\t\t\t\t<Info Token=\"CA\" Name=\"״̬ı\" />\r\n\t\t\t\t\t\t\t<Info Token=\"I\" Name=\"״̬ͼ\" Description=\"\"/>\r\n\t\t\t\t\t\t\t<Info Token=\"TP\" Name=\"ıͼλùϵ\" Description=\"0ıͼ꣨Ĭϣ1ͼı2ıͼϷ3ıͼ·4ıͼҲࣻ5ıͼࣻ6ıͼ\"/>\r\n\t\t\t\t\t\t</Info>\r\n\t\t\t\t\t</Info>\r\n\t\t\t\t\t<Info Token=\"R\" Name=\"ͣʽ\"/>\r\n\t\t\t\t\t<Info Token=\"D\" Name=\"ѹʽ\"/>\r\n\t\t\t\t</Info>\r\n\t\t\t\t<Info Token=\"Border\" Name=\"ע߿\" Description=\"ˮƽԲǰ뾶ֱԲǰ뾶߿Լѡʽ\"/>\r\n\t\t\t\t<Info Token=\"C\" Name=\"עɫ\"/>\r\n\t\t\t\t<RefInfo Token=\"Dest\"/>\r\n\t\t\t\t<RefInfo Token=\"A\"/>\r\n\t\t\t</Info>\r\n\t\t\t<Info Token=\"Parent\" Name=\"ҳ漯\"/>\r\n\t\t\t<Info Token=\"UserUnit\" Name=\"ûռ䵥λ\" Description=\"1/72 ӢֵĬΪ 1\"/>\r\n\t\t\t<Info Token=\"Rotate\" Name=\"תǶ\" Description=\"ҳӡʱ˳ʱתĽǶȣΪ 90 Ϊ 0\"/>\r\n\t\t\t<Info Token=\"AA\" Name=\"⶯\" Description=\"򿪻رҳʱĶ\"/>\r\n\t\t\t<RefInfo Token=\"Resources\"/>\r\n\t\t\t<RefInfo Token=\"PieceInfo\"/>\r\n\t\t\t<Info Token=\"\" Name=\"ҳָ\" Description=\"˽ڵǻҳָϡ˽ڵڵ㣬ͨ Contents ڵɵġ\">\r\n\t\t\t\t<Info Token=\"\" Description=\"졢תƽݵתþ([a1,a2,0; b1,b2,0; c1,c2,1])&#xD;&#xA;תǰΪ (x,y)תúΪ&#xD;&#xA;x' = a1  x + b1  y + c1;&#xD;&#xA;y' = a2  x + b2  y + c2&#xD;&#xA;תþۻģתþҪǰֵľˣյľֵ&#xD;&#xA;תþӰĻͼıȾ\" />\r\n\t\t\t\t<Info Token=\"ƶ\" Description=\"ָԴ󣨼ResourcesXObjectĿ&#xD;&#xA;ԴͼƬImageͱForm&#xD;&#xA;ԭʼĳߴΣڴǰѹ 1 λ&#xD;&#xA;ʵȾߴǰתþģ磺ǰתþΪ[500 0 0 700 0 0]ȾΪ 500700\"/>\r\n\t\t\t\t<Info Token=\"ͼ״̬\" Description=\"ָͼ״̬ʵǳɶԳֵָqQ&#xD;&#xA;ͼ״̬תþɫɫıɰ״̬&#xD;&#xA;ͼ״̬qʱȽǰĻͼ״̬ѹջȻ󴴽ȫµĻͼ״̬&#xD;&#xA;뿪ͼ״̬ʱQǰĻͼ״̬ջָԭĻͼ״̬\"/>\r\n\t\t\t\t<Info Token=\"ͼ\" Description=\"ʹ Resources жӦ ExtGState ûͼ״̬\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"ʹ Resources жӦ ColorSpace ÷ߣNonstrokingɫ\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"ʹ Resources жӦ ColorSpace ûߣStrokingɫ\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"÷ߣNonstrokingɫ&#xD;&#xA;ò֮ǰķɫcs\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"ûߣStrokingɫ&#xD;&#xA;ò֮ǰĻɫCS\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"÷ߣNonstrokingĺ졢̡ɫ\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"ûߣStrokingĺ졢̡ɫ\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"÷ߣNonstrokingࡢ졢ơķɫ\"/>\r\n\t\t\t\t<Info Token=\"ɫ\" Description=\"ûߣStrokingࡢ졢ơķɫ\"/>\r\n\t\t\t\t<Info Token=\"߻ɫ\" Description=\"÷ߣNonstrokingĻҶɫ\"/>\r\n\t\t\t\t<Info Token=\"߻ɫ\" Description=\"ûߣStrokingĻҶɫ\"/>\r\n\t\t\t\t<Info Token=\"ı\" Description=\"ָıʵǳɶԳֵָBT  ET&#xD;&#xA;ıBTʱıתþ󽫱á뿪ıETʱıתþ󽫱\"/>\r\n\t\t\t\t<Info Token=\"ַ\" Description=\"кַ&#xD;&#xA;Ų'кı˫Ų&quot;ָʾࡢ־࣬кı\"/>\r\n\t\t\t\t<Info Token=\"ַ\" Description=\"ַ&#xD;&#xA;Tjı&#xD;&#xA;TJжַı&#xD;&#xA;TJĲΪ飬ַ͵ֵָıֵ͵ֵ -1000 ָıλƫ\"/>\r\n\t\t\t\t<Info Token=\"ı\" Description=\"졢תƽıݵתþ([a1,a2,0; b1,b2,0; c1,c2,1])&#xD;&#xA;תǰΪ (x,y)תúΪ&#xD;&#xA;x' = a1  x + b1  y + c1;&#xD;&#xA;y' = a2  x + b2  y + c2&#xD;&#xA;ıתþòۻģıתþ滻ǰľڶλıʱҪɻвõĺʼλá\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"ʼλòƫƻС&#xD;&#xA;TdᡢƫƲУ&#xD;&#xA;TDᡢƫƲУڻеͬʱὫƫƲΪоࣨTL&#xD;&#xA;T*ʹõǰо໻Уıƫ\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"ָResourcesӦ壬嵥λߴ硣&#xD;&#xA;嵥λߴıתþˣȷȾĳߴ硣\"/>\r\n\t\t\t\t<Info Token=\"ıˮƽ\" Description=\"ıˮƽİٷֱȣĬֵΪ100˲Ӱ쵽ʾ־\"/>\r\n\t\t\t\t<Info Token=\"ʾ\" Description=\"ôʵļࣨδıתþıλߴ㣬ʼֵΪ 0ʾʵϾǰǿոͳһΪ 32ַĿȡˮƽ죬ʾˮƽٷֱ˲ʵʾ롣\"/>\r\n\t\t\t\t<Info Token=\"־\" Description=\"ֵļࣨδıתþıλߴ㣬ʼֵΪ 0ˮƽ죬־ˮƽ˲ʵʾ롣\"/>\r\n\t\t\t\t<Info Token=\"о\" Description=\"Ϊвʹõм루δıתþıλߴ㣬ʼֵΪ 0\"/>\r\n\t\t\t\t<Info Token=\"ıȾ\" Description=\"ıȾʽʼֵΪ 0ģʽУ&#xD;&#xA;0䣻1߿֣2ʵ֣3ʾΣ&#xD;&#xA;4䲢5߲6ʵּ7ϼ\"/>\r\n\t\t\t\t<Info Token=\"ıֱƫ\" Description=\"ıֱƫƻߵľ롣һ£ƣƣδıתþıλߴ㣬ʼֵΪ0\"/>\r\n\t\t\t\t<Info Token=\"߶ʽ\" Description=\"ʸ߶ʽʽУ&#xD;&#xA;0ͷ1Բͷ2ͷ\"/>\r\n\t\t\t\t<Info Token=\"ʽ\" Description=\"ʸλõʽʽУ&#xD;&#xA;0ӣ1Բӣ2ӡ\"/>\r\n\t\t\t\t<Info Token=\"ͼ\" Description=\"ʸߵͼ\"/>\r\n\t\t\t\t<Info Token=\"ʼ\" Description=\"ʸߴָ㿪ʼ\"/>\r\n\t\t\t\t<Info Token=\"յ\" Description=\"ʸߵǰʼյ\"/>\r\n\t\t\t\t<Info Token=\"ֱ\" Description=\"ǰһʸ㻭ֱߵָ\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"ǰһʸ㻭 Cubic Bzier ߵָ (x3,y3) 6 ֱΪͷβƵ (x1,y1)(x2,y2) յ (x3,y3)\"/>\r\n\t\t\t\t<Info Token=\"β\" Description=\"ǰһʸ㻭 Cubic Bzier ߵָ (x3,y3) 4 ֱΪβƵ (x2,y2) յ (x3,y3)\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"ǰһʸ㻭 Cubic Bzier ߵָ (x3,y3) 4 ֱΪͷƵ (x1,y1) յ (x3,y3)\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"ڸ (x,y) ָĿ͸߻\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"֮ǰָĻߣStrokingɫͷβʽߵʽ\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"õǰΪյ㣬ûߣStrokingɫ\"/>\r\n\t\t\t\t<Info Token=\"\" Description=\"ʹ÷㣨Nonzero winding numberѱպϵ\"/>\r\n\t\t\t\t<Info Token=\"ż\" Description=\"ʹżEven-oddѱպϵ\"/>\r\n\t\t\t\t<Info Token=\"㻭\" Description=\"ߣ÷㣨Nonzero winding numberѱպϵ\"/>\r\n\t\t\t\t<Info Token=\"ż\" Description=\"ߣżEven-oddѱպϵ\"/>\r\n\t\t\t\t<Info Token=\"պϷ㻭\" Description=\"պߣߣ÷㣨Nonzero winding numberѱպϵ\"/>\r\n\t\t\t\t<Info Token=\"պż\" Description=\"պߣߣżEven-oddѱպϵ\"/>\r\n\t\t\t\t<Info Token=\"պ·\" Description=\"պʸ·䣬ߣһɲü·\"/>\r\n\t\t\t\t<Info Token=\"ü\" Description=\"ʹ÷㣨Nonzero winding numberԱպ߹ɵʸͼβü\"/>\r\n\t\t\t\t<Info Token=\"żü\" Description=\"ʹżEven-oddԱպ߹ɵʸͼβü\"/>\r\n\t\t\t\t<Info Token=\"Ƕͼ\" Description=\"Ƕͼ&#xD;&#xA;ʵָBIͼʼIDͼݣEIͼ\"/>\r\n\t\t\t</Info>\r\n\t\t</Info>\r\n\t</Info>\r\n</PDF>\r\n"
  },
  {
    "path": "App/Model/PDFStructInfo.xsd",
    "content": "<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n<!-- edited with XMLSpy v2007 (http://www.altova.com) by WMJ (private) -->\r\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\r\n\t<xs:element name=\"PDF\">\r\n\t\t<xs:complexType>\r\n\t\t\t<xs:sequence>\r\n\t\t\t\t<xs:element name=\"Global\" minOccurs=\"0\">\r\n\t\t\t\t\t<xs:complexType>\r\n\t\t\t\t\t\t<xs:sequence>\r\n\t\t\t\t\t\t\t<xs:element ref=\"Info\" maxOccurs=\"unbounded\"/>\r\n\t\t\t\t\t\t</xs:sequence>\r\n\t\t\t\t\t</xs:complexType>\r\n\t\t\t\t</xs:element>\r\n\t\t\t\t<xs:element ref=\"Info\" maxOccurs=\"unbounded\"/>\r\n\t\t\t</xs:sequence>\r\n\t\t</xs:complexType>\r\n\t</xs:element>\r\n\t<xs:element name=\"Info\">\r\n\t\t<xs:complexType>\r\n\t\t\t<xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\r\n\t\t\t\t<xs:element ref=\"Info\" minOccurs=\"0\"/>\r\n\t\t\t\t<xs:element ref=\"RefInfo\" minOccurs=\"0\"/>\r\n\t\t\t</xs:choice>\r\n\t\t\t<xs:attribute name=\"Token\" type=\"xs:NMTOKEN\" use=\"required\"/>\r\n\t\t\t<xs:attribute name=\"Name\" type=\"xs:NMTOKEN\" use=\"optional\"/>\r\n\t\t\t<xs:attribute name=\"Required\" type=\"xs:boolean\" use=\"optional\" default=\"false\"/>\r\n\t\t\t<xs:attribute name=\"Description\"/>\r\n\t\t\t<xs:attribute name=\"ImageKey\"/>\r\n\t\t</xs:complexType>\r\n\t</xs:element>\r\n\t<xs:element name=\"RefInfo\">\r\n\t\t<xs:complexType>\r\n\t\t\t<xs:attribute name=\"Token\" type=\"xs:NMTOKEN\" use=\"required\"/>\r\n\t\t</xs:complexType>\r\n\t</xs:element>\r\n\t<xs:simpleType name=\"ImageKeyTypes\">\r\n\t\t<xs:restriction base=\"xs:NMTOKEN\">\r\n\t\t\t<xs:enumeration value=\"Document\"/>\r\n\t\t\t<xs:enumeration value=\"Trailer\"/>\r\n\t\t\t<xs:enumeration value=\"Outlines\"/>\r\n\t\t\t<xs:enumeration value=\"Resources\"/>\r\n\t\t\t<xs:enumeration value=\"Outline\"/>\r\n\t\t\t<xs:enumeration value=\"Pages\"/>\r\n\t\t\t<xs:enumeration value=\"Page\"/>\r\n\t\t\t<xs:enumeration value=\"GoToPage\"/>\r\n\t\t\t<xs:enumeration value=\"Stream\"/>\r\n\t\t\t<xs:enumeration value=\"Image\"/>\r\n\t\t\t<xs:enumeration value=\"Font\"/>\r\n\t\t</xs:restriction>\r\n\t</xs:simpleType>\r\n</xs:schema>\r\n"
  },
  {
    "path": "App/Model/PageBoxSettings.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic class PageBoxSettings\r\n\t{\r\n\t\t[XmlElement(\"边框调整值\")]\r\n\t\tpublic Margins Margins { get; set; }\r\n\t\t[XmlElement(\"指定尺寸\")]\r\n\t\tpublic PaperSize PaperSize { get; set; }\r\n\r\n\t\t[XmlAttribute(\"页码范围\")]\r\n\t\tpublic string PageRanges { get; set; }\r\n\t\t[XmlAttribute(\"页面筛选\")]\r\n\t\tpublic PageFilterFlag Filter { get; set; }\r\n\t\t///<summary>获取或指定是否自动旋转页面适合图片纵横比。</summary>\r\n\t\t[XmlAttribute(\"自动旋转\")]\r\n\t\t[System.ComponentModel.DefaultValue(true)]\r\n\t\tpublic bool AutoRotation { get; set; }\r\n\t\t[XmlAttribute(\"旋转角度\")]\r\n\t\tpublic int Rotation { get; set; }\r\n\t\t[XmlAttribute(\"拉伸内容\")]\r\n\t\tpublic bool ScaleContent { get; set; }\r\n\t\t[XmlAttribute(\"水平对齐\")]\r\n\t\tpublic HorizontalAlignment HorizontalAlign { get; set; }\r\n\t\t[XmlAttribute(\"垂直对齐\")]\r\n\t\tpublic VerticalAlignment VerticalAlign { get; set; }\r\n\t\t[XmlAttribute(\"基准页面\")]\r\n\t\tpublic int BasePage { get; set; }\r\n\r\n\t\tpublic bool NeedResize => PaperSize.SpecialSize != SpecialPaperSize.AsPageSize;\r\n\t\tpublic bool NeedAdjustMargins => Margins.IsEmpty == false;\r\n\t\tpublic PageBoxSettings() {\r\n\t\t\tPaperSize = new PaperSize(PaperSize.AsPageSize, 0, 0);\r\n\t\t\tMargins = new Margins();\r\n\t\t\tAutoRotation = true;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tpublic enum VerticalAlignment\r\n\t{\r\n\t\tMiddle, Top, Bottom\r\n\t}\r\n\tpublic enum HorizontalAlignment\r\n\t{\r\n\t\tCenter, Left, Right\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PageFilterFlag.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[Flags]\r\n\tpublic enum PageFilterFlag\r\n\t{\r\n\t\tNotSpecified,\r\n\t\tOdd = 1,\r\n\t\tEven = 2,\r\n\t\tPortrait = 4,\r\n\t\tLandscape = 8,\r\n\t\tAll = Odd | Even | Portrait | Landscape\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PageLabel.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic class PageLabel\r\n\t{\r\n\t\t[XmlAttribute(Constants.PageLabelsAttributes.PageNumber)]\r\n\t\tpublic int PageNumber { get; set; }\r\n\r\n\t\t[XmlAttribute(Constants.PageLabelsAttributes.Prefix)]\r\n\t\tpublic string Prefix { get; set; }\r\n\r\n\t\t[XmlAttribute(Constants.PageLabelsAttributes.StartPage)]\r\n\t\tpublic int StartPage { get; set; }\r\n\r\n\t\t[XmlAttribute(Constants.PageLabelsAttributes.Style)]\r\n\t\tpublic string Style { get; set; }\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PageRange.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinternal struct PageRange : IEnumerable<int>\r\n\t{\r\n\t\tpublic int StartValue, EndValue;\r\n\t\tpublic PageRange(int startValue, int endValue) {\r\n\t\t\tStartValue = startValue;\r\n\t\t\tEndValue = endValue;\r\n\t\t}\r\n\t\tpublic bool Contains(int value) {\r\n\t\t\treturn value >= StartValue && value <= EndValue\r\n\t\t\t\t|| value >= EndValue && value <= StartValue;\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn StartValue != EndValue ? String.Concat(StartValue.ToText(), '-', EndValue.ToText()) : StartValue.ToText();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 返回范围中包含的数量。\r\n\t\t/// </summary>\r\n\t\tpublic int Count => (EndValue > StartValue ?\r\n\t\t\t\t\tEndValue - StartValue :\r\n\t\t\t\t\tStartValue - EndValue) + 1;\r\n\r\n\t\t#region IEnumerable<int> 成员\r\n\r\n\t\tIEnumerator<int> IEnumerable<int>.GetEnumerator() {\r\n\t\t\treturn new PageRangeEnumerator(StartValue, EndValue);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IEnumerable 成员\r\n\r\n\t\tSystem.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {\r\n\t\t\treturn new PageRangeEnumerator(StartValue, EndValue);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tsealed class PageRangeEnumerator : IEnumerator<int>\r\n\t\t{\r\n\t\t\treadonly int _start, _end;\r\n\t\t\treadonly bool _isIncremental;\r\n\t\t\tint _Current;\r\n\r\n\t\t\tpublic PageRangeEnumerator(int start, int end) {\r\n\t\t\t\t_start = start;\r\n\t\t\t\t_isIncremental = start < end;\r\n\t\t\t\t_end = end;\r\n\t\t\t\t_Current = _isIncremental ? start - 1 : start + 1;\r\n\t\t\t}\r\n\t\t\t#region IEnumerator<int> 成员\r\n\r\n\t\t\tpublic int Current => _Current;\r\n\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region IDisposable 成员\r\n\r\n\t\t\tpublic void Dispose() { }\r\n\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region IEnumerator 成员\r\n\r\n\t\t\tobject System.Collections.IEnumerator.Current => _Current;\r\n\r\n\t\t\tpublic bool MoveNext() {\r\n\t\t\t\tif (_isIncremental && _Current < _end) {\r\n\t\t\t\t\t_Current++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\telse if (_isIncremental == false && _Current > _end) {\r\n\t\t\t\t\t_Current--;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Reset() {\r\n\t\t\t\t_Current = _start < _end ? _start : _end;\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PageRangeCollection.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinternal sealed class PageRangeCollection : List<PageRange>\r\n\t{\r\n\t\tprivate PageRangeCollection() { }\r\n\r\n\t\tpublic int TotalPages {\r\n\t\t\tget {\r\n\t\t\t\tint c = 0;\r\n\t\t\t\tforeach (var item in this) {\r\n\t\t\t\t\tc += item.Count;\r\n\t\t\t\t}\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic bool IsInRange(int value) {\r\n\t\t\tforeach (var item in this) {\r\n\t\t\t\tif (item.StartValue < item.EndValue && value >= item.StartValue && value <= item.EndValue\r\n\t\t\t\t\t|| value >= item.EndValue && value <= item.StartValue) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tinternal void Collapse(int minValue, int maxValue) {\r\n\t\t\tif (maxValue < minValue) {\r\n\t\t\t\tthrow new ArgumentException(\"maxValue must greater than minValue\");\r\n\t\t\t}\r\n\t\t\tfor (int i = Count - 1; i >= 0; i--) {\r\n\t\t\t\tvar r = this[i];\r\n\t\t\t\tSetReverseNumber(ref r.StartValue, maxValue);\r\n\t\t\t\tSetReverseNumber(ref r.EndValue, maxValue);\r\n\t\t\t\tif (r.StartValue < r.EndValue) {\r\n\t\t\t\t\tif (r.EndValue < minValue || maxValue < r.StartValue) {\r\n\t\t\t\t\t\tRemoveAt(i);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (minValue <= r.StartValue && r.EndValue <= maxValue) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (r.StartValue < minValue) {\r\n\t\t\t\t\t\tr.StartValue = minValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (r.EndValue > maxValue) {\r\n\t\t\t\t\t\tr.EndValue = maxValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse /*if (r.StartValue >= r.EndValue)*/ {\r\n\t\t\t\t\tif (r.StartValue < minValue || maxValue < r.EndValue) {\r\n\t\t\t\t\t\tRemoveAt(i);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (maxValue >= r.StartValue && r.EndValue >= minValue) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (r.EndValue < minValue) {\r\n\t\t\t\t\t\tr.EndValue = minValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (r.StartValue > maxValue) {\r\n\t\t\t\t\t\tr.StartValue = maxValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis[i] = r;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static PageRangeCollection CreateSingle(int minValue, int maxValue) {\r\n\t\t\tvar r = new PageRangeCollection {\r\n\t\t\t\tnew PageRange(minValue, maxValue)\r\n\t\t\t};\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tinternal static PageRangeCollection Parse(string rangeText, int minValue, int maxValue, bool addDefaultRange) {\r\n\t\t\tvar r = new PageRangeCollection();\r\n\t\t\tif (String.IsNullOrEmpty(rangeText) == false) {\r\n\t\t\t\tvar ranges = rangeText.Split(',', ';', ' ', '\\t');\r\n\t\t\t\tstring startRange, endRange;\r\n\t\t\t\tint startNum, endNum;\r\n\r\n\t\t\t\tforeach (string range in ranges) {\r\n\t\t\t\t\tif (range.Length == 0) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstartNum = endNum = 0;\r\n\t\t\t\t\tint rangeIndicator = range.Length > 1 ? range.IndexOf('-', 1) /*排除首位可能是负数页码的可能*/ : -1;\r\n\t\t\t\t\tif (rangeIndicator > 0) {\r\n\t\t\t\t\t\tstartRange = range.Substring(0, rangeIndicator);\r\n\t\t\t\t\t\tendRange = range.Substring(rangeIndicator + 1, range.Length - rangeIndicator - 1);\r\n\t\t\t\t\t\tif (startRange.TryParse(out startNum) && endRange.TryParse(out endNum) && startNum != 0 && endNum != 0) {\r\n\t\t\t\t\t\t\tSetReverseNumber(ref startNum, maxValue);\r\n\t\t\t\t\t\t\tSetReverseNumber(ref endNum, maxValue);\r\n\t\t\t\t\t\t\tif (startNum < 0 || endNum < 0) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tr.Add(new PageRange(startNum, endNum));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (range.TryParse(out startNum)) {\r\n\t\t\t\t\t\tSetReverseNumber(ref startNum, maxValue);\r\n\t\t\t\t\t\tif (startNum < 0) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tr.Add(new PageRange(startNum, startNum));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (r.Count == 0 && addDefaultRange) {\r\n\t\t\t\tr.Add(new PageRange(minValue, maxValue));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tr.Collapse(minValue, maxValue);\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tstatic void SetReverseNumber(ref int refNum, int maxNum) {\r\n\t\t\tif (refNum < 0) {\r\n\t\t\t\trefNum = refNum + maxNum + 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn String.Join(\";\", ConvertAll(r => r.ToString()).ToArray());\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PageResizing.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic enum PageResizing\r\n\t{\r\n\t\t[XmlEnum(\"保持不变\")]\r\n\t\tNone = 0,\r\n\t\t[XmlEnum(\"更改页面尺寸\")]\r\n\t\tResize = 1,\r\n\t\t[XmlEnum(\"拉伸页面内容\")]\r\n\t\tScale = 2\r\n\t}\r\n\r\n\tpublic enum ResizingMode\r\n\t{\r\n\t\t[XmlEnum(\"相对调整\")]\r\n\t\tRelative = 0,\r\n\t\t[XmlEnum(\"绝对调整\")]\r\n\t\tAbsolute = 1,\r\n\t\t[XmlEnum(\"同指定页\")]\r\n\t\tAsPage = 2\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PageSettings.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Xml.Serialization;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[XmlRoot(Constants.Content.Page)]\r\n\tpublic class PageSettings\r\n\t{\r\n\t\t///<summary>获取或指定页面范围的值。</summary>\r\n\t\t[XmlAttribute(Constants.PageRange)]\r\n\t\tpublic string PageRange { get; set; }\r\n\t\t///<summary>获取或指定页面筛选的值。</summary>\r\n\t\t[XmlAttribute(Constants.PageFilterTypes.ThisName)]\r\n\t\tpublic string Filter { get; set; }\r\n\t\t///<summary>获取或指定页面尺寸的值。</summary>\r\n\t\t[XmlAttribute(Constants.Content.PageSettings.MediaBox)]\r\n\t\tpublic string PageSize { get; set; }\r\n\t\t///<summary>获取或指定裁剪框的值。</summary>\r\n\t\t[XmlAttribute(Constants.Content.PageSettings.CropBox)]\r\n\t\tpublic string CropBox { get; set; }\r\n\t\t///<summary>获取或指定修剪框的值。</summary>\r\n\t\t[XmlAttribute(Constants.Content.PageSettings.TrimBox)]\r\n\t\tpublic string TrimBox { get; set; }\r\n\t\t///<summary>获取或指定艺术框的值。</summary>\r\n\t\t[XmlAttribute(Constants.Content.PageSettings.ArtBox)]\r\n\t\tpublic string ArtBox { get; set; }\r\n\t\t///<summary>获取或指定出血框的值。</summary>\r\n\t\t[XmlAttribute(Constants.Content.PageSettings.BleedBox)]\r\n\t\tpublic string BleedBox { get; set; }\r\n\t\t///<summary>获取或指定旋转角度的值。</summary>\r\n\t\t[XmlAttribute(Constants.Content.PageSettings.Rotation)]\r\n\t\t[DefaultValue(0)]\r\n\t\tpublic int Rotation { get; set; }\r\n\r\n\t\tstatic internal PageSettings FromReader(PdfReader reader, int pageIndex, UnitConverter converter) {\r\n\t\t\tiTextSharp.text.Rectangle b;\r\n\t\t\tvar s = new PageSettings();\r\n\t\t\tb = reader.GetPageSize(pageIndex);\r\n\t\t\ts.PageSize = ConvertPageSize(b, converter);\r\n\t\t\tb = reader.GetCropBox(pageIndex);\r\n\t\t\ts.CropBox = (b != null) ? ConvertPageSize(b, converter) : null;\r\n\t\t\tb = reader.GetBoxSize(pageIndex, \"trim\");\r\n\t\t\ts.TrimBox = (b != null) ? ConvertPageSize(b, converter) : null;\r\n\t\t\tb = reader.GetBoxSize(pageIndex, \"art\");\r\n\t\t\ts.ArtBox = (b != null) ? ConvertPageSize(b, converter) : null;\r\n\t\t\tb = reader.GetBoxSize(pageIndex, \"bleed\");\r\n\t\t\ts.BleedBox = (b != null) ? ConvertPageSize(b, converter) : null;\r\n\t\t\ts.Rotation = reader.GetPageRotation(pageIndex);\r\n\t\t\treturn s;\r\n\t\t}\r\n\r\n\t\tprivate static string ConvertPageSize(iTextSharp.text.Rectangle b, UnitConverter converter) {\r\n\t\t\tvar p = new string[4];\r\n\t\t\tp[0] = converter.FromPoint(b.Left).ToText(\"0.###\");\r\n\t\t\tp[1] = converter.FromPoint(b.Bottom).ToText(\"0.###\");\r\n\t\t\tp[2] = converter.FromPoint(b.Right).ToText(\"0.###\");\r\n\t\t\tp[3] = converter.FromPoint(b.Top).ToText(\"0.###\");\r\n\t\t\treturn String.Join(\" \", p);\r\n\t\t}\r\n\r\n\t\tstatic internal bool HavingSameDimension(PageSettings s1, PageSettings s2) {\r\n\t\t\tif (s1 == null && s2 == null) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (s1 == null || s2 == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn s1.Rotation == s2.Rotation && s1.PageSize == s2.PageSize\r\n\t\t\t\t&& s1.CropBox == s2.CropBox && s1.TrimBox == s2.TrimBox\r\n\t\t\t\t&& s1.BleedBox == s2.BleedBox && s1.ArtBox == s2.ArtBox;\r\n\t\t}\r\n\r\n\t\tinternal void WriteXml(System.Xml.XmlWriter writer) {\r\n\t\t\tif (String.IsNullOrEmpty(PageRange)) {\r\n\t\t\t\tSystem.Diagnostics.Debug.WriteLine(\"Empty page range.\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\twriter.WriteAttributeString(Constants.PageRange, PageRange);\r\n\t\t\twriter.WriteAttributeString(Constants.Content.PageSettings.MediaBox, PageSize);\r\n\t\t\tif (CropBox != null) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.PageSettings.CropBox, CropBox);\r\n\t\t\t}\r\n\t\t\tif (TrimBox != null) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.PageSettings.TrimBox, TrimBox);\r\n\t\t\t}\r\n\t\t\tif (ArtBox != null) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.PageSettings.ArtBox, ArtBox);\r\n\t\t\t}\r\n\t\t\tif (BleedBox != null) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.PageSettings.BleedBox, BleedBox);\r\n\t\t\t}\r\n\t\t\tif (Rotation != 0) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.PageSettings.Rotation, Rotation.ToText());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PaperSize.cs",
    "content": "﻿using System;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic class PaperSize\r\n\t{\r\n\t\tpublic const string AsPageSize = \"等同原始内容尺寸\";\r\n\t\tpublic const string FixedWidthAutoHeight = \"固定页宽自动高度\";\r\n\t\tpublic const string AsFirstPage = \"等同第一页尺寸\";\r\n\t\tpublic const string AsSpecificPage = \"等同指定页面尺寸\";\r\n\t\tpublic const string AsWidestPage = \"宽度同最宽页面，自动高度\";\r\n\t\tpublic const string AsNarrowestPage = \"宽度同最窄页面，自动高度\";\r\n\t\tpublic const string AsLargestPage = \"等同最大页面尺寸\";\r\n\t\tpublic const string AsSmallestPage = \"等同最小页面尺寸\";\r\n\r\n\t\tstring _PaperName;\r\n\t\t[XmlAttribute(\"名称\")]\r\n\t\tpublic string PaperName {\r\n\t\t\tget => _PaperName;\r\n\t\t\tset {\r\n\t\t\t\t_PaperName = value;\r\n\t\t\t\tSpecialSize = _PaperName switch {\r\n\t\t\t\t\tAsPageSize => SpecialPaperSize.AsPageSize,\r\n\t\t\t\t\tFixedWidthAutoHeight => SpecialPaperSize.FixedWidthAutoHeight,\r\n\t\t\t\t\tAsSpecificPage => SpecialPaperSize.AsSpecificPage,\r\n\t\t\t\t\tAsWidestPage => SpecialPaperSize.AsWidestPage,\r\n\t\t\t\t\tAsNarrowestPage => SpecialPaperSize.AsNarrowestPage,\r\n\t\t\t\t\tAsLargestPage => SpecialPaperSize.AsLargestPage,\r\n\t\t\t\t\tAsSmallestPage => SpecialPaperSize.AsSmallestPage,\r\n\t\t\t\t\tAsFirstPage => SpecialPaperSize.AsFirstPage,\r\n\t\t\t\t\t_ => SpecialPaperSize.None,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[XmlIgnore]\r\n\t\tpublic SpecialPaperSize SpecialSize { get; private set; }\r\n\r\n\t\tprivate float _Height;\r\n\t\t///<summary>获取或指定页面高度的值。</summary>\r\n\t\t[XmlAttribute(\"高度\")]\r\n\t\tpublic float Height {\r\n\t\t\tget => _Height;\r\n\t\t\tset {\r\n\t\t\t\tif (value < 0) {\r\n\t\t\t\t\tthrow new ArgumentException(\"页面高度不可小于 0。\");\r\n\t\t\t\t}\r\n\t\t\t\t_Height = value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate float _Width;\r\n\t\t///<summary>获取或指定页面宽度的值。</summary>\r\n\t\t[XmlAttribute(\"宽度\")]\r\n\t\tpublic float Width {\r\n\t\t\tget => _Width;\r\n\t\t\tset {\r\n\t\t\t\tif (value < 0) {\r\n\t\t\t\t\tthrow new ArgumentException(\"页面宽度不可小于 0。\");\r\n\t\t\t\t}\r\n\t\t\t\t_Width = value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic PaperSize() { }\r\n\r\n\t\tpublic PaperSize(float width, float height) : this(null, width, height) {\r\n\t\t}\r\n\r\n\t\tpublic PaperSize(string paperName, float width, float height) {\r\n\t\t\tPaperName = paperName;\r\n\t\t\tWidth = width;\r\n\t\t\tHeight = height;\r\n\t\t}\r\n\r\n\t\tinternal PaperSize Scale(float xFactor, float yFactor) {\r\n\t\t\treturn new PaperSize(PaperName, Width * xFactor, Height * yFactor);\r\n\t\t}\r\n\t\tinternal PaperSize Scale(float factor) {\r\n\t\t\treturn new PaperSize(PaperName, Width * factor, Height * factor);\r\n\t\t}\r\n\r\n\t\tinternal PaperSize Clone() {\r\n\t\t\treturn (PaperSize)MemberwiseClone();\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn PaperName;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tpublic enum SpecialPaperSize\r\n\t{\r\n\t\tNone,\r\n\t\tAsPageSize,\r\n\t\tFixedWidthAutoHeight,\r\n\t\tAsSpecificPage,\r\n\t\tAsWidestPage,\r\n\t\tAsNarrowestPage,\r\n\t\tAsLargestPage,\r\n\t\tAsSmallestPage,\r\n\t\tAsFirstPage\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfDocumentFont.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tstatic class PdfDocumentFont\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 删除字体名称的子集前缀。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"name\">字体名称。</param>\r\n\t\tinternal static string RemoveSubsetPrefix(string name) {\r\n\t\t\treturn name.Length > 7 && name[6] == '+' ? name.Substring(7) : name;\r\n\t\t}\r\n\r\n\t\tinternal static bool HasEmbeddedFont(PdfDictionary font) {\r\n\t\t\tvar df = font.Locate<PdfObject>(true, PdfName.DESCENDANTFONTS);\r\n\t\t\tif (df == null) {\r\n\t\t\t\treturn IsEmbeddedFont(font);\r\n\t\t\t}\r\n\t\t\tif (df.Type == PdfObject.ARRAY) {\r\n\t\t\t\tforeach (var item in (df as PdfArray).ArrayList) {\r\n\t\t\t\t\tif (IsEmbeddedFont(PdfReader.GetPdfObjectRelease(item) as PdfDictionary) == false) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tdf = PdfReader.GetPdfObjectRelease(df);\r\n\t\t\treturn df.Type == PdfObject.DICTIONARY && IsEmbeddedFont(df as PdfDictionary);\r\n\t\t}\r\n\r\n\t\tstatic bool IsEmbeddedFont(PdfDictionary font) {\r\n\t\t\tvar fd = font.Locate<PdfDictionary>(true, PdfName.FONTDESCRIPTOR);\r\n\t\t\tif (fd == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn fd.Contains(PdfName.FONTFILE) || fd.Contains(PdfName.FONTFILE2) || fd.Contains(PdfName.FONTFILE3);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 列举指定页面所用的字体。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"page\">页面对应的 <see cref=\"PdfDictionary\"/>。</param>\r\n\t\tpublic static IEnumerable<ResourceReference> GetPageFontReferences(PdfDictionary page) {\r\n\t\t\tvar visitedRefs = new HashSet<PdfIndirectReference>();\r\n\t\t\tvar res = page.Locate<PdfDictionary>(true, PdfName.RESOURCES);\r\n\t\t\tif (res != null) {\r\n\t\t\t\tvar fonts = res.GetAsDict(PdfName.FONT);\r\n\t\t\t\tif (fonts != null) {\r\n\t\t\t\t\tforeach (var fr in fonts) {\r\n\t\t\t\t\t\tif (fr.Value is PdfIndirectReference r) {\r\n\t\t\t\t\t\t\tyield return new ResourceReference(r, fr.Key, PdfReader.GetPdfObjectRelease(r) as PdfDictionary);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar xObjects = res.GetAsDict(PdfName.XOBJECT);\r\n\t\t\t\tif (xObjects != null) {\r\n\t\t\t\t\tforeach (var item in xObjects) {\r\n\t\t\t\t\t\tif (PdfReader.GetPdfObjectRelease(item.Value) is not PdfDictionary form || PdfName.FORM.Equals(form.GetAsName(PdfName.SUBTYPE)) == false) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tforeach (var font in PdfModelHelper.GetReferencedResources(form, o => PdfName.FONT.Equals(o.GetAsName(PdfName.TYPE)), visitedRefs)) {\r\n\t\t\t\t\t\t\tyield return font;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar annots = page.GetAsArray(PdfName.ANNOTS);\r\n\t\t\tif (annots != null) {\r\n\t\t\t\tforeach (var item in annots) {\r\n\t\t\t\t\tforeach (var font in PdfModelHelper.GetReferencedResources(PdfReader.GetPdfObjectRelease(item) as PdfDictionary, o => PdfName.FONT.Equals(o.GetAsName(PdfName.TYPE)), visitedRefs)) {\r\n\t\t\t\t\t\tyield return font;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfImageData.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tinternal sealed class PdfImageData : PdfDictionary\r\n\t{\r\n\t\tpublic int DataType { get; }\r\n\t\tpublic PdfIndirectReference PdfRef { get; }\r\n\t\tpublic byte[] RawBytes { get; }\r\n\r\n\t\tpublic PdfImageData(PRStream stream) {\r\n\t\t\tforeach (var item in stream) {\r\n\t\t\t\tPut(item.Key, item.Value);\r\n\t\t\t}\r\n\t\t\tRawBytes = PdfReader.GetStreamBytesRaw(stream);\r\n\t\t\tDataType = PdfObject.STREAM;\r\n\t\t}\r\n\r\n\t\tpublic PdfImageData(PdfIndirectReference pdfRef) {\r\n\t\t\tvar s = PdfReader.GetPdfObjectRelease(pdfRef) as PRStream;\r\n\t\t\tforeach (var item in s) {\r\n\t\t\t\tPut(item.Key, item.Value);\r\n\t\t\t}\r\n\t\t\tPdfRef = pdfRef;\r\n\t\t\tRawBytes = PdfReader.GetStreamBytesRaw(s);\r\n\t\t\tDataType = PdfObject.INDIRECT;\r\n\t\t}\r\n\r\n\t\tpublic PdfImageData(PdfDictionary source, byte[] bytes) {\r\n\t\t\tforeach (var item in source) {\r\n\t\t\t\tPut(item.Key, item.Value);\r\n\t\t\t}\r\n\t\t\tRawBytes = bytes;\r\n\t\t\tDataType = PdfObject.NULL;\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn (PdfRef != null ? $\"{PdfRef.Generation} {PdfRef.Number}\" : \"<内嵌图像>\") + \" \" + RawBytes.Length;\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfInfoXmlDocument.cs",
    "content": "﻿using System;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic sealed class PdfInfoXmlDocument : XmlDocument\r\n\t{\r\n\t\t/// <summary>返回已经初始化的 <see cref=\"PdfInfoXmlDocument\"/> 实例。</summary>\r\n\t\tpublic PdfInfoXmlDocument() {\r\n\t\t\tvar root = AppendChild(CreateElement(Constants.PdfInfo)) as XmlElement;\r\n\t\t\troot.SetAttribute(Constants.Info.ProductName, System.Windows.Forms.Application.ProductName);\r\n\t\t\troot.SetAttribute(Constants.Info.ProductVersion, Constants.InfoDocVersion);\r\n\t\t\troot.SetAttribute(Constants.Info.ExportDate, DateTime.Now.ToString(\"yyyy年MM月dd日 HH:mm:ss\"));\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置配置文件关联的 PDF 文件路径。</summary>\r\n\t\tpublic string PdfDocumentPath {\r\n\t\t\tget => DocumentElement.GetAttribute(Constants.Info.DocumentPath);\r\n\t\t\tset => DocumentElement.SetAttribute(Constants.Info.DocumentPath, value);\r\n\t\t}\r\n\r\n\t\t/// <summary>返回文档信息节点。</summary>\r\n\t\tpublic DocumentInfoElement InfoNode => DocumentElement.GetOrCreateElement(Constants.Info.ThisName) as DocumentInfoElement;\r\n\r\n\t\t/// <summary>返回页码标签节点。</summary>\r\n\t\tpublic XmlElement PageLabelRoot => DocumentElement.GetOrCreateElement(Constants.PageLabels);\r\n\r\n\t\tpublic XmlNodeList PageLabels => DocumentElement.SelectNodes(Constants.PageLabels + \"[1]/\" + Constants.PageLabelsAttributes.Style);\r\n\r\n\t\t/// <summary>返回书签根节点。</summary>\r\n\t\tpublic BookmarkRootElement BookmarkRoot => DocumentElement.GetOrCreateElement(Constants.DocumentBookmark) as BookmarkRootElement;\r\n\r\n\t\t/// <summary>获取根书签。</summary>\r\n\t\tpublic XmlNodeList Bookmarks => DocumentElement.SelectNodes(Constants.DocumentBookmark + \"[1]/\" + Constants.Bookmark);\r\n\r\n\t\tpublic BookmarkElement CreateBookmark() {\r\n\t\t\treturn new BookmarkElement(this);\r\n\t\t}\r\n\r\n\t\tpublic BookmarkElement CreateBookmark(BookmarkSettings settings) {\r\n\t\t\tvar b = new BookmarkElement(this) {\r\n\t\t\t\tTitle = settings.Title,\r\n\t\t\t\tIsOpen = settings.IsOpened,\r\n\t\t\t\tAction = Constants.ActionType.Goto\r\n\t\t\t};\r\n\t\t\tif (settings.ForeColor.IsEmptyOrTransparent() == false) {\r\n\t\t\t\tb.ForeColor = settings.ForeColor;\r\n\t\t\t}\r\n\t\t\tif (settings.IsBold || settings.IsItalic) {\r\n\t\t\t\tb.TextStyle = (settings.IsBold ? FontStyle.Bold : FontStyle.Regular) | (settings.IsItalic ? FontStyle.Italic : FontStyle.Regular);\r\n\t\t\t}\r\n\t\t\treturn b;\r\n\t\t}\r\n\t\tpublic PageLabelElement CreatePageLabel(MuPDF.PageLabel label) {\r\n\t\t\tvar l = new PageLabelElement(this);\r\n\t\t\tl.SetAttributes(label);\r\n\t\t\treturn l;\r\n\t\t}\r\n\r\n\t\tpublic override XmlElement CreateElement(string prefix, string localName, string namespaceURI) {\r\n\t\t\tif (String.IsNullOrEmpty(prefix) && String.IsNullOrEmpty(namespaceURI)) {\r\n\t\t\t\tswitch (localName) {\r\n\t\t\t\t\tcase Constants.Bookmark:\r\n\t\t\t\t\t\treturn new BookmarkElement(this);\r\n\t\t\t\t\tcase Constants.DocumentBookmark:\r\n\t\t\t\t\t\treturn new BookmarkRootElement(this);\r\n\t\t\t\t\tcase Constants.PageLabelsAttributes.Style:\r\n\t\t\t\t\t\treturn new PageLabelElement(this);\r\n\t\t\t\t\tcase Constants.Info.ThisName:\r\n\t\t\t\t\t\treturn new DocumentInfoElement(this);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn base.CreateElement(prefix, localName, namespaceURI);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/// <summary>文档元数据属性元素。</summary>\r\n\tpublic sealed class DocumentInfoElement : XmlElement\r\n\t{\r\n\t\tinternal DocumentInfoElement(XmlDocument doc)\r\n\t\t\t: base(String.Empty, Constants.Info.ThisName, String.Empty, doc) {\r\n\t\t}\r\n\t\tpublic string Title {\r\n\t\t\tget => this.GetValue(Constants.Info.Title);\r\n\t\t\tset => this.SetValue(Constants.Info.Title, value, null);\r\n\t\t}\r\n\t\tpublic string Author {\r\n\t\t\tget => this.GetValue(Constants.Info.Author);\r\n\t\t\tset => this.SetValue(Constants.Info.Author, value, null);\r\n\t\t}\r\n\t\tpublic string Creator {\r\n\t\t\tget => this.GetValue(Constants.Info.Creator);\r\n\t\t\tset => this.SetValue(Constants.Info.Creator, value, null);\r\n\t\t}\r\n\t\tpublic string Keywords {\r\n\t\t\tget => this.GetValue(Constants.Info.Keywords);\r\n\t\t\tset => this.SetValue(Constants.Info.Keywords, value, null);\r\n\t\t}\r\n\t\tpublic string Producer {\r\n\t\t\tget => this.GetValue(Constants.Info.Producer);\r\n\t\t\tset => this.SetValue(Constants.Info.Producer, value, null);\r\n\t\t}\r\n\t\tpublic string Subject {\r\n\t\t\tget => this.GetValue(Constants.Info.Subject);\r\n\t\t\tset => this.SetValue(Constants.Info.Subject, value, null);\r\n\t\t}\r\n\t}\r\n\tpublic abstract class BookmarkContainer(string name, XmlDocument doc) : XmlElement(String.Empty, name, String.Empty, doc)\r\n\t{\r\n\t\t/// <summary>获取当前书签容器是否有子书签。</summary>\r\n\t\tpublic bool HasSubBookmarks => HasChildNodes && SelectSingleNode(Constants.Bookmark) != null;\r\n\r\n\t\t/// <summary>获取当前书签容器的子书签。</summary>\r\n\t\tpublic XmlNodeList SubBookmarks => SelectNodes(Constants.Bookmark);\r\n\r\n\t\tpublic BookmarkElement ParentBookmark => ParentNode as BookmarkElement;\r\n\t\tpublic BookmarkContainer Parent => ParentNode as BookmarkContainer;\r\n\t\tpublic BookmarkContainer BookmarkRoot => (OwnerDocument as PdfInfoXmlDocument).BookmarkRoot;\r\n\r\n\t\t/// <summary>创建新的下级书签并返回该书签。</summary>\r\n\t\tpublic BookmarkElement AppendBookmark() {\r\n\t\t\treturn AppendChild((OwnerDocument as PdfInfoXmlDocument).CreateBookmark()) as BookmarkElement;\r\n\t\t}\r\n\t\t/// <summary>使用指定的配置创建新的书签。返回新创建的书签。</summary>\r\n\t\t/// <param name=\"settings\">书签设置。</param>\r\n\t\tpublic BookmarkElement AppendBookmark(BookmarkSettings settings) {\r\n\t\t\treturn AppendChild((OwnerDocument as PdfInfoXmlDocument).CreateBookmark(settings)) as BookmarkElement;\r\n\t\t}\r\n\t}\r\n\r\n\t/// <summary>书签的根元素。</summary>\r\n\tpublic sealed class BookmarkRootElement : BookmarkContainer\r\n\t{\r\n\t\tinternal BookmarkRootElement(XmlDocument doc)\r\n\t\t\t: base(Constants.DocumentBookmark, doc) {\r\n\t\t}\r\n\t}\r\n\r\n\t/// <summary>书签元素。</summary>\r\n\t[DebuggerDisplay(Constants.Bookmark + \"：{Title}\")]\r\n\tpublic sealed class BookmarkElement : BookmarkContainer\r\n\t{\r\n\t\t/// <summary>在自动生成书签时标记级别的属性。</summary>\r\n\t\tinternal int AutoLevel = 0;\r\n\r\n\t\t/// <summary>获取或设置书签的文本。</summary>\r\n\t\tpublic string Title {\r\n\t\t\tget => GetAttribute(Constants.BookmarkAttributes.Title);\r\n\t\t\tset => SetAttribute(Constants.BookmarkAttributes.Title, value);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置书签的颜色。</summary>\r\n\t\tpublic Color ForeColor {\r\n\t\t\tget {\r\n\t\t\t\tif (HasAttribute(Constants.Colors.Red) || HasAttribute(Constants.Colors.Green) || HasAttribute(Constants.Colors.Blue)) {\r\n\t\t\t\t\tfloat r = this.GetValue(Constants.Colors.Red, 0f),\r\n\t\t\t\t\t\tg = this.GetValue(Constants.Colors.Green, 0f),\r\n\t\t\t\t\t\tb = this.GetValue(Constants.Colors.Blue, 0f);\r\n\t\t\t\t\treturn Color.FromArgb((int)(r * 255f), (int)(g * 255f), (int)(b * 255f));\r\n\t\t\t\t}\r\n\t\t\t\telse if (HasAttribute(Constants.Color)) {\r\n\t\t\t\t\tvar a = GetAttribute(Constants.Color);\r\n\t\t\t\t\tint c = a.ToInt32(Int32.MaxValue);\r\n\t\t\t\t\treturn c != Int32.MaxValue ? Color.FromArgb(c) : Color.FromName(a);\r\n\t\t\t\t}\r\n\t\t\t\treturn Color.Transparent;\r\n\t\t\t}\r\n\t\t\tset {\r\n\t\t\t\tRemoveAttribute(Constants.Color);\r\n\t\t\t\tif (value == Color.Transparent) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tSetAttribute(Constants.Color, value.ToArgb().ToText());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置书签的文本样式。</summary>\r\n\t\tpublic FontStyle TextStyle {\r\n\t\t\tget {\r\n\t\t\t\tvar s = GetAttribute(Constants.BookmarkAttributes.Style);\r\n\t\t\t\tif (String.IsNullOrEmpty(s) == false) {\r\n\t\t\t\t\tswitch (s) {\r\n\t\t\t\t\t\tcase Constants.BookmarkAttributes.StyleType.Bold: return FontStyle.Bold;\r\n\t\t\t\t\t\tcase Constants.BookmarkAttributes.StyleType.Italic: return FontStyle.Italic;\r\n\t\t\t\t\t\tcase Constants.BookmarkAttributes.StyleType.BoldItalic: return FontStyle.Italic | FontStyle.Bold;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn FontStyle.Regular;\r\n\t\t\t}\r\n\t\t\tset {\r\n\t\t\t\tstring s;\r\n\t\t\t\tswitch (value) {\r\n\t\t\t\t\tcase FontStyle.Bold:\r\n\t\t\t\t\t\ts = Constants.BookmarkAttributes.StyleType.Bold;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase FontStyle.Italic:\r\n\t\t\t\t\t\ts = Constants.BookmarkAttributes.StyleType.Italic;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase FontStyle.Bold | FontStyle.Italic:\r\n\t\t\t\t\t\ts = Constants.BookmarkAttributes.StyleType.BoldItalic;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase FontStyle.Regular:\r\n\t\t\t\t\tcase FontStyle.Underline:\r\n\t\t\t\t\tcase FontStyle.Strikeout:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tRemoveAttribute(Constants.BookmarkAttributes.Style);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tSetAttribute(Constants.BookmarkAttributes.Style, s);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置书签的默认打开状态。</summary>\r\n\t\tpublic bool IsOpen {\r\n\t\t\tget {\r\n\t\t\t\treturn HasChildNodes\r\n\t\t\t\t\t&& GetAttribute(Constants.BookmarkAttributes.Open) == Constants.Boolean.True;\r\n\t\t\t}\r\n\t\t\tset {\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\tSetAttribute(Constants.BookmarkAttributes.Open, Constants.Boolean.True);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tRemoveAttribute(Constants.BookmarkAttributes.Open);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置目标动作。</summary>\r\n\t\tpublic string Action {\r\n\t\t\tget => this.GetValue(Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\tset => this.SetValue(Constants.DestinationAttributes.Action, value);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置书签的目标页面。</summary>\r\n\t\tpublic int Page {\r\n\t\t\tget => this.GetValue(Constants.DestinationAttributes.Page, 0);\r\n\t\t\tset {\r\n\t\t\t\tthis.SetValue(Constants.DestinationAttributes.Page, value, 0);\r\n\t\t\t\tif (HasAttribute(Constants.DestinationAttributes.Action) == false) {\r\n\t\t\t\t\tSetAttribute(Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>返回或设置目标视图。</summary>\r\n\t\tpublic string DestinationView {\r\n\t\t\tget => GetAttribute(Constants.DestinationAttributes.View);\r\n\t\t\tset => this.SetValue(Constants.DestinationAttributes.View, value);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置 XYZ 目标视图下的缩放比例。</summary>\r\n\t\tpublic float ScaleFactor {\r\n\t\t\tget => this.GetValue(Constants.Coordinates.ScaleFactor, 1f);\r\n\t\t\tset {\r\n\t\t\t\tSetAttribute(Constants.Coordinates.ScaleFactor, value.ToText());\r\n\t\t\t\tSetAttribute(Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置跳转目标的上坐标。</summary>\r\n\t\tpublic float Top {\r\n\t\t\tget => this.GetValue(Constants.Coordinates.Top, 0f);\r\n\t\t\tset => this.SetValue(Constants.Coordinates.Top, value, 0);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置跳转目标的左坐标。</summary>\r\n\t\tpublic float Left {\r\n\t\t\tget => this.GetValue(Constants.Coordinates.Left, 0f);\r\n\t\t\tset => this.SetValue(Constants.Coordinates.Left, value, 0);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置跳转目标的下坐标。</summary>\r\n\t\tpublic float Bottom {\r\n\t\t\tget => this.GetValue(Constants.Coordinates.Bottom, 0f);\r\n\t\t\tset => this.SetValue(Constants.Coordinates.Bottom, value, 0);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取或设置跳转目标的右坐标。</summary>\r\n\t\tpublic float Right {\r\n\t\t\tget => this.GetValue(Constants.Coordinates.Right, 0f);\r\n\t\t\tset => this.SetValue(Constants.Coordinates.Right, value, 0);\r\n\t\t}\r\n\r\n\t\tpublic int MarkerColor {\r\n\t\t\tget => this.GetValue(\"标记颜色\", 0);\r\n\t\t\tset => this.SetValue(\"标记颜色\", value, 0);\r\n\t\t}\r\n\t\tinternal BookmarkElement(XmlDocument doc)\r\n\t\t\t: base(Constants.Bookmark, doc) {\r\n\r\n\t\t}\r\n\r\n\t\t/// <summary>设置跳转到页面的书签动作。</summary>\r\n\t\t/// <param name=\"title\">书签的标题。</param>\r\n\t\t/// <param name=\"pageNumber\">跳转页面。</param>\r\n\t\t/// <param name=\"position\">跳转位置。</param>\r\n\t\tpublic void SetTitleAndGotoPagePosition(string title, int pageNumber, float position) {\r\n\t\t\tSetAttribute(Constants.BookmarkAttributes.Title, title);\r\n\t\t\tthis.SetValue(Constants.DestinationAttributes.Page, pageNumber, 0);\r\n\t\t\tSetAttribute(Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\tif (position != 0) {\r\n\t\t\t\tSetAttribute(Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\tthis.SetValue(Constants.Coordinates.Top, position, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/// <summary>页码标签设置集合的根元素。</summary>\r\n\tpublic sealed class PageLabelRootElement : XmlElement\r\n\t{\r\n\t\tinternal PageLabelRootElement(XmlDocument doc)\r\n\t\t\t: base(String.Empty, Constants.DocumentBookmark, String.Empty, doc) {\r\n\t\t}\r\n\r\n\t\tpublic XmlNodeList Labels => SelectNodes(Constants.PageLabelsAttributes.Style);\r\n\r\n\t\tpublic void Add(MuPDF.PageLabel label) {\r\n\t\t\tforeach (PageLabelElement item in Labels) {\r\n\t\t\t\tif (item.PageNumber == label.FromPageNumber) {\r\n\t\t\t\t\titem.SetAttributes(label);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t(this.AppendElement(Constants.PageLabelsAttributes.Style) as PageLabelElement).SetAttributes(label);\r\n\t\t}\r\n\t}\r\n\r\n\t/// <summary>页码标签设置元素。</summary>\r\n\tpublic sealed class PageLabelElement : XmlElement\r\n\t{\r\n\t\t/// <summary>获取或指定开始使用页码标签的绝对页码。</summary>\r\n\t\tpublic int PageNumber {\r\n\t\t\tget => GetAttribute(Constants.PageLabelsAttributes.PageNumber).ToInt32();\r\n\t\t\tset => this.SetValue(Constants.PageLabelsAttributes.PageNumber, value < 1 ? 0 : value, 0);\r\n\t\t}\r\n\t\tpublic string PrefixLabel {\r\n\t\t\tget => GetAttribute(Constants.PageLabelsAttributes.Prefix);\r\n\t\t\tset => this.SetValue(Constants.PageLabelsAttributes.Prefix, value);\r\n\t\t}\r\n\t\t/// <summary>获取或指定页码标签样式。</summary>\r\n\t\tpublic string Style {\r\n\t\t\tget => GetAttribute(Constants.PageLabelsAttributes.Style);\r\n\t\t\tset => this.SetValue(Constants.PageLabelsAttributes.Style, value, Constants.PageLabelStyles.Names[0]);\r\n\t\t}\r\n\t\t/// <summary>获取或指定页码标签的起始编号。</summary>\r\n\t\tpublic int StartNumber {\r\n\t\t\tget => GetAttribute(Constants.PageLabelsAttributes.StartPage).ToInt32();\r\n\t\t\tset => this.SetValue(Constants.PageLabelsAttributes.StartPage, value < 1 ? 0 : value, 0);\r\n\t\t}\r\n\r\n\t\tinternal PageLabelElement(XmlDocument doc)\r\n\t\t\t: base(String.Empty, Constants.PageLabelsAttributes.Style, String.Empty, doc) {\r\n\t\t}\r\n\r\n\t\tpublic void SetAttributes(MuPDF.PageLabel label) {\r\n\t\t\tthis.SetValue(Constants.PageLabelsAttributes.PageNumber, label.FromPageNumber + 1, 0);\r\n\t\t\tSetAttribute(Constants.PageLabelsAttributes.Style, ValueHelper.MapValue((char)label.NumericStyle, Constants.PageLabelStyles.PdfValues, Constants.PageLabelStyles.Names));\r\n\t\t\tthis.SetValue(Constants.PageLabelsAttributes.StartPage, label.StartAt, 0);\r\n\t\t\tthis.SetValue(Constants.PageLabelsAttributes.Prefix, label.Prefix);\r\n\t\t}\r\n\r\n\t\tpublic MuPDF.PageLabel ToPageLabel() {\r\n\t\t\treturn new MuPDF.PageLabel(\r\n\t\t\t\tPageNumber - 1,\r\n\t\t\t\tStartNumber,\r\n\t\t\t\tPrefixLabel,\r\n\t\t\t\t(MuPDF.PageLabelStyle)ValueHelper.MapValue(Style, Constants.PageLabelStyles.Names, Constants.PageLabelStyles.PdfValues));\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfModelHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tstatic class PdfModelHelper\r\n\t{\r\n\t\tinternal static T Locate<T>(this PdfDictionary source, params object[] path) where T : PdfObject {\r\n\t\t\tPdfObject s = source;\r\n\t\t\tif (s == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tPdfName n;\r\n\t\t\tforeach (var item in path) {\r\n\t\t\t\tn = item as PdfName;\r\n\t\t\t\tif (s == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tif (n != null) {\r\n\t\t\t\t\tif (s.Type != PdfObject.DICTIONARY && s.Type != PdfObject.STREAM) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ts = (s as PdfDictionary).GetDirectObject(n);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (item is not int) {\r\n\t\t\t\t\tthrow new ArgumentException(\"参数类型必须为 Int32 或 PdfName\");\r\n\t\t\t\t}\r\n\t\t\t\tint i = (int)item;\r\n\t\t\t\tif (s.Type != PdfObject.ARRAY) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\ts = (s as PdfArray).GetDirectObject(i);\r\n\t\t\t}\r\n\t\t\treturn s as T;\r\n\t\t}\r\n\t\tinternal static T Locate<T>(this PdfDictionary source, params PdfName[] path) where T : PdfObject {\r\n\t\t\treturn source.Locate<T>(true, path);\r\n\t\t}\r\n\t\tinternal static T Locate<T>(this PdfDictionary source, bool resolveRef, params PdfName[] path) where T : PdfObject {\r\n\t\t\tPdfObject o = null;\r\n\t\t\tforeach (var item in path) {\r\n\t\t\t\tif (source == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\to = resolveRef ? source.GetDirectObject(item) : source.Get(item);\r\n\t\t\t\tsource = o as PdfDictionary;\r\n\t\t\t}\r\n\t\t\treturn o as T;\r\n\t\t}\r\n\t\tinternal static T Locate<T>(this PdfArray source, int index) where T : PdfObject {\r\n\t\t\treturn source.Locate<T>(true, index);\r\n\t\t}\r\n\t\tinternal static T Locate<T>(this PdfArray source, bool resolveRef, int index) where T : PdfObject {\r\n\t\t\tif (source == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn (resolveRef ? source.GetDirectObject(index) : source[index]) as T;\r\n\t\t}\r\n\t\tinternal static T CastAs<T>(this PdfIndirectReference pdfRef) where T : PdfObject {\r\n\t\t\treturn PdfReader.GetPdfObject(pdfRef) as T;\r\n\t\t}\r\n\t\tinternal static float ValueAsFloat(this PdfObject obj) {\r\n\t\t\treturn obj is PdfNumber n\r\n\t\t\t\t? n.FloatValue\r\n\t\t\t\t: 0;\r\n\t\t}\r\n\t\tinternal static float ValueAsInt(this PdfObject obj) {\r\n\t\t\treturn obj is PdfNumber n\r\n\t\t\t\t? n.IntValue\r\n\t\t\t\t: 0;\r\n\t\t}\r\n\r\n\t\tinternal static bool ValueIs(this PdfNumber obj, double value) {\r\n\t\t\treturn obj != null && obj.DoubleValue == value;\r\n\t\t}\r\n\t\tinternal static bool ValueIs(this PdfBoolean obj, bool value) {\r\n\t\t\treturn obj != null && obj.BooleanValue == value;\r\n\t\t}\r\n\t\tinternal static bool ValueIs(this PdfObject obj, PdfName value) {\r\n\t\t\treturn value.Equals(obj);\r\n\t\t}\r\n\r\n\t\tinternal static int TryGetInt32(this PdfDictionary source, PdfName key, int defaultValue) {\r\n\t\t\tvar w = source.GetAsNumber(key);\r\n\t\t\treturn w?.IntValue ?? defaultValue;\r\n\t\t}\r\n\t\tinternal static bool TryGetBoolean(this PdfDictionary source, PdfName key, bool defaultValue) {\r\n\t\t\tvar b = source.GetAsBoolean(key);\r\n\t\t\treturn b?.BooleanValue ?? defaultValue;\r\n\t\t}\r\n\r\n\t\tinternal static string Decode(this PdfString text, Encoding encoding) {\r\n\t\t\tif (text == null) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tvar bytes = text.GetBytes();\r\n\t\t\tusing (MemoryStream ms = new MemoryStream(bytes)) {\r\n\t\t\t\tif (encoding == null) {\r\n\t\t\t\t\tif (bytes.Length >= 2 && (bytes[0] == 0xFF && bytes[1] == 0xFE || bytes[0] == 0xFE && bytes[1] == 0xFF)) {\r\n\t\t\t\t\t\tusing (TextReader r = new StreamReader(ms, true)) {\r\n\t\t\t\t\t\t\treturn r.ReadToEnd();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treturn PdfEncodings.ConvertToString(bytes, PdfObject.TEXT_PDFDOCENCODING);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// 忽略字节顺序标记\r\n\t\t\t\t\tif (bytes.Length >= 2 && (bytes[0] == 0xFF && bytes[1] == 0xFE || bytes[0] == 0xFE && bytes[1] == 0xFF)) {\r\n\t\t\t\t\t\tms.Position += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (bytes.Length >= 3 && bytes[0] == 0xef && bytes[1] == 0xbb && bytes[2] == 0xbf) {\r\n\t\t\t\t\t\tms.Position += 3;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (bytes.Length >= 4 && bytes[0] == 0 && bytes[1] == 0 && bytes[2] == 0xfe && bytes[3] == 0xff) {\r\n\t\t\t\t\t\tms.Position += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tusing (TextReader r = new StreamReader(ms, encoding)) {\r\n\t\t\t\t\t\treturn r.ReadToEnd();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static PdfString ToPdfString(this string text) {\r\n\t\t\tif (String.IsNullOrEmpty(text)) {\r\n\t\t\t\treturn new PdfString();\r\n\t\t\t}\r\n\t\t\tbool u = false;\r\n\t\t\tforeach (var c in text) {\r\n\t\t\t\tif (c > 127) {\r\n\t\t\t\t\tu = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn u ? new PdfString(text, PdfObject.TEXT_UNICODE) : new PdfString(text);\r\n\t\t}\r\n\r\n\t\tinternal static IEnumerable<ResourceReference> GetReferencedResources(PdfDictionary source, Predicate<PdfDictionary> predicate, HashSet<PdfIndirectReference> refDedup) {\r\n\t\t\tforeach (var item in source) {\r\n\t\t\t\tif (item.Value is PdfIndirectReference r\r\n\t\t\t\t\t&& refDedup.Add(r)\r\n\t\t\t\t\t&& PdfReader.GetPdfObjectRelease(r) is PdfDictionary o) {\r\n\t\t\t\t\tif (predicate(o)) {\r\n\t\t\t\t\t\tyield return new ResourceReference(r, item.Key, o);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var f in GetReferencedResources(o, predicate, refDedup)) {\r\n\t\t\t\t\t\tyield return f;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (item.Value is PdfDictionary d) {\r\n\t\t\t\t\tforeach (var f in GetReferencedResources(d, predicate, refDedup)) {\r\n\t\t\t\t\t\tyield return f;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfNavigator.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml;\r\nusing System.Xml.XPath;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tsealed class PdfNavigator : XPathNavigator\r\n\t{\r\n\t\tsealed class HtmlNameTable : XmlNameTable\r\n\t\t{\r\n\t\t\treadonly NameTable _nameTable = new();\r\n\t\t\tpublic override string Add(string array) {\r\n\t\t\t\treturn _nameTable.Add(array);\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Add(char[] array, int offset, int length) {\r\n\t\t\t\treturn _nameTable.Add(array, offset, length);\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Get(string array) {\r\n\t\t\t\treturn _nameTable.Get(array);\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string Get(char[] array, int offset, int length) {\r\n\t\t\t\treturn _nameTable.Get(array, offset, length);\r\n\t\t\t}\r\n\r\n\t\t\tinternal string GetOrAdd(string array) {\r\n\t\t\t\treturn Get(array) ?? Add(array);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treadonly PdfPathDocument _doc;\r\n\t\treadonly HtmlNameTable _nameTable = new HtmlNameTable();\r\n\t\tDocumentObject _currentObject;\r\n\t\tint _childIndex = -1;\r\n\r\n\t\tpublic PdfNavigator(PdfPathDocument document) {\r\n\t\t\t_doc = document;\r\n\t\t}\r\n\r\n\t\tpublic PdfNavigator(PdfNavigator source) {\r\n\t\t\t_doc = source._doc;\r\n\t\t\t_currentObject = source._currentObject;\r\n\t\t}\r\n\r\n\t\tpublic PdfObject PdfObject => _currentObject.ExtensiveObject as PdfObject;\r\n\r\n\t\t#region XPathNavigator implementation\r\n\t\tpublic override string BaseURI => String.Empty;\r\n\r\n\t\tpublic override XPathNavigator Clone() {\r\n\t\t\treturn new PdfNavigator(this);\r\n\t\t}\r\n\r\n\t\tpublic override bool IsEmptyElement => !_currentObject.HasChildren;\r\n\r\n\t\tpublic override bool IsSamePosition(XPathNavigator other) {\r\n\t\t\treturn other is PdfNavigator o && _currentObject == o._currentObject;\r\n\t\t}\r\n\r\n\t\tpublic override string LocalName => _nameTable.GetOrAdd(_currentObject.FriendlyName ?? _currentObject.Name);\r\n\r\n\t\tpublic override bool MoveTo(XPathNavigator other) {\r\n\t\t\tif (other is not PdfNavigator o) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (_doc != o._doc) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t_currentObject = o._currentObject;\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToFirstAttribute() {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToFirstChild() {\r\n\t\t\t_currentObject.PopulateChildren(false);\r\n\t\t\tif (!_currentObject.HasChildren) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t_childIndex = 0;\r\n\t\t\t_currentObject = ((IList<DocumentObject>)_currentObject.Children)[0];\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToId(string id) {\r\n\t\t\t// 将当前对象设置为该页\r\n\t\t\treturn id.HasCaseInsensitivePrefix(\"PAGE\") && id.Substring(4).TryParse(out int p) && p < _doc.PageCount;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToNext() {\r\n\t\t\tif (_currentObject.Parent == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (_childIndex < _currentObject.Parent.Children.Count - 1) {\r\n\t\t\t\t_childIndex++;\r\n\t\t\t\t_currentObject = ((IList<DocumentObject>)_currentObject.Children)[_childIndex];\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToNextAttribute() {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToNextNamespace(XPathNamespaceScope namespaceScope) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToParent() {\r\n\t\t\tif (_currentObject.Parent == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t_currentObject = _currentObject.Parent;\r\n\t\t\t_childIndex = -1;\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic override bool MoveToPrevious() {\r\n\t\t\tif (_currentObject.Parent == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (_childIndex > 0) {\r\n\t\t\t\t_childIndex--;\r\n\t\t\t\t_currentObject = ((IList<DocumentObject>)_currentObject.Children)[_childIndex];\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic override string Name => _nameTable.GetOrAdd(_currentObject.Name);\r\n\r\n\t\tpublic override XmlNameTable NameTable => _nameTable;\r\n\r\n\t\tpublic override string NamespaceURI => String.Empty;\r\n\r\n\t\tpublic override XPathNodeType NodeType {\r\n\t\t\tget {\r\n\t\t\t\tswitch (_currentObject.Type) {\r\n\t\t\t\t\tcase PdfObjectType.Normal:\r\n\t\t\t\t\t\tvar po = _currentObject.ExtensiveObject as PdfObject;\r\n\t\t\t\t\t\treturn po.Type switch {\r\n\t\t\t\t\t\t\tPdfObject.ARRAY or PdfObject.DICTIONARY or PdfObject.STREAM => XPathNodeType.Element,\r\n\t\t\t\t\t\t\t_ => XPathNodeType.Attribute,\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\tcase PdfObjectType.Trailer:\r\n\t\t\t\t\t\treturn XPathNodeType.Root;\r\n\t\t\t\t\tcase PdfObjectType.Root:\r\n\t\t\t\t\tcase PdfObjectType.Pages:\r\n\t\t\t\t\tcase PdfObjectType.Page:\r\n\t\t\t\t\tcase PdfObjectType.Image:\r\n\t\t\t\t\tcase PdfObjectType.Form:\r\n\t\t\t\t\tcase PdfObjectType.Resources:\r\n\t\t\t\t\tcase PdfObjectType.Outline:\r\n\t\t\t\t\tcase PdfObjectType.PageCommand:\r\n\t\t\t\t\tcase PdfObjectType.PageCommands:\r\n\t\t\t\t\tcase PdfObjectType.GoToPage:\r\n\t\t\t\t\t\treturn XPathNodeType.Element;\r\n\t\t\t\t\tcase PdfObjectType.Hidden:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn XPathNodeType.Comment;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic override string Prefix => String.Empty;\r\n\r\n\t\tpublic override string Value => _currentObject.FriendlyValue;\r\n\t\t#endregion\r\n\r\n\t\t#region XPathNavigator overrides\r\n\t\tpublic override void DeleteSelf() {\r\n\t\t\tvar p = _currentObject.Parent;\r\n\t\t\tp.Children.Remove(_currentObject);\r\n\t\t\t_currentObject = p;\r\n\t\t\t_childIndex = ((IList<DocumentObject>)p.Parent.Children).IndexOf(p);\r\n\t\t}\r\n\r\n\t\tpublic override object UnderlyingObject => _currentObject;\r\n\r\n\t\tpublic override bool ValueAsBoolean => PdfObject is PdfBoolean { BooleanValue: true };\r\n\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfObjectType.cs",
    "content": "﻿namespace PDFPatcher\r\n{\r\n\tinternal enum PdfObjectType\r\n\t{\r\n\t\tNormal,\r\n\t\tTrailer,\r\n\t\tRoot,\r\n\t\tPages,\r\n\t\tPage,\r\n\t\tImage,\r\n\t\tForm,\r\n\t\tResources,\r\n\t\tOutline,\r\n\t\tPageCommand,\r\n\t\tPageCommands,\r\n\t\tGoToPage,\r\n\t\tHidden\r\n\t}\r\n}"
  },
  {
    "path": "App/Model/PdfPageCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tenum PdfPageCommandType\r\n\t{\r\n\t\tNormal,\r\n\t\tText,\r\n\t\tEnclosure,\r\n\t\tMatrix,\r\n\t\tFont,\r\n\t\tInlineImage,\r\n\t\tInvalid\r\n\t}\r\n\tinterface IPdfPageCommandContainer\r\n\t{\r\n\t\tbool HasCommand { get; }\r\n\t\tIList<PdfPageCommand> Commands { get; }\r\n\t}\r\n\tabstract class PdfPageCommand\r\n\t{\r\n\t\t#region 操作符中文名称\r\n\t\tstatic readonly Dictionary<string, string> __OperatorNames = Init();\r\n\t\tstatic Dictionary<string, string> Init() {\r\n\t\t\treturn new Dictionary<string, string> {\r\n\t\t\t\t{ \"'\", \"换行字符串\" },\r\n\t\t\t\t{ \"\\\"\", \"换行字符串\" },\r\n\t\t\t\t{ \"b\", \"闭合非零画线填充\" },\r\n\t\t\t\t{ \"B\", \"非零画线填充\" },\r\n\t\t\t\t{ \"b*\", \"闭合奇偶画线填充\" },\r\n\t\t\t\t{ \"B*\", \"奇偶画线填充\" },\r\n\t\t\t\t{ \"BDC\", \"标记内容区及属性\" },\r\n\t\t\t\t{ \"BI\", \"内嵌图像\" },\r\n\t\t\t\t{ \"BMC\", \"标记内容区\" },\r\n\t\t\t\t{ \"BT\", \"文本区\" },\r\n\t\t\t\t{ \"BX\", \"兼容区\" },\r\n\t\t\t\t{ \"c\", \"曲线\" },\r\n\t\t\t\t{ \"cm\", \"矩阵\" },\r\n\t\t\t\t{ \"CS\", \"画线色域\" },\r\n\t\t\t\t{ \"cs\", \"非线色域\" },\r\n\t\t\t\t{ \"d\", \"虚线图案\" },\r\n\t\t\t\t{ \"d0\", \"Type3字宽\" },\r\n\t\t\t\t{ \"d1\", \"Type3字宽及容器\" },\r\n\t\t\t\t{ \"Do\", \"绘制对象\" },\r\n\t\t\t\t{ \"DP\", \"标记内容点及属性\" },\r\n\t\t\t\t{ \"EI\", \"内嵌图像结束\" },\r\n\t\t\t\t{ \"EMC\", \"标记内容结束\" },\r\n\t\t\t\t{ \"ET\", \"文本区尾\" },\r\n\t\t\t\t{ \"EX\", \"兼容区尾\" },\r\n\t\t\t\t{ \"f\", \"非零填充\" },\r\n\t\t\t\t{ \"F\", \"非零填充\" },\r\n\t\t\t\t{ \"f*\", \"奇偶填充\" },\r\n\t\t\t\t{ \"G\", \"画线灰色\" },\r\n\t\t\t\t{ \"g\", \"非线灰色\" },\r\n\t\t\t\t{ \"gs\", \"绘图参数\" },\r\n\t\t\t\t{ \"h\", \"终点\" },\r\n\t\t\t\t{ \"i\", \"平滑度容限\" },\r\n\t\t\t\t{ \"ID\", \"内嵌图像数据\" },\r\n\t\t\t\t{ \"J\", \"线端样式\" },\r\n\t\t\t\t{ \"j\", \"连接线样式\" },\r\n\t\t\t\t{ \"K\", \"画线四色\" },\r\n\t\t\t\t{ \"k\", \"非线四色\" },\r\n\t\t\t\t{ \"l\", \"直线\" },\r\n\t\t\t\t{ \"m\", \"始点\" },\r\n\t\t\t\t{ \"M\", \"斜接面上限\" },\r\n\t\t\t\t{ \"MP\", \"标记内容点\" },\r\n\t\t\t\t{ \"n\", \"闭合路径不填充\" },\r\n\t\t\t\t{ \"q\", \"绘图状态\" },\r\n\t\t\t\t{ \"Q\", \"绘图状态出栈\" },\r\n\t\t\t\t{ \"re\", \"矩形\" },\r\n\t\t\t\t{ \"RG\", \"画线三色\" },\r\n\t\t\t\t{ \"rg\", \"非线三色\" },\r\n\t\t\t\t{ \"ri\", \"颜色渲染意向\" },\r\n\t\t\t\t{ \"s\", \"画封闭线\" },\r\n\t\t\t\t{ \"S\", \"画线\" },\r\n\t\t\t\t{ \"SC\", \"画线颜色\" },\r\n\t\t\t\t{ \"sc\", \"非线颜色\" },\r\n\t\t\t\t{ \"SCN\", \"画线颜色\" },\r\n\t\t\t\t{ \"scn\", \"非线颜色\" },\r\n\t\t\t\t{ \"sh\", \"阴影\" },\r\n\t\t\t\t{ \"T*\", \"换行\" },\r\n\t\t\t\t{ \"Tc\", \"字距\" },\r\n\t\t\t\t{ \"Td\", \"换行\" },\r\n\t\t\t\t{ \"TD\", \"换行\" },\r\n\t\t\t\t{ \"Tf\", \"字体\" },\r\n\t\t\t\t{ \"Tj\", \"字符串\" },\r\n\t\t\t\t{ \"TJ\", \"字符串\" },\r\n\t\t\t\t{ \"Tk\", \"单独字符渲染\" },\r\n\t\t\t\t{ \"TL\", \"行距\" },\r\n\t\t\t\t{ \"Tm\", \"文本矩阵\" },\r\n\t\t\t\t{ \"Tr\", \"文本渲染\" },\r\n\t\t\t\t{ \"Ts\", \"文本垂直偏移\" },\r\n\t\t\t\t{ \"Tw\", \"词距\" },\r\n\t\t\t\t{ \"Tz\", \"文本水平拉伸\" },\r\n\t\t\t\t{ \"v\", \"控尾曲线\" },\r\n\t\t\t\t{ \"w\", \"线宽\" },\r\n\t\t\t\t{ \"W\", \"非零裁剪\" },\r\n\t\t\t\t{ \"W*\", \"奇偶裁剪\" },\r\n\t\t\t\t{ \"y\", \"控首曲线\" }\r\n\t\t\t};\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tpublic virtual PdfLiteral Name { get; }\r\n\t\tpublic abstract bool HasOutput { get; }\r\n\t\tpublic PdfObject[] Operands { get; }\r\n\t\tpublic virtual PdfPageCommandType Type => PdfPageCommandType.Normal;\r\n\t\tinternal bool HasOperand => Operands?.Length > 0;\r\n\r\n\t\tprotected PdfPageCommand(PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\tName = oper;\r\n\t\t\tif (operands?.Count > 0) {\r\n\t\t\t\tOperands = new PdfObject[operands[operands.Count - 1] is PdfLiteral ? operands.Count - 1 : operands.Count];\r\n\t\t\t\toperands.CopyTo(0, Operands, 0, Operands.Length);\r\n\t\t\t}\r\n\t\t}\r\n\t\tprotected PdfPageCommand(string oper, params PdfObject[] operands) : this(new PdfLiteral(oper), new List<PdfObject>(operands)) {\r\n\t\t}\r\n\r\n\t\tinternal virtual void WriteToPdf(Stream target) {\r\n\t\t\tif (Operands != null) {\r\n\t\t\t\tforeach (var oi in Operands) {\r\n\t\t\t\t\tWriteOperand(oi, target);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tWriteOperator(Name, target);\r\n\t\t}\r\n\r\n\t\tprotected static void WriteOperand(PdfObject operand, Stream target) {\r\n\t\t\toperand.ToPdf(null, target);\r\n\t\t\ttarget.WriteByte((byte)' ');\r\n\t\t}\r\n\r\n\t\tprotected static void WriteOperator(PdfLiteral opName, Stream target) {\r\n\t\t\topName.ToPdf(null, target);\r\n\t\t\ttarget.WriteByte((byte)'\\n');\r\n\t\t}\r\n\r\n\t\tinternal static bool GetFriendlyCommandName(string oper, out string friendlyName) {\r\n\t\t\treturn __OperatorNames.TryGetValue(oper, out friendlyName);\r\n\t\t}\r\n\r\n\t\tinternal string GetOperandsText() {\r\n\t\t\treturn Operands != null ? Processor.PdfHelper.GetArrayString(Operands) : null;\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class EnclosingCommand(PdfLiteral oper, List<PdfObject> operands) : PdfPageCommand(oper, operands), IPdfPageCommandContainer\r\n\t{\r\n\t\tconst string BQ = \"q\";\r\n\t\tconst string BT = \"BT\";\r\n\t\tconst string BDC = \"BDC\";\r\n\t\tconst string BMC = \"BMC\";\r\n\t\tconst string BX = \"BX\";\r\n\t\tconst string EQ = \"Q\";\r\n\t\tconst string ET = \"ET\";\r\n\t\tconst string EMC = \"EMC\";\r\n\t\tconst string EX = \"EX\";\r\n\r\n\t\tstatic readonly string[] __StartEnclosingCommands = [BQ, BT, BDC, BMC, BX];\r\n\t\tstatic readonly string[] __EndEnclosingCommands = [EQ, ET, EMC, EX];\r\n\t\tstatic readonly PdfLiteral[] __EnclosingCommands = [\r\n\t\t\tnew PdfLiteral(EQ),\r\n\t\t\tnew PdfLiteral(ET),\r\n\t\t\tnew PdfLiteral(EMC),\r\n\t\t\tnew PdfLiteral(EMC),\r\n\t\t\tnew PdfLiteral(EX)\r\n\t\t];\r\n\r\n\t\tpublic bool HasCommand => Commands.Count > 0;\r\n\t\tpublic IList<PdfPageCommand> Commands { get; } = new List<PdfPageCommand>();\r\n\t\tpublic override PdfPageCommandType Type => PdfPageCommandType.Enclosure;\r\n\t\tpublic override bool HasOutput {\r\n\t\t\tget {\r\n\t\t\t\tif (HasCommand) {\r\n\t\t\t\t\tforeach (var item in Commands) {\r\n\t\t\t\t\t\tif (item.HasOutput) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static EnclosingCommand Create(string name, IEnumerable<PdfObject> operands, params PdfPageCommand[] subCommands) {\r\n\t\t\tvar c = new EnclosingCommand(new PdfLiteral(name), operands != null\r\n\t\t\t\t? new List<PdfObject>(operands)\r\n\t\t\t\t: null);\r\n\t\t\t((List<PdfPageCommand>)c.Commands).AddRange(subCommands);\r\n\t\t\treturn c;\r\n\t\t}\r\n\r\n\t\tinternal override void WriteToPdf(Stream target) {\r\n\t\t\tbase.WriteToPdf(target);\r\n\t\t\tif (HasCommand) {\r\n\t\t\t\tforeach (var cmd in Commands) {\r\n\t\t\t\t\tcmd.WriteToPdf(target);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tWriteOperator(ValueHelper.MapValue(Name.ToString(), __StartEnclosingCommands, __EnclosingCommands), target);\r\n\t\t}\r\n\r\n\t\tinternal static bool IsStartingCommand(string oper) {\r\n\t\t\treturn __StartEnclosingCommands.Contains(oper);\r\n\t\t}\r\n\t\tinternal static bool IsEndingCommand(string oper) {\r\n\t\t\treturn __EndEnclosingCommands.Contains(oper);\r\n\t\t}\r\n\t}\r\n\r\n\tclass OutputCommand : PdfPageCommand\r\n\t{\r\n\t\tpublic override bool HasOutput => true;\r\n\r\n\t\tpublic OutputCommand(PdfLiteral oper, List<PdfObject> operands) : base(oper, operands) {\r\n\t\t}\r\n\t\tpublic OutputCommand(string oper, params PdfObject[] operands) : base(oper, operands) {\r\n\t\t}\r\n\t}\r\n\r\n\tclass AdjustCommand : PdfPageCommand\r\n\t{\r\n\t\tpublic override bool HasOutput => false;\r\n\r\n\t\tpublic AdjustCommand(PdfLiteral oper, List<PdfObject> operands) : base(oper, operands) {\r\n\t\t}\r\n\t\tpublic AdjustCommand(string oper, params PdfObject[] operands) : base(oper, operands) {\r\n\t\t}\r\n\t}\r\n\r\n\tclass TextCommand(PdfLiteral oper, List<PdfObject> operands, TextInfo text) : OutputCommand(oper, operands)\r\n\t{\r\n\t\tpublic TextInfo TextInfo { get; } = text;\r\n\t\tpublic override PdfPageCommandType Type => PdfPageCommandType.Text;\r\n\t}\r\n\r\n\tsealed class PaceAndTextCommand : TextCommand\r\n\t{\r\n\t\tpublic string[] DecodedTexts { get; }\r\n\r\n\t\tpublic PaceAndTextCommand(PdfLiteral oper, List<PdfObject> operands, TextInfo text, FontInfo font)\r\n\t\t\t: base(oper, operands, text) {\r\n\t\t\tvar a = (PdfArray)Operands[0];\r\n\t\t\tDecodedTexts = new string[a.Size];\r\n\t\t\tint i = 0;\r\n\t\t\tforeach (var item in a.ArrayList) {\r\n\t\t\t\tif (item.Type == PdfObject.STRING) {\r\n\t\t\t\t\tDecodedTexts[i] = font.DecodeText((PdfString)item);\r\n\t\t\t\t}\r\n\t\t\t\t++i;\r\n\t\t\t}\r\n\t\t\ttext.Text = String.Concat(DecodedTexts);\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class MatrixCommand : AdjustCommand\r\n\t{\r\n\t\tpublic static PdfLiteral CM = new(\"cm\");\r\n\t\tpublic static PdfLiteral TM = new(\"Tm\");\r\n\t\tpublic override PdfPageCommandType Type => PdfPageCommandType.Matrix;\r\n\r\n\t\tpublic MatrixCommand(PdfLiteral oper, List<PdfObject> operands)\r\n\t\t\t: base(oper, operands) {\r\n\t\t}\r\n\t\tpublic MatrixCommand(PdfLiteral oper, float a, float b, float c, float d, float e, float f)\r\n\t\t\t: base(oper, new List<PdfObject>(6) {\r\n\t\t\t\t\tnew PdfNumber (a), new PdfNumber(b),\r\n\t\t\t\t\tnew PdfNumber (c), new PdfNumber (d),\r\n\t\t\t\t\tnew PdfNumber (e), new PdfNumber(f)\r\n\t\t\t}) {\r\n\t\t}\r\n\t\tpublic void Multiply(double[] matrix) {\r\n\t\t\tvar m1 = Array.ConvertAll(Operands, (i) => ((PdfNumber)i).DoubleValue);\r\n\t\t\tOperands[0] = new PdfNumber(m1[0] * matrix[0] + m1[1] * matrix[2]);\r\n\t\t\tOperands[1] = new PdfNumber(m1[0] * matrix[1] + m1[1] * matrix[3]);\r\n\t\t\tOperands[2] = new PdfNumber(m1[2] * matrix[0] + m1[3] * matrix[2]);\r\n\t\t\tOperands[3] = new PdfNumber(m1[2] * matrix[1] + m1[3] * matrix[3]);\r\n\t\t\tOperands[4] = new PdfNumber(m1[4] * matrix[0] + m1[5] * matrix[2] + matrix[4]);\r\n\t\t\tOperands[5] = new PdfNumber(m1[4] * matrix[1] + m1[5] * matrix[3] + matrix[5]);\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class FontCommand(PdfLiteral oper, List<PdfObject> operands, string fontName) : AdjustCommand(oper, operands)\r\n\t{\r\n\t\tpublic string FontName { get; } = fontName;\r\n\t\tpublic PdfName ResourceName {\r\n\t\t\tget => Operands[0] as PdfName;\r\n\t\t\tset => Operands[0] = value;\r\n\t\t}\r\n\t\tpublic PdfNumber FontSize {\r\n\t\t\tget => Operands[1] as PdfNumber;\r\n\t\t\tset => Operands[1] = value;\r\n\t\t}\r\n\t\tpublic override PdfPageCommandType Type => PdfPageCommandType.Font;\r\n\t\tpublic override bool HasOutput => false;\r\n\t}\r\n\r\n\tsealed class InlineImageCommand(PdfLiteral oper, List<PdfObject> operands) : OutputCommand(oper, operands)\r\n\t{\r\n\t\t//static readonly PdfName __DCT = new PdfName (\"DCT\");\r\n\t\t//static readonly PdfName __CCF = new PdfName (\"CCF\");\r\n\t\tstatic readonly PdfLiteral __ID = new(\"ID\");\r\n\t\tstatic readonly PdfLiteral __EI = new(\"EI\");\r\n\r\n\t\tpublic PdfImageData Image => Operands[0] as PdfImageData;\r\n\t\tpublic override PdfPageCommandType Type => PdfPageCommandType.InlineImage;\r\n\r\n\t\tinternal override void WriteToPdf(Stream target) {\r\n\t\t\tvar img = Image;\r\n\t\t\tWriteOperator(Name, target);\r\n\t\t\tforeach (var item in img) {\r\n\t\t\t\titem.Key.ToPdf(null, target);\r\n\t\t\t\ttarget.WriteByte((byte)' ');\r\n\t\t\t\titem.Value.ToPdf(null, target);\r\n\t\t\t\ttarget.WriteByte((byte)'\\n');\r\n\t\t\t}\r\n\t\t\tWriteOperator(__ID, target);\r\n\t\t\ttarget.Write(img.RawBytes, 0, img.RawBytes.Length);\r\n\t\t\ttarget.WriteByte((byte)'\\n');\r\n\t\t\tWriteOperator(__EI, target);\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class InvalidCommand(PdfLiteral oper, List<PdfObject> operands) : PdfPageCommand(oper, operands)\r\n\t{\r\n\t\tpublic override PdfPageCommandType Type => PdfPageCommandType.Invalid;\r\n\t\tpublic override bool HasOutput => false;\r\n\t\tpublic string Error { get; set; }\r\n\r\n\t\tinternal override void WriteToPdf(Stream target) {\r\n\t\t\t// do nothing\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/Context.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tsealed class Context\r\n\t{\r\n\t\tpublic DocumentObject Current { get; private set; }\r\n\t\tpublic int Position { get; private set; }\r\n\r\n\t\tpublic Context(DocumentObject currentObject, int position) {\r\n\t\t\tCurrent = currentObject;\r\n\t\t\tPosition = position;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/IPathAxis.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic interface IPathAxis\r\n\t{\r\n\t\tPathAxisType Type { get; }\r\n\t\tDocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates);\r\n\t\tIList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/IPathExpression.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic interface IPathExpression : IPathValue\r\n\t{\r\n\t\tIList<IPathPredicate> Predicates { get; }\r\n\t\tIPathAxis Axis { get; }\r\n\t\tstring Name { get; }\r\n\t\tDocumentObject SelectObject(DocumentObject source);\r\n\t\tIList<DocumentObject> SelectObjects(DocumentObject source);\r\n\t}\r\n\r\n\tpublic class PathExpression : IPathExpression\r\n\t{\r\n\t\tinternal static readonly IList<DocumentObject> EmptyMatchResult = new DocumentObject[0];\r\n\r\n\t\t#region IPathExpression 成员\r\n\t\tpublic PathValueType ValueType => PathValueType.Expression;\r\n\r\n\t\tpublic IPathAxis Axis { get; private set; }\r\n\r\n\t\tpublic string Name { get; private set; }\r\n\r\n\t\tprivate IList<IPathPredicate> _Predicates;\r\n\t\t///<summary>获取匹配条件列表。</summary>\r\n\t\tpublic IList<IPathPredicate> Predicates {\r\n\t\t\tget {\r\n\t\t\t\t_Predicates ??= new List<IPathPredicate>();\r\n\t\t\t\treturn _Predicates;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic DocumentObject SelectObject(DocumentObject source) {\r\n\t\t\treturn Axis.SelectObject(source, Name, Predicates);\r\n\t\t}\r\n\r\n\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source) {\r\n\t\t\treturn Axis.SelectObjects(source, Name, _Predicates);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tpublic PathExpression(PathAxisType axis) {\r\n\t\t\tAxis = PathAxes.Create(axis);\r\n\t\t}\r\n\t\tpublic PathExpression(PathAxisType axis, string name) {\r\n\t\t\tAxis = PathAxes.Create(axis);\r\n\t\t\tName = name;\r\n\t\t}\r\n\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/IPathFunction.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tinterface IPathFunction\r\n\t{\r\n\t\tobject Evaluate(DocumentObject source);\r\n\t}\r\n\r\n\tsealed class CurrentPosition : IPathFunction\r\n\t{\r\n\t\t#region IPathFunction 成员\r\n\r\n\t\tpublic object Evaluate(DocumentObject source) {\r\n\t\t\tif (source == null || source.Parent == null) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tint i = 0;\r\n\t\t\tforeach (var item in source.Parent.Children) {\r\n\t\t\t\t++i;\r\n\t\t\t\tif (item == source) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/IPathPredicate.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic interface IPathPredicate\r\n\t{\r\n\t\tPredicateOperatorType Operator { get; }\r\n\t\tIPathExpression Operand1 { get; }\r\n\t\tIPathExpression Operand2 { get; }\r\n\t\tbool Match(DocumentObject source, IPathValue value1, IPathValue value2);\r\n\t}\r\n\r\n\tabstract class PathPredicate : IPathPredicate\r\n\t{\r\n\t\t#region IPathPredicate 成员\r\n\r\n\t\tpublic abstract PredicateOperatorType Operator { get; }\r\n\r\n\t\tpublic IPathExpression Operand1 { get; internal set; }\r\n\r\n\t\tpublic IPathExpression Operand2 { get; internal set; }\r\n\r\n\t\tpublic abstract bool Match(DocumentObject source, IPathValue value1, IPathValue value2);\r\n\r\n\t\t#endregion\r\n\r\n\t\tprotected PathPredicate(IPathExpression operand1, IPathExpression operand2) {\r\n\t\t\tOperand1 = operand1;\r\n\t\t\tOperand2 = operand2;\r\n\t\t}\r\n\r\n\t\tsealed class ContainmentPredicate : PathPredicate\r\n\t\t{\r\n\t\t\tpublic ContainmentPredicate(IPathExpression operand1, IPathExpression operand2)\r\n\t\t\t\t: base(operand1, operand2) {\r\n\t\t\t}\r\n\r\n\t\t\tpublic override PredicateOperatorType Operator => PredicateOperatorType.Contains;\r\n\r\n\t\t\tpublic override bool Match(DocumentObject source, IPathValue value1, IPathValue value2) {\r\n\t\t\t\tif (value1.ValueType == PathValueType.Expression) {\r\n\t\t\t\t\tvar exp = value1 as IPathExpression;\r\n\t\t\t\t\treturn exp.SelectObjects(source).Count > 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tclass EqualityPredicate : PathPredicate\r\n\t\t{\r\n\t\t\tpublic override PredicateOperatorType Operator => PredicateOperatorType.Equal;\r\n\r\n\t\t\tpublic EqualityPredicate(IPathExpression operand1, IPathExpression operand2)\r\n\t\t\t\t: base(operand1, operand2) {\r\n\t\t\t}\r\n\r\n\t\t\tpublic override bool Match(DocumentObject source, IPathValue value1, IPathValue value2) {\r\n\t\t\t\tif (value1.ValueType == PathValueType.Expression) {\r\n\t\t\t\t\tvar exp = value1 as IPathExpression;\r\n\t\t\t\t\tstring v;\r\n\t\t\t\t\tif (value2 is IConstantPathValue cv) {\r\n\t\t\t\t\t\tv = cv.LiteralValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar o = (value2 as IPathExpression).SelectObject(source);\r\n\t\t\t\t\t\tv = o != null ? (o.FriendlyValue ?? o.LiteralValue) : String.Empty;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var item in exp.SelectObjects(source)) {\r\n\t\t\t\t\t\tif ((item.FriendlyValue ?? item.LiteralValue) == v) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\telse if (value1.ValueType == PathValueType.Number || value2.ValueType == PathValueType.Number) {\r\n\t\t\t\t\treturn PathValue.ToNumber(source, value1) == PathValue.ToNumber(source, value2);\r\n\t\t\t\t}\r\n\t\t\t\telse if (value1.ValueType == PathValueType.String || value2.ValueType == PathValueType.String) {\r\n\t\t\t\t\treturn PathValue.ToString(source, value1) == PathValue.ToString(source, value2);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn PathValue.ToBoolean(source, value1) == PathValue.ToBoolean(source, value2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class InequalityPredicate : EqualityPredicate\r\n\t\t{\r\n\t\t\tpublic InequalityPredicate(IPathExpression operand1, IPathExpression operand2)\r\n\t\t\t\t: base(operand1, operand2) {\r\n\t\t\t}\r\n\t\t\tpublic override PredicateOperatorType Operator => PredicateOperatorType.NotEqual;\r\n\t\t\tpublic override bool Match(DocumentObject source, IPathValue value1, IPathValue value2) {\r\n\t\t\t\treturn !base.Match(source, value1, value2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/IPathValue.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic interface IPathValue\r\n\t{\r\n\t\tPathValueType ValueType { get; }\r\n\t}\r\n\r\n\tpublic interface IConstantPathValue : IPathValue\r\n\t{\r\n\t\tstring LiteralValue { get; }\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/PathAxes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tstatic class PathAxes\r\n\t{\r\n\t\tstatic bool MatchesPredicate(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\tif (source == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (name != null && (source.FriendlyName ?? source.Name) != name) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (predicates == null) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tforeach (var p in predicates) {\r\n\t\t\t\tif (p.Match(source, p.Operand1, p.Operand2) == false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tstatic IList<DocumentObject> CompriseSingleObjectCollection(DocumentObject source) {\r\n\t\t\treturn source == null ? PathExpression.EmptyMatchResult : new DocumentObject[] { source };\r\n\t\t}\r\n\r\n\t\tprivate static string GetLiteralValue(object operand) {\r\n\t\t\treturn operand switch {\r\n\t\t\t\tnull => String.Empty,\r\n\t\t\t\tstring t => t,\r\n\t\t\t\tDocumentObject o => o.FriendlyValue ?? o.LiteralValue,\r\n\t\t\t\tIList<DocumentObject> l when l.Count > 0 => l[0].FriendlyValue ?? l[0].LiteralValue,\r\n\t\t\t\tIList<DocumentObject> l => String.Empty,\r\n\t\t\t\t_ => ((double)operand).ToText()\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tstatic readonly SelfAxis __Self = new SelfAxis();\r\n\t\tstatic readonly ParentAxis __Parent = new ParentAxis();\r\n\t\tstatic readonly ChildrenAxis __Children = new ChildrenAxis();\r\n\t\tstatic readonly RootAxis __Root = new RootAxis();\r\n\t\tstatic readonly AncestorsAxis __Ancestors = new AncestorsAxis();\r\n\t\tstatic readonly DescendantsAxis __Descendants = new DescendantsAxis();\r\n\r\n\t\tsealed class SelfAxis : IPathAxis\r\n\t\t{\r\n\t\t\t#region IPathAxis 成员\r\n\r\n\t\t\tpublic PathAxisType Type => PathAxisType.None;\r\n\r\n\t\t\tpublic DocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\treturn source != null && MatchesPredicate(source, name, predicates) ? source : null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\treturn CompriseSingleObjectCollection(SelectObject(source, name, predicates));\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class ParentAxis : IPathAxis\r\n\t\t{\r\n\t\t\t#region IPathAxis 成员\r\n\r\n\t\t\tpublic PathAxisType Type => PathAxisType.Parent;\r\n\r\n\t\t\tpublic DocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\treturn source != null && MatchesPredicate(source, name, predicates) ? source.Parent : null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\treturn CompriseSingleObjectCollection(SelectObject(source, name, predicates));\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class ChildrenAxis : IPathAxis\r\n\t\t{\r\n\t\t\t#region IPathAxis 成员\r\n\r\n\t\t\tpublic PathAxisType Type => PathAxisType.Children;\r\n\r\n\t\t\tpublic DocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source == null || !source.HasChildren) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar r = new List<DocumentObject>();\r\n\t\t\t\tforeach (var item in source.Children) {\r\n\t\t\t\t\tif (MatchesPredicate(item, name, predicates)) {\r\n\t\t\t\t\t\treturn item;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source != null && source.HasChildren) {\r\n\t\t\t\t\tvar r = new List<DocumentObject>();\r\n\t\t\t\t\tforeach (var item in source.Children) {\r\n\t\t\t\t\t\tif (MatchesPredicate(item, name, predicates)) {\r\n\t\t\t\t\t\t\tr.Add(item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn r.ToArray();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn PathExpression.EmptyMatchResult;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class RootAxis : IPathAxis\r\n\t\t{\r\n\t\t\t#region IPathAxis 成员\r\n\r\n\t\t\tpublic PathAxisType Type => PathAxisType.Root;\r\n\r\n\t\t\tpublic DocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\twhile (source.Parent != null) {\r\n\t\t\t\t\tsource = source.Parent;\r\n\t\t\t\t}\r\n\t\t\t\tif (MatchesPredicate(source, name, predicates)) {\r\n\t\t\t\t\treturn source;\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\treturn CompriseSingleObjectCollection(SelectObject(source, name, predicates));\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class AncestorsAxis : IPathAxis\r\n\t\t{\r\n\t\t\t#region IPathAxis 成员\r\n\r\n\t\t\tpublic PathAxisType Type => PathAxisType.Ancestors;\r\n\r\n\t\t\tpublic DocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tvar r = new List<DocumentObject>();\r\n\t\t\t\twhile (source.Parent != null) {\r\n\t\t\t\t\tsource = source.Parent;\r\n\t\t\t\t\tif (MatchesPredicate(source, name, predicates)) {\r\n\t\t\t\t\t\treturn source;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source == null) {\r\n\t\t\t\t\treturn PathExpression.EmptyMatchResult;\r\n\t\t\t\t}\r\n\t\t\t\tvar r = new List<DocumentObject>();\r\n\t\t\t\twhile (source.Parent != null) {\r\n\t\t\t\t\tsource = source.Parent;\r\n\t\t\t\t\tif (MatchesPredicate(source, name, predicates)) {\r\n\t\t\t\t\t\tr.Add(source);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn r.ToArray();\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class DescendantsAxis : IPathAxis\r\n\t\t{\r\n\t\t\tvoid SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates, List<DocumentObject> list) {\r\n\t\t\t\tif (source == null || source.HasChildren == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var item in source.Children) {\r\n\t\t\t\t\tif (MatchesPredicate(item, name, predicates)) {\r\n\t\t\t\t\t\tlist.Add(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tSelectObjects(item, name, predicates, list);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t#region IPathAxis 成员\r\n\r\n\t\t\tpublic PathAxisType Type => PathAxisType.Descendants;\r\n\r\n\t\t\tpublic DocumentObject SelectObject(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source == null || source.HasChildren == false) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var item in source.Children) {\r\n\t\t\t\t\tif (MatchesPredicate(item, name, predicates)) {\r\n\t\t\t\t\t\treturn item;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tDocumentObject o;\r\n\t\t\t\t\tif ((o = SelectObject(item, name, predicates)) != null) {\r\n\t\t\t\t\t\treturn o;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<DocumentObject> SelectObjects(DocumentObject source, string name, IEnumerable<IPathPredicate> predicates) {\r\n\t\t\t\tif (source == null || source.HasChildren == false) {\r\n\t\t\t\t\treturn PathExpression.EmptyMatchResult;\r\n\t\t\t\t}\r\n\t\t\t\tvar r = new List<DocumentObject>();\r\n\t\t\t\tforeach (var item in source.Children) {\r\n\t\t\t\t\tif (MatchesPredicate(item, name, predicates)) {\r\n\t\t\t\t\t\tr.Add(item);\r\n\t\t\t\t\t\tSelectObjects(item, name, predicates, r);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn r.ToArray();\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tpublic static IPathAxis Create(PathAxisType axisType) {\r\n\t\t\tswitch (axisType) {\r\n\t\t\t\tcase PathAxisType.None: return __Self;\r\n\t\t\t\tcase PathAxisType.Children: return __Children;\r\n\t\t\t\tcase PathAxisType.Parent: return __Parent;\r\n\t\t\t\tcase PathAxisType.Ancestors: return __Ancestors;\r\n\t\t\t\tcase PathAxisType.Descendants: return __Descendants;\r\n\t\t\t\tcase PathAxisType.Root: return __Root;\r\n\t\t\t\tcase PathAxisType.Previous:\r\n\t\t\t\tcase PathAxisType.Next:\r\n\t\t\t\tdefault: break;\r\n\t\t\t}\r\n\t\t\treturn __Children;\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/PathAxisType.cs",
    "content": "﻿namespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic enum PathAxisType\r\n\t{\r\n\t\tNone,\r\n\t\tChildren,\r\n\t\tParent,\r\n\t\tAncestors,\r\n\t\tDescendants,\r\n\t\tRoot,\r\n\t\tPrevious,\r\n\t\tNext\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/PathCompiler.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tstatic class PathCompiler\r\n\t{\r\n\t\tconst char PathSeparator = '/';\r\n\t\tconst char SelfChar = '.';\r\n\t\tconst char UniversalName = '*';\r\n\t\tconst char StartPredicate = '[';\r\n\t\tconst char EndPredicate = ']';\r\n\r\n\t\tstatic readonly char[] __PredicateChars = new char[] { StartPredicate, EndPredicate };\r\n\r\n\t\tsealed class Context\r\n\t\t{\r\n\t\t\tinternal bool CanBeRoot { get; set; }\r\n\t\t\tinternal PathAxisType Axis { get; set; }\r\n\t\t}\r\n\r\n\t\tpublic static IEnumerable<IPathExpression> Compile(string path) {\r\n\t\t\tvar r = new Queue<IPathExpression>();\r\n\t\t\tif (String.IsNullOrEmpty(path)) {\r\n\t\t\t\treturn r.ToArray();\r\n\t\t\t}\r\n\t\t\tvar l = path.Length;\r\n\t\t\tvar i = 0;\r\n\t\t\tstring n;\r\n\t\t\tvar ctx = new Context();\r\n\t\t\twhile (i < l) {\r\n\t\t\t\tctx.Axis = ExtractAxis(path, l, ctx.CanBeRoot, ref i);\r\n\t\t\t\tif (ctx.Axis == PathAxisType.Root) {\r\n\t\t\t\t\tctx.CanBeRoot = false;\r\n\t\t\t\t\tr.Enqueue(new PathExpression(ctx.Axis));\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tn = ExtractName(path, l, ref i);\r\n\t\t\t\tr.Enqueue(new PathExpression(ctx.Axis, n));\r\n\t\t\t}\r\n\t\t\treturn r.ToArray();\r\n\t\t}\r\n\r\n\t\tprivate static PathAxisType ExtractAxis(string path, int length, bool canBeRoot, ref int index) {\r\n\t\t\tchar c = path[index];\r\n\t\t\tif (__PredicateChars.Contains(c)) {\r\n\t\t\t\tthrow new FormatException(\"“[]”筛选表达式前缺少节点轴及节点名称标识。\");\r\n\t\t\t}\r\n\r\n\t\t\tif (c == PathSeparator) {\r\n\t\t\t\tif (MatchNextChar(path, length, index, PathSeparator)) {\r\n\t\t\t\t\t++index;\r\n\t\t\t\t\treturn PathAxisType.Descendants;\r\n\t\t\t\t}\r\n\t\t\t\telse if (canBeRoot) {\r\n\t\t\t\t\treturn PathAxisType.Root;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn PathAxisType.Children;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (c == SelfChar) {\r\n\t\t\t\tif (MatchNextChar(path, length, index, SelfChar)) {\r\n\t\t\t\t\t++index;\r\n\t\t\t\t\treturn PathAxisType.Parent;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn PathAxisType.None;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn PathAxisType.Children;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static string ExtractName(string path, int length, ref int index) {\r\n\t\t\tchar c = path[index];\r\n\t\t\tif (__PredicateChars.Contains(c)) {\r\n\t\t\t\tthrow new FormatException(\"“[]”筛选表达式前缺少节点名称。\");\r\n\t\t\t}\r\n\t\t\tif (c == UniversalName) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar n = new List<char>();\r\n\t\t\twhile (Char.IsLetter(c) || n.Count > 0 && Char.IsLetterOrDigit(c)) {\r\n\t\t\t\tn.Add(c);\r\n\t\t\t\t++index;\r\n\t\t\t\tif (index < length) {\r\n\t\t\t\t\tc = path[index];\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn n.Count > 0 ? new String(n.ToArray()) : null;\r\n\t\t}\r\n\r\n\t\tprivate static bool MatchNextChar(string path, int length, int index, char ch) {\r\n\t\t\treturn index + 1 < length && path[index + 1] == ch;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/PathValue.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic static class PathValue\r\n\t{\r\n\t\tpublic static double ToNumber(DocumentObject source, IPathValue value) {\r\n\t\t\tdouble d;\r\n\t\t\tswitch (value.ValueType) {\r\n\t\t\t\tcase PathValueType.Expression:\r\n\t\t\t\t\tvar p = (value as IPathExpression).SelectObject(source);\r\n\t\t\t\t\tif (p == null) {\r\n\t\t\t\t\t\treturn Double.NaN;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn Double.TryParse(p.FriendlyValue ?? p.LiteralValue, out d) ? d : Double.NaN;\r\n\t\t\t\tcase PathValueType.String:\r\n\t\t\t\t\treturn Double.TryParse((value as PathStringValue).Value, out d) ? d : Double.NaN;\r\n\t\t\t\tcase PathValueType.Number:\r\n\t\t\t\t\treturn (value as PathNumberValue).Value;\r\n\t\t\t\tcase PathValueType.Boolean:\r\n\t\t\t\t\treturn (value as PathBooleanValue).Value ? 1 : 0;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn Double.NaN;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static string ToString(DocumentObject source, IPathValue value) {\r\n\t\t\tswitch (value.ValueType) {\r\n\t\t\t\tcase PathValueType.Expression:\r\n\t\t\t\t\tvar p = (value as IPathExpression).SelectObject(source);\r\n\t\t\t\t\tif (p == null) {\r\n\t\t\t\t\t\treturn String.Empty;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn p.FriendlyValue ?? p.LiteralValue ?? String.Empty;\r\n\t\t\t\tcase PathValueType.String:\r\n\t\t\t\t\treturn (value as PathStringValue).Value;\r\n\t\t\t\tcase PathValueType.Number:\r\n\t\t\t\t\treturn (value as PathNumberValue).Value.ToText();\r\n\t\t\t\tcase PathValueType.Boolean:\r\n\t\t\t\t\treturn (value as PathBooleanValue).ToString();\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static bool ToBoolean(DocumentObject source, IPathValue value) {\r\n\t\t\treturn value.ValueType switch {\r\n\t\t\t\tPathValueType.Expression => ((IPathExpression)value).SelectObject(source) != null,\r\n\t\t\t\tPathValueType.String => ((PathStringValue)value).Value.Length > 0,\r\n\t\t\t\tPathValueType.Number => ((PathNumberValue)value).Value != 0,\r\n\t\t\t\tPathValueType.Boolean => ((PathBooleanValue)value).Value,\r\n\t\t\t\t_ => false,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tsealed class PathStringValue(string value) : IConstantPathValue\r\n\t\t{\r\n\t\t\tpublic PathValueType ValueType => PathValueType.String;\r\n\r\n\t\t\tpublic string Value { get; } = value;\r\n\r\n\t\t\tpublic string LiteralValue => Value;\r\n\t\t}\r\n\r\n\t\tsealed class PathNumberValue(double value) : IConstantPathValue\r\n\t\t{\r\n\t\t\tpublic PathValueType ValueType => PathValueType.Number;\r\n\r\n\t\t\tpublic double Value { get; } = value;\r\n\r\n\t\t\tpublic string LiteralValue => Value.ToText();\r\n\t\t}\r\n\r\n\t\tsealed class PathBooleanValue(bool value) : IConstantPathValue\r\n\t\t{\r\n\t\t\tpublic PathValueType ValueType => PathValueType.Boolean;\r\n\r\n\t\t\tpublic bool Value { get; } = value;\r\n\r\n\t\t\tpublic string LiteralValue => Value.ToString();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/PathValueType.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic enum PathValueType\r\n\t{\r\n\t\tExpression,\r\n\t\tString,\r\n\t\tNumber,\r\n\t\tBoolean\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPath/PredicateOperatorType.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Model.PdfPath\r\n{\r\n\tpublic enum PredicateOperatorType\r\n\t{\r\n\t\tContains,\r\n\t\tEqual,\r\n\t\tNotEqual,\r\n\t\tLessThan,\r\n\t\tLargerThan\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfPathDocument.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Processor;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tsealed class PdfPathDocument : IHierarchicalObject<DocumentObject>\r\n\t{\r\n\t\tconst int pageGroupNumber = 100;\r\n\t\treadonly PdfReader _pdf;\r\n\t\treadonly DocumentObject[] _rootObjects;\r\n\t\treadonly DocumentObject _trailer;\r\n\t\treadonly DocumentObject _hiddenObjects;\r\n\t\treadonly Dictionary<int, int> _pageMapper;\r\n\r\n\t\tpublic PdfPathDocument(string pdfPath) {\r\n\t\t\t_pdf = PdfHelper.OpenPdfFile(pdfPath, AppContext.LoadPartialPdfFile, false);\r\n\t\t\t_pageMapper = _pdf.GetPageRefMapper();\r\n\t\t\t_trailer = new DocumentObject(this, null, \"Trailer\", _pdf.Trailer, PdfObjectType.Trailer) {\r\n\t\t\t\tIsKeyObject = true,\r\n\t\t\t\tDescription = \"文档根节点\",\r\n\t\t\t\tFriendlyValue = System.IO.Path.GetFileNameWithoutExtension(pdfPath)\r\n\t\t\t};\r\n\t\t\t_hiddenObjects = new DocumentObject(this, null, \"隐藏对象\", null, PdfObjectType.Hidden);\r\n\t\t\tvar l = _pdf.NumberOfPages;\r\n\t\t\tif (l > 301) {\r\n\t\t\t\tvar c = new DocumentObject[1 + (l + pageGroupNumber - 1) / pageGroupNumber + 1];\r\n\t\t\t\tc[0] = _trailer;\r\n\t\t\t\tfor (int i = 1; i < c.Length - 1; i++) {\r\n\t\t\t\t\tvar a = (i - 1) * pageGroupNumber + 1;\r\n\t\t\t\t\tvar b = Math.Min(l, i * pageGroupNumber);\r\n\t\t\t\t\tc[i] = new DocumentObject(this, null, \"Pages\", null, PdfObjectType.Pages) { IsKeyObject = true, ExtensiveObject = $\"{a}-{b}\", FriendlyValue = $\"第 {a} 至 {b} 页，共 {l} 页\" };\r\n\t\t\t\t}\r\n\t\t\t\tc[c.Length - 1] = _hiddenObjects;\r\n\t\t\t\t_rootObjects = c;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_rootObjects = [\r\n\t\t\t\t\t_trailer,\r\n\t\t\t\t\tnew DocumentObject (this, null, \"Pages\", null, PdfObjectType.Pages) { IsKeyObject = true, FriendlyValue = \"共 \" + l + \" 页\" },\r\n\t\t\t\t\t_hiddenObjects\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic PdfReader Document => _pdf;\r\n\r\n\t\tpublic DocumentObject Trailer => _trailer;\r\n\r\n\t\tpublic int PageCount => _pdf.NumberOfPages;\r\n\r\n\t\tpublic void Close() {\r\n\t\t\t_pdf.Close();\r\n\t\t}\r\n\r\n\t\tpublic int GetPageNumber(PdfIndirectReference pdfRef) {\r\n\t\t\t_pageMapper.TryGetValue(pdfRef.Number, out int page);\r\n\t\t\treturn page;\r\n\t\t}\r\n\r\n\t\t#region IHierarchicalObject<DocumentObject> 成员\r\n\r\n\t\tbool IHierarchicalObject<DocumentObject>.HasChildren => true;\r\n\r\n\t\tICollection<DocumentObject> IHierarchicalObject<DocumentObject>.Children {\r\n\t\t\tget {\r\n\t\t\t\tvar c = new DocumentObject[_rootObjects.Length];\r\n\t\t\t\tArray.Copy(_rootObjects, c, _rootObjects.Length);\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/PdfStructInfo.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\treadonly struct PdfStructInfo(string name, bool isKeyObject, bool isRequired, string description, string imageKey)\r\n\t{\r\n\t\tstatic readonly Dictionary<string, PdfStructInfo> _Info = InitStructInfo();\r\n\r\n\t\tpublic string Name { get; } = name;\r\n\t\tpublic bool IsKeyObject { get; } = isKeyObject;\r\n\t\tpublic bool IsRequired { get; } = isRequired;\r\n\t\tpublic string Description { get; } = description;\r\n\t\tpublic string ImageKey { get; } = imageKey;\r\n\r\n\t\tpublic PdfStructInfo(string name, bool isKeyObject) : this(name, isKeyObject, false, null, null) {\r\n\t\t}\r\n\r\n\t\tinternal static PdfStructInfo GetInfo(string context, string name) {\r\n\t\t\tPdfStructInfo i;\r\n\t\t\tif (!_Info.TryGetValue($\"{context}/{name}\", out i)) {\r\n\t\t\t\t_Info.TryGetValue(name, out i);\r\n\t\t\t}\r\n\t\t\treturn i;\r\n\t\t}\r\n\r\n\t\tstatic Dictionary<string, PdfStructInfo> InitStructInfo() {\r\n\t\t\tvar d = new Dictionary<string, PdfStructInfo>();\r\n\t\t\tusing (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(\"PDFPatcher.Model.PDFStructInfo.xml\")) {\r\n\t\t\t\tvar doc = new XmlDocument();\r\n\t\t\t\tdoc.Load(s);\r\n\t\t\t\tAddSubItems(d, doc.GetElement(\"PDF\").GetElement(\"Global\"));\r\n\t\t\t\tAddSubItems(d, doc.GetElement(\"PDF\"));\r\n\t\t\t}\r\n\t\t\treturn d;\r\n\t\t}\r\n\r\n\t\tstatic void AddSubItems(Dictionary<string, PdfStructInfo> d, XmlElement element) {\r\n\t\t\tif (element.HasChildNodes == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar currentToken = element.GetAttribute(\"Token\");\r\n\t\t\tforeach (XmlNode item in element.ChildNodes) {\r\n\t\t\t\tif (item is not XmlElement e) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar t = e.GetAttribute(\"Token\");\r\n\t\t\t\tif (String.IsNullOrEmpty(t)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.Name == \"Info\") {\r\n\t\t\t\t\tAddItem(d, String.IsNullOrEmpty(currentToken) ? t : $\"{currentToken}/{t}\", new PdfStructInfo(e.GetAttribute(\"Name\"), e.HasChildNodes, e.GetAttribute(\"Required\") == \"true\", e.GetAttribute(\"Description\"), e.GetAttribute(\"ImageKey\")));\r\n\t\t\t\t\tAddSubItems(d, e);\r\n\t\t\t\t}\r\n\t\t\t\telse if (e.Name == \"RefInfo\" && d.TryGetValue(t, out var s)) {\r\n\t\t\t\t\tAddItem(d, String.IsNullOrEmpty(currentToken) ? t : $\"{currentToken}/{t}\", s);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void AddItem(Dictionary<string, PdfStructInfo> d, string key, PdfStructInfo item) {\r\n\t\t\tif (d.ContainsKey(key)) {\r\n\t\t\t\tSystem.Diagnostics.Debug.WriteLine(\"已添加 \" + key);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\td.Add(key, item);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/ResourceReference.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\treadonly struct ResourceReference(PdfIndirectReference resourceRef, PdfName name, PdfDictionary resource)\r\n\t{\r\n\t\tpublic PdfIndirectReference Ref { get; } = resourceRef;\r\n\t\tpublic PdfName Name { get; } = name;\r\n\t\tpublic PdfDictionary Resource { get; } = resource;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/SourceItem.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic abstract class SourceItem\r\n\t{\r\n\t\tList<SourceItem> _Items;\r\n\r\n\t\tpublic FilePath FilePath { get; }\r\n\t\tpublic string FileName { get; }\r\n\t\tpublic string FolderName { get; }\r\n\t\tpublic BookmarkSettings Bookmark { get; set; }\r\n\t\tpublic int PageCount { get; private set; }\r\n\t\tpublic abstract int FileSize { get; }\r\n\t\tpublic abstract DateTime FileTime { get; }\r\n\t\tpublic List<SourceItem> Items => _Items ??= [];\r\n\r\n\t\tpublic bool HasSubItems => _Items.HasContent();\r\n\t\tpublic virtual bool HasContent => _Items?.Any(i => i.HasContent) == true;\r\n\r\n\t\tpublic abstract ItemType Type { get; }\r\n\t\tpublic static void SortFileList(string[] fileList) {\r\n\t\t\tif (AppContext.Merger.CajSort && CajSort(fileList)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (AppContext.Merger.NumericAwareSort) {\r\n\t\t\t\tArray.Sort(fileList, FileHelper.NumericAwareComparePath);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tArray.Sort(fileList, StringComparer.OrdinalIgnoreCase);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void SortItems(SortType options, bool recursive) {\r\n\t\t\tif (_Items.HasContent() == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (options) {\r\n\t\t\t\tcase SortType.Literal:\r\n\t\t\t\t\t_Items.Sort((x, y) => String.Compare(x.FilePath, y.FilePath, StringComparison.OrdinalIgnoreCase));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SortType.NumericAwareSort:\r\n\t\t\t\t\t_Items.Sort((x, y) => FileHelper.NumericAwareComparePath(x.FilePath, y.FilePath));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SortType.CajSort:\r\n\t\t\t\t\tif (CajSort(_Items) == false) {\r\n\t\t\t\t\t\tgoto case SortType.NumericAwareSort;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SortType.FileTime:\r\n\t\t\t\t\t_Items.Sort((x, y) => x.FileTime.CompareTo(y.FileTime));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SortType.Reverse:\r\n\t\t\t\t\t_Items.Reverse();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (recursive == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in _Items) {\r\n\t\t\t\tif (item._Items.HasContent()) {\r\n\t\t\t\t\titem.SortItems(options, recursive);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic abstract SourceItem Clone();\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn FilePath.ToString();\r\n\t\t}\r\n\r\n\t\tpublic enum ItemType\r\n\t\t{\r\n\t\t\tEmpty, Pdf, Image, Folder\r\n\t\t}\r\n\t\tpublic enum SortType {\r\n\t\t\tUndefined,\r\n\t\t\tLiteral,\r\n\t\t\tNumericAwareSort,\r\n\t\t\tCajSort,\r\n\t\t\tFileTime,\r\n\t\t\tReverse\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 创建新的空白页。\r\n\t\t/// </summary>\r\n\t\t/// <returns>空白页实例。</returns>\r\n\t\tinternal static Empty Create() {\r\n\t\t\treturn new Empty();\r\n\t\t}\r\n\r\n\t\tinternal static SourceItem Create(string path) {\r\n\t\t\treturn Create(path, true);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 根据传入的文件路径创建 <see cref=\"SourceItem\"/> 实例。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"path\">文件或文件夹路径。</param>\r\n\t\t/// <param name=\"refresh\">是否强制更新。</param>\r\n\t\t/// <returns><see cref=\"SourceItem\"/> 实例。</returns>\r\n\t\tinternal static SourceItem Create(FilePath path, bool refresh) {\r\n\t\t\tif (((string)path).IsNullOrWhiteSpace()) {\r\n\t\t\t\treturn Create();\r\n\t\t\t}\r\n\t\t\tif (path.ExistsDirectory) {\r\n\t\t\t\treturn new Folder(path.ToString(), refresh);\r\n\t\t\t}\r\n\t\t\tif (path.HasExtension(Constants.FileExtensions.Pdf)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar reader = Processor.PdfHelper.OpenPdfFile(path.ToString(), true, false);\r\n\t\t\t\t\tvar c = reader.NumberOfPages;\r\n\t\t\t\t\tstring r = refresh ? new PageRange(1, c).ToString() : null;\r\n\t\t\t\t\tvar info = Processor.DocInfoExporter.RewriteDocInfoWithEncoding(reader, AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t\t\treader.Close();\r\n\t\t\t\t\treturn new Pdf(path, r, c, info);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (FileNotFoundException) {\r\n\t\t\t\t\tFormHelper.ErrorBox($\"找不到文件：“{path}”。\");\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\tFormHelper.ErrorBox($\"打开 PDF 文件“{path}”时出错。\");\r\n\t\t\t\t\t// ignore corrupted \r\n\t\t\t\t}\r\n\t\t\t\treturn Create();\r\n\t\t\t}\r\n\t\t\tif (path.HasExtension(Constants.FileExtensions.AllSupportedImageExtension)) {\r\n\t\t\t\treturn new Image(path);\r\n\t\t\t}\r\n\t\t\tFormHelper.ErrorBox($\"不支持文件“{path}”。\");\r\n\t\t\treturn Create();\r\n\t\t}\r\n\r\n\t\tinternal string GetInfoFileName() {\r\n\t\t\t// 优先采用与输入文件同名的 XML 信息文件\r\n\t\t\tvar f = new FilePath(FileHelper.CombinePath(FolderName, Path.ChangeExtension(FileName, Constants.FileExtensions.Xml)));\r\n\t\t\tif (f.ExistsFile == false) {\r\n\t\t\t\t// 次之采用与输入文件同名的 TXT 信息文件\r\n\t\t\t\tf = f.ChangeExtension(Constants.FileExtensions.Txt);\r\n\t\t\t\tif (f.ExistsFile == false) {\r\n\t\t\t\t\t// 次之采用同一个信息文件\r\n\t\t\t\t\tf = FilePath.ChangeExtension(Constants.FileExtensions.Xml);\r\n\t\t\t\t\tif (f.ExistsFile == false) {\r\n\t\t\t\t\t\tf = FilePath.Empty;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn f.ToString();\r\n\t\t}\r\n\r\n\t\tinternal string GetTargetPdfFileName(string targetPath) {\r\n\t\t\treturn FileHelper.HasFileNameMacro(targetPath)\r\n\t\t\t\t? targetPath\r\n\t\t\t\t: FileHelper.CombinePath(Path.GetDirectoryName(targetPath), FilePath.FileName);\r\n\t\t}\r\n\r\n\t\tinternal sealed class Empty : SourceItem\r\n\t\t{\r\n\t\t\treadonly DateTime _Time = DateTime.Now;\r\n\r\n\t\t\tpublic override ItemType Type => ItemType.Empty;\r\n\r\n\t\t\tpublic override int FileSize => 0;\r\n\t\t\tpublic override DateTime FileTime => _Time;\r\n\r\n\t\t\tpublic void SetPageCount(int pageCount) {\r\n\t\t\t\tPageCount = pageCount;\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string ToString() {\r\n\t\t\t\treturn \"<空白页>\";\r\n\t\t\t}\r\n\r\n\t\t\tpublic override SourceItem Clone() {\r\n\t\t\t\tvar n = new Empty();\r\n\t\t\t\tCopyProperties(n);\r\n\t\t\t\treturn n;\r\n\t\t\t}\r\n\r\n\t\t\tinternal Empty() : base(null, 1) { }\r\n\t\t\tinternal Empty(int pageCount) : base(null, pageCount) { }\r\n\t\t}\r\n\r\n\t\tinternal sealed class CropOptions\r\n\t\t{\r\n\t\t\tpublic int Left { get; set; }\r\n\t\t\tpublic int Right { get; set; }\r\n\t\t\tpublic int Top { get; set; }\r\n\t\t\tpublic int Bottom { get; set; }\r\n\t\t\tpublic int MinHeight { get; set; }\r\n\t\t\tpublic int MinWidth { get; set; }\r\n\r\n\t\t\tpublic bool NeedCropping => Left > 0 || Right > 0 || Top > 0 || Bottom > 0;\r\n\r\n\t\t\tpublic bool Equals(CropOptions i) {\r\n\t\t\t\treturn Top == i.Top && Bottom == i.Bottom && Left == i.Left && Right == i.Right &&\r\n\t\t\t\t\tMinHeight == i.MinHeight && MinWidth == i.MinWidth;\r\n\t\t\t}\r\n\t\t\tpublic CropOptions Clone() {\r\n\t\t\t\treturn (CropOptions)MemberwiseClone();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal sealed class Image : SourceItem\r\n\t\t{\r\n\t\t\treadonly int _FileSize = -1;\r\n\t\t\treadonly DateTime _FileTime;\r\n\r\n\t\t\tpublic Image(FilePath path)\r\n\t\t\t\t: base(path, 0) {\r\n\t\t\t\tCropping = new CropOptions();\r\n\t\t\t\tGetFileInfo(path, out _FileSize, out _FileTime);\r\n\t\t\t}\r\n\r\n\t\t\tpublic CropOptions Cropping { get; set; }\r\n\t\t\tpublic override ItemType Type => ItemType.Image;\r\n\t\t\tpublic override int FileSize => _FileSize;\r\n\t\t\tpublic override DateTime FileTime => _FileTime;\r\n\t\t\tpublic override bool HasContent => true;\r\n\r\n\t\t\tpublic override SourceItem Clone() {\r\n\t\t\t\treturn new Image(FilePath) {\r\n\t\t\t\t\tCropping = Cropping.Clone()\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal sealed class Pdf : SourceItem\r\n\t\t{\r\n\t\t\tint _FileSize = -1;\r\n\t\t\tDateTime _FileTime;\r\n\r\n\t\t\tpublic Pdf(FilePath path, string pageRanges, int pageCount, Model.GeneralInfo docInfo)\r\n\t\t\t\t: base(path, pageCount) {\r\n\t\t\t\tPageRanges = pageRanges;\r\n\t\t\t\tDocInfo = docInfo;\r\n\t\t\t\tExtractImageOptions = new ImageExtracterOptions() {\r\n\t\t\t\t\tOutputPath = Path.GetDirectoryName(path.ToString()),\r\n\t\t\t\t\tExtractAnnotationImages = false,\r\n\t\t\t\t\tMergeJpgToPng = true,\r\n\t\t\t\t\tMergeImages = true,\r\n\t\t\t\t\tMinWidth = 50,\r\n\t\t\t\t\tMinHeight = 50\r\n\t\t\t\t};\r\n\t\t\t\tGetFileInfo(path, out _FileSize, out _FileTime);\r\n\t\t\t}\r\n\r\n\t\t\tpublic Pdf(FilePath path) : base(path, 0) {\r\n\t\t\t\tRefresh(path.ToString(), AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t}\r\n\r\n\t\t\tpublic string PageRanges { get; set; }\r\n\t\t\tpublic bool ImportImagesOnly { get; set; }\r\n\t\t\tpublic ImageExtracterOptions ExtractImageOptions { get; private set; }\r\n\t\t\tpublic Model.GeneralInfo DocInfo { get; private set; }\r\n\t\t\tpublic override ItemType Type => ItemType.Pdf;\r\n\t\t\tpublic override int FileSize => _FileSize;\r\n\t\t\tpublic override DateTime FileTime => _FileTime;\r\n\t\t\tpublic override bool HasContent => true;\r\n\r\n\t\t\tpublic void Refresh(Encoding encoding) {\r\n\t\t\t\tRefresh(FilePath.ToString(), encoding);\r\n\t\t\t}\r\n\r\n\t\t\tpublic override string ToString() {\r\n\t\t\t\treturn FilePath.IsEmpty ? String.Empty :\r\n\t\t\t\t\tString.IsNullOrEmpty(PageRanges) ? (string)FilePath :\r\n\t\t\t\t\tString.Concat(FilePath, \"::\", PageRanges);\r\n\t\t\t}\r\n\r\n\t\t\tpublic override SourceItem Clone() {\r\n\t\t\t\tvar n = new Pdf(FilePath, PageRanges, PageCount, DocInfo) {\r\n\t\t\t\t\tImportImagesOnly = ImportImagesOnly\r\n\t\t\t\t};\r\n\t\t\t\tCopyProperties(n);\r\n\t\t\t\treturn n;\r\n\t\t\t}\r\n\r\n\t\t\tprivate void Refresh(string path, Encoding encoding) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tGetFileInfo(path, out _FileSize, out _FileTime);\r\n\t\t\t\t\tif (_FileSize > 0) {\r\n\t\t\t\t\t\tusing (var reader = Processor.PdfHelper.OpenPdfFile(path, true, false)) {\r\n\t\t\t\t\t\t\tDocInfo = Processor.DocInfoExporter.RewriteDocInfoWithEncoding(reader, encoding);\r\n\t\t\t\t\t\t\tPageCount = reader.NumberOfPages;\r\n\t\t\t\t\t\t\tPageRanges = new PageRange(1, PageCount).ToString();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tAppContext.MainForm.ErrorBox($\"打开 PDF 文件“{path}”时出错\", ex);\r\n\t\t\t\t\t// ignore corrupted \r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal sealed class Folder : SourceItem\r\n\t\t{\r\n\t\t\treadonly DateTime _FolderTime;\r\n\r\n\t\t\tpublic Folder(string path) : base(path, 0) {\r\n\t\t\t\tvar p = new FilePath(path);\r\n\t\t\t\tif (p.ExistsDirectory) {\r\n\t\t\t\t\t_FolderTime = p.ToDirectoryInfo().LastWriteTime;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpublic Folder(string path, bool loadSubItems)\r\n\t\t\t\t: this(path) {\r\n\t\t\t\tif (loadSubItems) {\r\n\t\t\t\t\tReload();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override ItemType Type => ItemType.Folder;\r\n\r\n\t\t\tpublic override int FileSize => 0;\r\n\t\t\tpublic override DateTime FileTime => _FolderTime;\r\n\r\n\t\t\tpublic void Reload() {\r\n\t\t\t\tItems.Clear();\r\n\t\t\t\tif (!FilePath.ExistsDirectory) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar p = FilePath.ToString();\r\n\t\t\t\tvar l = Items;\r\n\t\t\t\tswitch (AppContext.Merger.SubFolder) {\r\n\t\t\t\t\tcase MergerOptions.SubFolderPosition.BeforeFiles:\r\n\t\t\t\t\t\tAddSubDirectories(p, l);\r\n\t\t\t\t\t\tAddFiles(p, l);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase MergerOptions.SubFolderPosition.WithFiles:\r\n\t\t\t\t\t\tAddSubDirectoriesAndFiles(p, l);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase MergerOptions.SubFolderPosition.Exclude:\r\n\t\t\t\t\t\tAddFiles(p, l);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic override SourceItem Clone() {\r\n\t\t\t\tvar n = new Folder(FilePath.ToString());\r\n\t\t\t\tCopyProperties(n);\r\n\t\t\t\treturn n;\r\n\t\t\t}\r\n\r\n\t\t\tstatic void AddSubDirectoriesAndFiles(string folderPath, List<SourceItem> list) {\r\n\t\t\t\tvar fl = Array.FindAll(Directory.GetFiles(folderPath), (i) => {\r\n\t\t\t\t\tvar ext = Path.GetExtension(i).ToLowerInvariant();\r\n\t\t\t\t\treturn Constants.FileExtensions.Pdf == ext\r\n\t\t\t\t\t\t|| Constants.FileExtensions.AllSupportedImageExtension.Contains(ext);\r\n\t\t\t\t});\r\n\t\t\t\tvar d = Array.ConvertAll(Directory.GetDirectories(folderPath), (i) => i + \"\\\\\");\r\n\t\t\t\tvar s = new string[fl.Length + d.Length];\r\n\t\t\t\tArray.Copy(fl, s, fl.Length);\r\n\t\t\t\tArray.Copy(d, 0, s, fl.Length, d.Length);\r\n\t\t\t\tSortFileList(s);\r\n\t\t\t\tforeach (var item in s) {\r\n\t\t\t\t\tif (item[item.Length - 1] == '\\\\') {\r\n\t\t\t\t\t\tlist.Add(new Folder(item.Substring(0, item.Length - 1), true));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tlist.Add(Create(item));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tstatic void AddFiles(string folderPath, List<SourceItem> list) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar fl = Directory.GetFiles(folderPath);\r\n\t\t\t\t\tSortFileList(fl);\r\n\t\t\t\t\tforeach (var item in fl) {\r\n\t\t\t\t\t\tvar ext = Path.GetExtension(item).ToLowerInvariant();\r\n\t\t\t\t\t\tif (Constants.FileExtensions.Pdf == ext\r\n\t\t\t\t\t\t\t|| Constants.FileExtensions.AllSupportedImageExtension.Contains(ext)) {\r\n\t\t\t\t\t\t\tlist.Add(Create(item));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (UnauthorizedAccessException) { }\r\n\t\t\t\tcatch (IOException) { }\r\n\t\t\t}\r\n\r\n\t\t\tstatic void AddSubDirectories(string folderPath, List<SourceItem> list) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tforeach (var item in Directory.EnumerateDirectories(folderPath)) {\r\n\t\t\t\t\t\tvar f = new Folder(item, true);\r\n\t\t\t\t\t\tlist.Add(f);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (UnauthorizedAccessException) { }\r\n\t\t\t\tcatch (IOException) { }\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected SourceItem(FilePath path, int pageCount) {\r\n\t\t\tPageCount = pageCount;\r\n\t\t\tif (!path.IsValidPath) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tFilePath = path;\r\n\t\t\tFileName = path.FileName;\r\n\t\t\tFolderName = path.Directory;\r\n\t\t\tif (AppContext.Merger.AutoBookmarkTitle == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar t = path.ExistsDirectory ? FileName : path.FileNameWithoutExtension;\r\n\t\t\tif (t.Length > 0) {\r\n\t\t\t\tBookmark = CreateBookmarkSettings(t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected static void GetFileInfo(FilePath fileName, out int kilobytes, out DateTime fileTime) {\r\n\t\t\tif (fileName.ExistsFile == false) {\r\n\t\t\t\tkilobytes = 0;\r\n\t\t\t\tfileTime = DateTime.MinValue;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar f = fileName.ToFileInfo();\r\n\t\t\t\tkilobytes = (int)(f.Length >> 10);\r\n\t\t\t\tfileTime = f.LastWriteTime;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected virtual void CopyProperties(SourceItem target) {\r\n\t\t\ttarget._Items = new List<SourceItem>(HasSubItems ? Items.Count : 0);\r\n\t\t\tif (HasSubItems) {\r\n\t\t\t\tforeach (var item in _Items) {\r\n\t\t\t\t\ttarget._Items.Add(item.Clone());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (Bookmark != null) {\r\n\t\t\t\ttarget.Bookmark = Bookmark.Clone();\r\n\t\t\t}\r\n\t\t\ttarget.PageCount = PageCount;\r\n\t\t}\r\n\t\tstatic BookmarkSettings CreateBookmarkSettings(string t) {\r\n\t\t\tif (AppContext.Merger.CajSort && t.Length == 6) {\r\n\t\t\t\tif (MatchCajPattern(t, Constants.CajNaming.Cover)) {\r\n\t\t\t\t\treturn t.EndsWith(\"001\", StringComparison.Ordinal) ? new BookmarkSettings(\"封面\")\r\n\t\t\t\t\t\t: t.EndsWith(\"002\", StringComparison.Ordinal) ? new BookmarkSettings(\"封底\")\r\n\t\t\t\t\t\t: null; // 超过2页的，只为第一页和第二页生成书签\r\n\t\t\t\t}\r\n\t\t\t\telse if (MatchCajPattern(t, Constants.CajNaming.TitlePage)) {\r\n\t\t\t\t\treturn t.EndsWith(\"001\", StringComparison.Ordinal) ? new BookmarkSettings(\"书名\") : null;\r\n\t\t\t\t}\r\n\t\t\t\telse if (MatchCajPattern(t, Constants.CajNaming.CopyrightPage)) {\r\n\t\t\t\t\treturn t.EndsWith(\"001\", StringComparison.Ordinal) ? new BookmarkSettings(\"版权\") : null;\r\n\t\t\t\t}\r\n\t\t\t\telse if (MatchCajPattern(t, Constants.CajNaming.Foreword)) {\r\n\t\t\t\t\treturn t.EndsWith(\"001\", StringComparison.Ordinal) ? new BookmarkSettings(\"前言\") : null;\r\n\t\t\t\t}\r\n\t\t\t\telse if (MatchCajPattern(t, Constants.CajNaming.Contents)) {\r\n\t\t\t\t\treturn t.EndsWith(\"00001\", StringComparison.Ordinal) ? new BookmarkSettings(\"目录\") : null;\r\n\t\t\t\t}\r\n\t\t\t\telse if (MatchCajPattern(t, String.Empty) && t == \"000001\") {\r\n\t\t\t\t\treturn new BookmarkSettings(\"正文\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (AppContext.Merger.IgnoreLeadingNumbers) {\r\n\t\t\t\tint i;\r\n\t\t\t\tfor (i = 0; i < t.Length; i++) {\r\n\t\t\t\t\tif (t[i] > '9' || t[i] < '0') {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tt = t.Substring(i);\r\n\t\t\t}\r\n\t\t\treturn new BookmarkSettings(t);\r\n\t\t}\r\n\t\tstatic bool CajSort(string[] fileList) {\r\n\t\t\tvar m = false; // match Caj naming\r\n\t\t\tvar cov = new List<string>(1);\r\n\t\t\tvar bok = new List<string>(2);\r\n\t\t\tvar leg = new List<string>(1);\r\n\t\t\tvar fow = new List<string>(3);\r\n\t\t\tvar cnt = new List<string>(5);\r\n\t\t\tvar body = new List<string>(fileList.Length);\r\n\t\t\tforeach (var path in fileList) {\r\n\t\t\t\tvar f = Path.GetFileNameWithoutExtension(path);\r\n\t\t\t\tif (f.Length == 6) {\r\n\t\t\t\t\tif (MatchCajPatternAddPath(path, f, Constants.CajNaming.Cover, cov)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(path, f, Constants.CajNaming.TitlePage, bok)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(path, f, Constants.CajNaming.CopyrightPage, leg)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(path, f, Constants.CajNaming.Foreword, fow)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(path, f, Constants.CajNaming.Contents, cnt)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\tm = true;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbody.Add(path);\r\n\t\t\t}\r\n\t\t\tif (m == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tcov.Sort(StringComparer.OrdinalIgnoreCase);\r\n\t\t\tbok.Sort(StringComparer.OrdinalIgnoreCase);\r\n\t\t\tleg.Sort(StringComparer.OrdinalIgnoreCase);\r\n\t\t\tfow.Sort(StringComparer.OrdinalIgnoreCase);\r\n\t\t\tcnt.Sort(StringComparer.OrdinalIgnoreCase);\r\n\t\t\tbody.Sort(StringComparer.OrdinalIgnoreCase);\r\n\t\t\tint p = 0;\r\n\t\t\tif (cov.Count == 2) {\r\n\t\t\t\tfileList[0] = cov[0];\r\n\t\t\t\t++p;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tp = CopyItem(fileList, cov, p);\r\n\t\t\t}\r\n\t\t\tp = CopyItem(fileList, bok, p);\r\n\t\t\tp = CopyItem(fileList, leg, p);\r\n\t\t\tp = CopyItem(fileList, fow, p);\r\n\t\t\tp = CopyItem(fileList, cnt, p);\r\n\t\t\tp = CopyItem(fileList, body, p);\r\n\t\t\tif (cov.Count == 2) {\r\n\t\t\t\tfileList[p] = cov[1];\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tstatic int CopyItem(string[] fileList, List<string> list, int position) {\r\n\t\t\tlist.CopyTo(fileList, position);\r\n\t\t\tposition += list.Count;\r\n\t\t\treturn position;\r\n\t\t}\r\n\r\n\t\tstatic bool MatchCajPatternAddPath(string path, string text, string pattern, List<string> container) {\r\n\t\t\tif (MatchCajPattern(text, pattern)) {\r\n\t\t\t\tcontainer.Add(path);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tstatic bool CajSort(List<SourceItem> fileList) {\r\n\t\t\tvar m = false; // match Caj naming\r\n\t\t\tvar cov = new List<SourceItem>(1);\r\n\t\t\tvar bok = new List<SourceItem>(2);\r\n\t\t\tvar leg = new List<SourceItem>(1);\r\n\t\t\tvar fow = new List<SourceItem>(3);\r\n\t\t\tvar cnt = new List<SourceItem>(5);\r\n\t\t\tvar body = new List<SourceItem>(fileList.Count);\r\n\t\t\tforeach (var file in fileList) {\r\n\t\t\t\tvar path = file.FilePath;\r\n\t\t\t\tvar f = Path.GetFileNameWithoutExtension(path);\r\n\t\t\t\tif (f.Length == 6) {\r\n\t\t\t\t\tif (MatchCajPatternAddPath(file, f, Constants.CajNaming.Cover, cov)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(file, f, Constants.CajNaming.TitlePage, bok)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(file, f, Constants.CajNaming.CopyrightPage, leg)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(file, f, Constants.CajNaming.Foreword, fow)\r\n\t\t\t\t\t\t|| MatchCajPatternAddPath(file, f, Constants.CajNaming.Contents, cnt)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\tm = true;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbody.Add(file);\r\n\t\t\t}\r\n\t\t\tif (m == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tcov.Sort(CompareFilePath);\r\n\t\t\tbok.Sort(CompareFilePath);\r\n\t\t\tleg.Sort(CompareFilePath);\r\n\t\t\tfow.Sort(CompareFilePath);\r\n\t\t\tcnt.Sort(CompareFilePath);\r\n\t\t\tbody.Sort(CompareFilePath);\r\n\t\t\tfileList.Clear();\r\n\t\t\tif (cov.Count == 2) {\r\n\t\t\t\tfileList.Add(cov[0]);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfileList.AddRange(cov);\r\n\t\t\t}\r\n\t\t\tfileList.AddRange(bok);\r\n\t\t\tfileList.AddRange(leg);\r\n\t\t\tfileList.AddRange(fow);\r\n\t\t\tfileList.AddRange(cnt);\r\n\t\t\tfileList.AddRange(body);\r\n\t\t\tif (cov.Count == 2) {\r\n\t\t\t\tfileList.Add(cov[1]);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tstatic bool MatchCajPatternAddPath(SourceItem item, string text, string pattern, List<SourceItem> container) {\r\n\t\t\tif (MatchCajPattern(text, pattern)) {\r\n\t\t\t\tcontainer.Add(item);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tstatic int CompareFilePath(SourceItem x, SourceItem y) {\r\n\t\t\treturn String.Compare(x.FilePath, y.FilePath, StringComparison.OrdinalIgnoreCase);\r\n\t\t}\r\n\r\n\t\tstatic bool MatchCajPattern(string text, string pattern) {\r\n\t\t\tif (!text.HasCaseInsensitivePrefix(pattern)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tint l = pattern.Length;\r\n\t\t\tif (text.Length == l) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tforeach (var ch in text.Substring(l)) {\r\n\t\t\t\tif (ch < '0' || ch > '9') {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/TextInfo.cs",
    "content": "﻿using System.Diagnostics;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[DebuggerDisplay(\"Region={Region.Bottom},{Region.Left}; Size={Size}; Text={Text}\")]\r\n\tsealed class TextInfo : ITextRegion\r\n\t{\r\n\t\tpublic Bound Region { get; set; }\r\n\t\tpublic string Text { get; set; }\r\n\t\tpublic PdfString PdfString { get; set; }\r\n\t\tinternal float Size { get; set; }\r\n\t\tinternal FontInfo Font { get; set; }\r\n\t\tinternal System.Drawing.Color Color { get; set; }\r\n\t\tinternal float LetterWidth { get; set; }\r\n\r\n\t\tinternal static int CompareRegionX(ITextRegion a, ITextRegion b) {\r\n\t\t\tif (a == b) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\treturn CompareRegionX(a, b, true);\r\n\t\t}\r\n\t\tstatic int CompareRegionX(ITextRegion a, ITextRegion b, bool checkAlignment) {\r\n\t\t\tif (checkAlignment && a.Region.IsAlignedWith(b.Region, WritingDirection.Horizontal) == false) {\r\n\t\t\t\treturn CompareRegionY(a, b, false);\r\n\t\t\t}\r\n\t\t\tvar x1 = a.Region.Center;\r\n\t\t\tvar x2 = b.Region.Center;\r\n\t\t\treturn x1 < x2 ? -1\r\n\t\t\t\t: x1 == x2 ? 0\r\n\t\t\t\t: 1;\r\n\t\t}\r\n\r\n\t\tinternal static int CompareRegionY(ITextRegion a, ITextRegion b) {\r\n\t\t\tif (a == b) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\treturn CompareRegionY(a, b, true);\r\n\t\t}\r\n\t\tstatic int CompareRegionY(ITextRegion a, ITextRegion b, bool checkAlignment) {\r\n\t\t\tif (checkAlignment && a.Region.IsAlignedWith(b.Region, WritingDirection.Vertical) == false) {\r\n\t\t\t\treturn CompareRegionX(a, b, false);\r\n\t\t\t}\r\n\t\t\tvar y1 = a.Region.Middle;\r\n\t\t\tvar y2 = b.Region.Middle;\r\n\t\t\treturn y1 > y2 ^ a.Region.IsTopDown ? -1\r\n\t\t\t\t: y1 == y2 ? 0\r\n\t\t\t\t: 1;\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Model/TextLine.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"{Direction}({Region.Middle},{Region.Center}):Text = {Text}\")]\r\n\tsealed class TextLine : IDirectionalBoundObject\r\n\t{\r\n\t\treadonly List<TextInfo> _Texts;\r\n\t\t/// <summary>获取此行内包含的文本。</summary>\r\n\t\tinternal IEnumerable<TextInfo> Texts => _Texts;\r\n\t\t/// <summary>获取 <see cref=\"Texts\"/> 内的第一个 <see cref=\"TextInfo\"/>。</summary>\r\n\t\tinternal TextInfo FirstText => _Texts[0];\r\n\r\n\t\tpublic WritingDirection Direction { get; private set; }\r\n\t\tpublic Bound Region { get; private set; }\r\n\t\tinternal bool SuppressTextInfoArrangement { get; set; }\r\n\t\t/// <summary>\r\n\t\t/// 默认的书写方向。\r\n\t\t/// </summary>\r\n\t\tinternal static WritingDirection DefaultDirection { get; set; }\r\n\r\n\t\tstring _Text;\r\n\t\t/// <summary>\r\n\t\t/// 获取将 <see cref=\"Texts\"/> 内所有文本串联起来的字符串。\r\n\t\t/// </summary>\r\n\t\tpublic string Text {\r\n\t\t\tget {\r\n\t\t\t\t_Text ??= GetConcatenatedText();\r\n\t\t\t\treturn _Text;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate TextLine() {\r\n\t\t\t_Texts = new List<TextInfo>();\r\n\t\t\tDirection = DefaultDirection;\r\n\t\t}\r\n\r\n\t\tinternal TextLine(TextInfo text) : this() {\r\n\t\t\t_Texts.Add(text);\r\n\t\t\tRegion = new Bound(text.Region);\r\n\t\t\tif (text.Text.Length > 2 && text.Region.Height > 0 && text.Region.Width > text.Region.Height * 2) {\r\n\t\t\t\tDirection = WritingDirection.Horizontal;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void AddText(TextInfo text) {\r\n\t\t\tif (Direction == WritingDirection.Unknown) {\r\n\t\t\t\tvar d = GetDistance(text.Region);\r\n\t\t\t\tDirection = InferWritingDirection(d);\r\n\t\t\t\tif (Direction == WritingDirection.Unknown) {\r\n\t\t\t\t\td = GetDistance(new Bound(text.Region.Center, text.Region.Middle));\r\n\t\t\t\t\tDirection = InferWritingDirection(d);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_Text = null;\r\n\t\t\t_Texts.Add(text);\r\n\t\t\tRegion.Merge(text.Region);\r\n\t\t}\r\n\r\n\t\tprivate static WritingDirection InferWritingDirection(DistanceInfo d) {\r\n\t\t\treturn d.IsVerticallyAligned ? WritingDirection.Vertical\r\n\t\t\t\t\t: d.IsHorizontallyAligned ? WritingDirection.Horizontal\r\n\t\t\t\t\t: WritingDirection.Unknown;\r\n\t\t}\r\n\r\n\t\tinternal void Merge(TextLine source) {\r\n\t\t\t_Text = null;\r\n\t\t\tRegion.Merge(source.Region);\r\n\t\t\t_Texts.AddRange(source.Texts);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取区域 <paramref name=\"other\"/> 到当前文本行之间的距离。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"other\">另一个区域。</param>\r\n\t\t/// <returns><paramref name=\"other\"/> 相对于此区域的距离关系。</returns>\r\n\t\tinternal DistanceInfo GetDistance(Bound other) {\r\n\t\t\treturn Region.GetDistance(other, Direction);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取将 <see cref=\"Texts\"/> 内所有文本串联起来的字符串。\r\n\t\t/// </summary>\r\n\t\tprivate string GetConcatenatedText() {\r\n\t\t\tvar l = _Texts.Count;\r\n\t\t\tif (l == 0) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\telse if (l == 1) {\r\n\t\t\t\treturn _Texts[0].Text;\r\n\t\t\t}\r\n\r\n\t\t\tvar tl = _Texts;\r\n\t\t\tif (SuppressTextInfoArrangement == false) {\r\n\t\t\t\tif (Direction == WritingDirection.Vertical) {\r\n\t\t\t\t\ttl.Sort(TextInfo.CompareRegionY);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\ttl.Sort(TextInfo.CompareRegionX);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar cs = GetAverageCharSize();\r\n\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\tsb.Append(tl[0].Text);\r\n\t\t\tchar c;\r\n\t\t\tfor (int i = 1; i < l; i++) {\r\n\t\t\t\tif (cs > 0) {\r\n\t\t\t\t\tvar dx = Direction == WritingDirection.Vertical\r\n\t\t\t\t\t\t? tl[i].Region.Top - tl[i - 1].Region.Bottom\r\n\t\t\t\t\t\t: tl[i].Region.Left - tl[i - 1].Region.Right;\r\n\t\t\t\t\tif (dx > cs) {\r\n\t\t\t\t\t\tvar t = tl[i - 1].Text;\r\n\t\t\t\t\t\t// 调整标点留下的空白\r\n\t\t\t\t\t\tif (t.Length > 0) {\r\n\t\t\t\t\t\t\tc = t[t.Length - 1];\r\n\t\t\t\t\t\t\tif (Char.IsPunctuation(c) && c > 128) {\r\n\t\t\t\t\t\t\t\tdx -= cs;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tt = tl[i].Text;\r\n\t\t\t\t\t\tif (t.Length > 0) {\r\n\t\t\t\t\t\t\tc = tl[i].Text[0];\r\n\t\t\t\t\t\t\tif (Char.IsPunctuation(c) && c > 128) {\r\n\t\t\t\t\t\t\t\tdx -= cs;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile ((dx -= cs) > 0) {\r\n\t\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsb.Append(tl[i].Text);\r\n\t\t\t}\r\n\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t}\r\n\r\n\t\t/// <summary>获取 <see cref=\"Texts\"/> 内文字或数字的平均尺寸。</summary>\r\n\t\t/// <returns>返回平均字符尺寸。</returns>\r\n\t\tinternal float GetAverageCharSize() {\r\n\t\t\tvar tl = _Texts;\r\n\t\t\tfloat ts = 0, cc = 0;\r\n\t\t\tif (Direction == WritingDirection.Vertical) {\r\n\t\t\t\ttl.ForEach((t) => { ts += t.LetterWidth; cc += t.Text.Length; });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tforeach (var t in tl) {\r\n\t\t\t\t\tts += t.LetterWidth;\r\n\t\t\t\t\tforeach (var c in t.Text) {\r\n\t\t\t\t\t\tif (Char.IsLetterOrDigit(c) == false) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcc += (c > 0x36F ? 2 : 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn ts / cc; // 平均字符宽度\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/TextRegion.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"{Direction}({Region.Top},{Region.Left})Lines={Lines.Count}\")]\r\n\tsealed class TextRegion\r\n\t{\r\n\t\tinternal Bound Region { get; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取文本区域中的行。\r\n\t\t/// 不应该调用此属性的 Add 方法添加行，而应使用 <see cref=\"AddLine\"/> 方法。\r\n\t\t/// </summary>\r\n\t\tinternal List<TextLine> Lines { get; } = [];\r\n\t\tinternal WritingDirection Direction { get; set; }\r\n\r\n\t\tinternal TextRegion(TextLine text) {\r\n\t\t\tRegion = new Bound(text.Region);\r\n\t\t\tAddLine(text);\r\n\t\t}\r\n\r\n\t\tinternal void AddLine(TextLine line) {\r\n\t\t\tif (Direction == WritingDirection.Unknown) {\r\n\t\t\t\tvar d = Region.GetDistance(line.Region, WritingDirection.Unknown);\r\n\t\t\t\tDirection = (d.Location == DistanceInfo.Placement.Up || d.Location == DistanceInfo.Placement.Down)\r\n\t\t\t\t\t? WritingDirection.Vertical\r\n\t\t\t\t\t: (d.Location == DistanceInfo.Placement.Left || d.Location == DistanceInfo.Placement.Right)\r\n\t\t\t\t\t? WritingDirection.Horizontal\r\n\t\t\t\t\t: WritingDirection.Unknown;\r\n\t\t\t}\r\n\t\t\tLines.Add(line);\r\n\t\t\tRegion.Merge(line.Region);\r\n\t\t}\r\n\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/UnitConverter.cs",
    "content": "﻿using System;\r\nusing System.Globalization;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Common\r\n{\r\n\tpublic class UnitConverter\r\n\t{\r\n\t\tinternal const string ToStringFormat = \"0.###\";\r\n\t\tconst string Null = \"null\";\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取单位转换因数。\r\n\t\t/// </summary>\r\n\t\t[XmlIgnore]\r\n\t\tpublic float UnitFactor { get; private set; }\r\n\r\n\t\tprivate int _Precision;\r\n\t\tprivate float _PreservedValue;\r\n\t\t///<summary>获取或指定转换精度的值。</summary>\r\n\t\t[XmlIgnore]\r\n\t\tpublic int Precision {\r\n\t\t\tget => _Precision;\r\n\t\t\tset {\r\n\t\t\t\tif (value < 0 || value > 6) {\r\n\t\t\t\t\tthrow new ArgumentException(\"转换精度不能小于 0 或大于 6。\");\r\n\t\t\t\t}\r\n\t\t\t\t_Precision = value;\r\n\t\t\t\t_PreservedValue = (float)Math.Pow(0.1, _Precision);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate string _Unit;\r\n\t\t///<summary>获取或指定转换使用的单位。</summary>\r\n\t\t[XmlAttribute(\"单位\")]\r\n\t\tpublic string Unit {\r\n\t\t\tget => _Unit;\r\n\t\t\tset {\r\n\t\t\t\tvar f = ValueHelper.MapValue(value, Constants.Units.Names, Constants.Units.Factors, 0);\r\n\t\t\t\tif (f == 0) {\r\n\t\t\t\t\tthrow new ArgumentException(\"尺寸单位无效。\");\r\n\t\t\t\t}\r\n\t\t\t\tUnitFactor = f;\r\n\t\t\t\t_Unit = value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic UnitConverter() {\r\n\t\t\tUnit = Constants.Units.CM;\r\n\t\t\tPrecision = 3;\r\n\t\t}\r\n\r\n\t\tinternal float FromPoint(float point) {\r\n\t\t\treturn (point < _PreservedValue && point >= 0) // preserve small fragment\r\n\t\t\t\t\t? point\r\n\t\t\t\t\t: (float)Math.Round(point / UnitFactor, _Precision);\r\n\t\t}\r\n\r\n\t\tinternal float ToPoint(float value) {\r\n\t\t\treturn (value < _PreservedValue && value >= 0 || value >= 10000) // preserve small fragment or extra large values\r\n\t\t\t\t\t? value\r\n\t\t\t\t\t: (float)Math.Round(value * UnitFactor, _Precision);\r\n\t\t}\r\n\r\n\t\tinternal static string FromPoint(string point, float unitFactor) {\r\n\t\t\tif (String.IsNullOrEmpty(point) || point == Null) {\r\n\t\t\t\treturn Null;\r\n\t\t\t}\r\n\t\t\tif (unitFactor == 1) {\r\n\t\t\t\treturn point;\r\n\t\t\t}\r\n\t\t\tif (point.TryParse(out float v)) {\r\n\t\t\t\treturn (v < 0.01 && v >= 0) // preserve small fragment\r\n\t\t\t\t\t? point\r\n\t\t\t\t\t: (v / unitFactor).ToString(ToStringFormat, NumberFormatInfo.InvariantInfo);\r\n\t\t\t}\r\n\t\t\treturn point;\r\n\t\t}\r\n\r\n\t\tinternal static string FromPoint(float point, float unitFactor) {\r\n\t\t\treturn ((point < 0.01 && point >= 0) || unitFactor == 1 // preserve small fragment\r\n\t\t\t\t? point.ToString(NumberFormatInfo.InvariantInfo)\r\n\t\t\t\t: (point / unitFactor).ToString(ToStringFormat, NumberFormatInfo.InvariantInfo));\r\n\t\t}\r\n\r\n\t\tinternal static string ToPoint(string value, float unitFactor) {\r\n\t\t\tif (String.IsNullOrEmpty(value) || value == Null) {\r\n\t\t\t\treturn Null;\r\n\t\t\t}\r\n\t\t\tif (value.TryParse(out float v)) {\r\n\t\t\t\treturn (v < 0.01 && v >= 0) // preserve small fragment\r\n\t\t\t\t\t? value\r\n\t\t\t\t\t: (v * unitFactor).ToString(ToStringFormat, NumberFormatInfo.InvariantInfo);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tinternal static float ToPoint(float value, float unitFactor) {\r\n\t\t\treturn (value < 0.01 && value >= 0 || value >= 10000) // preserve small fragment or extra large values\r\n\t\t\t\t\t? value\r\n\t\t\t\t\t: (value * unitFactor);\r\n\t\t}\r\n\r\n\t\tinternal static float[] ConvertUnit(float[] source, float factor) {\r\n\t\t\treturn Array.ConvertAll(source, i => ToPoint(i, factor));\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Model/WritingDirection.cs",
    "content": "﻿using System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher.Model\r\n{\r\n\tpublic enum WritingDirection\r\n\t{\r\n\t\t[XmlEnum(\"混合\")]\r\n\t\tUnknown,\r\n\t\t[XmlEnum(\"横排\")]\r\n\t\tHorizontal,\r\n\t\t[XmlEnum(\"竖排\")]\r\n\t\tVertical\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/AutoBookmarkOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.ObjectModel;\r\nusing System.Text.RegularExpressions;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class AutoBookmarkOptions\r\n\t{\r\n\t\tpublic readonly static Regex NumericPattern = new(\"^[0-9]+$\", RegexOptions.Compiled);\r\n\r\n\t\t#region 识别选项\r\n\t\t/// <summary>\r\n\t\t/// 页码范围。\r\n\t\t/// </summary>\r\n\t\t//[XmlAttribute (\"页码范围\")]\r\n\t\t[XmlIgnore]\r\n\t\t[PowerJson.JsonInclude(false)]\r\n\t\tpublic string PageRanges { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 最小标题字体尺寸。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"最小标题尺寸\")]\r\n\t\tpublic float TitleThreshold { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 每页第一行作为标题。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"第一行为标题\")]\r\n\t\tpublic bool FirstLineAsTitle { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 忽略只有一个字符的标题。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"忽略单字符标题\")]\r\n\t\tpublic bool IgnoreSingleCharacterTitle { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 忽略只有数字的标题。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"忽略数字标题\")]\r\n\t\tpublic bool IgnoreNumericTitle { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 合并近邻的同级别标题。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"合并相邻标题\")]\r\n\t\tpublic bool MergeAdjacentTitles { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 是否允许合并不同字体尺寸的标题。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"合并不同尺寸标题\")]\r\n\t\tpublic bool MergeDifferentSizeTitles { get; set; }\r\n\r\n\t\t[XmlAttribute(\"合并不同字体标题\")]\r\n\t\tpublic bool MergeDifferentFontTitles { get; set; }\r\n\r\n\t\t[XmlAttribute(\"忽略重叠文本\")]\r\n\t\tpublic bool IgnoreOverlappedText { get; set; }\r\n\r\n\t\tprivate readonly Collection<MatchPattern> _IgnorePatterns = new Collection<MatchPattern>();\r\n\t\t/// <summary>\r\n\t\t/// 忽略指定的表达式。\r\n\t\t/// </summary>\r\n\t\t[XmlArray(\"忽略表达式\")]\r\n\t\t[XmlArrayItem(\"表达式\")]\r\n\t\tpublic Collection<MatchPattern> IgnorePatterns => _IgnorePatterns;\r\n\r\n\t\tprivate readonly Collection<LevelAdjustmentOption> _LevelAdjustment = new Collection<LevelAdjustmentOption>();\r\n\t\t[XmlElement(\"级别调整\")]\r\n\t\t[PowerJson.JsonField(\"级别调整\")]\r\n\t\tpublic Collection<LevelAdjustmentOption> LevelAdjustment => _LevelAdjustment;\r\n\r\n\t\t[XmlAttribute(\"自动组织标题层次\")]\r\n\t\tpublic bool AutoHierarchicalArrangement { get; set; }\r\n\r\n\t\t[XmlAttribute(\"列出字体统计信息\")]\r\n\t\tpublic bool DisplayFontStatistics { get; set; }\r\n\r\n\t\t[XmlAttribute(\"列出所有字体\")]\r\n\t\tpublic bool DisplayAllFonts { get; set; }\r\n\r\n\t\t[XmlAttribute(\"排版\")]\r\n\t\tpublic WritingDirection WritingDirection { get; set; }\r\n\r\n\t\t[XmlAttribute(\"最大合并行距\")]\r\n\t\tpublic float MaxDistanceBetweenLines { get; set; }\r\n\r\n\t\t[XmlAttribute(\"识别分栏\")]\r\n\t\tpublic bool DetectColumns { get; set; }\r\n\r\n\t\t[XmlAttribute(\"为首页生成书签\")]\r\n\t\tpublic bool CreateBookmarkForFirstPage { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 首页书签名称。指定此属性，则为首页生成书签。\r\n\t\t/// </summary>\r\n\t\tinternal string FirstPageTitle { get; set; }\r\n\t\t#endregion\r\n\r\n\t\t#region 定位选项\r\n\t\t/// <summary>\r\n\t\t/// 连接目标的页面 Y 轴偏移量。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"Y轴偏移\")]\r\n\t\tpublic float YOffset { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 定位到页面顶端的标题级别。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"定位到页面顶端\")]\r\n\t\tpublic int PageTopForLevel { get; set; }\r\n\t\t#endregion\r\n\r\n\t\t/// <summary>\r\n\t\t/// 是否导出文本的位置信息。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"导出文本位置信息\")]\r\n\t\tpublic bool ExportTextCoordinates { get; set; }\r\n\r\n\t\tpublic AutoBookmarkOptions() {\r\n\t\t\tAutoHierarchicalArrangement = true;\r\n\t\t\tCreateBookmarkForFirstPage = true;\r\n\t\t\tExportTextCoordinates = false;\r\n\t\t\tIgnoreNumericTitle = false;\r\n\t\t\tIgnoreSingleCharacterTitle = false;\r\n\t\t\tMergeAdjacentTitles = true;\r\n\t\t\tMergeDifferentFontTitles = true;\r\n\t\t\tMergeDifferentSizeTitles = false;\r\n\t\t\tTitleThreshold = 13;\r\n\t\t\tYOffset = 1.0f;\r\n\t\t\tDisplayFontStatistics = true;\r\n\t\t\tMaxDistanceBetweenLines = 1.5f;\r\n\t\t\tDetectColumns = true;\r\n\t\t}\r\n\r\n\t\tpublic class LevelAdjustmentOption\r\n\t\t{\r\n\t\t\t[XmlElement(AutoBookmarkCondition.MultiCondition.ThisName, typeof(AutoBookmarkCondition.MultiCondition))]\r\n\t\t\t[XmlElement(AutoBookmarkCondition.FontNameCondition.ThisName, typeof(AutoBookmarkCondition.FontNameCondition))]\r\n\t\t\t[XmlElement(AutoBookmarkCondition.TextSizeCondition.ThisName, typeof(AutoBookmarkCondition.TextSizeCondition))]\r\n\t\t\t[XmlElement(AutoBookmarkCondition.TextPositionCondition.ThisName, typeof(AutoBookmarkCondition.TextPositionCondition))]\r\n\t\t\t[XmlElement(AutoBookmarkCondition.PageRangeCondition.ThisName, typeof(AutoBookmarkCondition.PageRangeCondition))]\r\n\t\t\t[XmlElement(AutoBookmarkCondition.TextCondition.ThisName, typeof(AutoBookmarkCondition.TextCondition))]\r\n\t\t\tpublic AutoBookmarkCondition Condition { get; set; }\r\n\r\n\t\t\t[XmlAttribute(\"合并前筛选\")]\r\n\t\t\tpublic bool FilterBeforeMergeTitle { get; set; }\r\n\r\n\t\t\t[XmlAttribute(\"相对级别调整\")]\r\n\t\t\tpublic bool RelativeAdjustment { get; set; }\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// 标题的调整级别。\r\n\t\t\t/// </summary>\r\n\t\t\t[XmlAttribute(\"调整级别\")]\r\n\t\t\tpublic float AdjustmentLevel { get; set; }\r\n\r\n\t\t\tinternal LevelAdjustmentOption Clone() {\r\n\t\t\t\treturn new LevelAdjustmentOption() {\r\n\t\t\t\t\tCondition = Condition.Clone() as AutoBookmarkCondition,\r\n\t\t\t\t\tRelativeAdjustment = RelativeAdjustment,\r\n\t\t\t\t\tAdjustmentLevel = AdjustmentLevel\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Options/DocumentOptions.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic abstract class DocumentOptions\r\n\t{\r\n\t\t[XmlElement(\"指定元数据\")]\r\n\t\tpublic GeneralInfo MetaData { get; set; }\r\n\r\n\t\t[XmlElement(\"阅读器设置\")]\r\n\t\tpublic ViewerOptions ViewerPreferences { get; set; }\r\n\r\n\t\t[XmlIgnore]\r\n\t\tinternal List<PageLabel> PageLabels { get; private set; }\r\n\r\n\t\t[XmlAttribute(\"压缩索引表和书签\")]\r\n\t\tpublic bool FullCompression { get; set; }\r\n\r\n\t\t[XmlAttribute(\"统一页面方向\")]\r\n\t\tpublic bool UnifyPageOrientation { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设置统一页面方向要旋转的页面。默认旋转横向的页面。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"旋转源页面方向\")]\r\n\t\tpublic bool RotateVerticalPages { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设置统一页面旋转页面的方向。默认为顺时针旋转。\r\n\t\t/// </summary>\r\n\t\t[XmlAttribute(\"旋转方向\")]\r\n\t\tpublic bool RotateAntiClockwise { get; set; }\r\n\r\n\t\tprotected DocumentOptions() {\r\n\t\t\tFullCompression = true;\r\n\t\t\tPageLabels = new List<PageLabel>();\r\n\t\t\tViewerPreferences = new ViewerOptions();\r\n\t\t\tMetaData = new GeneralInfo();\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "App/Options/EncodingOptions.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class EncodingOptions\r\n\t{\r\n\r\n\t\tEncoding _bookmarkEncoding;\r\n\t\tpublic Encoding BookmarkEncoding {\r\n\t\t\tget {\r\n\t\t\t\tGetEncoding(_bookmarkEncodingName, ref _bookmarkEncoding);\r\n\t\t\t\treturn _bookmarkEncoding;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstring _bookmarkEncodingName;\r\n\t\t///<summary>获取或指定读取书签时所用的编码。</summary>\r\n\t\t[XmlAttribute(\"书签文本编码\")]\r\n\t\tpublic string BookmarkEncodingName {\r\n\t\t\tget => _bookmarkEncodingName;\r\n\t\t\tset => SetEncoding(ref _bookmarkEncodingName, ref _bookmarkEncoding, value);\r\n\t\t}\r\n\r\n\t\tEncoding _docInfoEncoding;\r\n\t\tpublic Encoding DocInfoEncoding {\r\n\t\t\tget {\r\n\t\t\t\tGetEncoding(_docInfoEncodingName, ref _docInfoEncoding);\r\n\t\t\t\treturn _docInfoEncoding;\r\n\t\t\t}\r\n\t\t}\r\n\t\tstring _docInfoEncodingName;\r\n\t\t///<summary>获取或指定读取文档元数据时所用的编码。</summary>\r\n\t\t[XmlAttribute(\"文档元数据编码\")]\r\n\t\tpublic string DocInfoEncodingName {\r\n\t\t\tget => _docInfoEncodingName;\r\n\t\t\tset => SetEncoding(ref _docInfoEncodingName, ref _docInfoEncoding, value);\r\n\t\t}\r\n\r\n\t\tEncoding _textEncoding;\r\n\t\tpublic Encoding TextEncoding {\r\n\t\t\tget {\r\n\t\t\t\tGetEncoding(_textEncodingName, ref _textEncoding);\r\n\t\t\t\treturn _textEncoding;\r\n\t\t\t}\r\n\t\t}\r\n\t\tstring _textEncodingName;\r\n\t\t///<summary>获取或指定读取文本时所用的编码。</summary>\r\n\t\t[XmlAttribute(\"内容文本编码\")]\r\n\t\tpublic string TextEncodingName {\r\n\t\t\tget => _textEncodingName;\r\n\t\t\tset => SetEncoding(ref _textEncodingName, ref _textEncoding, value);\r\n\t\t}\r\n\r\n\t\tEncoding _fontNameEncoding;\r\n\t\tpublic Encoding FontNameEncoding {\r\n\t\t\tget {\r\n\t\t\t\tGetEncoding(_fontNameEncodingName, ref _fontNameEncoding);\r\n\t\t\t\treturn _fontNameEncoding;\r\n\t\t\t}\r\n\t\t}\r\n\t\tstring _fontNameEncodingName;\r\n\t\t///<summary>获取或指定读取文本时所用的编码。</summary>\r\n\t\t[XmlAttribute(\"字体名称编码\")]\r\n\t\tpublic string FontNameEncodingName {\r\n\t\t\tget => _fontNameEncodingName;\r\n\t\t\tset => SetEncoding(ref _fontNameEncodingName, ref _fontNameEncoding, value);\r\n\t\t}\r\n\t\tpublic static void SetEncoding(ref string encodingName, ref Encoding encoding, string value) {\r\n\t\t\tencoding = null;\r\n\t\t\tencodingName = (value == Constants.Encoding.Automatic ? null : value);\r\n\t\t}\r\n\t\tstatic void GetEncoding(string encodingName, ref Encoding encoding) {\r\n\t\t\tif (encoding == null && String.IsNullOrEmpty(encodingName) == false) {\r\n\t\t\t\tencoding = ValueHelper.MapValue(encodingName, Constants.Encoding.EncodingNames, Constants.Encoding.Encodings);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/ExporterOptions.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Common;\r\nusing E = System.Text.Encoding;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ExporterOptions\r\n\t{\r\n\t\t///<summary>获取或指定是否导出文档属性。</summary>\r\n\t\t[XmlAttribute(\"导出文档属性\")]\r\n\t\tpublic bool ExportDocProperties { get; set; } = true;\r\n\r\n\t\t///<summary>获取或指定是否导出书签。</summary>\r\n\t\t[XmlAttribute(\"导出文档书签\")]\r\n\t\tpublic bool ExportBookmarks { get; set; } = true;\r\n\r\n\t\t///<summary>获取或指定是否导出页面内的连接。</summary>\r\n\t\t[XmlAttribute(\"导出页面链接\")]\r\n\t\tpublic bool ExtractPageLinks { get; set; } = true;\r\n\r\n\t\t///<summary>获取或指定是否导出阅读器设置。</summary>\r\n\t\t[XmlAttribute(\"导出阅读器设置\")]\r\n\t\tpublic bool ExportViewerPreferences { get; set; } = true;\r\n\r\n\t\t///<summary>获取或指定是否导出页面的阅读设置。</summary>\r\n\t\t[XmlAttribute(\"导出页面设置\")]\r\n\t\tpublic bool ExtractPageSettings { get; set; } = true;\r\n\r\n\t\t///<summary>获取或指定是否导出文档编录信息。</summary>\r\n\t\t[XmlAttribute(\"导出编录信息\")]\r\n\t\tpublic bool ExportCatalog { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导出页面内容信息。</summary>\r\n\t\t[XmlAttribute(\"导出页面内容\")]\r\n\t\tpublic bool ExtractPageContent { get; set; }\r\n\r\n\t\t///<summary>获取或指定需要导出的页码范围。页码范围可用“-”表示起止页码，如有多个页码，可用“;”、“,”或“ ”（空格）隔开，如“1;4-15;2 56”，表示依次导出第1页、第4至15页、第2页和第56页的内容。</summary>\r\n\t\t[XmlAttribute(\"导出页码范围\")]\r\n\t\tpublic string ExtractPageRange { get; set; }\r\n\r\n\t\t///<summary>获取或指定页面字典的值。</summary>\r\n\t\t[XmlAttribute(\"导出页面字典\")]\r\n\t\tpublic bool ExtractPageDictionary { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导出页面中的图片为独立的文件。</summary>\r\n\t\t[XmlAttribute(\"导出图片\")]\r\n\t\tpublic bool ExtractImages { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否解码导出页面中的文本。</summary>\r\n\t\t[XmlAttribute(\"导出解码文本\")]\r\n\t\tpublic bool ExportDecodedText { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否解码导出页面指令。</summary>\r\n\t\t[XmlAttribute(\"导出命令操作符\")]\r\n\t\tpublic bool ExportContentOperators { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出二进制流的字节数。</summary>\r\n\t\t[XmlAttribute(\"导出二进制流\")]\r\n\t\tpublic bool ExportBinaryStream { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出前是否解析命名位置。</summary>\r\n\t\t[XmlAttribute(\"解析命名位置\")]\r\n\t\tpublic bool ConsolidateNamedDestinations { get; set; }\r\n\r\n\t\t///<summary>获取导出图像的选项。</summary>\r\n\t\t[XmlIgnore]\r\n\t\tpublic ImageExtracterOptions Images { get; } = new ImageExtracterOptions();\r\n\r\n\t\t[XmlElement(\"导出尺寸单位\")]\r\n\t\tpublic UnitConverter UnitConverter { get; set; } = new UnitConverter();\r\n\r\n\t\tprivate Encoding _Encoding = E.Default;\r\n\t\tprivate string _EncodingName;\r\n\t\t///<summary>获取或指定导出文件时所用的编码。</summary>\r\n\t\t[XmlAttribute(\"文本编码\")]\r\n\t\tpublic string Encoding {\r\n\t\t\tget {\r\n\t\t\t\tif (_Encoding.EncodingName == E.Default.EncodingName) {\r\n\t\t\t\t\treturn Constants.Encoding.SystemDefault;\r\n\t\t\t\t}\r\n\t\t\t\treturn _EncodingName;\r\n\t\t\t}\r\n\t\t\tset {\r\n\t\t\t\tif (String.IsNullOrEmpty(value) || value == Constants.Encoding.SystemDefault) {\r\n\t\t\t\t\t_Encoding = E.Default;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\t_Encoding = E.GetEncoding(value);\r\n\t\t\t\t\t\t_EncodingName = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t\t_EncodingName = Constants.Encoding.SystemDefault;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic Encoding GetEncoding() {\r\n\t\t\treturn _Encoding;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/ExtractPageOptions.cs",
    "content": "﻿using System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ExtractPageOptions\r\n\t{\r\n\t\t[XmlAttribute(\"压缩文档\")]\r\n\t\tpublic bool EnableFullCompression { get; set; }\r\n\t\t[XmlAttribute(\"保留文档属性\")]\r\n\t\tpublic bool KeepDocumentProperties { get; set; }\r\n\t\t[XmlAttribute(\"保留文档书签\")]\r\n\t\tpublic bool KeepBookmarks { get; set; }\r\n\t\t[XmlAttribute(\"删除无效书签\")]\r\n\t\tpublic bool RemoveOrphanBookmarks { get; set; }\r\n\t\t[XmlAttribute(\"解除文档限制\")]\r\n\t\tpublic bool RemoveDocumentRestrictions { get; set; }\r\n\t\t[XmlAttribute(\"添加编号\")]\r\n\t\tpublic bool NumberFileNames { get; set; }\r\n\t\t[XmlAttribute(\"拆分方式\")]\r\n\t\tpublic int SeparatingMode { get; set; }\r\n\t\t[XmlAttribute(\"按页数拆分\")]\r\n\t\tpublic int SeparateByPage { get; set; }\r\n\r\n\t\t[XmlIgnore]\r\n\t\tpublic string PageRanges { get; set; }\r\n\t\t[XmlIgnore]\r\n\t\tpublic string ExcludePageRanges { get; set; }\r\n\r\n\t\tpublic ExtractPageOptions() {\r\n\t\t\tEnableFullCompression = true;\r\n\t\t\tKeepBookmarks = true;\r\n\t\t\tKeepDocumentProperties = true;\r\n\t\t\tRemoveDocumentRestrictions = true;\r\n\t\t\tRemoveOrphanBookmarks = true;\r\n\t\t\tNumberFileNames = true;\r\n\t\t\tSeparateByPage = 1;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/ImageExtracterOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ImageExtracterOptions\r\n\t{\r\n\t\t[XmlAttribute(\"自动指定输出位置\")]\r\n\t\tpublic bool AutoOutputFolder { get; set; }\r\n\r\n\t\t[XmlAttribute(\"允许重复导出图片\")]\r\n\t\tpublic bool AllowRedundantImages { get; set; }\r\n\r\n\t\t[XmlAttribute(\"导出页面外的图片\")]\r\n\t\tpublic bool ExtractOutOfPageImages { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否合并相同页面、相同宽度的图片。</summary>\r\n\t\t[XmlAttribute(\"合并图片\")]\r\n\t\tpublic bool MergeImages { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否将合并的 JPEG 图片存为无损的 PNG 图片。</summary>\r\n\t\t[XmlAttribute(\"合并JPG图片为PNG\")]\r\n\t\tpublic bool MergeJpgToPng { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否垂直翻转导出的 PNG 或 TIFF 图片。</summary>\r\n\t\t[XmlAttribute(\"垂直翻转图片\")]\r\n\t\tpublic bool VerticalFlipImages { get; set; }\r\n\r\n\t\t/// <summary>获取或指定是否反转黑白图片的颜色。</summary>\r\n\t\t[XmlAttribute(\"反转黑白图片颜色\")]\r\n\t\tpublic bool InvertBlackAndWhiteImages { get; set; }\r\n\t\t[XmlAttribute(\"黑白图片导出为PNG\")]\r\n\t\tpublic bool MonoPng { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导出批注内的图片。</summary>\r\n\t\t[XmlAttribute(\"导出批注图片\")]\r\n\t\tpublic bool ExtractAnnotationImages { get; set; }\r\n\r\n\t\t[XmlAttribute(\"最小高度\")]\r\n\t\tpublic int MinHeight { get; set; }\r\n\t\t[XmlAttribute(\"最小宽度\")]\r\n\t\tpublic int MinWidth { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出页面图像所保存的目录路径。</summary>\r\n\t\t[XmlAttribute(\"导出路径\")]\r\n\t\tpublic string OutputPath { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出文件的名称掩码。</summary>\r\n\t\t[XmlAttribute(\"文件名称掩码\")]\r\n\t\tpublic string FileMask { get; set; }\r\n\r\n\t\t[XmlAttribute(\"导出掩模\")]\r\n\t\tpublic bool ExtractSoftMask { get; set; }\r\n\t\t[XmlAttribute(\"取反掩模\")]\r\n\t\tpublic bool InvertSoftMask { get; set; }\r\n\r\n\t\t[XmlIgnore]\r\n\t\t[PowerJson.JsonInclude(false)]\r\n\t\tpublic string PageRange { get; set; }\r\n\r\n\t\tpublic ImageExtracterOptions() {\r\n\t\t\tAutoOutputFolder = true;\r\n\t\t\tFileMask = \"0000\";\r\n\t\t\tMergeJpgToPng = true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/ImporterOptions.cs",
    "content": "﻿using System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ImporterOptions\r\n\t{\r\n\t\t///<summary>获取或指定是否导入文档属性信息。</summary>\r\n\t\t[XmlAttribute(\"导入文档属性\")]\r\n\t\tpublic bool ImportDocProperties { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导入书签。</summary>\r\n\t\t[XmlAttribute(\"导入文档书签\")]\r\n\t\tpublic bool ImportBookmarks { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导入页面内的连接。</summary>\r\n\t\t[XmlAttribute(\"导入页面链接\")]\r\n\t\tpublic bool ImportPageLinks { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否保留页面内的连接。</summary>\r\n\t\t[XmlAttribute(\"保留页面链接\")]\r\n\t\tpublic bool KeepPageLinks { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导入阅读器设置。</summary>\r\n\t\t[XmlAttribute(\"导入阅读器设置\")]\r\n\t\tpublic bool ImportViewerPreferences { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否导入页面的阅读设置。</summary>\r\n\t\t[XmlAttribute(\"导入页面设置\")]\r\n\t\tpublic bool ImportPageSettings { get; set; }\r\n\r\n\t\tpublic ImporterOptions() {\r\n\t\t\tImportDocProperties = true;\r\n\t\t\tImportBookmarks = true;\r\n\t\t\tImportPageLinks = true;\r\n\t\t\tImportViewerPreferences = true;\r\n\t\t\tImportPageSettings = true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/MergerOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class MergerOptions : DocumentOptions\r\n\t{\r\n\t\tpublic MergerOptions() {\r\n\t\t\tAutoBookmarkTitle = true;\r\n\t\t\tAutoMaskBWImages = true;\r\n\t\t\tAutoScaleDown = true;\r\n\t\t\tFullCompression = true;\r\n\t\t\tIgnoreLeadingNumbers = true;\r\n\t\t\tKeepBookmarks = true;\r\n\t\t\tNumericAwareSort = true;\r\n\t\t\tRemoveOrphanBookmarks = true;\r\n\t\t\tPageSettings = new PageBoxSettings();\r\n\t\t}\r\n\r\n\t\t[XmlElement(\"页面布局\")]\r\n\t\tpublic PageBoxSettings PageSettings { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否自动缩小图片以适合页面。</summary>\r\n\t\t[XmlAttribute(\"自动缩小\")]\r\n\t\t[DefaultValue(true)]\r\n\t\tpublic bool AutoScaleDown { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否自动放大图片以填满页面。</summary>\r\n\t\t[XmlAttribute(\"自动放大\")]\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool AutoScaleUp { get; set; }\r\n\r\n\t\t[XmlAttribute(\"压缩冗余数据\")]\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool Deduplicate { get; set; }\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取页面除去上下留白的高度。\r\n\t\t/// </summary>\r\n\t\t[XmlIgnore]\r\n\t\tpublic float ContentHeight {\r\n\t\t\tget {\r\n\t\t\t\tvar ps = PageSettings;\r\n\t\t\t\treturn ps.PaperSize.Height - ps.Margins.Top - ps.Margins.Bottom;\r\n\t\t\t}\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 获取页面除去左右留白的宽度。\r\n\t\t/// </summary>\r\n\t\t[XmlIgnore]\r\n\t\tpublic float ContentWidth {\r\n\t\t\tget {\r\n\t\t\t\tvar ps = PageSettings;\r\n\t\t\t\treturn ps.PaperSize.Width - ps.Margins.Left - ps.Margins.Right;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[XmlAttribute(\"水平DPI\")]\r\n\t\tpublic int DpiX { get; set; }\r\n\r\n\t\t[XmlAttribute(\"垂直DPI\")]\r\n\t\tpublic int DpiY { get; set; }\r\n\r\n\t\t[XmlAttribute(\"校正图片旋转角度\")]\r\n\t\tpublic bool DeskewImages { get; set; }\r\n\r\n\t\t[XmlAttribute(\"优化黑白图片压缩算法\")]\r\n\t\tpublic bool RecompressWithJbig2 { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否为黑白图片自动设为透明（在阅读器中不能用图像工具选中）。</summary>\r\n\t\t[XmlAttribute(\"黑白图片自动透明\")]\r\n\t\tpublic bool AutoMaskBWImages { get; set; }\r\n\r\n\t\t#region 文件列表选项\r\n\t\t///<summary>获取或指定排序文件时是否按数值和文本排序。</summary>\r\n\t\t[XmlAttribute(\"按数值排序文件\")]\r\n\t\t[DefaultValue(true)]\r\n\t\tpublic bool NumericAwareSort { get; set; }\r\n\r\n\t\t///<summary>获取或指定排序文件时是否按超星阅读器的文件命名排序。</summary>\r\n\t\t[XmlAttribute(\"按超星阅读器排序文件\")]\r\n\t\t[DefaultValue(false)]\r\n\t\tpublic bool CajSort { get; set; }\r\n\r\n\t\t///<summary>获取或指定添加目录时是否将子目录排列在文件前面。</summary>\r\n\t\t[XmlAttribute(\"子目录\")]\r\n\t\t[DefaultValue(SubFolderPosition.BeforeFiles)]\r\n\t\tpublic SubFolderPosition SubFolder { get; set; }\r\n\t\t#endregion\r\n\r\n\t\t#region 自动生成书签选项\r\n\t\t///<summary>获取或指定忽略文件名的前导数值。</summary>\r\n\t\t[XmlAttribute(\"自动生成书签文本\")]\r\n\t\t[DefaultValue(true)]\r\n\t\tpublic bool AutoBookmarkTitle { get; set; }\r\n\r\n\t\t///<summary>获取或指定忽略文件名的前导数值。</summary>\r\n\t\t[XmlAttribute(\"忽略前导数字\")]\r\n\t\t[DefaultValue(true)]\r\n\t\tpublic bool IgnoreLeadingNumbers { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否保留 PDF 文档的书签。</summary>\r\n\t\t[XmlAttribute(\"保留书签\")]\r\n\t\t[DefaultValue(true)]\r\n\t\tpublic bool KeepBookmarks { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否删除没有目标（页面失效）的书签。</summary>\r\n\t\t[XmlAttribute(\"删除失效书签\")]\r\n\t\t[DefaultValue(true)]\r\n\t\tpublic bool RemoveOrphanBookmarks { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否在单页PDF源文档后附加一页空白页使之成为双数页（以便双面打印）。</summary>\r\n\t\t[XmlAttribute(\"单页PDF附加空白页\")]\r\n\t\tpublic bool ExtraEmptyPageForOddPdf { get; set; }\r\n\t\t#endregion\r\n\r\n\t\tpublic enum SubFolderPosition\r\n\t\t{\r\n\t\t\tBeforeFiles,\r\n\t\t\tWithFiles,\r\n\t\t\tExclude\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/OcrOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class OcrOptions\r\n\t{\r\n\t\t//[XmlAttribute (\"页码范围\")]\r\n\t\t[XmlIgnore]\r\n\t\tpublic string PageRanges { get; set; }\r\n\r\n\t\t#region 光学字符识别选项\r\n\t\t[XmlAttribute(\"识别语言\")]\r\n\t\tpublic int OcrLangID { get; set; }\r\n\t\t[XmlAttribute(\"旋转校正\")]\r\n\t\tpublic bool OrientPage { get; set; }\r\n\t\t[XmlAttribute(\"拉伸校正\")]\r\n\t\tpublic bool StretchPage { get; set; }\r\n\t\t[XmlIgnore]\r\n\t\tpublic float QuantitativeFactor { get; set; }\r\n\t\t[XmlAttribute(\"排版\")]\r\n\t\tpublic WritingDirection WritingDirection { get; set; }\r\n\t\t[XmlAttribute(\"识别分栏\")]\r\n\t\tpublic bool DetectColumns { get; set; }\r\n\t\t[XmlAttribute(\"目录识别模式\")]\r\n\t\tpublic bool DetectContentPunctuations { get; set; }\r\n\t\t[XmlAttribute(\"压缩空白\")]\r\n\t\tpublic bool CompressWhiteSpaces { get; set; }\r\n\t\t[XmlAttribute(\"删除汉字间空白\")]\r\n\t\tpublic bool RemoveWhiteSpacesBetweenChineseCharacters { get; set; }\r\n\t\t[XmlAttribute(\"识别前保留图像颜色\")]\r\n\t\tpublic bool PreserveColor { get; set; }\r\n\t\t[XmlAttribute(\"导出原始识别结果\")]\r\n\t\tpublic bool OutputOriginalOcrResult { get; set; }\r\n\t\t[XmlAttribute(\"在屏幕输出识别文本\")]\r\n\t\tpublic bool PrintOcrResult { get; set; }\r\n\t\t[XmlIgnore]\r\n\t\tpublic string SaveOcredImagePath { get; set; }\r\n\t\t#endregion\r\n\r\n\t\tpublic OcrOptions() {\r\n\t\t\tOcrLangID = 2052;\r\n\t\t\tDetectColumns = true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/PatcherOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\t[XmlRoot(\"文档设置\")]\r\n\tpublic class PatcherOptions : DocumentOptions\r\n\t{\r\n\t\t[XmlAttribute(\"默认覆盖文档\")]\r\n\t\tpublic bool DefaultOverwriteDocument { get; set; }\r\n\t\t[XmlAttribute(\"嵌入字库\")]\r\n\t\tpublic bool EmbedFonts { get; set; }\r\n\t\t[XmlAttribute(\"删除文本尾随空白\")]\r\n\t\tpublic bool TrimTrailingWhiteSpace { get; set; }\r\n\t\t[XmlAttribute(\"允许替换字库\")]\r\n\t\tpublic bool EnableFontSubstitutions { get; set; }\r\n\t\t[XmlAttribute(\"修复内容流\")]\r\n\t\tpublic bool FixContents { get; set; }\r\n\t\t[XmlAttribute(\"删除批注\")]\r\n\t\tpublic bool RemoveAnnotations { get; set; }\r\n\t\t[XmlAttribute(\"删除附件\")]\r\n\t\tpublic bool RemoveAttachments { get; set; }\r\n\t\t[XmlAttribute(\"删除导航书签\")]\r\n\t\tpublic bool RemoveBookmarks { get; set; }\r\n\t\t[XmlAttribute(\"删除页面开头指令\")]\r\n\t\t[XmlIgnore]\r\n\t\tpublic int RemoveLeadingCommandCount { get; set; }\r\n\t\t[XmlAttribute(\"删除页面结尾指令\")]\r\n\t\t[XmlIgnore]\r\n\t\tpublic int RemoveTrailingCommandCount { get; set; }\r\n\t\t[XmlAttribute(\"删除使用限制\")]\r\n\t\tpublic bool RemoveUsageRights { get; set; }\r\n\t\t[XmlAttribute(\"删除文档自动动作\")]\r\n\t\tpublic bool RemoveDocAutoActions { get; set; }\r\n\t\t[XmlAttribute(\"删除页面自动动作\")]\r\n\t\tpublic bool RemovePageAutoActions { get; set; }\r\n\t\t[XmlAttribute(\"删除页面表单\")]\r\n\t\tpublic bool RemovePageForms { get; set; }\r\n\t\t[XmlAttribute(\"删除链接批注\")]\r\n\t\tpublic bool RemovePageLinks { get; set; }\r\n\t\t[XmlAttribute(\"删除页面元数据\")]\r\n\t\tpublic bool RemovePageMetaData { get; set; }\r\n\t\t[XmlAttribute(\"删除页面文本\")]\r\n\t\tpublic bool RemovePageTextBlocks { get; set; }\r\n\t\t[XmlAttribute(\"删除页面缩略图\")]\r\n\t\tpublic bool RemovePageThumbnails { get; set; }\r\n\t\t[XmlAttribute(\"删除XML元数据\")]\r\n\t\tpublic bool RemoveXmlMetadata { get; set; }\r\n\t\t[XmlAttribute(\"优化黑白图片压缩算法\")]\r\n\t\tpublic bool RecompressWithJbig2 { get; set; }\r\n\t\t[XmlAttribute(\"将图片转换为黑白\")]\r\n\t\tpublic bool RecompressImageToBinary { get; set; }\r\n\t\t[XmlAttribute(\"使用门限约束二值化算法\")]\r\n\t\tpublic bool UseThresholdAlgorithm { get; set; }\r\n\t\t[XmlAttribute(\"黑白图片门限\")]\r\n\t\tpublic byte BinaryImageThreshold { get; set; } = 128;\r\n\t\t[XmlAttribute(\"抖动黑白图像\")]\r\n\t\tpublic byte DitherAlgorithm { get; set; } = 1;\r\n\r\n\t\t[XmlElement(\"页面布局\")]\r\n\t\tpublic PageBoxSettings UnifiedPageSettings { get; set; }\r\n\t\t[XmlArray(\"页面设置\")]\r\n\t\t[XmlArrayItem(\"设置项\")]\r\n\t\tpublic List<PageBoxSettings> PageSettings { get; }\r\n\t\t[XmlArray(\"字体替换\")]\r\n\t\t[XmlArrayItem(\"替换项\")]\r\n\t\tpublic List<FontSubstitution> FontSubstitutions { get; }\r\n\r\n\t\tpublic PatcherOptions() {\r\n\t\t\tPageSettings = new List<PageBoxSettings>();\r\n\t\t\tFontSubstitutions = new List<FontSubstitution>();\r\n\t\t\tUnifiedPageSettings = new PageBoxSettings();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic class FontSubstitution\r\n\t{\r\n\t\t[XmlAttribute(\"原字体\")]\r\n\t\tpublic string OriginalFont { get; set; }\r\n\t\t[XmlAttribute(\"新字体\")]\r\n\t\t[PowerJson.JsonField(\"SubstitutionFont\")]\r\n\t\tpublic string Substitution { get; set; }\r\n\t\t[XmlAttribute(\"原字符\")]\r\n\t\tpublic string OriginalCharacters { get; set; }\r\n\t\t[XmlAttribute(\"替换字符\")]\r\n\t\tpublic string SubstituteCharacters { get; set; }\r\n\t\t[XmlAttribute(\"简繁替换\")]\r\n\t\tpublic int TraditionalChineseConversion { get; set; }\r\n\t\t[XmlAttribute(\"数字替换\")]\r\n\t\tpublic int NumericWidthConversion { get; set; }\r\n\t\t[XmlAttribute(\"字母替换\")]\r\n\t\tpublic int AlphabeticWidthConversion { get; set; }\r\n\t\t[XmlAttribute(\"符号替换\")]\r\n\t\tpublic int PunctuationWidthConversion { get; set; }\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Options/ReaderOptions.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ReaderOptions\r\n\t{\r\n\t\t[XmlAttribute(\"整页翻页\")]\r\n\t\tpublic bool FullPageScroll { get; set; }\r\n\t\t[XmlAttribute(\"缩放状态\")]\r\n\t\tpublic string Zoom { get; set; }\r\n\t\t[XmlAttribute(\"滚动方向\")]\r\n\t\tpublic Functions.Editor.ContentDirection ContentDirection { get; set; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/ToolbarOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Windows.Forms;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ToolbarOptions\r\n\t{\r\n\t\t[XmlAttribute(\"显示主工具栏\")]\r\n\t\t[System.ComponentModel.DefaultValue(true)]\r\n\t\tpublic bool ShowGeneralToolbar { get; set; }\r\n\r\n\t\treadonly List<ButtonOption> _Buttons = new List<ButtonOption>();\r\n\t\t[XmlElement(\"按钮\")]\r\n\t\tpublic List<ButtonOption> Buttons => _Buttons;\r\n\r\n\t\tpublic ToolbarOptions() {\r\n\t\t\tShowGeneralToolbar = true;\r\n\t\t}\r\n\r\n\t\tpublic void Reset() {\r\n\t\t\tButtons.Clear();\r\n\t\t\tforeach (var item in Toolkit.Toolkits) {\r\n\t\t\t\tButtons.Add(new ButtonOption(item.Identifier, item.Name, item.ShowText, item.DefaultVisible));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void RemoveInvalidButtons() {\r\n\t\t\tif (_Buttons.Count == 0) {\r\n\t\t\t\tReset();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tfor (int i = Buttons.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (Buttons[i].GetToolkit() == null) {\r\n\t\t\t\t\tButtons.RemoveAt(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void AddMissedButtons() {\r\n\t\t\tforeach (var item in Toolkit.Toolkits) {\r\n\t\t\t\tforeach (var b in Buttons) {\r\n\t\t\t\t\tif (b.ID == item.Identifier) {\r\n\t\t\t\t\t\tgoto Next;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tButtons.Add(new ButtonOption(item.Identifier, item.Name, item.ShowText, false));\r\n\t\t\tNext:\r\n\t\t\t\t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic class ButtonOption\r\n\t\t{\r\n\t\t\tstring _Id;\r\n\t\t\t[XmlAttribute(\"ID\")]\r\n\t\t\tpublic string ID { get => _Id; set => _Id = (value == \"BookmarkEditor\" ? \"Editor\" : value); }\r\n\t\t\t[XmlAttribute(\"按钮名称\")]\r\n\t\t\tpublic string DisplayName { get; set; }\r\n\t\t\t[XmlAttribute(\"显示按钮文字\")]\r\n\t\t\tpublic bool ShowText { get; set; }\r\n\t\t\t[XmlAttribute(\"显示按钮\")]\r\n\t\t\tpublic bool Visible { get; set; }\r\n\r\n\t\t\tpublic ButtonOption() {\r\n\t\t\t}\r\n\t\t\tpublic ButtonOption(string id, string name, bool showText, bool visible) {\r\n\t\t\t\tID = id;\r\n\t\t\t\tDisplayName = name;\r\n\t\t\t\tShowText = showText;\r\n\t\t\t\tVisible = visible;\r\n\t\t\t}\r\n\r\n\t\t\tinternal Toolkit GetToolkit() {\r\n\t\t\t\treturn Toolkit.Get(ID);\r\n\t\t\t}\r\n\t\t\tinternal ToolStripButton CreateButton() {\r\n\t\t\t\tvar b = GetToolkit().CreateButton();\r\n\t\t\t\tb.Text = DisplayName;\r\n\t\t\t\tb.DisplayStyle = ShowText ? ToolStripItemDisplayStyle.ImageAndText : ToolStripItemDisplayStyle.Image;\r\n\t\t\t\treturn b;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/ViewerOptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Xml.Serialization;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class ViewerOptions\r\n\t{\r\n\t\t///<summary>获取或指定初始查看状态的值。</summary>\r\n\t\t[XmlAttribute(\"初始状态\")]\r\n\t\tpublic string InitialView { get; set; }\r\n\t\t///<summary>获取或指定双页阅读方向的值。</summary>\r\n\t\t[XmlAttribute(\"阅读方向\")]\r\n\t\tpublic string Direction { get; set; }\r\n\t\t///<summary>获取或指定阅读器初始模式的值。</summary>\r\n\t\t[XmlAttribute(\"初始模式\")]\r\n\t\tpublic string InitialMode { get; set; }\r\n\t\t///<summary>获取或指定是否删除 XYZ 目标的缩放比例，或将 Fit、FitH、FitV 转换为 XYZ。</summary>\r\n\t\t[XmlAttribute(\"删除缩放比例\")]\r\n\t\tpublic bool RemoveZoomRate { get; set; }\r\n\t\t[XmlAttribute(\"强制内部链接\")]\r\n\t\tpublic bool ForceInternalLink { get; set; }\r\n\t\t///<summary>获取或指定是否将书签状态设置为关闭。</summary>\r\n\t\t[XmlAttribute(\"书签状态\")]\r\n\t\tpublic BookmarkStatus CollapseBookmark { get; set; }\r\n\t\t[XmlAttribute(\"指定阅读器设置\")]\r\n\t\tpublic bool SpecifyViewerPreferences { get; set; }\r\n\t\t[XmlAttribute(\"隐藏菜单\")]\r\n\t\tpublic bool HideMenu { get; set; }\r\n\t\t[XmlAttribute(\"隐藏工具栏\")]\r\n\t\tpublic bool HideToolbar { get; set; }\r\n\t\t[XmlAttribute(\"隐藏程序界面\")]\r\n\t\tpublic bool HideUI { get; set; }\r\n\t\t[XmlAttribute(\"适合窗口\")]\r\n\t\tpublic bool FitWindow { get; set; }\r\n\t\t[XmlAttribute(\"窗口居中\")]\r\n\t\tpublic bool CenterWindow { get; set; }\r\n\t\t[XmlAttribute(\"显示文档标题\")]\r\n\t\tpublic bool DisplayDocTitle { get; set; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Options/WindowStatus.cs",
    "content": "﻿using System;\r\nusing System.Windows.Forms;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tpublic class WindowStatus\r\n\t{\r\n\t\t//[XmlAttribute(\"屏幕\")]\r\n\t\t//public int ScreenId { get; set; }\r\n\r\n\t\t[XmlAttribute(\"状态\")]\r\n\t\tpublic FormWindowState State { get; set; }\r\n\r\n\t\t[XmlAttribute(\"左\")]\r\n\t\tpublic int Left { get; set; }\r\n\r\n\t\t[XmlAttribute(\"上\")]\r\n\t\tpublic int Top { get; set; }\r\n\r\n\t\t[XmlAttribute(\"宽\")]\r\n\t\tpublic int Width { get; set; }\r\n\r\n\t\t[XmlAttribute(\"高\")]\r\n\t\tpublic int Height { get; set; }\r\n\r\n\t\tpublic int Right => Left + Width;\r\n\t\tpublic int Bottom => Top + Height;\r\n\r\n\t\tpublic WindowStatus() {}\r\n\r\n\t\tpublic WindowStatus(Form form) {\r\n\t\t\t//var s = Screen.FromControl(form);\r\n\t\t\t//ScreenId = Array.IndexOf(Screen.AllScreens, s);\r\n\t\t\tState = form.WindowState;\r\n\t\t\tLeft = form.Left;\r\n\t\t\tTop = form.Top;\r\n\t\t\tWidth = form.Width;\r\n\t\t\tHeight = form.Height;\r\n\t\t}\r\n\r\n\t\tpublic void Position(Form form) {\r\n\t\t\tvar a = Screen.FromControl(form).WorkingArea;\r\n\t\t\tif (a.IntersectsWith(new System.Drawing.Rectangle(Left, Top, Width, Height)) == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tform.StartPosition = FormStartPosition.Manual;\r\n\t\t\tform.WindowState = State == FormWindowState.Minimized ? FormWindowState.Normal : State;\r\n\t\t\tform.Left = Left;\r\n\t\t\tform.Top = Top;\r\n\t\t\tform.Width = Width;\r\n\t\t\tform.Height = Height;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/PDFPatcher.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProductVersion>9.0.30729</ProductVersion>\r\n    <SchemaVersion>2.0</SchemaVersion>\r\n    <ProjectGuid>{77A9FBD2-FB25-4590-864A-64A01A8724C4}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>PDFPatcher</RootNamespace>\r\n    <AssemblyName>PDFPatcher</AssemblyName>\r\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ApplicationIcon>PDFPatcher.ico</ApplicationIcon>\r\n    <SignAssembly>true</SignAssembly>\r\n    <IsWebBootstrapper>true</IsWebBootstrapper>\r\n    <AssemblyOriginatorKeyFile Condition=\" '$(Configuration)' == 'Release' and Exists('wmjordan.snk')\">wmjordan.snk</AssemblyOriginatorKeyFile>\r\n    <StartupObject>PDFPatcher.Program</StartupObject>\r\n    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>..\\bin\\Debug\\</OutputPath>\r\n    <DefineConstants>TRACE;DEBUG;NET40;SOURCE_INCLUDE</DefineConstants>\r\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <UseVSHostingProcess>false</UseVSHostingProcess>\r\n    <LangVersion>latest</LangVersion>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n    <OutputPath>..\\bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE;NET40;SOURCE_INCLUDE</DefineConstants>\r\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <UseVSHostingProcess>false</UseVSHostingProcess>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <LangVersion>latest</LangVersion>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationManifest>Common\\app.manifest</ApplicationManifest>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"CLR\">\r\n      <HintPath>Lib\\CLR.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"ColorPicker\">\r\n      <HintPath>Lib\\ColorPicker.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Cyotek.Windows.Forms.ImageBox\">\r\n      <HintPath>Lib\\Cyotek.Windows.Forms.ImageBox.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"FreeImageNET\">\r\n      <HintPath>Lib\\FreeImageNET.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer\">\r\n      <HintPath>Lib\\HtmlRenderer.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer.WinForms\">\r\n      <HintPath>Lib\\HtmlRenderer.WinForms.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"itextAsian\">\r\n      <HintPath>Lib\\itextAsian.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"itextsharp\">\r\n      <HintPath>Lib\\itextsharp.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"JacksonSoft.CustomTabControl\">\r\n      <HintPath>Lib\\JacksonSoft.CustomTabControl.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"MuPDFLib\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>Lib\\MuPDFLib.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"ObjectListView, Version=2.9.1.1072, Culture=neutral, PublicKeyToken=b1c5bf581481bcd4, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\ObjectListView.Official.2.9.1\\lib\\net20\\ObjectListView.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PowerJson\">\r\n      <HintPath>Lib\\PowerJson.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"System.XML\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Common\\StringBuilderCache.cs\" />\r\n    <Compile Include=\"Configuration.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Configuration.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Commands.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\AutoResizingTextBox.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\Commands\\InsertPageLabelCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\EditorCommands.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\ViewerScrollToBookmarkCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\IEditView.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Parts\\BookmarkInViewSynchronizer.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Parts\\BookmarkTitleEditHandler.cs\" />\r\n    <Compile Include=\"Functions\\FunctionTabContainer.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PatcherOptionsControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PatcherOptionsControl.Designer.cs\">\r\n      <DependentUpon>PatcherOptionsControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Model\\ResourceReference.cs\" />\r\n    <Compile Include=\"Options\\ReaderOptions.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\CleanContentStreamProcessor.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\FreeImageHelper.cs\" />\r\n    <Compile Include=\"Processor\\MuPdf\\MuPDFExtensions.cs\" />\r\n    <Compile Include=\"Processor\\OutlineManager.iText.cs\" />\r\n    <Compile Include=\"ShellHelper.cs\" />\r\n    <Compile Include=\"Common\\CommandRegistry.cs\" />\r\n    <Compile Include=\"Common\\FilePath.cs\" />\r\n    <Compile Include=\"Common\\FontHelper.cs\">\r\n    </Compile>\r\n    <Compile Include=\"Common\\FontUtility.cs\" />\r\n    <Compile Include=\"Common\\ObjectListViewHelper.cs\" />\r\n    <Compile Include=\"Common\\ShortcutFile.cs\" />\r\n    <Compile Include=\"Common\\StringHelper.cs\" />\r\n    <Compile Include=\"Common\\ValueHelper.cs\" />\r\n    <Compile Include=\"Common\\XmlHelper.cs\" />\r\n    <Compile Include=\"Functions\\DocumentOption\\FontCharSubstitutionForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\FontCharSubstitutionForm.Designer.cs\">\r\n      <DependentUpon>FontCharSubstitutionForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\Commands\\BookmarkActionCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\BookmarkLevelCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\BookmarkMarkerCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\BookmarkPageCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\BookmarkSelectionCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\BookmarkStyleCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\CopyBookmarkItemCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\DeleteBookmarkItemCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\DocumentPropertyCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\InsertBookmarkCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\OcrPageCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\SavePageImageCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\PagePropertiesCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\PasteBookmarkItemCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\QuickSelectCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\SaveDocumentCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\LoadDocumentCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\SimpleBookmarkCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\Commands\\ViewerCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\CustomPatternForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\CustomPatternForm.Designer.cs\">\r\n      <DependentUpon>CustomPatternForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\IEditorCommand.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\PagePropertyForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\PagePropertyForm.Designer.cs\">\r\n      <DependentUpon>PagePropertyForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\FormState.cs\" />\r\n    <Compile Include=\"Common\\ImageBox\\DragHandle.cs\" />\r\n    <Compile Include=\"Common\\ImageBox\\DragHandleAnchor.cs\" />\r\n    <Compile Include=\"Common\\ImageBox\\DragHandleCollection.cs\" />\r\n    <Compile Include=\"Common\\ImageBox\\ImageBoxEx.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Options\\ImageExtracterOptions.cs\" />\r\n    <Compile Include=\"Options\\WindowStatus.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveFormProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveEmptyCommandProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveWrappedCommandProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ImageExtractor.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\WuColorQuantizer.cs\" />\r\n    <Compile Include=\"Functions\\CustomizeToolbarForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\CustomizeToolbarForm.Designer.cs\">\r\n      <DependentUpon>CustomizeToolbarForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DraggableForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\AutoBookmarkForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\AutoBookmarkForm.Designer.cs\">\r\n      <DependentUpon>AutoBookmarkForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\DocumentInfoForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\DocumentInfoForm.Designer.cs\">\r\n      <DependentUpon>DocumentInfoForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\InsertPageLabelForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\InsertPageLabelForm.Designer.cs\">\r\n      <DependentUpon>InsertPageLabelForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\Controller.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\EditModel.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\ViewerStructures.cs\" />\r\n    <Compile Include=\"Functions\\HtmlPageControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\IDocumentEditor.cs\" />\r\n    <Compile Include=\"Options\\ToolbarOptions.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\BitmapHelper.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ChangePageCoordinateProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ClearDestinationOffsetProcessor.cs\" />\r\n    <Compile Include=\"Processor\\MuPdf\\PageLabelCollection.cs\" />\r\n    <Compile Include=\"Processor\\MuPdf\\RenderResultCache.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\DoubleClickableRadioButton.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\InsertBookmarkForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\InsertBookmarkForm.Designer.cs\">\r\n      <DependentUpon>InsertBookmarkForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\CustomButton\\GlassButton.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\FileListHelper.cs\" />\r\n    <Compile Include=\"Functions\\FrontPageControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\FrontPageControl.Designer.cs\">\r\n      <DependentUpon>FrontPageControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\DocumentFontListForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\DocumentFontListForm.Designer.cs\">\r\n      <DependentUpon>DocumentFontListForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspector\\AddPdfObjectForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspector\\AddPdfObjectForm.Designer.cs\">\r\n      <DependentUpon>AddPdfObjectForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\EditAdjustmentForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\EditAdjustmentForm.Designer.cs\">\r\n      <DependentUpon>EditAdjustmentForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\FontFilterForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\FontFilterForm.Designer.cs\">\r\n      <DependentUpon>FontFilterForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\FontNameConditionEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\FontNameConditionEditor.Designer.cs\">\r\n      <DependentUpon>FontNameConditionEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\PageSettingsEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\PageSettingsEditor.Designer.cs\">\r\n      <DependentUpon>PageSettingsEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\FontSubstitutionsEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\FontSubstitutionsEditor.Designer.cs\">\r\n      <DependentUpon>FontSubstitutionsEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\FunctionControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspector\\ImageViewerForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspector\\ImageViewerForm.Designer.cs\">\r\n      <DependentUpon>ImageViewerForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\SavePdfForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\SavePdfForm.Designer.cs\">\r\n      <DependentUpon>SavePdfForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\MergerOptionForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\MergerOptionForm.Designer.cs\">\r\n      <DependentUpon>MergerOptionForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\InfoExchangerControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\InfoExchangerControl.Designer.cs\">\r\n      <DependentUpon>InfoExchangerControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RecentFileMenuHelper.cs\" />\r\n    <Compile Include=\"Functions\\RenameControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RenameControl.Designer.cs\">\r\n      <DependentUpon>RenameControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\ViewerControl.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\TextSizeConditionEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\TextSizeConditionEditor.Designer.cs\">\r\n      <DependentUpon>TextSizeConditionEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\IResettableControl.cs\" />\r\n    <Compile Include=\"Functions\\ITextInfoFilterEditor.cs\">\r\n    </Compile>\r\n    <Compile Include=\"Functions\\OcrControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\OcrControl.Designer.cs\">\r\n      <DependentUpon>OcrControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\PageRangeConditionEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\PageRangeConditionEditor.Designer.cs\">\r\n      <DependentUpon>PageRangeConditionEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\TextConditionEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\TextConditionEditor.Designer.cs\">\r\n      <DependentUpon>TextConditionEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspectorControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspectorControl.Designer.cs\">\r\n      <DependentUpon>DocumentInspectorControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\TextPositionConditionEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmark\\TextPositionConditionEditor.Designer.cs\">\r\n      <DependentUpon>TextPositionConditionEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspector\\TextViewerForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentInspector\\TextViewerForm.Designer.cs\">\r\n      <DependentUpon>TextViewerForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RenderImageControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RenderImageControl.Designer.cs\">\r\n      <DependentUpon>RenderImageControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\MergerControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\MergerControl.Designer.cs\">\r\n      <DependentUpon>MergerControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\SourcePdfOptionForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\SourcePdfOptionForm.Designer.cs\">\r\n      <DependentUpon>SourcePdfOptionForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\UpdateForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\UpdateForm.Designer.cs\">\r\n      <DependentUpon>UpdateForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Model\\AutoBookmarkCondition.cs\" />\r\n    <Compile Include=\"Model\\AutoBookmarkContext.cs\" />\r\n    <Compile Include=\"Model\\BookmarkSettings.cs\" />\r\n    <Compile Include=\"Model\\InsertBookmarkPositionType.cs\" />\r\n    <Compile Include=\"Model\\PageBoxSettings.cs\" />\r\n    <Compile Include=\"Model\\PageFilterFlag.cs\" />\r\n    <Compile Include=\"Model\\PdfDocumentFont.cs\" />\r\n    <Compile Include=\"Model\\PageResizing.cs\" />\r\n    <Compile Include=\"Model\\PdfInfoXmlDocument.cs\" />\r\n    <Compile Include=\"Model\\PdfModelHelper.cs\" />\r\n    <Compile Include=\"Options\\DocumentOptions.cs\" />\r\n    <Compile Include=\"Options\\ViewerOptions.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\LevelUpProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\ReplaceFontProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveBookmarkProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\ColorizeBinaryImageProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\FixContentProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\PageDimensionProcessor.cs\" />\r\n    <Compile Include=\"Processor\\DocProcessorContext.cs\" />\r\n    <Compile Include=\"Model\\DocumentObject.cs\" />\r\n    <Compile Include=\"Model\\ITextRegion.cs\" />\r\n    <Compile Include=\"Model\\IHierarchicalObject.cs\" />\r\n    <Compile Include=\"Processor\\DocumentSink.cs\" />\r\n    <Compile Include=\"Processor\\OutlineManager.cs\" />\r\n    <Compile Include=\"Processor\\PageProcessorContext.cs\" />\r\n    <Compile Include=\"Model\\PdfImageData.cs\" />\r\n    <Compile Include=\"Model\\PdfNavigator.cs\" />\r\n    <Compile Include=\"Model\\PdfObjectType.cs\" />\r\n    <Compile Include=\"Model\\PdfPageCommand.cs\" />\r\n    <Compile Include=\"Model\\PdfPathDocument.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\Context.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\IPathAxis.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\IPathFunction.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\IPathPredicate.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\IPathValue.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\PathAxes.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\PathAxisType.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\PathValue.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\PathValueType.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\PredicateOperatorType.cs\" />\r\n    <Compile Include=\"Model\\PdfStructInfo.cs\" />\r\n    <Compile Include=\"Options\\EncodingOptions.cs\" />\r\n    <Compile Include=\"Options\\AutoBookmarkOptions.cs\" />\r\n    <Compile Include=\"Common\\PInvokeHelper.cs\" />\r\n    <Compile Include=\"ConfigurationSerialization.cs\" />\r\n    <Compile Include=\"Functions\\Editor\\ActionEditorForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\ActionEditorForm.Designer.cs\">\r\n      <DependentUpon>ActionEditorForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\BookmarkEditorView.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\BookmarkEditorView.Designer.cs\">\r\n      <DependentUpon>BookmarkEditorView.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\EditorControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\EditorControl.Designer.cs\">\r\n      <DependentUpon>EditorControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\DocumentInfoEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\DocumentInfoEditor.Designer.cs\">\r\n      <DependentUpon>DocumentInfoEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\HistoryComboBox.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\MacroMenu.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\NewCoordinateEntryForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\NewCoordinateEntryForm.Designer.cs\">\r\n      <DependentUpon>NewCoordinateEntryForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\PageLabelEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\DocumentOption\\PageLabelEditor.Designer.cs\">\r\n      <DependentUpon>PageLabelEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RenamePreviewForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RenamePreviewForm.Designer.cs\">\r\n      <DependentUpon>RenamePreviewForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\RichTextBoxEx.cs\">\r\n      <SubType>Component</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\SearchBookmarkForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\SearchBookmarkForm.Designer.cs\">\r\n      <DependentUpon>SearchBookmarkForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\ShiftPageNumberEntryForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\ShiftPageNumberEntryForm.Designer.cs\">\r\n      <DependentUpon>ShiftPageNumberEntryForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ExtractImageControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ExtractImageControl.Designer.cs\">\r\n      <DependentUpon>ExtractImageControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\SourceImageOptionForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\SourceImageOptionForm.Designer.cs\">\r\n      <DependentUpon>SourceImageOptionForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AppOptionForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AppOptionForm.Designer.cs\">\r\n      <DependentUpon>AppOptionForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ViewerPreferenceEditor.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ViewerPreferenceEditor.Designer.cs\">\r\n      <DependentUpon>ViewerPreferenceEditor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmarkControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AutoBookmarkControl.Designer.cs\">\r\n      <DependentUpon>AutoBookmarkControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\ZoomRateEntryForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\Editor\\ZoomRateEntryForm.Designer.cs\">\r\n      <DependentUpon>ZoomRateEntryForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"MainForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"MainForm.Designer.cs\">\r\n      <DependentUpon>MainForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Model\\BookmarkStatus.cs\" />\r\n    <Compile Include=\"Model\\DistanceInfo.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\CIELab.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\CIEXYZ.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\CMYK.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\ColorSpaceHelper.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\HSB.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\HSL.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\RGB.cs\" />\r\n    <Compile Include=\"Model\\ColorSpaces\\YUV.cs\" />\r\n    <Compile Include=\"Options\\ExtractPageOptions.cs\" />\r\n    <Compile Include=\"Options\\OcrOptions.cs\" />\r\n    <Compile Include=\"Processor\\MuPdf\\ImageRendererOptions.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\FontNameFilter.cs\" />\r\n    <Compile Include=\"Model\\FontInfo.cs\" />\r\n    <Compile Include=\"Model\\Margins.cs\" />\r\n    <Compile Include=\"Model\\MatchPattern.cs\" />\r\n    <Compile Include=\"Model\\PageLabel.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Model\\PageSettings.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Model\\CoordinateTranslationSettings.cs\" />\r\n    <Compile Include=\"Model\\PaperSize.cs\" />\r\n    <Compile Include=\"Options\\PatcherOptions.cs\" />\r\n    <Compile Include=\"Model\\Bound.cs\" />\r\n    <Compile Include=\"Model\\TextInfo.cs\" />\r\n    <Compile Include=\"Model\\TextRegion.cs\" />\r\n    <Compile Include=\"Model\\WritingDirection.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkCreator.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\MultiConditionFilter.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\AutoBookmarkFilter.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\TextFilter.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\TextPositionFilter.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\TextSizeFilter.cs\" />\r\n    <Compile Include=\"Processor\\AutoBookmarkFilters\\PageRangeFilter.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\BookmarkMatcher.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\IPdfInfoXmlProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\UndoAction.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\DestinationGotoTopProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\BookmarkOpenStatusProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\SetCaseProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ChangeCoordinateProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ChangePageNumberProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ChangeZoomRateProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\SetTextColorProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\SetTextStyleProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ReplaceTitleTextProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\ForceInternalLinkProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoXmlProcessors\\LevelDownProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\ImageRecompressor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\IPageProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveAnnotationProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveDictionaryItemProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\IDocProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\CommonProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\ImportOcrResultProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveThumbnailProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ContentProcessors\\RemoveTextBlockProcessor.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\ImageDisposition.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\ImageInfo.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\TiffHelper.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\JpgHelper.cs\" />\r\n    <Compile Include=\"Processor\\InfoDocProcessor\\CollapseBookmarkProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoDocProcessor\\ConvertUnitProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoDocProcessor\\GotoDestinationProcessor.cs\" />\r\n    <Compile Include=\"Processor\\IInfoDocProcessor.cs\" />\r\n    <Compile Include=\"Processor\\InfoDocProcessor\\ForceInternalDestinationProcessor.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\JBig2Decoder.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\JBig2Encoder.cs\" />\r\n    <Compile Include=\"Processor\\Imaging\\JBig2Structs.cs\" />\r\n    <Compile Include=\"Processor\\IProcessor.cs\" />\r\n    <Compile Include=\"Processor\\ModiOcr.cs\" />\r\n    <Compile Include=\"Processor\\OcrProcessor.cs\" />\r\n    <Compile Include=\"Processor\\OperatorGroup.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\IPathExpression.cs\" />\r\n    <Compile Include=\"Model\\PdfPath\\PathCompiler.cs\" />\r\n    <Compile Include=\"Processor\\PdfActionExporter.cs\" />\r\n    <Compile Include=\"Processor\\PdfContentStreamParser.cs\" />\r\n    <Compile Include=\"Model\\GeneralInfo.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Model\\GraphicsState.cs\" />\r\n    <Compile Include=\"Model\\UnitConverter.cs\" />\r\n    <Compile Include=\"Processor\\InfoDocProcessor\\RemoveZoomRateProcessor.cs\" />\r\n    <Compile Include=\"Processor\\PdfPageCommandProcessor.cs\" />\r\n    <Compile Include=\"Processor\\PdfPageExtractor.cs\" />\r\n    <Compile Include=\"Processor\\PdfProcessingEngine.cs\" />\r\n    <Compile Include=\"Model\\SourceItem.cs\" />\r\n    <Compile Include=\"Functions\\AboutControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\AboutControl.Designer.cs\">\r\n      <DependentUpon>AboutControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Common\\FileHelper.cs\" />\r\n    <Compile Include=\"Functions\\BookmarkControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\BookmarkControl.Designer.cs\">\r\n      <DependentUpon>BookmarkControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PatcherOptionForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PatcherOptionForm.Designer.cs\">\r\n      <DependentUpon>PatcherOptionForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ListViewItemComparer.cs\" />\r\n    <Compile Include=\"Functions\\TargetFileControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\TargetFileControl.Designer.cs\">\r\n      <DependentUpon>TargetFileControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PatcherControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PatcherControl.Designer.cs\">\r\n      <DependentUpon>PatcherControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Model\\PageRangeCollection.cs\" />\r\n    <Compile Include=\"Options\\MergerOptions.cs\" />\r\n    <Compile Include=\"Processor\\PdfContentExport.cs\" />\r\n    <Compile Include=\"Processor\\PdfDocumentCreator.cs\" />\r\n    <Compile Include=\"Processor\\InfoDocProcessor\\ShiftPageProcessor.cs\" />\r\n    <Compile Include=\"Model\\TextLine.cs\" />\r\n    <Compile Include=\"Processor\\SourceItemSerializer.cs\" />\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Toolkit.cs\" />\r\n    <Compile Include=\"Tracker.cs\" />\r\n    <Compile Include=\"AppContext.cs\" />\r\n    <Compile Include=\"Common\\FormHelper.cs\" />\r\n    <Compile Include=\"Common\\DualKeyDictionary.cs\" />\r\n    <Compile Include=\"Constants.cs\" />\r\n    <Compile Include=\"Functions\\InfoFileOptionControl.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\InfoFileOptionControl.Designer.cs\">\r\n      <DependentUpon>InfoFileOptionControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Options\\ExporterOptions.cs\" />\r\n    <Compile Include=\"Processor\\NullXmlWriter.cs\" />\r\n    <Compile Include=\"Functions\\PasswordEntryForm.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\PasswordEntryForm.Designer.cs\">\r\n      <DependentUpon>PasswordEntryForm.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Processor\\DocInfoExporter.cs\" />\r\n    <Compile Include=\"Processor\\PdfHelper.cs\" />\r\n    <Compile Include=\"Processor\\DocInfoImporter.cs\" />\r\n    <Compile Include=\"Processor\\Worker.cs\" />\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <EmbeddedResource Include=\"Configuration.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Configuration.Designer.cs</LastGenOutput>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentOption\\FontCharSubstitutionForm.resx\">\r\n      <DependentUpon>FontCharSubstitutionForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\AutoBookmarkForm.resx\">\r\n      <DependentUpon>AutoBookmarkForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\CustomPatternForm.resx\">\r\n      <DependentUpon>CustomPatternForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\DocumentInfoForm.resx\">\r\n      <DependentUpon>DocumentInfoForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\InsertBookmarkForm.resx\">\r\n      <DependentUpon>InsertBookmarkForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\CustomizeToolbarForm.resx\">\r\n      <DependentUpon>CustomizeToolbarForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\InsertPageLabelForm.resx\">\r\n      <DependentUpon>InsertPageLabelForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\PagePropertyForm.resx\">\r\n      <DependentUpon>PagePropertyForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\FrontPageControl.resx\">\r\n      <DependentUpon>FrontPageControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AboutControl.resx\">\r\n      <DependentUpon>AboutControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\ActionEditorForm.resx\">\r\n      <DependentUpon>ActionEditorForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\BookmarkEditorView.resx\">\r\n      <DependentUpon>BookmarkEditorView.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\EditorControl.resx\">\r\n      <DependentUpon>EditorControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentOption\\DocumentInfoEditor.resx\">\r\n      <DependentUpon>DocumentInfoEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\EditAdjustmentForm.resx\">\r\n      <DependentUpon>EditAdjustmentForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\InfoFileOptionControl.resx\">\r\n      <DependentUpon>InfoFileOptionControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\InfoExchangerControl.resx\">\r\n      <DependentUpon>InfoExchangerControl.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\PatcherOptionsControl.resx\">\r\n      <DependentUpon>PatcherOptionsControl.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\RenameControl.resx\">\r\n      <DependentUpon>RenameControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\PatcherControl.resx\">\r\n      <DependentUpon>PatcherControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\BookmarkControl.resx\">\r\n      <DependentUpon>BookmarkControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\PatcherOptionForm.resx\">\r\n      <DependentUpon>PatcherOptionForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\FontFilterForm.resx\">\r\n      <DependentUpon>FontFilterForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\FontNameConditionEditor.resx\">\r\n      <DependentUpon>FontNameConditionEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentInspector\\ImageViewerForm.resx\">\r\n      <DependentUpon>ImageViewerForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\SavePdfForm.resx\">\r\n      <DependentUpon>SavePdfForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\TextSizeConditionEditor.resx\">\r\n      <DependentUpon>TextSizeConditionEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\NewCoordinateEntryForm.resx\">\r\n      <DependentUpon>NewCoordinateEntryForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentOption\\PageLabelEditor.resx\">\r\n      <DependentUpon>PageLabelEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\RenamePreviewForm.resx\">\r\n      <DependentUpon>RenamePreviewForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\SearchBookmarkForm.resx\">\r\n      <DependentUpon>SearchBookmarkForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\ShiftPageNumberEntryForm.resx\">\r\n      <DependentUpon>ShiftPageNumberEntryForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\TargetFileControl.resx\">\r\n      <DependentUpon>TargetFileControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\ExtractImageControl.resx\">\r\n      <DependentUpon>ExtractImageControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\SourceImageOptionForm.resx\">\r\n      <DependentUpon>SourceImageOptionForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AppOptionForm.resx\">\r\n      <DependentUpon>AppOptionForm.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\ViewerPreferenceEditor.resx\">\r\n      <DependentUpon>ViewerPreferenceEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmarkControl.resx\">\r\n      <DependentUpon>AutoBookmarkControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\PasswordEntryForm.resx\">\r\n      <DependentUpon>PasswordEntryForm.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\Editor\\ZoomRateEntryForm.resx\">\r\n      <DependentUpon>ZoomRateEntryForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\OcrControl.resx\">\r\n      <DependentUpon>OcrControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\PageRangeConditionEditor.resx\">\r\n      <DependentUpon>PageRangeConditionEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\TextConditionEditor.resx\">\r\n      <DependentUpon>TextConditionEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentInspectorControl.resx\">\r\n      <DependentUpon>DocumentInspectorControl.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"MainForm.resx\">\r\n      <DependentUpon>MainForm.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <SubType>Designer</SubType>\r\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\SourceFileControl.resx\">\r\n      <DependentUpon>SourceFileControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\ExtractPageControl.resx\">\r\n      <DependentUpon>ExtractPageControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\ReportControl.resx\">\r\n      <DependentUpon>ReportControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <Compile Include=\"Model\\PageRange.cs\" />\r\n    <Compile Include=\"Functions\\SourceFileControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\SourceFileControl.Designer.cs\">\r\n      <DependentUpon>SourceFileControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ExtractPageControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ExtractPageControl.Designer.cs\">\r\n      <DependentUpon>ExtractPageControl.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Options\\ImporterOptions.cs\" />\r\n    <Compile Include=\"Functions\\ReportControl.cs\">\r\n      <SubType>UserControl</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Functions\\ReportControl.Designer.cs\">\r\n      <DependentUpon>ReportControl.cs</DependentUpon>\r\n    </Compile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Content Include=\"..\\授权协议.txt\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"..\\更新历史.txt\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <None Include=\".editorconfig\" />\r\n    <None Include=\"Resources\\clock.png\" />\r\n    <None Include=\"Resources\\arrow-continue-090.png\" />\r\n    <None Include=\"Common\\app.manifest\" />\r\n    <None Include=\"donation.png\" />\r\n    <Content Include=\"Functions\\AboutPage.html\">\r\n      <SubType>Designer</SubType>\r\n    </Content>\r\n    <Content Include=\"Functions\\FrontPage.html\">\r\n      <SubType>Designer</SubType>\r\n    </Content>\r\n    <None Include=\"app.config\" />\r\n    <None Include=\"packages.config\" />\r\n    <None Include=\"Resources\\pdf.png\" />\r\n    <None Include=\"wmjordan.snk\" Condition=\" '$(Configuration)' == 'Release' and Exists('wmjordan.snk')\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <EmbeddedResource Include=\"Functions\\DocumentOption\\DocumentFontListForm.resx\">\r\n      <DependentUpon>DocumentFontListForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentInspector\\AddPdfObjectForm.resx\">\r\n      <DependentUpon>AddPdfObjectForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentOption\\PageSettingsEditor.resx\">\r\n      <DependentUpon>PageSettingsEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentOption\\FontSubstitutionsEditor.resx\">\r\n      <DependentUpon>FontSubstitutionsEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\MergerOptionForm.resx\">\r\n      <DependentUpon>MergerOptionForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\AutoBookmark\\TextPositionConditionEditor.resx\">\r\n      <DependentUpon>TextPositionConditionEditor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\DocumentInspector\\TextViewerForm.resx\">\r\n      <DependentUpon>TextViewerForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\RenderImageControl.resx\">\r\n      <DependentUpon>RenderImageControl.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\MergerControl.resx\">\r\n      <DependentUpon>MergerControl.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\SourcePdfOptionForm.resx\">\r\n      <DependentUpon>SourcePdfOptionForm.cs</DependentUpon>\r\n      <SubType>Designer</SubType>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Functions\\UpdateForm.resx\">\r\n      <DependentUpon>UpdateForm.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n    <EmbeddedResource Include=\"Model\\PDFStructInfo.xml\" />\r\n    <Content Include=\"PDFPatcher.ico\" />\r\n    <Content Include=\"pdf_icon.ico\" />\r\n    <None Include=\"Resources\\096.png\" />\r\n    <None Include=\"Resources\\107.png\" />\r\n    <None Include=\"Resources\\108.png\" />\r\n    <None Include=\"Resources\\101.png\" />\r\n    <None Include=\"Resources\\103.png\" />\r\n    <None Include=\"Resources\\layer-rotate-left.png\" />\r\n    <None Include=\"Resources\\layer-rotate.png\" />\r\n    <None Include=\"Resources\\document-bookmark.png\" />\r\n    <None Include=\"Resources\\document-pdf-text.png\" />\r\n    <None Include=\"Resources\\document-export.png\" />\r\n    <None Include=\"Resources\\document-pdf.png\" />\r\n    <None Include=\"Resources\\document-import.png\" />\r\n    <None Include=\"Resources\\document-text.png\" />\r\n    <None Include=\"Resources\\document-convert.png\" />\r\n    <None Include=\"Resources\\image--arrow.png\" />\r\n    <None Include=\"Resources\\document--arrow.png\" />\r\n    <None Include=\"Resources\\arrow-stop-180.png\" />\r\n    <None Include=\"Resources\\edit-list-order.png\" />\r\n    <None Include=\"Resources\\table-select-row.png\" />\r\n    <None Include=\"Resources\\document.png\" />\r\n    <None Include=\"Resources\\document-number.png\" />\r\n    <None Include=\"Resources\\documents.png\" />\r\n    <None Include=\"Resources\\document-bookmark-export.png\" />\r\n    <None Include=\"Resources\\document-bookmark-import.png\" />\r\n    <None Include=\"Resources\\book-open-text-image.png\" />\r\n    <None Include=\"Resources\\document-pdf-number.png\" />\r\n    <None Include=\"Resources\\folder-open-image.png\" />\r\n    <None Include=\"Resources\\ui-text-field-select.png\" />\r\n    <None Include=\"Resources\\arrow-circle-double.png\" />\r\n    <None Include=\"Resources\\blue-folder-open-document.png\" />\r\n    <None Include=\"Resources\\arrow-000-medium.png\" />\r\n    <None Include=\"Resources\\arrow-180-medium.png\" />\r\n    <None Include=\"Resources\\palette.png\" />\r\n    <None Include=\"Resources\\edit-italic.png\" />\r\n    <None Include=\"Resources\\edit-bold.png\" />\r\n    <None Include=\"Resources\\notebook--pencil.png\" />\r\n    <None Include=\"Resources\\magnifier--pencil.png\" />\r\n    <None Include=\"Resources\\arrow-circle-225-left.png\" />\r\n    <None Include=\"Resources\\exclamation-red-frame.png\" />\r\n    <None Include=\"Resources\\table-select-all.png\" />\r\n    <None Include=\"Resources\\bookmark--pencil.png\" />\r\n    <None Include=\"Resources\\bookmarks.png\" />\r\n    <None Include=\"Resources\\bookmark--minus.png\" />\r\n    <None Include=\"Resources\\folder-open.png\" />\r\n    <None Include=\"Resources\\edit-uppercase.png\" />\r\n    <None Include=\"Resources\\arrow-merge-180-left.png\" />\r\n    <None Include=\"Resources\\ui-scroll-pane-both.png\" />\r\n    <None Include=\"Resources\\magnifier-zoom.png\" />\r\n    <None Include=\"Resources\\edit-replace.png\" />\r\n    <None Include=\"Resources\\document-copy.png\" />\r\n    <None Include=\"Resources\\clipboard-paste.png\" />\r\n    <None Include=\"Resources\\Ocr.png\" />\r\n    <None Include=\"Resources\\inbox-document-text.png\" />\r\n    <None Include=\"Resources\\ImportOcr.png\" />\r\n    <None Include=\"Resources\\toggle.png\" />\r\n    <None Include=\"Resources\\toggle-expand.png\" />\r\n    <None Include=\"Resources\\document-text-image.png\" />\r\n    <None Include=\"Resources\\application-list.png\" />\r\n    <None Include=\"Resources\\application-task.png\" />\r\n    <None Include=\"Resources\\DocumentInspector.png\" />\r\n    <None Include=\"Resources\\PdfOptions.png\" />\r\n    <None Include=\"Resources\\InfoFileOptions.png\" />\r\n    <None Include=\"Resources\\wand-magic.png\" />\r\n    <None Include=\"Resources\\document-processor.png\" />\r\n    <None Include=\"Resources\\page-processor.png\" />\r\n    <None Include=\"Resources\\document-merge.png\" />\r\n    <None Include=\"Resources\\node-insert-next.png\" />\r\n    <None Include=\"Resources\\document-image.png\" />\r\n    <None Include=\"Resources\\fonts.png\" />\r\n    <None Include=\"Resources\\arrow-stop-090.png\" />\r\n    <None Include=\"Resources\\arrow-stop-270.png\" />\r\n    <None Include=\"Resources\\alphabetic-sort.png\" />\r\n    <None Include=\"Resources\\natural-sort.png\" />\r\n    <None Include=\"Resources\\document-number-1.png\" />\r\n    <None Include=\"Resources\\document-number-2.png\" />\r\n    <None Include=\"Resources\\image.png\" />\r\n    <None Include=\"Resources\\image-vertical.png\" />\r\n    <None Include=\"Resources\\home.png\" />\r\n    <None Include=\"Resources\\arrow-045-small.png\" />\r\n    <None Include=\"Resources\\xfn-colleague-met.png\" />\r\n    <None Include=\"Resources\\user-black.png\" />\r\n    <None Include=\"Resources\\application-home.png\" />\r\n    <None Include=\"Resources\\document-rename.png\" />\r\n    <None Include=\"Resources\\ui-scroll-bar.png\" />\r\n    <None Include=\"Resources\\ui-scroll-bar-horizontal.png\" />\r\n    <None Include=\"Resources\\disk-rename.png\" />\r\n    <None Include=\"Resources\\color.png\" />\r\n    <None Include=\"Resources\\grayscale.png\" />\r\n    <None Include=\"Resources\\ui-color-picker-switch.png\" />\r\n    <None Include=\"Resources\\cursor.png\" />\r\n    <None Include=\"Resources\\arrow-move.png\" />\r\n    <None Include=\"Resources\\ui-check-boxes-series.png\" />\r\n    <None Include=\"Resources\\property.png\" />\r\n    <None Include=\"Resources\\pin.png\" />\r\n    <None Include=\"Resources\\spectacle-sunglass.png\" />\r\n    <None Include=\"Resources\\leaf.png\" />\r\n    <None Include=\"Resources\\document-bookmark-wand.png\" />\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n  <Target Name=\"CopyCustomContent\" AfterTargets=\"BeforeBuild\">\r\n    <Copy SourceFiles=\"Lib\\MuPDFLib.dll\" DestinationFolder=\"$(OutDir)\" SkipUnchangedFiles=\"true\" />\r\n    <Copy SourceFiles=\"Lib\\FreeImage.dll\" DestinationFolder=\"$(OutDir)\" SkipUnchangedFiles=\"true\" />\r\n  </Target>\r\n  <PropertyGroup>\r\n    <PostBuildEvent>\r\n    </PostBuildEvent>\r\n    <PreBuildEvent>\r\n    </PreBuildEvent>\r\n  </PropertyGroup>\r\n  <Import Project=\"..\\packages\\ILRepack.Lib.MSBuild.Task.2.0.34.2\\build\\ILRepack.Lib.MSBuild.Task.targets\" Condition=\"Exists('..\\packages\\ILRepack.Lib.MSBuild.Task.2.0.34.2\\build\\ILRepack.Lib.MSBuild.Task.targets')\" />\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\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>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\packages\\ILRepack.Lib.MSBuild.Task.2.0.34.2\\build\\ILRepack.Lib.MSBuild.Task.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\ILRepack.Lib.MSBuild.Task.2.0.34.2\\build\\ILRepack.Lib.MSBuild.Task.targets'))\" />\r\n  </Target>\r\n</Project>"
  },
  {
    "path": "App/Processor/AutoBookmarkCreator.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\nusing iTextSharp.text.pdf.parser;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class AutoBookmarkCreator\r\n\t{\r\n\t\tsealed class SizeOccurrence(float size, int page, string instance)\r\n\t\t{\r\n\t\t\tpublic float Size { get; set; } = size;\r\n\t\t\tpublic int FirstPage { get; set; } = page;\r\n\t\t\tpublic string FirstInstance { get; set; } = instance.Length > 50 ? instance.Substring(0, 50) : instance;\r\n\t\t\tpublic int Occurrence { get; set; } = 1;\r\n\t\t}\r\n\r\n\t\tsealed class FontOccurrence\r\n\t\t{\r\n\t\t\treadonly Dictionary<string, List<SizeOccurrence>> oc = new Dictionary<string, List<SizeOccurrence>>();\r\n\t\t\tinternal List<SizeOccurrence> GetOccurrence(string fontName) {\r\n\t\t\t\treturn oc.TryGetValue(fontName, out List<SizeOccurrence> s) ? s : null;\r\n\t\t\t}\r\n\r\n\t\t\tinternal void AddOccurrence(string fontName, float size, int page, string instance) {\r\n\t\t\t\tif (oc.ContainsKey(fontName) == false) {\r\n\t\t\t\t\toc.Add(fontName, new List<SizeOccurrence>() { new SizeOccurrence(size, page, instance) });\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar o = oc[fontName].Find((s) => s.Size == size);\r\n\t\t\t\t\tif (o != null) {\r\n\t\t\t\t\t\to.Occurrence++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\toc[fontName].Add(new SizeOccurrence(size, page, instance));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst string __AddSpaceAfterCharacters = \":.,\\\"'?!)]};\";\r\n\t\tconst string __InsertSpaceBeforeCharacters = \"\\\"'([{\";\r\n\r\n\t\treadonly PdfReader _reader;\r\n\t\treadonly AutoBookmarkOptions _options;\r\n\t\tconst int OpenWorkload = 10;\r\n\r\n\t\tpublic AutoBookmarkCreator(PdfReader reader, AutoBookmarkOptions options) {\r\n\t\t\t_reader = reader;\r\n\t\t\t_options = options;\r\n\t\t\tTextLine.DefaultDirection = options.WritingDirection;\r\n\t\t}\r\n\r\n\t\tinternal int EstimateWorkload() {\r\n\t\t\tvar n = _reader.NumberOfPages;\r\n\t\t\tvar load = 0;\r\n\t\t\tload += OpenWorkload;\r\n\t\t\tvar t = PageRangeCollection.Parse(_options.PageRanges, 1, n, true).TotalPages;\r\n\t\t\tload += t > 0 ? t : n;\r\n\t\t\treturn load;\r\n\t\t}\r\n\r\n\t\tinternal void ExportAutoBookmarks(XmlWriter w, AutoBookmarkOptions options) {\r\n\t\t\tAutoCreateBookmarks(w, _reader, options);\r\n\t\t}\r\n\r\n\t\tinternal void AutoCreateBookmarks(XmlWriter writer, PdfReader reader, AutoBookmarkOptions options) {\r\n\t\t\tTracker.IncrementProgress(OpenWorkload);\r\n\t\t\tint pn = reader.NumberOfPages + 1;\r\n\t\t\tvar c = new AutoBookmarkContext() { TotalPageNumber = reader.NumberOfPages };\r\n\t\t\tvar p = new TextToBookmarkProcessor(options, c);\r\n\t\t\tvar lp = new LevelProcessor(options.LevelAdjustment);\r\n\t\t\tvar ranges = PageRangeCollection.Parse(options.PageRanges, 1, reader.NumberOfPages, true);\r\n\t\t\tvar doc = new XmlDocument();\r\n\t\t\tvar be = doc.AppendChild(doc.CreateElement(Constants.Bookmark)) as XmlElement;\r\n\t\t\tfloat size = -1;\r\n\t\t\tvar sizes = new Stack<float>();\r\n\t\t\tfloat yOffset = 1 + options.YOffset;\r\n\t\t\tint level = 0;\r\n\t\t\tconst string indentString = \"　　　　　　　　　　\";\r\n\t\t\tList<MatchPattern.IMatcher> ig;\r\n\t\t\tvar fontOccurrences = new FontOccurrence();\r\n\t\t\tif (options.IgnorePatterns.Count == 0) {\r\n\t\t\t\tig = null;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tig = new List<MatchPattern.IMatcher>();\r\n\t\t\t\tforeach (var item in options.IgnorePatterns) {\r\n\t\t\t\t\tif (String.IsNullOrEmpty(item.Text)) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tig.Add(item.CreateMatcher());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (ArgumentException ex) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, (String.Concat(\"忽略文本（\", item, \"）无效：\", ex.Message)));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tXmlWriter oldWriter = null;\r\n\t\t\tif (options.ExportTextCoordinates == false) {\r\n\t\t\t\toldWriter = writer;\r\n\t\t\t\twriter = new NullXmlWriter();\r\n\t\t\t}\r\n\t\t\tforeach (PageRange r in ranges) {\r\n\t\t\t\tfor (int i = r.StartValue; i <= r.EndValue && i < pn; i++) {\r\n\t\t\t\t\tif (i == 1 && options.CreateBookmarkForFirstPage) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//Tracker.TraceMessage (String.Concat (\"分析第 \", i, \" 页。\"));\r\n\t\t\t\t\tvar box = reader.GetCropBox(i);\r\n\t\t\t\t\tp.Reset();\r\n\t\t\t\t\tc.PageBox = box;\r\n\t\t\t\t\tc.CurrentPageNumber = i;\r\n\t\t\t\t\tvar pr = reader.GetPageRotation(i);\r\n\t\t\t\t\tpr = PdfHelper.NormalizeRotationNumber(pr);\r\n\t\t\t\t\tif (pr != 0) {\r\n\t\t\t\t\t\tp.RotationMatrix = pr switch {\r\n\t\t\t\t\t\t\t90 => new Matrix(0, 1, -1, 0, 0, 0),\r\n\t\t\t\t\t\t\t180 => new Matrix(0, -1, -1, 0, 0, 0),\r\n\t\t\t\t\t\t\t270 => new Matrix(0, -1, 1, 0, 0, 0),\r\n\t\t\t\t\t\t\t_ => p.RotationMatrix\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\t\t\t\t\tp.ProcessContent(reader.GetPageContent(i), reader.GetPageNRelease(i).GetAsDict(PdfName.RESOURCES));\r\n\r\n\t\t\t\t\tc.IsTextMerged = false;\r\n\t\t\t\t\tc.TextLine = null;\r\n\t\t\t\t\t// TODO: 自动根据已知排版方向比例修正排版方向\r\n\t\t\t\t\t// 合并前筛选文本\r\n\t\t\t\t\tvar ptl = p.TextList;\r\n\t\t\t\t\tfor (int li = ptl.Count - 1; li >= 0; li--) {\r\n\t\t\t\t\t\tc.TextInfo = ptl[li];\r\n\t\t\t\t\t\tif (lp.ChangeSizeLevel(c) < options.TitleThreshold) {\r\n\t\t\t\t\t\t\tptl.RemoveAt(li);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar tl = MergeTextInfoList(box, ptl, _options);\r\n\t\t\t\t\t// TODO: 筛选文本\r\n\t\t\t\t\tc.IsTextMerged = true;\r\n\t\t\t\t\tfor (int li = tl.Count - 1; li >= 0; li--) {\r\n\t\t\t\t\t\tc.TextLine = tl[li];\r\n\t\t\t\t\t\tc.TextInfo = c.TextLine.FirstText;\r\n\t\t\t\t\t\tif ((c.TextInfo.Size = lp.ChangeSizeLevel(c)) < options.TitleThreshold) {\r\n\t\t\t\t\t\t\ttl.RemoveAt(li);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar tr = MergeTextLines(box, tl);\r\n\t\t\t\t\tif (tr != null && tr.Count > 0) {\r\n\t\t\t\t\t\tif (options.WritingDirection != WritingDirection.Unknown) {\r\n\t\t\t\t\t\t\ttr.Sort((a, b) => {\r\n\t\t\t\t\t\t\t\tvar ra = a.Region;\r\n\t\t\t\t\t\t\t\tvar rb = b.Region;\r\n\t\t\t\t\t\t\t\tif (ra.Middle < rb.Middle) return 1;\r\n\t\t\t\t\t\t\t\telse if (ra.Middle > rb.Middle) return -1;\r\n\t\t\t\t\t\t\t\telse if (ra.Center > rb.Center) return 1;\r\n\t\t\t\t\t\t\t\telse if (ra.Center < rb.Center) return -1;\r\n\t\t\t\t\t\t\t\telse return 0;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twriter.WriteStartElement(Constants.Content.Texts);\r\n\t\t\t\t\t\twriter.WriteValue(Constants.Content.PageNumber, i);\r\n\t\t\t\t\t\tforeach (var item in tr) {\r\n\t\t\t\t\t\t\tvar t = PdfHelper.GetValidXmlString(ConcatRegionText(item)).Trim();\r\n\t\t\t\t\t\t\tvar f = item.Lines[0].FirstText.Font;\r\n\t\t\t\t\t\t\tvar s = item.Lines[0].FirstText.Size;\r\n\t\t\t\t\t\t\twriter.WriteStartElement(\"文本\");\r\n\t\t\t\t\t\t\twriter.WriteAttributeString(Constants.Font.ThisName, f != null ? f.FontID.ToText() : \"OCR\");\r\n\t\t\t\t\t\t\twriter.WriteValue(Constants.Coordinates.Top, item.Region.Top);\r\n\t\t\t\t\t\t\twriter.WriteValue(Constants.Coordinates.Bottom, item.Region.Bottom);\r\n\t\t\t\t\t\t\twriter.WriteValue(Constants.Coordinates.Left, item.Region.Left);\r\n\t\t\t\t\t\t\twriter.WriteValue(Constants.Coordinates.Width, item.Region.Width);\r\n\t\t\t\t\t\t\twriter.WriteValue(Constants.Coordinates.Height, item.Region.Height);\r\n\t\t\t\t\t\t\twriter.WriteValue(\"尺寸\", s);\r\n\t\t\t\t\t\t\twriter.WriteString(t);\r\n\t\t\t\t\t\t\twriter.WriteEndElement();\r\n\r\n\t\t\t\t\t\t\tif (t.Length == 0\r\n\t\t\t\t\t\t\t\t|| (t.Length == 1 && options.IgnoreSingleCharacterTitle)\r\n\t\t\t\t\t\t\t\t|| (options.IgnoreNumericTitle && AutoBookmarkOptions.NumericPattern.IsMatch(t))\r\n\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (ig != null) {\r\n\t\t\t\t\t\t\t\tbool ignore = false;\r\n\t\t\t\t\t\t\t\tforeach (var rg in ig) {\r\n\t\t\t\t\t\t\t\t\tif (rg.Matches(t)) {\r\n\t\t\t\t\t\t\t\t\t\tignore = true;\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (ignore) {\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (options.AutoHierarchicalArrangement) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tif (sizes.Count == 0 || s < (size = sizes.Peek())) {\r\n\t\t\t\t\t\t\t\t\t\tbe = be.AppendChild(doc.CreateElement(Constants.Bookmark)) as XmlElement;\r\n\t\t\t\t\t\t\t\t\t\tsizes.Push(s);\r\n\t\t\t\t\t\t\t\t\t\tlevel++;\r\n\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\telse if (s == size) {\r\n\t\t\t\t\t\t\t\t\t\tbe = (be.ParentNode ?? be).AppendChild(doc.CreateElement(Constants.Bookmark)) as XmlElement;\r\n\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tbe = be.ParentNode as XmlElement;\r\n\t\t\t\t\t\t\t\t\tsizes.Pop();\r\n\t\t\t\t\t\t\t\t\tlevel--;\r\n\t\t\t\t\t\t\t\t} while (s > size && be.NodeType == XmlNodeType.Element);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tbe = doc.DocumentElement.AppendChild(doc.CreateElement(Constants.Bookmark)) as XmlElement;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbe.SetAttribute(Constants.BookmarkAttributes.Title, t);\r\n\t\t\t\t\t\t\tbe.SetAttribute(Constants.DestinationAttributes.Page, i.ToText());\r\n\t\t\t\t\t\t\tbe.SetAttribute(Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\t\t\t\tbe.SetAttribute(Constants.Coordinates.Top, ValueHelper.ToText(item.Region.Top + s * yOffset));\r\n\t\t\t\t\t\t\tbe.SetAttribute(Constants.Font.Size, s.ToText());\r\n\t\t\t\t\t\t\tif (f != null) {\r\n\t\t\t\t\t\t\t\tbe.SetAttribute(Constants.Font.ThisName, f.FontID.ToText());\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tCountFontOccurrenceInRegion(fontOccurrences, i, item);\r\n#if DEBUG\r\n\t\t\t\t\t\t\tTracker.TraceMessage(String.Concat(item.Direction.ToString()[0], ':', level < 11 ? indentString.Substring(0, level) : indentString, t, \" .... \", i.ToText()));\r\n#else\r\n\t\t\t\t\t\t\tTracker.TraceMessage (String.Concat (level < 11 ? indentString.Substring (0, level) : indentString, t, \" .... \", ValueHelper.ToText (i)));\r\n#endif\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (oldWriter != null) {\r\n\t\t\t\twriter = oldWriter;\r\n\t\t\t}\r\n\r\n\t\t\tWriteDocumentFontOccurrences(writer, options, p, fontOccurrences);\r\n\t\t\tSetGoToTop(options, doc);\r\n\t\t\twriter.WriteStartElement(Constants.DocumentBookmark);\r\n\t\t\tif (options.CreateBookmarkForFirstPage && String.IsNullOrEmpty(options.FirstPageTitle) == false) {\r\n\t\t\t\twriter.WriteStartElement(Constants.Bookmark);\r\n\t\t\t\twriter.WriteAttributeString(Constants.BookmarkAttributes.Title, options.FirstPageTitle);\r\n\t\t\t\twriter.WriteAttributeString(Constants.DestinationAttributes.Page, \"1\");\r\n\t\t\t\twriter.WriteAttributeString(Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\t\twriter.WriteEndElement();\r\n\t\t\t}\r\n\t\t\tdoc.DocumentElement.WriteContentTo(writer);\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tstatic void SetGoToTop(AutoBookmarkOptions options, XmlDocument doc) {\r\n\t\t\tif (options.PageTopForLevel > 0) {\r\n\t\t\t\tvar topics = doc.DocumentElement.SelectNodes(\".//书签[count(ancestor::书签) < \" + (options.PageTopForLevel + 1) + \"]\");\r\n\t\t\t\tforeach (XmlElement t in topics) {\r\n\t\t\t\t\tt.RemoveAttribute(Constants.Coordinates.Top);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void WriteDocumentFontOccurrences(XmlWriter writer, AutoBookmarkOptions options, TextToBookmarkProcessor p, FontOccurrence fontOccurrences) {\r\n\t\t\twriter.WriteStartElement(Constants.Font.DocumentFont);\r\n\t\t\tTracker.TraceMessage(\"\\n文档所用的字体\");\r\n\t\t\tvar dl = new List<String>();\r\n\t\t\tforeach (var item in p.FontList) {\r\n\t\t\t\tvar fo = \"0\";\r\n\t\t\t\tvar sl = fontOccurrences.GetOccurrence(item.Value);\r\n\t\t\t\tif (sl != null) {\r\n\t\t\t\t\tif (dl.Contains(item.Value) == false) {\r\n\t\t\t\t\t\tint o = 0;\r\n\t\t\t\t\t\tforeach (var s in sl) {\r\n\t\t\t\t\t\t\to += s.Occurrence;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfo = o.ToText();\r\n\t\t\t\t\t\tdl.Add(item.Value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tsl = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (options.DisplayFontStatistics && (sl != null || options.DisplayAllFonts)) {\r\n\t\t\t\t\tTracker.TraceMessage(String.Concat(\"编号：\", item.Key, \"\\t出现次数：\", fo, \"\\t名称：\", item.Value));\r\n\t\t\t\t}\r\n\t\t\t\twriter.WriteStartElement(Constants.Font.ThisName);\r\n\t\t\t\twriter.WriteAttributeString(Constants.Font.ID, item.Key.ToText());\r\n\t\t\t\twriter.WriteAttributeString(Constants.Font.Name, item.Value);\r\n\t\t\t\twriter.WriteAttributeString(Constants.FontOccurrence.Count, fo);\r\n\t\t\t\tif (sl != null) {\r\n\t\t\t\t\tforeach (var s in sl) {\r\n\t\t\t\t\t\twriter.WriteStartElement(Constants.Font.Size);\r\n\t\t\t\t\t\twriter.WriteAttributeString(Constants.Font.Size, s.Size.ToText());\r\n\t\t\t\t\t\twriter.WriteAttributeString(Constants.FontOccurrence.Count, s.Occurrence.ToText());\r\n\t\t\t\t\t\twriter.WriteAttributeString(Constants.FontOccurrence.FirstText, s.FirstInstance);\r\n\t\t\t\t\t\twriter.WriteAttributeString(Constants.FontOccurrence.FirstPage, s.FirstPage.ToText());\r\n\t\t\t\t\t\tif (options.DisplayFontStatistics && (s.Occurrence > 0 || options.DisplayAllFonts)) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage($\"\\t尺寸：{s.Size.ToText()}\\t出现次数：{s.Occurrence.ToText()}\\t首次出现于第{s.FirstPage.ToText()}页（{s.FirstInstance}）\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\twriter.WriteEndElement();\r\n\t\t\t}\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tstatic void CountFontOccurrenceInRegion(FontOccurrence fontOccurrences, int i, TextRegion item) {\r\n\t\t\tFontInfo f = null;\r\n\t\t\tforeach (var il in item.Lines) {\r\n\t\t\t\tforeach (var ii in il.Texts) {\r\n\t\t\t\t\tif (ii.Font != null && (f == null || ii.Font.FontID != f.FontID)) {\r\n\t\t\t\t\t\tfontOccurrences.AddOccurrence(ii.Font.FontName, ii.Size, i, il.Text);\r\n\t\t\t\t\t\tf = ii.Font;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic string ConcatRegionText(TextRegion region) {\r\n\t\t\tvar ls = region.Lines;\r\n\t\t\tif (ls.Count == 0) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\telse if (ls.Count == 1) {\r\n\t\t\t\treturn ls[0].Text;\r\n\t\t\t}\r\n\t\t\tls = new List<TextLine>(ls);\r\n\t\t\tif (region.Direction == WritingDirection.Vertical) {\r\n\t\t\t\tls.Sort((a, b) => {\r\n\t\t\t\t\tif (a.Region.Middle < b.Region.Middle) {\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (a.Region.Middle > b.Region.Middle) {\r\n\t\t\t\t\t\treturn -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\tsb.Append(ls[0].Text);\r\n\t\t\tfor (int i = 1; i < ls.Count; i++) {\r\n\t\t\t\tvar l = ls[i].Text;\r\n\t\t\t\tvar ll = ls[i - 1].Text;\r\n\t\t\t\tif (ll.Length > 0 && l.Length > 0) {\r\n\t\t\t\t\tvar c1 = l[l.Length - 1];\r\n\t\t\t\t\tvar c2 = ll[0];\r\n\t\t\t\t\tif ((__AddSpaceAfterCharacters.IndexOf(c1) != -1\r\n\t\t\t\t\t\t\t|| (Char.IsLetterOrDigit(c1) && c1 < 0x4E00 /*非中文字符*/))\r\n\t\t\t\t\t\t&& (__InsertSpaceBeforeCharacters.IndexOf(c2) != -1\r\n\t\t\t\t\t\t\t|| (Char.IsLetterOrDigit(c2) && c2 < 0x4E00))) {\r\n\t\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsb.Append(l);\r\n\t\t\t}\r\n\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 使用最小距离法将 <paramref name=\"textInfos\"/> 的文本聚类为 <see cref=\"TextLine\"/> 列表。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"textInfos\">包含文本位置及尺寸信息的 <see cref=\"TextInfo\"/> 集合。</param>\r\n\t\t/// <returns>聚类后所得的 <see cref=\"TextLine\"/> 列表。</returns>\r\n\t\tinternal static List<TextLine> MergeTextInfoList(Rectangle pageBox, IList<TextInfo> textInfos, AutoBookmarkOptions options) {\r\n\t\t\tvar ll = new List<TextLine>();\r\n\t\t\t// 同行合并宽度最小值\r\n\t\t\tvar cw = pageBox.Width / 6;\r\n\t\t\tvar ch = pageBox.Height / 6;\r\n\r\n\t\t\tvar dirCount = new int[4];\r\n\t\t\t// 遍历识别所得的各 TextInfo，使用最小距离聚类方法将其聚类为行\r\n\t\t\tforeach (var item in textInfos) {\r\n\t\t\t\tvar ir = item.Region;\r\n\t\t\t\tDistanceInfo cd = null; // TextInfo 到 TextLine 的距离\r\n\t\t\t\tvar md = new DistanceInfo(DistanceInfo.Placement.Unknown, float.MaxValue, float.MaxValue); // 最小距离\r\n\t\t\t\tTextLine ml = null; // 最小距离的 TextLine\r\n\r\n\t\t\t\t// 求最小距离的 TextLine\r\n\t\t\t\tfloat ds = item.Size / 10;\r\n\t\t\t\t// 循环只包含了 TextLine，未包含文本 TextInfo 的其余文本\r\n\t\t\t\tvar end = ll.Count > 5 ? ll.Count - 5 : 0;\r\n\t\t\t\tfor (int i = ll.Count - 1; i >= end; i--) {\r\n\t\t\t\t\tvar li = ll[i];\r\n\t\t\t\t\t// 文本尺寸应在误差范围之内\r\n\t\t\t\t\tif (Math.Abs(item.Size - li.FirstText.Size) > ds && options.MergeDifferentSizeTitles == false) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (options.MergeDifferentFontTitles == false && li.FirstText.Font.FontID != item.Font.FontID) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcd = li.GetDistance(ir);\r\n\t\t\t\t\tif ((cd.IsOverlapping // 当前项与文本行交叠\r\n\t\t\t\t\t\t\t&& (md.IsOverlapping == false // 最小距离不是交叠\r\n\t\t\t\t\t\t\t\t|| cd.DistanceRadial < md.DistanceRadial) // 当前项与文本行的交叠中心距离小于最小距离\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t//&& (options.MergeDifferentFontTitles || li.FirstText.Font.FontID == item.Font.FontID)\r\n\t\t\t\t\t\t|| ((md.Location == DistanceInfo.Placement.Unknown // 未知最小距离\r\n\t\t\t\t\t\t\t|| (cd.IsOverlapping == false\r\n\t\t\t\t\t\t\t\t&& md.IsOverlapping == false\r\n\t\t\t\t\t\t\t\t&& cd.MinDistance < md.MinDistance) // 当前项与文本行的距离小于最小距离\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t&& (((cd.IsHorizontallyAligned) // 相对位置为水平\r\n\t\t\t\t\t\t\t\t\t&& li.Direction != WritingDirection.Vertical // 文本行方向不为纵向\r\n\t\t\t\t\t\t\t\t\t&& item.Region.IsAlignedWith(li.Region, WritingDirection.Horizontal) // 两者处于同一横行\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t|| ((cd.IsVerticallyAligned) // 相对位置为垂直\r\n\t\t\t\t\t\t\t\t\t&& li.Direction != WritingDirection.Horizontal // 文本行方向不为横向\r\n\t\t\t\t\t\t\t\t\t&& item.Region.IsAlignedWith(li.Region, WritingDirection.Vertical) // 两者处于同一纵行\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // && Math.Abs (item.Region.Middle - li.Region.Middle) < li.Region.Height // 行间距离小于行高\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t&& (options.DetectColumns == false || cd.MinDistance < cw)\r\n\t\t\t\t\t\t\t&& (options.MergeDifferentFontTitles || li.FirstText.Font.FontID == item.Font.FontID)\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\tmd = cd;\r\n\t\t\t\t\t\tml = li;\r\n\t\t\t\t\t\tif (cd.IsLeft) {\r\n\t\t\t\t\t\t\tdirCount[0]++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (cd.IsRight) {\r\n\t\t\t\t\t\t\tdirCount[1]++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (cd.IsAbove) {\r\n\t\t\t\t\t\t\tdirCount[2]++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (cd.IsBelow) {\r\n\t\t\t\t\t\t\tdirCount[3]++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 否则，用 item 创建新的 TextLine\r\n\t\t\t\tif (item.Text.Length == 0) {\r\n\t\t\t\t\titem.Text = \" \";\r\n\t\t\t\t}\r\n\t\t\t\tif (ml != null) {\r\n\t\t\t\t\t// 若存在最小距离的 TextLine 且可合并，则将 item 归入 TextLine\r\n\t\t\t\t\tif (md.IsOverlapping && options.IgnoreOverlappedText) {\r\n\t\t\t\t\t\t// 检查是否存在交叠重复的文本\r\n\t\t\t\t\t\tforeach (var t in ml.Texts) {\r\n\t\t\t\t\t\t\tif (t.Region.IntersectWith(item.Region) // item 与 TextLine 中某项交叠\r\n\t\t\t\t\t\t\t\t&& (t.Text.Contains(item.Text) || item.Text.Contains(t.Text) // 交叠的项文本和 item 的文本相同\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tgoto Next; // 忽略此项目\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tml.AddText(item);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tll.Add(new TextLine(item));\r\n\t\t\t\t}\r\n\t\t\tNext:\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\treturn ll;\r\n\t\t}\r\n\r\n\t\tinternal List<TextRegion> MergeTextLines(Rectangle pageBox, IList<TextLine> textLines) {\r\n\t\t\tvar ll = new List<TextRegion>();\r\n\t\t\t// 同行合并宽度最小值\r\n\t\t\tvar cw = pageBox.Width / 6;\r\n\t\t\tvar ch = pageBox.Height / 6;\r\n\r\n\t\t\t// 遍历识别所得的各 TextInfo，使用最小距离聚类方法将其聚类为行\r\n\t\t\tforeach (var item in textLines) {\r\n\t\t\t\tvar ir = item.Region;\r\n\t\t\t\tDistanceInfo cd = null; // TextInfo 到 TextLine 的距离\r\n\t\t\t\tvar md = new DistanceInfo(DistanceInfo.Placement.Unknown, float.MaxValue, float.MaxValue); // 最小距离\r\n\t\t\t\tTextRegion mr = null; // 最小距离的 TextRegion\r\n\r\n\t\t\t\t// 求最小距离的 TextLine\r\n\t\t\t\tfloat ds = item.FirstText.Size / 10;\r\n\t\t\t\t// 循环只包含了 TextLine，未包含文本 TextInfo 的其余文本\r\n\t\t\t\tfor (int i = ll.Count - 1; i >= 0; i--) {\r\n\t\t\t\t\tvar li = ll[i];\r\n\t\t\t\t\t// 文本尺寸应在误差范围之内\r\n\t\t\t\t\tif (Math.Abs(item.FirstText.Size - li.Lines[0].FirstText.Size) > ds && _options.MergeAdjacentTitles) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_options.MergeDifferentFontTitles == false && li.Lines[0].FirstText.Font.FontID != item.FirstText.Font.FontID) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcd = li.Region.GetDistance(ir, li.Direction);\r\n\t\t\t\t\tif ((cd.IsOverlapping // 当前项与文本行交叠\r\n\t\t\t\t\t\t\t&& (md.IsOverlapping == false // 最小距离不是交叠\r\n\t\t\t\t\t\t\t\t|| cd.DistanceRadial < md.DistanceRadial) // 当前项与文本行的交叠中心距离小于最小距离\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t|| ((md.Location == DistanceInfo.Placement.Unknown // 未知最小距离\r\n\t\t\t\t\t\t\t|| (cd.IsOverlapping == false\r\n\t\t\t\t\t\t\t\t&& md.IsOverlapping == false\r\n\t\t\t\t\t\t\t\t&& cd.MinDistance < md.MinDistance) // 当前项与文本行的距离小于最小距离\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t&& (((cd.IsHorizontallyAligned) // 相对位置为水平\r\n\t\t\t\t\t\t\t\t\t&& li.Direction != WritingDirection.Vertical // 文本行方向不为纵向\r\n\t\t\t\t\t\t\t\t\t&& item.Region.IsAlignedWith(li.Region, WritingDirection.Horizontal) // 两者处于同一横行\r\n\t\t\t\t\t\t\t\t\t&& cd.MinDistance < item.Region.Width * _options.MaxDistanceBetweenLines // 行间距离小于指定行宽\r\n\t\t\t\t\t\t\t\t\t&& _options.MergeAdjacentTitles\r\n\t\t\t\t\t\t\t\t\t&& (_options.MergeDifferentSizeTitles || li.Lines[0].Region.Width == item.Region.Width) // 合并相同尺寸的标题\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t|| ((cd.IsVerticallyAligned) // 相对位置为垂直\r\n\t\t\t\t\t\t\t\t\t&& li.Direction != WritingDirection.Horizontal // 文本行方向不为横向\r\n\t\t\t\t\t\t\t\t\t&& item.Region.IsAlignedWith(li.Region, WritingDirection.Vertical) // 两者处于同一纵行\r\n\t\t\t\t\t\t\t\t\t&& cd.MinDistance < item.Region.Height * _options.MaxDistanceBetweenLines // 行间距离小于指定行高\r\n\t\t\t\t\t\t\t\t\t&& _options.MergeAdjacentTitles\r\n\t\t\t\t\t\t\t\t\t&& (_options.MergeDifferentSizeTitles || li.Lines[0].Region.Height == item.Region.Height) // 合并相同尺寸的标题\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t&& cd.MinDistance < cw\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\tmd = cd;\r\n\t\t\t\t\t\tmr = li;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 否则，用 item 创建新的 TextLine\r\n\t\t\t\tif (mr != null) {\r\n\t\t\t\t\t// 若存在最小距离的 TextLine 且可合并，则将 item 归入 TextLine\r\n\t\t\t\t\tmr.AddLine(item);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tll.Add(new TextRegion(item));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn ll;\r\n\t\t}\r\n\r\n\t\tsealed class TextToBookmarkProcessor : PdfContentStreamProcessor\r\n\t\t{\r\n\t\t\treadonly float _fontSizeThreshold;\r\n\r\n\t\t\t//Rectangle _positionRectangle;\r\n\t\t\treadonly bool _mergeAdjacentTitles;\r\n\t\t\treadonly bool _mergeDifferentSizeTitles;\r\n\t\t\tfloat _textWidth, _charWidth;\r\n\t\t\treadonly List<TextInfo> _TextList;\r\n\t\t\treadonly LevelProcessor _levelProcessor;\r\n\t\t\treadonly AutoBookmarkContext _context;\r\n\r\n\t\t\tpublic TextToBookmarkProcessor(AutoBookmarkOptions options, AutoBookmarkContext context) {\r\n\t\t\t\t_fontSizeThreshold = options.TitleThreshold;\r\n\t\t\t\t_mergeAdjacentTitles = options.MergeAdjacentTitles;\r\n\t\t\t\t_mergeDifferentSizeTitles = options.MergeDifferentSizeTitles;\r\n\t\t\t\t_levelProcessor = new LevelProcessor(options.LevelAdjustment);\r\n\t\t\t\t_TextList = new List<TextInfo>();\r\n\t\t\t\tPopulateOperators();\r\n\t\t\t\tRegisterContentOperator(\"TJ\", new AccumulatedShowTextArray());\r\n\t\t\t\t_context = context;\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// 获取页面内容的文本。\r\n\t\t\t/// </summary>\r\n\t\t\tinternal List<TextInfo> TextList => _TextList;\r\n\t\t\t/// <summary>\r\n\t\t\t/// 获取字体列表。\r\n\t\t\t/// </summary>\r\n\t\t\tinternal IDictionary<int, string> FontList => Fonts;\r\n\r\n\t\t\tpublic Matrix RotationMatrix { get; set; }\r\n\r\n\t\t\tinternal override void Reset() {\r\n\t\t\t\tbase.Reset();\r\n\t\t\t\t_TextList?.Clear();\r\n\t\t\t}\r\n\r\n\t\t\tprotected override void DisplayPdfString(PdfString str) {\r\n\t\t\t\tvar gs = CurrentGraphicState;\r\n\t\t\t\tvar font = gs.Font;\r\n\t\t\t\tvar chars = font.DecodeText(str);\r\n\t\t\t\tfloat totalWidth = 0, charWidth = 0;\r\n\t\t\t\tforeach (var c in chars) {\r\n\t\t\t\t\tfloat w = font.GetWidth(c) / 1000.0f;\r\n\t\t\t\t\tif (w == 0 && (font.CjkType & FontInfo.CjkFontType.CJK) > 0) {\r\n\t\t\t\t\t\tw = c < 0xFF ? 0.5f : 1f;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfloat wordSpacing = c == ' ' ? gs.WordSpacing : 0f;\r\n\t\t\t\t\tif (Char.IsLetterOrDigit(c)) {\r\n\t\t\t\t\t\tcharWidth += w * gs.FontSize * gs.HorizontalScaling;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttotalWidth += (w * gs.FontSize + gs.CharacterSpacing + wordSpacing) * gs.HorizontalScaling;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_textWidth = totalWidth;\r\n\t\t\t\t_charWidth = charWidth;\r\n\t\t\t\tAdjustTextMatrixX(totalWidth);\r\n\t\t\t}\r\n\r\n\t\t\tprotected override void InvokeOperator(PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar o = oper.ToString();\r\n\t\t\t\tstring text;\r\n\t\t\t\tfloat size;\r\n\t\t\t\tMatrix tm;\r\n\t\t\t\tswitch (o) {\r\n\t\t\t\t\tcase \"TJ\":\r\n\t\t\t\t\t\ttm = GetTextMatrix();\r\n\t\t\t\t\t\tsize = GetFontSize(tm);\r\n\t\t\t\t\t\ttext = DecodeTJText(operands, size);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"Tj\":\r\n\t\t\t\t\tcase \"'\":\r\n\t\t\t\t\tcase \"\\\"\":\r\n\t\t\t\t\t\ttm = GetTextMatrix();\r\n\t\t\t\t\t\tsize = GetFontSize(tm);\r\n\t\t\t\t\t\tif (size < 0) {\r\n\t\t\t\t\t\t\tsize = -size;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttext = CurrentGraphicState.Font.DecodeText(operands[0] as PdfString);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t// 执行默认的操作指令\r\n\t\t\t\t\t\tbase.InvokeOperator(oper, operands);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 处理文本\r\n\t\t\t\tbase.InvokeOperator(oper, operands);\r\n\t\t\t\t//if (tm[Matrix.I12] != 0 || tm[Matrix.I21] != 0) {\r\n\t\t\t\t//    // 忽略非横向文本\r\n\t\t\t\t//    goto Exit;\r\n\t\t\t\t//}\r\n\t\t\t\tif (size < 0.0001) {\r\n\t\t\t\t\tsize = 0.0001f;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsize = (float)Math.Round(size, 4);\r\n\t\t\t\t}\r\n\t\t\t\tvar ti = new TextInfo() {\r\n\t\t\t\t\tText = text.Length > 1 ? text.TrimEnd(' ') : text,\r\n\t\t\t\t\tSize = size,\r\n\t\t\t\t\tRegion = CreateBoundFromMatrix(tm, _textWidth, size),\r\n\t\t\t\t\tFont = CurrentGraphicState.Font,\r\n\t\t\t\t\tLetterWidth = _charWidth * tm[Matrix.I22]\r\n\t\t\t\t};\r\n\t\t\t\tif (ti.LetterWidth < 0) {\r\n\t\t\t\t\tti.LetterWidth = -ti.LetterWidth;\r\n\t\t\t\t}\r\n\t\t\t\tif (IsBoundOutOfRectangle(_context.PageBox, ti.Region)) {\r\n\t\t\t\t\t// 文本落在页面之外\r\n\t\t\t\t\tgoto Exit;\r\n\t\t\t\t}\r\n\t\t\t\t//TODO: 筛选文本\r\n\t\t\t\t_TextList.Add(ti);\r\n\t\t\tExit:\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tstring DecodeTJText(List<PdfObject> operands, float size) {\r\n\t\t\t\tvar array = (PdfArray)operands[0];\r\n\t\t\t\tfloat d = size * CurrentGraphicState.HorizontalScaling * 4f / 1000f;\r\n\t\t\t\tvar t = new string[array.Size];\r\n\t\t\t\tint i = 0;\r\n\t\t\t\tforeach (PdfObject item in array.ArrayList) {\r\n\t\t\t\t\tif (item.Type == PdfObject.STRING) {\r\n\t\t\t\t\t\tt[i++] = CurrentGraphicState.Font.DecodeText(item as PdfString);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (item.Type == PdfObject.NUMBER) {\r\n\t\t\t\t\t\tif (-(item as PdfNumber).FloatValue * d > size) {\r\n\t\t\t\t\t\t\tt[i++] = \" \";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn String.Concat(t);\r\n\t\t\t}\r\n\r\n\t\t\tfloat GetFontSize(Matrix tm) {\r\n\t\t\t\tfloat size = CurrentGraphicState.FontSize * tm[Matrix.I22];\r\n\t\t\t\tif (size < 0) {\r\n\t\t\t\t\tsize = -size;\r\n\t\t\t\t}\r\n\t\t\t\treturn size;\r\n\t\t\t}\r\n\r\n\t\t\tMatrix GetTextMatrix() {\r\n\t\t\t\treturn RotationMatrix != null\r\n\t\t\t\t\t? RotationMatrix.Multiply(TextMatrix).Multiply(CurrentGraphicState.TransMatrix)\r\n\t\t\t\t\t: TextMatrix.Multiply(CurrentGraphicState.TransMatrix);\r\n\t\t\t}\r\n\r\n\t\t\tstatic Bound CreateBoundFromMatrix(Matrix tm, float textWidth, float size) {\r\n\t\t\t\tvar l = tm[Matrix.I31];\r\n\t\t\t\tvar b = tm[Matrix.I32];\r\n\t\t\t\tvar r = tm[Matrix.I31] + textWidth * tm[Matrix.I11];\r\n\t\t\t\tvar t = tm[Matrix.I32] + size;\r\n\t\t\t\tfloat x;\r\n\t\t\t\tif (l > r) {\r\n\t\t\t\t\tx = r; r = l; l = x;\r\n\t\t\t\t}\r\n\t\t\t\tif (b > t) {\r\n\t\t\t\t\tx = t; t = b; b = x;\r\n\t\t\t\t}\r\n\t\t\t\treturn new Bound(l, b, r, t);\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// 检查 <paramref name=\"b\"/> 是否处于 <paramref name=\"a\"/> 之内。\r\n\t\t\t/// </summary>\r\n\t\t\t/// <param name=\"a\">大边框。</param>\r\n\t\t\t/// <param name=\"b\">小边框。</param>\r\n\t\t\t/// <returns>小边框完全处于大边框内，则返回 true。</returns>\r\n\t\t\tinternal static bool IsBoundOutOfRectangle(Rectangle a, Bound b) {\r\n\t\t\t\treturn b.Right < a.Left\r\n\t\t\t\t\t\t|| b.Top < a.Bottom\r\n\t\t\t\t\t\t|| b.Bottom > a.Top\r\n\t\t\t\t\t\t|| b.Left > a.Right;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsealed class LevelProcessor\r\n\t\t{\r\n\t\t\treadonly AutoBookmarkFilter[] _filters;\r\n\t\t\treadonly AutoBookmarkOptions.LevelAdjustmentOption[] _options;\r\n\r\n\t\t\tinternal LevelProcessor(IList<AutoBookmarkOptions.LevelAdjustmentOption> options) {\r\n\t\t\t\tvar l = options.Count;\r\n\t\t\t\t_filters = new AutoBookmarkFilter[l];\r\n\t\t\t\t_options = new AutoBookmarkOptions.LevelAdjustmentOption[l];\r\n\t\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\t\t_filters[i] = options[i].Condition.CreateFilter();\r\n\t\t\t\t\t_options[i] = options[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tinternal float ChangeSizeLevel(AutoBookmarkContext context) {\r\n\t\t\t\tfor (int i = 0; i < _options.Length; i++) {\r\n\t\t\t\t\tvar o = _options[i];\r\n\t\t\t\t\tif (o.FilterBeforeMergeTitle && context.IsTextMerged) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_filters[i].Matches(context)) {\r\n\t\t\t\t\t\treturn o.RelativeAdjustment ? o.AdjustmentLevel + context.TextInfo.Size : o.AdjustmentLevel;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn context.TextInfo.Size;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/AutoBookmarkFilter.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tpublic abstract class AutoBookmarkFilter\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 检查传入的 <see cref=\"Model.AutoBookmarkContext\"/> 是否符合指定的过滤条件。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"context\">包含需要过滤的文本信息及其它上下文的 <see cref=\"Model.AutoBookmarkContext\"/>。</param>\r\n\t\t/// <returns>过滤结果。</returns>\r\n\t\tinternal abstract bool Matches(Model.AutoBookmarkContext context);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 重置过滤器的内部状态。\r\n\t\t/// </summary>\r\n\t\tinternal abstract void Reset();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/FontNameFilter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"FontName = {FontName}; MatchFullName = {MatchFullName}\")]\r\n\tpublic class FontNameFilter(string fontName, bool matchFullName) : AutoBookmarkFilter\r\n\t{\r\n\t\tpublic string FontName { get; } = fontName;\r\n\t\tpublic bool MatchFullName { get; } = matchFullName;\r\n\r\n\t\treadonly Dictionary<int, bool> _matchResultCache = [];\r\n\r\n\t\tinternal override bool Matches(AutoBookmarkContext context) {\r\n\t\t\tif (context.TextLine == null) {\r\n\t\t\t\treturn MatchFont(context.TextInfo.Font);\r\n\t\t\t}\r\n\t\t\tforeach (var item in context.TextLine.Texts) {\r\n\t\t\t\tif (MatchFont(item.Font)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tprivate bool MatchFont(FontInfo font) {\r\n\t\t\tif (font == null) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tbool result;\r\n\t\t\tif (_matchResultCache.TryGetValue(font.FontID, out result)) {\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\treturn _matchResultCache[font.FontID] = MatchFullName\r\n\t\t\t\t? String.Equals(FontName, font.FontName, StringComparison.OrdinalIgnoreCase)\r\n\t\t\t\t: font.PostscriptFontName.IndexOf(FontName, StringComparison.OrdinalIgnoreCase) > -1;\r\n\t\t}\r\n\r\n\t\tinternal override void Reset() {\r\n\t\t\t_matchResultCache.Clear();\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/MultiConditionFilter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal sealed class MultiConditionFilter : AutoBookmarkFilter\r\n\t{\r\n\t\treadonly List<AutoBookmarkFilter> _filters = [];\r\n\r\n\t\tpublic MultiConditionFilter(AutoBookmarkCondition.MultiCondition condition) {\r\n\t\t\tforeach (var item in condition.Conditions) {\r\n\t\t\t\t_filters.Add(item.CreateFilter());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal override bool Matches(AutoBookmarkContext context) {\r\n\t\t\tforeach (var item in _filters) {\r\n\t\t\t\tif (item.Matches(context) == false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tinternal override void Reset() {\r\n\t\t\tforeach (var item in _filters) {\r\n\t\t\t\titem.Reset();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/PageRangeFilter.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"{_rangeText}\")]\r\n\tpublic class PageRangeFilter(string range) : AutoBookmarkFilter\r\n\t{\r\n\t\tprivate Model.PageRangeCollection _range;\r\n\t\tprivate readonly string _rangeText = range;\r\n\r\n\t\tinternal override bool Matches(Model.AutoBookmarkContext context) {\r\n\t\t\tvar p = context.CurrentPageNumber;\r\n\t\t\t_range ??= Model.PageRangeCollection.Parse(_rangeText, 1, context.TotalPageNumber, false);\r\n\t\t\tforeach (var item in _range) {\r\n\t\t\t\tif (p <= item.EndValue && p >= item.StartValue) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tinternal override void Reset() {\r\n\t\t\t_range = null;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/TextFilter.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class TextFilter(MatchPattern pattern) : AutoBookmarkFilter\r\n\t{\r\n\t\treadonly MatchPattern.IMatcher _matcher = pattern.CreateMatcher();\r\n\r\n\t\tinternal override bool Matches(AutoBookmarkContext context) {\r\n\t\t\treturn  _matcher.Matches(context.TextLine == null ? context.TextInfo.Text : context.TextLine.Text);\r\n\t\t}\r\n\r\n\t\tinternal override void Reset() {\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/TextPositionFilter.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"P {Position}: {MinValue}->{MaxValue}\")]\r\n\tsealed class TextPositionFilter(byte position, float min, float max) : AutoBookmarkFilter\r\n\t{\r\n\t\tpublic byte Position { get; } = position;\r\n\t\tpublic float MaxValue { get; } = max;\r\n\t\tpublic float MinValue { get; } = min;\r\n\r\n\t\tinternal override bool Matches(AutoBookmarkContext context) {\r\n\t\t\tif (context.TextLine == null) {\r\n\t\t\t\treturn MatchPosition(context.TextInfo.Region);\r\n\t\t\t}\r\n\t\t\tforeach (var item in context.TextLine.Texts) {\r\n\t\t\t\tif (MatchPosition(item.Region)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tbool MatchPosition(Bound bound) {\r\n\t\t\treturn Position switch {\r\n\t\t\t\t1 => bound.Top > MinValue && bound.Top < MaxValue,\r\n\t\t\t\t2 => bound.Bottom > MinValue && bound.Bottom < MaxValue,\r\n\t\t\t\t3 => bound.Left > MinValue && bound.Left < MaxValue,\r\n\t\t\t\t4 => bound.Right > MinValue && bound.Right < MaxValue,\r\n\t\t\t\t_ => false,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal override void Reset() {\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/AutoBookmarkFilters/TextSizeFilter.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t[System.Diagnostics.DebuggerDisplay(\"{MinSize}->{MaxSize}\")]\r\n\tpublic class TextSizeFilter : AutoBookmarkFilter\r\n\t{\r\n\t\tpublic float MinSize { get; }\r\n\t\tpublic float MaxSize { get; }\r\n\r\n\t\tpublic TextSizeFilter(float a, float b) {\r\n\t\t\tif (a > b) {\r\n\t\t\t\tMinSize = b;\r\n\t\t\t\tMaxSize = a;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tMinSize = a;\r\n\t\t\t\tMaxSize = b;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal override bool Matches(Model.AutoBookmarkContext context) {\r\n\t\t\tif (context.TextLine == null) {\r\n\t\t\t\tvar size = context.TextInfo.Size;\r\n\t\t\t\treturn MatchSize(size);\r\n\t\t\t}\r\n\t\t\tforeach (var item in context.TextLine.Texts) {\r\n\t\t\t\tif (MatchSize(item.Size)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tbool MatchSize(float size) {\r\n\t\t\treturn MinSize <= size && size <= MaxSize;\r\n\t\t}\r\n\r\n\t\tinternal override void Reset() {\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/CleanContentStreamProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t/// <summary>\r\n\t/// 清理内容流中无用输出指令的处理器。\r\n\t/// </summary>\r\n\tsealed class CleanContentStreamProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"清理内容指令\";\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage($\"　　删除了 {_processedPageCount} 页的冗余指令。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 3;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(3);\r\n\t\t\tvar p = context.PageCommands;\r\n\t\t\tvar r = TrimTrailingAdjustCommands(p);\r\n\t\t\tif (r) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tstatic bool TrimTrailingAdjustCommands(IPdfPageCommandContainer container) {\r\n\t\t\tvar cmds = container.Commands;\r\n\t\t\tvar l = cmds.Count;\r\n\t\t\tvar m = false;\r\n\t\t\tfor (int i = l - 1; i >= 0; i--) {\r\n\t\t\t\tvar cmd = cmds[i];\r\n\t\t\t\tif (cmd is EnclosingCommand ec) {\r\n\t\t\t\t\tm |= TrimTrailingAdjustCommands(ec);\r\n\t\t\t\t}\r\n\t\t\t\tif (cmd.HasOutput) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcmds.RemoveAt(i);\r\n\t\t\t\t\tm = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn m;\r\n\t\t}\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/ColorizeBinaryImageProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t/// <summary>\r\n\t/// 设置黑白图片的颜色。\r\n\t/// </summary>\r\n\tsealed class ColorizeBinaryImageProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"设置黑白图片颜色\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage(\"　　修改了 \" + _processedPageCount + \" 个黑白图片的颜色。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(1);\r\n\t\t\tvar images = context.Page.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (images == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar bw = new List<PdfName>();\r\n\t\t\tforeach (var item in images) {\r\n\t\t\t\tif (PdfReader.GetPdfObject(item.Value) is not PRStream im\r\n\t\t\t\t\t|| PdfName.IMAGE.Equals(im.GetAsName(PdfName.SUBTYPE)) == false\r\n\t\t\t\t\t|| im.TryGetInt32(PdfName.BITSPERCOMPONENT, 0) != 1\r\n\t\t\t\t\t) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tbw.Add(item.Key);\r\n\t\t\t}\r\n\t\t\tif (ProcessCommands(context.PageCommands.Commands, bw)) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tstatic bool ProcessCommands(IList<PdfPageCommand> parent, IList<PdfName> bwImages) {\r\n\t\t\tvar r = false;\r\n\t\t\tPdfPageCommand cmd;\r\n\t\t\tfor (int i = 0; i < parent.Count; i++) {\r\n\t\t\t\tcmd = parent[i];\r\n\t\t\t\tif (cmd is EnclosingCommand ec) {\r\n\t\t\t\t\tr |= ProcessCommands(ec.Commands, bwImages);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (cmd.Name.ToString() == \"Do\") {\r\n\t\t\t\t\tforeach (var item in bwImages) {\r\n\t\t\t\t\t\tif (item.Equals(cmd.Operands[0])) {\r\n\t\t\t\t\t\t\tparent.Insert(i, new AdjustCommand(\"RG\", new PdfNumber(1), new PdfNumber(0), new PdfNumber(0)));\r\n\t\t\t\t\t\t\tparent.Insert(i, new AdjustCommand(\"rg\", new PdfNumber(0), new PdfNumber(1), new PdfNumber(0)));\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/CommonProcessor.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class CommonProcessor : IPageProcessor\r\n\t{\r\n\t\treadonly PatcherOptions _options;\r\n\t\tpublic CommonProcessor(PatcherOptions options) {\r\n\t\t\t_options = options;\r\n\t\t}\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"PDF 常规处理\";\r\n\r\n\t\tint IPageProcessor.EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tvoid IPageProcessor.BeginProcess(DocProcessorContext context) {\r\n\t\t\tif (context.OutputDocument == null) {\r\n\t\t\t\tvar pdf = context.Pdf;\r\n\t\t\t\tvar c = pdf.Catalog;\r\n\t\t\t\tif (_options.RemoveUsageRights) {\r\n\t\t\t\t\tTracker.TraceMessage(\"删除权限控制。\");\r\n\t\t\t\t\tpdf.RemoveUsageRights();\r\n\t\t\t\t\tvar form = pdf.Catalog.GetAsDict(PdfName.ACROFORM);\r\n\t\t\t\t\tif (form != null) {\r\n\t\t\t\t\t\tform.Remove(PdfName.SIGFLAGS);\r\n\t\t\t\t\t\tvar fields = form.GetAsArray(PdfName.FIELDS);\r\n\t\t\t\t\t\tif (fields != null) {\r\n\t\t\t\t\t\t\tfor (int i = fields.Size - 1; i >= 0; i--) {\r\n\t\t\t\t\t\t\t\tvar f = fields.GetAsDict(i);\r\n\t\t\t\t\t\t\t\tif (f != null && PdfName.SIG.Equals(f.GetAsName(PdfName.FT))) {\r\n\t\t\t\t\t\t\t\t\tfields.Remove(i);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.RemoveXmlMetadata) {\r\n\t\t\t\t\tTracker.TraceMessage(\"删除 XML 元数据。\");\r\n\t\t\t\t\tPdfReader.KillIndirect(c.Get(PdfName.METADATA));\r\n\t\t\t\t\tc.Remove(PdfName.METADATA);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (_options.RemoveDocAutoActions) {\r\n\t\t\t\t\tTracker.TraceMessage(\"删除打开文档时的自动动作。\");\r\n\t\t\t\t\tc.Remove(PdfName.OPENACTION);\r\n\t\t\t\t\tc.Remove(PdfName.AA);\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.RemoveAnnotations) {\r\n\t\t\t\t\tTracker.TraceMessage(\"删除文档批注。\");\r\n\t\t\t\t\tpdf.Catalog.Remove(PdfName.ACROFORM);\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.RemoveAttachments) {\r\n\t\t\t\t\tTracker.TraceMessage(\"删除文档附件。\");\r\n\t\t\t\t\tvar names = pdf.Catalog.GetAsDict(PdfName.NAMES);\r\n\t\t\t\t\tif (names != null) {\r\n\t\t\t\t\t\tnames.Remove(PdfName.EMBEDDEDFILES);\r\n\t\t\t\t\t\tif (names.Size == 0) {\r\n\t\t\t\t\t\t\tpdf.Catalog.Remove(PdfName.NAMES);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_options.RemovePageAutoActions) {\r\n\t\t\t\tTracker.TraceMessage(\"删除页面自动动作。\");\r\n\t\t\t}\r\n\t\t\tif (_options.RemovePageMetaData) {\r\n\t\t\t\tTracker.TraceMessage(\"删除页面扩展标记元数据属性。\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbool IPageProcessor.Process(PageProcessorContext context) {\r\n\t\t\tbool isTouched = false;\r\n\t\t\tvar page = context.Page;\r\n\t\t\tif (_options.RemoveAnnotations && page.Contains(PdfName.ANNOTS)) {\r\n\t\t\t\tpage.Remove(PdfName.ANNOTS);\r\n\t\t\t\tisTouched = true;\r\n\t\t\t}\r\n\t\t\tif (_options.RemovePageAutoActions && page.Contains(PdfName.AA)) {\r\n\t\t\t\tpage.Remove(PdfName.AA);\r\n\t\t\t\tisTouched = true;\r\n\t\t\t}\r\n\t\t\tif (_options.RemovePageMetaData && page.Contains(PdfName.METADATA)) {\r\n\t\t\t\tpage.Remove(PdfName.METADATA);\r\n\t\t\t\tisTouched = true;\r\n\t\t\t}\r\n\t\t\tTracker.IncrementProgress(1);\r\n\t\t\treturn isTouched;\r\n\t\t}\r\n\r\n\t\tbool IPageProcessor.EndProcess(PdfReader pdf) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/FixContentProcessor.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class FixContentProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"修复并删除冗余内容\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage($\"　　删除了 {_processedPageCount} 页的冗余内容。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 3;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(3);\r\n\t\t\tif (ProcessCommands(context.PageCommands)) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tstatic bool ProcessCommands(Model.IPdfPageCommandContainer container) {\r\n\t\t\tvar r = false;\r\n\t\t\tvar cl = container.Commands;\r\n\t\t\tvar l = cl.Count;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tif (cl[i] is Model.EnclosingCommand ec) {\r\n\t\t\t\t\tr |= ProcessCommands(ec);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/IDocProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinterface IDocProcessor : IProcessor\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 估算工作量。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pdf\">需要处理的文档。</param>\r\n\t\t/// <returns>整数工作量（用于显示进度条）。</returns>\r\n\t\tint EstimateWorkload(iTextSharp.text.pdf.PdfReader pdf);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 在处理页面前调用，初始化处理器。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"context\">包含传入文档的 <see cref=\"DocProcessorContext\"/></param>\r\n\t\tvoid BeginProcess(DocProcessorContext context);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 处理传入的文档。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"context\">包含传入文档的 <see cref=\"DocProcessorContext\"/></param>\r\n\t\t/// <returns>更改文档内容后返回 true。</returns>\r\n\t\tbool Process(DocProcessorContext context);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 在处理页面后调用。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"context\">包含传入文档的 <see cref=\"DocProcessorContext\"/></param>\r\n\t\tvoid EndProcess(DocProcessorContext context);\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/IPageProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinterface IPageProcessor : IProcessor\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 估算工作量。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pdf\">需要处理的文档。</param>\r\n\t\t/// <returns>整数工作量（用于显示进度条）。</returns>\r\n\t\tint EstimateWorkload(PdfReader pdf);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 在处理页面前调用，初始化处理器。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"context\">包含传入文档的 <see cref=\"DocProcessorContext\"/></param>\r\n\t\t/// <returns>更改文档内容后返回 true。</returns>\r\n\t\tvoid BeginProcess(DocProcessorContext context);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 处理传入的页面。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"context\">包含传入页面的 <see cref=\"PageProcessorContext\"/></param>\r\n\t\t/// <returns>更改页面内容后返回 true。</returns>\r\n\t\tbool Process(PageProcessorContext context);\r\n\r\n\t\t/// <summary>\r\n\t\t/// 完成处理文档的操作，在完成处理所有页面后被调用。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pdf\">需要处理的文档。</param>\r\n\t\t/// <returns>更改文档内容后返回 true。</returns>\r\n\t\tbool EndProcess(PdfReader pdf);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/ImageDeskewProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Processor.Imaging;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tclass ImageDeskewProcessor : IPageProcessor\r\n\t{\r\n\t\tstatic readonly ExportImageOptions _imgExpOption = new ExportImageOptions () {\r\n\t\t\tExportImagePath = System.IO.Path.GetTempPath (),\r\n\t\t\tMergeImages = false\r\n\t\t};\r\n\t\tint _processedImageCount;\r\n\t\tint _deskewedImageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name { get { return \"校正倾斜图片\"; } }\r\n\r\n\t\tpublic void BeginProcess (PdfReader pdf) {\r\n\t\t\t_processedImageCount = 0;\r\n\t\t\t_deskewedImageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess (PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage (Tracker.Category.Notice, this.Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage (\"　　处理了 \" + _processedImageCount + \" 幅图片。\");\r\n\t\t\tTracker.TraceMessage (\"　　校正了 \" + _deskewedImageCount + \" 幅图片的角度。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload (PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 10;\r\n\t\t}\r\n\r\n\t\tpublic bool Process (Model.PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress (10);\r\n\t\t\tProcessor.PdfImageExporter ie = new PdfImageExporter (_imgExpOption, context.Pdf);\r\n\t\t\tvar images = PdfHelper.Locate<PdfDictionary> (context.Page, true, PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (images == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tDictionary<PdfName, double> angles = new Dictionary<PdfName, double> ();\r\n\t\t\tforeach (var item in images) {\r\n\t\t\t\tvar im = PdfReader.GetPdfObject (item.Value) as PRStream;\r\n\t\t\t\tif (im == null\r\n\t\t\t\t\t|| PdfName.IMAGE.Equals (im.GetAsName (PdfName.SUBTYPE)) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_processedImageCount++;\r\n\t\t\t\tvar l = im.GetAsNumber (PdfName.LENGTH);\r\n\t\t\t\tif (l == null || l.IntValue < 400 /*忽略小图片*/) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar inf = new ImageInfo (item.Value as PdfIndirectReference);\r\n\t\t\t\tvar b = inf.DecodeImage (_imgExpOption);\r\n\t\t\t\tusing (var fi = PdfImageExporter.CreateFreeImageBitmap (inf, ref b, false, false)) {\r\n\t\t\t\t\t//if (fi.Height > 500 && fi.Width > 500) {\r\n\t\t\t\t\t//    var zy = (float)fi.Height / 500f;\r\n\t\t\t\t\t//    var zx = (float)fi.Width / 500f;\r\n\t\t\t\t\t//    if (zy > zx) {\r\n\t\t\t\t\t//        fi.Rescale (500, (int)((float)fi.Height / zx), FreeImageAPI.FREE_IMAGE_FILTER.FILTER_BILINEAR);\r\n\t\t\t\t\t//    }\r\n\t\t\t\t\t//    else {\r\n\t\t\t\t\t//        fi.Rescale ((int)((float)fi.Width / zy), 500, FreeImageAPI.FREE_IMAGE_FILTER.FILTER_BILINEAR);\r\n\t\t\t\t\t//    }\r\n\t\t\t\t\t//}\r\n\t\t\t\t\tangles.Add (item.Key, new ImageDeskew ().GetSkewAngle (fi)); // 获取图片倾斜角度\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (angles.Count == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar p = new PdfPageCommandProcessor (context);\r\n\t\t\tvar r = false;\r\n\t\t\tforeach (var item in p.Commands) {\r\n\t\t\t\tr |= ProcessSubCommand (item, angles);\r\n\t\t\t}\r\n\t\t\tif (r == true) {\r\n\t\t\t\tp.WritePdfCommands (context);\r\n\t\t\t\t_deskewedImageCount++;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate bool ProcessSubCommand (Model.PdfPageCommand item, Dictionary<PdfName, double> angles) {\r\n\t\t\tif (item.Type != Model.PdfPageCommandType.Enclosure) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar ec = (item as Model.EnclosingCommand);\r\n\t\t\tif (ec.Name.ToString () == \"q\") {\r\n\t\t\t\tif (ec.SubCommands.Count != 2\r\n\t\t\t\t\t|| ec.SubCommands[0].Name.ToString () != \"cm\"\r\n\t\t\t\t\t|| ec.SubCommands[1].Name.ToString () != \"Do\") {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tvar m = ec.SubCommands[0] as Model.MatrixCommand;\r\n\t\t\t\tvar d = ec.SubCommands[1];\r\n\t\t\t\tif (d.HasOperand == false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tdouble a;\r\n\t\t\t\tif (angles.TryGetValue (d.Operands[0] as PdfName, out a) == false || a < 0.0001 && a > -0.0001) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TraceMessage (d.Operands[0].ToString () + \" rotate \" + a.ToString ());\r\n\t\t\t\ta *= Math.PI / 180f;\r\n\t\t\t\tec.SubCommands.Insert (0, new Model.MatrixCommand (new PdfLiteral (\"cm\"), new List<PdfObject> () {\r\n\t\t\t\t\tnew PdfNumber(Math.Cos (a)),\r\n\t\t\t\t\tnew PdfNumber(Math.Sin (a)),\r\n\t\t\t\t\tnew PdfNumber(-Math.Sin (a)),\r\n\t\t\t\t\tnew PdfNumber(Math.Cos (a)),\r\n\t\t\t\t\tnew PdfNumber (0), new PdfNumber(0)\r\n\t\t\t\t}));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tvar r = false;\r\n\t\t\tforeach (var sub in ec.SubCommands) {\r\n\t\t\t\tr |= ProcessSubCommand (sub, angles);\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/ImageRecompressor.cs",
    "content": "﻿using System;\r\nusing System.Linq;\r\nusing FreeImageAPI;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor.Imaging;\r\nusing ColorDepth = FreeImageAPI.FREE_IMAGE_COLOR_DEPTH;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ImageRecompressor : IPageProcessor\r\n\t{\r\n\t\tstatic readonly PdfName[] __IgnoreFilters = [PdfName.JBIG2DECODE];\r\n\t\tstatic readonly ImageExtracterOptions _imgExpOption = new ImageExtracterOptions() {\r\n\t\t\tOutputPath = System.IO.Path.GetTempPath(),\r\n\t\t\tMergeImages = false\r\n\t\t};\r\n\r\n\t\tint _processedImageCount;\r\n\t\tint _optimizedImageCount;\r\n\r\n\t\tpublic byte BinaryThreshold { get; set; }\r\n\t\tpublic byte Algorithm { get; set; }\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"优化压缩黑白图片\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedImageCount = 0;\r\n\t\t\t_optimizedImageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage($\"　　处理了 {_processedImageCount} 幅图片。\");\r\n\t\t\tTracker.TraceMessage($\"　　优化了 {_optimizedImageCount} 幅图片的压缩率。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 10;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(10);\r\n\t\t\treturn IterateObjects(context.Page);\r\n\t\t}\r\n\r\n\t\tbool IterateObjects(PdfDictionary container) {\r\n\t\t\tvar items = container.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (items == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\tif (item.Value is PdfIndirectReference pdfRef\r\n\t\t\t\t\t&& PdfReader.GetPdfObject(pdfRef) is PRStream im) {\r\n\t\t\t\t\tvar subType = im.GetAsName(PdfName.SUBTYPE);\r\n\t\t\t\t\tif (PdfName.IMAGE.Equals(subType)) {\r\n\t\t\t\t\t\tCompressImage(pdfRef, im);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (PdfName.FORM.Equals(subType)) {\r\n\t\t\t\t\t\tIterateObjects(im);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tvoid CompressImage(PdfIndirectReference pdfRef, PRStream img) {\r\n\t\t\t_processedImageCount++;\r\n\t\t\tvar l = img.GetAsNumber(PdfName.LENGTH);\r\n\t\t\tif (l == null || l.IntValue < 400 /*忽略小图片*/) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar f = img.Get(PdfName.FILTER);\r\n\t\t\tPdfName fn = null;\r\n\t\t\tif (f.Type == PdfObject.ARRAY) {\r\n\t\t\t\tvar fl = f as PdfArray;\r\n\t\t\t\tfn = fl.GetAsName(fl.Size - 1);\r\n\t\t\t}\r\n\t\t\telse if (f.Type == PdfObject.NAME) {\r\n\t\t\t\tfn = f as PdfName;\r\n\t\t\t}\r\n\t\t\tif (fn == null || !__IgnoreFilters.Contains(fn)) {\r\n\t\t\t\tif (OptimizeBinaryImage(pdfRef, img, l.IntValue, BinaryThreshold, Algorithm)\r\n\t\t\t\t\t/*|| ReplaceJ2kImage(pdfRef, im, fn)*/) {\r\n\t\t\t\t\t_optimizedImageCount++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic bool OptimizeBinaryImage(PdfIndirectReference imgRef, PRStream imgStream, int length, byte binaryThreshold, byte algorithm) {\r\n\t\t\tvar oneBitPerComponent = imgStream.GetAsNumber(PdfName.BITSPERCOMPONENT)?.IntValue == 1;\r\n\t\t\tvar isMask = imgStream.GetAsBoolean(PdfName.IMAGEMASK)?.BooleanValue == true;\r\n\t\t\tif (oneBitPerComponent == false && isMask == false && binaryThreshold == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tvar info = new ImageInfo(imgRef);\r\n\t\t\tvar bytes = info.DecodeImage(_imgExpOption);\r\n\t\t\tusing (var fi = ImageExtractor.CreateFreeImageBitmap(info, ref bytes, false, info.ICCProfile != null)) {\r\n\t\t\t\tinfo.CreatePaletteAndIccProfile(fi);\r\n\t\t\t\tif (binaryThreshold != 0\r\n\t\t\t\t\t&& (fi.HasPalette == false\r\n\t\t\t\t\t|| fi.UniqueColors > 256\r\n\t\t\t\t\t|| fi.UseDib(dib => FreeImage.ConvertColorDepth(dib, algorithm == 255 ? ColorDepth.FICD_01_BPP_THRESHOLD | ColorDepth.FICD_FORCE_GREYSCALE | ColorDepth.FICD_REORDER_PALETTE : ColorDepth.FICD_01_BPP_DITHER, binaryThreshold, false)) == false)) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tvar sb = JBig2Encoder.Encode(fi);\r\n\t\t\t\tif (sb.Length > length) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\timgStream.SetData(sb, false);\r\n\t\t\t\timgStream.Put(PdfName.FILTER, PdfName.JBIG2DECODE);\r\n\t\t\t\timgStream.Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);\r\n\t\t\t\timgStream.Put(PdfName.BITSPERCOMPONENT, new PdfNumber(1));\r\n\t\t\t\timgStream.Put(PdfName.LENGTH, new PdfNumber(sb.Length));\r\n\t\t\t\timgStream.Remove(PdfName.K);\r\n\t\t\t\timgStream.Remove(PdfName.ENDOFLINE);\r\n\t\t\t\timgStream.Remove(PdfName.ENCODEDBYTEALIGN);\r\n\t\t\t\timgStream.Remove(PdfName.ROWS);\r\n\t\t\t\timgStream.Remove(PdfName.ENDOFBLOCK);\r\n\t\t\t\timgStream.Remove(PdfName.BLACKIS1);\r\n\t\t\t\timgStream.Remove(PdfName.PREDICTOR);\r\n\t\t\t\timgStream.Remove(PdfName.COLORS);\r\n\t\t\t\timgStream.Remove(PdfName.COLUMNS);\r\n\t\t\t\timgStream.Remove(PdfName.EARLYCHANGE);\r\n\t\t\t\timgStream.Remove(PdfName.DECODEPARMS);\r\n\t\t\t\timgStream.Remove(PdfName.DECODE);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tstatic bool ReplaceJ2kImage(PdfIndirectReference imgRef, PRStream imgStream, PdfName filter) {\r\n\t\t\tif (PdfName.JPXDECODE.Equals(filter) == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tvar info = new ImageInfo(imgRef);\r\n\t\t\tbyte[] jpg;\r\n\t\t\tusing (var ms = new System.IO.MemoryStream(info.DecodeImage(_imgExpOption)))\r\n\t\t\tusing (var js = new System.IO.MemoryStream())\r\n\t\t\tusing (var fi = new FreeImageAPI.FreeImageBitmap(ms)) {\r\n\t\t\t\tfi.Save(js, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_JPEG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_BASELINE | FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYNORMAL | FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_PROGRESSIVE);\r\n\t\t\t\tjpg = js.ToArray();\r\n\t\t\t}\r\n\t\t\timgStream.SetData(jpg, false);\r\n\t\t\timgStream.Put(PdfName.FILTER, PdfName.DCTDECODE);\r\n\t\t\timgStream.Put(PdfName.LENGTH, new PdfNumber(jpg.Length));\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/ImportOcrResultProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ImportOcrResultProcessor : IDocProcessor\r\n\t{\r\n\t\tstatic readonly PdfName PieceInfo = new PdfName(\"PieceInfo\");\r\n\t\tstatic readonly PdfName ApplicationName = new PdfName(Constants.AppEngName);\r\n\t\tstatic readonly PdfName LastModified = new PdfName(\"LastModified\");\r\n\t\tstatic readonly PdfName OcrFont = new PdfName(\"OcrFont\");\r\n\t\tstatic readonly PdfName OcrFontV = new PdfName(\"OcrFontV\");\r\n\t\tstatic readonly PdfName GbkEucH = new PdfName(\"GBK-EUC-H\");\r\n\t\tstatic readonly PdfName GbkEucV = new PdfName(\"GBK-EUC-V\");\r\n\t\tstatic readonly PdfName DescendantFonts = new PdfName(\"DescendantFonts\");\r\n\t\tstatic readonly PdfName FontName = new PdfName(\"STSong-Light\");\r\n\t\tstatic readonly PdfName OcrResultBmcName = new PdfName(\"XXOcrResult\");\r\n\t\tstatic readonly Encoding GbkEncoding = Encoding.GetEncoding(\"GBK\");\r\n\r\n\t\tPdfIndirectReference font;\r\n\t\tPdfIndirectReference fontV;\r\n\r\n\t\t#region IDocProcessor 成员\r\n\t\tpublic string Name => \"导入光学字符识别结果\";\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\tif (context.ExtraData[DocProcessorContext.OcrData] is not XmlReader x) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (x.Name == Constants.PdfInfo) {\r\n\t\t\t\tx.Read();\r\n\t\t\t\tx.MoveToContent();\r\n\t\t\t}\r\n\t\t\tCreateGlobalOcrFontReference(context);\r\n\t\t}\r\n\r\n\t\tpublic bool Process(DocProcessorContext context) {\r\n\t\t\tif (context.ExtraData[DocProcessorContext.OcrData] is not XmlReader x || x.Name != Constants.Ocr.Result) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tImportOcrResult(context, x);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic void EndProcess(DocProcessorContext context) {\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tprivate void ImportOcrResult(DocProcessorContext context, XmlReader x) {\r\n\t\t\tint l = 0;\r\n\t\t\tint p;\r\n\t\t\tvar pdf = context.Pdf;\r\n\t\t\tint pn = pdf.NumberOfPages;\r\n\t\t\tvar xd = new XmlDocument();\r\n\t\t\tPdfDictionary page;\r\n\t\t\twhile (!x.EOF) {\r\n\t\t\t\t// 读取一页识别结果\r\n\t\t\t\tif (x.MoveToContent() != XmlNodeType.Element\r\n\t\t\t\t\t|| x.Name != Constants.Ocr.Result\r\n\t\t\t\t\t|| x.GetAttribute(Constants.Content.PageNumber).TryParse(out p) == false\r\n\t\t\t\t\t|| p < 1 || p > pn) {\r\n\t\t\t\t\tx.Skip();\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tusing (var r = x.ReadSubtree()) {\r\n\t\t\t\t\txd.Load(r);\r\n\t\t\t\t}\r\n\t\t\t\tpage = pdf.GetPageN(p);\r\n\t\t\t\tvar cp = new PdfPageCommandProcessor();\r\n\t\t\t\tcp.ProcessContent(pdf.GetPageContent(p), page.GetAsDict(PdfName.RESOURCES));\r\n\t\t\t\tvar commands = cp.Commands;\r\n\t\t\t\tClearPreviousOcrResult(commands);\r\n\t\t\t\t// 用“q”操作符括起旧的命令\r\n\t\t\t\tif (commands.Count > 1) {\r\n\t\t\t\t\tvar q = EnclosingCommand.Create(\"q\", null);\r\n\t\t\t\t\tforeach (var item in commands) {\r\n\t\t\t\t\t\tq.Commands.Add(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcommands.Clear();\r\n\t\t\t\t\tcommands.Add(q);\r\n\t\t\t\t}\r\n\t\t\t\t// 写入各图像的识别结果\r\n\t\t\t\tvar ir = xd.SelectNodes(Constants.Ocr.Result + \"/\" + Constants.Ocr.Image);\r\n\t\t\t\tvar fontUse = 0;\r\n\t\t\t\tforeach (XmlElement image in ir) {\r\n#if DEBUG\r\n\t\t\t\t\tvar bt = EnclosingCommand.Create(\"BT\", null);\r\n#else\r\n\t\t\t\t\tvar bt = EnclosingCommand.Create (\"BT\", null,\r\n\t\t\t\t\t\tnew AdjustCommand (\"Tr\", new PdfNumber (3)) // 隐藏识别的文本\r\n\t\t\t\t\t\t);\r\n#endif\r\n\t\t\t\t\tvar bmc = EnclosingCommand.Create(\"BMC\", [OcrResultBmcName], bt);\r\n\t\t\t\t\tfontUse |= ImportImageOcrResult(bt, image);\r\n\t\t\t\t\tcommands.Add(bmc);\r\n\t\t\t\t}\r\n\t\t\t\tcp.WritePdfCommands(pdf, p);\r\n\t\t\t\tif ((fontUse & 1) > 0) {\r\n\t\t\t\t\tCreatePageOcrFontReference(context, page, font);\r\n\t\t\t\t}\r\n\t\t\t\tif ((fontUse & 2) > 0) {\r\n\t\t\t\t\tCreatePageOcrFontReference(context, page, fontV);\r\n\t\t\t\t}\r\n\t\t\t\tif (l < pn) {\r\n\t\t\t\t\tl++;\r\n\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static void ClearPreviousOcrResult(IList<PdfPageCommand> commands) {\r\n\t\t\tfor (int i = commands.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (commands[i] is not EnclosingCommand c\r\n\t\t\t\t\t|| c.HasOperand == false\r\n\t\t\t\t\t|| c.Name.ToString() != \"BMC\"\r\n\t\t\t\t\t|| OcrResultBmcName.Equals(c.Operands[0]) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tcommands.RemoveAt(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void CreateGlobalOcrFontReference(DocProcessorContext context) {\r\n\t\t\tvar c = context.Pdf.Catalog;\r\n\t\t\tPdfDictionary d;\r\n\t\t\tif ((d = c.Locate<PdfDictionary>(false, PieceInfo, ApplicationName)) == null) {\r\n\t\t\t\td = c.CreateDictionaryPath(PieceInfo, ApplicationName);\r\n\t\t\t\td.Put(LastModified, new PdfString(\"D:\" + DateTime.Now.ToString(\"yyMMddHHmmss\")));\r\n\t\t\t}\r\n\t\t\tfont = CreateOcrFont(context, d, false);\r\n\t\t\tfontV = CreateOcrFont(context, d, true);\r\n\t\t}\r\n\r\n\t\tprivate static PdfIndirectReference CreateOcrFont(DocProcessorContext context, PdfDictionary d, bool isVertical) {\r\n\t\t\tPdfIndirectReference fontRef;\r\n\t\t\tvar fontName = isVertical ? OcrFontV : OcrFont;\r\n\t\t\tfontRef = d.GetAsIndirectObject(fontName);\r\n\t\t\tif (fontRef == null || d.GetDirectObject(fontName) is not PdfDictionary) {\r\n\t\t\t\tfontRef = CreateOcrFont(context, isVertical);\r\n\t\t\t\td.Put(fontName, fontRef);\r\n\t\t\t}\r\n\t\t\treturn fontRef;\r\n\t\t}\r\n\r\n\t\tprivate static PdfIndirectReference CreateOcrFont(DocProcessorContext context, bool isVertical) {\r\n\t\t\tvar f = new PdfDictionary(PdfName.FONT);\r\n\r\n\t\t\tf.Put(PdfName.SUBTYPE, PdfName.TYPE0);\r\n\t\t\tf.Put(PdfName.BASEFONT, isVertical ? OcrFontV : OcrFont);\r\n\t\t\tf.Put(PdfName.ENCODING, isVertical ? GbkEucV : GbkEucH);\r\n\r\n\t\t\tvar a = new PdfArray();\r\n\t\t\tf.Put(DescendantFonts, a);\r\n\t\t\t// DescendantFont\r\n\t\t\tvar df = new PdfDictionary(PdfName.FONT);\r\n\t\t\ta.Add(context.Pdf.AddPdfObject(df));\r\n\r\n\t\t\tdf.Put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE0);\r\n\t\t\tdf.Put(PdfName.BASEFONT, FontName);\r\n\t\t\tvar csi = new PdfDictionary();\r\n\t\t\tcsi.Put(PdfName.REGISTRY, new PdfString(\"Adobe\"));\r\n\t\t\tcsi.Put(PdfName.ORDERING, new PdfString(\"GB1\"));\r\n\t\t\tcsi.Put(PdfName.SUPPLEMENT, new PdfNumber(3));\r\n\t\t\tdf.Put(PdfName.CIDSYSTEMINFO, csi);\r\n\t\t\tcsi = null;\r\n\r\n\t\t\t// FontDescriptor\r\n\t\t\tvar fd = new PdfDictionary(PdfName.FONTDESCRIPTOR);\r\n\t\t\tdf.Put(PdfName.FONTDESCRIPTOR, context.Pdf.AddPdfObject(fd));\r\n\t\t\tfd.Put(PdfName.ASCENT, new PdfNumber(857));\r\n\t\t\tfd.Put(PdfName.CAPHEIGHT, new PdfNumber(857));\r\n\t\t\tfd.Put(PdfName.DESCENT, new PdfNumber(-143));\r\n\t\t\tfd.Put(PdfName.FLAGS, new PdfNumber(4));\r\n\t\t\tfd.Put(PdfName.FONTBBOX, new PdfArray(new int[] { -250, -143, 600, 857 }));\r\n\t\t\tfd.Put(PdfName.FONTNAME, FontName);\r\n\t\t\tfd.Put(PdfName.STEMV, new PdfNumber(91));\r\n\t\t\tfd.Put(new PdfName(\"StemH\"), new PdfNumber(91));\r\n\t\t\treturn context.Pdf.AddPdfObject(f);\r\n\t\t}\r\n\r\n\t\tprivate PdfName CreatePageOcrFontReference(DocProcessorContext context, PdfDictionary page, PdfIndirectReference fontRef) {\r\n\t\t\tvar f = page.CreateDictionaryPath(PdfName.RESOURCES, PdfName.FONT);\r\n\t\t\tforeach (var item in f) {\r\n\t\t\t\tif (PdfHelper.PdfReferencesAreEqual(fontRef, item.Value as PdfIndirectReference)) {\r\n\t\t\t\t\treturn item.Key;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontext.IsModified = true;\r\n\t\t\tvar n = PdfHelper.PdfReferencesAreEqual(fontRef, font) ? OcrFont : OcrFontV;\r\n\t\t\tf.Put(n, fontRef);\r\n\t\t\treturn n;\r\n\t\t}\r\n\r\n\t\tstatic int ImportImageOcrResult(EnclosingCommand container, XmlElement result) {\r\n\t\t\tint w = 0, h = 0;\r\n\t\t\tvar sc = container.Commands;\r\n\t\t\tvar chars = result.SelectNodes(Constants.Ocr.Content);\r\n\t\t\tif (chars.Count == 0) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif (result.GetAttribute(Constants.Coordinates.Width).TryParse(out w) == false\r\n\t\t\t\t|| result.GetAttribute(Constants.Coordinates.Height).TryParse(out h) == false\r\n\t\t\t\t|| w <= 0\r\n\t\t\t\t|| h <= 0\r\n\t\t\t\t) {\r\n\t\t\t\tTracker.TraceMessage($\"识别结果的“{Constants.Ocr.Image}”元素{(w <= 0 ? \"宽属性无效\" : String.Empty)}{(h <= 0 ? \"高属性无效\" : String.Empty)}。\");\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tvar m = result.GetAttribute(Constants.Content.OperandNames.Matrix);\r\n\t\t\tif (String.IsNullOrEmpty(m)) {\r\n\t\t\t\tTracker.TraceMessage($\"识别结果的“{Constants.Ocr.Image}”元素缺少{Constants.Content.OperandNames.Matrix}属性。\");\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tvar matrix = DocInfoImporter.ToSingleArray(m, true);\r\n\t\t\tif (matrix == null || matrix.Length < 6) {\r\n\t\t\t\tTracker.TraceMessage($\"识别结果的“{Constants.Ocr.Image}”元素中，{Constants.Content.OperandNames.Matrix}属性值无效。\");\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tvar info = new OcrContentInfo(w, h);\r\n\t\t\tsc.Add(new AdjustCommand(\"Tm\", \r\n\t\t\t\tnew PdfNumber(matrix[OcrContentInfo.A1] / w), new PdfNumber(matrix[OcrContentInfo.A2] / w),\r\n\t\t\t\tnew PdfNumber(matrix[OcrContentInfo.B1] / h), new PdfNumber(matrix[OcrContentInfo.B2] / h),\r\n\t\t\t\tnew PdfNumber(matrix[OcrContentInfo.DX]), new PdfNumber(matrix[OcrContentInfo.DY])\r\n\t\t\t\t)); // 设置初始偏移\r\n\t\t\tvar fSize = -1f;\r\n\t\t\tbool isV = false, hasHFont = false, hasVFont = false;\r\n\t\t\tPdfName fn;\r\n\t\t\tforeach (var item in chars) {\r\n\t\t\t\tif (info.GetInfo(item as XmlElement) && String.IsNullOrEmpty(info.Text) == false) {\r\n\t\t\t\t\tif (info.IsVertical) {\r\n\t\t\t\t\t\thasVFont = true;\r\n\t\t\t\t\t\tfn = OcrFontV;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thasHFont = true;\r\n\t\t\t\t\t\tfn = OcrFont;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (info.FontSize != fSize) {\r\n\t\t\t\t\t\tsc.Add(new AdjustCommand(\"Tf\", fn, new PdfNumber(info.FontSize)));\r\n\t\t\t\t\t\tfSize = info.FontSize;\r\n\t\t\t\t\t\tisV = info.IsVertical;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (isV != info.IsVertical) {\r\n\t\t\t\t\t\tsc.Add(new AdjustCommand(\"Tf\", fn, new PdfNumber(fSize)));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsc.Add(new AdjustCommand(\"Td\", new PdfNumber(info.DeltaX), new PdfNumber(info.DeltaY)));\r\n\t\t\t\t\tsc.Add(new OutputCommand(\"Tj\", new PdfString(GbkEncoding.GetBytes(info.Text))));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn (hasHFont ? 1 : 0) + (hasVFont ? 2 : 0);\r\n\t\t}\r\n\r\n\t\tsealed class OcrContentInfo\r\n\t\t{\r\n\t\t\tinternal const int A1 = 0, A2 = 1, B1 = 2, B2 = 3, DX = 4, DY = 5; // 矩阵数组索引\r\n\t\t\tinternal int ImageWidth { get; }\r\n\t\t\tinternal int ImageHeight { get; }\r\n\t\t\tinternal string Text { get; private set; }\r\n\t\t\tinternal int DeltaX => _dx;\r\n\t\t\tinternal int DeltaY => _dy;\r\n\t\t\tinternal bool IsVertical => _isVertical;\r\n\t\t\tinternal float FontSize => _size;\r\n\r\n\t\t\tbool _isVertical;\r\n\t\t\tstring _text;\r\n\t\t\tint _top, _bottom, _left, _right, _size;\r\n\t\t\tint _cx, _cy, _dx, _dy;\r\n\t\t\tinternal OcrContentInfo(int imageWidth, int imageHeight) {\r\n\t\t\t\tImageHeight = imageHeight;\r\n\t\t\t\tImageWidth = imageWidth;\r\n\t\t\t}\r\n\t\t\tinternal bool GetInfo(XmlElement ocrInfoItem) {\r\n\t\t\t\tif (ocrInfoItem.GetAttribute(Constants.Coordinates.Top).TryParse(out _top) == false\r\n\t\t\t\t\t|| ocrInfoItem.GetAttribute(Constants.Coordinates.Bottom).TryParse(out _bottom) == false\r\n\t\t\t\t\t|| ocrInfoItem.GetAttribute(Constants.Coordinates.Left).TryParse(out _left) == false\r\n\t\t\t\t\t|| ocrInfoItem.GetAttribute(Constants.Coordinates.Right).TryParse(out _right) == false\r\n\t\t\t\t\t|| _top < 0 || _bottom < 0 || _left < 0 || _right < 0\r\n\t\t\t\t\t|| _top > ImageHeight || _bottom > ImageHeight || _left > ImageWidth || _right > ImageWidth\r\n\t\t\t\t\t|| String.IsNullOrEmpty(_text = ocrInfoItem.GetAttribute(Constants.Ocr.Text))\r\n\t\t\t\t\t) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\t_isVertical = ocrInfoItem.GetAttribute(Constants.Coordinates.Direction) == Constants.Coordinates.Vertical;\r\n\t\t\t\t_size = Math.Abs(_isVertical ? _right - _left : _bottom - _top);\r\n\t\t\t\tif (_isVertical) {\r\n\t\t\t\t\t_top = ImageHeight - _top;\r\n\t\t\t\t\t_dx = _left - _cx;\r\n\t\t\t\t\t_dy = _top - _cy;\r\n\t\t\t\t\t_cx = _left;\r\n\t\t\t\t\t_cy = _top;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t_bottom = ImageHeight - _bottom;\r\n\t\t\t\t\t_dx = _left - _cx;\r\n\t\t\t\t\t_dy = _bottom - _cy;\r\n\t\t\t\t\t_cx = _left;\r\n\t\t\t\t\t_cy = _bottom;\r\n\t\t\t\t}\r\n\t\t\t\tText = _text;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/PageDimensionProcessor.cs",
    "content": "﻿using System;\r\nusing System.Text;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class PageDimensionProcessor : IPageProcessor\r\n\t{\r\n\t\tCoordinateTranslationSettings[] _cts;\r\n\t\tbool _resizePages, _adjustMargins;\r\n\t\tPageRangeCollection _pageRanges;\r\n\t\tPaperSize _refPaperSize;\r\n\t\tpublic PageBoxSettings Settings { get; set; }\r\n\r\n\t\tinternal static CoordinateTranslationSettings ResizePage(PdfDictionary page, PageBoxSettings settings, PaperSize refPaperSize) {\r\n\t\t\tvar size = refPaperSize ?? settings.PaperSize.Clone();\r\n\t\t\tvar hAlign = settings.HorizontalAlign;\r\n\t\t\tvar vAlign = settings.VerticalAlign;\r\n\t\t\tvar pb = page.GetAsArray(PdfName.CROPBOX);\r\n\t\t\tvar b = pb != null ? PdfReader.GetNormalizedRectangle(pb) : null;\r\n\t\t\tpb = page.GetAsArray(PdfName.MEDIABOX);\r\n\t\t\tif (pb == null) {\r\n\t\t\t\tthrow new PdfException(\"页面缺少 MediaBox。\");\r\n\t\t\t}\r\n\t\t\tvar mb = PdfReader.GetNormalizedRectangle(pb);\r\n\t\t\tvar n = PdfHelper.GetPageRotation(page);\r\n\t\t\tif (n == 90 || n == 270) {\r\n\t\t\t\tsize = new PaperSize(size.PaperName, size.Height, size.Width);\r\n\t\t\t}\r\n\t\t\t// 自动旋转页面适应原页面的方向\r\n\t\t\tif (settings.AutoRotation && size.SpecialSize == SpecialPaperSize.None && (size.Width > size.Height) ^ (mb.Width > mb.Height)) {\r\n\t\t\t\tsize = new PaperSize(size.PaperName, size.Height, size.Width);\r\n\t\t\t}\r\n\t\t\tb ??= new Rectangle(mb);\r\n\t\t\tfloat d, z = 1, zx = 1, zy = 1;\r\n\t\t\tfloat dx = 0, dy = 0;\r\n\t\t\tfloat sw = b.Width, sh = b.Height; // resized width and height\r\n\t\t\tif (size.SpecialSize == SpecialPaperSize.FixedWidthAutoHeight || size.SpecialSize == SpecialPaperSize.AsWidestPage || size.SpecialSize == SpecialPaperSize.AsNarrowestPage) {\r\n\t\t\t\tsize.Height = b.Height * size.Width / b.Width;\r\n\t\t\t}\r\n\r\n\t\t\tif (settings.ScaleContent) {\r\n\t\t\t\tzx = size.Width / b.Width;\r\n\t\t\t\tzy = size.Height / b.Height;\r\n\t\t\t\tz = zx < zy ? zx : zy;\r\n\t\t\t\tsw *= z;\r\n\t\t\t\tsh *= z;\r\n\t\t\t\tb.Left *= z;\r\n\t\t\t\tb.Bottom *= z;\r\n\t\t\t\tb.Top *= z;\r\n\t\t\t\tb.Right *= z;\r\n\t\t\t}\r\n\t\t\tif (b.Width != size.Width) {\r\n\t\t\t\td = size.Width - sw;\r\n\t\t\t\tdx = hAlign == HorizontalAlignment.Left ? 0 : hAlign == HorizontalAlignment.Right ? d : d / 2;\r\n\t\t\t\tb.Left -= dx;\r\n\t\t\t\tb.Right = b.Left + size.Width;\r\n\t\t\t}\r\n\t\t\tif (b.Height != size.Height) {\r\n\t\t\t\td = size.Height - sh;\r\n\t\t\t\tdy = vAlign == VerticalAlignment.Bottom ? d : vAlign == VerticalAlignment.Top ? 0 : d / 2;\r\n\t\t\t\tb.Top += dy;\r\n\t\t\t\tb.Bottom = b.Top - size.Height;\r\n\t\t\t}\r\n\r\n\t\t\tvar a = new float[] { b.Left, b.Bottom, b.Right, b.Top };\r\n\t\t\tpage.Put(PdfName.CROPBOX, new PdfArray(a));\r\n\t\t\tResizeBox(page, mb, b);\r\n\t\t\tif (page.GetAsArray(PdfName.BLEEDBOX) != null) {\r\n\t\t\t\tResizeBox(page, PdfReader.GetNormalizedRectangle(page.GetAsArray(PdfName.BLEEDBOX)), b);\r\n\t\t\t}\r\n\t\t\tif (page.GetAsArray(PdfName.TRIMBOX) != null) {\r\n\t\t\t\tResizeBox(page, PdfReader.GetNormalizedRectangle(page.GetAsArray(PdfName.TRIMBOX)), b);\r\n\t\t\t}\r\n\t\t\tif (page.GetAsArray(PdfName.ARTBOX) != null) {\r\n\t\t\t\tResizeBox(page, PdfReader.GetNormalizedRectangle(page.GetAsArray(PdfName.ARTBOX)), b);\r\n\t\t\t}\r\n\t\t\t//if (p.Contains (PdfName.BLEEDBOX)) {\r\n\t\t\t//    p.Put (PdfName.BLEEDBOX, pr);\r\n\t\t\t//}\r\n\t\t\t//if (p.Contains(PdfName.TRIMBOX)) {\r\n\t\t\t//    p.Put (PdfName.TRIMBOX, pr);\r\n\t\t\t//}\r\n\t\t\t//if (p.Contains(PdfName.ARTBOX)) {\r\n\t\t\t//    p.Put (PdfName.ARTBOX, pr);\r\n\t\t\t//}\r\n\r\n\t\t\tvar ct = new CoordinateTranslationSettings();\r\n\t\t\tif (settings.ScaleContent) {\r\n\t\t\t\tct.XScale = ct.YScale = z;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tct.XTranslation = -dx;\r\n\t\t\t\tct.YTranslation = -dy;\r\n\t\t\t}\r\n\t\t\treturn ct;\r\n\t\t}\r\n\r\n\t\tstatic void ResizeBox(PdfDictionary page, Rectangle box, Rectangle refBox) {\r\n\t\t\tpage.Put(PdfName.MEDIABOX, new PdfArray([\r\n\t\t\t\tbox.Left < refBox.Left ? box.Left : refBox.Left,\r\n\t\t\t\tbox.Bottom < refBox.Bottom ? box.Bottom : refBox.Bottom,\r\n\t\t\t\tbox.Right > refBox.Right ? box.Right : refBox.Right,\r\n\t\t\t\tbox.Top > refBox.Top ? box.Top : refBox.Top\r\n\t\t\t]));\r\n\t\t}\r\n\r\n\t\tstatic bool RotatePage(PdfDictionary page, PageBoxSettings settings) {\r\n\t\t\tif (settings.Rotation == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar mb = page.GetPageVisibleRectangle();\r\n\t\t\tif (mb == null) {\r\n\t\t\t\tthrow new PdfException(\"页面缺少 MediaBox。\");\r\n\t\t\t}\r\n\t\t\tvar ls = mb.Width > mb.Height; // Landscape\r\n\t\t\tif (ls && (settings.Filter & PageFilterFlag.Portrait) == PageFilterFlag.Portrait\r\n\t\t\t\t|| !ls && (settings.Filter & PageFilterFlag.Landscape) == PageFilterFlag.Landscape) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar n = (PdfHelper.GetPageRotation(page) + settings.Rotation) % 360;\r\n\t\t\tif (n != 0) {\r\n\t\t\t\tpage.Put(PdfName.ROTATE, n);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpage.Remove(PdfName.ROTATE);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tstatic bool FilterPageNumber(int pageNumber, PageFilterFlag filter) {\r\n\t\t\tvar odd = (pageNumber & 1) > 0;\r\n\t\t\treturn (!odd || (filter & PageFilterFlag.Even) != PageFilterFlag.Even)\r\n\t\t\t\t&& (odd || (filter & PageFilterFlag.Odd) != PageFilterFlag.Odd);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 无损拉伸平移页面。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pdf\">PDF 文档。</param>\r\n\t\t/// <param name=\"pageNumber\">页码。</param>\r\n\t\t/// <param name=\"ct\">拉伸及平移参数。</param>\r\n\t\tinternal static byte[] ScaleContent(PdfReader pdf, int pageNumber, CoordinateTranslationSettings ct) {\r\n\t\t\tvar newContent = Encoding.ASCII.GetBytes(String.Join(\" \", \r\n\t\t\t\tct.XScale.ToText (), \"0\",\r\n\t\t\t\t\"0\", ct.YScale.ToText (),\r\n\t\t\t\tct.XTranslation.ToText (), ct.YTranslation.ToText (), \"cm \"\r\n\t\t\t));\r\n\t\t\tvar cb = pdf.GetPageContent(pageNumber);\r\n\t\t\tArray.Resize(ref newContent, cb.Length + newContent.Length);\r\n\t\t\tcb.CopyTo(newContent, newContent.Length - cb.Length);\r\n\t\t\tpdf.SafeSetPageContent(pageNumber, newContent);\r\n\r\n\t\t\tvar page = pdf.GetPageN(pageNumber);\r\n\t\t\tRewriteAnnotationCoordinates(ct, page);\r\n\t\t\treturn newContent;\r\n\t\t}\r\n\r\n\t\tstatic void ScaleContent(PageProcessorContext context, CoordinateTranslationSettings ct) {\r\n\t\t\tvar cmds = context.PageCommands.Commands;\r\n\t\t\tif (cmds.Count > 0 && cmds[0].Type == PdfPageCommandType.Matrix) {\r\n\t\t\t\tvar c = cmds[0] as MatrixCommand;\r\n\t\t\t\tif (c.Name.ToString() == \"cm\") {\r\n\t\t\t\t\tc.Multiply([ct.XScale, 0, 0, ct.YScale, ct.XTranslation, ct.YTranslation]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tcmds.Insert(0, new MatrixCommand(MatrixCommand.CM, ct.XScale, 0, 0, ct.YScale, ct.XTranslation, ct.YTranslation));\r\n\t\t\t}\r\n\t\t\tRewriteAnnotationCoordinates(ct, context.Page);\r\n\t\t}\r\n\r\n\t\tstatic void RewriteAnnotationCoordinates(CoordinateTranslationSettings ct, PdfDictionary page) {\r\n\t\t\tvar ann = page.GetAsArray(PdfName.ANNOTS);\r\n\t\t\tif (ann == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in ann.ArrayList) {\r\n\t\t\t\tif (PdfReader.GetPdfObject(item) is PdfDictionary an) {\r\n\t\t\t\t\tvar rect = an.GetAsArray(PdfName.RECT);\r\n\t\t\t\t\tif (rect != null && rect.Size == 4) {\r\n\t\t\t\t\t\trect[0] = new PdfNumber((rect.GetAsNumber(0)?.FloatValue ?? 0) * ct.XScale + ct.XTranslation);\r\n\t\t\t\t\t\trect[1] = new PdfNumber((rect.GetAsNumber(1)?.FloatValue ?? 0) * ct.YScale + ct.YTranslation);\r\n\t\t\t\t\t\trect[2] = new PdfNumber((rect.GetAsNumber(2)?.FloatValue ?? 0) * ct.XScale + ct.XTranslation);\r\n\t\t\t\t\t\trect[3] = new PdfNumber((rect.GetAsNumber(3)?.FloatValue ?? 0) * ct.YScale + ct.YTranslation);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void AdjustMargins(PdfDictionary page, Margins margins) {\r\n\t\t\tif (margins.IsRelative) {\r\n\t\t\t\tvar box = page.GetAsArray(PdfName.CROPBOX) ?? page.GetAsArray(PdfName.MEDIABOX);\r\n\t\t\t\tvar r = PdfReader.GetNormalizedRectangle(box);\r\n\t\t\t\tmargins = new Margins(margins.Left * r.Width, margins.Top * r.Height, margins.Right * r.Width, margins.Bottom * r.Height);\r\n\t\t\t}\r\n\t\t\tAdjustBoxDimension(page, margins, PdfName.CROPBOX);\r\n\t\t\tAdjustBoxDimension(page, margins, PdfName.MEDIABOX);\r\n\t\t\tAdjustBoxDimension(page, margins, PdfName.BLEEDBOX);\r\n\t\t\tAdjustBoxDimension(page, margins, PdfName.TRIMBOX);\r\n\t\t\tAdjustBoxDimension(page, margins, PdfName.ARTBOX);\r\n\t\t}\r\n\r\n\t\tstatic void AdjustBoxDimension(PdfDictionary page, Margins margins, PdfName boxName) {\r\n\t\t\tvar b = page.GetAsArray(boxName);\r\n\t\t\tif (b == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar r = PdfReader.GetNormalizedRectangle(b);\r\n\t\t\tpage.Put(boxName, new PdfArray([\r\n\t\t\t\tr.Left - margins.Left,\r\n\t\t\t\tr.Bottom - margins.Bottom,\r\n\t\t\t\tr.Right + margins.Right,\r\n\t\t\t\tr.Top + margins.Top\r\n\t\t\t]));\r\n\t\t}\r\n\r\n\t\t#region IPageProcessor 成员\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_resizePages = Settings.NeedResize;\r\n\t\t\tif (_resizePages) {\r\n\t\t\t\tcontext.ExtraData[DocProcessorContext.CoordinateTransition]\r\n\t\t\t\t\t= _cts\r\n\t\t\t\t\t= new CoordinateTranslationSettings[context.Pdf.NumberOfPages + 1];\r\n\t\t\t}\r\n\t\t\t_adjustMargins = Settings.NeedAdjustMargins;\r\n\t\t\t_pageRanges = String.IsNullOrEmpty(Settings.PageRanges) ? null : PageRangeCollection.Parse(Settings.PageRanges, 1, context.Pdf.NumberOfPages, true);\r\n\t\t\t//todo 为新增加的适应拉伸模式设置参考尺寸\r\n\t\t\tswitch (Settings.PaperSize.SpecialSize) {\r\n\t\t\t\tcase SpecialPaperSize.AsSpecificPage:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SpecialPaperSize.AsFirstPage:\r\n\t\t\t\t\tvar r = context.Pdf.GetPageSizeWithRotation(1);\r\n\t\t\t\t\t_refPaperSize = new PaperSize(Settings.PaperSize.PaperName, r.Width, r.Height);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SpecialPaperSize.AsWidestPage:\r\n\t\t\t\tcase SpecialPaperSize.AsNarrowestPage:\r\n\t\t\t\tcase SpecialPaperSize.AsLargestPage:\r\n\t\t\t\tcase SpecialPaperSize.AsSmallestPage:\r\n\t\t\t\t\t_refPaperSize = GetRefPaperSize(context);\r\n\t\t\t\t\tif (_refPaperSize == null) {\r\n\t\t\t\t\t\tthrow new InvalidOperationException(\"无法匹配与指定尺寸及页码范围相符的页面。\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate PaperSize GetRefPaperSize(DocProcessorContext context) {\r\n\t\t\tRectangle refRectangle = null;\r\n\t\t\tvar specialSize = Settings.PaperSize.SpecialSize;\r\n\t\t\tforeach (var range in _pageRanges ?? PageRangeCollection.CreateSingle(1, context.Pdf.NumberOfPages)) {\r\n\t\t\t\tforeach (var page in range) {\r\n\t\t\t\t\tvar r = context.Pdf.GetPageSizeWithRotation(page);\r\n\t\t\t\t\tif (refRectangle == null) {\r\n\t\t\t\t\t\trefRectangle = r;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tswitch (specialSize) {\r\n\t\t\t\t\t\tcase SpecialPaperSize.AsWidestPage:\r\n\t\t\t\t\t\t\tif (r.Width > refRectangle.Width) {\r\n\t\t\t\t\t\t\t\trefRectangle = r;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase SpecialPaperSize.AsNarrowestPage:\r\n\t\t\t\t\t\t\tif (r.Width < refRectangle.Width) {\r\n\t\t\t\t\t\t\t\trefRectangle = r;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase SpecialPaperSize.AsLargestPage:\r\n\t\t\t\t\t\t\tif (r.Width * r.Height > refRectangle.Width * refRectangle.Height) {\r\n\t\t\t\t\t\t\t\trefRectangle = r;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase SpecialPaperSize.AsSmallestPage:\r\n\t\t\t\t\t\t\tif (r.Width * r.Height < refRectangle.Width * refRectangle.Height) {\r\n\t\t\t\t\t\t\t\trefRectangle = r;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn refRectangle != null\r\n\t\t\t\t? new PaperSize(Settings.PaperSize.PaperName, refRectangle.Width, specialSize != SpecialPaperSize.AsNarrowestPage && specialSize != SpecialPaperSize.AsWidestPage ? refRectangle.Height : 0)\r\n\t\t\t\t: null;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tvar f = Settings.Filter;\r\n\t\t\tif (!FilterPageNumber(context.PageNumber, f)\r\n\t\t\t\t|| _pageRanges != null && !_pageRanges.IsInRange(context.PageNumber)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tcontext.Pdf.ResetReleasePage();\r\n\t\t\tif (_resizePages) {\r\n\t\t\t\tvar ct = ResizePage(context.Page, Settings, _refPaperSize);\r\n\t\t\t\tif (Settings.ScaleContent) {\r\n\t\t\t\t\tScaleContent(context, ct);\r\n\t\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t}\r\n\t\t\t\t_cts[context.PageNumber] = ct;\r\n\t\t\t}\r\n\t\t\tif (_adjustMargins) {\r\n\t\t\t\tAdjustMargins(context.Page, Settings.Margins);\r\n\t\t\t}\r\n\t\t\tif (Settings.Rotation != 0) {\r\n\t\t\t\tRotatePage(context.Page, Settings);\r\n\t\t\t}\r\n\t\t\tcontext.Pdf.ResetReleasePage();\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IProcessor 成员\r\n\r\n\t\tpublic string Name => \"修改页面尺寸\";\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveAnnotationProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveAnnotationProcessor : IPageProcessor\r\n\t{\r\n\t\treadonly PdfName _AnnotationType;\r\n\t\tint _processedPageCount;\r\n\r\n\t\tpublic RemoveAnnotationProcessor(PdfName annotationType) {\r\n\t\t\t_AnnotationType = annotationType;\r\n\t\t}\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"删除批注\";\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage(\"　　删除了 \" + _processedPageCount + \" 页的批注。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(1);\r\n\t\t\tvar anns = context.Page.GetAsArray(PdfName.ANNOTS);\r\n\t\t\tif (anns == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (_AnnotationType == null) {\r\n\t\t\t\tcontext.Page.Remove(PdfName.ANNOTS);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tbool removed = false;\r\n\t\t\tvar l = anns.Size;\r\n\t\t\tfor (int i = l - 1; i >= 0; i--) {\r\n\t\t\t\tif (PdfReader.GetPdfObject(anns[i]) is not PdfDictionary ann) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (_AnnotationType.Equals(ann.GetAsName(PdfName.SUBTYPE)) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tanns.Remove(i);\r\n\t\t\t\tremoved = true;\r\n\t\t\t}\r\n\t\t\tif (anns.Size == 0) {\r\n\t\t\t\tcontext.Page.Remove(PdfName.ANNOTS);\r\n\t\t\t}\r\n\t\t\tif (removed) {\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t}\r\n\t\t\treturn removed;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveBookmarkProcessor.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveBookmarkProcessor : IDocProcessor\r\n\t{\r\n\t\t#region IDocProcessor 成员\r\n\t\tpublic string Name => \"删除导航书签\";\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t}\r\n\t\tpublic void EndProcess(DocProcessorContext context) {\r\n\t\t}\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(DocProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(1);\r\n\t\t\tOutlineManager.KillOutline(context.Pdf);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveDictionaryItemProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t/// <summary>\r\n\t/// 删除指定字典名称项目的处理器。\r\n\t/// </summary>\r\n\tsealed class RemoveDictionaryItemProcessor(PdfName itemName) : IPageProcessor\r\n\t{\r\n\t\treadonly PdfName _ItemName = itemName;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"删除字典项目\";\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tif (context.Page.Contains(_ItemName)) {\r\n\t\t\t\tcontext.Page.Remove(_ItemName);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\t#region IDocProcessor 成员\r\n\r\n\t\tpublic bool Process(DocProcessorContext context) {\r\n\t\t\tif (context.Pdf.Catalog.Contains(_ItemName)) {\r\n\t\t\t\tcontext.Pdf.Catalog.Remove(_ItemName);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveEmptyCommandProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t//todo: 删除无直接输出效果的指令\r\n\t//todo: 删除空白页\r\n\tsealed class RemoveEmptyCommandProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"删除冗余指令\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage(\"　　删除了 \" + _processedPageCount + \" 页的冗余指令。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 3;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(3);\r\n\t\t\tvar p = context.PageCommands;\r\n\t\t\tvar r = false;\r\n\t\t\tr = ProcessCommands(p.Commands);\r\n\t\t\tif (r == true) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t}\r\n\t\t\tProcessFormContent(context);\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tstatic void ProcessFormContent(PageProcessorContext context) {\r\n\t\t\tvar fl = context.Page.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (fl == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in fl) {\r\n\t\t\t\tif (PdfReader.GetPdfObject(item.Value) is not PRStream f\r\n\t\t\t\t\t|| PdfName.FORM.Equals(f.GetAsName(PdfName.SUBTYPE)) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar p = new PdfPageCommandProcessor(f);\r\n\t\t\t\tif (ProcessCommands(p.Commands)) {\r\n\t\t\t\t\tusing (var ms = new System.IO.MemoryStream()) {\r\n\t\t\t\t\t\tp.WritePdfCommands(ms);\r\n\t\t\t\t\t\tms.Flush();\r\n\t\t\t\t\t\tf.SetData(ms.ToArray(), ms.Length > 32);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tstatic bool ProcessCommands(IList<PdfPageCommand> parent) {\r\n\t\t\tvar r = false;\r\n\t\t\tEnclosingCommand ec;\r\n\t\t\tfor (int i = parent.Count - 1; i >= 0; i--) {\r\n\t\t\t\tec = parent[i] as EnclosingCommand;\r\n\t\t\t\tif (ec == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (ec.Name.ToString() == \"BT\") {\r\n\t\t\t\t\tparent.RemoveAt(i);\r\n\t\t\t\t\tr = true;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tr |= ProcessCommands(ec.Commands);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveFormProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveFormProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"删除表单区域\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage($\"　　删除了 {_processedPageCount} 页的表单区域。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 3;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(3);\r\n\t\t\tvar p = context.PageCommands;\r\n\t\t\tvar r = false;\r\n\t\t\tvar fl = ProcessFormContent(context);\r\n\t\t\tif (fl.HasContent()) {\r\n\t\t\t\tr = true;\r\n\t\t\t\tProcessCommands(p.Commands, fl);\r\n\t\t\t}\r\n\t\t\tif (r) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tprivate static HashSet<PdfName> ProcessFormContent(PageProcessorContext context) {\r\n\t\t\tvar fl = context.Page.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (fl == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar r = new HashSet<PdfName>();\r\n\t\t\tforeach (var item in fl) {\r\n\t\t\t\tif (PdfReader.GetPdfObject(item.Value) is not PRStream f\r\n\t\t\t\t\t|| PdfName.FORM.Equals(f.GetAsName(PdfName.SUBTYPE)) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tr.Add(item.Key);\r\n\t\t\t}\r\n\t\t\tforeach (var item in r) {\r\n\t\t\t\tfl.Remove(item);\r\n\t\t\t}\r\n\t\t\tif (fl.Size == 0) {\r\n\t\t\t\tcontext.Page.Locate<PdfDictionary>(PdfName.RESOURCES).Remove(PdfName.XOBJECT);\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tstatic bool ProcessCommands(IList<Model.PdfPageCommand> parent, HashSet<PdfName> formNames) {\r\n\t\t\tvar r = false;\r\n\t\t\tfor (int i = parent.Count - 1; i >= 0; i--) {\r\n\t\t\t\tvar cmd = parent[i];\r\n\t\t\t\tif (cmd is EnclosingCommand ec) {\r\n\t\t\t\t\tr |= ProcessCommands(ec.Commands, formNames);\r\n\t\t\t\t}\r\n\t\t\t\tif (cmd.Name.ToString() == \"Do\" && cmd.HasOperand && formNames.Contains(cmd.Operands[0] as PdfName)) {\r\n\t\t\t\t\tparent.RemoveAt(i);\r\n\t\t\t\t\tr = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveTextBlockProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveTextBlockProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"删除文本区\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage(\"　　删除了 \" + _processedPageCount + \" 页的文本。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 3;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(3);\r\n\t\t\tvar p = context.PageCommands;\r\n\t\t\tvar r = ProcessCommands(p.Commands);\r\n\t\t\tif (r) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t}\r\n\t\t\tProcessFormContent(context);\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tstatic void ProcessFormContent(PageProcessorContext context) {\r\n\t\t\tvar fl = context.Page.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (fl == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in fl) {\r\n\t\t\t\tif (PdfReader.GetPdfObject(item.Value) is not PRStream f\r\n\t\t\t\t\t|| PdfName.FORM.Equals(f.GetAsName(PdfName.SUBTYPE)) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar p = new PdfPageCommandProcessor(f);\r\n\t\t\t\tif (ProcessCommands(p.Commands)) {\r\n\t\t\t\t\tusing (var ms = new System.IO.MemoryStream()) {\r\n\t\t\t\t\t\tp.WritePdfCommands(ms);\r\n\t\t\t\t\t\tms.Flush();\r\n\t\t\t\t\t\tf.SetData(ms.ToArray(), ms.Length > 32);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tprivate static bool ProcessCommands(IList<PdfPageCommand> parent) {\r\n\t\t\tvar r = false;\r\n\t\t\tEnclosingCommand ec;\r\n\t\t\tfor (int i = parent.Count - 1; i >= 0; i--) {\r\n\t\t\t\tec = parent[i] as EnclosingCommand;\r\n\t\t\t\tif (ec == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (ec.Name.ToString() == \"BT\") {\r\n\t\t\t\t\tparent.RemoveAt(i);\r\n\t\t\t\t\tr = true;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tr |= ProcessCommands(ec.Commands);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveThumbnailProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveThumbnailProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedItemCount;\r\n\r\n\t\tpublic string Name => \"删除缩略图\";\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedItemCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage($\"　　删除了 {_processedItemCount} 幅缩略图。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(1);\r\n\t\t\tif (context.Page.Contains(PdfName.THUMB) == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tcontext.Page.Remove(PdfName.THUMB);\r\n\t\t\t_processedItemCount++;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/RemoveWrappedCommandProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveWrappedCommandProcessor : IPageProcessor\r\n\t{\r\n\t\tint _processedPageCount;\r\n\t\tprivate readonly int _RemoveLeading, _RemoveTrailing;\r\n\r\n\t\tpublic RemoveWrappedCommandProcessor(int removeLeadingCommandCount, int removeTrailingCommandCount) {\r\n\t\t\t_RemoveLeading = removeLeadingCommandCount;\r\n\t\t\t_RemoveTrailing = removeTrailingCommandCount;\r\n\t\t}\r\n\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"删除页面起始或结束指令\";\r\n\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_processedPageCount = 0;\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Notice, Name + \"功能：\");\r\n\t\t\tTracker.TraceMessage($\"　　删除了 {_processedPageCount} 页的指令。\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages * 3;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(3);\r\n\t\t\tvar p = context.PageCommands;\r\n\t\t\tvar r = ProcessCommands(p.Commands);\r\n\t\t\tif (r) {\r\n\t\t\t\tcontext.IsPageContentModified = true;\r\n\t\t\t\t_processedPageCount++;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tbool ProcessCommands(IList<PdfPageCommand> parent) {\r\n\t\t\tvar r = false;\r\n\t\t\tif (_RemoveLeading > 0) {\r\n\t\t\t\tfor (int i = Math.Min(_RemoveLeading, parent.Count) - 1; i >= 0; i--) {\r\n\t\t\t\t\tparent.RemoveAt(i);\r\n\t\t\t\t}\r\n\t\t\t\tr = true;\r\n\t\t\t}\r\n\t\t\tif (_RemoveTrailing > 0) {\r\n\t\t\t\tfor (int i = Math.Min(_RemoveTrailing, parent.Count); i > 0; i--) {\r\n\t\t\t\t\tparent.RemoveAt(parent.Count - 1);\r\n\t\t\t\t}\r\n\t\t\t\tr = true;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ContentProcessors/ReplaceFontProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\nusing iTextSharp.text.pdf.fonts.cmaps;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing FontId = System.Tuple<string, bool>;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ReplaceFontProcessor : IPageProcessor\r\n\t{\r\n\t\tstatic readonly string[] __LegacyFonts = [\"宋体\", \"楷体_GB2312\", \"仿宋_GB2312\", \"黑体\", \"STSONG-LIGHT-GB-EUC-H\", \"STSONG-LIGHT-GBK-EUC-H\"];\r\n\t\tstatic readonly string[] __AlternativeFonts = [\"宋体\", \"楷体\", \"仿宋\", \"微软雅黑\", \"宋体\", \"宋体\"];\r\n\t\tstatic readonly PdfName __GbkEncoding = new PdfName(\"GBK-EUC-H\");\r\n\t\tstatic readonly PdfName __GbEncoding = new PdfName(\"GB-EUC-H\");\r\n\t\tstatic readonly string[] __BuiltInEncodings = [\"78-EUC-H\", \"78-EUC-V\", \"78-H\", \"78ms-RKSJ-H\", \"78ms-RKSJ-V\", \"78-RKSJ-H\", \"78-RKSJ-V\", \"78-V\", \"83pv-RKSJ-H\", \"90msp-RKSJ-H\", \"90msp-RKSJ-V\", \"90ms-RKSJ-H\", \"90ms-RKSJ-V\", \"90pv-RKSJ-H\", \"90pv-RKSJ-V\", \"Add-H\", \"Add-RKSJ-H\", \"Add-RKSJ-V\", \"Add-V\", \"Adobe-CNS1-0\", \"Adobe-CNS1-1\", \"Adobe-CNS1-2\", \"Adobe-CNS1-3\", \"Adobe-CNS1-4\", \"Adobe-CNS1-5\", \"Adobe-CNS1-6\", \"Adobe-GB1-0\", \"Adobe-GB1-1\", \"Adobe-GB1-2\", \"Adobe-GB1-3\", \"Adobe-GB1-4\", \"Adobe-GB1-5\", \"Adobe-Japan1-0\", \"Adobe-Japan1-1\", \"Adobe-Japan1-2\", \"Adobe-Japan1-3\", \"Adobe-Japan1-4\", \"Adobe-Japan1-5\", \"Adobe-Japan1-6\", \"Adobe-Korea1-0\", \"Adobe-Korea1-1\", \"Adobe-Korea1-2\", \"B5-H\", \"B5pc-H\", \"B5pc-V\", \"B5-V\", \"CNS1-H\", \"CNS1-V\", \"CNS2-H\", \"CNS2-V\", \"CNS-EUC-H\", \"CNS-EUC-V\", \"ETen-B5-H\", \"ETen-B5-V\", \"ETenms-B5-H\", \"ETenms-B5-V\", \"ETHK-B5-H\", \"ETHK-B5-V\", \"EUC-H\", \"EUC-V\", \"Ext-H\", \"Ext-RKSJ-H\", \"Ext-RKSJ-V\", \"Ext-V\", \"GB-EUC-H\", \"GB-EUC-V\", \"GB-H\", \"GBK2K-H\", \"GBK2K-V\", \"GBK-EUC-H\", \"GBK-EUC-V\", \"GBKp-EUC-H\", \"GBKp-EUC-V\", \"GBpc-EUC-H\", \"GBpc-EUC-V\", \"GBT-EUC-H\", \"GBT-EUC-V\", \"GBT-H\", \"GBTpc-EUC-H\", \"GBTpc-EUC-V\", \"GBT-V\", \"GB-V\", \"H\", \"Hankaku\", \"Hiragana\", \"HKdla-B5-H\", \"HKdla-B5-V\", \"HKdlb-B5-H\", \"HKdlb-B5-V\", \"HKgccs-B5-H\", \"HKgccs-B5-V\", \"HKm314-B5-H\", \"HKm314-B5-V\", \"HKm471-B5-H\", \"HKm471-B5-V\", \"HKscs-B5-H\", \"HKscs-B5-V\", \"Katakana\", \"KSC-EUC-H\", \"KSC-EUC-V\", \"KSC-H\", \"KSC-Johab-H\", \"KSC-Johab-V\", \"KSCms-UHC-H\", \"KSCms-UHC-HW-H\", \"KSCms-UHC-HW-V\", \"KSCms-UHC-V\", \"KSCpc-EUC-H\", \"KSCpc-EUC-V\", \"KSC-V\", \"NWP-H\", \"NWP-V\", \"RKSJ-H\", \"RKSJ-V\", \"Roman\", \"UniCNS-UCS2-H\", \"UniCNS-UCS2-V\", \"UniCNS-UTF16-H\", \"UniCNS-UTF16-V\", \"UniCNS-UTF32-H\", \"UniCNS-UTF32-V\", \"UniCNS-UTF8-H\", \"UniCNS-UTF8-V\", \"UniGB-UCS2-H\", \"UniGB-UCS2-V\", \"UniGB-UTF16-H\", \"UniGB-UTF16-V\", \"UniGB-UTF32-H\", \"UniGB-UTF32-V\", \"UniGB-UTF8-H\", \"UniGB-UTF8-V\", \"UniJIS2004-UTF16-H\", \"UniJIS2004-UTF16-V\", \"UniJIS2004-UTF32-H\", \"UniJIS2004-UTF32-V\", \"UniJIS2004-UTF8-H\", \"UniJIS2004-UTF8-V\", \"UniJISPro-UCS2-HW-V\", \"UniJISPro-UCS2-V\", \"UniJISPro-UTF8-V\", \"UniJIS-UCS2-H\", \"UniJIS-UCS2-HW-H\", \"UniJIS-UCS2-HW-V\", \"UniJIS-UCS2-V\", \"UniJIS-UTF16-H\", \"UniJIS-UTF16-V\", \"UniJIS-UTF32-H\", \"UniJIS-UTF32-V\", \"UniJIS-UTF8-H\", \"UniJIS-UTF8-V\", \"UniJISX02132004-UTF32-H\", \"UniJISX02132004-UTF32-V\", \"UniJISX0213-UTF32-H\", \"UniJISX0213-UTF32-V\", \"UniKS-UCS2-H\", \"UniKS-UCS2-V\", \"UniKS-UTF16-H\", \"UniKS-UTF16-V\", \"UniKS-UTF32-H\", \"UniKS-UTF32-V\", \"UniKS-UTF8-H\", \"UniKS-UTF8-V\", \"V\", \"WP-Symbol\"];\r\n\t\tstatic readonly string[] __GbEucEncodings = [\"GBK-EUC-H\", \"GBK-EUC-V\", \"GBT-EUC-H\", \"GB-EUC-H\", \"GB-EUC-V\"];\r\n\t\tconst string HalfWidthLetters = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n\t\tconst string FullWidthLetters = \"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ\";\r\n\t\tconst string HalfWidthNumbers = \"0123456789\";\r\n\t\tconst string FullWidthNumbers = \"０１２３４５６７８９\";\r\n\t\tconst string HorizontalPunctuations = \"，、。：；！？〖〗…‥—–（）｛｝〔〕【】《》〈〉「」『』［］\";\r\n\t\tconst string VerticalPunctuations = \"︐︑︒︓︔︕︖︗︘︙︰︱︲︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹇﹈\";\r\n\r\n\t\treadonly bool _embedLegacyFonts;\r\n\t\treadonly bool _trimTrailingWhiteSpace;\r\n\t\tNewFont _currentNewFont;\r\n\t\tFontInfo _currentFont;\r\n\t\tFontFactoryImp _fontFactory;\r\n\t\tDictionary<FontId, NewFont> _newFonts;\r\n\t\tDictionary<PdfName, NewFont> _fontMap;\r\n\t\tDictionary<PdfName, int> _fontNameIDMap;\r\n\t\tDictionary<int, FontInfo> _fontInfoMap;\r\n\t\tDictionary<string, FontSubstitution> _fontSubstitutions;\r\n\t\tDictionary<int, NewFont> _fontRefIDMap;\r\n\t\tDictionary<PdfDictionary, Dictionary<PdfName, PRIndirectReference>> _fontDictMap;\r\n\t\tHashSet<int> _bypassFonts, _processedForms;\r\n\r\n\t\tpublic ReplaceFontProcessor(bool embedLegacyFonts, bool trimTrailingWhiteSpace, Dictionary<string, FontSubstitution> fontSubstitutions) {\r\n\t\t\t_embedLegacyFonts = embedLegacyFonts;\r\n\t\t\t_trimTrailingWhiteSpace = trimTrailingWhiteSpace;\r\n\t\t\t_fontSubstitutions = fontSubstitutions;\r\n\t\t}\r\n\t\t#region IPageProcessor 成员\r\n\t\tpublic string Name => \"嵌入汉字库\";\r\n\t\tpublic void BeginProcess(DocProcessorContext context) {\r\n\t\t\t_fontSubstitutions ??= [];\r\n\t\t\tvar l = __LegacyFonts.Length + _fontSubstitutions.Count;\r\n\t\t\t_newFonts = new Dictionary<FontId, NewFont>(l);\r\n\t\t\t_fontMap = new Dictionary<PdfName, NewFont>(l);\r\n\t\t\t_fontNameIDMap = [];\r\n\t\t\t_fontInfoMap = [];\r\n\t\t\t_fontFactory = new FontFactoryImp();\r\n\t\t\t_fontRefIDMap = [];\r\n\t\t\t_fontDictMap = [];\r\n\t\t\t_bypassFonts = [];\r\n\t\t\t_processedForms = [];\r\n\t\t\tforeach (var item in FontHelper.GetInstalledFonts(true)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t_fontFactory.Register(item.Value, item.Key);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t// ignore\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//_fontFactory.RegisterDirectory (Common.FontHelper.FontDirectory);\r\n\t\t}\r\n\t\tpublic bool EndProcess(PdfReader pdf) {\r\n\t\t\t// 用新的字体引用替代字体资源表的字体\r\n\t\t\tforeach (var map in _fontDictMap) {\r\n\t\t\t\tvar d = map.Key;\r\n\t\t\t\tforeach (var item in map.Value) {\r\n\t\t\t\t\td.Put(item.Key, item.Value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tSubSetFontData(pdf);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic int EstimateWorkload(PdfReader pdf) {\r\n\t\t\treturn pdf.NumberOfPages;\r\n\t\t}\r\n\r\n\t\tpublic bool Process(PageProcessorContext context) {\r\n\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t_currentFont = null;\r\n\t\t\t_currentNewFont = null;\r\n\t\t\t_fontNameIDMap.Clear();\r\n\t\t\t_fontMap.Clear();\r\n\t\t\tbool modified = false;\r\n\t\t\tif (ProcessPageContents(context)) {\r\n\t\t\t\tcontext.IsPageContentModified = modified = true;\r\n\t\t\t}\r\n\t\t\tProcessResourceContents(context, context.Page.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT), ref modified);\r\n\t\t\tvar annots = context.Page.GetAsArray(PdfName.ANNOTS);\r\n\t\t\tif (annots != null && annots.Size != 0) {\r\n\t\t\t\tforeach (var item in annots) {\r\n\t\t\t\t\tif (PdfReader.GetPdfObjectRelease(item) is PdfDictionary annot) {\r\n\t\t\t\t\t\tProcessResourceContents(context, annot, ref modified);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn modified;\r\n\t\t}\r\n\r\n\t\tbool ProcessPageContents(PageProcessorContext context) {\r\n\t\t\tvar fonts = context.Page.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.FONT);\r\n\t\t\tif (fonts == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tLoadFonts(context, fonts);\r\n\t\t\tif (_fontMap.Count == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn ProcessCommands(context.PageCommands.Commands);\r\n\t\t}\r\n\r\n\t\tvoid ProcessResourceContents(PageProcessorContext context, PdfDictionary container, ref bool modified) {\r\n\t\t\tif (container == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in GetForms(container)) {\r\n\t\t\t\tif (_processedForms.Add(item.Ref.Number) == false\r\n\t\t\t\t\t|| !(item.Resource is PRStream s)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar resources = item.Resource.GetAsDict(PdfName.RESOURCES);\r\n\t\t\t\tif (resources == null || resources.Size == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar fonts = resources.GetAsDict(PdfName.FONT);\r\n\t\t\t\tif (fonts == null || fonts.Size == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tLoadFonts(context, fonts);\r\n\t\t\t\tvar cp = new PdfPageCommandProcessor();\r\n\t\t\t\tcp.ProcessContent(PdfReader.GetStreamBytes(s), resources);\r\n\t\t\t\tif (ProcessCommands(cp.Commands)) {\r\n\t\t\t\t\tusing (var ms = new MemoryStream()) {\r\n\t\t\t\t\t\tcp.WritePdfCommands(ms);\r\n\t\t\t\t\t\tms.Flush();\r\n\t\t\t\t\t\ts.SetData(ms.ToArray(), ms.Length > 100, 9);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmodified = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tbool ProcessCommands(IList<PdfPageCommand> parent) {\r\n\t\t\tvar r = false;\r\n\t\t\tEnclosingCommand ec;\r\n\t\t\tvar l = parent.Count;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tec = parent[i] as EnclosingCommand;\r\n\t\t\t\tif (ec == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar n = ec.Name.ToString();\r\n\t\t\t\tif (n == \"BT\") {\r\n\t\t\t\t\tforeach (var item in ec.Commands) {\r\n\t\t\t\t\t\tif (item.Type == PdfPageCommandType.Enclosure) {\r\n\t\t\t\t\t\t\tforeach (var sc in ((item as EnclosingCommand).Commands)) {\r\n\t\t\t\t\t\t\t\tProcessTextCommand(sc);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (ProcessTextCommand(item) == false) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tr = true;\r\n\t\t\t\t}\r\n\t\t\t\telse if (n == \"BDC\") {\r\n\t\t\t\t\tr |= ProcessCommands(ec.Commands);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar cnf = _currentNewFont;\r\n\t\t\t\t\tvar cf = _currentFont;\r\n\t\t\t\t\tr |= ProcessCommands(ec.Commands);\r\n\t\t\t\t\t_currentNewFont = cnf;\r\n\t\t\t\t\t_currentFont = cf;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tbool ProcessTextCommand(PdfPageCommand item) {\r\n\t\t\tvar cn = item.Name.ToString();\r\n\t\t\tif (cn == \"Tf\") {\r\n\t\t\t\tvar cf = item.Operands[0] as PdfName;\r\n\t\t\t\tif (_fontMap.TryGetValue(cf, out _currentNewFont) == false) {\r\n\t\t\t\t\t//Tracker.TraceMessage (\"找不到字体：\" + cf.ToString ());\r\n\t\t\t\t\t_currentNewFont = null;\r\n\t\t\t\t}\r\n\t\t\t\tif (_fontNameIDMap.TryGetValue(cf, out int ni) == false\r\n\t\t\t\t\t|| _fontInfoMap.TryGetValue(ni, out _currentFont) == false) {\r\n\t\t\t\t\t_currentFont = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (item.Type == PdfPageCommandType.Text) {\r\n\t\t\t\tif (_currentNewFont == null || _currentFont == null) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tRewriteTextOut(_currentNewFont, _currentFont, item);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tvoid RewriteTextOut(NewFont ef, FontInfo fontInfo, PdfPageCommand cmd) {\r\n\t\t\tvar ops = cmd.Operands;\r\n\t\t\tvar f = ef.Font.BaseFont as TrueTypeFontUnicode;\r\n\t\t\tif (ops.Length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar op = ops[0];\r\n\t\t\tstring t;\r\n\t\t\tif (op.Type == PdfObject.STRING) {\r\n\t\t\t\tt = fontInfo.DecodeText(op as PdfString);\r\n\t\t\t\tif (_trimTrailingWhiteSpace) {\r\n\t\t\t\t\tt = t.TrimEnd();\r\n\t\t\t\t}\r\n\t\t\t\tops[0] = RewriteText(ef, f, t);\r\n\t\t\t}\r\n\t\t\telse if (op.Type == PdfObject.ARRAY) {\r\n\t\t\t\tvar a = op as PdfArray;\r\n\t\t\t\tvar l = a.Size;\r\n\t\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\t\top = a[i];\r\n\t\t\t\t\tif (op.Type == PdfObject.STRING) {\r\n\t\t\t\t\t\tt = fontInfo.DecodeText(op as PdfString);\r\n\t\t\t\t\t\tif (_trimTrailingWhiteSpace/* && i == l - 1*/) {\r\n\t\t\t\t\t\t\tt = t.TrimEnd();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ta[i] = RewriteText(ef, f, t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic PdfString RewriteText(NewFont newFont, TrueTypeFontUnicode ttf, string text) {\r\n\t\t\tvar cs = newFont.CharSubstitutions.Count > 0;\r\n\t\t\tvar widths = newFont.GlyphWidths;\r\n\t\t\tvar unicodeMap = newFont.UnicodeCidMap;\r\n\t\t\tusing (var bb = new ByteBuffer()) {\r\n\t\t\t\tforeach (var ch in text) {\r\n\t\t\t\t\tif (cs == false || newFont.CharSubstitutions.TryGetValue(ch, out char c) == false) {\r\n\t\t\t\t\t\tc = ch;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (unicodeMap.TryGetValue(c, out int cid) == false) {\r\n\t\t\t\t\t\tvar tt = ttf.GetMetricsTT(c);\r\n\t\t\t\t\t\tif (tt == null) {\r\n\t\t\t\t\t\t\tnewFont.AbsentChars.Add(c);\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcid = tt[0];\r\n\t\t\t\t\t\tunicodeMap[c] = cid;\r\n\t\t\t\t\t\tif (widths.ContainsKey(cid) == false) {\r\n\t\t\t\t\t\t\twidths[cid] = tt[1];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbb.Append((byte)(cid >> 8));\r\n\t\t\t\t\tbb.Append((byte)cid);\r\n\t\t\t\t}\r\n\t\t\t\treturn new PdfString(bb.ToByteArray());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic bool DetectLegacyCjkFont(PdfDictionary font) {\r\n\t\t\tvar en = font.GetAsName(PdfName.ENCODING);\r\n\t\t\tif (en == null\r\n\t\t\t\t|| (PdfName.WIN_ANSI_ENCODING.Equals(en) || __GbkEncoding.Equals(en) || __GbEncoding.Equals(en)) == false\r\n\t\t\t\t) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn PdfDocumentFont.HasEmbeddedFont(font) == false;\r\n\t\t}\r\n\r\n\t\tstatic IEnumerable<ResourceReference> GetForms(PdfDictionary container) {\r\n\t\t\tvar visitedRefs = new HashSet<PdfIndirectReference>();\r\n\t\t\treturn PdfModelHelper.GetReferencedResources(container, o => PdfName.FORM.Equals(o.GetAsName(PdfName.SUBTYPE)), visitedRefs);\r\n\t\t}\r\n\r\n\t\tvoid LoadFonts(PageProcessorContext context, PdfDictionary fonts) {\r\n\t\t\tvar r = new Dictionary<PdfName, PRIndirectReference>(fonts.Length); // 替代的字体\r\n\t\t\tforeach (var item in fonts) {\r\n\t\t\t\tstring sn; // 替换字体名称\r\n\t\t\t\tstring n; // 字体名称\r\n\t\t\t\tbool v; // 是否竖排文字\r\n\t\t\t\tif (item.Value is not PdfIndirectReference fr\r\n\t\t\t\t\t|| _bypassFonts.Contains(fr.Number)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (_fontRefIDMap.TryGetValue(fr.Number, out NewFont nf) == false) {\r\n\t\t\t\t\tvar f = fr.CastAs<PdfDictionary>();\r\n\t\t\t\t\tif (f == null) {\r\n\t\t\t\t\t\tgoto BYPASSFONT;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar fn = f.GetAsName(PdfName.BASEFONT);\r\n\t\t\t\t\tif (fn == null) {\r\n\t\t\t\t\t\tgoto BYPASSFONT;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tn = PdfDocumentFont.RemoveSubsetPrefix(PdfHelper.GetPdfNameString(fn)); // 字体名称\r\n\t\t\t\t\tvar p = -1;\r\n\t\t\t\t\tFontSubstitution fs;\r\n\t\t\t\t\tif (_fontSubstitutions.TryGetValue(n, out fs)) {\r\n\t\t\t\t\t\tsn = fs.Substitution;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (_embedLegacyFonts == false || DetectLegacyCjkFont(f) == false) {\r\n\t\t\t\t\t\t\tgoto BYPASSFONT;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tp = Array.IndexOf(__LegacyFonts, n.ToUpperInvariant());\r\n\t\t\t\t\t\tif (p == -1) {\r\n\t\t\t\t\t\t\tgoto BYPASSFONT;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsn = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv = f.GetAsName(PdfName.ENCODING)?.ToString().EndsWith(\"-V\") ?? false;\r\n\t\t\t\t\tif (_newFonts.TryGetValue(new FontId(sn ?? n, v), out nf) == false) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tTracker.TraceMessage($\"加载字体：{(v ? \"@\" : String.Empty)}{(sn != null ? $\"{sn}(替换 {n})\" : n)}\");\r\n\t\t\t\t\t\t\tif (sn != null) {\r\n\t\t\t\t\t\t\t\tn = sn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tstring sf = null;\r\n\t\t\t\t\t\t\tforeach (var font in FontUtility.InstalledFonts) {\r\n\t\t\t\t\t\t\t\tif (font.DisplayName == n) {\r\n\t\t\t\t\t\t\t\t\tsf = font.OriginalName;\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tnf = new NewFont {\r\n\t\t\t\t\t\t\t\tFont = _fontFactory.GetFont(sf ?? n, v ? BaseFont.IDENTITY_V : BaseFont.IDENTITY_H),\r\n\t\t\t\t\t\t\t\tFontRef = context.Pdf.AddPdfObject(new PdfDictionary()),\r\n\t\t\t\t\t\t\t\tDescendantFontRef = context.Pdf.AddPdfObject(new PdfArray()),\r\n\t\t\t\t\t\t\t\tVertical = v,\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tvar fd = f.Locate<PdfDictionary>(PdfName.DESCENDANTFONTS, 0, PdfName.FONTDESCRIPTOR);\r\n\t\t\t\t\t\t\tif (fd != null) {\r\n\t\t\t\t\t\t\t\tvar num = fd.GetAsNumber(PdfName.ITALICANGLE)?.DoubleValue ?? 0d;\r\n\t\t\t\t\t\t\t\tif (num != 0) {\r\n\t\t\t\t\t\t\t\t\tnf.ItalicAngle = num;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (fs != null) {\r\n\t\t\t\t\t\t\t\tSetupFontSubstitutionMaps(nf, fs);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (sn == null && p != -1 && nf.Font.BaseFont == null) {\r\n\t\t\t\t\t\t\t\tnf.Font = _fontFactory.GetFont(__AlternativeFonts[p], v ? BaseFont.IDENTITY_V : BaseFont.IDENTITY_H);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (nf.Font.BaseFont == null) {\r\n\t\t\t\t\t\t\t\tthrow new FileNotFoundException(\"无法加载字体：\" + n);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t_newFonts.Add(new FontId(n, v), nf);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"无法加载字体\");\r\n\t\t\t\t\t\t\tthrow;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tr[item.Key] = nf.FontRef;\r\n\t\t\t\t\tif (_fontInfoMap.ContainsKey(fr.Number) == false) {\r\n\t\t\t\t\t\tvar fi = new FontInfo(f, fr.Number);\r\n\t\t\t\t\t\t_fontInfoMap.Add(fr.Number, fi);\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tReadSingleByteFontWidths(f, fi, nf);\r\n\t\t\t\t\t\t\tReadCidFontWidths(f, fi, nf);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (NullReferenceException) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"字体“{n}”的 CID 宽度表错误。\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_fontRefIDMap[nf.FontRef.Number] = nf;\r\n\t\t\t\t}\r\n\t\t\t\t_fontMap[item.Key] = nf;\r\n\t\t\t\t_fontNameIDMap[item.Key] = fr.Number;\r\n\t\t\t\tcontinue;\r\n\t\t\tBYPASSFONT:\r\n\t\t\t\t_bypassFonts.Add(fr.Number);\r\n\t\t\t}\r\n\t\t\tif (r.Count > 0) {\r\n\t\t\t\t_fontDictMap[fonts] = r;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SetupFontSubstitutionMaps(NewFont nf, FontSubstitution fs) {\r\n\t\t\tif (fs.TraditionalChineseConversion != 0) {\r\n\t\t\t\tif (fs.TraditionalChineseConversion > 0) {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, Constants.Chinese.Simplified, Constants.Chinese.Traditional);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, Constants.Chinese.Traditional, Constants.Chinese.Simplified);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (fs.NumericWidthConversion != 0) {\r\n\t\t\t\tif (fs.NumericWidthConversion > 0) {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, HalfWidthNumbers, FullWidthNumbers);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, FullWidthNumbers, HalfWidthNumbers);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (fs.AlphabeticWidthConversion != 0) {\r\n\t\t\t\tif (fs.AlphabeticWidthConversion > 0) {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, HalfWidthLetters, FullWidthLetters);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, FullWidthLetters, HalfWidthLetters);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (fs.PunctuationWidthConversion != 0) {\r\n\t\t\t\tif (fs.PunctuationWidthConversion > 0) {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, SetCaseProcessor.HalfWidthPunctuations, SetCaseProcessor.FullWidthPunctuations);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tMap(nf.CharSubstitutions, SetCaseProcessor.FullWidthPunctuations, SetCaseProcessor.HalfWidthPunctuations);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (fs.OriginalCharacters != null && fs.SubstituteCharacters != null) {\r\n\t\t\t\tvar sl = fs.SubstituteCharacters.Length;\r\n\t\t\t\tfor (int i = 0; i < fs.OriginalCharacters.Length; i++) {\r\n\t\t\t\t\tif (i >= sl) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnf.CharSubstitutions[fs.OriginalCharacters[i]] = fs.SubstituteCharacters[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t#region HACK: 将 iText 转码的横向标点转回竖向标点\r\n\t\t\tif (nf.Vertical) {\r\n\t\t\t\tMap(nf.CharSubstitutions, HorizontalPunctuations, VerticalPunctuations);\r\n\t\t\t}\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tstatic void Map(Dictionary<char, char> map, string from, string to) {\r\n\t\t\tvar i = 0;\r\n\t\t\tforeach (var item in from) {\r\n\t\t\t\tmap[item] = to[i++];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void ReadSingleByteFontWidths(PdfDictionary font, FontInfo fontInfo, NewFont newFont) {\r\n\t\t\tvar wl = font.GetAsArray(PdfName.WIDTHS);\r\n\t\t\tif (wl == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar fc = font.TryGetInt32(PdfName.FIRSTCHAR, 0);\r\n\t\t\tvar widths = newFont.GlyphWidths;\r\n\t\t\tforeach (PdfNumber item in wl) {\r\n\t\t\t\tif (item == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar s = fontInfo.Decode([(byte)fc], 0, 1);\r\n\t\t\t\tif (s.Length == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tint w;\r\n\t\t\t\tif (widths.TryGetValue(s[0], out w) == false || w == 0) {\r\n\t\t\t\t\twidths[s[0]] = item.IntValue;\r\n\t\t\t\t}\r\n\t\t\t\t++fc;\r\n\t\t\t}\r\n\t\t}\r\n\t\tstatic void ReadCidFontWidths(PdfDictionary font, FontInfo fontInfo, NewFont newfont) {\r\n\t\t\tvar w = newfont.Vertical ? PdfName.W2 : PdfName.W;\r\n\t\t\tvar fw = font.GetAsArray(w);\r\n\t\t\tif (fw == null) {\r\n\t\t\t\tfw = font.Locate<PdfArray>(PdfName.DESCENDANTFONTS, 0, w);\r\n\t\t\t\tif (fw == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar encoding = font.GetAsName(PdfName.ENCODING)?.ToString().Substring(1);\r\n\t\t\tCMapCidUni cMap = encoding != null && Array.BinarySearch(__BuiltInEncodings, encoding) >= 0\r\n\t\t\t\t? CMapCache.GetCachedCMapCidUni(encoding)\r\n\t\t\t\t: null;\r\n\t\t\tif (Array.IndexOf(__GbEucEncodings, encoding) != -1) {\r\n\t\t\t\tcMap = new GbkCidUni(cMap);\r\n\t\t\t}\r\n\t\t\tvar l = fw.Size;\r\n\t\t\tPdfObject cw;\r\n\t\t\tint cid;\r\n\t\t\tvar widths = newfont.GlyphWidths;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tcid = (fw[i] as PdfNumber).IntValue;\r\n\t\t\t\tif (++i >= l) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcw = fw[i];\r\n\t\t\t\tif (cw.Type == PdfObject.ARRAY) {\r\n\t\t\t\t\tforeach (var width in cw as PdfArray) {\r\n\t\t\t\t\t\tvar u = fontInfo.DecodeCidToUnicode(cMap, cid);\r\n\t\t\t\t\t\tif (u == 0 && cid != 0) {\r\n\t\t\t\t\t\t\tDebug.WriteLine(cid.ToText() + \"－无法解码CID\");\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twidths[u] = (width as PdfNumber).IntValue;\r\n\t\t\t\t\t\tDebug.WriteLine(String.Join(\" \", [cid.ToText(), u.ToText(\"X\"), ((char)u).ToString(), widths[u].ToText()]));\r\n\t\t\t\t\t\t++cid;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (cw.Type == PdfObject.NUMBER) {\r\n\t\t\t\t\tvar cid2 = (cw as PdfNumber).IntValue + 1;\r\n\t\t\t\t\tvar width = (fw[++i] as PdfNumber).IntValue;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tvar u = fontInfo.DecodeCidToUnicode(cMap, cid);\r\n\t\t\t\t\t\tif (u == 0 && cid != 0) {\r\n\t\t\t\t\t\t\tDebug.WriteLine(cid.ToText() + \"－无法解码CID\");\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twidths[u] = width;\r\n\t\t\t\t\t\tDebug.WriteLine(String.Join(\" \", [cid.ToText(), u.ToText(\"X\"), ((char)u).ToString(), width.ToText()]));\r\n\t\t\t\t\t} while (++cid < cid2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void ChangeLegacyFontDictionary(PdfReader pdf, NewFont font) {\r\n\t\t\tvar f = PdfReader.GetPdfObject(font.FontRef) as PdfDictionary;\r\n\t\t\tf.Put(PdfName.TYPE, PdfName.FONT);\r\n\t\t\tf.Put(PdfName.SUBTYPE, PdfName.TYPE0);\r\n\t\t\tf.Put(PdfName.BASEFONT, new PdfName(font.FontName));\r\n\t\t\tf.Put(PdfName.ENCODING, new PdfName(font.Vertical ? BaseFont.IDENTITY_V : BaseFont.IDENTITY_H));\r\n\t\t\tf.Put(PdfName.DESCENDANTFONTS, font.DescendantFontRef);\r\n\t\t\tvar metrics = new int[font.UnicodeCidMap.Count][];\r\n\t\t\tvar i = -1;\r\n\t\t\tforeach (var m in font.UnicodeCidMap) {\r\n\t\t\t\tmetrics[++i] = [m.Value, 0, m.Key];\r\n\t\t\t}\r\n\t\t\tvar ttf = font.Font.BaseFont as TrueTypeFontUnicode;\r\n\t\t\tArray.Sort(metrics, ttf);\r\n\t\t\tvar u = pdf.AddPdfObject(ttf.GetToUnicode(metrics));\r\n\t\t\tf.Put(PdfName.TOUNICODE, u);\r\n\t\t}\r\n\r\n\t\tstatic void WriteCidWidths(NewFont font, PdfDictionary fontDictionary) {\r\n\t\t\tvar l = font.GlyphWidths.Count;\r\n\t\t\tif (l == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar widths = new CharacterWidth[l];\r\n\t\t\tvar i = -1;\r\n\t\t\tint width;\r\n\t\t\tforeach (var item in font.GlyphWidths) {\r\n\t\t\t\tif (item.Value == FontInfo.DefaultDefaultWidth\r\n\t\t\t\t\t|| font.UnicodeCidMap.TryGetValue(item.Key, out var cid) == false) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\twidths[++i] = new CharacterWidth(cid, item.Value);\r\n\t\t\t}\r\n\t\t\tl = ++i;\r\n\t\t\tArray.Resize(ref widths, l);\r\n\t\t\tArray.Sort(widths, CharacterWidth.Compare);\r\n\t\t\tvar w = new PdfArray();\r\n\t\t\tint id, id2;\r\n\t\t\tCharacterWidth cw;\r\n\t\t\tfor (i = 0; i < l; i++) {\r\n\t\t\t\tid = widths[i].ID;\r\n\t\t\t\tw.Add(new PdfNumber(id));\r\n\t\t\t\twidth = widths[i].Width;\r\n\t\t\t\tvar i2 = i;\r\n\t\t\t\tid2 = id;\r\n\t\t\t\tvar wl = new PdfArray {\r\n\t\t\t\t\tnew PdfNumber(width)\r\n\t\t\t\t};\r\n\t\t\t\twhile (++i2 < l && (cw = widths[i2]).ID == ++id2 && cw.Width != width) {\r\n\t\t\t\t\twl.Add(new PdfNumber(cw.Width));\r\n\t\t\t\t}\r\n\t\t\t\tif (wl.Size > 1) {\r\n\t\t\t\t\tw.Add(wl);\r\n\t\t\t\t\ti = i2 - 1;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tid2 = id;\r\n\t\t\t\tfor (i2 = i + 1; i2 < l; i2++) {\r\n\t\t\t\t\tcw = widths[i2];\r\n\t\t\t\t\tif (++id2 != cw.ID || cw.Width != width) {\r\n\t\t\t\t\t\ti2--;\r\n\t\t\t\t\t\tid2--;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (i2 > i) {\r\n\t\t\t\t\tw.Add(new PdfNumber(id2));\r\n\t\t\t\t\tw.Add(new PdfNumber(width));\r\n\t\t\t\t\ti = i2;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tw.Add(wl);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (w.Size > 0) {\r\n\t\t\t\tfontDictionary.Put(font.Vertical ? PdfName.W2 : PdfName.W, w);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SubSetFontData(PdfReader pdf) {\r\n\t\t\tforeach (var font in _newFonts) {\r\n\t\t\t\tvar newFont = font.Value;\r\n\t\t\t\tTracker.TraceMessage($\"嵌入字体：{newFont.Font.Familyname}({newFont.UnicodeCidMap.Count}字)\");\r\n\t\t\t\tif (newFont.AbsentChars.Count > 0) {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"丢失{newFont.AbsentChars.Count}字：{String.Concat(newFont.AbsentChars)}\");\r\n\t\t\t\t}\r\n\t\t\t\tChangeLegacyFontDictionary(pdf, newFont);\r\n\r\n\t\t\t\tvar ttf = newFont.Font.BaseFont as TrueTypeFontUnicode;\r\n\t\t\t\tvar fa = PdfReader.GetPdfObject(newFont.DescendantFontRef) as PdfArray;\r\n\t\t\t\tvar df = new PdfDictionary();\r\n\t\t\t\tfa.Add(df);\r\n\t\t\t\tdf.Put(PdfName.TYPE, PdfName.FONT);\r\n\t\t\t\tdf.Put(PdfName.SUBTYPE, ttf.Cff ? PdfName.CIDFONTTYPE0 : PdfName.CIDFONTTYPE2);\r\n\t\t\t\tdf.Put(PdfName.BASEFONT, new PdfName(newFont.FontName));\r\n\t\t\t\tWriteCidWidths(newFont, df);\r\n\t\t\t\tvar fs = pdf.AddPdfObject(SubsetFont(newFont, ttf));\r\n\t\t\t\tvar fd = ttf.GetFontDescriptor(fs, newFont.SubsetPrefix, null);\r\n\t\t\t\tif (newFont.ItalicAngle != 0) {\r\n\t\t\t\t\tfd.Put(PdfName.ITALICANGLE, newFont.ItalicAngle);\r\n\t\t\t\t\tfd.Put(PdfName.FLAGS, 1 << 6);\r\n\t\t\t\t}\r\n\t\t\t\tdf.Put(PdfName.FONTDESCRIPTOR, pdf.AddPdfObject(fd));\r\n\r\n\t\t\t\tvar csi = new PdfDictionary();\r\n\t\t\t\tcsi.Put(PdfName.REGISTRY, new PdfString(\"Adobe\"));\r\n\t\t\t\tcsi.Put(PdfName.ORDERING, new PdfString(\"Identity\"));\r\n\t\t\t\tcsi.Put(PdfName.SUPPLEMENT, new PdfNumber(0));\r\n\t\t\t\tdf.Put(PdfName.CIDSYSTEMINFO, csi);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic PdfStream SubsetFont(NewFont ef, TrueTypeFontUnicode ttf) {\r\n\t\t\tbyte[] b;\r\n\t\t\tif (ttf.Cff) {\r\n\t\t\t\tint[] metricsTT;\r\n\t\t\t\tvar d = new Dictionary<int, int[]>(ef.UnicodeCidMap.Count);\r\n\t\t\t\tforeach (var item in ef.UnicodeCidMap) {\r\n\t\t\t\t\tmetricsTT = ttf.GetMetricsTT(item.Key);\r\n\t\t\t\t\td.Add(item.Value, new int[] { metricsTT[0], metricsTT[1], item.Key });\r\n\t\t\t\t}\r\n\t\t\t\tvar f = new CFFFontSubset(new RandomAccessFileOrArray(ttf.ReadCffFont()), d);\r\n\t\t\t\tb = f.Process(f.GetNames()[0]);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar r = new int[ef.UnicodeCidMap.Count];\r\n\t\t\t\tef.UnicodeCidMap.Values.CopyTo(r, 0);\r\n\t\t\t\tb = new TrueTypeFontSubSet(ttf.FileName, new RandomAccessFileOrArray(ttf.FileName), new System.util.collections.HashSet2<int>(r), ttf.DirectoryOffset, true, true).Process();\r\n\t\t\t}\r\n\t\t\tvar s = new PdfStream(b);\r\n\t\t\tif (ttf.Cff) {\r\n\t\t\t\ts.Put(PdfName.SUBTYPE, new PdfName(\"CIDFontType0C\"));\r\n\t\t\t}\r\n\t\t\ts.FlateCompress();\r\n\t\t\ts.Put(PdfName.LENGTH1, new PdfNumber(b.Length));\r\n\t\t\treturn s;\r\n\t\t}\r\n\r\n\t\t[DebuggerDisplay(\"{ID},{Width}\")]\r\n\t\tstruct CharacterWidth(int id, int width)\r\n\t\t{\r\n\t\t\tpublic int ID = id, Width = width;\r\n\r\n\t\t\tpublic static int Compare(CharacterWidth x, CharacterWidth y) {\r\n\t\t\t\treturn x.ID.CompareTo(y.ID);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t[DebuggerDisplay(\"{FontName}\")]\r\n\t\tsealed class NewFont\r\n\t\t{\r\n\t\t\tFont _Font;\r\n\r\n\t\t\tpublic Dictionary<int, PdfDictionary> FontDictionaries { get; } = [];\r\n\t\t\tpublic PRIndirectReference FontRef { get; set; }\r\n\t\t\tpublic PdfIndirectReference DescendantFontRef { get; set; }\r\n\t\t\t/// <summary>\r\n\t\t\t/// 字体 Unicode 到宽度的映射表。\r\n\t\t\t/// </summary>\r\n\t\t\tpublic Dictionary<int, int> GlyphWidths { get; } = [];\r\n\t\t\t/// <summary>\r\n\t\t\t/// 字体 Unicode 和 CID 的映射表。\r\n\t\t\t/// </summary>\r\n\t\t\tpublic Dictionary<int, int> UnicodeCidMap { get; } = [];\r\n\t\t\tpublic string SubsetPrefix { get; private set; }\r\n\t\t\tpublic string FontName => SubsetPrefix + _Font.Familyname;\r\n\t\t\tpublic HashSet<char> AbsentChars { get; } = [];\r\n\t\t\tpublic Dictionary<char, char> CharSubstitutions { get; } = [];\r\n\t\t\tpublic bool Vertical { get; set; }\r\n\t\t\tpublic double ItalicAngle { get; set; }\r\n\t\t\tpublic Font Font {\r\n\t\t\t\tget => _Font;\r\n\t\t\t\tset {\r\n\t\t\t\t\t_Font = value;\r\n\t\t\t\t\tSubsetPrefix = BaseFont.CreateSubsetPrefix();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class GbkCidUni(CMapCidUni baseCMap) : CMapCidUni\r\n\t\t{\r\n\t\t\treadonly CMapCidUni _BaseCMap = baseCMap;\r\n\r\n\t\t\tpublic override int Lookup(int character) {\r\n\t\t\t\treturn character > 813 && character < 908 ? character - (814 - 0x21)\r\n\t\t\t\t\t: character == 7716 ? ' '\r\n\t\t\t\t\t: _BaseCMap.Lookup(character);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/DocInfoExporter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal sealed class DocInfoExporter(PdfReader reader, ExporterOptions options)\r\n\t{\r\n\t\tconst string SimpleBookmarkPageNumLeader = \" ………… \";\r\n\t\tconst int OpenDocWorkload = 10;\r\n\t\tconst int BookmarkWorkload = 30;\r\n\r\n\t\treadonly PdfReader _reader = reader;\r\n\t\treadonly ExporterOptions _options = options;\r\n\t\treadonly PdfContentExport _contentExport = new PdfContentExport(options);\r\n\t\treadonly PdfActionExporter _actionExport = new PdfActionExporter(options.UnitConverter);\r\n\t\tDictionary<int, int> _pageReferenceMapper;\r\n\t\tDictionary<string, PdfObject> _namedDestinations;\r\n\r\n\t\tpublic FilePath BinaryStreamPath {\r\n\t\t\tget => _contentExport.BinaryStreamPath;\r\n\t\t\tset => _contentExport.BinaryStreamPath = value;\r\n\t\t}\r\n\r\n\t\tDictionary<int, int> PageReferenceMapper => _pageReferenceMapper ??= _reader.GetPageRefMapper();\r\n\r\n\t\tstatic internal XmlWriterSettings GetWriterSettings() {\r\n\t\t\treturn new XmlWriterSettings() {\r\n\t\t\t\tEncoding = AppContext.Exporter.GetEncoding(),\r\n\t\t\t\tIndent = true,\r\n\t\t\t\tIndentChars = \"\\t\",\r\n\t\t\t\tCheckCharacters = false\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal int EstimateWorkload() {\r\n\t\t\tvar n = _reader.NumberOfPages;\r\n\t\t\tvar load = OpenDocWorkload;\r\n\t\t\tif (_options.ExportCatalog) {\r\n\t\t\t\tload += n / 100;\r\n\t\t\t}\r\n\t\t\tif (_options.ExportBookmarks) {\r\n\t\t\t\tload += BookmarkWorkload;\r\n\t\t\t}\r\n\t\t\tif (_options.ExtractPageLinks) {\r\n\t\t\t\tload += n;\r\n\t\t\t}\r\n\t\t\tif (_options.ExtractPageContent) {\r\n\t\t\t\tload += PageRangeCollection.Parse(_options.ExtractPageRange, 1, n, true).TotalPages;\r\n\t\t\t}\r\n\t\t\tif (_options.ExtractPageSettings) {\r\n\t\t\t\tload += n;\r\n\t\t\t}\r\n\t\t\treturn load;\r\n\t\t}\r\n\r\n\t\tinternal static GeneralInfo RewriteDocInfoWithEncoding(PdfReader pdf, Encoding encoding) {\r\n\t\t\ttry {\r\n\t\t\t\treturn RewriteDocInfoWithEncoding(pdf.Trailer.GetAsDict(PdfName.INFO), encoding);\r\n\t\t\t}\r\n\t\t\tcatch (IOException) {\r\n\t\t\t\t// 忽略错误的元数据\r\n\t\t\t\treturn new GeneralInfo();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static GeneralInfo RewriteDocInfoWithEncoding(PdfDictionary info, Encoding encoding) {\r\n\t\t\tvar r = new GeneralInfo();\r\n\t\t\tif (info == null || info.Length == 0) {\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t\tvar dump = new PdfDictionary();\r\n\t\t\tstring t;\r\n\t\t\tPdfName n;\r\n\t\t\tPdfString s;\r\n\t\t\tforeach (var item in info) {\r\n\t\t\t\ts = item.Value as PdfString;\r\n\t\t\t\tif (s == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tn = item.Key;\r\n\t\t\t\tt = s.Decode(encoding);\r\n\t\t\t\tif (PdfName.TITLE.Equals(n)) {\r\n\t\t\t\t\tr.Title = t;\r\n\t\t\t\t}\r\n\t\t\t\telse if (PdfName.AUTHOR.Equals(n)) {\r\n\t\t\t\t\tr.Author = t;\r\n\t\t\t\t}\r\n\t\t\t\telse if (PdfName.SUBJECT.Equals(n)) {\r\n\t\t\t\t\tr.Subject = t;\r\n\t\t\t\t}\r\n\t\t\t\telse if (PdfName.KEYWORDS.Equals(n)) {\r\n\t\t\t\t\tr.Keywords = t;\r\n\t\t\t\t}\r\n\t\t\t\telse if (PdfName.CREATOR.Equals(n)) {\r\n\t\t\t\t\tr.Creator = t;\r\n\t\t\t\t}\r\n\t\t\t\telse if (PdfName.PRODUCER.Equals(n)) {\r\n\t\t\t\t\tr.Producer = t;\r\n\t\t\t\t}\r\n\t\t\t\tdump.Put(n, t);\r\n\t\t\t}\r\n\t\t\tif (encoding != null) {\r\n\t\t\t\tinfo.Merge(dump);\r\n\t\t\t}\r\n\t\t\tdump = null;\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tinternal static void WriteDocumentInfoAttributes(XmlWriter w, string sourcePath, int numberOfPages) {\r\n\t\t\tw.WriteAttributeString(Constants.Info.ProductName, System.Windows.Forms.Application.ProductName);\r\n\t\t\tw.WriteAttributeString(Constants.Info.ProductVersion, Constants.InfoDocVersion);\r\n\t\t\tw.WriteAttributeString(Constants.Info.ExportDate, DateTime.Now.ToString(\"yyyy年MM月dd日 HH:mm:ss\"));\r\n\t\t\t//w.WriteAttributeString (Constants.Info.DocumentName, Path.GetFileNameWithoutExtension (sourceFile));\r\n\t\t\tw.WriteAttributeString(Constants.Info.DocumentPath, sourcePath);\r\n\t\t\tw.WriteAttributeString(Constants.Info.PageNumber, numberOfPages.ToText());\r\n\t\t}\r\n\r\n\t\tinternal void ExportDocument(XmlWriter w) {\r\n\t\t\tTracker.IncrementProgress(OpenDocWorkload);\r\n\t\t\tif (_options.UnitConverter.UnitFactor != 1) {\r\n\t\t\t\tw.WriteStartElement(Constants.Units.ThisName);\r\n\t\t\t\tw.WriteAttributeString(Constants.Units.Unit, _options.UnitConverter.Unit);\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t}\r\n\t\t\tif (_options.ExportDocProperties) {\r\n\t\t\t\tTracker.TraceMessage(\"导出文档信息。\");\r\n\t\t\t\tRewriteDocInfoWithEncoding(_reader, AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t\tExportDocumentInfo(w);\r\n\t\t\t}\r\n\t\t\tif (_options.ExportViewerPreferences) {\r\n\t\t\t\tTracker.TraceMessage(\"导出阅读器设置。\");\r\n\t\t\t\tExportViewerPreferences(w);\r\n\t\t\t}\r\n\t\t\tif (_options.ExportBookmarks || _options.ExtractPageLinks) {\r\n\t\t\t\tif (_options.ConsolidateNamedDestinations) {\r\n\t\t\t\t\t_reader.ConsolidateNamedDestinations();\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.ExportBookmarks) {\r\n\t\t\t\t\tTracker.TraceMessage(\"导出书签。\");\r\n\t\t\t\t\tw.WriteStartElement(Constants.DocumentBookmark);\r\n\t\t\t\t\tExportBookmarks(OutlineManager.GetBookmark(_reader, _options.UnitConverter), w);\r\n\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\tTracker.IncrementProgress(BookmarkWorkload);\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.ExtractPageLinks) {\r\n\t\t\t\t\tTracker.TraceMessage(\"导出页面连接。\");\r\n\t\t\t\t\tExtractPageLinks(w);\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.ConsolidateNamedDestinations == false) {\r\n\t\t\t\t\tTracker.TraceMessage(\"导出命名目标。\");\r\n\t\t\t\t\tExportNamedDestinations(w);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_options.ExtractPageSettings) {\r\n\t\t\t\tTracker.TraceMessage(\"导出页面设置。\");\r\n\t\t\t\tw.WriteStartElement(Constants.Content.PageSettings.ThisName);\r\n\t\t\t\tExtractPageSettings(w);\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t}\r\n\t\t\tif (_options.ExportCatalog) {\r\n\t\t\t\t_contentExport.ExportTrailer(w, _reader);\r\n\t\t\t}\r\n\t\t\tif (_options.ExtractPageContent) {\r\n\t\t\t\t_contentExport.ExportContents(w, _reader);\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(\"完成导出任务。\");\r\n\t\t}\r\n\r\n\t\tinternal void ExportDocumentInfo(XmlWriter w) {\r\n\t\t\tvar info = _reader.Catalog;\r\n\t\t\tw.WriteStartElement(Constants.Info.ThisName);\r\n\t\t\tif (info.Contains(PdfName.VERSION))\r\n\t\t\t\tw.WriteAttributeString(Constants.Version, PdfHelper.GetPdfNameString(info.GetAsName(PdfName.VERSION)));\r\n\t\t\tinfo = _reader.Trailer.GetAsDict(PdfName.INFO);\r\n\t\t\tif (info?.Length > 0) {\r\n\t\t\t\tstring key, val;\r\n\t\t\t\tforeach (var item in info) {\r\n\t\t\t\t\tkey = PdfName.DecodeName(item.Key.ToString());\r\n\t\t\t\t\tval = item.Value.IsString() ? ((PdfString)item.Value).Decode(null) : item.Value.ToString();\r\n\t\t\t\t\tswitch (key) {\r\n\t\t\t\t\t\tcase \"Title\": key = Constants.Info.Title; break;\r\n\t\t\t\t\t\tcase \"Author\": key = Constants.Info.Author; break;\r\n\t\t\t\t\t\tcase \"Subject\": key = Constants.Info.Subject; break;\r\n\t\t\t\t\t\tcase \"Keywords\": key = Constants.Info.Keywords; break;\r\n\t\t\t\t\t\tcase \"Creator\": key = Constants.Info.Creator; break;\r\n\t\t\t\t\t\tcase \"Producer\": key = Constants.Info.Producer; break;\r\n\t\t\t\t\t\tcase \"CreationDate\":\r\n\t\t\t\t\t\t\tkey = Constants.Info.CreationDate;\r\n\t\t\t\t\t\t\tgoto case \"//DecodeDate\";\r\n\t\t\t\t\t\tcase \"ModDate\":\r\n\t\t\t\t\t\t\tkey = Constants.Info.ModDate;\r\n\t\t\t\t\t\t\tgoto case \"//DecodeDate\";\r\n\t\t\t\t\t\tcase \"//DecodeDate\":\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tval = PdfDate.Decode(val).ToString(\"yyyy年MM月dd日 HH:mm:ss\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw.WriteAttributeString(XmlConvert.EncodeLocalName(key), PdfHelper.GetValidXmlString(val));\r\n\t\t\t\t}\r\n\t\t\t\tif (_reader.Metadata?.Length > 0) {\r\n\t\t\t\t\tw.WriteStartElement(Constants.Info.MetaData);\r\n\t\t\t\t\tusing (MemoryStream ms = new MemoryStream(_reader.Metadata)) {\r\n\t\t\t\t\t\tvar d = new XmlDocument();\r\n\t\t\t\t\t\td.Load(ms);\r\n\t\t\t\t\t\td.DocumentElement?.WriteContentTo(w);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tw.WriteEndElement();\r\n\r\n\t\t}\r\n\r\n\t\tinternal static void WriteDocumentInfoAttributes(TextWriter w, string sourcePath, int numberOfPages) {\r\n\t\t\tw.WriteLine(\"#版本=\" + Constants.InfoDocVersion);\r\n\t\t\tw.WriteLine(\"#\" + Constants.Info.DocumentPath + \"=\" + sourcePath);\r\n\t\t\tw.WriteLine(\"#页数=\" + numberOfPages);\r\n\t\t\tw.WriteLine();\r\n\t\t}\r\n\r\n\t\tinternal void ExportDocument(TextWriter w) {\r\n\t\t\tvar i = RewriteDocInfoWithEncoding(_reader, AppContext.Encodings.DocInfoEncoding);\r\n\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, Constants.Info.Title, PdfHelper.GetValidXmlString(i.Title));\r\n\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, Constants.Info.Author, PdfHelper.GetValidXmlString(i.Author));\r\n\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, Constants.Info.Subject, PdfHelper.GetValidXmlString(i.Subject));\r\n\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, Constants.Info.Keywords, PdfHelper.GetValidXmlString(i.Keywords));\r\n\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, Constants.Info.Creator, PdfHelper.GetValidXmlString(i.Creator));\r\n\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, Constants.Info.Producer, PdfHelper.GetValidXmlString(i.Producer));\r\n\t\t}\r\n\r\n\t\tinternal void ExportViewerPreferences(XmlWriter w) {\r\n\t\t\tvar catalog = _reader.Catalog;\r\n\t\t\tif (catalog.Contains(PdfName.VIEWERPREFERENCES) || catalog.Contains(PdfName.PAGELAYOUT) || catalog.Contains(PdfName.PAGEMODE)) {\r\n\t\t\t\tw.WriteStartElement(Constants.ViewerPreferences);\r\n\t\t\t\tif (catalog.Contains(PdfName.PAGELAYOUT)) {\r\n\t\t\t\t\tw.WriteAttributeString(Constants.PageLayout,\r\n\t\t\t\t\t\tValueHelper.MapValue(catalog.GetAsName(PdfName.PAGELAYOUT), Constants.PageLayoutType.PdfNames,\r\n\t\t\t\t\t\tConstants.PageLayoutType.Names));\r\n\t\t\t\t}\r\n\t\t\t\tif (catalog.Contains(PdfName.PAGEMODE)) {\r\n\t\t\t\t\tw.WriteAttributeString(Constants.PageMode,\r\n\t\t\t\t\t\tValueHelper.MapValue(catalog.GetAsName(PdfName.PAGEMODE), Constants.PageModes.PdfNames,\r\n\t\t\t\t\t\tConstants.PageModes.Names));\r\n\t\t\t\t}\r\n\t\t\t\tif (catalog.Contains(PdfName.VIEWERPREFERENCES)) {\r\n\t\t\t\t\tExportViewerPreferences(catalog.GetAsDict(PdfName.VIEWERPREFERENCES), w);\r\n\t\t\t\t}\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t}\r\n\r\n\t\t\tif (!catalog.Contains(PdfName.PAGELABELS)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar labels = ExtractPageLabels(catalog.GetAsDict(PdfName.PAGELABELS));\r\n\t\t\tif (labels.Count > 0) {\r\n\t\t\t\tw.WriteStartElement(Constants.PageLabels);\r\n\t\t\t\tforeach (var item in labels) {\r\n\t\t\t\t\tw.WriteStartElement(Constants.PageLabelsAttributes.Style);\r\n\t\t\t\t\tw.WriteAttributeString(Constants.PageLabelsAttributes.PageNumber, item.PageNumber.ToText());\r\n\t\t\t\t\tif (item.StartPage != 0) {\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLabelsAttributes.StartPage, item.StartPage.ToText());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (String.IsNullOrEmpty(item.Prefix) == false) {\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLabelsAttributes.Prefix, item.Prefix);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (String.IsNullOrEmpty(item.Style) == false) {\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLabelsAttributes.Style,\r\n\t\t\t\t\t\t\tValueHelper.MapValue(item.Style[0],\r\n\t\t\t\t\t\t\t\tConstants.PageLabelStyles.PdfValues,\r\n\t\t\t\t\t\t\t\tConstants.PageLabelStyles.Names,\r\n\t\t\t\t\t\t\t\titem.Style)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static List<PageLabel> ExtractPageLabels(PdfDictionary labels) {\r\n\t\t\tvar a = new List<PageLabel>();\r\n\t\t\tvar ls = labels.GetAsArray(PdfName.NUMS);\r\n\t\t\tif (ls == null) {\r\n\t\t\t\treturn new List<PageLabel>();\r\n\t\t\t}\r\n\t\t\tfor (int i = 0; i < ls.Size; i++) {\r\n\t\t\t\tvar l = new PageLabel {\r\n\t\t\t\t\tPageNumber = ls.GetAsNumber(i++).IntValue + 1\r\n\t\t\t\t};\r\n\t\t\t\tvar label = ls.GetAsDict(i);\r\n\t\t\t\tif (label.Contains(PdfName.ST)) {\r\n\t\t\t\t\tl.StartPage = label.GetAsNumber(PdfName.ST).IntValue;\r\n\t\t\t\t}\r\n\t\t\t\tif (label.Contains(PdfName.P)) {\r\n\t\t\t\t\tl.Prefix = label.GetAsString(PdfName.P).ToUnicodeString();\r\n\t\t\t\t}\r\n\t\t\t\tif (label.Contains(PdfName.S)) {\r\n\t\t\t\t\tl.Style = PdfHelper.GetPdfNameString(label.GetAsName(PdfName.S));\r\n\t\t\t\t}\r\n\t\t\t\ta.Add(l);\r\n\t\t\t\tl = null;\r\n\t\t\t}\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tinternal void ExtractPageSettings(XmlWriter w) {\r\n\t\t\tint n = _reader.NumberOfPages;\r\n\t\t\tPageSettings active = null, current;\r\n\t\t\tint fromP = 1, toP;\r\n\t\t\tfor (int i = 1; i <= n; i++) {\r\n\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\tcurrent = PageSettings.FromReader(_reader, i, _options.UnitConverter);\r\n\t\t\t\tif (PageSettings.HavingSameDimension(active, current) && i != n) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (i == 1) {\r\n\t\t\t\t\tactive = current;\r\n\t\t\t\t\tif (n > i) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ttoP = i == n ? n : i - 1;\r\n\t\t\t\tactive.PageRange = (fromP != toP) ? String.Concat(fromP.ToText(), '-', toP.ToText()) : toP.ToText();\r\n\t\t\t\tw.WriteStartElement(Constants.Content.Page);\r\n\t\t\t\tactive.WriteXml(w);\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t\tfromP = i;\r\n\t\t\t\tactive = current;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static void ExportViewerPreferences(PdfDictionary preferences, XmlWriter w) {\r\n\t\t\tforeach (var item in preferences) {\r\n\t\t\t\tif (item.Key.Equals(PdfName.TYPE)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar itemName = ValueHelper.MapValue(item.Key, Constants.ViewerPreferencesType.PdfNames, Constants.ViewerPreferencesType.Names, PdfName.DecodeName(item.Key.ToString()));\r\n\t\t\t\tif (item.Value is PdfName nv) {\r\n\t\t\t\t\tif (PdfName.DIRECTION.Equals(item.Key)) {\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.ViewerPreferencesType.Direction,\r\n\t\t\t\t\t\t\tValueHelper.MapValue(nv, Constants.ViewerPreferencesType.DirectionType.PdfNames,\r\n\t\t\t\t\t\t\tConstants.ViewerPreferencesType.DirectionType.Names));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tw.WriteAttributeString(itemName, PdfHelper.GetPdfFriendlyName(nv));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (item.Value.IsBoolean()) {\r\n\t\t\t\t\tw.WriteAttributeString(\r\n\t\t\t\t\t\titemName,\r\n\t\t\t\t\t\t((PdfBoolean)item.Value).BooleanValue ? Constants.Boolean.True : Constants.Boolean.False\r\n\t\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tw.WriteAttributeString(itemName, item.Value.ToString());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ExportNamedDestinations(XmlWriter w) {\r\n\t\t\tvar nds = LoadNamedDestinations();\r\n\t\t\tif (nds != null && nds.Count > 0) {\r\n\t\t\t\tw.WriteStartElement(Constants.NamedDestination);\r\n\t\t\t\tforeach (var item in nds) {\r\n\t\t\t\t\tw.WriteStartElement(\"位置\");\r\n\t\t\t\t\tw.WriteAttributeString(Constants.DestinationAttributes.Name, StringHelper.ReplaceControlAndBomCharacters(item.Key));\r\n\t\t\t\t\t_actionExport.ExportGotoAction(item.Value as PdfObject, nds, w, PageReferenceMapper);\r\n\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tDictionary<string, PdfObject> LoadNamedDestinations() {\r\n\t\t\treturn _namedDestinations ??= _reader.GetNamedDestinations();\r\n\t\t}\r\n\r\n\t\tinternal void ExportBookmarks(XmlElement bookmarks, TextWriter w, int level, bool isOpen) {\r\n\t\t\tif (bookmarks == null || bookmarks.HasChildNodes == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar childBookmarks = bookmarks.SelectNodes(Constants.Bookmark);\r\n\t\t\tif (childBookmarks == null || childBookmarks.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tstring title, page;\r\n\t\t\tbool open;\r\n\t\t\tforeach (XmlElement item in childBookmarks) {\r\n\t\t\t\ttitle = item.GetAttribute(Constants.BookmarkAttributes.Title);\r\n\t\t\t\tpage = item.GetAttribute(Constants.DestinationAttributes.Page);\r\n\t\t\t\topen = item.GetAttribute(Constants.BookmarkAttributes.Open) == Constants.Boolean.True;\r\n\r\n\t\t\t\tif (open != isOpen && item.HasChildNodes) {\r\n\t\t\t\t\tOutlineManager.WriteSimpleBookmarkInstruction(w, \"打开书签\", open ? \"是\" : \"否\");\r\n\t\t\t\t\tisOpen = open;\r\n\t\t\t\t}\r\n\t\t\t\tif (String.IsNullOrEmpty(title) == false) {\r\n\t\t\t\t\tfor (int i = 0; i < level; i++) {\r\n\t\t\t\t\t\tw.Write('\\t');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw.Write(title.Replace('\\n', ' ').Replace('\\r', ' '));\r\n\t\t\t\t\tw.Write(SimpleBookmarkPageNumLeader);\r\n\t\t\t\t\tw.WriteLine(page);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (childBookmarks != null) {\r\n\t\t\t\t\tlevel++;\r\n\t\t\t\t\tExportBookmarks(item, w, level, isOpen);\r\n\t\t\t\t\tlevel--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 导出 PDF 书签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"bookmarks\"></param>\r\n\t\t/// <param name=\"w\"></param>\r\n\t\tinternal void ExportBookmarks(XmlElement bookmarks, XmlWriter w) {\r\n\t\t\tif (bookmarks == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (XmlElement child in bookmarks.ChildNodes) {\r\n\t\t\t\tif (child == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tw.WriteStartElement(Constants.Bookmark);\r\n\t\t\t\tforeach (XmlAttribute entry in child.Attributes) {\r\n\t\t\t\t\tvar key = entry.Name as string;\r\n\t\t\t\t\tvar value = entry.Value ?? String.Empty;\r\n\t\t\t\t\tswitch (key) {\r\n\t\t\t\t\t\tcase Constants.Coordinates.Bottom:\r\n\t\t\t\t\t\tcase Constants.Coordinates.Left:\r\n\t\t\t\t\t\tcase Constants.Coordinates.Top:\r\n\t\t\t\t\t\tcase Constants.Coordinates.Right:\r\n\t\t\t\t\t\t\tif (String.IsNullOrEmpty(value) || value == \"null\") {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t\tcase Constants.Coordinates.ScaleFactor:\r\n\t\t\t\t\t\t\tif (String.IsNullOrEmpty(value)) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t\tcase Constants.BookmarkAttributes.Title:\r\n\t\t\t\t\t\t\tw.WriteAttributeString(key, PdfHelper.GetValidXmlString(value));\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tw.WriteAttributeString(key, value);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (child.ChildNodes.Count > 0) {\r\n\t\t\t\t\tExportBookmarks(child, w);\r\n\t\t\t\t}\r\n\t\t\t\tw.WriteEndElement();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 导出 PDF 文档页内连接。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"r\"></param>\r\n\t\t/// <param name=\"w\"></param>\r\n\t\tinternal void ExtractPageLinks(XmlWriter w) {\r\n\t\t\tw.WriteStartElement(Constants.PageLink);\r\n\t\t\tint numPages = _reader.NumberOfPages;\r\n\r\n\t\t\tfor (int i = 1; i <= numPages; i++) {\r\n\t\t\t\tvar pageDic = _reader.GetPageNRelease(i);\r\n\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\tvar annots = (PdfArray)PdfReader.GetPdfObject(pageDic.Get(PdfName.ANNOTS));\r\n\t\t\t\tif (annots == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (PdfObject item in annots.ArrayList) {\r\n\t\t\t\t\tif (item.IsNull()) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar annot = (PdfDictionary)PdfReader.GetPdfObjectRelease(item);\r\n\t\t\t\t\tif (PdfName.LINK.Equals(annot.Get(PdfName.SUBTYPE))) {\r\n\t\t\t\t\t\tw.WriteStartElement(Constants.PageLinkAttributes.Link);\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLinkAttributes.PageNumber, i.ToText());\r\n\t\t\t\t\t\tvar rect = annot.GetAsArray(PdfName.RECT);\r\n\t\t\t\t\t\tif (rect != null && rect.Size == 4) {\r\n\t\t\t\t\t\t\tvar u = _options.UnitConverter;\r\n\t\t\t\t\t\t\tvar p = new float[4];\r\n\t\t\t\t\t\t\tvar k = 0;\r\n\t\t\t\t\t\t\tforeach (PdfNumber ri in rect.ArrayList) {\r\n\t\t\t\t\t\t\t\tif (ri == null) {\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tp[k] = u.FromPoint(ri.FloatValue);\r\n\t\t\t\t\t\t\t\tk++;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (k == 4) {\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(Constants.Coordinates.Left, p[0].ToText());\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(Constants.Coordinates.Bottom, p[1].ToText());\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(Constants.Coordinates.Right, p[2].ToText());\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(Constants.Coordinates.Top, p[3].ToText());\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (annot.Contains(PdfName.BORDER)) {\r\n\t\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLinkAttributes.Border, PdfHelper.GetNumericArrayString(annot.GetAsArray(PdfName.BORDER), 1));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (annot.Contains(PdfName.C)) {\r\n\t\t\t\t\t\t\tExportColor(annot.GetAsArray(PdfName.C), w);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (annot.Contains(PdfName.H)) {\r\n\t\t\t\t\t\t\tvar style = PdfHelper.GetPdfNameString(annot.GetAsName(PdfName.H));\r\n\t\t\t\t\t\t\tstyle = ValueHelper.MapValue(style,\r\n\t\t\t\t\t\t\t\t[\"N\", \"I\", \"O\", \"P\"],\r\n\t\t\t\t\t\t\t\t[\"无\", \"取反内容\", \"取反边框\", \"按下\"],\r\n\t\t\t\t\t\t\t\tstyle\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLinkAttributes.Style, style);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (annot.Contains(PdfName.QUADPOINTS)) {\r\n\t\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLinkAttributes.QuadPoints, PdfHelper.GetNumericArrayString(annot.GetAsArray(PdfName.QUADPOINTS), _options.UnitConverter.UnitFactor));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (annot.Contains(PdfName.CONTENTS)) {\r\n\t\t\t\t\t\t\tw.WriteAttributeString(Constants.PageLinkAttributes.Contents, annot.GetAsString(PdfName.CONTENTS).ToUnicodeString());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tExportLinkAction(annot, w);\r\n\t\t\t\t\t\tif (annot.Contains(PdfName.BS)) {\r\n\t\t\t\t\t\t\tw.WriteStartElement(\"边框样式\");\r\n\t\t\t\t\t\t\tvar bs = annot.GetAsDict(PdfName.BS);\r\n\t\t\t\t\t\t\tif (bs.Contains(PdfName.W)) {\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(\"宽度\", bs.GetAsNumber(PdfName.W).FloatValue.ToText());\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (bs.Contains(PdfName.S)) {\r\n\t\t\t\t\t\t\t\tvar style = PdfHelper.GetPdfNameString(bs.GetAsName(PdfName.S));\r\n\t\t\t\t\t\t\t\tstyle = ValueHelper.MapValue(style,\r\n\t\t\t\t\t\t\t\t\t[\"S\", \"U\", \"D\", \"B\", \"I\"],\r\n\t\t\t\t\t\t\t\t\t[\"方框\", \"下划线\", \"虚线\", \"凸起\", \"凹陷\"],\r\n\t\t\t\t\t\t\t\t\tstyle\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tw.WriteAttributeString(\"样式\", style);\r\n\t\t\t\t\t\t\t\tif (PdfName.D.Equals(bs.GetAsName(PdfName.S)) && bs.Contains(PdfName.D)) {\r\n\t\t\t\t\t\t\t\t\tw.WriteAttributeString(\"线型\", PdfHelper.GetArrayString(bs.GetAsArray(PdfName.D)));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tw.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tinternal static void ExportColor(PdfArray color, XmlWriter target) {\r\n\t\t\tif (color == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (color.Size) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Color, Constants.Colors.Transparent);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Gray, color.GetAsNumber(0).FloatValue.ToText());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Red, color.GetAsNumber(0).FloatValue.ToText());\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Green, color.GetAsNumber(1).FloatValue.ToText());\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Blue, color.GetAsNumber(2).FloatValue.ToText());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 4:\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Cyan, color.GetAsNumber(0).FloatValue.ToText());\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Magenta, color.GetAsNumber(1).FloatValue.ToText());\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Yellow, color.GetAsNumber(2).FloatValue.ToText());\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Colors.Black, color.GetAsNumber(3).FloatValue.ToText());\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 导出 PDF 文档的单个连接信息。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"link\"></param>\r\n\t\t/// <param name=\"w\"></param>\r\n\t\tvoid ExportLinkAction(PdfDictionary link, XmlWriter w) {\r\n\t\t\tvar dest = PdfReader.GetPdfObjectRelease(link.Get(PdfName.DEST));\r\n\t\t\tvar names = LoadNamedDestinations();\r\n\t\t\tw.WriteStartElement(Constants.PageLinkAttributes.LinkAction);\r\n\r\n\t\t\tif (dest != null) {\r\n\t\t\t\t_actionExport.ExportGotoAction(dest, names, w, PageReferenceMapper);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_actionExport.ExportAction((PdfDictionary)PdfReader.GetPdfObjectRelease(link.Get(PdfName.A)), names, PageReferenceMapper, w);\r\n\t\t\t}\r\n\t\t\tw.WriteEndElement();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/DocInfoImporter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing iTextSharp.text.xml.xmp;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal sealed class DocInfoImporter\r\n\t{\r\n\t\treadonly float _unitFactor;\r\n\t\treadonly PdfInfoXmlDocument _infoDoc;\r\n\t\tinternal PdfInfoXmlDocument InfoDoc => _infoDoc;\r\n\r\n\t\treadonly ImporterOptions _options;\r\n\t\t/// <summary>\r\n\t\t/// 从 <see cref=\"XmlDocument\"/> 实例创建导入器（支持无信息文件的补丁操作）。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"options\">导入器的选项。</param>\r\n\t\t/// <param name=\"infoDoc\">包含信息文件的 <see cref=\"XmlDocument\"/>。</param>\r\n\t\tinternal DocInfoImporter(ImporterOptions options, PdfInfoXmlDocument infoDoc) {\r\n\t\t\t_options = options;\r\n\t\t\t_unitFactor = 1;\r\n\t\t\t_infoDoc = infoDoc;\r\n\t\t}\r\n\r\n\t\tinternal DocInfoImporter(ImporterOptions options, string infoDocFile) {\r\n\t\t\tif (string.IsNullOrEmpty(infoDocFile)) {\r\n\t\t\t\tthrow new FileNotFoundException(\"找不到信息文件。\");\r\n\t\t\t}\r\n\r\n\t\t\tvar infoDoc = new PdfInfoXmlDocument();\r\n\t\t\tif (FileHelper.HasExtension(infoDocFile, Constants.FileExtensions.Txt)) {\r\n\t\t\t\tOutlineManager.ImportSimpleBookmarks(infoDocFile, infoDoc);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tinfoDoc.Load(infoDocFile);\r\n\t\t\t}\r\n\r\n\t\t\t// 设置单位转换因数\r\n\t\t\t_unitFactor = GetUnitFactor(infoDoc.DocumentElement);\r\n\t\t\t_infoDoc = infoDoc;\r\n\t\t\t_options = options;\r\n\t\t}\r\n\r\n\t\tinternal DocInfoImporter(ImporterOptions importerOptions, PdfReader pdf, PatcherOptions patcherOptions, PdfInfoXmlDocument infoDoc) {\r\n\t\t\tvar v = patcherOptions.ViewerPreferences;\r\n\t\t\tvar o = new ExporterOptions() {\r\n\t\t\t\tExportBookmarks = infoDoc?.BookmarkRoot == null\r\n\t\t\t\t\t&& (v.RemoveZoomRate\r\n\t\t\t\t\t\t|| v.CollapseBookmark != BookmarkStatus.AsIs\r\n\t\t\t\t\t\t|| v.ForceInternalLink\r\n\t\t\t\t\t\t|| AppContext.Encodings.BookmarkEncoding != null\r\n\t\t\t\t\t\t|| (patcherOptions.UnifiedPageSettings.ScaleContent\r\n\t\t\t\t\t\t\t&& patcherOptions.UnifiedPageSettings.PaperSize.SpecialSize != SpecialPaperSize.AsPageSize)),\r\n\t\t\t\tExportDocProperties = false,\r\n\t\t\t\tExtractPageLinks = (v.RemoveZoomRate\r\n\t\t\t\t\t|| v.ForceInternalLink\r\n\t\t\t\t\t|| (patcherOptions.UnifiedPageSettings.ScaleContent\r\n\t\t\t\t\t\t&& patcherOptions.UnifiedPageSettings.PaperSize.SpecialSize != SpecialPaperSize.AsPageSize))\r\n\t\t\t\t\t&& patcherOptions.RemoveAnnotations == false,\r\n\t\t\t\tExtractPageSettings = false,\r\n\t\t\t\tExportViewerPreferences = true\r\n\t\t\t};\r\n\t\t\to.UnitConverter.Unit = Constants.Units.Point;\r\n\t\t\tvar exp = new DocInfoExporter(pdf, o);\r\n\t\t\tTracker.SetProgressGoal(exp.EstimateWorkload());\r\n\r\n\t\t\t_options = importerOptions;\r\n\t\t\t_unitFactor = 1;\r\n\t\t\t_infoDoc = infoDoc;\r\n\t\t}\r\n\r\n\t\tinternal static float GetUnitFactor(XmlElement root) {\r\n\t\t\tvar unit = root.SelectSingleNode($\"{Constants.Units.ThisName}/@{Constants.Units.Unit}\")?.Value;\r\n\t\t\treturn string.IsNullOrEmpty(unit)\r\n\t\t\t\t? 1\r\n\t\t\t\t: ValueHelper.MapValue(unit, Constants.Units.Names, Constants.Units.Factors, 1);\r\n\t\t}\r\n\r\n\t\tinternal BookmarkRootElement GetBookmarks() {\r\n\t\t\tif (_infoDoc == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tvar be = _infoDoc.BookmarkRoot;\r\n\t\t\tif (be?.HasSubBookmarks == true) {\r\n\t\t\t\tif (be.GetAttribute(Constants.DestinationAttributes.FirstPageNumber).TryParse(out int bookmarkPageShift)) {\r\n\t\t\t\t\tbookmarkPageShift--;\r\n\t\t\t\t}\r\n\t\t\t\tPreprocessBookmark(be, bookmarkPageShift);\r\n\t\t\t}\r\n\t\t\treturn be;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 偏移页码位置并转换书签目标的尺寸单位。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"source\"></param>\r\n\t\t/// <param name=\"bookmarkPageShift\"></param>\r\n\t\tprivate void PreprocessBookmark(BookmarkContainer source, int bookmarkPageShift) {\r\n\t\t\tforeach (BookmarkElement b in source.ChildNodes) {\r\n\t\t\t\tif (b == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tint pageShift = GetPageShift(b, bookmarkPageShift);\r\n\t\t\t\tShiftPageAndConvertUnits(b, pageShift);\r\n\t\t\t\tPreprocessBookmark(b, pageShift);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static int GetPageShift(XmlElement element, int baseShift) {\r\n\t\t\tint shift = baseShift;\r\n\t\t\tvar s = element.GetAttribute(Constants.DestinationAttributes.FirstPageNumber);\r\n\t\t\tif (string.IsNullOrEmpty(s) == false) {\r\n\t\t\t\tif (s.TryParse(out shift)) {\r\n\t\t\t\t\tshift--;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tshift = baseShift;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn shift;\r\n\t\t}\r\n\r\n\t\tprivate void ShiftPageAndConvertUnits(XmlElement destination, int pageShift) {\r\n\t\t\tforeach (XmlAttribute a in destination.Attributes) {\r\n\t\t\t\tswitch (a.Name) {\r\n\t\t\t\t\tcase Constants.Coordinates.Top:\r\n\t\t\t\t\tcase Constants.Coordinates.Left:\r\n\t\t\t\t\tcase Constants.Coordinates.Bottom:\r\n\t\t\t\t\tcase Constants.Coordinates.Right:\r\n\t\t\t\t\t\tif (_unitFactor != 1 && a.Value.TryParse(out float c)) {\r\n\t\t\t\t\t\t\ta.Value = (c * _unitFactor).ToText();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase Constants.DestinationAttributes.Page:\r\n\t\t\t\t\t\tif (pageShift != 0 && a.Value.TryParse(out int pageNum)/* && pageNum > 0*/) {\r\n\t\t\t\t\t\t\tpageNum += pageShift;\r\n\t\t\t\t\t\t\tdestination.SetAttribute(a.Name, pageNum.ToText());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal GeneralInfo ImportDocumentInformation() {\r\n\t\t\tif (_options.ImportDocProperties == false || _infoDoc == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(\"导入文档元数据信息。\");\r\n\t\t\tvar info = _infoDoc.InfoNode;\r\n\t\t\treturn info == null ? null : new GeneralInfo {\r\n\t\t\t\tTitle = info.Title,\r\n\t\t\t\tAuthor = info.Author,\r\n\t\t\t\tKeywords = info.Keywords,\r\n\t\t\t\tSubject = info.Subject,\r\n\t\t\t\tCreator = info.Creator,\r\n\t\t\t\tProducer = info.Producer\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal static void ImportDocumentInformation(GeneralInfo info, PdfReader pdf, string pdfFileName) {\r\n\t\t\tif (info == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar d = pdf.Trailer.GetAsDict(PdfName.INFO);\r\n\t\t\tif (d == null) {\r\n\t\t\t\td = new PdfDictionary();\r\n\t\t\t\tpdf.Trailer.Put(PdfName.INFO, d);\r\n\t\t\t}\r\n\t\t\tUpdateInfoValue(d, PdfName.TITLE, info.Title, pdfFileName);\r\n\t\t\tUpdateInfoValue(d, PdfName.SUBJECT, info.Subject, pdfFileName);\r\n\t\t\tUpdateInfoValue(d, PdfName.AUTHOR, info.Author, pdfFileName);\r\n\t\t\tUpdateInfoValue(d, PdfName.KEYWORDS, info.Keywords, pdfFileName);\r\n\t\t\tUpdateInfoValue(d, PdfName.CREATOR, info.Creator, pdfFileName);\r\n\t\t\tUpdateInfoValue(d, PdfName.PRODUCER, info.Producer, pdfFileName);\r\n\r\n\t\t\tif (info.RewriteXmp == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar m = pdf.Catalog.Locate<PRStream>(PdfName.METADATA);\r\n\t\t\tif (m == null) {\r\n\t\t\t\tpdf.Catalog.Put(PdfName.METADATA, new PRStream(pdf, new byte[0]));\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tvar xw = new XmpWriter(new MemoryStream(), d);\r\n\t\t\t\tvar s = new MemoryStream();\r\n\t\t\t\txw.Serialize(s);\r\n\t\t\t\tm.SetData(s.ToArray(), false);\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\tTrace.WriteLine(\"读写 XMP 属性时出现错误。\");\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tinternal static void UpdateInfoValue(PdfDictionary info, PdfName name, string value, FilePath pdfFileName) {\r\n\t\t\tif (value != null) {\r\n\t\t\t\tif (value.Contains(Constants.FileNameMacros.FileName)) {\r\n\t\t\t\t\tvalue = value.Replace(Constants.FileNameMacros.FileName, pdfFileName.FileNameWithoutExtension);\r\n\t\t\t\t}\r\n\t\t\t\tif (value.Contains(Constants.FileNameMacros.FolderName)) {\r\n\t\t\t\t\tvalue = value.Replace(Constants.FileNameMacros.FolderName, pdfFileName.Directory.FileName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (info.Contains(name) && value == null) {\r\n\t\t\t\tvar s = info.GetAsString(name);\r\n\t\t\t\tif (s != null) {\r\n\t\t\t\t\tvalue = s.ToUnicodeString();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (value != null) {\r\n\t\t\t\tvalue = value.Trim();\r\n\t\t\t}\r\n\t\t\tinfo.Put(name, string.IsNullOrEmpty(value) ? null : value.ToPdfString());\r\n\t\t}\r\n\r\n\t\tinternal static void ImportDocumentInformation(GeneralInfo info, iTextSharp.text.Document doc) {\r\n\t\t\tif (info == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdoc.AddTitle(info.Title);\r\n\t\t\tif (string.IsNullOrEmpty(info.Subject) == false) {\r\n\t\t\t\tdoc.AddSubject(info.Subject);\r\n\t\t\t}\r\n\t\t\tif (string.IsNullOrEmpty(info.Author) == false) {\r\n\t\t\t\tdoc.AddAuthor(info.Author);\r\n\t\t\t}\r\n\t\t\tif (string.IsNullOrEmpty(info.Keywords) == false) {\r\n\t\t\t\tdoc.AddKeywords(info.Keywords);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal PdfPageLabels ImportPageLabels() {\r\n\t\t\tif (_options.ImportViewerPreferences == false || _infoDoc == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(\"导入页码设置。\");\r\n\t\t\tvar pn = _infoDoc.DocumentElement.SelectNodes(\r\n\t\t\t\tConstants.PageLabels + \"/\" + Constants.PageLabelsAttributes.Style + \"[@\" + Constants.PageLabelsAttributes.PageNumber + \"]\");\r\n\t\t\tvar pls = new PdfPageLabels();\r\n\t\t\tbool hasPageLabels = false;\r\n\t\t\tforeach (XmlElement item in pn) {\r\n\t\t\t\tif (item.GetAttribute(Constants.PageLabelsAttributes.PageNumber).TryParse(out int physicalPage) == false || physicalPage < 1) {\r\n\t\t\t\t\tTrace.WriteLine(string.Concat(\"在“\", Constants.PageLabels, \"”的“\", Constants.PageLabelsAttributes.Style, \"”元素中，必须指定大于或等于 1 的“\", Constants.PageLabelsAttributes.PageNumber, \"”属性。\"));\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (item.GetAttribute(Constants.PageLabelsAttributes.StartPage).TryParse(out int firstPage) == false || firstPage < 1) {\r\n\t\t\t\t\tfirstPage = 1;\r\n\t\t\t\t}\r\n\t\t\t\tvar prefix = item.GetAttribute(Constants.PageLabelsAttributes.Prefix);\r\n\t\t\t\tint numberStyle = ValueHelper.MapValue(\r\n\t\t\t\t\titem.GetAttribute(Constants.PageLabelsAttributes.Style),\r\n\t\t\t\t\tConstants.PageLabelStyles.Names,\r\n\t\t\t\t\tConstants.PageLabelStyles.Values,\r\n\t\t\t\t\tPdfPageLabels.DECIMAL_ARABIC_NUMERALS);\r\n\t\t\t\tpls.AddPageLabel(physicalPage, numberStyle, prefix, firstPage);\r\n\t\t\t\thasPageLabels = true;\r\n\t\t\t}\r\n\t\t\treturn hasPageLabels ? pls : null;\r\n\t\t}\r\n\r\n\t\tinternal static PdfPageLabels ImportPageLabels(List<PageLabel> labels) {\r\n\t\t\tif (labels == null || labels.Count == 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar pls = new PdfPageLabels();\r\n\t\t\tint i = 0;\r\n\t\t\tforeach (var item in labels) {\r\n\t\t\t\tif (item.PageNumber > 0 && item.StartPage > 0) {\r\n\t\t\t\t\tpls.AddPageLabel(item.PageNumber,\r\n\t\t\t\t\t\tValueHelper.MapValue(item.Style, Constants.PageLabelStyles.Names, Constants.PageLabelStyles.Values, PdfPageLabels.DECIMAL_ARABIC_NUMERALS),\r\n\t\t\t\t\t\titem.Prefix,\r\n\t\t\t\t\t\titem.StartPage\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn i > 0 ? pls : null;\r\n\t\t}\r\n\r\n\t\tinternal void ImportPageLinks(PdfReader r, PdfStamper w) {\r\n\t\t\tif (_infoDoc == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar ls = _infoDoc.DocumentElement.SelectNodes(Constants.PageLink + \"/\" + Constants.PageLinkAttributes.Link + \"[@\" + Constants.PageLinkAttributes.PageNumber + \"]\");\r\n\t\t\tif (ls == null || ls.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(\"导入页面内连接。\");\r\n\t\t\tif (_options.KeepPageLinks == false) {\r\n\t\t\t\tPdfHelper.ClearPageLinks(r);\r\n\t\t\t}\r\n\t\t\tint pageCount = r.NumberOfPages;\r\n\t\t\tforeach (XmlElement item in ls) {\r\n\t\t\t\tif (item.GetAttribute(Constants.PageLinkAttributes.PageNumber).TryParse(out int pageNum) == false) {\r\n\t\t\t\t\tTrace.WriteLine(\"页码属性格式不正确\");\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (item.GetAttribute(Constants.DestinationAttributes.FirstPageNumber).TryParse(out int pageOffset)) {\r\n\t\t\t\t\tpageNum += --pageOffset;\r\n\t\t\t\t}\r\n\t\t\t\tif (pageNum > pageCount) {\r\n\t\t\t\t\tTrace.WriteLine(\"页码 \" + pageNum + \" 超出文档最大页数。\");\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar acc = ImportRectangle(item);\r\n\t\t\t\tif (acc == null) {\r\n\t\t\t\t\tTrace.WriteLine(\"区域坐标不为 4 个。\");\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tacc = Array.ConvertAll(acc, a => UnitConverter.ToPoint(a, _unitFactor));\r\n\t\t\t\tvar region = new iTextSharp.text.Rectangle(acc[0], acc[1], acc[2], acc[3]);\r\n\t\t\t\tvar border = item.GetAttribute(Constants.PageLinkAttributes.Border);\r\n\t\t\t\tvar ann = new PdfAnnotation(w.Writer, region);\r\n\t\t\t\tann.Put(PdfName.TYPE, PdfName.ANNOT);\r\n\t\t\t\tann.Put(PdfName.SUBTYPE, PdfName.LINK);\r\n\t\t\t\tann.Put(PdfName.P, w.Writer.GetPageReference(pageNum));\r\n\t\t\t\tvar hl = item.GetAttribute(Constants.PageLinkAttributes.Style);\r\n\t\t\t\tif (string.IsNullOrEmpty(hl) == false) {\r\n\t\t\t\t\tPdfName h;\r\n\t\t\t\t\tswitch (hl) {\r\n\t\t\t\t\t\tcase \"无\": h = PdfName.N; break;\r\n\t\t\t\t\t\tcase \"取反内容\": h = PdfName.I; break;\r\n\t\t\t\t\t\tcase \"取反边框\": h = PdfName.O; break;\r\n\t\t\t\t\t\tcase \"按下\": h = PdfName.P; break;\r\n\t\t\t\t\t\tdefault: h = PdfName.I; break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tann.Put(PdfName.H, h);\r\n\t\t\t\t}\r\n\t\t\t\tif (item.SelectSingleNode(Constants.PageLinkAttributes.LinkAction) is XmlElement action) {\r\n\t\t\t\t\tShiftPageAndConvertUnits(action, 0);\r\n\t\t\t\t\tImportAction(w.Writer, ann, action, pageCount, false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ann != null) {\r\n\t\t\t\t\tImportColor(item, ann);\r\n\t\t\t\t\tif (string.IsNullOrEmpty(border) == false) {\r\n\t\t\t\t\t\tImportBorder(border, ann);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (item.SelectSingleNode(\"边框样式\") is XmlElement bse) {\r\n\t\t\t\t\t\t\tvar bs = ImportPdfBorderStyle(bse);\r\n\t\t\t\t\t\t\tif (bs != null) {\r\n\t\t\t\t\t\t\t\tann.Put(PdfName.BS, bs);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw.AddAnnotation(ann, pageNum);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ImportColor(XmlElement item, PdfDictionary dict) {\r\n\t\t\tPdfArray components;\r\n\t\t\tif (item.HasAttribute(Constants.Color)) {\r\n\t\t\t\tvar s = item.GetAttribute(Constants.Color);\r\n\t\t\t\tif (s == Constants.Colors.Transparent) {\r\n\t\t\t\t\tcomponents = new PdfArray();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar c = Int32.TryParse(s, out var v) ? System.Drawing.Color.FromArgb(v) : System.Drawing.Color.FromName(s);\r\n\t\t\t\t\tcomponents = new PdfArray(new float[] { c.R / 255f, c.G / 255f, c.B / 255f });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (item.HasAttribute(Constants.Colors.Red) || item.HasAttribute(Constants.Colors.Green) || item.HasAttribute(Constants.Colors.Blue)) {\r\n\t\t\t\tcomponents = new PdfArray(new float[] {\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Red, 0f),\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Green, 0f),\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Blue, 0f)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse if (item.HasAttribute(Constants.Colors.Gray)) {\r\n\t\t\t\tcomponents = new PdfArray(new float[] { item.GetValue(Constants.Colors.Gray, 0f) });\r\n\t\t\t}\r\n\t\t\telse if (item.HasAttribute(Constants.Colors.Black) || item.HasAttribute(Constants.Colors.Cyan) || item.HasAttribute(Constants.Colors.Magenta) || item.HasAttribute(Constants.Colors.Yellow)) {\r\n\t\t\t\tcomponents = new PdfArray(new float[] {\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Cyan, 0f),\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Magenta, 0f),\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Yellow, 0f),\r\n\t\t\t\t\titem.GetValue(Constants.Colors.Black, 0f)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdict.Put(PdfName.C, components);\r\n\t\t}\r\n\r\n\t\tprivate static void ImportBorder(string border, PdfAnnotation ann) {\r\n\t\t\tvar bs = ToInt32Array(border);\r\n\t\t\tPdfBorderArray a;\r\n\t\t\tif (bs == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tswitch (bs.Length) {\r\n\t\t\t\tcase 3: a = new PdfBorderArray(bs[0], bs[1], bs[2]); break;\r\n\t\t\t\tcase 4:\r\n\t\t\t\t\tvar dp = new int[bs.Length - 3];\r\n\t\t\t\t\tbs.CopyTo(dp, 3);\r\n\t\t\t\t\ta = new PdfBorderArray(bs[0], bs[1], bs[2], GetPdfDashPattern(dp));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ta = null;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (a != null) {\r\n\t\t\t\tann.Put(PdfName.BORDER, a);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ImportAction(PdfWriter writer, PdfDictionary dict, XmlElement map, int maxPageNumber, bool namedAsNames) {\r\n\t\t\tvar action = map.GetAttribute(Constants.DestinationAttributes.Action);\r\n\t\t\tif (string.IsNullOrEmpty(action)) {\r\n\t\t\t\taction = Constants.ActionType.Goto;\r\n\t\t\t}\r\n\t\t\tstring p;\r\n\t\t\tPdfDictionary fs;\r\n\t\t\tswitch (action) {\r\n\t\t\t\tcase Constants.ActionType.Goto:\r\n\t\t\t\t\tif (string.IsNullOrEmpty(p = map.GetAttribute(Constants.DestinationAttributes.Named)) == false) {\r\n\t\t\t\t\t\tif (namedAsNames)\r\n\t\t\t\t\t\t\tdict.Put(PdfName.DEST, new PdfName(p));\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tdict.Put(PdfName.DEST, p.ToPdfString());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (string.IsNullOrEmpty(p = map.GetAttribute(Constants.DestinationAttributes.Page)) == false) {\r\n\t\t\t\t\t\tvar ar = new PdfArray();\r\n\t\t\t\t\t\tif (p.TryParse(out int pn) == false || pn > maxPageNumber) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tCreateDestination(writer, map, p, ar, false);\r\n\t\t\t\t\t\tdict.Put(PdfName.DEST, ar);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.ActionType.GotoR:\r\n\t\t\t\t\tvar dic = new PdfDictionary();\r\n\t\t\t\t\tif (string.IsNullOrEmpty(p = map.GetAttribute(Constants.DestinationAttributes.Named)) == false) {\r\n\t\t\t\t\t\tdic.Put(PdfName.D, p.ToPdfString());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (string.IsNullOrEmpty(p = map.GetAttribute(Constants.DestinationAttributes.NamedN)) == false) {\r\n\t\t\t\t\t\tdic.Put(PdfName.D, new PdfName(p));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (string.IsNullOrEmpty(p = map.GetAttribute(Constants.DestinationAttributes.Page)) == false) {\r\n\t\t\t\t\t\tp.TryParse(out int pn);\r\n\t\t\t\t\t\tif (pn > 0) {\r\n\t\t\t\t\t\t\tpn--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar ar = new PdfArray();\r\n\t\t\t\t\t\tCreateDestination(writer, map, pn.ToText(), ar, true);\r\n\t\t\t\t\t\tdic.Put(PdfName.D, ar);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tp = map.GetAttribute(Constants.DestinationAttributes.Path);\r\n\t\t\t\t\tif (dic.Size > 0 && p != null) {\r\n\t\t\t\t\t\tdic.Put(PdfName.S, PdfName.GOTOR);\r\n\t\t\t\t\t\tfs = new PdfDictionary(PdfName.FILESPEC);\r\n\t\t\t\t\t\tfs.Put(PdfName.F, new PdfString(p, Encoding.Default.WebName));\r\n\t\t\t\t\t\tfs.Put(PdfName.UF, new PdfString(p, PdfObject.TEXT_UNICODE));\r\n\t\t\t\t\t\tdic.Put(PdfName.F, fs);\r\n\t\t\t\t\t\tvar nw = map.GetAttribute(Constants.DestinationAttributes.NewWindow);\r\n\t\t\t\t\t\tif (nw != null) {\r\n\t\t\t\t\t\t\tdic.Put(PdfName.NEWWINDOW, nw == Constants.Boolean.True);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdict.Put(PdfName.A, dic);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.ActionType.Uri:\r\n\t\t\t\t\tp = map.GetAttribute(Constants.DestinationAttributes.Path);\r\n\t\t\t\t\tif (string.IsNullOrEmpty(p) == false) {\r\n\t\t\t\t\t\tvar u = new PdfDictionary();\r\n\t\t\t\t\t\tu.Put(PdfName.S, PdfName.URI);\r\n\t\t\t\t\t\tu.Put(PdfName.URI, p);\r\n\t\t\t\t\t\tdict.Put(PdfName.A, u);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.ActionType.Launch:\r\n\t\t\t\t\tp = map.GetAttribute(Constants.DestinationAttributes.Path);\r\n\t\t\t\t\tif (string.IsNullOrEmpty(p) == false) {\r\n\t\t\t\t\t\tvar l = new PdfDictionary();\r\n\t\t\t\t\t\tl.Put(PdfName.S, PdfName.LAUNCH);\r\n\t\t\t\t\t\tfs = new PdfDictionary(PdfName.FILESPEC);\r\n\t\t\t\t\t\tfs.Put(PdfName.F, new PdfString(p, Encoding.Default.WebName));\r\n\t\t\t\t\t\tfs.Put(PdfName.UF, new PdfString(p, PdfObject.TEXT_UNICODE));\r\n\t\t\t\t\t\tl.Put(PdfName.F, fs);\r\n\t\t\t\t\t\tdict.Put(PdfName.A, l);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.ActionType.Javascript:\r\n\t\t\t\t\tp = map.GetAttribute(Constants.DestinationAttributes.ScriptContent);\r\n\t\t\t\t\tdict.Put(PdfName.A, string.IsNullOrEmpty(p) ? null : PdfAction.JavaScript(p, writer));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, string.Concat(\"不支持动作：\", action));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static void CreateDestination(PdfWriter writer, XmlElement map, string p, PdfArray ar, bool isRemote) {\r\n\t\t\tint pn;\r\n\t\t\tbool useDefaultPos = false;\r\n\t\t\tvar pos = new float[4];\r\n\t\t\tint posItemCount = 0;\r\n\t\t\tif (p.TryParse(out pn) == false || pn < (isRemote ? 0 : 1)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tPdfIndirectReference pr = null;\r\n\t\t\tif (isRemote == false) {\r\n\t\t\t\tpr = writer.GetPageReference(pn);\r\n\t\t\t\tar.Add(pr);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tar.Add(new PdfNumber(pn));\r\n\t\t\t}\r\n\t\t\tiTextSharp.text.Rectangle box;\r\n\t\t\tswitch (p = map.GetAttribute(Constants.DestinationAttributes.View)) {\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.XYZ:\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.Fit:\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitB:\r\n\t\t\t\t\tposItemCount = 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitH:\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitBH:\r\n\t\t\t\t\tposItemCount = 1;\r\n\t\t\t\t\tvar top = map.GetAttribute(Constants.Coordinates.Top);\r\n\t\t\t\t\tif (top == Constants.Coordinates.Unchanged) {\r\n\t\t\t\t\t\tpos[0] = float.NaN;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (top.TryParse(out pos[0]) == false) {\r\n\t\t\t\t\t\tif (pr != null && (box = (PdfReader.GetPdfObject(pr) as PdfDictionary).GetPageVisibleRectangle()) != null) {\r\n\t\t\t\t\t\t\tpos[0] = box.Top;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tuseDefaultPos = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitV:\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitBV:\r\n\t\t\t\t\tposItemCount = 1;\r\n\t\t\t\t\tvar left = map.GetAttribute(Constants.Coordinates.Left);\r\n\t\t\t\t\tif (left == Constants.Coordinates.Unchanged) {\r\n\t\t\t\t\t\tpos[0] = float.NaN;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (left.TryParse(out pos[0]) == false) {\r\n\t\t\t\t\t\tif (pr != null && (box = (PdfReader.GetPdfObject(pr) as PdfDictionary).GetPageVisibleRectangle()) != null) {\r\n\t\t\t\t\t\t\tpos[0] = box.Left;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tuseDefaultPos = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitR:\r\n\t\t\t\t\tpos = ImportRectangle(map);\r\n\t\t\t\t\tif (pos == null) {\r\n\t\t\t\t\t\tuseDefaultPos = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tposItemCount = 3;\r\n\t\t\t\t\tleft = map.GetAttribute(Constants.Coordinates.Left);\r\n\t\t\t\t\ttop = map.GetAttribute(Constants.Coordinates.Top);\r\n\t\t\t\t\tif (left.TryParse(out pos[0]) == false) {\r\n\t\t\t\t\t\tpos[0] = float.NaN;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (top.TryParse(out pos[1]) == false) {\r\n\t\t\t\t\t\tpos[1] = float.NaN;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (map.GetAttribute(Constants.Coordinates.ScaleFactor).TryParse(out pos[2]) == false || pos[2] < 0) {\r\n\t\t\t\t\t\tpos[2] = float.NaN;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (float.IsNaN(pos[0]) && float.IsNaN(pos[1])\r\n\t\t\t\t\t\t&& left != Constants.Coordinates.Unchanged && top != Constants.Coordinates.Unchanged) {\r\n\t\t\t\t\t\tuseDefaultPos = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (useDefaultPos) {\r\n\t\t\t\tar.Add(PdfName.XYZ);\r\n\t\t\t\tif (isRemote) {\r\n\t\t\t\t\tar.Add(new float[] { 0, 10000, 0 });\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (PdfReader.GetPdfObject(pr) is PdfDictionary page) {\r\n\t\t\t\t\tbox = page.GetPageVisibleRectangle();\r\n\t\t\t\t\tif (box != null) {\r\n\t\t\t\t\t\tif (true) {\r\n\t\t\t\t\t\t\t// TODO: 检测页面旋转方向并设置正确的目标\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tar.Add(PdfNull.PDFNULL);\r\n\t\t\t\t\t\tar.Add(new PdfNumber(box.Top));\r\n\t\t\t\t\t\tar.Add(PdfNull.PDFNULL);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tar.Add(new float[] { 0, 10000, 0 });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tar.Add(ValueHelper.MapValue(p,\r\n\t\t\t\t\tConstants.DestinationAttributes.ViewType.Names,\r\n\t\t\t\t\tConstants.DestinationAttributes.ViewType.PdfNames,\r\n\t\t\t\t\tPdfName.XYZ));\r\n\t\t\t\tfor (int i = 0; i < posItemCount; i++) {\r\n\t\t\t\t\tref var v = ref pos[i];\r\n\t\t\t\t\tif (float.IsNaN(v)) {\r\n\t\t\t\t\t\tar.Add(PdfNull.PDFNULL);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (v > 10000) {\r\n\t\t\t\t\t\t\tv = 10000;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tar.Add(new PdfNumber(v));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static float[] ImportRectangle(XmlElement map) {\r\n\t\t\tvar pos = new float[4];\r\n\t\t\tif (map.GetAttribute(Constants.Coordinates.Left).TryParse(out pos[0]) == false || pos[0] < 0\r\n\t\t\t\t|| map.GetAttribute(Constants.Coordinates.Bottom).TryParse(out pos[1]) == false || pos[1] < 0\r\n\t\t\t\t|| map.GetAttribute(Constants.Coordinates.Right).TryParse(out pos[2]) == false || pos[2] < 0\r\n\t\t\t\t|| map.GetAttribute(Constants.Coordinates.Top).TryParse(out pos[3]) == false || pos[3] < 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn pos;\r\n\t\t}\r\n\r\n\r\n\t\tprivate static PdfDictionary ImportPdfBorderStyle(XmlElement item) {\r\n\t\t\tvar borderWidth = item.GetAttribute(\"宽度\");\r\n\t\t\tvar borderStyle = item.GetAttribute(\"样式\");\r\n\t\t\tvar borderPattern = item.GetAttribute(\"线形\");\r\n\t\t\tvar bs = new PdfDictionary(PdfName.BS);\r\n\t\t\tif (borderWidth.TryParse(out float bw)) {\r\n\t\t\t\tbs.Put(PdfName.W, new PdfNumber(bw));\r\n\t\t\t}\r\n\r\n\t\t\tif (string.IsNullOrEmpty(borderStyle)) {\r\n\t\t\t\treturn bs;\r\n\t\t\t}\r\n\r\n\t\t\tPdfName s;\r\n\t\t\tswitch (borderStyle) {\r\n\t\t\t\tcase \"方框\": s = PdfName.S; break;\r\n\t\t\t\tcase \"下划线\": s = PdfName.U; break;\r\n\t\t\t\tcase \"凸起\": s = PdfName.B; break;\r\n\t\t\t\tcase \"凹陷\": s = PdfName.I; break;\r\n\t\t\t\tcase \"虚线\":\r\n\t\t\t\t\ts = PdfName.D;\r\n\t\t\t\t\tif (string.IsNullOrEmpty(borderPattern) == false) {\r\n\t\t\t\t\t\tvar p = ToInt32Array(borderPattern);\r\n\t\t\t\t\t\tif (p != null) {\r\n\t\t\t\t\t\t\tvar dp = GetPdfDashPattern(p);\r\n\t\t\t\t\t\t\tif (dp != null) {\r\n\t\t\t\t\t\t\t\tbs.Put(PdfName.D, dp);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ts = new PdfName(borderStyle);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbs.Put(PdfName.S, s);\r\n\t\t\treturn bs;\r\n\t\t}\r\n\r\n\t\tprivate static PdfDashPattern GetPdfDashPattern(int[] p) {\r\n\t\t\tswitch (p.Length) {\r\n\t\t\t\tcase 1: return new PdfDashPattern(p[0]);\r\n\t\t\t\tcase 2: return new PdfDashPattern(p[0], p[1]);\r\n\t\t\t\tcase 3: return new PdfDashPattern(p[0], p[1], p[2]);\r\n\t\t\t\tdefault: return null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ImportViewerPreferences(PdfReader r) {\r\n\t\t\tif (_options.ImportViewerPreferences == false || _infoDoc == null)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tTracker.TraceMessage(\"导入阅读器设置。\");\r\n\t\t\tif (_infoDoc.DocumentElement.SelectSingleNode(Constants.ViewerPreferences) is not XmlElement ps) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tPdfName n;\r\n\t\t\tPdfObject v;\r\n\r\n\t\t\tforeach (XmlAttribute item in ps.Attributes) {\r\n\t\t\t\tswitch (item.Name) {\r\n\t\t\t\t\tcase Constants.PageLayout:\r\n\t\t\t\t\t\tv = ValueHelper.MapValue(item.Value, Constants.PageLayoutType.Names, Constants.PageLayoutType.PdfNames, PdfName.NONE);\r\n\t\t\t\t\t\tif (PdfName.NONE.Equals(v) == false) {\r\n\t\t\t\t\t\t\tr.Catalog.Put(PdfName.PAGELAYOUT, v);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tcase Constants.PageMode:\r\n\t\t\t\t\t\tv = ValueHelper.MapValue(item.Value, Constants.PageModes.Names, Constants.PageModes.PdfNames, PdfName.NONE);\r\n\t\t\t\t\t\tif (PdfName.NONE.Equals(v) == false) {\r\n\t\t\t\t\t\t\tr.Catalog.Put(PdfName.PAGEMODE, v);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tcase Constants.ViewerPreferencesType.Direction:\r\n\t\t\t\t\t\tn = PdfName.DIRECTION;\r\n\t\t\t\t\t\tv = ValueHelper.MapValue(item.Value, Constants.ViewerPreferencesType.DirectionType.Names, Constants.ViewerPreferencesType.DirectionType.PdfNames, PdfName.NONE);\r\n\t\t\t\t\t\tif (PdfName.NONE.Equals(v) == true) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tn = ValueHelper.MapValue(item.Name, Constants.ViewerPreferencesType.Names, Constants.ViewerPreferencesType.PdfNames, new PdfName(item.Name));\r\n\t\t\t\t\t\tv = item.Value switch {\r\n\t\t\t\t\t\t\tConstants.Boolean.True => PdfBoolean.PDFTRUE,\r\n\t\t\t\t\t\t\tConstants.Boolean.False => PdfBoolean.PDFFALSE,\r\n\t\t\t\t\t\t\t_ => PdfHelper.ResolvePdfName(item.Value)\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (r.Catalog.Contains(PdfName.VIEWERPREFERENCES) == false) {\r\n\t\t\t\t\tr.Catalog.Put(PdfName.VIEWERPREFERENCES, new PdfDictionary());\r\n\t\t\t\t}\r\n\t\t\t\tr.Catalog.GetAsDict(PdfName.VIEWERPREFERENCES).Put(n, v);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void OverrideViewerPreferences(ViewerOptions options, PdfReader reader, PdfWriter writer) {\r\n\t\t\tvar v = ValueHelper.MapValue(options.InitialView, Constants.PageLayoutType.Names, Constants.PageLayoutType.PdfNames, PdfName.NONE);\r\n\t\t\tif (PdfName.NONE.Equals(v) == false) {\r\n\t\t\t\t(reader != null ? reader.Catalog : writer.ExtraCatalog).Put(PdfName.PAGELAYOUT, v);\r\n\t\t\t}\r\n\r\n\t\t\tv = ValueHelper.MapValue(options.Direction, Constants.ViewerPreferencesType.DirectionType.Names, Constants.ViewerPreferencesType.DirectionType.PdfNames, PdfName.NONE);\r\n\t\t\tif (PdfName.NONE.Equals(v) == false) {\r\n\t\t\t\tif (reader != null) {\r\n\t\t\t\t\tvar d = reader.Catalog.GetAsDict(PdfName.VIEWERPREFERENCES);\r\n\t\t\t\t\tif (d == null) {\r\n\t\t\t\t\t\td = new PdfDictionary();\r\n\t\t\t\t\t\treader.Catalog.Put(PdfName.VIEWERPREFERENCES, d);\r\n\t\t\t\t\t}\r\n\t\t\t\t\td.Put(PdfName.DIRECTION, v);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\twriter.AddViewerPreference(PdfName.DIRECTION, v);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tv = ValueHelper.MapValue(options.InitialMode, Constants.PageModes.Names, Constants.PageModes.PdfNames, PdfName.NONE);\r\n\t\t\tif (PdfName.NONE.Equals(v) == false) {\r\n\t\t\t\t(reader != null ? reader.Catalog : writer.ExtraCatalog).Put(PdfName.PAGEMODE, v);\r\n\t\t\t}\r\n\r\n\t\t\tif (options.SpecifyViewerPreferences) {\r\n\t\t\t\tvar d = reader != null ? reader.Catalog : writer.ExtraCatalog;\r\n\t\t\t\tvar p = d.GetAsDict(PdfName.VIEWERPREFERENCES);\r\n\t\t\t\tif (p == null) {\r\n\t\t\t\t\tp = new PdfDictionary();\r\n\t\t\t\t\td.Put(PdfName.VIEWERPREFERENCES, p);\r\n\t\t\t\t}\r\n\t\t\t\tp.Put(PdfName.CENTERWINDOW, options.CenterWindow ? PdfBoolean.PDFTRUE : null);\r\n\t\t\t\tp.Put(PdfName.DISPLAYDOCTITLE, options.DisplayDocTitle ? PdfBoolean.PDFTRUE : null);\r\n\t\t\t\tp.Put(PdfName.FITWINDOW, options.FitWindow ? PdfBoolean.PDFTRUE : null);\r\n\t\t\t\tp.Put(PdfName.HIDEMENUBAR, options.HideMenu ? PdfBoolean.PDFTRUE : null);\r\n\t\t\t\tp.Put(PdfName.HIDETOOLBAR, options.HideToolbar ? PdfBoolean.PDFTRUE : null);\r\n\t\t\t\tp.Put(PdfName.HIDEWINDOWUI, options.HideUI ? PdfBoolean.PDFTRUE : null);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ImportNamedDestinations(PdfReader pdf, PdfWriter w) {\r\n\t\t\tif (_infoDoc == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar ds = _infoDoc.DocumentElement.SelectNodes(\"命名位置/位置[@名称]\");\r\n\t\t\tif (ds.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar infoDs = new Dictionary<string, XmlElement>(ds.Count);\r\n\t\t\tforeach (XmlElement item in ds) {\r\n\t\t\t\tinfoDs[item.GetAttribute(Constants.DestinationAttributes.Name)] = item;\r\n\t\t\t}\r\n\t\t\tvar pdfDs = pdf.GetNamedDestination();\r\n\t\t\tforeach (KeyValuePair<string, XmlElement> item in infoDs) {\r\n\t\t\t\tif (item.Value.GetAttribute(Constants.DestinationAttributes.Page).TryParse(out int targetPn) == false) {\r\n\t\t\t\t\tTrace.WriteLine(\"“目标页面”属性的数值格式不正确。\");\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar prop = new PdfArray();\r\n\t\t\t\tCreateDestination(w, item.Value, targetPn.ToText(), prop, false);\r\n\t\t\t\t//PdfName d = PdfHelper.ResolvePdfName (item.Value.GetAttribute (Constants.DestinationDisplayMode));\r\n\t\t\t\t//prop.ArrayList.Clear ();\r\n\t\t\t\t//prop.Add (w.GetPageReference (targetPn));\r\n\t\t\t\t//prop.Add (d);\r\n\t\t\t\t//string disp = item.Value.GetAttribute (Constants.DestinationAttributes.Position);\r\n\t\t\t\t//if (String.IsNullOrEmpty (disp)) {\r\n\t\t\t\t//    prop.Add (new float[] { 0, 10000, 0 });\r\n\t\t\t\t//}\r\n\t\t\t\t//else {\r\n\t\t\t\t//    float[] ps = PdfHelper.ToSingleArray (disp.ToLower ().Replace (\"null\", \"0\"), true);\r\n\t\t\t\t//    ps = UnitConverter.ConvertUnit (ps, this._unitFactor);\r\n\t\t\t\t//    prop.Add (ps);\r\n\t\t\t\t//}\r\n\t\t\t\tif (pdfDs.TryGetValue(item.Key, out var a) && a is PdfArray sourceD) {\r\n\t\t\t\t\tsourceD.ArrayList.Clear();\r\n\t\t\t\t\tsourceD.ArrayList.AddRange(prop.ArrayList);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// ignore those names not in the original document\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ImportPageSettings(PdfReader pdf) {\r\n\t\t\tif (_options.ImportPageSettings == false || _infoDoc == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar ps = _infoDoc.DocumentElement.SelectNodes($\"{Constants.Content.PageSettings.ThisName}/{Constants.Content.Page}\");\r\n\t\t\tif (ps.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tTracker.TraceMessage(\"导入页面设置。\");\r\n\t\t\tPdfDictionary p;\r\n\t\t\tint pn = pdf.NumberOfPages;\r\n\t\t\tfloat[] mb, cb, tb, ab, bb;\r\n\t\t\tint pageFilter;\r\n\t\t\tforeach (XmlElement item in ps) {\r\n\t\t\t\tList<PageRange> ranges = PageRangeCollection.Parse(item.GetAttribute(Constants.PageRange), 1, pn, true);\r\n\t\t\t\tmb = ToSingleArray(item.GetAttribute(Constants.Content.PageSettings.MediaBox), true);\r\n\t\t\t\tcb = ToSingleArray(item.GetAttribute(Constants.Content.PageSettings.CropBox), true);\r\n\t\t\t\ttb = ToSingleArray(item.GetAttribute(Constants.Content.PageSettings.TrimBox), true);\r\n\t\t\t\tab = ToSingleArray(item.GetAttribute(Constants.Content.PageSettings.ArtBox), true);\r\n\t\t\t\tbb = ToSingleArray(item.GetAttribute(Constants.Content.PageSettings.BleedBox), true);\r\n\t\t\t\tpageFilter = ValueHelper.MapValue(item.GetAttribute(Constants.PageFilterTypes.ThisName),\r\n\t\t\t\t\tConstants.PageFilterTypes.Names,\r\n\t\t\t\t\tConstants.PageFilterTypes.Values, -1);\r\n\t\t\t\tif (item.GetAttribute(Constants.Content.PageSettings.Rotation).TryParse(out int rotate)) {\r\n\t\t\t\t\trotate = rotate / 90 * 90;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\trotate = -1;\r\n\t\t\t\t}\r\n\t\t\t\tforeach (PageRange r in ranges) {\r\n\t\t\t\t\tforeach (var i in r) {\r\n\t\t\t\t\t\tif (pageFilter != -1 && i % 2 != pageFilter) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tp = pdf.GetPageN(i);\r\n\t\t\t\t\t\tImportPageBox(mb, p, PdfName.MEDIABOX);\r\n\t\t\t\t\t\tImportPageBox(cb, p, PdfName.CROPBOX);\r\n\t\t\t\t\t\tImportPageBox(tb, p, PdfName.TRIMBOX);\r\n\t\t\t\t\t\tImportPageBox(ab, p, PdfName.ARTBOX);\r\n\t\t\t\t\t\tImportPageBox(bb, p, PdfName.BLEEDBOX);\r\n\t\t\t\t\t\tif (rotate != -1) {\r\n\t\t\t\t\t\t\tp.Put(PdfName.ROTATE, new PdfNumber(rotate));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate bool ImportPageBox(float[] array, PdfDictionary pdfDict, PdfName pdfName) {\r\n\t\t\tif (array == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (array.Length == 0) {\r\n\t\t\t\tpdfDict.Remove(pdfName);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (array.Length == 4) {\r\n\t\t\t\tarray = Array.ConvertAll(array, a => { return UnitConverter.ToPoint(a, _unitFactor); });\r\n\t\t\t\tpdfDict.Put(pdfName, new PdfArray(array));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tstatic readonly char[] __ValueArraySplitChars = { ' ', '\\t', ',', ';' };\r\n\t\tpublic static float[] ToSingleArray(string value) { return ToSingleArray(value, false); }\r\n\r\n\t\tpublic static float[] ToSingleArray(string value, bool allowNegativeNumber) {\r\n\t\t\tif (value == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\telse if (value.Length == 0) {\r\n\t\t\t\treturn new float[0];\r\n\t\t\t}\r\n\t\t\tvar parts = value.Split(__ValueArraySplitChars, StringSplitOptions.RemoveEmptyEntries);\r\n\t\t\tvar vals = new float[parts.Length];\r\n\t\t\tvar ok = true;\r\n\t\t\tfor (int i = 0; i < vals.Length; i++) {\r\n\t\t\t\tif (parts[i].TryParse(out vals[i]) == false || (allowNegativeNumber == false && vals[i] < 0)) {\r\n\t\t\t\t\tok = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (ok == false) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn vals;\r\n\t\t}\r\n\t\tpublic static int[] ToInt32Array(string value) {\r\n\t\t\treturn ToInt32Array(value, __ValueArraySplitChars, false);\r\n\t\t}\r\n\r\n\t\tpublic static int[] ToInt32Array(string value, bool allowNegativeNumber) {\r\n\t\t\treturn ToInt32Array(value, __ValueArraySplitChars, allowNegativeNumber);\r\n\t\t}\r\n\r\n\t\tpublic static int[] ToInt32Array(string value, char[] separators, bool allowNegativeNumber) {\r\n\t\t\tif (value == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar parts = value.Split(separators, StringSplitOptions.RemoveEmptyEntries);\r\n\t\t\tvar vals = new int[parts.Length];\r\n\t\t\tfor (int i = 0; i < vals.Length; i++) {\r\n\t\t\t\tif (!parts[i].TryParse(out vals[i]) || (!allowNegativeNumber && vals[i] < 0)) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn vals;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/DocProcessorContext.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class DocProcessorContext(PdfProcessingEngine engine, PdfWriter writer, Document outputDocument)\r\n\t{\r\n\t\tinternal const int OcrData = 9010;\r\n\t\tinternal const int CoordinateTransition = 9020;\r\n\r\n\t\tpublic PdfReader Pdf { get; } = engine.Pdf;\r\n\t\tpublic PdfWriter Writer { get; } = writer;\r\n\t\tpublic Document OutputDocument { get; } = outputDocument;\r\n\t\tpublic bool IsModified { get; set; }\r\n\t\tpublic Dictionary<int, object> ExtraData { get; } = engine.ExtraData;\r\n\r\n\t\tpublic DocProcessorContext(PdfProcessingEngine engine, PdfWriter writer)\r\n\t\t\t: this(engine, writer, null) {\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/DocumentSink.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t/// <summary>\r\n\t/// 用于合并 PDF 文档的文档池。\r\n\t/// </summary>\r\n\tsealed class DocumentSink\r\n\t{\r\n\t\treadonly Dictionary<string, PdfReaderReference> _sink = new Dictionary<string, PdfReaderReference>(StringComparer.OrdinalIgnoreCase);\r\n\t\tpublic int Workload { get; private set; }\r\n\t\tpublic bool HasDuplicateFiles { get; private set; }\r\n\t\tpublic DocumentSink(IEnumerable<SourceItem> items, bool useSink) {\r\n\t\t\tEvaluateWorkload(items, useSink);\r\n\t\t}\r\n\r\n\t\tpublic PdfReader GetPdfReader(string path) {\r\n\t\t\tif (_sink.TryGetValue(path, out PdfReaderReference rr)) {\r\n\t\t\t\trr.Reader ??= PdfHelper.OpenPdfFile(path, AppContext.LoadPartialPdfFile, false);\r\n\t\t\t\treturn rr.Reader;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tpublic int DecrementReference(string path) {\r\n\t\t\tif (_sink.TryGetValue(path, out PdfReaderReference r)) {\r\n\t\t\t\tvar c = --r.Reference;\r\n\t\t\t\tif (c == 0) {\r\n\t\t\t\t\t_sink.Remove(path);\r\n\t\t\t\t}\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tprivate void EvaluateWorkload(IEnumerable<SourceItem> items, bool useSink) {\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\tswitch (item.Type) {\r\n\t\t\t\t\tcase SourceItem.ItemType.Empty:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase SourceItem.ItemType.Pdf:\r\n\t\t\t\t\t\tvar p = item as SourceItem.Pdf;\r\n\t\t\t\t\t\tWorkload += PageRangeCollection.Parse(p.PageRanges, 1, p.PageCount, true).TotalPages;\r\n\t\t\t\t\t\tif (useSink) {\r\n\t\t\t\t\t\t\tif (_sink.TryGetValue(item.FilePath.ToString(), out PdfReaderReference r)) {\r\n\t\t\t\t\t\t\t\tr.Reference++;\r\n\t\t\t\t\t\t\t\tHasDuplicateFiles = true;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t_sink.Add(item.FilePath.ToString(), new PdfReaderReference());\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tWorkload += item.FileSize;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase SourceItem.ItemType.Image:\r\n\t\t\t\t\t\tWorkload += item.FileSize;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase SourceItem.ItemType.Folder:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (item.HasSubItems) {\r\n\t\t\t\t\tEvaluateWorkload(item.Items, useSink);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class PdfReaderReference\r\n\t\t{\r\n\t\t\tinternal PdfReader Reader;\r\n\t\t\tinternal int Reference = 1;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/IInfoDocProcessor.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinterface IInfoDocProcessor\r\n\t{\r\n\t\tbool Process(System.Xml.XmlElement item);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/IProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinterface IProcessor\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 返回处理器的名称。\r\n\t\t/// </summary>\r\n\t\tstring Name { get; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ImageExtractor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing FreeImageAPI;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor.Imaging;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ImageExtractor\r\n\t{\r\n\t\treadonly PdfPageImageProcessor _parser;\r\n\t\tint _totalImageCount;\r\n\t\tint _imageCount;\r\n\t\tint _activePage; // 在导出文件图片时，使用此属性命名文件\r\n\t\treadonly string _fileMask;\r\n\t\tint _pageRotation;\r\n\t\treadonly ImageExtracterOptions _options;\r\n\t\treadonly List<ImageInfo> _imageInfoList = new List<ImageInfo>();\r\n\t\treadonly List<ImageDisposition> _imagePosList = new List<ImageDisposition>();\r\n\t\treadonly HashSet<PdfObject> _exportedImages = new HashSet<PdfObject>();\r\n\t\treadonly Stack<PdfObject> _visited = new Stack<PdfObject>();\r\n\r\n\t\tinternal List<ImageInfo> InfoList => _imageInfoList;\r\n\t\tinternal List<ImageDisposition> PosList => _imagePosList;\r\n\t\tinternal bool PrintImageLocation { get; set; }\r\n\r\n\t\tpublic ImageExtractor(ImageExtracterOptions options) {\r\n\t\t\t_fileMask = String.IsNullOrEmpty(options.FileMask) ? \"0\" : options.FileMask;\r\n\t\t\t_options = options;\r\n\t\t\t_parser = new PdfPageImageProcessor(_imagePosList, _imageInfoList);\r\n\t\t}\r\n\r\n\t\tinternal void ExtractPageImages(PdfReader reader, int pageNum) {\r\n\t\t\tif (pageNum < 1 || pageNum > reader.NumberOfPages) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_activePage = pageNum;\r\n\t\t\t_parser.Reset();\r\n\t\t\t_imageCount = 0;\r\n\t\t\t_imageInfoList.Clear();\r\n\t\t\t_imagePosList.Clear();\r\n\t\t\t_visited.Clear();\r\n\t\t\tvar o = reader.GetPageNRelease(pageNum);\r\n\t\t\tif (o == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// 收集页面字典引用的图片\r\n\t\t\tvar pp = o.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\tif (pp != null) {\r\n\t\t\t\tExtractImageInstances(pp, false);\r\n\t\t\t\t// 收集页面指令引用的图片\r\n\t\t\t\t_parser.ProcessContent(reader.GetPageContent(pageNum), o.Locate<PdfDictionary>(PdfName.RESOURCES));\r\n\t\t\t\t_imagePosList.Sort();\r\n\r\n\t\t\t\t// 删除页面字典中没有在渲染指令中出现的图片\r\n\t\t\t\tif (_options.ExtractOutOfPageImages == false) {\r\n\t\t\t\t\t_imageInfoList.RemoveAll(IsOutOfPage);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpp = o.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.PATTERN);\r\n\t\t\tif (pp != null) {\r\n\t\t\t\tExtractImageInstances(pp, true);\r\n\t\t\t}\r\n\t\t\t// 收集批注中的图片\r\n\t\t\tif (_options.ExtractAnnotationImages) {\r\n\t\t\t\tvar an = o.Locate<PdfArray>(PdfName.ANNOTS);\r\n\t\t\t\tif (an != null) {\r\n\t\t\t\t\tforeach (var item in an.ArrayList) {\r\n\t\t\t\t\t\tExtractImageInstances(PdfReader.GetPdfObjectRelease(item) as PdfDictionary, true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_imageInfoList.Count == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_pageRotation = PdfHelper.GetPageRotation(o);\r\n\r\n\t\t\t_imageInfoList.Sort((x, y) => {\r\n\t\t\t\tvar xi = _imagePosList.Find((info) => info.Image == x);\r\n\t\t\t\tvar yi = _imagePosList.Find((info) => info.Image == y);\r\n\t\t\t\tif (xi == null) {\r\n\t\t\t\t\treturn yi == null ? 0 : -1;\r\n\t\t\t\t}\r\n\t\t\t\telse if (yi == null) {\r\n\t\t\t\t\treturn -1;\r\n\t\t\t\t}\r\n\t\t\t\treturn xi.CompareTo(yi);\r\n\t\t\t});\r\n\t\t\tforeach (var item in _imageInfoList) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tExtractImage(item);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (FreeImageException ex) {\r\n\t\t\t\t\tif (item.ReferenceCount > 0) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"在导出第 \" + pageNum + \" 页图片时遇到错误：\" + ex.Message);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_options.MergeImages && _imagePosList.Count > 1) {\r\n\t\t\t\t// 合并相同宽度、相同类型的图片\r\n\t\t\t\tMergeImages();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbool IsOutOfPage(ImageInfo image) {\r\n\t\t\tif (image.IsPageImage == false) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar r = image.InlineImage.PdfRef;\r\n\t\t\tforeach (var item in _imagePosList) {\r\n\t\t\t\tvar ir = item.Image.InlineImage?.PdfRef;\r\n\t\t\t\tif (ir == null || (ir.Number == r.Number && ir.Generation == r.Generation)) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tvoid ExtractImageInstances(PdfDictionary source, bool recursive) {\r\n\t\t\tif (source == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in source) {\r\n\t\t\t\tif (PdfName.SMASK.Equals(item.Key)\r\n\t\t\t\t\t|| PdfName.MASK.Equals(item.Key)\r\n\t\t\t\t\t|| _options.AllowRedundantImages == false && _exportedImages.Contains(item.Value)\r\n\t\t\t\t\t|| PdfReader.GetPdfObject(item.Value) is not PdfDictionary obj\r\n\t\t\t\t\t|| _visited.Contains(item.Value)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t_visited.Push(item.Value);\r\n\t\t\t\tif (obj is not PRStream stream) {\r\n\t\t\t\t\tgoto NEXT;\r\n\t\t\t\t}\r\n\t\t\t\tPdfName subType = stream.GetAsName(PdfName.SUBTYPE);\r\n\t\t\t\tif (PdfName.IMAGE.Equals(subType)) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\t_imageInfoList.Add(new ImageInfo(item.Value as PRIndirectReference, !recursive));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (NullReferenceException) {\r\n\t\t\t\t\t\tDebug.WriteLine(item.Value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (PdfName.FORM.Equals(subType)) {\r\n\t\t\t\t\tvar fr = stream.Locate<PdfDictionary>(PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t\t\t\tif (fr == null) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var fri in fr) {\r\n\t\t\t\t\t\tif (_exportedImages.Contains(fri.Value)) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tstream = PdfReader.GetPdfObject(fri.Value) as PRStream;\r\n\t\t\t\t\t\tif (stream != null) {\r\n\t\t\t\t\t\t\tsubType = stream.GetAsName(PdfName.SUBTYPE);\r\n\t\t\t\t\t\t\tif (PdfName.IMAGE.Equals(subType)) {\r\n\t\t\t\t\t\t\t\t_imageInfoList.Add(new ImageInfo(fri.Value as PRIndirectReference, false));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (recursive || PdfName.FORM.Equals(subType)) {\r\n\t\t\t\t\t\t\t\tExtractImageInstances(stream, true);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (recursive) {\r\n\t\t\t\t\t\t\tExtractImageInstances(stream, true);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\tNEXT:\r\n\t\t\t\tif (recursive) {\r\n\t\t\t\t\tExtractImageInstances(obj, true);\r\n\t\t\t\t}\r\n\t\t\t\t_visited.Pop();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ExtractImage(ImageInfo info) {\r\n\t\t\tif (_options.AllowRedundantImages == false\r\n\t\t\t\t&& _exportedImages.Add(info.InlineImage.PdfRef) == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (_totalImageCount == 0 && Directory.Exists(_options.OutputPath) == false) {\r\n\t\t\t\tDirectory.CreateDirectory(_options.OutputPath);\r\n\t\t\t}\r\n\t\t\tvar bytes = info.DecodeImage(_options);\r\n\t\t\tif (bytes == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (info.LastDecodeError != null) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, info.LastDecodeError);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar fileName = GetNewImageFileName();\r\n\t\t\tif (info.ExtName == Constants.FileExtensions.Png\r\n\t\t\t\t|| info.ExtName == Constants.FileExtensions.Tif\r\n\t\t\t\t) {\r\n\t\t\t\tSaveBitmap(info, bytes, fileName);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tSaveImageBytes(info, bytes, fileName);\r\n\t\t\t}\r\n\t\t\tif (info.Mask != null) {\r\n\t\t\t\tusing (var m = info.Mask) {\r\n\t\t\t\t\tm.Palette.CreateGrayscalePalette();\r\n\t\t\t\t\tm.Save($\"{fileName}[mask]{(info.Mask.PixelFormat == PixelFormat.Format1bppIndexed ? Constants.FileExtensions.Tif : Constants.FileExtensions.Png)}\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_totalImageCount++;\r\n\t\t}\r\n\r\n\t\tvoid SaveImageBytes(ImageInfo info, byte[] bytes, string fileName) {\r\n\t\t\tvar vFlip = _options.VerticalFlipImages ^ info.VerticalFlip;\r\n\t\t\tvar n = fileName + info.ExtName;\r\n\t\t\tif (PrintImageLocation) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, n);\r\n\t\t\t\tTracker.TraceMessage(\"导出图片：\" + n);\r\n\t\t\t}\r\n\t\t\tif (info.ExtName == Constants.FileExtensions.Jp2) {\r\n\t\t\t\tif (vFlip || _pageRotation != 0) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tusing (var ms = new MemoryStream(bytes))\r\n\t\t\t\t\t\tusing (var bmp = new FreeImageBitmap(ms)) {\r\n\t\t\t\t\t\t\tRotateBitmap(bmp, _pageRotation, vFlip);\r\n\t\t\t\t\t\t\tinfo.CreatePaletteAndIccProfile(bmp);\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tbmp.Save(n);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcatch (FreeImageException) {\r\n\t\t\t\t\t\t\t\tFile.Delete(n);\r\n\t\t\t\t\t\t\t\tbmp.Save(new FilePath(n).ChangeExtension(Constants.FileExtensions.Png));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tSaveMaskedImage(info, bmp, fileName);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (FreeImageException ex) {\r\n\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t\tbytes.DumpBytes(n);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tusing (FileStream f = new FileStream(n, FileMode.Create)) {\r\n\t\t\t\t\t\tf.Write(bytes, 0, bytes.Length);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (PdfName.DEVICECMYK.Equals(info.ColorSpace)) {\r\n\t\t\t\tusing (var ms = new MemoryStream(bytes))\r\n\t\t\t\tusing (var bmp = new FreeImageBitmap(ms, FREE_IMAGE_LOAD_FLAGS.JPEG_CMYK | FREE_IMAGE_LOAD_FLAGS.TIFF_CMYK)) {\r\n\t\t\t\t\tRotateBitmap(bmp, _pageRotation, vFlip);\r\n\t\t\t\t\tif (bmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_24_BPP)) {\r\n\t\t\t\t\t\tSwapRedBlue(bmp);\r\n\t\t\t\t\t\tn = fileName + Constants.FileExtensions.Png;\r\n\t\t\t\t\t\tbmp.Save(n, FREE_IMAGE_FORMAT.FIF_PNG);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tn = fileName + Constants.FileExtensions.Tif;\r\n\t\t\t\t\t\tbmp.Save(n, FREE_IMAGE_FORMAT.FIF_TIFF, FREE_IMAGE_SAVE_FLAGS.TIFF_CMYK | FREE_IMAGE_SAVE_FLAGS.TIFF_DEFLATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tSaveMaskedImage(info, bmp, fileName);\r\n\t\t\t\t\tif (PrintImageLocation) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"导出图片：\" + n);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tusing (FileStream f = new FileStream(n, FileMode.Create)) {\r\n\t\t\t\t\tf.Write(bytes, 0, bytes.Length);\r\n\t\t\t\t}\r\n\t\t\t\tif (info.ExtName == Constants.FileExtensions.Jpg) {\r\n\t\t\t\t\tif (info.Mask != null) {\r\n\t\t\t\t\t\tusing (var bmp = new FreeImageBitmap(new MemoryStream(bytes), FREE_IMAGE_FORMAT.FIF_JPEG)) {\r\n\t\t\t\t\t\t\tSaveMaskedImage(info, bmp, fileName);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (vFlip) {\r\n\t\t\t\t\t\tTransformJpeg(n, FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_FLIP_V);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_pageRotation != 0) {\r\n\t\t\t\t\t\tTransformJpeg(n,\r\n\t\t\t\t\t\t\t_pageRotation == 90 ? FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_90\r\n\t\t\t\t\t\t\t: _pageRotation == 180 ? FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_180\r\n\t\t\t\t\t\t\t: _pageRotation == 270 ? FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_270\r\n\t\t\t\t\t\t\t: FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_NONE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tinfo.FileName = n;\r\n\t\t}\r\n\r\n\t\tstatic void SwapRedBlue(FreeImageBitmap bmp) {\r\n\t\t\tvar r = bmp.GetChannel(FREE_IMAGE_COLOR_CHANNEL.FICC_RED);\r\n\t\t\tvar b = bmp.GetChannel(FREE_IMAGE_COLOR_CHANNEL.FICC_BLUE);\r\n\t\t\tbmp.SetChannel(b, FREE_IMAGE_COLOR_CHANNEL.FICC_RED);\r\n\t\t\tbmp.SetChannel(r, FREE_IMAGE_COLOR_CHANNEL.FICC_BLUE);\r\n\t\t}\r\n\r\n\t\tstatic void TransformJpeg(string fileName, FREE_IMAGE_JPEG_OPERATION operation) {\r\n\t\t\tvar tmpName = fileName + Constants.FileExtensions.Tmp;\r\n\t\t\tif (FreeImageBitmap.JPEGTransform(fileName, tmpName, operation, true)) {\r\n\t\t\t\tFile.Delete(fileName);\r\n\t\t\t\tFile.Move(tmpName, fileName);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tFile.Delete(tmpName);\r\n\t\t\tRotateFlipType type;\r\n\t\t\tswitch (operation) {\r\n\t\t\t\tcase FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_FLIP_H:\r\n\t\t\t\t\ttype = RotateFlipType.RotateNoneFlipX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_FLIP_V:\r\n\t\t\t\t\ttype = RotateFlipType.RotateNoneFlipY;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_90:\r\n\t\t\t\t\ttype = RotateFlipType.Rotate270FlipNone;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_180:\r\n\t\t\t\t\ttype = RotateFlipType.Rotate180FlipNone;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase FREE_IMAGE_JPEG_OPERATION.FIJPEG_OP_ROTATE_270:\r\n\t\t\t\t\ttype = RotateFlipType.Rotate90FlipNone;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"无损翻转 JPG 图片失败：\" + fileName);\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tusing (var bmp = new FreeImageBitmap(fileName)) {\r\n\t\t\t\tbmp.RotateFlip(type);\r\n\t\t\t\tif (bmp.UniqueColors < 256) {\r\n\t\t\t\t\tbmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);\r\n\t\t\t\t}\r\n\t\t\t\tbmp.Save(new FilePath(fileName).ChangeExtension(Constants.FileExtensions.Png));\r\n\t\t\t}\r\n\t\t\tFile.Delete(fileName);\r\n\t\t}\r\n\r\n\t\tvoid SaveBitmap(ImageInfo info, byte[] bytes, string fileName) {\r\n\t\t\tvar vFlip = _options.VerticalFlipImages ^ info.VerticalFlip;\r\n\t\t\tvar ext = info.ExtName;\r\n\t\t\tif (info.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\text = _options.MonoPng == false ? Constants.FileExtensions.Tif : Constants.FileExtensions.Png;\r\n\t\t\t}\r\n\t\t\tvar n = fileName + ext;\r\n\t\t\tif (PrintImageLocation) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, n);\r\n\t\t\t\tTracker.TraceMessage(\"导出图片：\" + n);\r\n\t\t\t}\r\n\t\t\tif (PdfName.DEVICECMYK.Equals(info.ColorSpace)) {\r\n\t\t\t\t// TODO: 转换字节数组的 CMYK 为 RGB 后加载到 FreeImageBitmap\r\n\t\t\t\t//info.PixelFormat = PixelFormat.Undefined;\r\n\t\t\t\tusing (var bmp = new FreeImageBitmap(\r\n\t\t\t\t\t//info.Width,\r\n\t\t\t\t\t//info.Height,\r\n\t\t\t\t\t//GetStride (info, bytes, vFlip),\r\n\t\t\t\t\t//PixelFormat.Format32bppArgb, bytes\r\n\t\t\t\t\tnew MemoryStream(bytes), FREE_IMAGE_LOAD_FLAGS.JPEG_CMYK\r\n\t\t\t\t\t)) {\r\n\t\t\t\t\tif (info.ICCProfile != null) {\r\n\t\t\t\t\t\tbmp.CreateICCProfile(info.ICCProfile);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tRotateBitmap(bmp, _pageRotation, false);\r\n\t\t\t\t\tif (bmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_24_BPP)) {\r\n\t\t\t\t\t\tSwapRedBlue(bmp);\r\n\t\t\t\t\t\tn = fileName + Constants.FileExtensions.Png;\r\n\t\t\t\t\t\tbmp.Save(n, FREE_IMAGE_FORMAT.FIF_PNG);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tbmp.Save(n,\r\n\t\t\t\t\t\t\tFREE_IMAGE_FORMAT.FIF_TIFF,\r\n\t\t\t\t\t\t\tFREE_IMAGE_SAVE_FLAGS.TIFF_CMYK | FREE_IMAGE_SAVE_FLAGS.TIFF_DEFLATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tSaveMaskedImage(info, bmp, fileName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tusing (var bmp = CreateFreeImageBitmap(info, ref bytes, vFlip, true)) {\r\n\t\t\t\t\tif (ext == Constants.FileExtensions.Png\r\n\t\t\t\t\t\t\t&& _options.InvertBlackAndWhiteImages\r\n\t\t\t\t\t\t\t&& info.PixelFormat == PixelFormat.Format1bppIndexed\r\n\t\t\t\t\t\t\t&& bmp.Palette.Length == 2) {\r\n\t\t\t\t\t\tbmp.SwapPaletteIndices(0, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tRotateBitmap(bmp, _pageRotation, false);\r\n\t\t\t\t\tif (ext == Constants.FileExtensions.Tif) {\r\n\t\t\t\t\t\tTiffHelper.Save(bmp, n);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tbmp.Save(n, FREE_IMAGE_FORMAT.FIF_PNG);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (FreeImageException ex) when (ex.Message == \"Unable to save bitmap\") {\r\n\t\t\t\t\t\t\tusing (var b = bmp.ToBitmap()) {\r\n\t\t\t\t\t\t\t\tb.Save(n, ImageFormat.Png);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (System.Runtime.InteropServices.SEHException) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"保存图片时出现错误，请联系程序开发者：\" + n);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tSaveMaskedImage(info, bmp, fileName);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tinfo.FileName = n;\r\n\t\t}\r\n\r\n\t\tstatic void RotateBitmap(FreeImageBitmap bitmap, int rotation, bool vflip) {\r\n\t\t\tif (rotation == 0 && vflip == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tRotateFlipType r;\r\n\t\t\tswitch (rotation) {\r\n\t\t\t\tcase 0: r = RotateFlipType.RotateNoneFlipY; break;\r\n\t\t\t\tcase 90: r = vflip ? RotateFlipType.Rotate270FlipY : RotateFlipType.Rotate270FlipNone; break;\r\n\t\t\t\tcase 180: r = vflip ? RotateFlipType.Rotate180FlipY : RotateFlipType.Rotate180FlipNone; break;\r\n\t\t\t\tcase 270: r = vflip ? RotateFlipType.Rotate90FlipY : RotateFlipType.Rotate90FlipNone; break;\r\n\t\t\t\tdefault: return;\r\n\t\t\t}\r\n\t\t\tbitmap.RotateFlip(r);\r\n\t\t}\r\n\r\n\t\tinternal static FreeImageBitmap CreateFreeImageBitmap(ImageInfo info, ref byte[] bytes, bool vFlip, bool loadPaletteAndIccp) {\r\n\t\t\tif (info.ExtName != Constants.FileExtensions.Jpg && info.ExtName != Constants.FileExtensions.Jp2) {\r\n\t\t\t\tinfo.ConvertDecodedBytes(ref bytes);\r\n\t\t\t}\r\n\t\t\tFreeImageBitmap bmp;\r\n\t\t\tif (PdfName.DEVICECMYK.Equals(info.ColorSpace)) {\r\n\t\t\t\tbmp = new FreeImageBitmap(new MemoryStream(bytes), FREE_IMAGE_LOAD_FLAGS.TIFF_CMYK);\r\n\t\t\t}\r\n\t\t\telse if (info.ExtName == Constants.FileExtensions.Jp2 || info.ExtName == Constants.FileExtensions.Jpg) {\r\n\t\t\t\tbmp = new FreeImageBitmap(new MemoryStream(bytes));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbmp = new FreeImageBitmap(info.Width, info.Height, GetStride(info, bytes, vFlip), info.PixelFormat, bytes);\r\n\t\t\t}\r\n\t\t\tif (loadPaletteAndIccp\r\n\t\t\t\t|| info.ColorSpace == PdfName.DEVICEGRAY && info.PaletteColorSpace == null) {\r\n\t\t\t\tinfo.CreatePaletteAndIccProfile(bmp);\r\n\t\t\t}\r\n\t\t\treturn bmp;\r\n\t\t}\r\n\r\n\t\tstatic int GetStride(ImageInfo info, byte[] bytes, bool vFlip) {\r\n\t\t\tif (PdfName.COLORSPACE.Equals(info.ColorSpace)) {\r\n\t\t\t\treturn vFlip ? -(info.Width << 2) : (info.Width << 2);\r\n\t\t\t}\r\n\t\t\tvar components = bytes.Length / info.Width / info.Height;\r\n\t\t\tvar stride = components > 0\r\n\t\t\t\t? info.Width * components\r\n\t\t\t\t: (info.Width + 8 / info.BitsPerComponent - 1) / (8 / info.BitsPerComponent);\r\n\t\t\treturn vFlip ? -stride : stride;\r\n\t\t}\r\n\r\n\t\tstring GetNewImageFileName() {\r\n\t\t\t_imageCount++;\r\n\t\t\treturn String.Concat(\r\n\t\t\t\tFileHelper.CombinePath(_options.OutputPath, _activePage.ToString(_fileMask)),\r\n\t\t\t\t_imageCount > 1 ? \"[\" + _imageCount + \"]\" : null);\r\n\t\t}\r\n\r\n\t\tvoid MergeImages() {\r\n\t\t\tvar l = _imagePosList.Count;\r\n\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\tvar imageI = _imagePosList[i];\r\n\t\t\t\t// 由于在导出图像时仅为 PNG 和 TIF 指定 ImageInfo 的 PixelFormat，因此合并过程中仅处理这两类文件\r\n\t\t\t\tif (imageI.Image.ReferenceCount < 1 // 图像已处理\r\n\t\t\t\t\t|| imageI.Image.PixelFormat == PixelFormat.Undefined // 不属于可合并的类型\r\n\t\t\t\t\t|| l - i < 2 // 是最后一张图片\r\n\t\t\t\t\t) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar imageParts = new ImageInfo[l - i];\r\n\t\t\t\tvar w = imageI.Image.Width;\r\n\t\t\t\tvar h = 0;\r\n\t\t\t\tvar i2 = 0;\r\n\t\t\t\tfor (int j = i; j < l; j++) {\r\n\t\t\t\t\tvar imageJ = _imagePosList[j];\r\n\t\t\t\t\tif (imageJ.Image.ReferenceCount < 1 // 图像已处理\r\n\t\t\t\t\t\t|| imageJ.Image.Width != w // 宽度不相符\r\n\t\t\t\t\t\t|| Math.Abs(Math.Round(imageJ.X - imageI.X)) > 1 // 位置相差超过 1 点\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\timageParts[i2] = imageJ.Image;\r\n\t\t\t\t\th += imageJ.Image.Height;\r\n\t\t\t\t\t_imagePosList[j].Image.ReferenceCount--; // 避免重复处理\r\n\t\t\t\t\ti2++;\r\n\t\t\t\t}\r\n\t\t\t\tif (i2 == 0) { // 没有符合合并条件的图片\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (i2 == 1) {\r\n\t\t\t\t\t_imagePosList[i].Image.ReferenceCount++;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (i2 < imageParts.Length) {\r\n\t\t\t\t\tArray.Resize(ref imageParts, i2);\r\n\t\t\t\t}\r\n\t\t\t\tif (PrintImageLocation) {\r\n\t\t\t\t\tTracker.TraceMessage(\"合并图片：\" + String.Join(\"、\", Array.ConvertAll<ImageInfo, string>(imageParts, p => Path.GetFileName(p.FileName))));\r\n\t\t\t\t}\r\n\t\t\t\tvar ext = Path.GetExtension(imageI.Image.FileName).ToLowerInvariant();\r\n\t\t\t\tif (imageI.Image.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\t\text = Constants.FileExtensions.Tif;\r\n\t\t\t\t}\r\n\t\t\t\tvar f = GetNewImageFileName();\r\n\t\t\t\tusing (FreeImageBitmap bmp = new FreeImageBitmap(w, h, imageI.Image.PixelFormat)) {\r\n\t\t\t\t\tvar mi = new ImageMerger(bmp);\r\n\t\t\t\t\tforeach (var part in imageParts) {\r\n\t\t\t\t\t\tusing (var bmp2 = FreeImageBitmap.FromFile(part.FileName)) {\r\n\t\t\t\t\t\t\tmi.MergeImage(bmp2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmi.TryReduceColor();\r\n\t\t\t\t\tif (ext == Constants.FileExtensions.Jpg && _options.MergeJpgToPng) {\r\n\t\t\t\t\t\text = Constants.FileExtensions.Png;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (bmp.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\t\t\tif (_options.MonoPng == false) {\r\n\t\t\t\t\t\t\text = Constants.FileExtensions.Tif;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\text = Constants.FileExtensions.Png;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tf += ext;\r\n\t\t\t\t\tif (PrintImageLocation) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, f);\r\n\t\t\t\t\t\tTracker.TraceMessage(\"保存合并后的图片：\" + f);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (ext == Constants.FileExtensions.Tif) {\r\n\t\t\t\t\t\tTiffHelper.Save(bmp, f);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tbmp.Save(f);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar mii = new ImageInfo { FileName = f, ReferenceCount = 1, Height = h, Width = w };\r\n\t\t\t\t\t_imageInfoList.Add(mii);\r\n\t\t\t\t\t_imagePosList.Add(new ImageDisposition(_imagePosList[i].Ctm, mii));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tDeleteIntermediateFiles();\r\n\t\t\t_imageInfoList.Sort((ImageInfo x, ImageInfo y) => string.Compare(x.FileName, y.FileName, StringComparison.OrdinalIgnoreCase));\r\n\t\t\t_totalImageCount -= _imageCount;\r\n\t\t\t_imageCount = 0;\r\n\t\t\tvar newFileNames = new List<string>();\r\n\t\t\tforeach (var item in _imageInfoList) {\r\n\t\t\t\tif (item.FileName != null && item.InlineImage == null) {\r\n\t\t\t\t\tstring n;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tn = GetNewImageFileName() + Path.GetExtension(item.FileName);\r\n\t\t\t\t\t} while (_imagePosList.Exists((i) => i.Image.FileName == n) || newFileNames.Contains(n));\r\n\t\t\t\t\tif (PrintImageLocation) {\r\n\t\t\t\t\t\tTracker.TraceMessage(String.Concat(\"重命名合并后的文件 \", item.FileName, \" 为 \", n));\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, n);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnewFileNames.Add(n);\r\n\t\t\t\t\tFile.Delete(n);\r\n\t\t\t\t\tFile.Move(item.FileName, n);\r\n\t\t\t\t\titem.FileName = n;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_totalImageCount += _imageCount;\r\n\t\t}\r\n\r\n\t\tvoid DeleteIntermediateFiles() {\r\n\t\t\tforeach (var item in _imageInfoList) {\r\n\t\t\t\tif (item.ReferenceCount < 1) {\r\n\t\t\t\t\tFile.Delete(item.FileName);\r\n\t\t\t\t\titem.FileName = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SaveMaskedImage(ImageInfo info, FreeImageBitmap bmp, string fileName) {\r\n\t\t\tif (info.Mask != null\r\n\t\t\t\t&& info.Mask.Size == bmp.Size\r\n\t\t\t\t&& (bmp.PixelFormat == PixelFormat.Format32bppArgb\r\n\t\t\t\t\t|| bmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_32_BPP))) {\r\n\t\t\t\tvar m = (FreeImageBitmap)info.Mask.Clone();\r\n\t\t\t\tif ((m.PixelFormat == PixelFormat.Format8bppIndexed || m.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP | FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE))\r\n\t\t\t\t\t&& bmp.SetChannel(m, FREE_IMAGE_COLOR_CHANNEL.FICC_ALPHA)) {\r\n\t\t\t\t\tbmp.Save($\"{fileName}[merged]{Constants.FileExtensions.Png}\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class ImageMerger\r\n\t\t{\r\n\t\t\treadonly FreeImageBitmap _Image;\r\n\t\t\tColorType _ColorType;\r\n\t\t\tRGBQUAD[] _Colors;\r\n\t\t\tint _Height;\r\n\r\n\t\t\tpublic ImageMerger(FreeImageBitmap image) {\r\n\t\t\t\t_Image = image;\r\n\t\t\t\tif (image.HasPalette == false) {\r\n\t\t\t\t\t_ColorType = ColorType.FullColor;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic void MergeImage(FreeImageBitmap bmp) {\r\n\t\t\t\tif (_Height == 0) {\r\n\t\t\t\t\tPasteFirstImage(bmp);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (_ColorType == ColorType.FullColor) {\r\n\t\t\t\t\tPasteIntoFullColor(bmp);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (bmp.HasPalette == false) {\r\n\t\t\t\t\tExpandColorSpaceAndPaste(bmp);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar p = bmp.Palette.ToArray();\r\n\t\t\t\tif (p.SequenceEqual(_Colors)) {\r\n\t\t\t\t\tPasteAndIncrementHeight(bmp);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tswitch (_ColorType) {\r\n\t\t\t\t\tcase ColorType.BlackAndWhite:\r\n\t\t\t\t\t\tif (p[0].Color == Color.White\r\n\t\t\t\t\t\t\t&& p[1].Color == Color.Black\r\n\t\t\t\t\t\t\t&& bmp.Invert()) {\r\n\t\t\t\t\t\t\tPasteAndIncrementHeight(bmp);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase ColorType.WhiteAndBlack:\r\n\t\t\t\t\t\tif (p[0].Color == Color.Black\r\n\t\t\t\t\t\t\t&& p[1].Color == Color.White\r\n\t\t\t\t\t\t\t&& bmp.Invert()) {\r\n\t\t\t\t\t\t\tPasteAndIncrementHeight(bmp);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tTryExpandColorDepth(_Image);\r\n\t\t\t\tTryExpandColorDepth(bmp);\r\n\t\t\t\tPasteAndIncrementHeight(bmp);\r\n\t\t\t\t_Colors = null;\r\n\t\t\t\t_ColorType = ColorType.FullColor;\r\n\t\t\t}\r\n\r\n\t\t\tpublic bool TryReduceColor() {\r\n\t\t\t\tif (_ColorType != ColorType.FullColor) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tvar c = _Image.UniqueColors;\r\n\t\t\t\tif (c > 256) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (c < 3) {\r\n\t\t\t\t\tif (_Image.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP)) {\r\n\t\t\t\t\t\t_ColorType = ColorType.BlackAndWhite;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (_Image.ConvertColorDepth(c < 17 ? FREE_IMAGE_COLOR_DEPTH.FICD_04_BPP : FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP)) {\r\n\t\t\t\t\t_ColorType = ColorType.IndexedColor;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tvoid PasteFirstImage(FreeImageBitmap bmp) {\r\n\t\t\t\tif (bmp.HasPalette) {\r\n\t\t\t\t\t_Colors = new RGBQUAD[bmp.ColorsUsed];\r\n\t\t\t\t\t_Image.Palette.AsArray = bmp.Palette.AsArray;\r\n\t\t\t\t\tbmp.Palette.CopyTo(_Colors, 0);\r\n\t\t\t\t\t_ColorType = GetWhiteBlackType(_Colors);\r\n\t\t\t\t}\r\n\t\t\t\t_Image.Paste(bmp, 0, 0, Int32.MaxValue);\r\n\t\t\t\t_Height = bmp.Height;\r\n\t\t\t}\r\n\r\n\t\t\tstatic ColorType GetWhiteBlackType(RGBQUAD[] colors) {\r\n\t\t\t\tvar c0 = colors[0].Color;\r\n\t\t\t\tvar c1 = colors[1].Color;\r\n\t\t\t\treturn c0 == Color.Black && c1 == Color.White ? ColorType.BlackAndWhite\r\n\t\t\t\t\t: c0 == Color.White && c1 == Color.Black ? ColorType.WhiteAndBlack\r\n\t\t\t\t\t: ColorType.IndexedColor;\r\n\t\t\t}\r\n\r\n\t\t\tvoid PasteIntoFullColor(FreeImageBitmap bmp) {\r\n\t\t\t\tif (bmp.HasPalette) {\r\n\t\t\t\t\tTryExpandColorDepth(bmp);\r\n\t\t\t\t}\r\n\t\t\t\tPasteAndIncrementHeight(bmp);\r\n\t\t\t}\r\n\r\n\t\t\tstatic void TryExpandColorDepth(FreeImageBitmap bmp) {\r\n\t\t\t\tif (bmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_24_BPP) == false) {\r\n\t\t\t\t\tthrow new InvalidOperationException(\"合并图片失败：无法转换图片颜色\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvoid PasteAndIncrementHeight(FreeImageBitmap bmp) {\r\n\t\t\t\tif (_Image.Paste(bmp, 0, _Height, Int32.MaxValue) == false) {\r\n\t\t\t\t\tthrow new InvalidOperationException(\"合并图片失败：粘贴操作出错\");\r\n\t\t\t\t}\r\n\t\t\t\t_Height += bmp.Height;\r\n\t\t\t}\r\n\r\n\t\t\tvoid ExpandColorSpaceAndPaste(FreeImageBitmap bmp) {\r\n\t\t\t\tTryExpandColorDepth(_Image);\r\n\t\t\t\tPasteIntoFullColor(bmp);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tenum ColorType\r\n\t\t{\r\n\t\t\tUndefined,\r\n\t\t\tBlackAndWhite,\r\n\t\t\tWhiteAndBlack,\r\n\t\t\tIndexedColor,\r\n\t\t\tFullColor,\r\n\t\t}\r\n\r\n\t\tsealed class PdfPageImageProcessor : PdfContentStreamProcessor\r\n\t\t{\r\n\t\t\treadonly List<ImageDisposition> _posList;\r\n\t\t\treadonly List<ImageInfo> _infoList;\r\n\r\n\t\t\tpublic PdfPageImageProcessor(List<ImageDisposition> posList, List<ImageInfo> infoList) {\r\n\t\t\t\tPopulateOperators();\r\n\t\t\t\t_posList = posList;\r\n\t\t\t\t_infoList = infoList;\r\n\t\t\t}\r\n\t\t\tprotected override void InvokeOperator(PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tbase.InvokeOperator(oper, operands);\r\n\t\t\t\tswitch (oper.ToString()) {\r\n\t\t\t\t\tcase \"Do\":\r\n\t\t\t\t\t\tvar xobjects = Resource.GetAsDict(PdfName.XOBJECT);\r\n\t\t\t\t\t\tvar r = xobjects.GetAsIndirectObject(operands[0] as PdfName);\r\n\t\t\t\t\t\tvar info = _infoList.Find(\r\n\t\t\t\t\t\t\ti => i.InlineImage.PdfRef != null\r\n\t\t\t\t\t\t\t\t&& i.InlineImage.PdfRef.Number == r.Number\r\n\t\t\t\t\t\t\t\t&& i.InlineImage.PdfRef.Generation == r.Generation);\r\n\t\t\t\t\t\tif (info != null) {\r\n\t\t\t\t\t\t\tinfo.ReferenceCount++;\r\n\t\t\t\t\t\t\t_posList.Add(new ImageDisposition(CurrentGraphicState.TransMatrix, info));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tTrace.WriteLine(String.Concat(\"Image \", r, \" not found.\"));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"BI\":\r\n\t\t\t\t\t\tinfo = new ImageInfo(new PdfImageData(operands[0] as PdfDictionary, ((PdfImageData)operands[0]).RawBytes));\r\n\t\t\t\t\t\tinfo.ReferenceCount++;\r\n\t\t\t\t\t\t_infoList.Add(info);\r\n\t\t\t\t\t\t_posList.Add(new ImageDisposition(CurrentGraphicState.TransMatrix, info));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/BitmapHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tstatic class BitmapHelper\r\n\t{\r\n\t\tpublic static ImageCodecInfo GetCodec(string codecName) {\r\n\t\t\tvar ie = ImageCodecInfo.GetImageEncoders();\r\n\t\t\tfor (int i = 0; i < ie.Length; i++) {\r\n\t\t\t\tvar ic = ie[i];\r\n\t\t\t\tif (ic.MimeType == codecName) {\r\n\t\t\t\t\treturn ic;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取指定图片的不重复颜色集合。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"bmp\">需要获取颜色集合的 <see cref=\"Bitmap\"/>。</param>\r\n\t\t/// <returns>包含不重复颜色集合的列表。</returns>\r\n\t\tunsafe public static Color[] GetPalette(this Bitmap bmp) {\r\n\t\t\tvar hs = new HashSet<int>();\r\n\t\t\tif (bmp == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (bmp.IsIndexed()) {\r\n\t\t\t\treturn Array.ConvertAll(bmp.Palette.Entries, c => c); //duplicates the array\r\n\t\t\t}\r\n\t\t\tif (bmp.PixelFormat != PixelFormat.Format24bppRgb && bmp.PixelFormat != PixelFormat.Format32bppArgb) {\r\n\t\t\t\tthrow new InvalidOperationException(\"仅支持 Format24bppRgb 和 Format32bppArgb。\");\r\n\t\t\t}\r\n\t\t\tBitmapData bmpData;\r\n\t\t\tint bw = bmp.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;\r\n\t\t\tbyte* ps, pl;\r\n\t\t\tbmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);\r\n\t\t\tpl = (byte*)bmpData.Scan0;\r\n\t\t\tint w = bmp.Width, h = bmp.Height;\r\n\t\t\tfor (int y = 0; y < h; y++) {\r\n\t\t\t\tps = pl;\r\n\t\t\t\tif (bw == 3) {\r\n\t\t\t\t\tfor (int x = 0; x < w; x++) {\r\n\t\t\t\t\t\ths.Add((*ps) + (*(++ps) << 8) + (*(++ps) << 16) + (0xFF << 24));\r\n\t\t\t\t\t\t++ps;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (bw == 4) {\r\n\t\t\t\t\tfor (int x = 0; x < w; x++) {\r\n\t\t\t\t\t\ths.Add((*ps) + ((*++ps) << 8) + (*(++ps) << 16) + (*(++ps) << 24));\r\n\t\t\t\t\t\t++ps;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tpl += bmpData.Stride;\r\n\t\t\t}\r\n\t\t\tbmp.UnlockBits(bmpData);\r\n\t\t\tvar r = new Color[hs.Count];\r\n\t\t\tvar i = 0;\r\n\t\t\tforeach (var item in hs.Select(Color.FromArgb)) {\r\n\t\t\t\tr[i++] = item;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 检查 <see cref=\"Image\"/> 是否为索引调色板图像。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"image\">需要检查的图像。</param>\r\n\t\t/// <returns>如为索引调色板图像，则返回 true，否则返回 false。</returns>\r\n\t\tpublic static bool IsIndexed(this Image image) {\r\n\t\t\treturn (image.PixelFormat & PixelFormat.Indexed) == PixelFormat.Indexed;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 锁定 <see cref=\"Bitmap\"/> 的内容，用于读写。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"bmp\">需要锁定的内容。</param>\r\n\t\t/// <param name=\"writable\">是否可写入。</param>\r\n\t\t/// <returns>锁定后的 <see cref=\"BitmapData\"/>。</returns>\r\n\t\tpublic static BitmapData LockBits(this Bitmap bmp, bool writable) {\r\n\t\t\treturn bmp.LockBits(new Rectangle(Point.Empty, bmp.Size), writable ? ImageLockMode.ReadWrite : ImageLockMode.ReadOnly, bmp.PixelFormat);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 调整 <paramref name=\"source\"/> 的尺寸。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"source\">需要调整尺寸的 <see cref=\"Image\"/>。</param>\r\n\t\t/// <param name=\"size\">新尺寸。</param>\r\n\t\t/// <param name=\"highQuality\">是否采用插值方式调整尺寸。</param>\r\n\t\t/// <returns>调整后的新 <see cref=\"Bitmap\"/>。</returns>\r\n\t\tpublic static Bitmap ResizeImage(this Image source, Size size, bool highQuality) {\r\n\t\t\tvar b = new Bitmap(size.Width, size.Height);\r\n\t\t\tusing (var g = Graphics.FromImage(b)) {\r\n\t\t\t\tif (highQuality) {\r\n\t\t\t\t\tg.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;\r\n\t\t\t\t}\r\n\t\t\t\tg.DrawImage(source, 0, 0, size.Width, size.Height);\r\n\t\t\t}\r\n\t\t\treturn b;\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 按文件名的扩展名保存图像文件为对应的格式。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"image\">需要保存的 <see cref=\"Image\"/>。</param>\r\n\t\t/// <param name=\"fileName\">保存的文件路径。</param>\r\n\t\tpublic static void SaveAs(this Image image, string fileName) {\r\n\t\t\tvar ext = System.IO.Path.GetExtension(fileName);\r\n\t\t\tswitch (ext.ToUpperInvariant()) {\r\n\t\t\t\tcase \".PNG\":\r\n\t\t\t\t\timage.Save(fileName, ImageFormat.Png); return;\r\n\t\t\t\tcase \".BMP\":\r\n\t\t\t\t\timage.Save(fileName, ImageFormat.Bmp); return;\r\n\t\t\t\tcase \".JPG\":\r\n\t\t\t\tcase \".JPEG\":\r\n\t\t\t\t\timage.Save(fileName, 75); return;\r\n\t\t\t\tcase \".TIF\":\r\n\t\t\t\tcase \".TIFF\":\r\n\t\t\t\t\tTiffHelper.SaveBinaryImage(image, fileName); return;\r\n\t\t\t\tcase \".GIF\":\r\n\t\t\t\t\timage.Save(fileName, ImageFormat.Gif); return;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgoto case \".PNG\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static void SaveAs(this Image image, string extension, System.IO.Stream stream) {\r\n\t\t\tswitch (extension) {\r\n\t\t\t\tcase \".PNG\":\r\n\t\t\t\t\timage.Save(stream, ImageFormat.Png); return;\r\n\t\t\t\tcase \".BMP\":\r\n\t\t\t\t\timage.Save(stream, ImageFormat.Bmp); return;\r\n\t\t\t\tcase \".JPG\":\r\n\t\t\t\tcase \".JPEG\":\r\n\t\t\t\t\timage.Save(stream, 75); return;\r\n\t\t\t\tcase \".TIF\":\r\n\t\t\t\tcase \".TIFF\":\r\n\t\t\t\t\timage.SaveBinaryImage(stream); return;\r\n\t\t\t\tcase \".GIF\":\r\n\t\t\t\t\timage.Save(stream, ImageFormat.Gif); return;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgoto case \".PNG\";\r\n\t\t\t}\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 将 <paramref name=\"tint\"/> 颜色染色到 <paramref name=\"color\"/> 上。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"color\">基色。</param>\r\n\t\t/// <param name=\"tint\">染色颜色。</param>\r\n\t\t/// <returns>染色后的新颜色。</returns>\r\n\t\tpublic static Color Tint(this Color color, Color tint) {\r\n\t\t\treturn Color.FromArgb(color.A, mul255(color.R, tint.R), mul255(color.G, tint.G), mul255(color.B, tint.B));\r\n\r\n\t\t\t// MuPDF: pixmap.c\r\n\t\t\tstatic int mul255(int a, int b) {\r\n\t\t\t\t/* see Jim Blinn's book \"Dirty Pixels\" for how this works */\r\n\t\t\t\tint x = a * b + 128;\r\n\t\t\t\tx += x >> 8;\r\n\t\t\t\treturn x >> 8;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tunsafe public static Bitmap ToIndexImage(this Bitmap source, Color[] pallette) {\r\n\t\t\tif (source == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (source.PixelFormat != PixelFormat.Format24bppRgb && source.PixelFormat != PixelFormat.Format32bppArgb) {\r\n\t\t\t\tthrow new InvalidOperationException(\"仅支持 Format24bppRgb 和 Format32bppArgb。\");\r\n\t\t\t}\r\n\t\t\tvar pi = new Dictionary<int, byte>(pallette.Length);\r\n\t\t\tfor (int i = pallette.Length - 1; i >= 0; i--) {\r\n\t\t\t\tpi[pallette[i].ToArgb()] = (byte)i;\r\n\t\t\t}\r\n\t\t\tvar result = new Bitmap(source.Width, source.Height, PixelFormat.Format8bppIndexed);\r\n\t\t\tvar sourceData = source.LockBits(false);\r\n\t\t\tvar targetData = result.LockBits(true);\r\n\t\t\tint bw = source.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;\r\n\t\t\tbyte* ps, pr, src, res;\r\n\t\t\tsrc = (byte*)sourceData.Scan0;\r\n\t\t\tres = (byte*)targetData.Scan0;\r\n\t\t\tvar rp = result.Palette;\r\n\t\t\tfor (int i = 0; i < pallette.Length; i++) {\r\n\t\t\t\trp.Entries[i] = pallette[i];\r\n\t\t\t}\r\n\t\t\tresult.Palette = rp;\r\n\t\t\tint w = source.Width, h = source.Height;\r\n\t\t\tfor (int y = 0; y < h; y++) {\r\n\t\t\t\tps = src;\r\n\t\t\t\tpr = res;\r\n\t\t\t\tif (bw == 3) {\r\n\t\t\t\t\tfor (int x = 0; x < w; x++) {\r\n\t\t\t\t\t\t*pr = pi[(*ps) + (*(++ps) << 8) + (*(++ps) << 16) + (0xFF << 24)];\r\n\t\t\t\t\t\t++pr;\r\n\t\t\t\t\t\t++ps;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (bw == 4) {\r\n\t\t\t\t\tfor (int x = 0; x < w; x++) {\r\n\t\t\t\t\t\t*pr = pi[(*ps) + ((*++ps) << 8) + (*(++ps) << 16) + (*(++ps) << 24)];\r\n\t\t\t\t\t\t++pr;\r\n\t\t\t\t\t\t++ps;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsrc += sourceData.Stride;\r\n\t\t\t\tres += targetData.Stride;\r\n\t\t\t}\r\n\t\t\tsource.UnlockBits(sourceData);\r\n\t\t\tresult.UnlockBits(targetData);\r\n\t\t\tresult.SetResolution(source.HorizontalResolution, source.VerticalResolution);\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\t/// <summary>将图像转换为黑白图像。</summary>\r\n\t\t/// <param name=\"original\">需要转换的图像。</param>\r\n\t\t/// <returns>转换后的图像。</returns>\r\n\t\t/// <remarks>http://www.wischik.com/lu/programmer/1bpp.html</remarks>\r\n\t\tpublic static Bitmap ToBitonal(this Bitmap original) {\r\n\t\t\tBitmap source;\r\n\r\n\t\t\tif (original.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\treturn (Bitmap)original.Clone();\r\n\t\t\t}\r\n\t\t\telse if (original.PixelFormat != PixelFormat.Format24bppRgb) {\r\n\t\t\t\t// If original bitmap is not already in 24 BPP, ARGB format, then convert\r\n\t\t\t\t// unfortunately Clone doesn't do this for us but returns a bitmap with the same pixel format\r\n\t\t\t\t// source = original.Clone( new Rectangle( Point.Empty, original.Size ), PixelFormat.Format24bppRgb );\r\n\t\t\t\tsource = new Bitmap(original.Width, original.Height, PixelFormat.Format24bppRgb);\r\n\t\t\t\tsource.SetResolution(original.HorizontalResolution, original.VerticalResolution);\r\n\t\t\t\tusing (Graphics g = Graphics.FromImage(source)) {\r\n\t\t\t\t\t//g.CompositingQuality = Drawing2D.CompositingQuality.GammaCorrected;\r\n\t\t\t\t\t//g.InterpolationMode = Drawing2D.InterpolationMode.Low;\r\n\t\t\t\t\t//g.SmoothingMode = Drawing2D.SmoothingMode.None;\r\n\t\t\t\t\tg.DrawImageUnscaled(original, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tsource = original;\r\n\t\t\t}\r\n\r\n\t\t\t// Lock source bitmap in memory\r\n\t\t\tBitmapData sourceData = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);\r\n\r\n\t\t\t// Copy image data to binary array\r\n\t\t\tint imageSize = sourceData.Stride * sourceData.Height;\r\n\t\t\tbyte[] sourceBuffer = new byte[imageSize];\r\n\t\t\tMarshal.Copy(sourceData.Scan0, sourceBuffer, 0, imageSize);\r\n\r\n\t\t\t// Unlock source bitmap\r\n\t\t\tsource.UnlockBits(sourceData);\r\n\r\n\t\t\t// Dispose of source if not originally supplied bitmap\r\n\t\t\tif (source != original) {\r\n\t\t\t\tsource.Dispose();\r\n\t\t\t}\r\n\r\n\t\t\t// Create destination bitmap\r\n\t\t\tBitmap destination = new Bitmap(sourceData.Width, sourceData.Height, PixelFormat.Format1bppIndexed);\r\n\t\t\tdestination.SetResolution(original.HorizontalResolution, original.VerticalResolution);\r\n\r\n\t\t\t// Lock destination bitmap in memory\r\n\t\t\tBitmapData destinationData = destination.LockBits(new Rectangle(0, 0, destination.Width, destination.Height), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);\r\n\r\n\t\t\t// Create destination buffer\r\n\t\t\tbyte[] destinationBuffer = SimpleThresholdBW(\r\n\t\t\t\tsourceBuffer,\r\n\t\t\t\tsourceData.Width,\r\n\t\t\t\tsourceData.Height,\r\n\t\t\t\tsourceData.Stride,\r\n\t\t\t\tdestinationData.Stride);\r\n\r\n\t\t\t// Copy binary image data to destination bitmap\r\n\t\t\tMarshal.Copy(destinationBuffer, 0, destinationData.Scan0, destinationData.Stride * sourceData.Height);\r\n\r\n\t\t\t// Unlock destination bitmap\r\n\t\t\tdestination.UnlockBits(destinationData);\r\n\r\n\t\t\t// Return\r\n\t\t\treturn destination;\r\n\t\t}\r\n\r\n\t\tpublic static byte[] SimpleThresholdBW(byte[] sourceBuffer, int width, int height, int srcStride, int dstStride) {\r\n\t\t\tconst int THRESHOLD = 255 * 3 / 2;\r\n\r\n\t\t\tbyte[] destinationBuffer = new byte[dstStride * height];\r\n\t\t\tint srcIx = 0;\r\n\t\t\tint dstIx = 0;\r\n\t\t\tbyte bit;\r\n\t\t\tbyte pix8;\r\n\r\n\t\t\tint newPixel, i, j;\r\n\r\n\t\t\t// Iterate lines\r\n\t\t\tfor (int y = 0; y < height; y++, srcIx += srcStride, dstIx += dstStride) {\r\n\t\t\t\tbit = 128;\r\n\t\t\t\ti = srcIx;\r\n\t\t\t\tj = dstIx;\r\n\t\t\t\tpix8 = 0;\r\n\t\t\t\t// Iterate pixels\r\n\t\t\t\tfor (int x = 0; x < width; x++, i += 3) {\r\n\t\t\t\t\t// Compute pixel brightness (i.e. total of Red, Green, and Blue values)\r\n\t\t\t\t\tnewPixel = sourceBuffer[i] + sourceBuffer[i + 1] + sourceBuffer[i + 2];\r\n\r\n\t\t\t\t\tif (newPixel > THRESHOLD) {\r\n\t\t\t\t\t\tpix8 |= bit;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (bit == 1) {\r\n\t\t\t\t\t\tdestinationBuffer[j++] = pix8;\r\n\t\t\t\t\t\tbit = 128;\r\n\t\t\t\t\t\tpix8 = 0; // init next value with 0\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tbit >>= 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t} // line finished\r\n\t\t\t\tif (bit != 128) {\r\n\t\t\t\t\tdestinationBuffer[j] = pix8;\r\n\t\t\t\t}\r\n\t\t\t} // all lines finished\r\n\t\t\treturn destinationBuffer;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/FreeImageHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Reflection;\r\nusing System.Reflection.Emit;\r\nusing FreeImageAPI;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tstatic class FreeImageHelper\r\n\t{\r\n\t\tpublic static bool UseDib(this FreeImageBitmap bmp, Func<FIBITMAP, FIBITMAP> handler) {\r\n\t\t\tif (handler != null) {\r\n\t\t\t\tvar t = bmp.Tag; // ensure not disposed\r\n\t\t\t\tvar dib = GetDib(bmp);\r\n\t\t\t\tdib = handler(dib);\r\n\t\t\t\treturn ReplaceDib(bmp, dib);\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tstatic readonly Func<FreeImageBitmap, FIBITMAP> GetDib = CreateGetDibMethod();\r\n\t\tstatic readonly Func<FreeImageBitmap, FIBITMAP, bool> ReplaceDib = CreateReplaceDibMethod();\r\n\r\n\t\tstatic Func<FreeImageBitmap, FIBITMAP> CreateGetDibMethod() {\r\n\t\t\tvar m = new DynamicMethod(\"GetDib\", typeof(FIBITMAP), new[] { typeof(FreeImageBitmap) }, true);\r\n\t\t\tvar il = m.GetILGenerator();\r\n\t\t\til.Emit(OpCodes.Ldarg_0);\r\n\t\t\til.Emit(OpCodes.Ldfld, typeof(FreeImageBitmap).GetField(\"dib\", BindingFlags.Instance | BindingFlags.NonPublic));\r\n\t\t\til.Emit(OpCodes.Ret);\r\n\t\t\treturn (Func<FreeImageBitmap, FIBITMAP>)m.CreateDelegate(typeof(Func<FreeImageBitmap, FIBITMAP>));\r\n\t\t}\r\n\r\n\t\tstatic Func<FreeImageBitmap, FIBITMAP, bool> CreateReplaceDibMethod() {\r\n\t\t\tvar m = new DynamicMethod(\"ReplaceDib\", typeof(bool), new[] { typeof(FreeImageBitmap), typeof(FIBITMAP) }, true);\r\n\t\t\tvar il = m.GetILGenerator();\r\n\t\t\til.Emit(OpCodes.Ldarg_0);\r\n\t\t\til.Emit(OpCodes.Ldarg_1);\r\n\t\t\til.EmitCall(OpCodes.Callvirt, typeof(FreeImageBitmap).GetMethod(\"ReplaceDib\", BindingFlags.Instance | BindingFlags.NonPublic), null);\r\n\t\t\til.Emit(OpCodes.Ret);\r\n\t\t\treturn (Func<FreeImageBitmap, FIBITMAP, bool>)m.CreateDelegate(typeof(Func<FreeImageBitmap, FIBITMAP, bool>));\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/ImageDeskew.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing FreeImageAPI;\r\npublic class ImageDeskew\r\n{\r\n\t// Representation of a line in the image.  \r\n\tprivate class HougLine\r\n\t{\r\n\t\t// Count of points in the line.\r\n\t\tpublic int Count;\r\n\t\t// Index in Matrix.\r\n\t\tpublic int Index;\r\n\t\t// The line is represented as all x,y that solve y*cos(alpha)-x*sin(alpha)=d\r\n\t\tpublic double Alpha;\r\n\t}\r\n\r\n\r\n\t// The range of angles to search for lines\r\n\tconst double ALPHA_START = -20;\r\n\tconst double ALPHA_STEP = 0.2;\r\n\tconst int STEPS = 40 * 5;\r\n\tconst double STEP = 1;\r\n\r\n\t// Precalculation of sin and cos.\r\n\tdouble[] _sinA;\r\n\tdouble[] _cosA;\r\n\r\n\t// Range of d\r\n\tdouble _min;\r\n\r\n\r\n\tint _count;\r\n\t// Count of points that fit in a line.\r\n\tint[] _hMatrix;\r\n\r\n\t// Calculate the skew angle of the image cBmp.\r\n\tpublic double GetSkewAngle (FreeImageBitmap image) {\r\n\t\tif (image.PixelFormat != System.Drawing.Imaging.PixelFormat.Format1bppIndexed) {\r\n\t\t\timage = image.GetColorConvertedInstance (FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE | FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_DITHER);\r\n\t\t}\r\n\t\timage.Save (\"m:\\\\1.png\");\r\n\t\t// Hough Transformation\r\n\t\tCalc (image);\r\n\r\n\t\t// Top 20 of the detected lines in the image.\r\n\t\tHougLine[] hl = GetTop (20);\r\n\r\n\t\t// Average angle of the lines\r\n\t\tdouble sum = 0;\r\n\t\tint count = 0;\r\n\t\tfor (int i = 0; i <= 19; i++) {\r\n\t\t\tsum += hl[i].Alpha;\r\n\t\t\tcount += 1;\r\n\t\t}\r\n\t\treturn sum / count;\r\n\t}\r\n\r\n\t// Calculate the Count lines in the image with most points.\r\n\tprivate HougLine[] GetTop (int count) {\r\n\t\tHougLine[] hl = new HougLine[count];\r\n\r\n\t\tfor (int i = 0; i <= count - 1; i++) {\r\n\t\t\thl[i] = new HougLine ();\r\n\t\t}\r\n\t\tfor (int i = 0; i <= _hMatrix.Length - 1; i++) {\r\n\t\t\tif (_hMatrix[i] > hl[count - 1].Count) {\r\n\t\t\t\thl[count - 1].Count = _hMatrix[i];\r\n\t\t\t\thl[count - 1].Index = i;\r\n\t\t\t\tint j = count - 1;\r\n\t\t\t\twhile (j > 0 && hl[j].Count > hl[j - 1].Count) {\r\n\t\t\t\t\tHougLine tmp = hl[j];\r\n\t\t\t\t\thl[j] = hl[j - 1];\r\n\t\t\t\t\thl[j - 1] = tmp;\r\n\t\t\t\t\tj -= 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (int i = 0; i <= count - 1; i++) {\r\n\t\t\tint dIndex = hl[i].Index / STEPS;\r\n\t\t\tint alphaIndex = hl[i].Index - dIndex * STEPS;\r\n\t\t\thl[i].Alpha = GetAlpha (alphaIndex);\r\n\t\t\t//hl[i].D = dIndex + _min;\r\n\t\t}\r\n\r\n\t\treturn hl;\r\n\t}\r\n\r\n\r\n\t// Hough Transforamtion:\r\n\tprivate void Calc (FreeImageBitmap image) {\r\n\t\tint hMin = image.Height / 4;\r\n\t\tint hMax = image.Height * 3 / 4;\r\n\r\n\t\tInit (image);\r\n\t\tScanline<FI1BIT> l1, l2;\r\n\r\n\t\tfor (int y = hMin; y <= hMax; y++) {\r\n\t\t\tl1 = image.GetScanline<FI1BIT> (y - 1);\r\n\t\t\tl2 = image.GetScanline<FI1BIT> (y);\r\n\t\t\tfor (int x = 1; x <= image.Width - 2; x++) {\r\n\t\t\t\t// Only lower edges are considered.\r\n\t\t\t\tif (l1[x] == FI1BIT.MinValue) {\r\n\t\t\t\t\tif (l2[x] == FI1BIT.MaxValue) {\r\n\t\t\t\t\t\tCalc (x, y);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Calculate all lines through the point (x,y).\r\n\tprivate void Calc (int x, int y) {\r\n\t\tint alpha;\r\n\r\n\t\tfor (alpha = 0; alpha <= STEPS - 1; alpha++) {\r\n\t\t\tdouble d = y * _cosA[alpha] - x * _sinA[alpha];\r\n\t\t\tint calculatedIndex = (int)CalcDIndex (d);\r\n\t\t\tint index = calculatedIndex * STEPS + alpha;\r\n\t\t\ttry {\r\n\t\t\t\t_hMatrix[index] += 1;\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tSystem.Diagnostics.Debug.WriteLine (ex.ToString ());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tprivate double CalcDIndex (double d) {\r\n\t\treturn Convert.ToInt32 (d - _min);\r\n\t}\r\n\r\n\tprivate void Init (FreeImageBitmap image) {\r\n\t\t// Precalculation of sin and cos.\r\n\t\t_cosA = new double[STEPS];\r\n\t\t_sinA = new double[STEPS];\r\n\r\n\t\tfor (int i = 0; i < STEPS; i++) {\r\n\t\t\tdouble angle = GetAlpha (i) * Math.PI / 180.0;\r\n\t\t\t_sinA[i] = Math.Sin (angle);\r\n\t\t\t_cosA[i] = Math.Cos (angle);\r\n\t\t}\r\n\r\n\t\t// Range of d:            \r\n\t\t_min = -image.Width;\r\n\t\t_count = (int)(2 * (image.Width + image.Height) / STEP);\r\n\t\t_hMatrix = new int[_count * STEPS];\r\n\r\n\r\n\t}\r\n\r\n\tprivate static double GetAlpha (int index) {\r\n\t\treturn ALPHA_START + index * ALPHA_STEP;\r\n\t}\r\n}\r\n\r\n\r\n//// AForge Image Processing Library\r\n//// AForge.NET framework\r\n//// http://www.aforgenet.com/framework/\r\n////\r\n//// Copyright © Andrew Kirillov, 2005-2010\r\n//// andrew.kirillov@aforgenet.com\r\n////\r\n//// Alejandro Pirola, 2008\r\n//// alejamp@gmail.com\r\n////\r\n\r\n//namespace PDFPatcher.Processor\r\n//{\r\n//    using System;\r\n//    using System.Collections;\r\n//    using System.Drawing;\r\n//    using System.Drawing.Imaging;\r\n//    using FreeImageAPI;\r\n\r\n//    /// <summary>\r\n//    /// Hough line.\r\n//    /// </summary>\r\n//    /// \r\n//    /// <remarks><para>Represents line of Hough Line transformation using\r\n//    /// <a href=\"http://en.wikipedia.org/wiki/Polar_coordinate_system\">polar coordinates</a>.\r\n//    /// See <a href=\"http://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates\">Wikipedia</a>\r\n//    /// for information on how to convert polar coordinates to Cartesian coordinates.\r\n//    /// </para>\r\n//    /// \r\n//    /// <para><note><see cref=\"HoughLineTransformation\">Hough Line transformation</see> does not provide\r\n//    /// information about lines start and end points, only slope and distance from image's center. Using\r\n//    /// only provided information it is not possible to draw the detected line as it exactly appears on\r\n//    /// the source image. But it is possible to draw a line through the entire image, which contains the\r\n//    /// source line (see sample code below).\r\n//    /// </note></para>\r\n//    /// \r\n//    /// <para>Sample code to draw detected Hough lines:</para>\r\n//    /// <code>\r\n//    /// HoughLineTransformation lineTransform = new HoughLineTransformation( );\r\n//    /// // apply Hough line transofrm\r\n//    /// lineTransform.ProcessImage( sourceImage );\r\n//    /// Bitmap houghLineImage = lineTransform.ToBitmap( );\r\n//    /// // get lines using relative intensity\r\n//    /// HoughLine[] lines = lineTransform.GetLinesByRelativeIntensity( 0.5 );\r\n//    /// \r\n//    /// foreach ( HoughLine line in lines )\r\n//    /// {\r\n//    ///     // get line's radius and theta values\r\n//    ///     int    r = line.Radius;\r\n//    ///     double t = line.Theta;\r\n//    ///     \r\n//    ///     // check if line is in lower part of the image\r\n//    ///     if ( r &lt; 0 )\r\n//    ///     {\r\n//    ///         t += 180;\r\n//    ///         r = -r;\r\n//    ///     }\r\n//    ///     \r\n//    ///     // convert degrees to radians\r\n//    ///     t = ( t / 180 ) * Math.PI;\r\n//    ///     \r\n//    ///     // get image centers (all coordinate are measured relative\r\n//    ///     // to center)\r\n//    ///     int w2 = image.Width /2;\r\n//    ///     int h2 = image.Height / 2;\r\n//    ///     \r\n//    ///     double x0 = 0, x1 = 0, y0 = 0, y1 = 0;\r\n//    ///     \r\n//    ///     if ( line.Theta != 0 )\r\n//    ///     {\r\n//    ///         // none-vertical line\r\n//    ///         x0 = -w2; // most left point\r\n//    ///         x1 = w2;  // most right point\r\n//    ///     \r\n//    ///         // calculate corresponding y values\r\n//    ///         y0 = ( -Math.Cos( t ) * x0 + r ) / Math.Sin( t );\r\n//    ///         y1 = ( -Math.Cos( t ) * x1 + r ) / Math.Sin( t );\r\n//    ///     }\r\n//    ///     else\r\n//    ///     {\r\n//    ///         // vertical line\r\n//    ///         x0 = line.Radius;\r\n//    ///         x1 = line.Radius;\r\n//    ///     \r\n//    ///         y0 = h2;\r\n//    ///         y1 = -h2;\r\n//    ///     }\r\n//    ///     \r\n//    ///     // draw line on the image\r\n//    ///     Drawing.Line( sourceData,\r\n//    ///         new IntPoint( (int) x0 + w2, h2 - (int) y0 ),\r\n//    ///         new IntPoint( (int) x1 + w2, h2 - (int) y1 ),\r\n//    ///         Color.Red );\r\n//    /// }\r\n//    /// </code>\r\n//    /// \r\n//    /// <para>To clarify meaning of <see cref=\"Radius\"/> and <see cref=\"Theta\"/> values\r\n//    /// of detected Hough lines, let's take a look at the below sample image and\r\n//    /// corresponding values of radius and theta for the lines on the image:\r\n//    /// </para>\r\n//    /// \r\n//    /// <img src=\"img/imaging/sample15.png\" width=\"400\" height=\"300\" />\r\n//    /// \r\n//    /// <para>Detected radius and theta values (color in corresponding colors):\r\n//    /// <list type=\"bullet\">\r\n//    /// <item><font color=\"#FF0000\">Theta = 90, R = 125, I = 249</font>;</item>\r\n//    /// <item><font color=\"#00FF00\">Theta = 0, R = -170, I = 187</font> (converts to Theta = 180, R = 170);</item>\r\n//    /// <item><font color=\"#0000FF\">Theta = 90, R = -58, I = 163</font> (converts to Theta = 270, R = 58);</item>\r\n//    /// <item><font color=\"#FFFF00\">Theta = 101, R = -101, I = 130</font> (converts to Theta = 281, R = 101);</item>\r\n//    /// <item><font color=\"#FF8000\">Theta = 0, R = 43, I = 112</font>;</item>\r\n//    /// <item><font color=\"#FF80FF\">Theta = 45, R = 127, I = 82</font>.</item>\r\n//    /// </list>\r\n//    /// </para>\r\n//    /// \r\n//    /// </remarks>\r\n//    /// \r\n//    /// <seealso cref=\"HoughLineTransformation\"/>\r\n//    /// \r\n//    public class HoughLine : IComparable\r\n//    {\r\n//        /// <summary>\r\n//        /// Line's slope - angle between polar axis and line's radius (normal going\r\n//        /// from pole to the line). Measured in degrees, [0, 180).\r\n//        /// </summary>\r\n//        public readonly double Theta;\r\n\r\n//        /// <summary>\r\n//        /// Line's distance from image center, (−∞, +∞).\r\n//        /// </summary>\r\n//        /// \r\n//        /// <remarks><note>Negative line's radius means, that the line resides in lower\r\n//        /// part of the polar coordinates system. This means that <see cref=\"Theta\"/> value\r\n//        /// should be increased by 180 degrees and radius should be made positive.\r\n//        /// </note></remarks>\r\n//        /// \r\n//        public readonly short Radius;\r\n\r\n//        /// <summary>\r\n//        /// Line's absolute intensity, (0, +∞).\r\n//        /// </summary>\r\n//        /// \r\n//        /// <remarks><para>Line's absolute intensity is a measure, which equals\r\n//        /// to number of pixels detected on the line. This value is bigger for longer\r\n//        /// lines.</para>\r\n//        /// \r\n//        /// <para><note>The value may not be 100% reliable to measure exact number of pixels\r\n//        /// on the line. Although these value correlate a lot (which means they are very close\r\n//        /// in most cases), the intensity value may slightly vary.</note></para>\r\n//        /// </remarks>\r\n//        /// \r\n//        public readonly short Intensity;\r\n\r\n//        /// <summary>\r\n//        /// Line's relative intensity, (0, 1].\r\n//        /// </summary>\r\n//        /// \r\n//        /// <remarks><para>Line's relative intensity is relation of line's <see cref=\"Intensity\"/>\r\n//        /// value to maximum found intensity. For the longest line (line with highest intesity) the\r\n//        /// relative intensity is set to 1. If line's relative is set 0.5, for example, this means\r\n//        /// its intensity is half of maximum found intensity.</para>\r\n//        /// </remarks>\r\n//        /// \r\n//        public readonly double RelativeIntensity;\r\n\r\n//        /// <summary>\r\n//        /// Initializes a new instance of the <see cref=\"HoughLine\"/> class.\r\n//        /// </summary>\r\n//        /// \r\n//        /// <param name=\"theta\">Line's slope.</param>\r\n//        /// <param name=\"radius\">Line's distance from image center.</param>\r\n//        /// <param name=\"intensity\">Line's absolute intensity.</param>\r\n//        /// <param name=\"relativeIntensity\">Line's relative intensity.</param>\r\n//        /// \r\n//        public HoughLine (double theta, short radius, short intensity, double relativeIntensity) {\r\n//            Theta = theta;\r\n//            Radius = radius;\r\n//            Intensity = intensity;\r\n//            RelativeIntensity = relativeIntensity;\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Compare the object with another instance of this class.\r\n//        /// </summary>\r\n//        /// \r\n//        /// <param name=\"value\">Object to compare with.</param>\r\n//        /// \r\n//        /// <returns><para>A signed number indicating the relative values of this instance and <b>value</b>: 1) greater than zero - \r\n//        /// this instance is greater than <b>value</b>; 2) zero - this instance is equal to <b>value</b>;\r\n//        /// 3) greater than zero - this instance is less than <b>value</b>.</para>\r\n//        /// \r\n//        /// <para><note>The sort order is descending.</note></para></returns>\r\n//        /// \r\n//        /// <remarks>\r\n//        /// <para><note>Object are compared using their <see cref=\"Intensity\">intensity</see> value.</note></para>\r\n//        /// </remarks>\r\n//        /// \r\n//        public int CompareTo (object value) {\r\n//            return (-Intensity.CompareTo (((HoughLine)value).Intensity));\r\n//        }\r\n//    }\r\n\r\n//    /// <summary>\r\n//    /// Skew angle checker for scanned documents.\r\n//    /// </summary>\r\n//    ///\r\n//    /// <remarks><para>The class implements document's skew checking algorithm, which is based\r\n//    /// on <see cref=\"HoughLineTransformation\">Hough line transformation</see>. The algorithm\r\n//    /// is based on searching for text base lines - black line of text bottoms' followed\r\n//    /// by white line below.</para>\r\n//    /// \r\n//    /// <para><note>The routine supposes that a white-background document is provided\r\n//    /// with black letters. The algorithm is not supposed for any type of objects, but for\r\n//    /// document images with text.</note></para>\r\n//    /// \r\n//    /// <para>The range of angles to detect is controlled by <see cref=\"MaxSkewToDetect\"/> property.</para>\r\n//    /// \r\n//    /// <para>The filter accepts 8 bpp grayscale images for processing.</para>\r\n//    /// \r\n//    /// <para>Sample usage:</para>\r\n//    /// <code>\r\n//    /// // create instance of skew checker\r\n//    /// DocumentSkewChecker skewChecker = new DocumentSkewChecker( );\r\n//    /// // get documents skew angle\r\n//    /// double angle = skewChecker.GetSkewAngle( documentImage );\r\n//    /// // create rotation filter\r\n//    /// RotateBilinear rotationFilter = new RotateBilinear( -angle );\r\n//    /// rotationFilter.FillColor = Color.White;\r\n//    /// // rotate image applying the filter\r\n//    /// Bitmap rotatedImage = rotationFilter.Apply( documentImage );\r\n//    /// </code>\r\n//    /// \r\n//    /// <para><b>Initial image:</b></para>\r\n//    /// <img src=\"img/imaging/sample10.png\" width=\"300\" height=\"184\" />\r\n//    /// <para><b>Deskewed image:</b></para>\r\n//    /// <img src=\"img/imaging/deskew.png\" width=\"335\" height=\"250\" /> \r\n//    /// </remarks>\r\n//    /// \r\n//    /// <seealso cref=\"HoughLineTransformation\"/>\r\n//    ///\r\n//    public class ImageDeskew\r\n//    {\r\n//        // Hough transformation: quality settings\r\n//        private int stepsPerDegree;\r\n//        private int houghHeight;\r\n//        private double thetaStep;\r\n//        private double maxSkewToDetect;\r\n\r\n//        // Hough transformation: precalculated Sine and Cosine values\r\n//        private double[] sinMap;\r\n//        private double[] cosMap;\r\n//        private bool needToInitialize = true;\r\n\r\n//        // Hough transformation: Hough map\r\n//        private short[,] houghMap;\r\n//        private short maxMapIntensity = 0;\r\n\r\n//        private int localPeakRadius = 4;\r\n//        private ArrayList lines = new ArrayList ();\r\n\r\n//        /// <summary>\r\n//        /// Steps per degree, [1, 10].\r\n//        /// </summary>\r\n//        /// \r\n//        /// <remarks><para>The value defines quality of Hough transform and its ability to detect\r\n//        /// line slope precisely.</para>\r\n//        /// \r\n//        /// <para>Default value is set to <b>1</b>.</para>\r\n//        /// </remarks>\r\n//        /// \r\n//        public int StepsPerDegree {\r\n//            get { return stepsPerDegree; }\r\n//            set {\r\n//                stepsPerDegree = Math.Max (1, Math.Min (10, value));\r\n//                needToInitialize = true;\r\n//            }\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Maximum skew angle to detect, [0, 45] degrees.\r\n//        /// </summary>\r\n//        /// \r\n//        /// <remarks><para>The value sets maximum document's skew angle to detect.\r\n//        /// Document's skew angle can be as positive (rotated counter clockwise), as negative\r\n//        /// (rotated clockwise). So setting this value to 25, for example, will lead to\r\n//        /// [-25, 25] degrees detection range.</para>\r\n//        ///\r\n//        /// <para>Scanned documents usually have skew in the [-20, 20] degrees range.</para>\r\n//        /// \r\n//        /// <para>Default value is set to <b>30</b>.</para>\r\n//        /// </remarks>\r\n//        /// \r\n//        public double MaxSkewToDetect {\r\n//            get { return maxSkewToDetect; }\r\n//            set {\r\n//                maxSkewToDetect = Math.Max (0, Math.Min (45, value));\r\n//                needToInitialize = true;\r\n//            }\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Minimum angle to detect skew in degrees.\r\n//        /// </summary>\r\n//        ///\r\n//        /// <remarks><para><note>The property is deprecated and setting it has not any effect.\r\n//        /// Use <see cref=\"MaxSkewToDetect\"/> property instead.</note></para></remarks>\r\n//        ///\r\n//        [Obsolete (\"The property is deprecated and setting it has not any effect. Use MaxSkewToDetect property instead.\")]\r\n//        public double MinBeta {\r\n//            get { return (-maxSkewToDetect); }\r\n//            set { }\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Maximum angle to detect skew in degrees.\r\n//        /// </summary>\r\n//        ///\r\n//        /// <remarks><para><note>The property is deprecated and setting it has not any effect.\r\n//        /// Use <see cref=\"MaxSkewToDetect\"/> property instead.</note></para></remarks>\r\n//        ///\r\n//        [Obsolete (\"The property is deprecated and setting it has not any effect. Use MaxSkewToDetect property instead.\")]\r\n//        public double MaxBeta {\r\n//            get { return (maxSkewToDetect); }\r\n//            set { }\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Radius for searching local peak value, [1, 10].\r\n//        /// </summary>\r\n//        /// \r\n//        /// <remarks><para>The value determines radius around a map's value, which is analyzed to determine\r\n//        /// if the map's value is a local maximum in specified area.</para>\r\n//        /// \r\n//        /// <para>Default value is set to <b>4</b>.</para></remarks>\r\n//        /// \r\n//        public int LocalPeakRadius {\r\n//            get { return localPeakRadius; }\r\n//            set { localPeakRadius = Math.Max (1, Math.Min (10, value)); }\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Initializes a new instance of the <see cref=\"DocumentSkewChecker\"/> class.\r\n//        /// </summary>\r\n//        public ImageDeskew () {\r\n//            StepsPerDegree = 10;\r\n//            MaxSkewToDetect = 30;\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Get skew angle of the provided document image.\r\n//        /// </summary>\r\n//        /// \r\n//        /// <param name=\"image\">Document's image to get skew angle of.</param>\r\n//        /// \r\n//        /// <returns>Returns document's skew angle. If the returned angle equals to -90,\r\n//        /// then document skew detection has failed.</returns>\r\n//        /// \r\n//        /// <exception cref=\"UnsupportedImageFormatException\">Unsupported pixel format of the source image.</exception>\r\n//        /// \r\n//        public double GetSkewAngle (FreeImageBitmap image) {\r\n//            return GetSkewAngle (image, new Rectangle (0, 0, image.Width, image.Height));\r\n//        }\r\n\r\n//        /// <summary>\r\n//        /// Get skew angle of the provided document image.\r\n//        /// </summary>\r\n//        /// \r\n//        /// <param name=\"image\">Document's image to get skew angle of.</param>\r\n//        /// <param name=\"rect\">Image's rectangle to process (used to exclude processing of\r\n//        /// regions, which are not relevant to skew detection).</param>\r\n//        /// \r\n//        /// <returns>Returns document's skew angle. If the returned angle equals to -90,\r\n//        /// then document skew detection has failed.</returns>\r\n//        /// \r\n//        /// <exception cref=\"UnsupportedImageFormatException\">Unsupported pixel format of the source image.</exception>\r\n//        /// \r\n//        public double GetSkewAngle (FreeImageBitmap image, Rectangle rect) {\r\n//            //image = image.GetColorConvertedInstance (FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE | FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);\r\n\r\n//            // init hough transformation settings\r\n//            InitHoughMap ();\r\n\r\n//            // get source image size\r\n//            int width = image.Width;\r\n//            int height = image.Height;\r\n//            int halfWidth = width / 2;\r\n//            int halfHeight = height / 2;\r\n\r\n//            // make sure the specified rectangle recides with the source image\r\n//            rect.Intersect (new Rectangle (0, 0, width, height));\r\n\r\n//            int startX = -halfWidth + rect.Left;\r\n//            int startY = -halfHeight + rect.Top;\r\n//            int stopX = width - halfWidth - (width - rect.Right);\r\n//            int stopY = height - halfHeight - (height - rect.Bottom) - 1;\r\n\r\n//            int offset = image.Stride - rect.Width;\r\n\r\n//            // calculate Hough map's width\r\n//            int halfHoughWidth = (int)Math.Sqrt (halfWidth * halfWidth + halfHeight * halfHeight);\r\n//            int houghWidth = halfHoughWidth * 2;\r\n\r\n//            houghMap = new short[houghHeight, houghWidth];\r\n\r\n//            #region do the job\r\n//            //using (Bitmap bmp = image.ToBitmap ()) {\r\n//            //    BitmapData d = bmp.LockBits (new Rectangle (0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);\r\n//            //    unsafe {\r\n//            //        byte* src = (byte*)d.Scan0.ToPointer () +\r\n//            //            rect.Top * d.Stride + rect.Left;\r\n//            //        byte* srcBelow = src + d.Stride;\r\n\r\n//            //        // for each row\r\n//            //        for (int y = startY; y < stopY; y++) {\r\n//            //            // for each pixel\r\n//            //            for (int x = startX; x < stopX; x++, src++, srcBelow++) {\r\n//            //                // if current pixel is more black\r\n//            //                // and pixel below is more white\r\n//            //                if ((*src < 128) && (*srcBelow >= 128)) {\r\n//            //                    // for each Theta value\r\n//            //                    for (int theta = 0; theta < houghHeight; theta++) {\r\n//            //                        int radius = (int)(cosMap[theta] * x - sinMap[theta] * y) + halfHoughWidth;\r\n\r\n//            //                        if ((radius < 0) || (radius >= houghWidth))\r\n//            //                            continue;\r\n\r\n//            //                        houghMap[theta, radius]++;\r\n//            //                    }\r\n//            //                }\r\n//            //            }\r\n//            //            src += offset;\r\n//            //            srcBelow += offset;\r\n//            //        }\r\n//            //    }\r\n//            //}\r\n//            #endregion\r\n//            Scanline<byte> src, srcBelow;\r\n\r\n//            // for each row\r\n//            for (int y = startY, l = height - 1; y < stopY; y++, l--) {\r\n//                src = image.GetScanline<byte> (l - 1);\r\n//                srcBelow = image.GetScanline<byte> (l);\r\n//                // for each pixel\r\n//                for (int x = startX, i = 0; x < stopX; x++, i++) {\r\n//                    // if current pixel is more black\r\n//                    // and pixel below is more white\r\n//                    if ((src[i] < 128) && (srcBelow[i] >= 128)) {\r\n//                        // for each Theta value\r\n//                        for (int theta = 0; theta < houghHeight; theta++) {\r\n//                            int radius = (int)(cosMap[theta] * x - sinMap[theta] * y) + halfHoughWidth;\r\n\r\n//                            if ((radius < 0) || (radius >= houghWidth))\r\n//                                continue;\r\n\r\n//                            houghMap[theta, radius]++;\r\n//                        }\r\n//                    }\r\n//                }\r\n//            }\r\n\r\n//            // find max value in Hough map\r\n//            maxMapIntensity = 0;\r\n//            for (int i = 0; i < houghHeight; i++) {\r\n//                for (int j = 0; j < houghWidth; j++) {\r\n//                    if (houghMap[i, j] > maxMapIntensity) {\r\n//                        maxMapIntensity = houghMap[i, j];\r\n//                    }\r\n//                }\r\n//            }\r\n\r\n//            CollectLines ((short)(width / 10));\r\n\r\n//            // get skew angle\r\n//            HoughLine[] hls = this.GetMostIntensiveLines (5);\r\n\r\n//            double skewAngle = 0;\r\n//            double sumIntensity = 0;\r\n\r\n//            foreach (HoughLine hl in hls) {\r\n//                if (hl.RelativeIntensity > 0.5) {\r\n//                    skewAngle += (hl.Theta * hl.RelativeIntensity);\r\n//                    sumIntensity += hl.RelativeIntensity;\r\n//                }\r\n//            }\r\n//            if (hls.Length > 0) skewAngle = skewAngle / sumIntensity;\r\n\r\n//            return skewAngle - 90.0;\r\n//        }\r\n\r\n//        // Get specified amount of lines with highest intensity\r\n//        private HoughLine[] GetMostIntensiveLines (int count) {\r\n//            // lines count\r\n//            int n = Math.Min (count, lines.Count);\r\n\r\n//            // result array\r\n//            HoughLine[] dst = new HoughLine[n];\r\n//            lines.CopyTo (0, dst, 0, n);\r\n\r\n//            return dst;\r\n//        }\r\n\r\n//        // Collect lines with intesities greater or equal then specified\r\n//        private void CollectLines (short minLineIntensity) {\r\n//            int maxTheta = houghMap.GetLength (0);\r\n//            int maxRadius = houghMap.GetLength (1);\r\n\r\n//            short intensity;\r\n//            bool foundGreater;\r\n\r\n//            int halfHoughWidth = maxRadius >> 1;\r\n\r\n//            // clean lines collection\r\n//            lines.Clear ();\r\n\r\n//            // for each Theta value\r\n//            for (int theta = 0; theta < maxTheta; theta++) {\r\n//                // for each Radius value\r\n//                for (int radius = 0; radius < maxRadius; radius++) {\r\n//                    // get current value\r\n//                    intensity = houghMap[theta, radius];\r\n\r\n//                    if (intensity < minLineIntensity)\r\n//                        continue;\r\n\r\n//                    foundGreater = false;\r\n\r\n//                    // check neighboors\r\n//                    for (int tt = theta - localPeakRadius, ttMax = theta + localPeakRadius; tt < ttMax; tt++) {\r\n//                        // skip out of map values\r\n//                        if (tt < 0)\r\n//                            continue;\r\n//                        if (tt >= maxTheta)\r\n//                            break;\r\n\r\n//                        // break if it is not local maximum\r\n//                        if (foundGreater == true)\r\n//                            break;\r\n\r\n//                        for (int tr = radius - localPeakRadius, trMax = radius + localPeakRadius; tr < trMax; tr++) {\r\n//                            // skip out of map values\r\n//                            if (tr < 0)\r\n//                                continue;\r\n//                            if (tr >= maxRadius)\r\n//                                break;\r\n\r\n//                            // compare the neighboor with current value\r\n//                            if (houghMap[tt, tr] > intensity) {\r\n//                                foundGreater = true;\r\n//                                break;\r\n//                            }\r\n//                        }\r\n//                    }\r\n\r\n//                    // was it local maximum ?\r\n//                    if (!foundGreater) {\r\n//                        // we have local maximum\r\n//                        lines.Add (new HoughLine (90.0 - maxSkewToDetect + (double)theta / stepsPerDegree, (short)(radius - halfHoughWidth), intensity, (double)intensity / maxMapIntensity));\r\n//                    }\r\n//                }\r\n//            }\r\n\r\n//            lines.Sort ();\r\n//        }\r\n\r\n//        // Init Hough settings and map\r\n//        private void InitHoughMap () {\r\n//            if (needToInitialize) {\r\n//                needToInitialize = false;\r\n\r\n//                houghHeight = (int)(2 * maxSkewToDetect * stepsPerDegree);\r\n//                thetaStep = (2 * maxSkewToDetect * Math.PI / 180) / houghHeight;\r\n\r\n//                // precalculate Sine and Cosine values\r\n//                sinMap = new double[houghHeight];\r\n//                cosMap = new double[houghHeight];\r\n\r\n//                double minTheta = 90.0 - maxSkewToDetect;\r\n\r\n//                for (int i = 0; i < houghHeight; i++) {\r\n//                    sinMap[i] = Math.Sin ((minTheta * Math.PI / 180) + (i * thetaStep));\r\n//                    cosMap[i] = Math.Cos ((minTheta * Math.PI / 180) + (i * thetaStep));\r\n//                }\r\n//            }\r\n//        }\r\n//    }\r\n//}\r\n\r\n/*namespace PDFPatcher.Processor\r\n{\r\n\tusing System;\r\n\tusing System.Collections;\r\n\tusing System.Collections.Generic;\r\n\tusing System.Data;\r\n\tusing System.Diagnostics;\r\n\tusing System.Drawing;\r\n\tusing System.Drawing.Imaging;\r\n\tusing FreeImageAPI;\r\n\r\n\t//public class main\r\n\t//{\r\n\t//    public static void Main () {\r\n\t//        string fnIn = \"d:\\\\skewsample_in.tif\";\r\n\t//        string fnOut = \"d:\\\\skewsample_out.tif\";\r\n\t//        Bitmap bmpIn = new Bitmap (fnIn);\r\n\t//        ImageDeskew sk = new ImageDeskew (bmpIn);\r\n\t//        double skewangle = sk.GetSkewAngle ();\r\n\t//        Bitmap bmpOut = RotateImage (bmpIn, -skewangle);\r\n\t//        bmpOut.Save (fnOut, ImageFormat.Tiff);\r\n\t//        Interaction.MsgBox (\"Skewangle: \" + skewangle);\r\n\t//    }\r\n\r\n\t//    private static Bitmap RotateImage (Bitmap bmp, double angle) {\r\n\t//        Graphics g = null;\r\n\t//        Bitmap tmp = new Bitmap (bmp.Width, bmp.Height, PixelFormat.Format32bppRgb);\r\n\r\n\t//        tmp.SetResolution (bmp.HorizontalResolution, bmp.VerticalResolution);\r\n\t//        g = Graphics.FromImage (tmp);\r\n\t//        try {\r\n\t//            g.FillRectangle (Brushes.White, 0, 0, bmp.Width, bmp.Height);\r\n\t//            g.RotateTransform ((float)angle);\r\n\t//            g.DrawImage (bmp, 0, 0);\r\n\t//        }\r\n\t//        finally {\r\n\t//            g.Dispose ();\r\n\t//        }\r\n\t//        return tmp;\r\n\t//    }\r\n\t//}\r\n\r\n\tpublic class ImageDeskew\r\n\t{\r\n\t\t// Representation of a line in the image.\r\n\t\tpublic class HougLine\r\n\t\t{\r\n\t\t\t// Count of points in the line.\r\n\t\t\tpublic int Count;\r\n\t\t\t// Index in Matrix.\r\n\t\t\tpublic int Index;\r\n\t\t\t// The line is represented as all x,y that solve y*cos(alpha)-x*sin(alpha)=d\r\n\t\t\tpublic double Alpha;\r\n\t\t\tpublic double d;\r\n\t\t}\r\n\t\t// The Bitmap\r\n\t\tFreeImageBitmap cBmp;\r\n\t\t// The range of angles to search for lines\r\n\t\tdouble cAlphaStart = -20;\r\n\t\tdouble cAlphaStep = 0.2;\r\n\t\tint cSteps = 40 * 5;\r\n\t\t// Precalculation of sin and cos.\r\n\t\tdouble[] cSinA;\r\n\t\tdouble[] cCosA;\r\n\t\t// Range of d\r\n\t\tdouble cDMin;\r\n\t\tdouble cDStep = 1;\r\n\t\tint cDCount;\r\n\t\t// Count of points that fit in a line.\r\n\r\n\t\tint[] cHMatrix;\r\n\t\tpublic static double GetSkewAngle (FreeImageBitmap bmp) {\r\n\t\t\treturn new ImageDeskew (bmp).GetSkewAngle ();\r\n\t\t}\r\n\r\n\t\t// Calculate the skew angle of the image cBmp.\r\n\t\tprivate double GetSkewAngle () {\r\n\t\t\tImageDeskew.HougLine[] hl = null;\r\n\t\t\tint i = 0;\r\n\t\t\tdouble sum = 0;\r\n\t\t\tint count = 0;\r\n\r\n\t\t\t// Hough Transformation\r\n\t\t\tCalc ();\r\n\t\t\t// Top 20 of the detected lines in the image.\r\n\t\t\thl = GetTop (20);\r\n\t\t\t// Average angle of the lines\r\n\t\t\tfor (i = 0; i <= 19; i++) {\r\n\t\t\t\tsum += hl[i].Alpha;\r\n\t\t\t\tcount += 1;\r\n\t\t\t}\r\n\t\t\treturn sum / count;\r\n\t\t}\r\n\r\n\t\t// Calculate the Count lines in the image with most points.\r\n\t\tprivate HougLine[] GetTop (int Count) {\r\n\t\t\tHougLine[] hl = null;\r\n\t\t\tint i = 0;\r\n\t\t\tint j = 0;\r\n\t\t\tHougLine tmp = null;\r\n\t\t\tint AlphaIndex = 0;\r\n\t\t\tint dIndex = 0;\r\n\r\n\t\t\thl = new HougLine[Count + 1];\r\n\t\t\tfor (i = 0; i <= Count - 1; i++) {\r\n\t\t\t\thl[i] = new HougLine ();\r\n\t\t\t}\r\n\t\t\tfor (i = 0; i <= cHMatrix.Length - 1; i++) {\r\n\t\t\t\tif (cHMatrix[i] > hl[Count - 1].Count) {\r\n\t\t\t\t\thl[Count - 1].Count = cHMatrix[i];\r\n\t\t\t\t\thl[Count - 1].Index = i;\r\n\t\t\t\t\tj = Count - 1;\r\n\t\t\t\t\twhile (j > 0 && hl[j].Count > hl[j - 1].Count) {\r\n\t\t\t\t\t\ttmp = hl[j];\r\n\t\t\t\t\t\thl[j] = hl[j - 1];\r\n\t\t\t\t\t\thl[j - 1] = tmp;\r\n\t\t\t\t\t\tj -= 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (i = 0; i <= Count - 1; i++) {\r\n\t\t\t\tdIndex = hl[i].Index / cSteps;\r\n\t\t\t\tAlphaIndex = hl[i].Index - dIndex * cSteps;\r\n\t\t\t\thl[i].Alpha = GetAlpha (AlphaIndex);\r\n\t\t\t\thl[i].d = dIndex + cDMin;\r\n\t\t\t}\r\n\t\t\treturn hl;\r\n\t\t}\r\n\t\tprivate ImageDeskew (FreeImageBitmap bmp) {\r\n\t\t\tcBmp = bmp;\r\n\t\t}\r\n\t\t// Hough Transforamtion:\r\n\t\tprivate void Calc () {\r\n\t\t\tint x = 0;\r\n\t\t\tint y = 0;\r\n\t\t\tint hMin = cBmp.Height / 4;\r\n\t\t\tint hMax = cBmp.Height * 3 / 4;\r\n\r\n\t\t\tInit ();\r\n\t\t\tfor (y = hMin; y <= hMax; y++) {\r\n\t\t\t\tfor (x = 1; x <= cBmp.Width - 2; x++) {\r\n\t\t\t\t\t// Only lower edges are considered.\r\n\t\t\t\t\tif (IsBlack (x, y)) {\r\n\t\t\t\t\t\tif (!IsBlack (x, y + 1)) {\r\n\t\t\t\t\t\t\tCalc (x, y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Calculate all lines through the point (x,y).\r\n\t\tprivate void Calc (int x, int y) {\r\n\t\t\tint alpha = 0;\r\n\t\t\tdouble d = 0;\r\n\t\t\tint dIndex = 0;\r\n\t\t\tint Index = 0;\r\n\r\n\t\t\tfor (alpha = 0; alpha <= cSteps - 1; alpha++) {\r\n\t\t\t\td = y * cCosA[alpha] - x * cSinA[alpha];\r\n\t\t\t\tdIndex = (int)CalcDIndex (d);\r\n\t\t\t\tIndex = dIndex * cSteps + alpha;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tcHMatrix[Index] += 1;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tDebug.WriteLine (ex.ToString ());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tprivate double CalcDIndex (double d) {\r\n\t\t\treturn Convert.ToInt32 (d - cDMin);\r\n\t\t}\r\n\t\tprivate bool IsBlack (int x, int y) {\r\n\t\t\tColor c = cBmp.GetPixel (x, y);\r\n\t\t\tdouble luminance = (c.R * 0.299) + (c.G * 0.587) + (c.B * 0.114);\r\n\t\t\treturn luminance < 140;\r\n\t\t}\r\n\t\tprivate void Init () {\r\n\t\t\tint i = 0;\r\n\t\t\tdouble angle = 0;\r\n\r\n\t\t\t// Precalculation of sin and cos.\r\n\t\t\tcSinA = new double[cSteps];\r\n\t\t\tcCosA = new double[cSteps];\r\n\t\t\tfor (i = 0; i <= cSteps - 1; i++) {\r\n\t\t\t\tangle = GetAlpha (i) * Math.PI / 180.0;\r\n\t\t\t\tcSinA[i] = Math.Sin (angle);\r\n\t\t\t\tcCosA[i] = Math.Cos (angle);\r\n\t\t\t}\r\n\t\t\t// Range of d:\r\n\t\t\tcDMin = -cBmp.Width;\r\n\t\t\tcDCount = (int)(2 * (cBmp.Width + cBmp.Height) / cDStep);\r\n\t\t\tcHMatrix = new int[cDCount * cSteps + 1];\r\n\t\t}\r\n\r\n\t\tprivate double GetAlpha (int Index) {\r\n\t\t\treturn cAlphaStart + Index * cAlphaStep;\r\n\t\t}\r\n\t}\r\n}\r\n*/"
  },
  {
    "path": "App/Processor/Imaging/ImageDisposition.cs",
    "content": "﻿using System;\r\nusing System.Diagnostics;\r\nusing iTextSharp.text.pdf.parser;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\t[DebuggerDisplay(\"{Image.InlineImage}: {X}*{XScale},{Y}*{YScale};Flip={Image.VerticalFlip}\")]\r\n\tinternal sealed class ImageDisposition : IComparable<ImageDisposition>\r\n\t{\r\n\t\tpublic ImageInfo Image { get; set; }\r\n\t\tpublic float X { get; }\r\n\t\tpublic float Y { get; }\r\n\t\tpublic float Z { get; }\r\n\t\tpublic Matrix Ctm { get; }\r\n\t\tpublic float XScale => Ctm[Matrix.I11] / Image.Width;\r\n\t\tpublic float YScale => Ctm[Matrix.I22] / Image.Height;\r\n\t\tpublic ImageDisposition(Matrix ctm, ImageInfo image) {\r\n\t\t\tImage = image;\r\n\t\t\tCtm = ctm;\r\n\t\t\tvar v = new Vector(0, 0, 1).Cross(ctm);\r\n\t\t\tX = v[0]; Y = v[1]; Z = v[2];\r\n\t\t\timage.VerticalFlip = Ctm[Matrix.I22] < 0;\r\n\t\t}\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn $\"{(Image.InlineImage.PdfRef != null ? Image.InlineImage.PdfRef.Number.ToText() : \"内嵌图像\")}:{X},{Y},{Z}\";\r\n\t\t}\r\n\r\n\t\t#region IComparable<ImageDisposition> 成员\r\n\r\n\t\tpublic int CompareTo(ImageDisposition other) {\r\n\t\t\treturn Y < other.Y ? 1 :\r\n\t\t\t\tY > other.Y ? -1 :\r\n\t\t\t\tX > other.X ? 1 :\r\n\t\t\t\tX < other.X ? -1 : 0;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/ImageInfo.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing FreeImageAPI;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\t[DebuggerDisplay(\"REF = {ReferenceCount}; Size = {Width} * {Height}; {PixelFormat}\")]\r\n\tinternal sealed class ImageInfo\r\n\t{\r\n\t\tpublic string FileName { get; set; }\r\n\t\tpublic int Width { get; set; }\r\n\t\tpublic int Height { get; set; }\r\n\t\tpublic int BitsPerComponent { get; private set; }\r\n\t\tpublic PixelFormat PixelFormat { get; private set; }\r\n\t\tpublic int ReferenceCount { get; set; }\r\n\t\tpublic bool VerticalFlip { get; set; }\r\n\t\tpublic string ExtName { get; private set; }\r\n\t\tpublic string LastDecodeError { get; private set; }\r\n\t\tpublic PdfName ColorSpace { get; private set; }\r\n\t\tpublic PdfName PaletteColorSpace { get; private set; }\r\n\t\tpublic byte[] PaletteBytes { get; private set; }\r\n\t\tpublic byte[] ICCProfile { get; private set; }\r\n\t\tpublic FreeImageBitmap Mask { get; private set; }\r\n\t\tpublic int PaletteEntryCount { get; private set; }\r\n\t\tpublic PdfImageData InlineImage { get; }\r\n\t\tpublic bool IsPageImage { get; }\r\n\r\n\t\tinternal ImageInfo() { }\r\n\t\tinternal ImageInfo(PdfImageData image) {\r\n\t\t\tInlineImage = image;\r\n\t\t}\r\n\t\tinternal ImageInfo(PdfIndirectReference pdfIndirect) {\r\n\t\t\tInlineImage = new PdfImageData(pdfIndirect);\r\n\t\t}\r\n\t\tinternal ImageInfo(PdfIndirectReference pdfIndirect, bool isPageImage) {\r\n\t\t\tInlineImage = new PdfImageData(pdfIndirect);\r\n\t\t\tIsPageImage = IsPageImage;\r\n\t\t}\r\n\t\tinternal ImageInfo(PRStream stream) {\r\n\t\t\tInlineImage = new PdfImageData(stream);\r\n\t\t}\r\n\t\tinternal byte[] DecodeImage(ImageExtracterOptions options) {\r\n\t\t\treturn DecodeImage(this, options);\r\n\t\t}\r\n\r\n\t\tprivate static byte[] DecodeImage(ImageInfo info, ImageExtracterOptions options) {\r\n\t\t\tbyte[] decodedBytes;\r\n\t\t\tvar data = info.InlineImage;\r\n\t\t\tinfo.ExtName = Constants.FileExtensions.Dat;\r\n\r\n\t\t\tinfo.Width = data.TryGetInt32(PdfName.WIDTH, 0);\r\n\t\t\tinfo.Height = data.TryGetInt32(PdfName.HEIGHT, 0);\r\n\t\t\tif (info.Width < options.MinWidth || info.Height < options.MinHeight) {\r\n\t\t\t\tif (info.InlineImage.PdfRef != null) {\r\n\t\t\t\t\tTracker.TraceMessage($\"忽略了一幅编号为 {info.InlineImage}，尺寸为 {info.Width}*{info.Height}的图像。\");\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tTracker.TraceMessage($\"忽略了一幅尺寸为 {info.Width}*{info.Height}的内嵌图像。\");\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tinfo.BitsPerComponent = data.TryGetInt32(PdfName.BITSPERCOMPONENT, 1);\r\n\t\t\tinfo.PixelFormat = PixelFormat.Format8bppIndexed;\r\n\t\t\tvar decParams = data.GetObjectDirectOrFromContainerArray(PdfName.DECODEPARMS, PdfObject.DICTIONARY);\r\n\t\t\tvar filters = data.GetObjectDirectOrFromContainerArray(PdfName.FILTER, PdfObject.NAME);\r\n\t\t\tdecodedBytes = DecodeStreamContent(data, filters);\r\n\t\t\tvar filter = filters.Count > 0 ? (filters[filters.Count - 1] as PdfName ?? PdfName.DEFAULT).ToString() : \"BMP\";\r\n\t\t\tvar decParam = decParams.Count > 0 ? decParams[decParams.Count - 1] as PdfDictionary : null;\r\n\t\t\tExportColorspace(data.GetDirectObject(PdfName.COLORSPACE), info);\r\n\t\t\tswitch (filter) {\r\n\t\t\t\tcase \"/DCTDecode\":\r\n\t\t\t\tcase \"/DCT\":\r\n\t\t\t\t\tinfo.ExtName = Constants.FileExtensions.Jpg;\r\n\t\t\t\t\tgoto case \"JPG\";\r\n\t\t\t\tcase \"/JPXDecode\":\r\n\t\t\t\tcase \"/JPX\":\r\n\t\t\t\t\tinfo.ExtName = Constants.FileExtensions.Jp2;\r\n\t\t\t\t\tgoto EXIT;\r\n\t\t\t\tcase \"/CCITTFaxDecode\":\r\n\t\t\t\tcase \"/CCF\":\r\n\t\t\t\tcase \"/JBIG2Decode\":\r\n\t\t\t\t\tinfo.ExtName = Constants.FileExtensions.Tif;\r\n\t\t\t\t\tvar k = 0;\r\n\t\t\t\t\tvar blackIs1 = false;\r\n\t\t\t\t\tvar byteAlign = false;\r\n\t\t\t\t\tvar endOfLine = false;\r\n\t\t\t\t\tvar endOfBlock = true;\r\n\t\t\t\t\tif (decParam != null) {\r\n\t\t\t\t\t\tk = decParam.TryGetInt32(PdfName.K, 0);\r\n\t\t\t\t\t\tblackIs1 = decParam.TryGetBoolean(PdfName.BLACKIS1, false);\r\n\t\t\t\t\t\tbyteAlign = decParam.TryGetBoolean(PdfName.ENCODEDBYTEALIGN, false);\r\n\t\t\t\t\t\tendOfBlock = decParam.TryGetBoolean(PdfName.ENDOFBLOCK, true);\r\n\t\t\t\t\t\tendOfLine = decParam.TryGetBoolean(PdfName.ENDOFLINE, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tblackIs1 = IsDecodeParamInverted(data, blackIs1);\r\n\t\t\t\t\tif (options.InvertBlackAndWhiteImages) {\r\n\t\t\t\t\t\tblackIs1 = !blackIs1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbyte[] outBuf;\r\n\t\t\t\t\tif (filter == \"/JBIG2Decode\") {\r\n\t\t\t\t\t\tvar globals = new byte[0];\r\n\t\t\t\t\t\tif (decParam != null) {\r\n\t\t\t\t\t\t\tvar gRef = decParam.GetAsIndirectObject(PdfName.JBIG2GLOBALS);\r\n\t\t\t\t\t\t\tif (gRef != null && PdfReader.GetPdfObjectRelease(gRef) is PRStream gs) {\r\n\t\t\t\t\t\t\t\tglobals = PdfReader.GetStreamBytes(gs);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\toutBuf = JBig2Decoder.Decode(decodedBytes, globals);\r\n\t\t\t\t\t\tif (outBuf == null) {\r\n\t\t\t\t\t\t\tinfo.LastDecodeError = \"导出 JBig2 编码图片失败。\";\r\n\t\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (blackIs1 == false) {\r\n\t\t\t\t\t\t\tInvertBits(outBuf);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\toutBuf = TiffHelper.Decode(info, decodedBytes, k, endOfLine, byteAlign, endOfBlock, blackIs1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tinfo.PixelFormat = PixelFormat.Format1bppIndexed;\r\n\t\t\t\t\tinfo.BitsPerComponent = 1;\r\n\t\t\t\t\tdecodedBytes = outBuf;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"/FlateDecode\":\r\n\t\t\t\tcase \"/Fl\":\r\n\t\t\t\tcase \"/LZWDecode\":\r\n\t\t\t\t\tinfo.ExtName = Constants.FileExtensions.Png;\r\n\t\t\t\t\tinfo.PixelFormat = GetPixelFormat(decodedBytes.Length, info);\r\n\t\t\t\t\tif (info.PixelFormat == PixelFormat.Undefined) {\r\n\t\t\t\t\t\tinfo.LastDecodeError = \"无法判定图像的颜色格式。\";\r\n\t\t\t\t\t\tinfo.ExtName = Constants.FileExtensions.Dat;\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (info.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\t\t\tblackIs1 = IsDecodeParamInverted(data, false);\r\n\t\t\t\t\t\tif (options.InvertBlackAndWhiteImages) {\r\n\t\t\t\t\t\t\tblackIs1 = !blackIs1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (blackIs1) {\r\n\t\t\t\t\t\t\tInvertBits(decodedBytes);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"BMP\":\r\n\t\t\t\t\tinfo.ExtName = Constants.FileExtensions.Png;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"JPG\":\r\n\t\t\t\t\tif (options.MergeImages == false) {\r\n\t\t\t\t\t\tgoto EXIT;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tusing (var ms = new MemoryStream(decodedBytes))\r\n\t\t\t\t\tusing (var bm = PdfName.DEVICECMYK.Equals(info.ColorSpace)\r\n\t\t\t\t\t\t? new FreeImageBitmap(ms, FREE_IMAGE_LOAD_FLAGS.JPEG_CMYK)\r\n\t\t\t\t\t\t: new FreeImageBitmap(ms)) {\r\n\t\t\t\t\t\tinfo.PixelFormat = bm.PixelFormat;\r\n\t\t\t\t\t\tswitch (bm.ColorType) {\r\n\t\t\t\t\t\t\tcase FREE_IMAGE_COLOR_TYPE.FIC_CMYK:\r\n\t\t\t\t\t\t\t\tinfo.ColorSpace = PdfName.DEVICECMYK;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase FREE_IMAGE_COLOR_TYPE.FIC_MINISBLACK:\r\n\t\t\t\t\t\t\tcase FREE_IMAGE_COLOR_TYPE.FIC_MINISWHITE:\r\n\t\t\t\t\t\t\t\tinfo.ColorSpace = PdfName.DEVICEGRAY;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase FREE_IMAGE_COLOR_TYPE.FIC_PALETTE:\r\n\t\t\t\t\t\t\t\tinfo.ColorSpace = PdfName.INDEXED;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase FREE_IMAGE_COLOR_TYPE.FIC_RGB:\r\n\t\t\t\t\t\t\tcase FREE_IMAGE_COLOR_TYPE.FIC_RGBALPHA:\r\n\t\t\t\t\t\t\t\tinfo.ColorSpace = PdfName.DEVICERGB;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tinfo.BitsPerComponent =\r\n\t\t\t\t\t\t\tinfo.PixelFormat == PixelFormat.Format1bppIndexed ? 1\r\n\t\t\t\t\t\t\t: info.PixelFormat == PixelFormat.Format4bppIndexed ? 4\r\n\t\t\t\t\t\t\t: 8;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgoto EXIT;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tinfo.PixelFormat = PixelFormat.Undefined;\r\n\t\t\t\t\tinfo.LastDecodeError = \"未支持的图像数据格式：\" + filter;\r\n\t\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (PdfName.DEVICECMYK.Equals(info.ColorSpace)) {\r\n\t\t\t\tinfo.ExtName = Constants.FileExtensions.Tif;\r\n\t\t\t}\r\n\t\tEXIT:\r\n\t\t\tPRStream sm;\r\n\t\t\tif (options.ExtractSoftMask\r\n\t\t\t\t&& (sm = (data.GetAsStream(PdfName.SMASK) as PRStream)\r\n\t\t\t\t\t?? (data.GetAsStream(PdfName.MASK) as PRStream)) != null\r\n\t\t\t\t) {\r\n\t\t\t\tvar mi = new ImageInfo(sm);\r\n\t\t\t\tvar mask = DecodeImage(mi, new ImageExtracterOptions() { InvertBlackAndWhiteImages = !options.InvertSoftMask });\r\n\t\t\t\tif (mask != null) {\r\n\t\t\t\t\tinfo.Mask = ImageExtractor.CreateFreeImageBitmap(mi, ref mask, options.VerticalFlipImages, false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn decodedBytes;\r\n\t\t}\r\n\r\n\t\tstatic void InvertBits(byte[] outBuf) {\r\n\t\t\tint len = outBuf.Length;\r\n\t\t\tfor (int t = 0; t < len; ++t) {\r\n\t\t\t\toutBuf[t] ^= 0xff;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void CreatePaletteAndIccProfile(FreeImageBitmap bmp) {\r\n\t\t\tif (PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\tColorSpace = PdfName.DEVICEGRAY;\r\n\t\t\t}\r\n\t\t\tCreatePalette(bmp);\r\n\t\t\tif (PaletteEntryCount > 0) {\r\n\t\t\t\tif (PaletteEntryCount < 3) {\r\n\t\t\t\t\tPixelFormat = PixelFormat.Format1bppIndexed;\r\n\t\t\t\t\tbmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP);\r\n\t\t\t\t}\r\n\t\t\t\telse if (PaletteEntryCount < 17) {\r\n\t\t\t\t\tif (PixelFormat != PixelFormat.Format4bppIndexed) {\r\n\t\t\t\t\t\tPixelFormat = PixelFormat.Format4bppIndexed;\r\n\t\t\t\t\t\tbmp.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_04_BPP);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (ICCProfile != null) {\r\n\t\t\t\tbmp.CreateICCProfile(ICCProfile);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid CreatePalette(FreeImageBitmap bmp) {\r\n\t\t\tif (bmp.HasPalette == false) {\r\n\t\t\t\tTrace.WriteLine(\"Bitmap does not have palette.\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar pal = bmp.Palette;\r\n\t\t\tif (PdfName.DEVICEGRAY.Equals(PaletteColorSpace)) {\r\n\t\t\t\tif (PaletteBytes == null) {\r\n\t\t\t\t\tpal.CreateGrayscalePalette();\r\n\t\t\t\t\tPaletteEntryCount = pal.Count;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar pattern = PaletteBytes;\r\n\t\t\t\t\tvar l = pattern.Length;\r\n\t\t\t\t\tvar l2 = pal.Count;\r\n\t\t\t\t\tint i;\r\n\t\t\t\t\tbyte p;\r\n\t\t\t\t\tfor (i = 0; i < l && i < l2; i++) {\r\n\t\t\t\t\t\tp = pattern[i];\r\n\t\t\t\t\t\tpal.SetValue(new RGBQUAD(Color.FromArgb(p, p, p)), i);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tPaletteEntryCount = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar pattern = PaletteBytes;\r\n\t\t\t\tif (pattern == null) {\r\n\t\t\t\t\tbmp.Palette.CreateGrayscalePalette();\r\n\t\t\t\t\tPaletteEntryCount = bmp.Palette.Count;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar i = 0;\r\n\t\t\t\t\tvar l = pattern.Length;\r\n\t\t\t\t\tvar l2 = pal.Count;\r\n\t\t\t\t\tfor (int pi = 0; pi < l && i < l2; pi++) {\r\n\t\t\t\t\t\tpal.SetValue(new RGBQUAD(Color.FromArgb(pattern[pi++], pi < l ? pattern[pi++] : 0, pi < l ? pattern[pi] : 0)), i);\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tPaletteEntryCount = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic bool IsDecodeParamInverted(PdfDictionary data, bool blackIs1) {\r\n\t\t\tvar a = data.GetAsArray(PdfName.DECODE);\r\n\t\t\tif (a?.Size == 2 && a[0].Type == PdfObject.NUMBER) {\r\n\t\t\t\tblackIs1 = ((PdfNumber)a[0]).IntValue == (blackIs1 ? 0 : 1);\r\n\t\t\t}\r\n\t\t\treturn blackIs1;\r\n\t\t}\r\n\r\n\t\tstatic byte[] DecodeStreamContent(PdfImageData data, IList<PdfObject> filters) {\r\n\t\t\tvar buffer = data.RawBytes;\r\n\t\t\tif (filters.Count == 0) {\r\n\t\t\t\treturn buffer;\r\n\t\t\t}\r\n\t\t\tvar dp = new List<PdfObject>();\r\n\t\t\tvar dpo = PdfReader.GetPdfObjectRelease(data.Get(PdfName.DECODEPARMS));\r\n\t\t\tif (dpo == null || (!dpo.IsDictionary() && !dpo.IsArray()))\r\n\t\t\t\tdpo = PdfReader.GetPdfObjectRelease(data.Get(PdfName.DP));\r\n\t\t\tif (dpo != null) {\r\n\t\t\t\tif (dpo.IsDictionary())\r\n\t\t\t\t\tdp.Add(dpo);\r\n\t\t\t\telse if (dpo.IsArray())\r\n\t\t\t\t\tdp = ((PdfArray)dpo).ArrayList;\r\n\t\t\t}\r\n\r\n\t\t\tfor (int i = 0; i < filters.Count; i++) {\r\n\t\t\t\tvar name = (filters[i] as PdfName).ToString();\r\n\t\t\t\tswitch (name) {\r\n\t\t\t\t\tcase \"/FlateDecode\":\r\n\t\t\t\t\tcase \"/Fl\":\r\n\t\t\t\t\t\tbuffer = PdfReader.FlateDecode(buffer);\r\n\t\t\t\t\t\tgoto case \"DecodePredictor\";\r\n\t\t\t\t\tcase \"/ASCIIHexDecode\":\r\n\t\t\t\t\tcase \"/AHx\":\r\n\t\t\t\t\t\tbuffer = PdfReader.ASCIIHexDecode(buffer);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"/ASCII85Decode\":\r\n\t\t\t\t\tcase \"/A85\":\r\n\t\t\t\t\t\tbuffer = PdfReader.ASCII85Decode(buffer);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"/LZWDecode\":\r\n\t\t\t\t\t\tbuffer = PdfReader.LZWDecode(buffer);\r\n\t\t\t\t\t\tgoto case \"DecodePredictor\";\r\n\t\t\t\t\tcase \"/Crypt\":\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"/DCTDecode\":\r\n\t\t\t\t\tcase \"/JPXDecode\":\r\n\t\t\t\t\tcase \"/CCITTFaxDecode\":\r\n\t\t\t\t\tcase \"/JBIG2Decode\":\r\n\t\t\t\t\t\tif (i != filters.Count - 1) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"文件格式错误：\" + name + \" 解码器不是最后一个解码器。\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"DecodePredictor\":\r\n\t\t\t\t\t\tif (i < dp.Count) {\r\n\t\t\t\t\t\t\tbuffer = PdfReader.DecodePredictor(buffer, (PdfObject)dp[i]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tTrace.WriteLine(Tracker.Category.Error, \"不支持的流编码格式：\" + name);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn buffer;\r\n\t\t}\r\n\r\n\t\tstatic PixelFormat GetPixelFormat(int byteLength, ImageInfo info) {\r\n\t\t\tvar pf = PixelFormat.Undefined;\r\n\t\t\tvar components = byteLength / info.Width / info.Height;\r\n\t\t\tswitch (info.BitsPerComponent) {\r\n\t\t\t\tcase 1: pf = PixelFormat.Format1bppIndexed; break;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tpf = PixelFormat.Format1bppIndexed;\r\n\t\t\t\t\tTrace.WriteLine(\"Warning: unsupported bpc = 2\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 4: pf = PixelFormat.Format4bppIndexed; break;\r\n\t\t\t\tcase 8:\r\n\t\t\t\t\tswitch (components) {\r\n\t\t\t\t\t\tcase 0: // 兼容异常图片（github：#119）\r\n\t\t\t\t\t\t\tTrace.WriteLine(\"Warning: Not enough bytes.\");\r\n\t\t\t\t\t\t\tgoto case 1;\r\n\t\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\t\tpf = PixelFormat.Format8bppIndexed;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\t\tpf = PixelFormat.Format16bppRgb555;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\t\tpf = PixelFormat.Format24bppRgb;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\t\tpf = PixelFormat.Format32bppRgb;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tTrace.WriteLine(\"Warning: Unknown colors.\");\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 16:\r\n\t\t\t\t\tpf = PixelFormat.Format48bppRgb;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tDebug.WriteLine(\"Warning: bitsPerComponent missing or incorrect (\" + info.BitsPerComponent + \").\");\r\n\t\t\t\t\tif (components > 0) {\r\n\t\t\t\t\t\tgoto case 8;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar areaPixels = (info.Width + 7) / 8 * info.Height;\r\n\t\t\t\t\t\tswitch (areaPixels / byteLength) {\r\n\t\t\t\t\t\t\tcase 1: pf = PixelFormat.Format1bppIndexed; info.BitsPerComponent = 1; break;\r\n\t\t\t\t\t\t\tcase 2: pf = PixelFormat.Format1bppIndexed; info.BitsPerComponent = 2; break;\r\n\t\t\t\t\t\t\tcase 4: pf = PixelFormat.Format4bppIndexed; info.BitsPerComponent = 4; break;\r\n\t\t\t\t\t\t\tdefault: pf = PixelFormat.Format8bppIndexed; info.BitsPerComponent = 8; break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn pf;\r\n\t\t}\r\n\r\n\t\tstatic void ExportColorspace(PdfObject cs, ImageInfo info) {\r\n\t\t\tif (cs == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tinfo.ColorSpace = cs as PdfName;\r\n\t\t\tif (info.ColorSpace != null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (cs.Type != PdfObject.ARRAY) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar colorspace = (PdfArray)cs;\r\n\t\t\t// todo: 是否需要将所有 ColorSpace 换成 PaletteColorSpace\r\n\t\t\tif (PdfName.ICCBASED.Equals(colorspace.GetAsName(0))) {\r\n\t\t\t\tinfo.ColorSpace = ((PRStream)colorspace.GetDirectObject(1)).GetAsName(PdfName.ALTERNATE);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (PdfName.INDEXED.Equals(colorspace.GetAsName(0))) {\r\n\t\t\t\tvar o = colorspace.GetDirectObject(1);\r\n\t\t\t\tinfo.PaletteColorSpace = o as PdfName;\r\n\t\t\t\tif (info.PaletteColorSpace == null && o is PdfArray arr && arr.Size == 2) {\r\n\t\t\t\t\tif (PdfName.ICCBASED.Equals(arr.GetAsName(0)) && arr.Size == 2) {\r\n\t\t\t\t\t\tvar iccs = arr.GetDirectObject(1) as PRStream;\r\n\t\t\t\t\t\tinfo.ColorSpace = iccs.GetAsName(PdfName.ALTERNATE) ?? PdfName.DEVICERGB;\r\n\t\t\t\t\t\tinfo.ICCProfile = PdfReader.GetStreamBytes(iccs);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tinfo.ColorSpace = arr.GetAsName(0);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar csp = colorspace.GetDirectObject(3);\r\n\t\t\t\tif (csp.IsString()) {\r\n\t\t\t\t\tinfo.PaletteBytes = ((PdfString)csp).GetOriginalBytes();\r\n\t\t\t\t}\r\n\t\t\t\telse if (csp is PRStream s) {\r\n\t\t\t\t\tinfo.PaletteBytes = PdfReader.GetStreamBytes(s);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ConvertDecodedBytes(ref byte[] bytes) {\r\n\t\t\tif (PixelFormat == PixelFormat.Format24bppRgb) {\r\n\t\t\t\t// from RGB array to BGR GDI+ data\r\n\t\t\t\tbyte b;\r\n\t\t\t\tfor (int i = 0; i < bytes.Length; i += 3) {\r\n\t\t\t\t\tb = bytes[i];\r\n\t\t\t\t\tbytes[i] = bytes[i + 2];\r\n\t\t\t\t\tbytes[i + 2] = b;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (PixelFormat == PixelFormat.Format1bppIndexed && BitsPerComponent == 2) {\r\n\t\t\t\t// 支持四级灰度的图像\r\n\t\t\t\tvar l = bytes.Length;\r\n\t\t\t\tvar newBytes = new byte[l << 1];\r\n\t\t\t\tvar i = 0;\r\n\t\t\t\tforeach (var b in bytes) {\r\n\t\t\t\t\tnewBytes[i++] = (byte)(((b & 0xC0) >> 0x02) + ((b & 0x30) >> 0x04));\r\n\t\t\t\t\tnewBytes[i++] = (byte)(((b & 0x0C) << 0x02) + (b & 0x03));\r\n\t\t\t\t}\r\n\t\t\t\tif (PaletteBytes != null) {\r\n\t\t\t\t\tvar pattern = PaletteBytes;\r\n\t\t\t\t\tArray.Resize(ref pattern, 16 * 3);\r\n\t\t\t\t\tPaletteBytes = pattern;\r\n\t\t\t\t}\r\n\t\t\t\tPixelFormat = PixelFormat.Format4bppIndexed;\r\n\t\t\t\tBitsPerComponent = 4;\r\n\t\t\t\tColorSpace = PdfName.DEVICEGRAY;\r\n\t\t\t\tbytes = newBytes;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t}\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/JBig2Decoder.cs",
    "content": "﻿using System;\r\nusing System.Runtime.InteropServices;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tinternal static class JBig2Decoder\r\n\t{\r\n\t\tinternal const string DLL = \"jbig2.dll\";\r\n\t\tconst int JBIG2_OPTIONS_EMBEDDED = 1;\r\n\r\n\t\tinternal static byte[] Decode(byte[] data, byte[] globals) {\r\n\t\t\tIntPtr ctxptr = IntPtr.Zero, globalptr = IntPtr.Zero;\r\n\t\t\tIntPtr imageptr;\r\n\t\t\tbyte[] decodedData = null;\r\n\t\t\tint c;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tctxptr = NativeMethods.New(IntPtr.Zero);\r\n\t\t\t\tif (globals != null && globals.Length > 0) {\r\n\t\t\t\t\tc = NativeMethods.ReadData(ctxptr, globals, (uint)globals.Length);\r\n\t\t\t\t\tglobalptr = NativeMethods.MakeGlobal(ctxptr);\r\n\t\t\t\t\tctxptr = NativeMethods.New(globalptr);\r\n\t\t\t\t}\r\n\t\t\t\tc = NativeMethods.ReadData(ctxptr, data, (uint)data.Length);\r\n\t\t\t\tc = NativeMethods.CompletePage(ctxptr);\r\n\t\t\t\tif ((imageptr = NativeMethods.Decode(ctxptr)) != IntPtr.Zero) {\r\n\t\t\t\t\tvar image = Common.PInvokeHelper.Unwrap<JBig2Image>(imageptr);\r\n\t\t\t\t\tdecodedData = image.GetData();\r\n\t\t\t\t\tNativeMethods.ReleasePage(ctxptr, imageptr);\r\n\t\t\t\t}\r\n\t\t\t\treturn decodedData;\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (globalptr != IntPtr.Zero) {\r\n\t\t\t\t\tNativeMethods.Free(globalptr);\r\n\t\t\t\t}\r\n\t\t\t\tif (ctxptr != IntPtr.Zero) {\r\n\t\t\t\t\tNativeMethods.Free(ctxptr);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic class NativeMethods\r\n\t\t{\r\n\t\t\tinternal static IntPtr New(IntPtr globalCtx) {\r\n\t\t\t\treturn New(IntPtr.Zero, JBIG2_OPTIONS_EMBEDDED, globalCtx, null, IntPtr.Zero, 0, 19);\r\n\t\t\t}\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_ctx_new_imp\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\textern static IntPtr New(IntPtr allocator, int options, IntPtr globalCtx, Jbig2ErrorCallback error_callback, IntPtr error_callback_data, int major, int minor);\r\n\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_ctx_free\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\tinternal extern static IntPtr Free(IntPtr ctx);\r\n\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_complete_page\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\tinternal extern static int CompletePage(IntPtr ctx);\r\n\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_data_in\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\tinternal extern static int ReadData(IntPtr ctx, [InAttribute()] byte[] bytes, uint length);\r\n\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_make_global_ctx\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\tinternal extern static IntPtr MakeGlobal(IntPtr ctx);\r\n\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_page_out\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\tinternal extern static IntPtr Decode(IntPtr ctx);\r\n\r\n\t\t\t[DllImport(DLL, EntryPoint = \"jbig2_release_page\", CallingConvention = CallingConvention.Cdecl)]\r\n\t\t\tinternal extern static void ReleasePage(IntPtr ctx, IntPtr image);\r\n\r\n\t\t\tstatic int ErrorCallback(IntPtr data, [InAttribute()] string msg, Jbig2Severity severity, int seg_idx) {\r\n\t\t\t\tSystem.Diagnostics.Debug.WriteLine(msg);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/JBig2Encoder.cs",
    "content": "﻿using System;\r\nusing System.Runtime.InteropServices;\r\nusing FreeImageAPI;\r\nusing System.Drawing.Imaging;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tstatic class JBig2Encoder\r\n\t{\r\n\t\tconst uint White = 0x00FFFFFF;\r\n\r\n\t\tinternal static byte[] Encode(FreeImageBitmap fi) {\r\n\t\t\tbool zeroIsWhite = fi.HasPalette && (fi.Palette.Data[0].uintValue & White) == White;\r\n\t\t\tusing (var bmp = fi.ToBitmap()) {\r\n\t\t\t\tvar bits = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format1bppIndexed);\r\n\t\t\t\tvar bytes = Encode(bmp.Width, bmp.Height, bits.Stride, zeroIsWhite, bits.Scan0);\r\n\t\t\t\tbmp.UnlockBits(bits);\r\n\t\t\t\treturn bytes;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic byte[] Encode(int width, int height, int stride, bool zeroIsWhite, IntPtr b) {\r\n\t\t\tint l = 0;\r\n\t\t\tvar r = NativeMethods.Encode(width, height, stride, zeroIsWhite, b, ref l);\r\n\t\t\tvar result = new byte[l];\r\n\t\t\tMarshal.Copy(r, result, 0, l);\r\n\t\t\tNativeMethods.Release(r);\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tstatic class NativeMethods\r\n\t\t{\r\n\t\t\t[DllImport(JBig2Decoder.DLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = \"jbig2_encode\")]\r\n\t\t\tinternal static extern IntPtr Encode(int width, int height, int stride, bool zeroIsWhite, IntPtr data, ref int length);\r\n\r\n\t\t\t[DllImport(JBig2Decoder.DLL, CallingConvention = CallingConvention.Cdecl, EntryPoint = \"jbig2_freemem\")]\r\n\t\t\tinternal static extern IntPtr Release(IntPtr data);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/JBig2Structs.cs",
    "content": "﻿using System;\r\nusing System.Runtime.InteropServices;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\t[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi, ThrowOnUnmappableChar = false)]\r\n\tpublic delegate int Jbig2ErrorCallback(System.IntPtr data, [InAttribute()][MarshalAsAttribute(UnmanagedType.LPStr)] string msg, Jbig2Severity severity, int seg_idx);\r\n\r\n\tpublic enum Jbig2Severity\r\n\t{\r\n\t\tJBIG2_SEVERITY_DEBUG,\r\n\t\tJBIG2_SEVERITY_INFO,\r\n\t\tJBIG2_SEVERITY_WARNING,\r\n\t\tJBIG2_SEVERITY_FATAL,\r\n\t}\r\n\r\n\t[StructLayout(LayoutKind.Sequential)]\r\n\tinternal sealed class JBig2Ctx\r\n\t{\r\n\t\treadonly IntPtr /*Jbig2Allocator **/allocator;\r\n\t\treadonly int options;\r\n\t\treadonly IntPtr /*const Jbig2Ctx **/global_ctx;\r\n\t\treadonly Jbig2ErrorCallback error_callback;\r\n\t\treadonly IntPtr /*void **/error_callback_data;\r\n\t\treadonly IntPtr /*byte **/buf;\r\n\t\treadonly int buf_size;\r\n\t\treadonly int buf_rd_ix;\r\n\t\treadonly int buf_wr_ix;\r\n\t\treadonly int/*Jbig2FileState*/ state;\r\n\t\treadonly byte file_header_flags;\r\n\t\treadonly int n_pages;\r\n\t\treadonly int n_segments_max;\r\n\t\treadonly IntPtr /*Jbig2Segment ***/segments;\r\n\t\treadonly int n_segments; /* index of last segment header parsed */\r\n\t\treadonly int segment_index;    /* index of last segment body parsed */\r\n\r\n\t\t/* list of decoded pages, including the one in progress,\r\n\t\t   currently stored as a contiguous, 0-indexed array. */\r\n\t\treadonly int current_page;\r\n\t\treadonly int max_page_index;\r\n\t\treadonly IntPtr /*Jbig2Page **/pages;\r\n\t}\r\n\r\n\t[StructLayout(LayoutKind.Sequential)]\r\n\tinternal sealed class JBig2Image\r\n\t{\r\n\t\treadonly int Width;\r\n\t\treadonly int Height;\r\n\t\treadonly int Stride;\r\n\t\treadonly IntPtr Data;\r\n\t\treadonly int RefCount;\r\n\t\tpublic byte[] GetData() {\r\n\t\t\tvar result = new byte[Height * Stride];\r\n\t\t\tMarshal.Copy(Data, result, 0, result.Length);\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/JpgHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Text.RegularExpressions;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tstatic class JpgHelper\r\n\t{\r\n\t\tstatic readonly ImageCodecInfo _jpgCodec = BitmapHelper.GetCodec(\"image/jpeg\");\r\n\t\tstatic EncoderParameters GetEncoderParameters(int quality) {\r\n\t\t\treturn new EncoderParameters(2) {\r\n\t\t\t\tParam = new EncoderParameter[] {\r\n\t\t\t\t\tnew EncoderParameter (Encoder.Compression, (long)EncoderValue.RenderProgressive),\r\n\t\t\t\t\tnew EncoderParameter (Encoder.Quality, quality)\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t\t// JPEG 编码器不支持 8 位图像输出\r\n\t\tstatic EncoderParameters GetEncoderParameters(int quality, int colorDepth) {\r\n\t\t\treturn new EncoderParameters(3) {\r\n\t\t\t\tParam = new EncoderParameter[] {\r\n\t\t\t\t\tnew EncoderParameter (Encoder.Compression, (long)EncoderValue.RenderProgressive),\r\n\t\t\t\t\tnew EncoderParameter (Encoder.Quality, quality),\r\n\t\t\t\t\tnew EncoderParameter (Encoder.ColorDepth, colorDepth)\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tinternal static void Save(this System.Drawing.Image bmp, string fileName, int quality) {\r\n\t\t\t//if (bmp.IsIndexed ()) {\r\n\t\t\t//    bmp.Save (fileName, _jpgCodec, GetEncoderParameters (quality, 8));\r\n\t\t\t//}\r\n\t\t\t//else {\r\n\t\t\tusing (var p = GetEncoderParameters(quality)) {\r\n\t\t\t\tbmp.Save(fileName, _jpgCodec, p);\r\n\t\t\t\tforeach (var item in p.Param) {\r\n\t\t\t\t\titem.Dispose();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//}\r\n\t\t}\r\n\r\n\t\tinternal static void Save(this System.Drawing.Image bmp, Stream stream, int quality) {\r\n\t\t\tusing (var p = GetEncoderParameters(quality)) {\r\n\t\t\t\tbmp.Save(stream, _jpgCodec, p);\r\n\t\t\t\tforeach (var item in p.Param) {\r\n\t\t\t\t\titem.Dispose();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static bool TryGetExifOrientation(string fileName, out ushort b) {\r\n\t\t\ttry {\r\n\t\t\t\tusing (var r = new ExifReader(fileName)) {\r\n\t\t\t\t\treturn r.GetTagValue(ExifTags.Orientation, out b);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\tb = 0;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// A class for reading Exif data from a JPEG file. The file will be open for reading for as long as the class exists.\r\n\t\t/// <seealso cref=\"http://gvsoft.homedns.org/exif/Exif-explanation.html\"/>\r\n\t\t/// </summary>\r\n\t\tsealed class ExifReader : IDisposable\r\n\t\t{\r\n\t\t\tprivate static readonly Regex _nullDateTimeMatcher = new Regex(@\"^[\\s0]{4}[:\\s][\\s0]{2}[:\\s][\\s0]{5}[:\\s][\\s0]{2}[:\\s][\\s0]{2}$\");\r\n\r\n\t\t\tprivate readonly bool _leaveOpen;\r\n\t\t\tprivate Stream _stream;\r\n\t\t\tprivate BinaryReader _reader;\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// The main tag id/absolute file offset catalogue\r\n\t\t\t/// </summary>\r\n\t\t\tprivate Dictionary<ushort, long> _ifd0Catalogue;\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// The thumbnail tag id/absolute file offset catalogue\r\n\t\t\t/// </summary>\r\n\t\t\t/// <remarks>JPEG images contain 2 main sections - one for the main image (which contains most of the useful EXIF data), and one for the thumbnail\r\n\t\t\t/// image (which contains little more than the thumbnail itself). This catalogue is only used by <see cref=\"GetJpegThumbnailBytes\"/>.</remarks>\r\n\t\t\tprivate Dictionary<ushort, long> _ifd1Catalogue;\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Indicates whether to read data using big or little endian byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\tprivate bool _isLittleEndian;\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// The position in the filestream at which the TIFF header starts\r\n\t\t\t/// </summary>\r\n\t\t\tprivate long _tiffHeaderStart;\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// The location of the thumbnail IFD\r\n\t\t\t/// </summary>\r\n\t\t\tprivate uint _ifd1Offset;\r\n\r\n\t\t\tprivate bool _isInitialized;\r\n\r\n\t\t\tpublic ExifReader(string fileName)\r\n\t\t\t\t: this(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { }\r\n\r\n\t\t\tpublic ExifReader(Stream stream)\r\n\t\t\t\t: this(stream, false) { }\r\n\r\n\t\t\tpublic ExifReader(Stream stream, bool leaveOpen) {\r\n\t\t\t\tif (stream == null)\r\n\t\t\t\t\tthrow new ArgumentNullException(\"stream\");\r\n\r\n\t\t\t\tif (!stream.CanSeek)\r\n\t\t\t\t\tthrow new ExifLibException(\"ExifLib requires a seekable stream\");\r\n\r\n\t\t\t\t// Leave the stream open if the user wants it so\r\n\t\t\t\t_leaveOpen = leaveOpen;\r\n\t\t\t\t_stream = stream;\r\n\t\t\t}\r\n\r\n\t\t\tprivate void Initialize() {\r\n\t\t\t\tif (_isInitialized)\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t_isInitialized = true;\r\n\r\n\t\t\t\t// JPEG encoding uses big endian (i.e. Motorola) byte aligns. The TIFF encoding\r\n\t\t\t\t// found later in the document will specify the byte aligns used for the\r\n\t\t\t\t// rest of the document.\r\n\t\t\t\t_isLittleEndian = false;\r\n\r\n\t\t\t\t// Open the file in a stream            \r\n\t\t\t\t_reader = new BinaryReader(_stream, System.Text.Encoding.UTF8);\r\n\r\n\t\t\t\t// Make sure the file's a JPEG.\r\n\t\t\t\tif (ReadUShort() != 0xFFD8)\r\n\t\t\t\t\tthrow new ExifLibException(\"File is not a valid JPEG\");\r\n\r\n\t\t\t\t// Scan to the start of the Exif content\r\n\t\t\t\tReadToExifStart();\r\n\r\n\t\t\t\t// Create an index of all Exif tags found within the document\r\n\t\t\t\tCreateTagIndex();\r\n\t\t\t}\r\n\r\n\t\t\t#region TIFF methods\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Returns the length (in bytes) per component of the specified TIFF data type\r\n\t\t\t/// </summary>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate static byte GetTIFFFieldLength(ushort tiffDataType) {\r\n\t\t\t\treturn tiffDataType switch {\r\n\t\t\t\t\t1 or 2 or 7 or 6 => 1,\r\n\t\t\t\t\t3 or 8 => 2,\r\n\t\t\t\t\t4 or 9 or 11 => 4,\r\n\t\t\t\t\t5 or 10 or 12 => 8,\r\n\t\t\t\t\t_ => throw new ExifLibException(string.Format(\"Unknown TIFF datatype: {0}\", tiffDataType)),\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region Methods for reading data directly from the filestream\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Gets a 2 byte unsigned integer from the file\r\n\t\t\t/// </summary>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate ushort ReadUShort() {\r\n\t\t\t\treturn ToUShort(ReadBytes(2));\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Gets a 4 byte unsigned integer from the file\r\n\t\t\t/// </summary>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate uint ReadUint() {\r\n\t\t\t\treturn ToUint(ReadBytes(4));\r\n\t\t\t}\r\n\r\n\t\t\tprivate string ReadString(int chars) {\r\n\t\t\t\tvar bytes = ReadBytes(chars);\r\n\t\t\t\treturn System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);\r\n\t\t\t}\r\n\r\n\t\t\tprivate byte[] ReadBytes(int byteCount) {\r\n\t\t\t\treturn _reader.ReadBytes(byteCount);\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Reads some bytes from the specified TIFF offset\r\n\t\t\t/// </summary>\r\n\t\t\t/// <param name=\"tiffOffset\"></param>\r\n\t\t\t/// <param name=\"byteCount\"></param>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate byte[] ReadBytes(ushort tiffOffset, int byteCount) {\r\n\t\t\t\t// Keep the current file offset\r\n\t\t\t\tvar originalOffset = _stream.Position;\r\n\r\n\t\t\t\t// Move to the TIFF offset and retrieve the data\r\n\t\t\t\t_stream.Seek(tiffOffset + _tiffHeaderStart, SeekOrigin.Begin);\r\n\r\n\t\t\t\tvar data = _reader.ReadBytes(byteCount);\r\n\r\n\t\t\t\t// Restore the file offset\r\n\t\t\t\t_stream.Position = originalOffset;\r\n\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region Data conversion methods for interpreting datatypes from a byte array\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 2 bytes to a ushort using the current byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate ushort ToUShort(byte[] data) {\r\n\t\t\t\tif (_isLittleEndian != BitConverter.IsLittleEndian)\r\n\t\t\t\t\tArray.Reverse(data);\r\n\r\n\t\t\t\treturn BitConverter.ToUInt16(data, 0);\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 8 bytes to the numerator and denominator\r\n\t\t\t/// components of an unsigned rational using the current byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\tprivate uint[] ToURationalFraction(byte[] data) {\r\n\t\t\t\tvar numeratorData = new byte[4];\r\n\t\t\t\tvar denominatorData = new byte[4];\r\n\r\n\t\t\t\tArray.Copy(data, numeratorData, 4);\r\n\t\t\t\tArray.Copy(data, 4, denominatorData, 0, 4);\r\n\r\n\t\t\t\tvar numerator = ToUint(numeratorData);\r\n\t\t\t\tvar denominator = ToUint(denominatorData);\r\n\r\n\t\t\t\treturn new[] { numerator, denominator };\r\n\t\t\t}\r\n\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 8 bytes to an unsigned rational using the current byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\t/// <seealso cref=\"ToRational\"/>\r\n\t\t\tprivate double ToURational(byte[] data) {\r\n\t\t\t\tvar fraction = ToURationalFraction(data);\r\n\r\n\t\t\t\treturn fraction[0] / (double)fraction[1];\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 8 bytes to the numerator and denominator\r\n\t\t\t/// components of an unsigned rational using the current byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\t/// <remarks>\r\n\t\t\t/// A TIFF rational contains 2 4-byte integers, the first of which is\r\n\t\t\t/// the numerator, and the second of which is the denominator.\r\n\t\t\t/// </remarks>\r\n\t\t\tprivate int[] ToRationalFraction(byte[] data) {\r\n\t\t\t\tvar numeratorData = new byte[4];\r\n\t\t\t\tvar denominatorData = new byte[4];\r\n\r\n\t\t\t\tArray.Copy(data, numeratorData, 4);\r\n\t\t\t\tArray.Copy(data, 4, denominatorData, 0, 4);\r\n\r\n\t\t\t\tint numerator = ToInt(numeratorData);\r\n\t\t\t\tint denominator = ToInt(denominatorData);\r\n\r\n\t\t\t\treturn new[] { numerator, denominator };\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 8 bytes to a signed rational using the current byte aligns.\r\n\t\t\t/// </summary>\r\n\t\t\t/// <seealso cref=\"ToRationalFraction\"/>\r\n\t\t\tprivate double ToRational(byte[] data) {\r\n\t\t\t\tvar fraction = ToRationalFraction(data);\r\n\r\n\t\t\t\treturn fraction[0] / (double)fraction[1];\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 4 bytes to a uint using the current byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\tprivate uint ToUint(byte[] data) {\r\n\t\t\t\tif (_isLittleEndian != BitConverter.IsLittleEndian)\r\n\t\t\t\t\tArray.Reverse(data);\r\n\r\n\t\t\t\treturn BitConverter.ToUInt32(data, 0);\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Converts 4 bytes to an int using the current byte aligns\r\n\t\t\t/// </summary>\r\n\t\t\tprivate int ToInt(byte[] data) {\r\n\t\t\t\tif (_isLittleEndian != BitConverter.IsLittleEndian)\r\n\t\t\t\t\tArray.Reverse(data);\r\n\r\n\t\t\t\treturn BitConverter.ToInt32(data, 0);\r\n\t\t\t}\r\n\r\n\t\t\tprivate double ToDouble(byte[] data) {\r\n\t\t\t\tif (_isLittleEndian != BitConverter.IsLittleEndian)\r\n\t\t\t\t\tArray.Reverse(data);\r\n\r\n\t\t\t\treturn BitConverter.ToDouble(data, 0);\r\n\t\t\t}\r\n\r\n\t\t\tprivate float ToSingle(byte[] data) {\r\n\t\t\t\tif (_isLittleEndian != BitConverter.IsLittleEndian)\r\n\t\t\t\t\tArray.Reverse(data);\r\n\r\n\t\t\t\treturn BitConverter.ToSingle(data, 0);\r\n\t\t\t}\r\n\r\n\t\t\tprivate short ToShort(byte[] data) {\r\n\t\t\t\tif (_isLittleEndian != BitConverter.IsLittleEndian)\r\n\t\t\t\t\tArray.Reverse(data);\r\n\r\n\t\t\t\treturn BitConverter.ToInt16(data, 0);\r\n\t\t\t}\r\n\r\n\t\t\tprivate sbyte ToSByte(byte[] data) {\r\n\t\t\t\t// An sbyte should just be a byte with an offset range.\r\n\t\t\t\treturn (sbyte)(data[0] - byte.MaxValue);\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Retrieves an array from a byte array using the supplied converter\r\n\t\t\t/// to read each individual element from the supplied byte array\r\n\t\t\t/// </summary>\r\n\t\t\t/// <param name=\"data\"></param>\r\n\t\t\t/// <param name=\"elementLengthBytes\"></param>\r\n\t\t\t/// <param name=\"converter\"></param>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate static Array GetArray<T>(byte[] data, int elementLengthBytes, ConverterMethod<T> converter) {\r\n\t\t\t\tArray convertedData = new T[data.Length / elementLengthBytes];\r\n\r\n\t\t\t\tvar buffer = new byte[elementLengthBytes];\r\n\r\n\t\t\t\t// Read each element from the array\r\n\t\t\t\tfor (int elementCount = 0; elementCount < data.Length / elementLengthBytes; elementCount++) {\r\n\t\t\t\t\t// Place the data for the current element into the buffer\r\n\t\t\t\t\tArray.Copy(data, elementCount * elementLengthBytes, buffer, 0, elementLengthBytes);\r\n\r\n\t\t\t\t\t// Process the data and place it into the output array\r\n\t\t\t\t\tconvertedData.SetValue(converter(buffer), elementCount);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn convertedData;\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// A delegate used to invoke any of the data conversion methods\r\n\t\t\t/// </summary>\r\n\t\t\t/// <param name=\"data\"></param>\r\n\t\t\t/// <returns></returns>\r\n\t\t\t/// <remarks>Although this could be defined as covariant, it wouldn't work on Windows Phone</remarks>\r\n\t\t\tprivate delegate T ConverterMethod<out T>(byte[] data);\r\n\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region Stream seek methods - used to get to locations within the JPEG\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Scans to the Exif block\r\n\t\t\t/// </summary>\r\n\t\t\tprivate void ReadToExifStart() {\r\n\t\t\t\t// The file has a number of blocks (Exif/JFIF), each of which\r\n\t\t\t\t// has a tag number followed by a length. We scan the document until the required tag (0xFFE1)\r\n\t\t\t\t// is found. All tags start with FF, so a non FF tag indicates an error.\r\n\r\n\t\t\t\t// Get the next tag.\r\n\t\t\t\tbyte markerStart;\r\n\t\t\t\tbyte markerNumber = 0;\r\n\t\t\t\twhile (((markerStart = _reader.ReadByte()) == 0xFF) && (markerNumber = _reader.ReadByte()) != 0xE1) {\r\n\t\t\t\t\t// Get the length of the data.\r\n\t\t\t\t\tushort dataLength = ReadUShort();\r\n\r\n\t\t\t\t\t// Jump to the end of the data (note that the size field includes its own size)!\r\n\t\t\t\t\t_stream.Seek(dataLength - 2, SeekOrigin.Current);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// It's only success if we found the 0xFFE1 marker\r\n\t\t\t\tif (markerStart != 0xFF || markerNumber != 0xE1)\r\n\t\t\t\t\tthrow new ExifLibException(\"Could not find Exif data block\");\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Reads through the Exif data and builds an index of all Exif tags in the document\r\n\t\t\t/// </summary>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tprivate void CreateTagIndex() {\r\n\t\t\t\t// The next 4 bytes are the size of the Exif data.\r\n\t\t\t\tReadUShort();\r\n\r\n\t\t\t\t// Next is the Exif data itself. It starts with the ASCII \"Exif\" followed by 2 zero bytes.\r\n\t\t\t\tif (ReadString(4) != \"Exif\")\r\n\t\t\t\t\tthrow new ExifLibException(\"Exif data not found\");\r\n\r\n\t\t\t\t// 2 zero bytes\r\n\t\t\t\tif (ReadUShort() != 0)\r\n\t\t\t\t\tthrow new ExifLibException(\"Malformed Exif data\");\r\n\r\n\t\t\t\t// We're now into the TIFF format\r\n\t\t\t\t_tiffHeaderStart = _stream.Position;\r\n\r\n\t\t\t\t// What byte align will be used for the TIFF part of the document? II for Intel, MM for Motorola\r\n\t\t\t\t_isLittleEndian = ReadString(2) == \"II\";\r\n\r\n\t\t\t\t// Next 2 bytes are always the same.\r\n\t\t\t\tif (ReadUShort() != 0x002A)\r\n\t\t\t\t\tthrow new ExifLibException(\"Error in TIFF data\");\r\n\r\n\t\t\t\t// Get the offset to the IFD (image file directory)\r\n\t\t\t\tvar ifdOffset = ReadUint();\r\n\r\n\t\t\t\t// Note that this offset is from the first byte of the TIFF header. Jump to the IFD.\r\n\t\t\t\t_stream.Position = ifdOffset + _tiffHeaderStart;\r\n\r\n\t\t\t\t// Catalogue this first IFD (there will be another IFD)\r\n\t\t\t\t_ifd0Catalogue = new Dictionary<ushort, long>();\r\n\t\t\t\tCatalogueIFD(ref _ifd0Catalogue);\r\n\r\n\t\t\t\t// The address to the IFD1 (the thumbnail IFD) is located immediately after the main IFD\r\n\t\t\t\t_ifd1Offset = ReadUint();\r\n\r\n\t\t\t\t// There's more data stored in the subifd, the offset to which is found in tag 0x8769.\r\n\t\t\t\t// As with all TIFF offsets, it will be relative to the first byte of the TIFF header.\r\n\t\t\t\tuint offset;\r\n\t\t\t\tif (!GetTagValue(_ifd0Catalogue, 0x8769, out offset))\r\n\t\t\t\t\t// throw new ExifLibException(\"Unable to locate Exif data\");\r\n\t\t\t\t\t// DO NOT throw exception, not all has data\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t// Jump to the exif SubIFD\r\n\t\t\t\t_stream.Position = offset + _tiffHeaderStart;\r\n\r\n\t\t\t\t// Add the subIFD to the catalogue too\r\n\t\t\t\tCatalogueIFD(ref _ifd0Catalogue);\r\n\r\n\t\t\t\t// Go to the GPS IFD and catalogue that too. It's an optional\r\n\t\t\t\t// section.\r\n\t\t\t\tif (GetTagValue(_ifd0Catalogue, 0x8825, out offset)) {\r\n\t\t\t\t\t// Jump to the GPS SubIFD\r\n\t\t\t\t\t_stream.Position = offset + _tiffHeaderStart;\r\n\r\n\t\t\t\t\t// Add the subIFD to the catalogue too\r\n\t\t\t\t\tCatalogueIFD(ref _ifd0Catalogue);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Finally, catalogue the thumbnail IFD if it's present\r\n\t\t\t\tif (_ifd1Offset != 0) {\r\n\t\t\t\t\t_stream.Position = _ifd1Offset + _tiffHeaderStart;\r\n\t\t\t\t\t_ifd1Catalogue = new Dictionary<ushort, long>();\r\n\t\t\t\t\tCatalogueIFD(ref _ifd1Catalogue);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region Exif data catalog and retrieval methods\r\n\r\n\t\t\tpublic bool GetTagValue<T>(ExifTags tag, out T result) {\r\n\t\t\t\treturn GetTagValue((ushort)tag, out result);\r\n\t\t\t}\r\n\r\n\t\t\tpublic bool GetTagValue<T>(ushort tagId, out T result) {\r\n\t\t\t\t// All useful EXIF tags are stored in the ifd0 catalogue. The ifd1 catalogue is only for thumbnail retrieval.            \r\n\t\t\t\tInitialize();\r\n\t\t\t\treturn GetTagValue(_ifd0Catalogue, tagId, out result);\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Retrieves an Exif value with the requested tag ID\r\n\t\t\t/// </summary>\r\n\t\t\tprivate bool GetTagValue<T>(IDictionary<ushort, long> tagDictionary, ushort tagId, out T result) {\r\n\t\t\t\tushort tiffDataType;\r\n\t\t\t\tuint numberOfComponents;\r\n\t\t\t\tvar tagData = GetTagBytes(tagDictionary, tagId, out tiffDataType, out numberOfComponents);\r\n\r\n\t\t\t\tif (tagData == null) {\r\n\t\t\t\t\tresult = default(T);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar fieldLength = GetTIFFFieldLength(tiffDataType);\r\n\r\n\t\t\t\t// Convert the data to the appropriate datatype. Note the weird boxing via object.\r\n\t\t\t\t// The compiler doesn't like it otherwise.\r\n\t\t\t\tswitch (tiffDataType) {\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\t// unsigned byte\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)tagData[0];\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)tagData;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\t// ascii string\r\n\t\t\t\t\t\tvar str = System.Text.Encoding.UTF8.GetString(tagData, 0, tagData.Length);\r\n\r\n\t\t\t\t\t\t// There may be a null character within the string\r\n\t\t\t\t\t\tvar nullCharIndex = str.IndexOf('\\0');\r\n\t\t\t\t\t\tif (nullCharIndex != -1)\r\n\t\t\t\t\t\t\tstr = str.Substring(0, nullCharIndex);\r\n\r\n\t\t\t\t\t\t// Special processing for dates.\r\n\t\t\t\t\t\tif (typeof(T) == typeof(DateTime)) {\r\n\t\t\t\t\t\t\tDateTime dateResult;\r\n\t\t\t\t\t\t\tvar success = ToDateTime(str, out dateResult);\r\n\r\n\t\t\t\t\t\t\tresult = (T)(object)dateResult;\r\n\t\t\t\t\t\t\treturn success;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tresult = (T)(object)str;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\t// unsigned short\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToUShort(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToUShort);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\t// unsigned long\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToUint(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToUint);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\t// unsigned rational\r\n\t\t\t\t\t\tif (numberOfComponents == 1) {\r\n\t\t\t\t\t\t\t// Special case - sometimes it's useful to retrieve the numerator and\r\n\t\t\t\t\t\t\t// denominator in their raw format\r\n\t\t\t\t\t\t\tif (typeof(T).IsArray)\r\n\t\t\t\t\t\t\t\tresult = (T)(object)ToURationalFraction(tagData);\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tresult = (T)(object)ToURational(tagData);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToURational);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 6:\r\n\t\t\t\t\t\t// signed byte\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToSByte(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToSByte);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 7:\r\n\t\t\t\t\t\t// undefined. Treat it as a byte.\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)tagData[0];\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)tagData;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 8:\r\n\t\t\t\t\t\t// Signed short\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToShort(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToShort);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 9:\r\n\t\t\t\t\t\t// Signed long\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToInt(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToInt);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 10:\r\n\t\t\t\t\t\t// signed rational\r\n\t\t\t\t\t\tif (numberOfComponents == 1) {\r\n\t\t\t\t\t\t\t// Special case - sometimes it's useful to retrieve the numerator and\r\n\t\t\t\t\t\t\t// denominator in their raw format\r\n\t\t\t\t\t\t\tif (typeof(T).IsArray)\r\n\t\t\t\t\t\t\t\tresult = (T)(object)ToRationalFraction(tagData);\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tresult = (T)(object)ToRational(tagData);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToRational);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 11:\r\n\t\t\t\t\t\t// single float\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToSingle(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToSingle);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tcase 12:\r\n\t\t\t\t\t\t// double float\r\n\t\t\t\t\t\tif (numberOfComponents == 1)\r\n\t\t\t\t\t\t\tresult = (T)(object)ToDouble(tagData);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tresult = (T)(object)GetArray(tagData, fieldLength, ToDouble);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow new ExifLibException(string.Format(\"Unknown TIFF datatype: {0}\", tiffDataType));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tprivate static bool ToDateTime(string str, out DateTime result) {\r\n\t\t\t\t// From page 28 of the Exif 2.2 spec (http://www.exif.org/Exif2-2.PDF): \r\n\r\n\t\t\t\t// \"When the field is left blank, it is treated as unknown ... When the date and time are unknown, \r\n\t\t\t\t// all the character spaces except colons (\":\") may be filled with blank characters\"\r\n\t\t\t\tif (string.IsNullOrEmpty(str) || _nullDateTimeMatcher.IsMatch(str)) {\r\n\t\t\t\t\tresult = DateTime.MinValue;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// There are 2 types of date - full date/time stamps, and plain dates. Dates are 10 characters long.\r\n\t\t\t\tif (str.Length == 10) {\r\n\t\t\t\t\tresult = DateTime.ParseExact(str, \"yyyy:MM:dd\", CultureInfo.InvariantCulture);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// \"The format is \"YYYY:MM:DD HH:MM:SS\" with time shown in 24-hour format, and the date and time separated by one blank character [20.H].\r\n\t\t\t\tresult = DateTime.ParseExact(str, \"yyyy:MM:dd HH:mm:ss\", CultureInfo.InvariantCulture);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Gets the data in the specified tag ID, starting from before the IFD block.\r\n\t\t\t/// </summary>\r\n\t\t\t/// <param name=\"tiffDataType\"></param>\r\n\t\t\t/// <param name=\"numberOfComponents\">The number of items which make up the data item - i.e. for a string, this will be the\r\n\t\t\t/// number of characters in the string</param>\r\n\t\t\t/// <param name=\"tagDictionary\"></param>\r\n\t\t\t/// <param name=\"tagId\"></param>\r\n\t\t\tprivate byte[] GetTagBytes(IDictionary<ushort, long> tagDictionary, ushort tagId, out ushort tiffDataType, out uint numberOfComponents) {\r\n\t\t\t\t// Get the tag's offset from the catalogue and do some basic error checks\r\n\t\t\t\tif (_stream == null || _reader == null || tagDictionary == null || !tagDictionary.ContainsKey(tagId)) {\r\n\t\t\t\t\ttiffDataType = 0;\r\n\t\t\t\t\tnumberOfComponents = 0;\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar tagOffset = tagDictionary[tagId];\r\n\r\n\t\t\t\t// Jump to the TIFF offset\r\n\t\t\t\t_stream.Position = tagOffset;\r\n\r\n\t\t\t\t// Read the tag number from the file\r\n\t\t\t\tvar currentTagId = ReadUShort();\r\n\r\n\t\t\t\tif (currentTagId != tagId)\r\n\t\t\t\t\tthrow new ExifLibException(\"Tag number not at expected offset\");\r\n\r\n\t\t\t\t// Read the offset to the Exif IFD\r\n\t\t\t\ttiffDataType = ReadUShort();\r\n\t\t\t\tnumberOfComponents = ReadUint();\r\n\t\t\t\tvar tagData = ReadBytes(4);\r\n\r\n\t\t\t\t// If the total space taken up by the field is longer than the\r\n\t\t\t\t// 2 bytes afforded by the tagData, tagData will contain an offset\r\n\t\t\t\t// to the actual data.\r\n\t\t\t\tvar dataSize = (int)(numberOfComponents * GetTIFFFieldLength(tiffDataType));\r\n\r\n\t\t\t\tif (dataSize > 4) {\r\n\t\t\t\t\tvar offsetAddress = ToUShort(tagData);\r\n\t\t\t\t\treturn ReadBytes(offsetAddress, dataSize);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// The value is stored in the tagData starting from the left\r\n\t\t\t\tArray.Resize(ref tagData, dataSize);\r\n\r\n\t\t\t\treturn tagData;\r\n\t\t\t}\r\n\r\n\t\t\t/// <summary>\r\n\t\t\t/// Records all Exif tags and their offsets within\r\n\t\t\t/// the file from the current IFD\r\n\t\t\t/// </summary>\r\n\t\t\tprivate void CatalogueIFD(ref Dictionary<ushort, long> tagOffsets) {\r\n\t\t\t\t// Assume we're just before the IFD.\r\n\r\n\t\t\t\t// First 2 bytes is the number of entries in this IFD\r\n\t\t\t\tvar entryCount = ReadUShort();\r\n\r\n\t\t\t\tfor (ushort currentEntry = 0; currentEntry < entryCount; currentEntry++) {\r\n\t\t\t\t\tvar currentTagNumber = ReadUShort();\r\n\r\n\t\t\t\t\t// Record this in the catalogue\r\n\t\t\t\t\ttagOffsets[currentTagNumber] = _stream.Position - 2;\r\n\r\n\t\t\t\t\t// Go to the end of this item (10 bytes, as each entry is 12 bytes long)\r\n\t\t\t\t\t_stream.Seek(10, SeekOrigin.Current);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region Thumbnail retrieval\r\n\t\t\t/// <summary>\r\n\t\t\t/// Retrieves a JPEG thumbnail from the image if one is present. Note that this method cannot retrieve thumbnails encoded in other formats,\r\n\t\t\t/// but since the DCF specification specifies that thumbnails must be JPEG, this method will be sufficient for most purposes\r\n\t\t\t/// See http://gvsoft.homedns.org/exif/exif-explanation.html#TIFFThumbs or http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf for \r\n\t\t\t/// details on the encoding of TIFF thumbnails\r\n\t\t\t/// </summary>\r\n\t\t\t/// <returns></returns>\r\n\t\t\tpublic byte[] GetJpegThumbnailBytes() {\r\n\t\t\t\tInitialize();\r\n\r\n\t\t\t\tif (_ifd1Catalogue == null)\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t// Get the thumbnail encoding\r\n\t\t\t\tushort compression;\r\n\t\t\t\tif (!GetTagValue(_ifd1Catalogue, (ushort)ExifTags.Compression, out compression))\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t// This method only handles JPEG thumbnails (compression type 6)\r\n\t\t\t\tif (compression != 6)\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t// Get the location of the thumbnail\r\n\t\t\t\tuint offset;\r\n\t\t\t\tif (!GetTagValue(_ifd1Catalogue, (ushort)ExifTags.JPEGInterchangeFormat, out offset))\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t// Get the length of the thumbnail data\r\n\t\t\t\tuint length;\r\n\t\t\t\tif (!GetTagValue(_ifd1Catalogue, (ushort)ExifTags.JPEGInterchangeFormatLength, out length))\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t_stream.Position = offset;\r\n\r\n\t\t\t\t// The thumbnail may be padded, so we scan forward until we reach the JPEG header (0xFFD8) or the end of the file\r\n\t\t\t\tint currentByte;\r\n\t\t\t\tvar previousByte = -1;\r\n\t\t\t\twhile ((currentByte = _stream.ReadByte()) != -1) {\r\n\t\t\t\t\tif (previousByte == 0xFF && currentByte == 0xD8)\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tpreviousByte = currentByte;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (currentByte != 0xD8)\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\t// Step back to the start of the JPEG header\r\n\t\t\t\t_stream.Position -= 2;\r\n\r\n\t\t\t\tvar imageBytes = new byte[length];\r\n\t\t\t\t_stream.Read(imageBytes, 0, (int)length);\r\n\r\n\t\t\t\t// A valid JPEG stream ends with 0xFFD9. The stream may be padded at the end with multiple 0xFF bytes.\r\n\t\t\t\tvar jpegStreamEnd = (int)length - 1;\r\n\t\t\t\twhile (jpegStreamEnd > 0 && imageBytes[jpegStreamEnd] == 0xFF)\r\n\t\t\t\t\tjpegStreamEnd--;\r\n\r\n\t\t\t\tif (jpegStreamEnd <= 0 || imageBytes[jpegStreamEnd] != 0xD9 || imageBytes[jpegStreamEnd - 1] != 0xFF)\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\treturn imageBytes;\r\n\t\t\t}\r\n\t\t\t#endregion\r\n\r\n\t\t\t#region IDisposable Members\r\n\r\n\t\t\t~ExifReader() {\r\n\t\t\t\tDispose(false);\r\n\t\t\t}\r\n\r\n\t\t\tprivate void Dispose(bool disposing) {\r\n\t\t\t\tif (disposing) {\r\n\t\t\t\t\tif (_reader != null)\r\n\t\t\t\t\t\t_reader.Dispose();\r\n\r\n\t\t\t\t\tif (!_leaveOpen) {\r\n\t\t\t\t\t\t// Make sure the file handle is released\r\n\t\t\t\t\t\t_stream?.Dispose();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t_reader = null;\r\n\t\t\t\t_stream = null;\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Dispose() {\r\n\t\t\t\tDispose(true);\r\n\t\t\t\tGC.SuppressFinalize(this);\r\n\t\t\t}\r\n\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class ExifLibException : Exception\r\n\t\t{\r\n\t\t\tpublic ExifLibException() {\r\n\t\t\t}\r\n\r\n\t\t\tpublic ExifLibException(string message)\r\n\t\t\t\t: base(message) {\r\n\t\t\t}\r\n\r\n\t\t\tpublic ExifLibException(string message, Exception innerException)\r\n\t\t\t\t: base(message, innerException) {\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// All exif tags as per the Exif standard 2.2, JEITA CP-2451\r\n\t\t/// </summary>\r\n\t\tpublic enum ExifTags : ushort\r\n\t\t{\r\n\t\t\t// IFD0 items\r\n\t\t\tImageWidth = 0x100,\r\n\t\t\tImageLength = 0x101,\r\n\t\t\tBitsPerSample = 0x102,\r\n\t\t\tCompression = 0x103,\r\n\t\t\tPhotometricInterpretation = 0x106,\r\n\t\t\tImageDescription = 0x10E,\r\n\t\t\tMake = 0x10F,\r\n\t\t\tModel = 0x110,\r\n\t\t\tStripOffsets = 0x111,\r\n\t\t\tOrientation = 0x112,\r\n\t\t\tSamplesPerPixel = 0x115,\r\n\t\t\tRowsPerStrip = 0x116,\r\n\t\t\tStripByteCounts = 0x117,\r\n\t\t\tXResolution = 0x11A,\r\n\t\t\tYResolution = 0x11B,\r\n\t\t\tPlanarConfiguration = 0x11C,\r\n\t\t\tResolutionUnit = 0x128,\r\n\t\t\tTransferFunction = 0x12D,\r\n\t\t\tSoftware = 0x131,\r\n\t\t\tDateTime = 0x132,\r\n\t\t\tArtist = 0x13B,\r\n\t\t\tWhitePoint = 0x13E,\r\n\t\t\tPrimaryChromaticities = 0x13F,\r\n\t\t\tJPEGInterchangeFormat = 0x201,\r\n\t\t\tJPEGInterchangeFormatLength = 0x202,\r\n\t\t\tYCbCrCoefficients = 0x211,\r\n\t\t\tYCbCrSubSampling = 0x212,\r\n\t\t\tYCbCrPositioning = 0x213,\r\n\t\t\tReferenceBlackWhite = 0x214,\r\n\t\t\tCopyright = 0x8298,\r\n\r\n\t\t\t// SubIFD items\r\n\t\t\tExposureTime = 0x829A,\r\n\t\t\tFNumber = 0x829D,\r\n\t\t\tExposureProgram = 0x8822,\r\n\t\t\tSpectralSensitivity = 0x8824,\r\n\t\t\tISOSpeedRatings = 0x8827,\r\n\t\t\tOECF = 0x8828,\r\n\t\t\tExifVersion = 0x9000,\r\n\t\t\tDateTimeOriginal = 0x9003,\r\n\t\t\tDateTimeDigitized = 0x9004,\r\n\t\t\tComponentsConfiguration = 0x9101,\r\n\t\t\tCompressedBitsPerPixel = 0x9102,\r\n\t\t\tShutterSpeedValue = 0x9201,\r\n\t\t\tApertureValue = 0x9202,\r\n\t\t\tBrightnessValue = 0x9203,\r\n\t\t\tExposureBiasValue = 0x9204,\r\n\t\t\tMaxApertureValue = 0x9205,\r\n\t\t\tSubjectDistance = 0x9206,\r\n\t\t\tMeteringMode = 0x9207,\r\n\t\t\tLightSource = 0x9208,\r\n\t\t\tFlash = 0x9209,\r\n\t\t\tFocalLength = 0x920A,\r\n\t\t\tSubjectArea = 0x9214,\r\n\t\t\tMakerNote = 0x927C,\r\n\t\t\tUserComment = 0x9286,\r\n\t\t\tSubsecTime = 0x9290,\r\n\t\t\tSubsecTimeOriginal = 0x9291,\r\n\t\t\tSubsecTimeDigitized = 0x9292,\r\n\t\t\tFlashpixVersion = 0xA000,\r\n\t\t\tColorSpace = 0xA001,\r\n\t\t\tPixelXDimension = 0xA002,\r\n\t\t\tPixelYDimension = 0xA003,\r\n\t\t\tRelatedSoundFile = 0xA004,\r\n\t\t\tFlashEnergy = 0xA20B,\r\n\t\t\tSpatialFrequencyResponse = 0xA20C,\r\n\t\t\tFocalPlaneXResolution = 0xA20E,\r\n\t\t\tFocalPlaneYResolution = 0xA20F,\r\n\t\t\tFocalPlaneResolutionUnit = 0xA210,\r\n\t\t\tSubjectLocation = 0xA214,\r\n\t\t\tExposureIndex = 0xA215,\r\n\t\t\tSensingMethod = 0xA217,\r\n\t\t\tFileSource = 0xA300,\r\n\t\t\tSceneType = 0xA301,\r\n\t\t\tCFAPattern = 0xA302,\r\n\t\t\tCustomRendered = 0xA401,\r\n\t\t\tExposureMode = 0xA402,\r\n\t\t\tWhiteBalance = 0xA403,\r\n\t\t\tDigitalZoomRatio = 0xA404,\r\n\t\t\tFocalLengthIn35mmFilm = 0xA405,\r\n\t\t\tSceneCaptureType = 0xA406,\r\n\t\t\tGainControl = 0xA407,\r\n\t\t\tContrast = 0xA408,\r\n\t\t\tSaturation = 0xA409,\r\n\t\t\tSharpness = 0xA40A,\r\n\t\t\tDeviceSettingDescription = 0xA40B,\r\n\t\t\tSubjectDistanceRange = 0xA40C,\r\n\t\t\tImageUniqueID = 0xA420,\r\n\r\n\t\t\t// GPS subifd items\r\n\t\t\tGPSVersionID = 0x0,\r\n\t\t\tGPSLatitudeRef = 0x1,\r\n\t\t\tGPSLatitude = 0x2,\r\n\t\t\tGPSLongitudeRef = 0x3,\r\n\t\t\tGPSLongitude = 0x4,\r\n\t\t\tGPSAltitudeRef = 0x5,\r\n\t\t\tGPSAltitude = 0x6,\r\n\t\t\tGPSTimestamp = 0x7,\r\n\t\t\tGPSSatellites = 0x8,\r\n\t\t\tGPSStatus = 0x9,\r\n\t\t\tGPSMeasureMode = 0xA,\r\n\t\t\tGPSDOP = 0xB,\r\n\t\t\tGPSSpeedRef = 0xC,\r\n\t\t\tGPSSpeed = 0xD,\r\n\t\t\tGPSTrackRef = 0xE,\r\n\t\t\tGPSTrack = 0xF,\r\n\t\t\tGPSImgDirectionRef = 0x10,\r\n\t\t\tGPSImgDirection = 0x11,\r\n\t\t\tGPSMapDatum = 0x12,\r\n\t\t\tGPSDestLatitudeRef = 0x13,\r\n\t\t\tGPSDestLatitude = 0x14,\r\n\t\t\tGPSDestLongitudeRef = 0x15,\r\n\t\t\tGPSDestLongitude = 0x16,\r\n\t\t\tGPSDestBearingRef = 0x17,\r\n\t\t\tGPSDestBearing = 0x18,\r\n\t\t\tGPSDestDistanceRef = 0x19,\r\n\t\t\tGPSDestDistance = 0x1A,\r\n\t\t\tGPSProcessingMethod = 0x1B,\r\n\t\t\tGPSAreaInformation = 0x1C,\r\n\t\t\tGPSDateStamp = 0x1D,\r\n\t\t\tGPSDifferential = 0x1E\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/TiffHelper.cs",
    "content": "﻿using System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing FreeImageAPI;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tstatic class TiffHelper\r\n\t{\r\n\t\tstatic readonly ImageCodecInfo _tiffCodec = BitmapHelper.GetCodec(\"image/tiff\");\r\n\t\tstatic readonly EncoderParameters _encoderParameters = new EncoderParameters(1) {\r\n\t\t\tParam = new EncoderParameter[] { new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4) }\r\n\t\t};\r\n\r\n\t\tinternal static void Save(FreeImageBitmap bmp, string fileName) {\r\n\t\t\t// 使用 .NET 的 TIFF 保存方式，文件尺寸较小\r\n\t\t\tif (_tiffCodec == null) {\r\n\t\t\t\tbmp.Save(fileName, FREE_IMAGE_FORMAT.FIF_TIFF, FREE_IMAGE_SAVE_FLAGS.TIFF_CCITTFAX4);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (bmp.HasPalette) {\r\n\t\t\t\t// HACK: TIFF编码与调色板不符，解决 .NET TIFF 编码器无法正常保存双色图片的问题\r\n\t\t\t\tvar color0 = bmp.Palette[0].Color.ToArgb() & 0x00FFFFFF;\r\n\t\t\t\tif (bmp.ColorType == FREE_IMAGE_COLOR_TYPE.FIC_MINISWHITE) {\r\n\t\t\t\t\tif (color0 != 0x00FFFFFF) {\r\n\t\t\t\t\t\tbmp.Invert();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (bmp.ColorType == FREE_IMAGE_COLOR_TYPE.FIC_MINISBLACK) {\r\n\t\t\t\t\tif (color0 != 0) {\r\n\t\t\t\t\t\tbmp.Invert();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tusing (var b = bmp.ToBitmap()) {\r\n\t\t\t\tb.Save(fileName, _tiffCodec, _encoderParameters);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将图片保存为黑白双色图片。如图片的 <see cref=\"PixelFormat\"/> 不为 <see cref=\"PixelFormat.Format1bppIndexed\"/>，则按默认格式保存。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"bmp\">要保存的图片。</param>\r\n\t\t/// <param name=\"fileName\">保存路径。</param>\r\n\t\tinternal static void SaveBinaryImage(this Image bmp, string fileName) {\r\n\t\t\tif (bmp.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\tbmp.Save(fileName, _tiffCodec, _encoderParameters);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbmp.Save(fileName, ImageFormat.Tiff);\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal static void SaveBinaryImage(this Image bmp, System.IO.Stream stream) {\r\n\t\t\tif (bmp.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\tbmp.Save(stream, _tiffCodec, _encoderParameters);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbmp.Save(stream, ImageFormat.Tiff);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static byte[] Decode(ImageInfo info, byte[] bytes, int k, bool endOfLine, bool encodedByteAlign, bool endOfBlock, bool blackIs1) {\r\n\t\t\tusing (var s = new MuPDF.Stream(bytes))\r\n\t\t\tusing (var img = s.DecodeTiffFax(info.Width, info.Height, k, endOfLine, encodedByteAlign, endOfBlock, blackIs1)) {\r\n\t\t\t\treturn img.ReadAll(bytes.Length);\r\n\t\t\t}\r\n\t\t\t//var outBuf = new byte[(info.Width + 7) / 8 * info.Height];\r\n\t\t\t//var decoder = new TIFFFaxDecoder (1, info.Width, info.Height);\r\n\t\t\t//if (k < 0) {\r\n\t\t\t//    // CCITT Fax Group 4\r\n\t\t\t//    decoder.DecodeT6 (outBuf, bytes, 0, info.Height, 0L);\r\n\t\t\t//}\r\n\t\t\t//else if (k == 0) {\r\n\t\t\t//    // CCITT Fax Group 3 (1-D)\r\n\t\t\t//    decoder.Decode1D (outBuf, bytes, 0, info.Height);\r\n\t\t\t//}\r\n\t\t\t//else {\r\n\t\t\t//    // CCITT Fax Group 3 (2-D)\r\n\t\t\t//    decoder.Decode2D (outBuf, bytes, 0, info.Height, 0L);\r\n\t\t\t//}\r\n\t\t\t//return outBuf;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/WuColorQuantizer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\n\r\nnamespace PDFPatcher.Processor.Imaging\r\n{\r\n\tpublic static class WuQuantizer\r\n\t{\r\n\t\tconst int __MaxColor = 256;\r\n\t\tconst int __Red = 2;\r\n\t\tconst int __Green = 1;\r\n\t\tconst int __Blue = 0;\r\n\t\tconst int __SideSize = 33;\r\n\t\tconst int __MaxSideIndex = 32;\r\n\r\n\t\tpublic static Bitmap QuantizeImage(Bitmap source) {\r\n\t\t\tvar colorCount = __MaxColor;\r\n\t\t\tvar data = BuildHistogram(source);\r\n\t\t\tCalculateMoments(data);\r\n\t\t\tvar cubes = SplitData(ref colorCount, data);\r\n\t\t\tvar palette = GetQuantizedPalette(colorCount, data, cubes);\r\n\t\t\treturn ProcessImagePixels(source, palette);\r\n\t\t}\r\n\r\n\t\tstatic Bitmap ProcessImagePixels(Image source, QuantizedPalette palette) {\r\n\t\t\tvar result = new Bitmap(source.Width, source.Height, PixelFormat.Format8bppIndexed);\r\n\t\t\tvar newPalette = result.Palette;\r\n\t\t\tpalette.Colors.CopyTo(newPalette.Entries, 0);\r\n\t\t\tresult.Palette = newPalette;\r\n\r\n\t\t\tBitmapData targetData = null;\r\n\t\t\ttry {\r\n\t\t\t\ttargetData = result.LockBits(Rectangle.FromLTRB(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, result.PixelFormat);\r\n\t\t\t\tvar targetByteLength = targetData.Stride < 0 ? -targetData.Stride : targetData.Stride;\r\n\t\t\t\tvar targetSize = targetByteLength * result.Height;\r\n\t\t\t\tvar targetOffset = 0;\r\n\t\t\t\tvar targetBuffer = new byte[targetSize];\r\n\t\t\t\tvar pixelIndex = 0;\r\n\t\t\t\tvar pil = palette.PixelIndex;\r\n\t\t\t\tint rw = result.Width, rh = result.Height;\r\n\t\t\t\tvar empty = palette.Colors.Count - 1;\r\n\t\t\t\tfor (var y = 0; y < rh; y++) {\r\n\t\t\t\t\tfor (var x = 0; x < rw; x++) {\r\n\t\t\t\t\t\tvar pv = pil[pixelIndex];\r\n\t\t\t\t\t\ttargetBuffer[targetOffset + x] = (byte)(pv == -1 ? empty : pv);\r\n\t\t\t\t\t\tpixelIndex++;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttargetOffset += targetByteLength;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tSystem.Runtime.InteropServices.Marshal.Copy(targetBuffer, 0, targetData.Scan0, targetSize);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (targetData != null)\r\n\t\t\t\t\tresult.UnlockBits(targetData);\r\n\t\t\t}\r\n\t\t\tresult.SetResolution(source.HorizontalResolution, source.VerticalResolution);\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tstatic ColorData BuildHistogram(Bitmap sourceImage) {\r\n\t\t\tint bitmapWidth = sourceImage.Width;\r\n\t\t\tint bitmapHeight = sourceImage.Height;\r\n\r\n\t\t\tvar data = sourceImage.LockBits(false);\r\n\t\t\tvar colorData = new ColorData(__MaxSideIndex, bitmapWidth, bitmapHeight);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tvar bitDepth = Image.GetPixelFormatSize(sourceImage.PixelFormat);\r\n\t\t\t\tif (bitDepth != 32 && bitDepth != 24)\r\n\t\t\t\t\tthrow new QuantizationException(string.Format(\"The image you are attempting to quantize does not contain a 32 bit ARGB palette. This image has a bit depth of {0} with {1} colors.\", bitDepth, sourceImage.Palette.Entries.Length));\r\n\t\t\t\tvar byteLength = data.Stride < 0 ? -data.Stride : data.Stride;\r\n\t\t\t\tvar offset = 0;\r\n\t\t\t\tvar buffer = new Byte[byteLength * sourceImage.Height];\r\n\r\n\t\t\t\tSystem.Runtime.InteropServices.Marshal.Copy(data.Scan0, buffer, 0, buffer.Length);\r\n\t\t\t\tvar t = new int[__MaxColor];\r\n\t\t\t\tfor (var i = 0; i < __MaxColor; ++i) {\r\n\t\t\t\t\tt[i] = i * i;\r\n\t\t\t\t}\r\n\t\t\t\tint pos;\r\n\t\t\t\tbyte vr, vg, vb, r, g, b;\r\n\t\t\t\tvar w = colorData.Weights;\r\n\t\t\t\tvar mr = colorData.MomentsRed;\r\n\t\t\t\tvar mg = colorData.MomentsGreen;\r\n\t\t\t\tvar mb = colorData.MomentsBlue;\r\n\t\t\t\tvar m = colorData.Moments;\r\n\t\t\t\tfor (int y = 0; y < bitmapHeight; y++) {\r\n\t\t\t\t\tvar index = 0;\r\n\t\t\t\t\tfor (int x = 0; x < bitmapWidth; x++) {\r\n\t\t\t\t\t\tvar indexOffset = offset + (index >> 3);\r\n\r\n\t\t\t\t\t\tvr = buffer[indexOffset + __Red];\r\n\t\t\t\t\t\tvg = buffer[indexOffset + __Green];\r\n\t\t\t\t\t\tvb = buffer[indexOffset + __Blue];\r\n\t\t\t\t\t\tr = (byte)((vr >> 3) + 1);\r\n\t\t\t\t\t\tg = (byte)((vg >> 3) + 1);\r\n\t\t\t\t\t\tb = (byte)((vb >> 3) + 1);\r\n\t\t\t\t\t\tpos = (r << 10) + (r << 6) + r + (g << 5) + g + b; // [r,g,b]\r\n\t\t\t\t\t\tw[pos]++;\r\n\t\t\t\t\t\tmr[pos] += vr;\r\n\t\t\t\t\t\tmg[pos] += vg;\r\n\t\t\t\t\t\tmb[pos] += vb;\r\n\t\t\t\t\t\tm[pos] += t[vr] + t[vg] + t[vb];\r\n\r\n\t\t\t\t\t\tcolorData.AddPixel(\r\n\t\t\t\t\t\t\tnew Pixel(vr, vg, vb),\r\n\t\t\t\t\t\t\t(r << 16) + (g << 8) + b\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\tindex += bitDepth;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\toffset += byteLength;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tsourceImage.UnlockBits(data);\r\n\t\t\t}\r\n\t\t\treturn colorData;\r\n\t\t}\r\n\r\n\t\tstatic void CalculateMoments(ColorData data) {\r\n\t\t\tvar w = data.Weights;\r\n\t\t\tvar mr = data.MomentsRed;\r\n\t\t\tvar mg = data.MomentsGreen;\r\n\t\t\tvar mb = data.MomentsBlue;\r\n\t\t\tvar m = data.Moments;\r\n\t\t\tfor (var r = 1; r <= __MaxSideIndex; ++r) {\r\n\t\t\t\tvar area = new long[__SideSize];\r\n\t\t\t\tvar areaRed = new long[__SideSize];\r\n\t\t\t\tvar areaGreen = new long[__SideSize];\r\n\t\t\t\tvar areaBlue = new long[__SideSize];\r\n\t\t\t\tvar area2 = new float[__SideSize];\r\n\t\t\t\tfor (var g = 1; g <= __MaxSideIndex; ++g) {\r\n\t\t\t\t\tlong line = 0;\r\n\t\t\t\t\tlong lineRed = 0;\r\n\t\t\t\t\tlong lineGreen = 0;\r\n\t\t\t\t\tlong lineBlue = 0;\r\n\t\t\t\t\tvar line2 = 0.0f;\r\n\t\t\t\t\tfor (var b = 1; b <= __MaxSideIndex; ++b) {\r\n\t\t\t\t\t\tvar pos = (r << 10) + (r << 6) + r + (g << 5) + g + b; // [r,g,b]\r\n\t\t\t\t\t\tref var wp = ref w[pos];\r\n\t\t\t\t\t\tref var mrp = ref mr[pos];\r\n\t\t\t\t\t\tref var mgp = ref mg[pos];\r\n\t\t\t\t\t\tref var mbp = ref mb[pos];\r\n\t\t\t\t\t\tref var mp = ref m[pos];\r\n\t\t\t\t\t\tline += wp;\r\n\t\t\t\t\t\tlineRed += mrp;\r\n\t\t\t\t\t\tlineGreen += mgp;\r\n\t\t\t\t\t\tlineBlue += mbp;\r\n\t\t\t\t\t\tline2 += mp;\r\n\r\n\t\t\t\t\t\tpos -= __MaxSideIndex * __MaxSideIndex; // [r-1,g,b]\r\n\t\t\t\t\t\twp = w[pos] + (area[b] += line);\r\n\t\t\t\t\t\tmrp = mr[pos] + (areaRed[b] += lineRed);\r\n\t\t\t\t\t\tmgp = mg[pos] + (areaGreen[b] += lineGreen);\r\n\t\t\t\t\t\tmbp = mb[pos] + (areaBlue[b] += lineBlue);\r\n\t\t\t\t\t\tmp = m[pos] + (area2[b] += line2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic long Top(Box cube, int direction, int position, long[] moment) {\r\n\t\t\tint r0 = cube.RedMinimum,\r\n\t\t\t\tr1 = cube.RedMaximum,\r\n\t\t\t\tg0 = cube.GreenMinimum,\r\n\t\t\t\tg1 = cube.GreenMaximum,\r\n\t\t\t\tb0 = cube.BlueMinimum,\r\n\t\t\t\tb1 = cube.BlueMaximum;\r\n\t\t\tswitch (direction) {\r\n\t\t\t\tcase __Red:\r\n\t\t\t\t\tposition = (position << 10) + (position << 6) + position;\r\n\t\t\t\t\tg0 = (g0 << 5) + g0;\r\n\t\t\t\t\tg1 = (g1 << 5) + g1;\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t-moment[position + g1 + b1]\r\n\t\t\t\t\t\t+ moment[position + g1 + b0]\r\n\t\t\t\t\t\t+ moment[position + g0 + b1]\r\n\t\t\t\t\t\t- moment[position + g0 + b0];\r\n\t\t\t\tcase __Green:\r\n\t\t\t\t\tr0 = (r0 << 10) + (r0 << 6) + r0;\r\n\t\t\t\t\tr1 = (r1 << 10) + (r1 << 6) + r1;\r\n\t\t\t\t\tposition = (position << 5) + position;\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t-moment[position + r1 + b1]\r\n\t\t\t\t\t\t+ moment[position + r1 + b0]\r\n\t\t\t\t\t\t+ moment[position + r0 + b1]\r\n\t\t\t\t\t\t- moment[position + r0 + b0];\r\n\t\t\t\tcase __Blue:\r\n\t\t\t\t\tr0 = (r0 << 10) + (r0 << 6) + r0;\r\n\t\t\t\t\tr1 = (r1 << 10) + (r1 << 6) + r1;\r\n\t\t\t\t\tg0 = (g0 << 5) + g0;\r\n\t\t\t\t\tg1 = (g1 << 5) + g1;\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t-moment[position + r1 + g1]\r\n\t\t\t\t\t\t+ moment[position + r1 + g0]\r\n\t\t\t\t\t\t+ moment[position + r0 + g1]\r\n\t\t\t\t\t\t- moment[position + r0 + g0];\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic long Bottom(Box cube, int direction, long[] moment) {\r\n\t\t\tint r0 = cube.RedMinimum, r1 = cube.RedMaximum,\r\n\t\t\t\tg0 = cube.GreenMinimum, g1 = cube.GreenMaximum,\r\n\t\t\t\tb0 = cube.BlueMinimum, b1 = cube.BlueMaximum;\r\n\t\t\tr0 = (r0 << 10) + (r0 << 6) + r0;\r\n\t\t\tr1 = (r1 << 10) + (r1 << 6) + r1;\r\n\t\t\tg0 = (g0 << 5) + g0;\r\n\t\t\tg1 = (g1 << 5) + g1;\r\n\t\t\tswitch (direction) {\r\n\t\t\t\tcase __Red:\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t-moment[r0 + g1 + b1]\r\n\t\t\t\t\t\t+ moment[r0 + g1 + b0]\r\n\t\t\t\t\t\t+ moment[r0 + g0 + b1]\r\n\t\t\t\t\t\t- moment[r0 + g0 + b0];\r\n\t\t\t\tcase __Green:\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t-moment[r1 + g0 + b1]\r\n\t\t\t\t\t\t+ moment[r1 + g0 + b0]\r\n\t\t\t\t\t\t+ moment[r0 + g0 + b1]\r\n\t\t\t\t\t\t- moment[r0 + g0 + b0];\r\n\t\t\t\tcase __Blue:\r\n\t\t\t\t\treturn\r\n\t\t\t\t\t\t-moment[r1 + g1 + b0]\r\n\t\t\t\t\t\t+ moment[r1 + g0 + b0]\r\n\t\t\t\t\t\t+ moment[r0 + g1 + b0]\r\n\t\t\t\t\t\t- moment[r0 + g0 + b0];\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic CubeCut Maximize(ColorData data, Box cube, int direction, byte first, byte last, long wholeRed, long wholeGreen, long wholeBlue, long wholeWeight) {\r\n\t\t\tvar bottomRed = Bottom(cube, direction, data.MomentsRed);\r\n\t\t\tvar bottomGreen = Bottom(cube, direction, data.MomentsGreen);\r\n\t\t\tvar bottomBlue = Bottom(cube, direction, data.MomentsBlue);\r\n\t\t\tvar bottomWeight = Bottom(cube, direction, data.Weights);\r\n\r\n\t\t\tvar result = 0.0f;\r\n\t\t\tbool canSplit = false;\r\n\t\t\tbyte cutPoint = 0;\r\n\r\n\t\t\tfor (var position = first; position < last; ++position) {\r\n\t\t\t\tvar halfRed = bottomRed + Top(cube, direction, position, data.MomentsRed);\r\n\t\t\t\tvar halfGreen = bottomGreen + Top(cube, direction, position, data.MomentsGreen);\r\n\t\t\t\tvar halfBlue = bottomBlue + Top(cube, direction, position, data.MomentsBlue);\r\n\t\t\t\tvar halfWeight = bottomWeight + Top(cube, direction, position, data.Weights);\r\n\r\n\t\t\t\tif (halfWeight == 0) continue;\r\n\r\n\t\t\t\tvar halfDistance = halfRed * halfRed + halfGreen * halfGreen + halfBlue * halfBlue;\r\n\t\t\t\tvar temp = halfDistance / halfWeight;\r\n\r\n\t\t\t\thalfRed = wholeRed - halfRed;\r\n\t\t\t\thalfGreen = wholeGreen - halfGreen;\r\n\t\t\t\thalfBlue = wholeBlue - halfBlue;\r\n\t\t\t\thalfWeight = wholeWeight - halfWeight;\r\n\r\n\t\t\t\tif (halfWeight != 0) {\r\n\t\t\t\t\thalfDistance = halfRed * halfRed + halfGreen * halfGreen + halfBlue * halfBlue;\r\n\t\t\t\t\ttemp += halfDistance / halfWeight;\r\n\r\n\t\t\t\t\tif (temp > result) {\r\n\t\t\t\t\t\tresult = temp;\r\n\t\t\t\t\t\tcanSplit = true;\r\n\t\t\t\t\t\tcutPoint = position;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn new CubeCut(canSplit, cutPoint, result);\r\n\t\t}\r\n\r\n\t\tstatic bool Cut(ColorData data, ref Box first, ref Box second) {\r\n\t\t\tint direction;\r\n\t\t\tvar wholeRed = Volume(first, data.MomentsRed);\r\n\t\t\tvar wholeGreen = Volume(first, data.MomentsGreen);\r\n\t\t\tvar wholeBlue = Volume(first, data.MomentsBlue);\r\n\t\t\tvar wholeWeight = Volume(first, data.Weights);\r\n\r\n\t\t\tvar maxRed = Maximize(data, first, __Red, (byte)(first.RedMinimum + 1), first.RedMaximum, wholeRed, wholeGreen, wholeBlue, wholeWeight);\r\n\t\t\tvar maxGreen = Maximize(data, first, __Green, (byte)(first.GreenMinimum + 1), first.GreenMaximum, wholeRed, wholeGreen, wholeBlue, wholeWeight);\r\n\t\t\tvar maxBlue = Maximize(data, first, __Blue, (byte)(first.BlueMinimum + 1), first.BlueMaximum, wholeRed, wholeGreen, wholeBlue, wholeWeight);\r\n\r\n\t\t\tif ((maxRed.Value >= maxGreen.Value) && (maxRed.Value >= maxBlue.Value)) {\r\n\t\t\t\tdirection = __Red;\r\n\t\t\t\tif (maxRed.CanSplit == false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif ((maxGreen.Value >= maxRed.Value) && (maxGreen.Value >= maxBlue.Value))\r\n\t\t\t\t\tdirection = __Green;\r\n\t\t\t\telse\r\n\t\t\t\t\tdirection = __Blue;\r\n\t\t\t}\r\n\r\n\t\t\tsecond.RedMaximum = first.RedMaximum;\r\n\t\t\tsecond.GreenMaximum = first.GreenMaximum;\r\n\t\t\tsecond.BlueMaximum = first.BlueMaximum;\r\n\r\n\t\t\tswitch (direction) {\r\n\t\t\t\tcase __Red:\r\n\t\t\t\t\tsecond.RedMinimum = first.RedMaximum = maxRed.Position;\r\n\t\t\t\t\tsecond.GreenMinimum = first.GreenMinimum;\r\n\t\t\t\t\tsecond.BlueMinimum = first.BlueMinimum;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase __Green:\r\n\t\t\t\t\tsecond.GreenMinimum = first.GreenMaximum = maxGreen.Position;\r\n\t\t\t\t\tsecond.RedMinimum = first.RedMinimum;\r\n\t\t\t\t\tsecond.BlueMinimum = first.BlueMinimum;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase __Blue:\r\n\t\t\t\t\tsecond.BlueMinimum = first.BlueMaximum = maxBlue.Position;\r\n\t\t\t\t\tsecond.RedMinimum = first.RedMinimum;\r\n\t\t\t\t\tsecond.GreenMinimum = first.GreenMinimum;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tfirst.Volume = (first.RedMaximum - first.RedMinimum) * (first.GreenMaximum - first.GreenMinimum) * (first.BlueMaximum - first.BlueMinimum);\r\n\t\t\tsecond.Volume = (second.RedMaximum - second.RedMinimum) * (second.GreenMaximum - second.GreenMinimum) * (second.BlueMaximum - second.BlueMinimum);\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tstatic float CalculateVariance(ColorData data, Box cube) {\r\n\t\t\tfloat volumeRed = Volume(cube, data.MomentsRed);\r\n\t\t\tfloat volumeGreen = Volume(cube, data.MomentsGreen);\r\n\t\t\tfloat volumeBlue = Volume(cube, data.MomentsBlue);\r\n\t\t\tfloat volumeMoment = VolumeFloat(cube, data.Moments);\r\n\t\t\tfloat volumeWeight = Volume(cube, data.Weights);\r\n\r\n\t\t\tfloat distance = volumeRed * volumeRed + volumeGreen * volumeGreen + volumeBlue * volumeBlue;\r\n\r\n\t\t\tvar result = volumeMoment - distance / volumeWeight;\r\n\t\t\treturn double.IsNaN(result) ? 0.0f : result;\r\n\t\t}\r\n\r\n\t\tstatic long Volume(Box cube, long[] moment) {\r\n\t\t\tint r0 = cube.RedMinimum, r1 = cube.RedMaximum,\r\n\t\t\t\tg0 = cube.GreenMinimum, g1 = cube.GreenMaximum,\r\n\t\t\t\tb0 = cube.BlueMinimum, b1 = cube.BlueMaximum;\r\n\t\t\tr0 = (r0 << 10) + (r0 << 6) + r0;\r\n\t\t\tr1 = (r1 << 10) + (r1 << 6) + r1;\r\n\t\t\tg0 = (g0 << 5) + g0;\r\n\t\t\tg1 = (g1 << 5) + g1;\r\n\t\t\treturn moment[r1 + g1 + b1]\r\n\t\t\t\t\t- moment[r1 + g1 + b0]\r\n\t\t\t\t\t- moment[r1 + g0 + b1]\r\n\t\t\t\t\t+ moment[r1 + g0 + b0]\r\n\t\t\t\t\t- moment[r0 + g1 + b1]\r\n\t\t\t\t\t+ moment[r0 + g1 + b0]\r\n\t\t\t\t\t+ moment[r0 + g0 + b1]\r\n\t\t\t\t\t- moment[r0 + g0 + b0];\r\n\t\t}\r\n\r\n\t\tstatic float VolumeFloat(Box cube, float[] moment) {\r\n\t\t\tint r0 = cube.RedMinimum, r1 = cube.RedMaximum,\r\n\t\t\t\tg0 = cube.GreenMinimum, g1 = cube.GreenMaximum,\r\n\t\t\t\tb0 = cube.BlueMinimum, b1 = cube.BlueMaximum;\r\n\t\t\tr0 = (r0 << 10) + (r0 << 6) + r0;\r\n\t\t\tr1 = (r1 << 10) + (r1 << 6) + r1;\r\n\t\t\tg0 = (g0 << 5) + g0;\r\n\t\t\tg1 = (g1 << 5) + g1;\r\n\t\t\treturn moment[r1 + g1 + b1]\r\n\t\t\t\t\t- moment[r1 + g1 + b0]\r\n\t\t\t\t\t- moment[r1 + g0 + b1]\r\n\t\t\t\t\t+ moment[r1 + g0 + b0]\r\n\t\t\t\t\t- moment[r0 + g1 + b1]\r\n\t\t\t\t\t+ moment[r0 + g1 + b0]\r\n\t\t\t\t\t+ moment[r0 + g0 + b1]\r\n\t\t\t\t\t- moment[r0 + g0 + b0];\r\n\t\t}\r\n\r\n\t\tstatic Box[] SplitData(ref int colorCount, ColorData data) {\r\n\t\t\t--colorCount;\r\n\t\t\tvar next = 0;\r\n\t\t\tvar volumeVariance = new float[__MaxColor];\r\n\t\t\tvar cubes = new Box[__MaxColor];\r\n\t\t\tcubes[0].RedMaximum = __MaxSideIndex;\r\n\t\t\tcubes[0].GreenMaximum = __MaxSideIndex;\r\n\t\t\tcubes[0].BlueMaximum = __MaxSideIndex;\r\n\t\t\tfor (var cubeIndex = 1; cubeIndex < colorCount; ++cubeIndex) {\r\n\t\t\t\tif (Cut(data, ref cubes[next], ref cubes[cubeIndex])) {\r\n\t\t\t\t\tvolumeVariance[next] = cubes[next].Volume > 1 ? CalculateVariance(data, cubes[next]) : 0.0f;\r\n\t\t\t\t\tvolumeVariance[cubeIndex] = cubes[cubeIndex].Volume > 1 ? CalculateVariance(data, cubes[cubeIndex]) : 0.0f;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvolumeVariance[next] = 0.0f;\r\n\t\t\t\t\tcubeIndex--;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnext = 0;\r\n\t\t\t\tvar temp = volumeVariance[0];\r\n\r\n\t\t\t\tfor (var index = 1; index <= cubeIndex; ++index) {\r\n\t\t\t\t\tvar v = volumeVariance[index];\r\n\t\t\t\t\tif (v <= temp)\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\ttemp = v;\r\n\t\t\t\t\tnext = index;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (temp > 0.0)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tcolorCount = cubeIndex + 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tArray.Resize(ref cubes, colorCount);\r\n\t\t\treturn cubes;\r\n\t\t}\r\n\r\n\t\tstatic LookupData BuildLookups(IEnumerable<Box> cubes, ColorData data) {\r\n\t\t\tvar lookupData = new LookupData(__SideSize);\r\n\t\t\tvar lookups = lookupData.Lookups;\r\n\t\t\tint lookupsCount = lookupData.Lookups.Count;\r\n\t\t\tvar tags = lookupData.Tags;\r\n\t\t\tint ri, rgi;\r\n\t\t\tforeach (var cube in cubes) {\r\n\t\t\t\tbyte r1 = cube.RedMaximum,\r\n\t\t\t\t\tg1 = cube.GreenMaximum,\r\n\t\t\t\t\tb1 = cube.BlueMaximum,\r\n\t\t\t\t\tr0 = (byte)(cube.RedMinimum + 1),\r\n\t\t\t\t\tg0 = (byte)(cube.GreenMinimum + 1),\r\n\t\t\t\t\tb0 = (byte)(cube.BlueMinimum + 1);\r\n\t\t\t\tfor (var redIndex = r0; redIndex <= r1; ++redIndex) {\r\n\t\t\t\t\tri = (redIndex << 10) + (redIndex << 6) + redIndex; // redIndex * 33 * 33\r\n\t\t\t\t\tfor (var greenIndex = g0; greenIndex <= g1; ++greenIndex) {\r\n\t\t\t\t\t\trgi = ri + (greenIndex << 5) + greenIndex;\r\n\t\t\t\t\t\tfor (var blueIndex = b0; blueIndex <= b1; ++blueIndex) {\r\n\t\t\t\t\t\t\ttags[rgi + blueIndex] = lookupsCount; // [redIndex,greenIndex,blueIndex]\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar weight = Volume(cube, data.Weights);\r\n\r\n\t\t\t\tif (weight <= 0) continue;\r\n\r\n\t\t\t\tvar lookup = new Pixel(\r\n\t\t\t\t\t(byte)(Volume(cube, data.MomentsRed) / weight),\r\n\t\t\t\t\t(byte)(Volume(cube, data.MomentsGreen) / weight),\r\n\t\t\t\t\t(byte)(Volume(cube, data.MomentsBlue) / weight)\r\n\t\t\t\t);\r\n\t\t\t\tlookups.Add(lookup);\r\n\t\t\t}\r\n\t\t\treturn lookupData;\r\n\t\t}\r\n\r\n\t\tstatic QuantizedPalette GetQuantizedPalette(int colorCount, ColorData data, IEnumerable<Box> cubes) {\r\n\t\t\tint imageSize = data.PixelsCount;\r\n\t\t\tvar lookups = BuildLookups(cubes, data);\r\n\r\n\t\t\tvar quantizedPixels = data.QuantizedPixels;\r\n\t\t\tint red, green;\r\n\t\t\tfor (int index = 0; index < imageSize; ++index) {\r\n\t\t\t\tref var p = ref quantizedPixels[index];\r\n\t\t\t\tred = p >> 16;\r\n\t\t\t\tgreen = 0xFF & (p >> 8);\r\n\t\t\t\tp = lookups.Tags[(red << 10) + (red << 6) + red + (green << 5) + green + (0xFF & p)];// red*33*33 + green*33 + blue\r\n\t\t\t}\r\n\r\n\t\t\tvar reds = new int[colorCount + 1];\r\n\t\t\tvar greens = new int[colorCount + 1];\r\n\t\t\tvar blues = new int[colorCount + 1];\r\n\t\t\tvar sums = new int[colorCount + 1];\r\n\t\t\tvar palette = new QuantizedPalette(imageSize);\r\n\r\n\t\t\tIList<Pixel> pixels = data.Pixels;\r\n\t\t\tvar pixelIndexes = palette.PixelIndex;\r\n\t\t\tint pixelsCount = data.PixelsCount;\r\n\t\t\tvar lookupsList = lookups.Lookups;\r\n\t\t\tint lookupsCount = lookupsList.Count;\r\n\r\n\t\t\tvar cachedMatches = new Dictionary<int, int>();\r\n\r\n\t\t\tfor (int pixelIndex = 0; pixelIndex < pixelsCount; pixelIndex++) {\r\n\t\t\t\tvar pixel = pixels[pixelIndex];\r\n\t\t\t\tref var p = ref pixelIndexes[pixelIndex];\r\n\t\t\t\tp = -1;\r\n\t\t\t\tint bestMatch;\r\n\t\t\t\tint pr = pixel.Red, pg = pixel.Green, pb = pixel.Blue;\r\n\t\t\t\tint argb = pr << 16 | pg << 8 | pb;\r\n\r\n\t\t\t\tif (!cachedMatches.TryGetValue(argb, out bestMatch)) {\r\n\t\t\t\t\tbestMatch = quantizedPixels[pixelIndex];\r\n\t\t\t\t\tint bestDistance = Int32.MaxValue;\r\n\r\n\t\t\t\t\tfor (int lookupIndex = 0; lookupIndex < lookupsCount; lookupIndex++) {\r\n\t\t\t\t\t\tvar lookup = lookupsList[lookupIndex];\r\n\t\t\t\t\t\tvar deltaRed = pr - lookup.Red;\r\n\t\t\t\t\t\tvar deltaGreen = pg - lookup.Green;\r\n\t\t\t\t\t\tvar deltaBlue = pb - lookup.Blue;\r\n\r\n\t\t\t\t\t\tint distance = deltaRed * deltaRed + deltaGreen * deltaGreen + deltaBlue * deltaBlue;\r\n\r\n\t\t\t\t\t\tif (distance >= bestDistance)\r\n\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\tbestDistance = distance;\r\n\t\t\t\t\t\tbestMatch = lookupIndex;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcachedMatches[argb] = bestMatch;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treds[bestMatch] += pr;\r\n\t\t\t\tgreens[bestMatch] += pg;\r\n\t\t\t\tblues[bestMatch] += pb;\r\n\t\t\t\tsums[bestMatch]++;\r\n\r\n\t\t\t\tp = bestMatch;\r\n\t\t\t}\r\n\r\n\t\t\tfor (var paletteIndex = 0; paletteIndex < colorCount; paletteIndex++) {\r\n\t\t\t\tvar s = sums[paletteIndex];\r\n\t\t\t\tif (s > 0) {\r\n\t\t\t\t\treds[paletteIndex] /= s;\r\n\t\t\t\t\tgreens[paletteIndex] /= s;\r\n\t\t\t\t\tblues[paletteIndex] /= s;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpalette.Colors.Add(Color.FromArgb(reds[paletteIndex] & 0xFF, greens[paletteIndex] & 0xFF, blues[paletteIndex] & 0xFF));\r\n\t\t\t}\r\n\r\n\t\t\tpalette.Colors.Add(Color.FromArgb(0, 0, 0, 0));\r\n\r\n\t\t\treturn palette;\r\n\t\t}\r\n\r\n\t\tstruct Box\r\n\t\t{\r\n\t\t\tpublic byte RedMinimum; // exclusive\r\n\t\t\tpublic byte RedMaximum; // inclusive\r\n\t\t\tpublic byte GreenMinimum;\r\n\t\t\tpublic byte GreenMaximum;\r\n\t\t\tpublic byte BlueMinimum;\r\n\t\t\tpublic byte BlueMaximum;\r\n\t\t\tpublic int Volume;\r\n\t\t}\r\n\t\tsealed class ColorData\r\n\t\t{\r\n\t\t\tpublic ColorData(int dataGranularity, int bitmapWidth, int bitmapHeight) {\r\n\t\t\t\tdataGranularity++;\r\n\t\t\t\tvar s = dataGranularity * dataGranularity * dataGranularity;\r\n\t\t\t\tWeights = new long[s];\r\n\t\t\t\tMomentsRed = new long[s];\r\n\t\t\t\tMomentsGreen = new long[s];\r\n\t\t\t\tMomentsBlue = new long[s];\r\n\t\t\t\tMoments = new float[s];\r\n\r\n\t\t\t\tpixelsCount = bitmapWidth * bitmapHeight;\r\n\t\t\t\tpixels = new Pixel[pixelsCount];\r\n\t\t\t\tquantizedPixels = new int[pixelsCount];\r\n\t\t\t}\r\n\r\n\t\t\tinternal long[] Weights { get; }\r\n\t\t\tinternal long[] MomentsRed { get; }\r\n\t\t\tinternal long[] MomentsGreen { get; }\r\n\t\t\tinternal long[] MomentsBlue { get; }\r\n\t\t\tinternal float[] Moments { get; }\r\n\r\n\t\t\tinternal int[] QuantizedPixels => quantizedPixels;\r\n\t\t\tinternal Pixel[] Pixels => pixels;\r\n\r\n\t\t\tpublic int PixelsCount => pixels.Length;\r\n\t\t\tinternal void AddPixel(Pixel pixel, int quantizedPixel) {\r\n\t\t\t\tpixels[pixelFillingCounter] = pixel;\r\n\t\t\t\tquantizedPixels[pixelFillingCounter++] = quantizedPixel;\r\n\t\t\t}\r\n\r\n\t\t\treadonly Pixel[] pixels;\r\n\t\t\treadonly int[] quantizedPixels;\r\n\t\t\treadonly int pixelsCount;\r\n\t\t\tint pixelFillingCounter;\r\n\t\t}\r\n\t\treadonly struct CubeCut\r\n\t\t{\r\n\t\t\tpublic readonly bool CanSplit;\r\n\t\t\tpublic readonly byte Position;\r\n\t\t\tpublic readonly float Value;\r\n\r\n\t\t\tpublic CubeCut(bool canSplit, byte cutPoint, float result) {\r\n\t\t\t\tCanSplit = canSplit;\r\n\t\t\t\tPosition = cutPoint;\r\n\t\t\t\tValue = result;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsealed class LookupData\r\n\t\t{\r\n\t\t\tpublic LookupData(int granularity) {\r\n\t\t\t\tLookups = new List<Pixel>();\r\n\t\t\t\tTags = new int[granularity * granularity * granularity];\r\n\t\t\t}\r\n\r\n\t\t\tpublic IList<Pixel> Lookups { get; }\r\n\t\t\tpublic int[] Tags { get; }\r\n\t\t}\r\n\r\n\t\treadonly struct Pixel\r\n\t\t{\r\n\t\t\tpublic Pixel(byte red, byte green, byte blue) {\r\n\t\t\t\tRed = red;\r\n\t\t\t\tGreen = green;\r\n\t\t\t\tBlue = blue;\r\n\t\t\t}\r\n\r\n\t\t\tpublic readonly byte Red;\r\n\t\t\tpublic readonly byte Green;\r\n\t\t\tpublic readonly byte Blue;\r\n\t\t}\r\n\r\n\t\tsealed class QuantizedPalette\r\n\t\t{\r\n\t\t\tpublic QuantizedPalette(int size) {\r\n\t\t\t\tColors = new List<Color>();\r\n\t\t\t\tPixelIndex = new int[size];\r\n\t\t\t}\r\n\t\t\tpublic IList<Color> Colors { get; }\r\n\t\t\tpublic int[] PixelIndex { get; }\r\n\t\t}\r\n\r\n\t\tsealed class QuantizationException : ApplicationException\r\n\t\t{\r\n\t\t\tpublic QuantizationException(string message)\r\n\t\t\t\t: base(message) {\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Processor/Imaging/WuQuantize.c",
    "content": "﻿Having received many constructive comments and bug reports about my previous\nC implementation of my color quantizer (Graphics Gems vol. II, p. 126-133),\nI am posting the following second version of my program (hopefully 100%\nhealthy) as a reply to all those who are interested in the problem.\n\n\n\n\n/**********************************************************************\n\t    C Implementation of Wu's Color Quantizer (v. 2)\n\t    (see Graphics Gems vol. II, pp. 126-133)\n\nAuthor:\tXiaolin Wu\n\tDept. of Computer Science\n\tUniv. of Western Ontario\n\tLondon, Ontario N6A 5B7\n\twu@csd.uwo.ca\n\nAlgorithm: Greedy orthogonal bipartition of RGB space for variance\n\t   minimization aided by inclusion-exclusion tricks.\n\t   For speed no nearest neighbor search is done. Slightly\n\t   better performance can be expected by more sophisticated\n\t   but more expensive versions.\n\nThe author thanks Tom Lane at Tom_Lane@G.GP.CS.CMU.EDU for much of\nadditional documentation and a cure to a previous bug.\n\nFree to distribute, comments and suggestions are appreciated.\n**********************************************************************/\t\n\n#include<stdio.h>\n\n#define MAXCOLOR\t256\n#define\tRED\t2\n#define\tGREEN\t1\n#define BLUE\t0\n\nstruct box {\n    int r0;\t\t\t /* min value, exclusive */\n    int r1;\t\t\t /* max value, inclusive */\n    int g0;  \n    int g1;  \n    int b0;  \n    int b1;\n    int vol;\n};\n\n/* Histogram is in elements 1..HISTSIZE along each axis,\n * element 0 is for base or marginal value\n * NB: these must start out 0!\n */\n\nfloat\t\tm2[33][33][33];\nlong int\twt[33][33][33], mr[33][33][33],\tmg[33][33][33],\tmb[33][33][33];\nunsigned char   *Ir, *Ig, *Ib;\nint\t        size; /*image size*/\nint\t\tK;    /*color look-up table size*/\nunsigned short int *Qadd;\n\nvoid\nHist3d(vwt, vmr, vmg, vmb, m2) \n/* build 3-D color histogram of counts, r/g/b, c^2 */\nlong int *vwt, *vmr, *vmg, *vmb;\nfloat\t*m2;\n{\nregister int ind, r, g, b;\nint\t     inr, ing, inb, table[256];\nregister long int i;\n\t\t\n\tfor(i=0; i<256; ++i) table[i]=i*i;\n\tQadd = (unsigned short int *)malloc(sizeof(short int)*size);\n\tif (Qadd==NULL) {printf(\"Not enough space\\n\"); exit(1);}\n\tfor(i=0; i<size; ++i){\n\t    r = Ir[i]; g = Ig[i]; b = Ib[i];\n\t    inr=(r>>3)+1; \n\t    ing=(g>>3)+1; \n\t    inb=(b>>3)+1; \n\t    Qadd[i]=ind=(inr<<10)+(inr<<6)+inr+(ing<<5)+ing+inb;\n\t    /*[inr][ing][inb]*/\n\t    ++vwt[ind];\n\t    vmr[ind] += r;\n\t    vmg[ind] += g;\n\t    vmb[ind] += b;\n     \t    m2[ind] += (float)(table[r]+table[g]+table[b]);\n\t}\n}\n\n/* At conclusion of the histogram step, we can interpret\n *   wt[r][g][b] = sum over voxel of P(c)\n *   mr[r][g][b] = sum over voxel of r*P(c)  ,  similarly for mg, mb\n *   m2[r][g][b] = sum over voxel of c^2*P(c)\n * Actually each of these should be divided by 'size' to give the usual\n * interpretation of P() as ranging from 0 to 1, but we needn't do that here.\n */\n\n/* We now convert histogram into moments so that we can rapidly calculate\n * the sums of the above quantities over any desired box.\n */\n\n\nvoid\nM3d(vwt, vmr, vmg, vmb, m2) /* compute cumulative moments. */\nlong int *vwt, *vmr, *vmg, *vmb;\nfloat\t*m2;\n{\nregister unsigned short int ind1, ind2;\nregister unsigned char i, r, g, b;\nlong int line, line_r, line_g, line_b,\n\t area[33], area_r[33], area_g[33], area_b[33];\nfloat    line2, area2[33];\n\n    for(r=1; r<=32; ++r){\n\tfor(i=0; i<=32; ++i) \n\t    area2[i]=area[i]=area_r[i]=area_g[i]=area_b[i]=0;\n\tfor(g=1; g<=32; ++g){\n\t    line2 = line = line_r = line_g = line_b = 0;\n\t    for(b=1; b<=32; ++b){\n\t\tind1 = (r<<10) + (r<<6) + r + (g<<5) + g + b; /* [r][g][b] */\n\t\tline += vwt[ind1];\n\t\tline_r += vmr[ind1]; \n\t\tline_g += vmg[ind1]; \n\t\tline_b += vmb[ind1];\n\t\tline2 += m2[ind1];\n\t\tarea[b] += line;\n\t\tarea_r[b] += line_r;\n\t\tarea_g[b] += line_g;\n\t\tarea_b[b] += line_b;\n\t\tarea2[b] += line2;\n\t\tind2 = ind1 - 1089; /* [r-1][g][b] */\n\t\tvwt[ind1] = vwt[ind2] + area[b];\n\t\tvmr[ind1] = vmr[ind2] + area_r[b];\n\t\tvmg[ind1] = vmg[ind2] + area_g[b];\n\t\tvmb[ind1] = vmb[ind2] + area_b[b];\n\t\tm2[ind1] = m2[ind2] + area2[b];\n\t    }\n\t}\n    }\n}\n\n\nlong int Vol(cube, mmt) \n/* Compute sum over a box of any given statistic */\nstruct box *cube;\nlong int mmt[33][33][33];\n{\n    return( mmt[cube->r1][cube->g1][cube->b1] \n\t   -mmt[cube->r1][cube->g1][cube->b0]\n\t   -mmt[cube->r1][cube->g0][cube->b1]\n\t   +mmt[cube->r1][cube->g0][cube->b0]\n\t   -mmt[cube->r0][cube->g1][cube->b1]\n\t   +mmt[cube->r0][cube->g1][cube->b0]\n\t   +mmt[cube->r0][cube->g0][cube->b1]\n\t   -mmt[cube->r0][cube->g0][cube->b0] );\n}\n\n/* The next two routines allow a slightly more efficient calculation\n * of Vol() for a proposed subbox of a given box.  The sum of Top()\n * and Bottom() is the Vol() of a subbox split in the given direction\n * and with the specified new upper bound.\n */\n\nlong int Bottom(cube, dir, mmt)\n/* Compute part of Vol(cube, mmt) that doesn't depend on r1, g1, or b1 */\n/* (depending on dir) */\nstruct box *cube;\nunsigned char dir;\nlong int mmt[33][33][33];\n{\n    switch(dir){\n\tcase RED:\n\t    return( -mmt[cube->r0][cube->g1][cube->b1]\n\t\t    +mmt[cube->r0][cube->g1][cube->b0]\n\t\t    +mmt[cube->r0][cube->g0][cube->b1]\n\t\t    -mmt[cube->r0][cube->g0][cube->b0] );\n\t    break;\n\tcase GREEN:\n\t    return( -mmt[cube->r1][cube->g0][cube->b1]\n\t\t    +mmt[cube->r1][cube->g0][cube->b0]\n\t\t    +mmt[cube->r0][cube->g0][cube->b1]\n\t\t    -mmt[cube->r0][cube->g0][cube->b0] );\n\t    break;\n\tcase BLUE:\n\t    return( -mmt[cube->r1][cube->g1][cube->b0]\n\t\t    +mmt[cube->r1][cube->g0][cube->b0]\n\t\t    +mmt[cube->r0][cube->g1][cube->b0]\n\t\t    -mmt[cube->r0][cube->g0][cube->b0] );\n\t    break;\n    }\n}\n\n\nlong int Top(cube, dir, pos, mmt)\n/* Compute remainder of Vol(cube, mmt), substituting pos for */\n/* r1, g1, or b1 (depending on dir) */\nstruct box *cube;\nunsigned char dir;\nint   pos;\nlong int mmt[33][33][33];\n{\n    switch(dir){\n\tcase RED:\n\t    return( mmt[pos][cube->g1][cube->b1] \n\t\t   -mmt[pos][cube->g1][cube->b0]\n\t\t   -mmt[pos][cube->g0][cube->b1]\n\t\t   +mmt[pos][cube->g0][cube->b0] );\n\t    break;\n\tcase GREEN:\n\t    return( mmt[cube->r1][pos][cube->b1] \n\t\t   -mmt[cube->r1][pos][cube->b0]\n\t\t   -mmt[cube->r0][pos][cube->b1]\n\t\t   +mmt[cube->r0][pos][cube->b0] );\n\t    break;\n\tcase BLUE:\n\t    return( mmt[cube->r1][cube->g1][pos]\n\t\t   -mmt[cube->r1][cube->g0][pos]\n\t\t   -mmt[cube->r0][cube->g1][pos]\n\t\t   +mmt[cube->r0][cube->g0][pos] );\n\t    break;\n    }\n}\n\n\nfloat Var(cube)\n/* Compute the weighted variance of a box */\n/* NB: as with the raw statistics, this is really the variance * size */\nstruct box *cube;\n{\nfloat dr, dg, db, xx;\n\n    dr = Vol(cube, mr); \n    dg = Vol(cube, mg); \n    db = Vol(cube, mb);\n    xx =  m2[cube->r1][cube->g1][cube->b1] \n\t -m2[cube->r1][cube->g1][cube->b0]\n\t -m2[cube->r1][cube->g0][cube->b1]\n\t +m2[cube->r1][cube->g0][cube->b0]\n\t -m2[cube->r0][cube->g1][cube->b1]\n\t +m2[cube->r0][cube->g1][cube->b0]\n\t +m2[cube->r0][cube->g0][cube->b1]\n\t -m2[cube->r0][cube->g0][cube->b0];\n\n    return( xx - (dr*dr+dg*dg+db*db)/(float)Vol(cube,wt) );    \n}\n\n/* We want to minimize the sum of the variances of two subboxes.\n * The sum(c^2) terms can be ignored since their sum over both subboxes\n * is the same (the sum for the whole box) no matter where we split.\n * The remaining terms have a minus sign in the variance formula,\n * so we drop the minus sign and MAXIMIZE the sum of the two terms.\n */\n\n\nfloat Maximize(cube, dir, first, last, cut,\n\t\twhole_r, whole_g, whole_b, whole_w)\nstruct box *cube;\nunsigned char dir;\nint first, last, *cut;\nlong int whole_r, whole_g, whole_b, whole_w;\n{\nregister long int half_r, half_g, half_b, half_w;\nlong int base_r, base_g, base_b, base_w;\nregister int i;\nregister float temp, max;\n\n    base_r = Bottom(cube, dir, mr);\n    base_g = Bottom(cube, dir, mg);\n    base_b = Bottom(cube, dir, mb);\n    base_w = Bottom(cube, dir, wt);\n    max = 0.0;\n    *cut = -1;\n    for(i=first; i<last; ++i){\n\thalf_r = base_r + Top(cube, dir, i, mr);\n\thalf_g = base_g + Top(cube, dir, i, mg);\n\thalf_b = base_b + Top(cube, dir, i, mb);\n\thalf_w = base_w + Top(cube, dir, i, wt);\n        /* now half_x is sum over lower half of box, if split at i */\n        if (half_w == 0) {      /* subbox could be empty of pixels! */\n          continue;             /* never split into an empty box */\n\t} else\n        temp = ((float)half_r*half_r + (float)half_g*half_g +\n                (float)half_b*half_b)/half_w;\n\n\thalf_r = whole_r - half_r;\n\thalf_g = whole_g - half_g;\n\thalf_b = whole_b - half_b;\n\thalf_w = whole_w - half_w;\n        if (half_w == 0) {      /* subbox could be empty of pixels! */\n          continue;             /* never split into an empty box */\n\t} else\n        temp += ((float)half_r*half_r + (float)half_g*half_g +\n                 (float)half_b*half_b)/half_w;\n\n    \tif (temp > max) {max=temp; *cut=i;}\n    }\n    return(max);\n}\n\nint\nCut(set1, set2)\nstruct box *set1, *set2;\n{\nunsigned char dir;\nint cutr, cutg, cutb;\nfloat maxr, maxg, maxb;\nlong int whole_r, whole_g, whole_b, whole_w;\n\n    whole_r = Vol(set1, mr);\n    whole_g = Vol(set1, mg);\n    whole_b = Vol(set1, mb);\n    whole_w = Vol(set1, wt);\n\n    maxr = Maximize(set1, RED, set1->r0+1, set1->r1, &cutr,\n\t\t    whole_r, whole_g, whole_b, whole_w);\n    maxg = Maximize(set1, GREEN, set1->g0+1, set1->g1, &cutg,\n\t\t    whole_r, whole_g, whole_b, whole_w);\n    maxb = Maximize(set1, BLUE, set1->b0+1, set1->b1, &cutb,\n\t\t    whole_r, whole_g, whole_b, whole_w);\n\n    if( (maxr>=maxg)&&(maxr>=maxb) ) {\n\tdir = RED;\n\tif (cutr < 0) return 0; /* can't split the box */\n    }\n    else\n    if( (maxg>=maxr)&&(maxg>=maxb) ) \n\tdir = GREEN;\n    else\n\tdir = BLUE; \n\n    set2->r1 = set1->r1;\n    set2->g1 = set1->g1;\n    set2->b1 = set1->b1;\n\n    switch (dir){\n\tcase RED:\n\t    set2->r0 = set1->r1 = cutr;\n\t    set2->g0 = set1->g0;\n\t    set2->b0 = set1->b0;\n\t    break;\n\tcase GREEN:\n\t    set2->g0 = set1->g1 = cutg;\n\t    set2->r0 = set1->r0;\n\t    set2->b0 = set1->b0;\n\t    break;\n\tcase BLUE:\n\t    set2->b0 = set1->b1 = cutb;\n\t    set2->r0 = set1->r0;\n\t    set2->g0 = set1->g0;\n\t    break;\n    }\n    set1->vol=(set1->r1-set1->r0)*(set1->g1-set1->g0)*(set1->b1-set1->b0);\n    set2->vol=(set2->r1-set2->r0)*(set2->g1-set2->g0)*(set2->b1-set2->b0);\n    return 1;\n}\n\n\nMark(cube, label, tag)\nstruct box *cube;\nint label;\nunsigned char *tag;\n{\nregister int r, g, b;\n\n    for(r=cube->r0+1; r<=cube->r1; ++r)\n       for(g=cube->g0+1; g<=cube->g1; ++g)\n\t  for(b=cube->b0+1; b<=cube->b1; ++b)\n\t    tag[(r<<10) + (r<<6) + r + (g<<5) + g + b] = label;\n}\n\nmain()\n{\nstruct box\tcube[MAXCOLOR];\nunsigned char\t*tag;\nunsigned char\tlut_r[MAXCOLOR], lut_g[MAXCOLOR], lut_b[MAXCOLOR];\nint\t\tnext;\nregister long int\ti, weight;\nregister int\tk;\nfloat\t\tvv[MAXCOLOR], temp;\n\n\t/* input R,G,B components into Ir, Ig, Ib;\n\t   set size to width*height */\n\n\tprintf(\"no. of colors:\\n\");\n\tscanf(\"%d\", &K);\n\n\tHist3d(wt, mr, mg, mb, m2); printf(\"Histogram done\\n\");\n\tfree(Ig); free(Ib); free(Ir);\n\n\tM3d(wt, mr, mg, mb, m2);    printf(\"Moments done\\n\");\n\n\tcube[0].r0 = cube[0].g0 = cube[0].b0 = 0;\n\tcube[0].r1 = cube[0].g1 = cube[0].b1 = 32;\n\tnext = 0;\n        for(i=1; i<K; ++i){\n            if (Cut(&cube[next], &cube[i])) {\n              /* volume test ensures we won't try to cut one-cell box */\n              vv[next] = (cube[next].vol>1) ? Var(&cube[next]) : 0.0;\n              vv[i] = (cube[i].vol>1) ? Var(&cube[i]) : 0.0;\n\t    } else {\n              vv[next] = 0.0;   /* don't try to split this box again */\n              i--;              /* didn't create box i */\n\t    }\n            next = 0; temp = vv[0];\n            for(k=1; k<=i; ++k)\n                if (vv[k] > temp) {\n                    temp = vv[k]; next = k;\n\t\t}\n            if (temp <= 0.0) {\n              K = i+1;\n              fprintf(stderr, \"Only got %d boxes\\n\", K);\n              break;\n\t    }\n\t}\n    \tprintf(\"Partition done\\n\");\n\n\t/* the space for array m2 can be freed now */\n\n\ttag = (unsigned char *)malloc(33*33*33);\n\tif (tag==NULL) {printf(\"Not enough space\\n\"); exit(1);}\n\tfor(k=0; k<K; ++k){\n\t    Mark(&cube[k], k, tag);\n\t    weight = Vol(&cube[k], wt);\n\t    if (weight) {\n\t\tlut_r[k] = Vol(&cube[k], mr) / weight;\n\t\tlut_g[k] = Vol(&cube[k], mg) / weight;\n\t\tlut_b[k] = Vol(&cube[k], mb) / weight;\n\t    }\n\t    else{\n\t      fprintf(stderr, \"bogus box %d\\n\", k);\n\t      lut_r[k] = lut_g[k] = lut_b[k] = 0;\t\t\n\t    }\n\t}\n\n\tfor(i=0; i<size; ++i) Qadd[i] = tag[Qadd[i]];\n\t\n\t/* output lut_r, lut_g, lut_b as color look-up table contents,\n\t   Qadd as the quantized image (array of table addresses). */\n}\n"
  },
  {
    "path": "App/Processor/InfoDocProcessor/CollapseBookmarkProcessor.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class CollapseBookmarkProcessor : IInfoDocProcessor\r\n\t{\r\n\t\tpublic BookmarkStatus BookmarkStatus { get; set; }\r\n\r\n\t\t#region IBookmarkProcessor 成员\r\n\r\n\t\tpublic bool Process(System.Xml.XmlElement bookmark) {\r\n\t\t\tswitch (BookmarkStatus) {\r\n\t\t\t\tcase BookmarkStatus.AsIs:\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tcase BookmarkStatus.CollapseAll:\r\n\t\t\t\t\tbookmark.SetAttribute(Constants.BookmarkAttributes.Open, Constants.Boolean.False);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase BookmarkStatus.ExpandAll:\r\n\t\t\t\t\tbookmark.SetAttribute(Constants.BookmarkAttributes.Open, Constants.Boolean.True);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tcase BookmarkStatus.ExpandTop:\r\n\t\t\t\t\tvar p = bookmark.ParentNode;\r\n\t\t\t\t\tif (p?.Name == Constants.DocumentBookmark) {\r\n\t\t\t\t\t\tbookmark.SetAttribute(Constants.BookmarkAttributes.Open, Constants.Boolean.True);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tbookmark.SetAttribute(Constants.BookmarkAttributes.Open, Constants.Boolean.False);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoDocProcessor/ConvertUnitProcessor.cs",
    "content": "﻿using System;\r\nusing System.Xml;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ConvertUnitProcessor : IInfoDocProcessor\r\n\t{\r\n\t\tpublic float UnitFactor { get; set; }\r\n\r\n\t\tpublic ConvertUnitProcessor() {\r\n\t\t\tUnitFactor = 1;\r\n\t\t}\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic bool Process(XmlElement item) {\r\n\t\t\tConvertUnit(item, Constants.Coordinates.Bottom);\r\n\t\t\tConvertUnit(item, Constants.Coordinates.Left);\r\n\t\t\tConvertUnit(item, Constants.Coordinates.Right);\r\n\t\t\tConvertUnit(item, Constants.Coordinates.Top);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tbool ConvertUnit(XmlElement item, string attribute) {\r\n\t\t\tvar a = item.GetAttributeNode(attribute);\r\n\t\t\tif (a != null) {\r\n\t\t\t\ta.Value = Common.UnitConverter.ToPoint(a.Value, UnitFactor);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoDocProcessor/ForceInternalDestinationProcessor.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ForceInternalDestinationProcessor : IInfoDocProcessor\r\n\t{\r\n\t\t#region IBookmarkProcessor 成员\r\n\r\n\t\tpublic bool Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item.ParentNode == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.Name != Constants.Bookmark && item.Name != Constants.PageLinkAttributes.Link) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tswitch (item.GetAttribute(Constants.DestinationAttributes.Action)) {\r\n\t\t\t\tcase Constants.ActionType.GotoR:\r\n\t\t\t\tcase Constants.ActionType.Launch:\r\n\t\t\t\tcase Constants.ActionType.Uri:\r\n\t\t\t\t\tif (item.GetAttribute(Constants.DestinationAttributes.Path).EndsWith(\".pdf\", StringComparison.InvariantCultureIgnoreCase)) {\r\n\t\t\t\t\t\titem.RemoveAttribute(Constants.DestinationAttributes.Action);\r\n\t\t\t\t\t\tif (item.HasAttribute(Constants.DestinationAttributes.Page) == false\r\n\t\t\t\t\t\t\t&& item.HasAttribute(Constants.DestinationAttributes.Named) == false\r\n\t\t\t\t\t\t\t&& item.HasAttribute(Constants.DestinationAttributes.NamedN) == false\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\titem.SetAttribute(Constants.DestinationAttributes.Page, \"1\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}"
  },
  {
    "path": "App/Processor/InfoDocProcessor/GotoDestinationProcessor.cs",
    "content": "﻿using System;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class GotoDestinationProcessor : IInfoDocProcessor\r\n\t{\r\n\t\tpublic bool RemoveOrphanDestination { get; set; }\r\n\t\tpublic int[] PageRemapper { get; set; }\r\n\t\tpublic CoordinateTranslationSettings[] TransitionMapper { get; set; }\r\n\r\n\t\t#region IBookmarkProcessor 成员\r\n\r\n\t\tpublic bool Process(XmlElement item) {\r\n\t\t\tint page;\r\n\r\n\t\t\tif (item.ParentNode == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (item.Name != Constants.Bookmark && item.Name != Constants.PageLinkAttributes.Link) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar a = item.GetAttribute(Constants.DestinationAttributes.Action);\r\n\t\t\tif (String.IsNullOrEmpty(a) == false && a != Constants.ActionType.Goto) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.GetAttribute(Constants.DestinationAttributes.Page).TryParse(out page) == false) {\r\n\t\t\t\tRemoveGotoAction(item);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tSystem.Diagnostics.Debug.WriteLine(item.GetAttribute(Constants.BookmarkAttributes.Title));\r\n\t\t\tif (page > 0) {\r\n\t\t\t\tif (TransitionMapper != null) {\r\n\t\t\t\t\tif (PageRemapper != null && page >= PageRemapper.Length) {\r\n\t\t\t\t\t\tSystem.Diagnostics.Trace.WriteLine(\"跳转页码位置无效：\" + page);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (TransitionMapper[page] != null) {\r\n\t\t\t\t\t\tvar ct = TransitionMapper[page];\r\n\t\t\t\t\t\tTranslateDestinationCoordinates(item, ct);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (PageRemapper != null) {\r\n\t\t\t\t\tif (page < PageRemapper.Length && (page = PageRemapper[page]) > 0) {\r\n\t\t\t\t\t\titem.SetAttribute(Constants.DestinationAttributes.Page, page.ToText());\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (RemoveOrphanDestination) {\r\n\t\t\t\t\t\tRemoveOrphan(item);\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (RemoveOrphanDestination) {\r\n\t\t\t\tRemoveOrphan(item);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tRemoveGotoAction(item);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tstatic void RemoveGotoAction(XmlElement item) {\r\n\t\t\tif (item.Name == Constants.ActionType.Goto) {\r\n\t\t\t\titem.ParentNode.RemoveChild(item);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\titem.RemoveAttribute(Constants.DestinationAttributes.Action);\r\n\t\t\t\titem.RemoveAttribute(Constants.DestinationAttributes.Page);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void RemoveOrphan(XmlElement item) {\r\n\t\t\tif (item.HasChildNodes && item.LocalName == Constants.Bookmark) {\r\n\t\t\t\twhile (item.HasChildNodes) {\r\n\t\t\t\t\tif (item.LastChild is not XmlElement c ||\r\n\t\t\t\t\t\t(c.HasAttribute(Constants.DestinationAttributes.Action) == false\r\n\t\t\t\t\t\t\t&& c.HasChildNodes == false)) {\r\n\t\t\t\t\t\titem.RemoveChild(item.LastChild);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\titem.ParentNode.InsertAfter(item.LastChild, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\titem.ParentNode.RemoveChild(item);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tstatic void TranslateDestinationCoordinates(XmlElement item, CoordinateTranslationSettings ct) {\r\n\t\t\tfloat p;\r\n\t\t\tif (item.GetAttribute(Constants.Coordinates.Top).TryParse(out p) && p != 0) {\r\n\t\t\t\titem.SetAttribute(Constants.Coordinates.Top, (p * ct.YScale + ct.YTranslation).ToText());\r\n\t\t\t}\r\n\t\t\tif (item.GetAttribute(Constants.Coordinates.Bottom).TryParse(out p) && p != 0) {\r\n\t\t\t\titem.SetAttribute(Constants.Coordinates.Bottom, (p * ct.YScale + ct.YTranslation).ToText());\r\n\t\t\t}\r\n\t\t\tif (item.GetAttribute(Constants.Coordinates.Left).TryParse(out p) && p != 0) {\r\n\t\t\t\titem.SetAttribute(Constants.Coordinates.Left, (p * ct.XScale + ct.XTranslation).ToText());\r\n\t\t\t}\r\n\t\t\tif (item.GetAttribute(Constants.Coordinates.Right).TryParse(out p) && p != 0) {\r\n\t\t\t\titem.SetAttribute(Constants.Coordinates.Right, (p * ct.XScale + ct.XTranslation).ToText());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoDocProcessor/RemoveZoomRateProcessor.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class RemoveZoomRateProcessor : IInfoDocProcessor\r\n\t{\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic bool Process(System.Xml.XmlElement item) {\r\n\t\t\tvar d = item.GetAttributeNode(Constants.DestinationAttributes.View);\r\n\t\t\tif (d != null && d.Value != Constants.DestinationAttributes.ViewType.XYZ) {\r\n\t\t\t\td.Value = Constants.DestinationAttributes.ViewType.XYZ;\r\n\t\t\t}\r\n\t\t\titem.RemoveAttribute(Constants.Coordinates.ScaleFactor);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoDocProcessor/ShiftPageProcessor.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ShiftPageProcessor : IInfoDocProcessor\r\n\t{\r\n\t\tpublic int Offset { get; set; }\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic bool Process(System.Xml.XmlElement item) {\r\n\t\t\tvar a = item.GetAttributeNode(Constants.DestinationAttributes.Page);\r\n\t\t\tif (a != null && a.Value.TryParse(out int pageNum)/* && pageNum > 0*/) {\r\n\t\t\t\tpageNum += Offset;\r\n\t\t\t\ta.Value = pageNum.ToText();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/BookmarkMatcher.cs",
    "content": "﻿using System.Xml;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal abstract class BookmarkMatcher\r\n\t{\r\n\t\tinternal enum MatcherType\r\n\t\t{\r\n\t\t\tNormal, Regex, XPath\r\n\t\t}\r\n\r\n\t\tinternal abstract bool Match(XmlElement item);\r\n\t\tinternal abstract IUndoAction Replace(XmlElement item, string replacement);\r\n\t\tinternal static BookmarkMatcher Create(string pattern, MatcherType type, bool matchCase, bool fullMatch) {\r\n\t\t\treturn type == MatcherType.XPath\r\n\t\t\t\t? new XPathMatcher(pattern)\r\n\t\t\t\t: new RegexMatcher(pattern, matchCase, type == MatcherType.Regex, fullMatch);\r\n\t\t}\r\n\t\tsealed class RegexMatcher : BookmarkMatcher\r\n\t\t{\r\n\t\t\treadonly Model.MatchPattern.IMatcher _matcher;\r\n\t\t\tinternal RegexMatcher(string pattern, bool matchCase, bool regexSearch, bool fullMatch) {\r\n\t\t\t\t_matcher = new Model.MatchPattern(pattern, matchCase, fullMatch, regexSearch).CreateMatcher();\r\n\t\t\t}\r\n\t\t\tinternal override bool Match(XmlElement item) {\r\n\t\t\t\treturn _matcher.Matches(item.GetAttribute(Constants.BookmarkAttributes.Title));\r\n\t\t\t}\r\n\t\t\tinternal override IUndoAction Replace(XmlElement item, string replacement) {\r\n\t\t\t\tvar a = item.GetAttributeNode(Constants.BookmarkAttributes.Title);\r\n\t\t\t\tif (a == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tvar t = a.Value;\r\n\t\t\t\tif (_matcher.Matches(t)) {\r\n\t\t\t\t\tvar r = _matcher.Replace(t, replacement);\r\n\t\t\t\t\treturn r == t ? null : (IUndoAction)UndoAttributeAction.GetUndoAction(item, Constants.BookmarkAttributes.Title, r);\r\n\t\t\t\t}\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsealed class XPathMatcher : BookmarkMatcher\r\n\t\t{\r\n\t\t\treadonly System.Xml.XPath.XPathExpression _xpath;\r\n\t\t\tinternal XPathMatcher(string pattern) {\r\n\t\t\t\t_xpath = System.Xml.XPath.XPathExpression.Compile(\"*[\" + pattern + \"]\");\r\n\t\t\t}\r\n\t\t\tinternal override bool Match(XmlElement item) {\r\n\t\t\t\treturn item.CreateNavigator().Matches(_xpath);\r\n\t\t\t}\r\n\t\t\tinternal override IUndoAction Replace(XmlElement item, string replacement) {\r\n\t\t\t\tvar a = item.GetAttributeNode(Constants.BookmarkAttributes.Title);\r\n\t\t\t\tif (a == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tvar n = item.CreateNavigator().SelectSingleNode(_xpath);\r\n\t\t\t\treturn n == null || a.Value == replacement\r\n\t\t\t\t\t? null\r\n\t\t\t\t\t: (IUndoAction)UndoAttributeAction.GetUndoAction(item, Constants.BookmarkAttributes.Title, replacement);\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal sealed class SimpleReplacer : BookmarkMatcher\r\n\t\t{\r\n\t\t\tinternal override bool Match(XmlElement item) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tinternal override IUndoAction Replace(XmlElement item, string replacement) {\r\n\t\t\t\tvar a = item.GetAttributeNode(Constants.BookmarkAttributes.Title);\r\n\t\t\t\tif (a == null) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\treturn a.Value != replacement\r\n\t\t\t\t\t? UndoAttributeAction.GetUndoAction(item, Constants.BookmarkAttributes.Title, replacement)\r\n\t\t\t\t\t: (IUndoAction)null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/BookmarkOpenStatusProcessor.cs",
    "content": "﻿\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class BookmarkOpenStatusProcessor : IPdfInfoXmlProcessor, IPdfInfoXmlProcessor<bool>\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 表示处理器是否应打开书签。\r\n\t\t/// </summary>\r\n\t\tpublic bool Parameter { get; set; }\r\n\t\tpublic BookmarkOpenStatusProcessor() {\r\n\t\t}\r\n\t\tpublic BookmarkOpenStatusProcessor(bool open) {\r\n\t\t\tParameter = open;\r\n\t\t}\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => $\"设置书签状态为{(Parameter ? \"打开\" : \"关闭\")}\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item.SelectSingleNode(Constants.Bookmark) == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar v = item.HasChildNodes && item.SelectSingleNode(Constants.Bookmark) != null && Parameter\r\n\t\t\t\t? Constants.Boolean.True\r\n\t\t\t\t: null;\r\n\t\t\treturn UndoAttributeAction.GetUndoAction(item, Constants.BookmarkAttributes.Open, v);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ChangeCoordinateProcessor.cs",
    "content": "﻿using PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ChangeCoordinateProcessor(string coordinateName, float value, bool absolute, bool proportional) : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tpublic string CoordinateName { get; } = coordinateName;\r\n\t\tpublic float Value { get; } = value;\r\n\t\tpublic bool IsAbsolute { get; } = absolute;\r\n\t\tpublic bool IsProportional { get; } = proportional;\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => $\"{(IsAbsolute ? \"更改\" : IsProportional ? \"缩放\" : \"调整\")}{CoordinateName}坐标定位\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tfloat c;\r\n\t\t\tstring v;\r\n\t\t\titem.GetAttribute(CoordinateName).TryParse(out c);\r\n\t\t\tif (IsAbsolute) {\r\n\t\t\t\tif (c != Value) {\r\n\t\t\t\t\tv = Value.ToText();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (Value != 0) {\r\n\t\t\t\tv = (IsProportional ? Value * c : Value + c).ToText();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn UndoAttributeAction.GetUndoAction(item, CoordinateName, v);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ChangePageCoordinateProcessor.cs",
    "content": "﻿namespace PDFPatcher.Processor\r\n{\r\n\tsealed class ChangePageCoordinateProcessor(string coordinateName, int pageNumber, float x, float y) : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tpublic string CoordinateName { get; } = coordinateName;\r\n\t\tpublic int PageNumber { get; } = pageNumber;\r\n\t\tpublic float X { get; } = x;\r\n\t\tpublic float Y { get; } = y;\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"调整页码坐标定位\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tundo.SetAttribute(item, Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\tundo.Add(new ChangePageNumberProcessor(PageNumber, true, false).Process(item));\r\n\t\t\tundo.Add(new ChangeCoordinateProcessor(CoordinateName, Y, true, false).Process(item));\r\n\t\t\treturn undo;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ChangePageNumberProcessor.cs",
    "content": "﻿using System;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ChangePageNumberProcessor(int amount, bool isAbsolute, bool skipZero, bool takeFollowing = false) : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tpublic bool IsAbsolute { get; } = isAbsolute;\r\n\t\tpublic int Amount { get; } = amount;\r\n\t\tpublic bool SkipZero { get; } = skipZero;\r\n\t\tpublic bool TakeFollowing { get; } = takeFollowing;\r\n\r\n\t\tpublic ChangePageNumberProcessor(int amount) : this(amount, false, false, false) { }\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"更改目标页码\";\r\n\r\n\t\tpublic IUndoAction Process(XmlElement item) {\r\n\t\t\tint p = item.GetValue(Constants.DestinationAttributes.Page, 0);\r\n\t\t\tvar a = item.GetValue(Constants.DestinationAttributes.Action);\r\n\t\t\tif (a != Constants.ActionType.Goto && a != Constants.ActionType.GotoR\r\n\t\t\t\t&& (a is null && TakeFollowing) == false && Amount == 0\r\n\t\t\t\t|| String.IsNullOrEmpty(a) == false && p < 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (p == 0 && TakeFollowing) {\r\n\t\t\t\treturn TakeFollowingBookmarkDestination(item, Amount);\r\n\t\t\t}\r\n\t\t\tif (SkipZero\r\n\t\t\t\t&& item.HasAttribute(Constants.DestinationAttributes.Page) == false) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tif (item.GetValue(Constants.DestinationAttributes.Page).TryParse(out p)) {\r\n\t\t\t\tif (IsAbsolute) {\r\n\t\t\t\t\tif (p == Amount) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tp = Amount;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tp += Amount;\r\n\t\t\t\t}\r\n\t\t\t\treturn p < 1\r\n\t\t\t\t\t? null\r\n\t\t\t\t\t: UndoAttributeAction.GetUndoAction(item, Constants.DestinationAttributes.Page, p.ToText());\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\t\tundo.SetAttribute(item, Constants.DestinationAttributes.Page, Amount.ToText());\r\n\t\t\t\tif (String.IsNullOrEmpty(a)) {\r\n\t\t\t\t\tundo.SetAttribute(item, Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\t\t}\r\n\t\t\t\treturn undo;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic UndoActionGroup TakeFollowingBookmarkDestination(XmlElement bookmark, int amount) {\r\n\t\t\tforeach (var item in bookmark.ChildrenOrFollowingSiblings()) {\r\n\t\t\t\tvar p = item.GetValue(Constants.DestinationAttributes.Page);\r\n\t\t\t\tint n;\r\n\t\t\t\tif (String.IsNullOrEmpty(p) || (n = p.ToInt32()) <= 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar a = item.GetValue(Constants.DestinationAttributes.Action);\r\n\t\t\t\tif (a != Constants.ActionType.Goto && a != Constants.ActionType.GotoR) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tn += amount;\r\n\t\t\t\tif (n <= 0) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\t\tundo.SetAttribute(bookmark, Constants.DestinationAttributes.Page, (n + amount).ToText());\r\n\t\t\t\tundo.SetAttribute(bookmark, Constants.DestinationAttributes.Action, a);\r\n\t\t\t\tCopyAttributes(bookmark, item, undo, Constants.Coordinates.Top, Constants.Coordinates.Left, Constants.Coordinates.Bottom, Constants.Coordinates.Right, Constants.Coordinates.ScaleFactor);\r\n\t\t\t\treturn undo;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tstatic void CopyAttributes(XmlElement bookmark, XmlElement item, UndoActionGroup undo, params string[] names) {\r\n\t\t\tforeach (var name in names) {\r\n\t\t\t\tvar value = item.GetValue(name);\r\n\t\t\t\tif (String.IsNullOrEmpty(value) == false) {\r\n\t\t\t\t\tundo.SetAttribute(bookmark, name, value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ChangeZoomRateProcessor.cs",
    "content": "﻿using PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ChangeZoomRateProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tpublic string ZoomMethod { get; }\r\n\t\tpublic float ZoomRate { get; }\r\n\r\n\t\tpublic ChangeZoomRateProcessor(object zoomRate) {\r\n\t\t\tif (zoomRate is string || zoomRate == null) {\r\n\t\t\t\tZoomMethod = zoomRate as string;\r\n\t\t\t\tZoomRate = -1;\r\n\t\t\t}\r\n\t\t\telse if (zoomRate is float f) {\r\n\t\t\t\tZoomRate = f;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"更改缩放比例\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tUndoActionGroup undo;\r\n\t\t\tif (ZoomRate >= 0) {\r\n\t\t\t\tundo = new UndoActionGroup();\r\n\t\t\t\tundo.SetAttribute(item, Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\tundo.SetAttribute(item, Constants.Coordinates.ScaleFactor, ZoomRate.ToText());\r\n\t\t\t}\r\n\t\t\telse if (string.IsNullOrEmpty(ZoomMethod)) {\r\n\t\t\t\tundo = new UndoActionGroup();\r\n\t\t\t\tundo.SetAttribute(item, Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\tundo.RemoveAttribute(item, Constants.Coordinates.ScaleFactor);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn UndoAttributeAction.GetUndoAction(item, Constants.DestinationAttributes.View, ZoomMethod);\r\n\t\t\t}\r\n\t\t\treturn undo;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ClearDestinationOffsetProcessor.cs",
    "content": "﻿\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ClearDestinationOffsetProcessor : IPdfInfoXmlProcessor, IPdfInfoXmlProcessor<ClearDestinationOffsetProcessor.PositionType>\r\n\t{\r\n\t\tpublic enum PositionType { X, Y, XY }\r\n\r\n\t\tstring _name;\r\n\t\tPositionType _type;\r\n\t\tpublic PositionType Parameter {\r\n\t\t\tget => _type;\r\n\t\t\tset {\r\n\t\t\t\t_type = value;\r\n\t\t\t\t_name = _type switch {\r\n\t\t\t\t\tPositionType.X => \"横\",\r\n\t\t\t\t\tPositionType.Y => \"纵\",\r\n\t\t\t\t\t_ => string.Empty,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic ClearDestinationOffsetProcessor() {\r\n\t\t}\r\n\t\tpublic ClearDestinationOffsetProcessor(PositionType type) {\r\n\t\t\tParameter = type;\r\n\t\t}\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => $\"清除{_name}坐标定位偏移值\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item.GetAttribute(Constants.DestinationAttributes.View) == Constants.DestinationAttributes.ViewType.FitR) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tswitch (_type) {\r\n\t\t\t\tcase PositionType.X:\r\n\t\t\t\t\treturn ClearPositionOffset(item, Constants.Coordinates.Left);\r\n\t\t\t\tcase PositionType.Y:\r\n\t\t\t\t\treturn ClearPositionOffset(item, Constants.Coordinates.Top);\r\n\t\t\t\tcase PositionType.XY:\r\n\t\t\t\t\tvar x = ClearPositionOffset(item, Constants.Coordinates.Left);\r\n\t\t\t\t\tvar y = ClearPositionOffset(item, Constants.Coordinates.Top);\r\n\t\t\t\t\tif (x != null && y != null) {\r\n\t\t\t\t\t\tvar g = new UndoActionGroup();\r\n\t\t\t\t\t\tg.Add(x);\r\n\t\t\t\t\t\tg.Add(y);\r\n\t\t\t\t\t\treturn g;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x != null) {\r\n\t\t\t\t\t\treturn x;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y != null) {\r\n\t\t\t\t\t\treturn y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tstatic IUndoAction ClearPositionOffset(System.Xml.XmlElement item, string coordinate) {\r\n\t\t\tif (!item.HasAttribute(coordinate)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tvar l = item.GetAttribute(coordinate);\r\n\t\t\tif (l.Trim() == \"0\") {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\titem.RemoveAttribute(coordinate);\r\n\t\t\treturn new SetAttributeAction(item, coordinate, l);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/DestinationGotoTopProcessor.cs",
    "content": "﻿\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class DestinationGotoTopProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"设置点击目标到页首\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item.HasAttribute(Constants.DestinationAttributes.Page)) {\r\n\t\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\t\tundo.SetAttribute(item, Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\tundo.SetAttribute(item, Constants.Coordinates.Top, \"10000\");\r\n\t\t\t\tundo.RemoveAttribute(item, Constants.Coordinates.ScaleFactor);\r\n\t\t\t\treturn undo;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ForceInternalLinkProcessor.cs",
    "content": "﻿\r\nusing System;\r\nusing PDFPatcher.Common;\r\nusing A = PDFPatcher.Constants.ActionType;\r\nusing D = PDFPatcher.Constants.DestinationAttributes;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class ForceInternalLinkProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"设置点击目标到页首\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item.HasAttribute(D.Action)\r\n\t\t\t\t&& item.GetAttribute(D.Path).EndsWith(\".pdf\", StringComparison.InvariantCultureIgnoreCase)\r\n\t\t\t\t&& ValueHelper.IsInCollection(item.GetAttribute(D.Action), A.GotoR, A.Launch, A.Uri)) {\r\n\t\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\t\tundo.Add(UndoAttributeAction.GetUndoAction(item, D.Action, A.Goto));\r\n\t\t\t\tif (item.HasAttribute(D.Page) == false\r\n\t\t\t\t\t&& item.HasAttribute(D.Named) == false\r\n\t\t\t\t\t&& item.HasAttribute(D.NamedN) == false\r\n\t\t\t\t\t) {\r\n\t\t\t\t\tundo.Add(UndoAttributeAction.GetUndoAction(item, D.Page, \"1\"));\r\n\t\t\t\t}\r\n\t\t\t\treturn undo;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/IPdfInfoXmlProcessor.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinterface IPdfInfoXmlProcessor\r\n\t{\r\n\t\tstring Name { get; }\r\n\t\tIUndoAction Process(System.Xml.XmlElement item);\r\n\t}\r\n\r\n\tinterface IPdfInfoXmlProcessor<T> : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tT Parameter { get; set; }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/LevelDownProcessor.cs",
    "content": "﻿namespace PDFPatcher.Processor\r\n{\r\n\tsealed class LevelDownProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"设置书签为子书签\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item == item.ParentNode.FirstChild) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tvar n = item.SelectSingleNode($\"preceding-sibling::{Constants.Bookmark}[1]\");\r\n\t\t\tif (n == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\tn.AppendChild(item);\r\n\t\t\tundo.Add(new RemoveElementAction(item));\r\n\t\t\treturn undo;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/LevelUpProcessor.cs",
    "content": "﻿using System;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class LevelUpProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"设置书签为父书签\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tif (item.ParentNode.Name != Constants.Bookmark) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tforeach (System.Xml.XmlElement f in item.SelectNodes(\"following-sibling::\" + Constants.Bookmark)) {\r\n\t\t\t\tundo.Add(new AddElementAction(f));\r\n\t\t\t\titem.AppendChild(f);\r\n\t\t\t\tundo.Add(new RemoveElementAction(f));\r\n\t\t\t}\r\n\t\t\tundo.Add(new AddElementAction(item));\r\n\t\t\titem.ParentNode.ParentNode.InsertAfter(item, item.ParentNode);\r\n\t\t\tundo.Add(new RemoveElementAction(item));\r\n\t\t\treturn undo;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/ReplaceTitleTextProcessor.cs",
    "content": "﻿namespace PDFPatcher.Processor\r\n{\r\n\tsealed class ReplaceTitleTextProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tstatic readonly BookmarkMatcher.SimpleReplacer __replacer = new();\r\n\r\n\t\treadonly BookmarkMatcher _matcher;\r\n\t\treadonly string _replacement;\r\n\r\n\t\tpublic ReplaceTitleTextProcessor(string replacement) {\r\n\t\t\t_matcher = __replacer;\r\n\t\t\t_replacement = replacement;\r\n\t\t}\r\n\t\tpublic ReplaceTitleTextProcessor(BookmarkMatcher matcher, string replacement) {\r\n\t\t\t_matcher = matcher ?? throw new System.ArgumentNullException(nameof(matcher));\r\n\t\t\t_replacement = replacement;\r\n\t\t}\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => $\"替换文本为“{_replacement}”\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\treturn item.HasAttribute(Constants.BookmarkAttributes.Title)\r\n\t\t\t\t? _matcher.Replace(item, _replacement)\r\n\t\t\t\t: null;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/SetCaseProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class SetCaseProcessor(SetCaseProcessor.LetterCase letterCase) : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tstatic readonly System.Globalization.TextInfo __currentTextInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo;\r\n\t\tstatic readonly char[] FullWidthNumbers = \"０１２３４５６７８９０\".ToCharArray();\r\n\t\tstatic readonly char[] HalfWidthNumbers = \"01234567890\".ToCharArray();\r\n\t\tstatic readonly char[] ChineseNumbers = \"○一二三四五六七八九〇\".ToCharArray();\r\n\t\tstatic readonly char[] TraditionalChineseNumbers = \"零壹贰叁肆伍陆柒捌玖零\".ToCharArray();\r\n\r\n\t\tinternal const string FullWidthPunctuations = \"！＂＃＄％＆＇（）＊＋，－．／：；＜＝＞？＠［＼］＾＿｀｛｜｝～\";\r\n\t\tinternal const string HalfWidthPunctuations = \"!\\\"#$%&'()*+,-./;:<=>?@[\\\\]^_`{|}~\";\r\n\r\n\t\tinternal static string[] CaseNames = new string[]{\r\n\t\t\t\"首字母大写(&S)\", \"英文大写(&Y)\", \"英文小写(&X)\",\r\n\t\t\t\"全角数字(&Z)\", \"全角字母(&Q)\", \"全角标点(&B)\",\r\n\t\t\t\"半角数字(&N)\", \"半角字母(&M)\", \"半角标点(&D)\",\r\n\t\t\t\"中文数字(&W)\", \"大写中文数字(&H)\",\r\n\t\t\t\"繁体汉字转简体(&J)\", \"简体汉字转繁体(&F)\"\r\n\t\t};\r\n\r\n\t\tpublic enum LetterCase\r\n\t\t{\r\n\t\t\tTitle, Upper, Lower,\r\n\t\t\tFullWidthNumber, FullWidthAlphabetic, FullWidthPunctuation,\r\n\t\t\tHalfWidthNumber, HalfWidthAlphabetic, HalfWidthPunctuation,\r\n\t\t\tChineseNumber, TraditionalChineseNumbers,\r\n\t\t\tTraditionalToSimplifiedCjk, SimplifiedToTraditionalCjk\r\n\t\t}\r\n\r\n\t\tpublic LetterCase Case { get; } = letterCase;\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"设置书签文本为\" + CaseNames[(int)Case];\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tvar a = item.GetAttributeNode(Constants.BookmarkAttributes.Title);\r\n\t\t\tif (a == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar source = a.Value;\r\n\t\t\tvar value = ConvertCase(source, Case);\r\n\t\t\tif (source == value) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn UndoAttributeAction.GetUndoAction(item, Constants.BookmarkAttributes.Title, value);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tstatic string ConvertCase(string source, LetterCase targetCase) {\r\n\t\t\tstring value;\r\n\t\t\tswitch (targetCase) {\r\n\t\t\t\tcase LetterCase.Lower:\r\n\t\t\t\t\treturn source.ToLowerInvariant();\r\n\t\t\t\tcase LetterCase.Upper:\r\n\t\t\t\t\treturn source.ToUpperInvariant();\r\n\t\t\t\tcase LetterCase.Title:\r\n\t\t\t\t\treturn __currentTextInfo.ToTitleCase(source.ToLowerInvariant());\r\n\t\t\t\tcase LetterCase.FullWidthAlphabetic:\r\n\t\t\t\t\treturn HWL2FWL.Convert(source);\r\n\t\t\t\tcase LetterCase.FullWidthNumber:\r\n\t\t\t\t\treturn HWN2FWN.Convert(source);\r\n\t\t\t\tcase LetterCase.FullWidthPunctuation:\r\n\t\t\t\t\treturn HWP2FWP.Convert(source);\r\n\t\t\t\tcase LetterCase.HalfWidthAlphabetic:\r\n\t\t\t\t\treturn FWL2HWL.Convert(source);\r\n\t\t\t\tcase LetterCase.HalfWidthNumber:\r\n\t\t\t\t\treturn FWN2HWN.Convert(source);\r\n\t\t\t\tcase LetterCase.HalfWidthPunctuation:\r\n\t\t\t\t\treturn FWP2HWP.Convert(source);\r\n\t\t\t\tcase LetterCase.ChineseNumber:\r\n\t\t\t\t\tvalue = Translate(source, FullWidthNumbers, ChineseNumbers);\r\n\t\t\t\t\treturn Translate(value, HalfWidthNumbers, ChineseNumbers);\r\n\t\t\t\tcase LetterCase.TraditionalChineseNumbers:\r\n\t\t\t\t\tvalue = Translate(source, FullWidthNumbers, TraditionalChineseNumbers);\r\n\t\t\t\t\tvalue = Translate(value, HalfWidthNumbers, TraditionalChineseNumbers);\r\n\t\t\t\t\treturn Translate(value, ChineseNumbers, TraditionalChineseNumbers);\r\n\t\t\t\tcase LetterCase.SimplifiedToTraditionalCjk:\r\n\t\t\t\t\treturn SC2TC.Convert(source);\r\n\t\t\t\tcase LetterCase.TraditionalToSimplifiedCjk:\r\n\t\t\t\t\treturn TC2SC.Convert(source);\r\n\t\t\t\tdefault: throw new ArgumentOutOfRangeException(\"LetterCase\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// todo 优化转换效率：避免 ToCharArray 和无条件创建新字符串\r\n\t\tstatic string Translate(string s, char[] source, char[] target) {\r\n\t\t\tvar cs = s.ToCharArray();\r\n\t\t\tfor (int i = 0; i < cs.Length; i++) {\r\n\t\t\t\tref char c = ref cs[i];\r\n\t\t\t\tvar p = Array.IndexOf(source, c);\r\n\t\t\t\tif (p != -1) {\r\n\t\t\t\t\tc = target[p];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn new string(cs);\r\n\t\t}\r\n\r\n\t\tstatic char FullWidthLetterToHalfWidth(char ch) {\r\n\t\t\treturn ch >= 'ａ' && ch <= 'ｚ' ? (char)(ch - 'ａ' + 'a')\r\n\t\t\t\t: ch >= 'Ａ' && ch <= 'Ｚ' ? (char)(ch - 'Ａ' + 'A')\r\n\t\t\t\t: ch;\r\n\t\t}\r\n\r\n\t\tstatic char HalfWidthLetterToFullWidth(char ch) {\r\n\t\t\treturn ch >= 'a' && ch <= 'z' ? (char)(ch + 'ａ' - 'a')\r\n\t\t\t\t: ch >= 'A' && ch <= 'Z' ? (char)(ch + 'Ａ' - 'A')\r\n\t\t\t\t: ch;\r\n\t\t}\r\n\t\tstatic char FullWidthNumberToHalfWidth(char ch) {\r\n\t\t\treturn ch >= '０' && ch <= '９' ? (char)(ch - '０' + '0') : ch;\r\n\t\t}\r\n\r\n\t\tstatic char HalfWidthNumberToFullWidth(char ch) {\r\n\t\t\treturn ch >= '0' && ch <= '9' ? (char)(ch + '０' - '0') : ch;\r\n\t\t}\r\n\r\n\t\tstatic class SC2TC\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(new CharacterMapper(Constants.Chinese.Simplified, Constants.Chinese.Traditional).Map).Convert;\r\n\t\t}\r\n\t\tstatic class TC2SC\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(new CharacterMapper(Constants.Chinese.Traditional, Constants.Chinese.Simplified).Map).Convert;\r\n\t\t}\r\n\t\tstatic class FWP2HWP\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(new CharacterMapper(FullWidthPunctuations, HalfWidthPunctuations).Map).Convert;\r\n\t\t}\r\n\t\tstatic class HWP2FWP\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(new CharacterMapper(HalfWidthPunctuations, FullWidthPunctuations).Map).Convert;\r\n\t\t}\r\n\t\tstatic class FWL2HWL\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(FullWidthLetterToHalfWidth).Convert;\r\n\t\t}\r\n\t\tstatic class HWL2FWL\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(HalfWidthLetterToFullWidth).Convert;\r\n\t\t}\r\n\t\tstatic class FWN2HWN\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(FullWidthNumberToHalfWidth).Convert;\r\n\t\t}\r\n\t\tstatic class HWN2FWN\r\n\t\t{\r\n\t\t\tpublic static readonly Converter<string, string> Convert = new StringMapper(HalfWidthNumberToFullWidth).Convert;\r\n\t\t}\r\n\r\n\t\tsealed class StringMapper(Converter<char, char> converter)\r\n\t\t{\r\n\t\t\treadonly Converter<char, char> _converter = converter;\r\n\r\n\t\t\tpublic unsafe string Convert(string value) {\r\n\t\t\t\tif (String.IsNullOrEmpty(value)) {\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t\tint i = 0;\r\n\t\t\t\tforeach (var ch in value) {\r\n\t\t\t\t\tif (ch != _converter(ch)) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t++i;\r\n\t\t\t\t}\r\n\t\t\t\tif (i == value.Length) {\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t\tvar r = String.Copy(value);\r\n\t\t\t\tfixed (char* s = r) {\r\n\t\t\t\t\tchar* c = s + i;\r\n\t\t\t\t\tchar* end = c + value.Length;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*c = _converter(*c);\r\n\t\t\t\t\t} while (++c < end);\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class CharacterMapper\r\n\t\t{\r\n\t\t\treadonly Dictionary<char, char> _Mapper;\r\n\r\n\t\t\tpublic CharacterMapper(string from, string to) {\r\n\t\t\t\tvar i = 0;\r\n\t\t\t\t_Mapper = new Dictionary<char, char>(from.Length);\r\n\t\t\t\tforeach (var item in from) {\r\n\t\t\t\t\t_Mapper[item] = to[i++];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic char Map(char value) {\r\n\t\t\t\treturn _Mapper.TryGetValue(value, out var r) ? r : value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class SequentialCharacterMapper(char from, char to, int count)\r\n\t\t{\r\n\t\t\treadonly char _From = from, _To = to;\r\n\t\t\treadonly int _Count = count;\r\n\r\n\t\t\tpublic char Map(char value) {\r\n\t\t\t\tvar d = value - _From;\r\n\t\t\t\treturn d >= 0 && d < _Count ? (char)(_To + d) : value;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/SetTextColorProcessor.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class SetTextColorProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\treadonly string r, g, b;\r\n\r\n\t\tpublic SetTextColorProcessor(Color color) {\r\n\t\t\tif (color != Color.Transparent && color != Color.White) {\r\n\t\t\t\tr = ValueHelper.ToText(color.R / 255f);\r\n\t\t\t\tg = ValueHelper.ToText(color.G / 255f);\r\n\t\t\t\tb = ValueHelper.ToText(color.B / 255f);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => \"设置书签文本颜色\";\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tvar undo = new UndoActionGroup();\r\n\t\t\tif (String.IsNullOrEmpty(r)) {\r\n\t\t\t\tundo.RemoveAttribute(item, Constants.Colors.Red);\r\n\t\t\t\tundo.RemoveAttribute(item, Constants.Colors.Green);\r\n\t\t\t\tundo.RemoveAttribute(item, Constants.Colors.Blue);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tundo.SetAttribute(item, Constants.Colors.Red, r);\r\n\t\t\t\tundo.SetAttribute(item, Constants.Colors.Green, g);\r\n\t\t\t\tundo.SetAttribute(item, Constants.Colors.Blue, b);\r\n\t\t\t}\r\n\t\t\tundo.RemoveAttribute(item, Constants.Color);\r\n\t\t\treturn undo;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/SetTextStyleProcessor.cs",
    "content": "﻿\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class SetTextStyleProcessor : IPdfInfoXmlProcessor\r\n\t{\r\n\t\tpublic enum Style\r\n\t\t{\r\n\t\t\tSetBold = 0, SetItalic = 1, RemoveBold = 10, RemoveItalic = 11\r\n\t\t}\r\n\r\n\t\treadonly Style _style;\r\n\t\tpublic SetTextStyleProcessor(System.Xml.XmlElement element, Style style) {\r\n\t\t\tvar s = element.GetAttribute(Constants.BookmarkAttributes.Style);\r\n\t\t\tif (style == Style.SetBold) {\r\n\t\t\t\t_style = s != Constants.BookmarkAttributes.StyleType.Bold && s != Constants.BookmarkAttributes.StyleType.BoldItalic\r\n\t\t\t\t\t? Style.SetBold\r\n\t\t\t\t\t: Style.RemoveBold;\r\n\t\t\t}\r\n\t\t\telse if (style == Style.SetItalic) {\r\n\t\t\t\t_style = s != Constants.BookmarkAttributes.StyleType.Italic && s != Constants.BookmarkAttributes.StyleType.BoldItalic\r\n\t\t\t\t\t? Style.SetItalic\r\n\t\t\t\t\t: Style.RemoveItalic;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region IInfoDocProcessor 成员\r\n\r\n\t\tpublic string Name => _style switch {\r\n\t\t\tStyle.SetBold => \"设置书签文本为粗体\",\r\n\t\t\tStyle.SetItalic => \"设置书签文本为斜体\",\r\n\t\t\tStyle.RemoveBold => \"清除书签文本粗体样式\",\r\n\t\t\tStyle.RemoveItalic => \"清除书签文本斜体样式\",\r\n\t\t\t_ => \"\",\r\n\t\t};\r\n\r\n\t\tpublic IUndoAction Process(System.Xml.XmlElement item) {\r\n\t\t\tvar value = item.GetAttribute(Constants.BookmarkAttributes.Style);\r\n\t\t\tvar style = 0;\r\n\t\t\tswitch (value) {\r\n\t\t\t\tcase Constants.BookmarkAttributes.StyleType.Bold: style = 1; break;\r\n\t\t\t\tcase Constants.BookmarkAttributes.StyleType.Italic: style = 2; break;\r\n\t\t\t\tcase Constants.BookmarkAttributes.StyleType.BoldItalic: style = 3; break;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tswitch (_style) {\r\n\t\t\t\tcase Style.SetBold:\r\n\t\t\t\t\tif ((style & 0x01) > 0) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstyle |= 0x01;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Style.SetItalic:\r\n\t\t\t\t\tif ((style & 0x02) > 0) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstyle |= 0x02;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Style.RemoveBold:\r\n\t\t\t\t\tif ((style & 0x01) == 0) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstyle ^= 0x01;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Style.RemoveItalic:\r\n\t\t\t\t\tif ((style & 0x02) == 0) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstyle ^= 0x02;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault: throw new System.ArgumentOutOfRangeException(\"Style\");\r\n\t\t\t}\r\n\t\t\tvalue = style switch {\r\n\t\t\t\t1 => Constants.BookmarkAttributes.StyleType.Bold,\r\n\t\t\t\t2 => Constants.BookmarkAttributes.StyleType.Italic,\r\n\t\t\t\t3 => Constants.BookmarkAttributes.StyleType.BoldItalic,\r\n\t\t\t\t_ => null,\r\n\t\t\t};\r\n\t\t\treturn UndoAttributeAction.GetUndoAction(item, Constants.BookmarkAttributes.Style, value);\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/InfoXmlProcessors/UndoAction.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinterface IUndoAction\r\n\t{\r\n\t\tIEnumerable<XmlNode> AffectedElements { get; }\r\n\t\tbool Undo();\r\n\t}\r\n\r\n\tsealed class UndoManager\r\n\t{\r\n\t\treadonly Stack<IUndoAction> _undoActions = new();\r\n\t\treadonly List<string> _names = [];\r\n\t\tint _CleanLevel;\r\n\r\n\t\tpublic delegate void OnUndoDelegate(UndoManager undoManager, IUndoAction action);\r\n\t\tpublic OnUndoDelegate OnAddUndo;\r\n\t\tpublic OnUndoDelegate OnUndo;\r\n\r\n\t\tpublic bool CanUndo => _names.Count > 0;\r\n\r\n\t\tpublic bool IsDirty => _CleanLevel != _undoActions.Count;\r\n\r\n\t\tpublic void MarkClean() {\r\n\t\t\t_CleanLevel = _undoActions.Count;\r\n\t\t}\r\n\r\n\t\tpublic void Clear() {\r\n\t\t\t_names.Clear();\r\n\t\t\t_undoActions.Clear();\r\n\t\t\t_CleanLevel = 0;\r\n\t\t}\r\n\r\n\t\tpublic void AddUndo(string name, IUndoAction action) {\r\n\t\t\tif (action == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_names.Add(name);\r\n\t\t\t_undoActions.Push(action);\r\n\t\t\tOnAddUndo?.Invoke(this, action);\r\n\t\t}\r\n\r\n\t\tpublic string[] GetActionNames(int limit) {\r\n\t\t\tvar n = new string[_names.Count > limit ? limit : _names.Count];\r\n\t\t\tvar j = 0;\r\n\t\t\tfor (int i = n.Length - 1; i >= 0; i--) {\r\n\t\t\t\tn[j++] = _names[i];\r\n\t\t\t}\r\n\t\t\treturn n;\r\n\t\t}\r\n\r\n\t\tpublic IEnumerable<XmlNode> Undo() {\r\n\t\t\tif (!CanUndo) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\t_names.RemoveAt(_names.Count - 1);\r\n\t\t\tif (_names.Count > 100 && _names.Capacity > 200) {\r\n\t\t\t\t_names.TrimExcess();\r\n\t\t\t}\r\n\t\t\tvar a = _undoActions.Pop();\r\n\t\t\ta.Undo();\r\n\t\t\tOnUndo?.Invoke(this, a);\r\n\t\t\treturn a.AffectedElements;\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class UndoActionGroup : IUndoAction\r\n\t{\r\n\t\treadonly List<IUndoAction> _actions = new();\r\n\r\n\t\tpublic int Count => _actions.Count;\r\n\r\n\t\tpublic UndoActionGroup() {\r\n\t\t}\r\n\r\n\t\tpublic UndoActionGroup(IEnumerable<IUndoAction> actions) {\r\n\t\t\t_actions.AddRange(actions);\r\n\t\t}\r\n\r\n\t\tpublic void Add(IUndoAction action) {\r\n\t\t\tif (action == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (action is UndoActionGroup g) {\r\n\t\t\t\t_actions.AddRange(g._actions);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_actions.Add(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void RemoveElement(XmlElement target) {\r\n\t\t\tAdd(new RemoveElementAction(target));\r\n\t\t}\r\n\t\tpublic void AddElement(XmlElement target) {\r\n\t\t\tAdd(new AddElementAction(target));\r\n\t\t}\r\n\t\tpublic void SetAttribute(XmlElement targetNode, string name, string newValue) {\r\n\t\t\tAdd(UndoAttributeAction.GetUndoAction(targetNode, name, newValue));\r\n\t\t}\r\n\t\tpublic void RemoveAttribute(XmlElement target, string name) {\r\n\t\t\tAdd(UndoAttributeAction.GetUndoAction(target, name, null));\r\n\t\t}\r\n\t\t#region IUndoAction 成员\r\n\r\n\t\tpublic IEnumerable<XmlNode> AffectedElements {\r\n\t\t\tget {\r\n\t\t\t\tvar d = new Dictionary<XmlNode, byte>();\r\n\t\t\t\tforeach (var item in _actions) {\r\n\t\t\t\t\tforeach (var e in item.AffectedElements) {\r\n\t\t\t\t\t\td[e] = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn d.Keys;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic bool Undo() {\r\n\t\t\tfor (int i = _actions.Count - 1; i >= 0; i--) {\r\n\t\t\t\t_actions[i].Undo();\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\t}\r\n\r\n\tabstract class UndoElementAction(XmlElement target) : IUndoAction\r\n\t{\r\n\t\tpublic XmlNode Parent { get; } = target.ParentNode;\r\n\t\tpublic XmlElement TargetElement { get; } = target ?? throw new ArgumentNullException(\"undo/element/target\");\r\n\r\n\t\t#region IUndoAction 成员\r\n\r\n\t\tpublic IEnumerable<XmlNode> AffectedElements => [Parent];\r\n\t\tpublic abstract bool Undo();\r\n\r\n\t\t#endregion\r\n\t}\r\n\r\n\tsealed class RemoveElementAction(XmlElement target) : UndoElementAction(target)\r\n\t{\r\n\t\tpublic override bool Undo() {\r\n\t\t\tTargetElement.ParentNode.RemoveChild(TargetElement);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class AddElementAction(XmlElement target) : UndoElementAction(target)\r\n\t{\r\n\t\tpublic XmlNode RefNode { get; } = target.NextSibling;\r\n\r\n\t\tpublic override bool Undo() {\r\n\t\t\tif (RefNode == null) {\r\n\t\t\t\tParent.AppendChild(TargetElement);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tParent.InsertBefore(TargetElement, RefNode);\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\tabstract class UndoAttributeAction : IUndoAction\r\n\t{\r\n\t\tpublic XmlElement TargetElement { get; }\r\n\t\tpublic string Name { get; }\r\n\r\n\t\tprotected UndoAttributeAction(XmlElement targetNode, string name) {\r\n\t\t\tif (String.IsNullOrEmpty(name)) {\r\n\t\t\t\tthrow new ArgumentNullException(\"undo/attr/name\");\r\n\t\t\t}\r\n\t\t\tTargetElement = targetNode ?? throw new ArgumentNullException(\"undo/attr/target\");\r\n\t\t\tName = name;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 设置目标元素的属性值，并返回撤销动作。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"targetNode\">需要修改的元素节点。</param>\r\n\t\t/// <param name=\"name\">属性名称。</param>\r\n\t\t/// <param name=\"newValue\">新属性值。</param>\r\n\t\t/// <returns>撤销设置属性的动作。</returns>\r\n\t\tinternal static UndoAttributeAction GetUndoAction(XmlElement targetNode, string name, string newValue) {\r\n\t\t\tif (targetNode.HasAttribute(name)) {\r\n\t\t\t\tvar v = targetNode.GetAttribute(name);\r\n\t\t\t\tif (v == newValue) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\tif (newValue != null) {\r\n\t\t\t\t\ttargetNode.SetAttribute(name, newValue);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\ttargetNode.RemoveAttribute(name);\r\n\t\t\t\t}\r\n\t\t\t\treturn new SetAttributeAction(targetNode, name, v);\r\n\t\t\t}\r\n\t\t\telse if (newValue != null) {\r\n\t\t\t\ttargetNode.SetAttribute(name, newValue);\r\n\t\t\t}\r\n\t\t\treturn new RemoveAttributeAction(targetNode, name);\r\n\t\t}\r\n\r\n\t\t#region IUndoAction 成员\r\n\t\tpublic IEnumerable<XmlNode> AffectedElements => [TargetElement];\r\n\t\tpublic abstract bool Undo();\r\n\t\t#endregion\r\n\t}\r\n\r\n\tsealed class RemoveAttributeAction(XmlElement targetNode, string name) : UndoAttributeAction(targetNode, name)\r\n\t{\r\n\t\tpublic override bool Undo() {\r\n\t\t\tTargetElement.RemoveAttribute(Name);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\tsealed class SetAttributeAction(XmlElement targetNode, string name, string value) : UndoAttributeAction(targetNode, name)\r\n\t{\r\n\t\tpublic string Value { get; } = value;\r\n\r\n\t\tpublic override bool Undo() {\r\n\t\t\tTargetElement.SetAttribute(Name, Value);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/ModiOcr.cs",
    "content": "﻿#define DEBUGOCR\r\nusing System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Runtime.InteropServices;\r\nusing Microsoft.Win32;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tpublic class ModiOcr\r\n\t{\r\n\t\t//static string _modiPath;\r\n\t\tconst string __MachineRegistryPath = @\"Installer\\Components\\61BA386016BD0C340BBEAC273D84FD5F\";\r\n\t\tconst string __UserRegistryPath = @\"Software\\Microsoft\\Installer\\Components\\61BA386016BD0C340BBEAC273D84FD5F\";\r\n\r\n\t\tstatic readonly List<int> __InstalledLanguage = DetectInstalledLanguages();\r\n\t\tstatic readonly bool __ModiInstalled = DetectModi();\r\n\t\tpublic int LangID { get; set; }\r\n\t\tpublic bool StretchPage { get; set; }\r\n\t\tpublic bool OrientPage { get; set; }\r\n\t\tpublic WritingDirection WritingDirection { get; set; }\r\n\r\n\t\tinternal static bool ModiInstalled => __ModiInstalled;\r\n\r\n\t\t#region COMInterop\r\n\t\tstatic readonly object[] EmptyArray = [];\r\n\t\tstatic object Create(string type) {\r\n\t\t\tvar t = Type.GetTypeFromProgID(type);\r\n\t\t\tif (t == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn Activator.CreateInstance(t);\r\n\t\t}\r\n\t\tstatic object Call(object instance, string method, params object[] parameters) {\r\n\t\t\ttry {\r\n\t\t\t\treturn instance.GetType().InvokeMember(method, BindingFlags.InvokeMethod, null, instance, parameters);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tif (ex.InnerException != null) {\r\n\t\t\t\t\tthrow ex.InnerException;\r\n\t\t\t\t}\r\n\t\t\t\tthrow;\r\n\t\t\t}\r\n\t\t}\r\n\t\tstatic object Get(object instance, string propertyName) {\r\n\t\t\treturn instance.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, instance, EmptyArray);\r\n\t\t}\r\n\t\tstatic T Get<T>(object instance, string propertyName) {\r\n\t\t\treturn (T)Get(instance, propertyName);\r\n\t\t}\r\n\t\tstatic object Get(object instance, string propertyName, int index) {\r\n\t\t\treturn instance.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, instance, new object[1] { index });\r\n\t\t}\r\n\t\tstatic void FinalReleaseComObjects(params object[] objs) {\r\n\t\t\tfor (int i = 0; i < objs.Length; i++) {\r\n\t\t\t\tif (objs[i] == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar r = Marshal.ReleaseComObject(objs[i]);\r\n\t\t\t\t\tSystem.Diagnostics.Debug.Assert(r == 0);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tSystem.Diagnostics.Debug.WriteLine(\"释放对象时出现错误：\" + ex.Message);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tstatic bool DetectModi() {\r\n\t\t\tif (__InstalledLanguage.Count == 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar ocr = Create(\"MODI.Document\");\r\n\t\t\tif (ocr == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tFinalReleaseComObjects(ocr);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tinternal static bool IsLanguageInstalled(int langID) {\r\n\t\t\treturn __InstalledLanguage.Contains(langID);\r\n\t\t}\r\n\r\n\t\tstatic List<int> DetectInstalledLanguages() {\r\n\t\t\tvar l = new List<int>();\r\n\t\t\ttry {\r\n\t\t\t\tusing (var k = Registry.CurrentUser.OpenSubKey(__UserRegistryPath)) {\r\n\t\t\t\t\tDetectInstalledLanguages(k, l);\r\n\t\t\t\t}\r\n\t\t\t\tusing (var k = Registry.ClassesRoot.OpenSubKey(__MachineRegistryPath)) {\r\n\t\t\t\t\tDetectInstalledLanguages(k, l);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.DebugMessage(\"OCR registry error: \" + ex.Message);\r\n\t\t\t}\r\n\t\t\treturn l;\r\n\t\t}\r\n\r\n\t\tprivate static void DetectInstalledLanguages(RegistryKey k, List<int> list) {\r\n\t\t\tif (k == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var n in k.GetValueNames()) {\r\n\t\t\t\tvar i = n.ToInt32();\r\n\t\t\t\tif (i == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (Constants.Ocr.LangIDs.Contains(i) && list.Contains(i) == false) {\r\n\t\t\t\t\tlist.Add(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void Ocr(string path, string saveImagePath, List<TextLine> results) {\r\n\t\t\tobject ocr = null, images = null, image = null, layout = null;\r\n\t\t\tobject merge = null, mergeImages = null;\r\n\t\t\tIEnumerable words = null, rects = null;\r\n\t\t\tTextLine line = null;\r\n\t\t\tint lineID = -1, regionID = -1;\r\n\t\t\tint cl, cr;\r\n\t\t\tTextInfo cti = null;\r\n\t\t\ttry {\r\n#if DEBUGOCR\r\n\t\t\t\tTracker.TraceMessage(\"创建识别引擎对象。\");\r\n#endif\r\n\t\t\t\tocr = Create(\"MODI.Document\");\r\n\t\t\t\tvar p = Environment.CurrentDirectory;\r\n\t\t\t\t//Environment.CurrentDirectory = _modiPath;\r\n#if DEBUGOCR\r\n\t\t\t\tTracker.TraceMessage(\"读取识别图像：\" + path);\r\n#endif\r\n\t\t\t\tCall(ocr, \"Create\", path);\r\n#if DEBUGOCR\r\n\t\t\t\tTracker.TraceMessage(\"执行识别：\" + LangID);\r\n#endif\r\n\t\t\t\tCall(ocr, \"OCR\", ValueHelper.MapValue(LangID, Constants.Ocr.LangIDs, Constants.Ocr.OcrLangIDs), OrientPage, StretchPage);\r\n\r\n\t\t\t\tEnvironment.CurrentDirectory = p;\r\n#if DEBUGOCR\r\n\t\t\t\tTracker.TraceMessage(\"读取识别结果。\");\r\n#endif\r\n\t\t\t\timages = Get(ocr, \"Images\");\r\n\t\t\t\timage = Get(images, \"Item\", 0);\r\n\t\t\t\tlayout = Get(image, \"Layout\");\r\n#if DEBUGOCR && DEBUG\r\n\t\t\t\tvar l = new StreamWriter(@\"m:\\ocr.txt\", true, System.Text.Encoding.Default);\r\n\t\t\t\tl.WriteLine(\"path: \" + path);\r\n#endif\r\n\t\t\t\twords = Get<IEnumerable>(layout, \"Words\");\r\n\t\t\t\tforeach (var word in words) {\r\n\t\t\t\t\tvar ti = new TextInfo();\r\n\t\t\t\t\tvar w = Get<string>(word, \"Text\");\r\n\t\t\t\t\tti.Text = w;\r\n\t\t\t\t\tvar pos = new float[4];\r\n\t\t\t\t\trects = Get<IEnumerable>(word, \"Rects\");\r\n\t\t\t\t\tforeach (var rect in rects) {\r\n\t\t\t\t\t\tint r = Get<int>(rect, \"Left\");\r\n\t\t\t\t\t\tif (r < pos[0] || pos[0] == 0) {\r\n\t\t\t\t\t\t\tpos[0] = r;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tr = Get<int>(rect, \"Top\");\r\n\t\t\t\t\t\tif (r > pos[1]) {\r\n\t\t\t\t\t\t\tpos[1] = r;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tr = Get<int>(rect, \"Right\");\r\n\t\t\t\t\t\tif (r > pos[2]) {\r\n\t\t\t\t\t\t\tpos[2] = r;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tr = Get<int>(rect, \"Bottom\");\r\n\t\t\t\t\t\tif (r < pos[3] || pos[3] == 0) {\r\n\t\t\t\t\t\t\tpos[3] = r;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tFinalReleaseComObjects(rect);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tMarshal.ReleaseComObject(rects);\r\n\t\t\t\t\tti.Region = new Bound(pos[0], pos[3], pos[2], pos[1]);\r\n\t\t\t\t\tti.Font = null;\r\n\t\t\t\t\tti.Size = pos[3] - pos[1];\r\n\t\t\t\t\tif (ti.Text.Length == 1) {\r\n\t\t\t\t\t\tswitch (ti.Text[0]) {\r\n\t\t\t\t\t\t\tcase '一':\r\n\t\t\t\t\t\t\t\tvar r = ti.Region;\r\n\t\t\t\t\t\t\t\tti.Size = r.Width > r.Height ? r.Width : r.Height;\r\n\t\t\t\t\t\t\t\tvar s = (int)Math.Ceiling(ti.Size / 2 - (r.Width > r.Height ? r.Height : r.Width) / 2);\r\n\t\t\t\t\t\t\t\tti.Region = new Bound(r.Left, r.Bottom + s, r.Right, r.Top - s);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase '\\u2022':\r\n\t\t\t\t\t\t\t\tti.Text = \"·\";\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (Char.IsLetterOrDigit(ti.Text[0]) && ti.Size > 0) {\r\n\t\t\t\t\t\tti.LetterWidth = ti.Size;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcl = Get<int>(word, \"LineID\");\r\n\t\t\t\t\tcr = Get<int>(word, \"RegionID\");\r\n\t\t\t\t\tvar sl = (cl == lineID && cr == regionID); // 处于同一行\r\n\t\t\t\t\tif (sl && WritingDirection != WritingDirection.Unknown) {\r\n\t\t\t\t\t\tsl = cti?.Region.IsAlignedWith(ti.Region, WritingDirection) == true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (sl) {\r\n\t\t\t\t\t\tif (cti != null && cti.Region == ti.Region) {\r\n\t\t\t\t\t\t\tcti.Text += ti.Text;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tline.AddText(ti);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (line != null) {\r\n\t\t\t\t\t\t\tresults.Add(line);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tline = new TextLine(ti) {\r\n\t\t\t\t\t\t\tSuppressTextInfoArrangement = true\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tlineID = cl;\r\n\t\t\t\t\t\tregionID = cr;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcti = ti;\r\n#if DEBUGOCR && DEBUG\r\n\t\t\t\t\tl.WriteLine($\"{ti.Size}\\t{ti.Text}\\t{ti.Region.Top} {ti.Region.Left} {ti.Region.Bottom} {ti.Region.Right}\");\r\n#endif\r\n\t\t\t\t\tFinalReleaseComObjects(word);\r\n\t\t\t\t}\r\n\t\t\t\tMarshal.ReleaseComObject(words);\r\n\t\t\t\tif (line != null) {\r\n\t\t\t\t\tresults.Add(line);\r\n\t\t\t\t}\r\n#if DEBUGOCR && DEBUG\r\n\t\t\t\tl.Close();\r\n#endif\r\n\t\t\t\tif (FileHelper.IsPathValid(saveImagePath)) {\r\n#if DEBUGOCR\r\n\t\t\t\t\tTracker.TraceMessage(\"保存识别后图像路径：\" + saveImagePath);\r\n#endif\r\n\t\t\t\t\tif (File.Exists(saveImagePath) == false) {\r\n\t\t\t\t\t\tCall(ocr, \"SaveAs\", saveImagePath, -1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tmerge = Create(\"MODI.Document\");\r\n\t\t\t\t\t\tCall(merge, \"Create\", saveImagePath);\r\n\t\t\t\t\t\tmergeImages = Get(merge, \"Images\");\r\n\t\t\t\t\t\tCall(mergeImages, \"Add\", image, Get(mergeImages, \"Item\", 0));\r\n\t\t\t\t\t\tCall(merge, \"Save\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n#if DEBUGOCR\r\n\t\t\t\tTracker.TraceMessage(\"完成识别操作。\");\r\n#endif\r\n\t\t\t\tCall(ocr, \"Close\", false);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n#if DEBUGOCR\r\n\t\t\t\tTracker.TraceMessage(\"释放识别引擎对象。\");\r\n#endif\r\n\t\t\t\tFinalReleaseComObjects(rects, words, layout, image, images, ocr);\r\n\t\t\t\tFinalReleaseComObjects(merge, mergeImages);\r\n\t\t\t\twords = rects = null;\r\n\t\t\t\tocr = images = image = layout = null;\r\n\t\t\t\tmerge = mergeImages = null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Mupdf/ImageRendererOptions.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Xml.Serialization;\r\n\r\nnamespace MuPDF\r\n{\r\n\tpublic class ImageRendererOptions\r\n\t{\r\n\t\t[XmlAttribute(\"自动指定输出位置\")]\r\n\t\tpublic bool AutoOutputFolder { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出图片的格式。</summary>\r\n\t\t[XmlAttribute(\"图片格式\")]\r\n\t\tpublic ImageFormat FileFormat { get; set; }\r\n\t\tpublic string FileFormatExtension => FileFormat == ImageFormat.Jpeg\r\n\t\t\t? \".jpg\"\r\n\t\t\t: FileFormat == ImageFormat.Tiff\r\n\t\t\t\t? \".tif\"\r\n\t\t\t\t: \".png\";\r\n\t\t///<summary>获取或指定是否垂直翻转导出的图片。</summary>\r\n\t\t[XmlAttribute(\"垂直翻转图片\")]\r\n\t\tpublic bool VerticalFlipImages { get; set; }\r\n\r\n\t\t///<summary>获取或指定是否水平翻转导出的图片。</summary>\r\n\t\t[XmlAttribute(\"水平翻转图片\")]\r\n\t\tpublic bool HorizontalFlipImages { get; set; }\r\n\r\n\t\t/// <summary>获取或指定导出图片的颜色。</summary>\r\n\t\t[XmlAttribute(\"图片颜色\")]\r\n\t\tpublic ColorspaceKind ColorSpace { get; set; }\r\n\r\n\t\t/// <summary>获取或指定是否反转图片的颜色。</summary>\r\n\t\t[XmlAttribute(\"反转图片颜色\")]\r\n\t\tpublic bool InvertColor { get; set; }\r\n\r\n\t\t[XmlAttribute(\"JPEG质量\")]\r\n\t\tpublic int JpegQuality { get; set; }\r\n\r\n\t\t/// <summary>获取或指定旋转图片的角度。</summary>\r\n\t\t[XmlAttribute(\"旋转角度\")]\r\n\t\tpublic int Rotation { get; set; }\r\n\r\n\t\t[XmlAttribute(\"图片宽度\")]\r\n\t\tpublic int ImageWidth { get; set; }\r\n\r\n\t\t[XmlAttribute(\"图片比例\")]\r\n\t\tpublic float ScaleRatio { get; set; }\r\n\r\n\t\tfloat _Dpi = 72f;\r\n\t\t[XmlAttribute(\"分辨率\")]\r\n\t\tpublic float Dpi {\r\n\t\t\tget => _Dpi;\r\n\t\t\tset => _Dpi = value > 0 ? value : 72f;\r\n\t\t}\r\n\r\n\t\t[XmlAttribute(\"尺寸模式\")]\r\n\t\tpublic bool UseSpecificWidth { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出页面图像所保存的目录路径。</summary>\r\n\t\t[XmlAttribute(\"导出路径\")]\r\n\t\tpublic string ExtractImagePath { get; set; }\r\n\r\n\t\t///<summary>获取或指定导出文件的名称掩码。</summary>\r\n\t\t[XmlAttribute(\"文件名称掩码\")]\r\n\t\tpublic string FileMask { get; set; }\r\n\r\n\t\t[XmlIgnore]\r\n\t\tpublic string ExtractPageRange { get; set; }\r\n\r\n\t\t[XmlAttribute(\"适合区域\")]\r\n\t\tpublic bool FitArea { get; set; }\r\n\r\n\t\t[XmlAttribute(\"隐藏批注\")]\r\n\t\tpublic bool HideAnnotations { get; set; }\r\n\r\n\t\t[XmlAttribute(\"减少颜色\")]\r\n\t\tpublic bool Quantize { get; set; }\r\n\r\n\t\t[XmlAttribute(\"伽马校正\")]\r\n\t\tpublic float Gamma { get; set; }\r\n\r\n\t\t[XmlAttribute(\"染色\")]\r\n\t\tpublic int Tint {\r\n\t\t\tget => TintColor.ToArgb();\r\n\t\t\tset => TintColor = Color.FromArgb(value);\r\n\t\t}\r\n\t\t[XmlIgnore]\r\n\t\tpublic Color TintColor { get; set; }\r\n\r\n\t\tinternal bool LowQuality { get; set; }\r\n\r\n\t\tpublic ImageRendererOptions() {\r\n\t\t\tAutoOutputFolder = true;\r\n\t\t\tFileMask = \"0000\";\r\n\t\t\tScaleRatio = 1f;\r\n\t\t\tGamma = 1.0f;\r\n\t\t\tTintColor = Color.Transparent;\r\n\t\t}\r\n\t}\r\n\r\n\t/// <summary>\r\n\t/// 渲染页面的颜色空间。\r\n\t/// </summary>\r\n\tpublic enum ColorSpace\r\n\t{\r\n\t\tRgb,\r\n\t\tBgr,\r\n\t\tCmyk,\r\n\t\tGray\r\n\t}\r\n\r\n\t/// <summary>\r\n\t/// 保存渲染页面的文件格式。\r\n\t/// </summary>\r\n\tpublic enum ImageFormat\r\n\t{\r\n\t\tPng,\r\n\t\tJpeg,\r\n\t\tTiff\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Mupdf/MuPDFExtensions.cs",
    "content": "﻿using System;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace MuPDF.Extensions\r\n{\r\n\tpublic static class MuPDFExtensions\r\n\t{\r\n\t\t#region 文档基础结构\r\n\t\tpublic static TObj Get<TObj>(this PdfArray array, int index) where TObj : PdfObject {\r\n\t\t\treturn array[index].UnderlyingObject as TObj;\r\n\t\t}\r\n\t\tpublic static TObj Get<TObj>(this PdfDictionary dict, int index) where TObj : PdfObject {\r\n\t\t\treturn dict[index].Value.UnderlyingObject as TObj;\r\n\t\t}\r\n\t\tpublic static TObj Get<TObj>(this PdfDictionary dict, PdfNames key) where TObj : PdfObject {\r\n\t\t\treturn dict[key].UnderlyingObject as TObj;\r\n\t\t}\r\n\t\tpublic static TObj Get<TObj>(this PdfDictionary dict, PdfNames key, PdfNames alias) where TObj : PdfObject {\r\n\t\t\treturn dict.GetValue(key, alias).UnderlyingObject as TObj;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\t#region 几何尺寸\r\n\t\tpublic static RectangleF ToRectangleF(this Box box) {\r\n\t\t\treturn RectangleF.FromLTRB(box.X0, box.Y0, box.X1, box.Y1);\r\n\t\t}\r\n\t\tpublic static Rectangle ToRectangle(this Box box) {\r\n\t\t\treturn Rectangle.FromLTRB((int)box.X0, (int)box.Y0, (int)box.X1, (int)box.Y1);\r\n\t\t}\r\n\t\tpublic static void Deconstruct(this Point point, out float x, out float y) {\r\n\t\t\tx = point.X; y = point.Y;\r\n\t\t}\r\n\r\n\t\tpublic static bool IsHorizontalNeighbor(this Box me, Box other) {\r\n\t\t\tif (me.IsEmpty || other.IsInfinite || other.IsEmpty || me.IsInfinite || other.Y0 > me.Y1 || other.Y1 < me.Y0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar h = me.Height / other.Height;\r\n\t\t\treturn h > 0.4 && h < 2.5;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t\tpublic static string GetText(this TextLine textLine) {\r\n\t\t\tvar sb = StringBuilderCache.Acquire(10);\r\n\t\t\tforeach (var ch in textLine) {\r\n\t\t\t\tsb.Append(Char.IsSurrogate((char)ch.Character) ? \"?\" : char.ConvertFromUtf32(ch.Character));\r\n\t\t\t}\r\n\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t}\r\n\r\n\t\t#region 渲染页面\r\n\t\tpublic static Bitmap RenderBitmapPage(this Page page, int width, int height, ImageRendererOptions options, Cookie cookie) {\r\n\t\t\tusing (var pix = InternalRenderPage(page, width, height, options, cookie)) {\r\n\t\t\t\tif (pix != null) {\r\n\t\t\t\t\treturn pix.ToBitmap(options);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tstatic Pixmap InternalRenderPage(Page page, int width, int height, ImageRendererOptions options, Cookie cookie) {\r\n\t\t\tvar b = page.Bound;\r\n\t\t\tif (b.Width == 0 || b.Height == 0) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar ctm = CalculateMatrix(page, width, height, options);\r\n\t\t\tvar bbox = width > 0 && height > 0 ? new BBox(0, 0, width, height) : b.Transform(ctm).Round();\r\n\r\n\t\t\tvar pix = Pixmap.Create(options.ColorSpace == ColorspaceKind.None ? ColorspaceKind.Rgb : options.ColorSpace, bbox);\r\n\t\t\tif (pix == null) {\r\n\t\t\t\tthrow new MuException($\"无法渲染页面：{(page.PageNumber + 1).ToText()}\");\r\n\t\t\t}\r\n\t\t\tpix.Clear(0xFF);\r\n\t\t\ttry {\r\n\t\t\t\tusing (var dev = Device.NewDraw(pix, Matrix.Identity)) {\r\n\t\t\t\t\tif (options.LowQuality) {\r\n\t\t\t\t\t\tdev.EnableDeviceHints(DeviceHints.DontInterpolateImages | DeviceHints.NoCache);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (cookie.IsCancellationPending) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpage.RunContents(dev, ctm, cookie);\r\n\t\t\t\t\tif (options.HideAnnotations == false) {\r\n\t\t\t\t\t\tpage.RunAnnotations(dev, ctm, cookie);\r\n\t\t\t\t\t\tpage.RunWidgets(dev, ctm, cookie);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdev.Close();\r\n\r\n\t\t\t\t\tif (cookie.IsCancellationPending) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (options.TintColor != Color.Transparent) {\r\n\t\t\t\t\t\tpix.Tint(options.TintColor.ToArgb());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (options.Gamma != 1.0f) {\r\n\t\t\t\t\t\tpix.Gamma(options.Gamma);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn pix;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch {\r\n\t\t\t\tpix.Dispose();\r\n\t\t\t\tthrow;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic Matrix CalculateMatrix(Page page, int width, int height, ImageRendererOptions options) {\r\n\t\t\tfloat w = width, h = height;\r\n\t\t\tvar b = page.Bound;\r\n\t\t\tif (options.UseSpecificWidth) {\r\n\t\t\t\tif (w < 0) {\r\n\t\t\t\t\tw = -w;\r\n\t\t\t\t}\r\n\t\t\t\tif (h < 0) {\r\n\t\t\t\t\th = -h;\r\n\t\t\t\t}\r\n\t\t\t\tif (options.FitArea && w != 0 && h != 0) {\r\n\t\t\t\t\tvar rw = w / b.Width;\r\n\t\t\t\t\tvar rh = h / b.Height;\r\n\t\t\t\t\tif (rw < rh) {\r\n\t\t\t\t\t\th = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tw = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (w == 0 && h == 0) { // No resize\r\n\t\t\t\t\tw = b.Width;\r\n\t\t\t\t\th = b.Height;\r\n\t\t\t\t}\r\n\t\t\t\telse if (h == 0) {\r\n\t\t\t\t\th = width * b.Height / b.Width;\r\n\t\t\t\t}\r\n\t\t\t\telse if (w == 0) {\r\n\t\t\t\t\tw = height * b.Width / b.Height;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (w == 0 || h == 0) {\r\n\t\t\t\tw = b.Width * options.ScaleRatio * options.Dpi / 72;\r\n\t\t\t\th = b.Height * options.ScaleRatio * options.Dpi / 72;\r\n\t\t\t}\r\n\r\n\t\t\tvar ctm = Matrix.Scale(w / b.Width, h / b.Height).RotateTo(options.Rotation);\r\n\t\t\tif (options.VerticalFlipImages) {\r\n\t\t\t\tctm = ctm.Concat(Matrix.VerticalFlip);\r\n\t\t\t}\r\n\t\t\tif (options.HorizontalFlipImages) {\r\n\t\t\t\tctm = ctm.Concat(Matrix.HorizontalFlip);\r\n\t\t\t}\r\n\t\t\treturn ctm;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 Pixmap 的数据转换为 <see cref=\"Bitmap\"/>。\r\n\t\t/// </summary>\r\n\t\tpublic static unsafe Bitmap ToBitmap(this Pixmap pix, ImageRendererOptions options) {\r\n\t\t\tint width = pix.Width;\r\n\t\t\tint height = pix.Height;\r\n\t\t\tbool grayscale = options.ColorSpace == ColorspaceKind.Gray;\r\n\t\t\tbool invert = options.InvertColor;\r\n\t\t\tvar bmp = new Bitmap(width, height, grayscale ? PixelFormat.Format8bppIndexed : PixelFormat.Format24bppRgb);\r\n\t\t\tvar imageData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bmp.PixelFormat);\r\n\t\t\tvar ptrSrc = (byte*)pix.Samples;\r\n\t\t\tvar ptrDest = (byte*)imageData.Scan0;\r\n\t\t\tif (grayscale) {\r\n\t\t\t\tvar palette = bmp.Palette;\r\n\t\t\t\tfor (int i = 0; i < 256; ++i)\r\n\t\t\t\t\tpalette.Entries[i] = Color.FromArgb(i, i, i);\r\n\t\t\t\tbmp.Palette = palette;\r\n\t\t\t\tfor (int y = 0; y < height; y++) {\r\n\t\t\t\t\tvar pl = ptrDest;\r\n\t\t\t\t\tvar sl = ptrSrc;\r\n\t\t\t\t\tfor (int x = 0; x < width; x++) {\r\n\t\t\t\t\t\t*pl = invert ? (byte)(*sl ^ 0xFF) : *sl;\r\n\t\t\t\t\t\tpl++;\r\n\t\t\t\t\t\tsl++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tptrDest += imageData.Stride;\r\n\t\t\t\t\tptrSrc = sl;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse { // DeviceBGR\r\n\t\t\t\tfor (int y = 0; y < height; y++) {\r\n\t\t\t\t\tvar pl = ptrDest;\r\n\t\t\t\t\tvar sl = ptrSrc;\r\n\t\t\t\t\tif (invert) {\r\n\t\t\t\t\t\tfor (int x = 0; x < width; x++) {\r\n\t\t\t\t\t\t\t// 在这里进行 RGB 到 DIB BGR 的转换（省去 Mupdf 内部的转换工作）\r\n\t\t\t\t\t\t\tpl[2] = (byte)(*sl ^ 0xFF); sl++; // R\r\n\t\t\t\t\t\t\tpl[1] = (byte)(*sl ^ 0xFF); sl++; // G\r\n\t\t\t\t\t\t\tpl[0] = (byte)(*sl ^ 0xFF); sl++; // B\r\n\t\t\t\t\t\t\tpl += 3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tfor (int x = 0; x < width; x++) {\r\n\t\t\t\t\t\t\t// 在这里进行 RGB 到 DIB BGR 的转换（省去 Mupdf 内部的转换工作）\r\n\t\t\t\t\t\t\tpl[2] = *sl; sl++; // R\r\n\t\t\t\t\t\t\tpl[1] = *sl; sl++; // G\r\n\t\t\t\t\t\t\tpl[0] = *sl; sl++; // B\r\n\t\t\t\t\t\t\tpl += 3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tptrDest += imageData.Stride;\r\n\t\t\t\t\tptrSrc = sl;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbmp.UnlockBits(imageData);\r\n\t\t\tif (options.Dpi > 0) {\r\n\t\t\t\tbmp.SetResolution(options.Dpi, options.Dpi);\r\n\t\t\t}\r\n\t\t\treturn bmp;\r\n\t\t}\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Mupdf/PageLabelCollection.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace MuPDF\r\n{\r\n\tpublic sealed class PageLabelCollection : ICollection<PageLabel>\r\n\t{\r\n\t\treadonly List<PageLabel> _labels = new List<PageLabel>();\r\n\r\n\t\tpublic PageLabel this[int index] => _labels[index];\r\n\r\n\t\tinternal PageLabelCollection() {}\r\n\t\tinternal PageLabelCollection(Document document) {\r\n\t\t\tvar pl = new List<PageLabel>();\r\n\t\t\tvar l = document.Trailer.Locate(PdfNames.Root, PdfNames.PageLabels, PdfNames.Nums);\r\n\t\t\tif (l.IsArray) {\r\n\t\t\t\tToPageLabels(pl, l);\r\n\t\t\t\tpl.Sort();\r\n\t\t\t}\r\n\t\t\t_labels = pl;\r\n\t\t}\r\n\r\n\t\tstatic void ToPageLabels(List<PageLabel> pl, PdfObject l) {\r\n\t\t\tvar a = l as PdfArray;\r\n\t\t\tfor (int i = 0; i < a.Count; i++) {\r\n\t\t\t\tvar n = a[i].IntegerValue;\r\n\t\t\t\tvar d = a[++i].UnderlyingObject as PdfDictionary;\r\n\t\t\t\tvar sp = d[PdfNames.St].IntegerValue;\r\n\t\t\t\tvar p = d[PdfNames.P] as PdfString;\r\n\t\t\t\tpl.Add(new PageLabel(n, sp, p?.Value, d[PdfNames.S] is PdfName s ? (PageLabelStyle)(byte)s.Name[0] : PageLabelStyle.None));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 添加页码标签。如集合中存在相同页码的页码标签，则先将旧的标签删除，再添加新的页码标签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"label\">需要添加的页码标签。</param>\r\n\t\tpublic void Add(PageLabel label) {\r\n\t\t\tRemove(label);\r\n\t\t\t_labels.Add(label);\r\n\t\t\t_labels.Sort();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 根据传入的页码，返回当前页码标签集合格式化后生成的页码。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pageNumber\">绝对页码。</param>\r\n\t\t/// <returns>格式化后的页码文本。</returns>\r\n\t\tpublic string Format(int pageNumber) {\r\n\t\t\tvar l = _labels.Count;\r\n\t\t\tif (l == 0) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tfor (int i = l - 1; i >= 0; i--) {\r\n\t\t\t\tvar p = _labels[i];\r\n\t\t\t\tif (pageNumber > p.FromPageNumber) {\r\n\t\t\t\t\treturn p.Format(pageNumber);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn String.Empty;\r\n\t\t}\r\n\r\n\t\tpublic PageLabel Find(int pageNumber) {\r\n\t\t\t--pageNumber;\r\n\t\t\tfor (int i = _labels.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (_labels[i].FromPageNumber == pageNumber) {\r\n\t\t\t\t\treturn _labels[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn PageLabel.Empty;\r\n\t\t}\r\n\r\n\t\tpublic void Clear() {\r\n\t\t\t_labels.Clear();\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 返回集合中是否包含具有与 <paramref name=\"item\"/> 相同起始页码的页码标签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"item\">需要检查起始页码的页码标签。</param>\r\n\t\t/// <returns>如包含相同页码的页码标签，返回 true，否则返回 false。</returns>\r\n\t\tpublic bool Contains(PageLabel item) {\r\n\t\t\tfor (int i = _labels.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (_labels[i].FromPageNumber == item.FromPageNumber) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic void CopyTo(PageLabel[] array, int arrayIndex) {\r\n\t\t\t_labels.CopyTo(array, arrayIndex);\r\n\t\t}\r\n\r\n\t\tpublic int Count => _labels.Count;\r\n\r\n\t\tpublic bool IsReadOnly => false;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 删除集合中具有与 <paramref name=\"item\"/> 相同起始页码的页码标签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"item\">需要删除的页码标签。</param>\r\n\t\t/// <returns>如包含相同页码的页码标签，返回 true，否则返回 false。</returns>\r\n\t\tpublic bool Remove(PageLabel item) {\r\n\t\t\tfor (int i = _labels.Count - 1; i >= 0; i--) {\r\n\t\t\t\tif (_labels[i].FromPageNumber == item.FromPageNumber) {\r\n\t\t\t\t\t_labels.RemoveAt(i);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic IEnumerator<PageLabel> GetEnumerator() {\r\n\t\t\treturn _labels.GetEnumerator();\r\n\t\t}\r\n\r\n\t\tSystem.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {\r\n\t\t\treturn _labels.GetEnumerator();\r\n\t\t}\r\n\t}\r\n\r\n\t[DebuggerDisplay(\"From: {FromPageNumber}, Format: {Format (1)}\")]\r\n\tpublic readonly struct PageLabel : IComparable<PageLabel>, IEquatable<PageLabel>\r\n\t{\r\n\t\tpublic readonly string Prefix;\r\n\t\tpublic readonly PageLabelStyle NumericStyle;\r\n\t\tpublic readonly int StartAt;\r\n\t\tpublic readonly int FromPageNumber;\r\n\t\tpublic static PageLabel Empty = new PageLabel(-1, -1, null, PageLabelStyle.None);\r\n\t\tpublic bool IsEmpty => FromPageNumber < 0;\r\n\r\n\t\tpublic PageLabel(int pageNumber, int startAt, string prefix, PageLabelStyle numericStyle) {\r\n\t\t\tFromPageNumber = pageNumber;\r\n\t\t\tStartAt = startAt;\r\n\t\t\tPrefix = prefix ?? String.Empty;\r\n\t\t\tNumericStyle = numericStyle;\r\n\t\t}\r\n\r\n\t\tint IComparable<PageLabel>.CompareTo(PageLabel other) {\r\n\t\t\treturn FromPageNumber.CompareTo(other.FromPageNumber);\r\n\t\t}\r\n\r\n\t\tpublic string Format(int pageNumber) {\r\n\t\t\tvar n = pageNumber - FromPageNumber + (StartAt < 1 ? 0 : StartAt - 1);\r\n\t\t\tswitch (NumericStyle) {\r\n\t\t\t\tcase PageLabelStyle.None:\r\n\t\t\t\t\treturn Prefix;\r\n\t\t\t\tcase PageLabelStyle.Decimal:\r\n\t\t\t\t\treturn String.Concat(Prefix, n.ToText());\r\n\t\t\t\tcase PageLabelStyle.UpperRoman:\r\n\t\t\t\t\treturn String.Concat(Prefix, n.ToRoman());\r\n\t\t\t\tcase PageLabelStyle.LowerRoman:\r\n\t\t\t\t\treturn String.Concat(Prefix, n.ToRoman()).ToLowerInvariant();\r\n\t\t\t\tcase PageLabelStyle.UpperAlpha:\r\n\t\t\t\t\treturn String.Concat(Prefix, n.ToAlphabet(true));\r\n\t\t\t\tcase PageLabelStyle.LowerAlpha:\r\n\t\t\t\t\treturn String.Concat(Prefix, n.ToAlphabet(false));\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgoto case PageLabelStyle.Decimal;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic bool Equals(PageLabel other) {\r\n\t\t\treturn FromPageNumber == other.FromPageNumber\r\n\t\t\t\t&& StartAt == other.StartAt\r\n\t\t\t\t&& Prefix == other.Prefix\r\n\t\t\t\t&& NumericStyle == other.NumericStyle;\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\tvar hashCode = 1096239419;\r\n\t\t\thashCode = hashCode * -1521134295 + Prefix.GetHashCode();\r\n\t\t\thashCode = hashCode * -1521134295 + (int)NumericStyle;\r\n\t\t\thashCode = hashCode * -1521134295 + StartAt;\r\n\t\t\thashCode = hashCode * -1521134295 + FromPageNumber;\r\n\t\t\treturn hashCode;\r\n\t\t}\r\n\r\n\t\tpublic override bool Equals(object obj) {\r\n\t\t\treturn obj is PageLabel l && Equals(l);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator ==(PageLabel x, PageLabel y) { return x.Equals(y); }\r\n\r\n\t\tpublic static bool operator !=(PageLabel x, PageLabel y) { return !x.Equals(y); }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Mupdf/RenderResultCache.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace MuPDF\r\n{\r\n\tpublic sealed class RenderResultCache : IDisposable\r\n\t{\r\n\t\tconst int __bufferSize = 10;\r\n\t\treadonly Document _document;\r\n\t\tDictionary<int, RenderResult> _buffer = new Dictionary<int, RenderResult>(__bufferSize);\r\n\t\treadonly object _SyncObj = new object();\r\n\t\tpublic object SyncObj => _SyncObj;\r\n\r\n\t\tpublic RenderResultCache(Document document) {\r\n\t\t\t_document = document;\r\n\t\t}\r\n\r\n\t\tpublic Page LoadPage(int pageNumber) {\r\n\t\t\tif (_buffer.TryGetValue(pageNumber, out var r)) {\r\n\t\t\t\treturn r.Page;\r\n\t\t\t}\r\n\t\t\tvar p = _document.LoadPage(pageNumber - 1);\r\n\t\t\t_buffer.Add(pageNumber, new RenderResult(p));\r\n\t\t\treturn p;\r\n\t\t}\r\n\r\n\t\tpublic Bitmap GetBitmap(int pageNumber) {\r\n\t\t\treturn TryGetRenderResult(pageNumber, out RenderResult result)\r\n\t\t\t\t? result.Image\r\n\t\t\t\t: null;\r\n\t\t}\r\n\t\tpublic TextPage GetTextPage(int pageNumber) {\r\n\t\t\treturn TryGetRenderResult(pageNumber, out RenderResult result)\r\n\t\t\t\t? result.TextPage\r\n\t\t\t\t: null;\r\n\t\t}\r\n\r\n\t\tbool TryGetRenderResult(int pageNumber, out RenderResult result) {\r\n\t\t\tresult = null;\r\n\t\t\treturn _buffer != null\r\n\t\t\t\t&& !_document.IsDisposed\r\n\t\t\t\t&& _buffer.TryGetValue(pageNumber, out result);\r\n\t\t}\r\n\r\n\t\tpublic void SetBitmap(int pageNumber, Bitmap bmp) {\r\n\t\t\tif (_buffer.TryGetValue(pageNumber, out var image)) {\r\n\t\t\t\timage.Image?.Dispose();\r\n\t\t\t}\r\n\t\t\t_buffer[pageNumber].Image = bmp;\r\n\t\t\tTrimBitmapBuffer(pageNumber);\r\n\t\t}\r\n\r\n\t\tpublic void SetTextPage(int pageNumber, TextPage textPage) {\r\n\t\t\tif (_buffer.TryGetValue(pageNumber, out var image)) {\r\n\t\t\t\timage.TextPage?.Dispose();\r\n\t\t\t}\r\n\t\t\t_buffer[pageNumber].TextPage = textPage;\r\n\t\t}\r\n\r\n\t\tvoid TrimBitmapBuffer(int pageNumber) {\r\n\t\t\tif (__bufferSize >= _buffer.Count) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tint x = 0;\r\n\t\t\tint i = 0;\r\n\t\t\tforeach (var item in _buffer.Keys) {\r\n\t\t\t\tif (Math.Abs(item - pageNumber) > x) {\r\n\t\t\t\t\tx = Math.Abs(item - pageNumber);\r\n\t\t\t\t\ti = item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_buffer[i].Dispose();\r\n\t\t\t_buffer.Remove(i);\r\n\t\t}\r\n\r\n\t\tpublic void Clear() {\r\n\t\t\tif (!_buffer.HasContent()) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var item in _buffer) {\r\n\t\t\t\titem.Value.Dispose();\r\n\t\t\t}\r\n\t\t\t_buffer.Clear();\r\n\t\t}\r\n\r\n\t\tpublic void Dispose() {\r\n\t\t\tClear();\r\n\t\t\t_buffer = null;\r\n\t\t}\r\n\r\n\t\tsealed class RenderResult : IDisposable\r\n\t\t{\r\n\t\t\tpublic Page Page { get; private set; }\r\n\t\t\tpublic Bitmap Image { get; internal set; }\r\n\t\t\tpublic TextPage TextPage { get; internal set; }\r\n\r\n\t\t\tpublic RenderResult(Page page) {\r\n\t\t\t\tPage = page;\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Dispose() {\r\n\t\t\t\tPage?.Dispose();\r\n\t\t\t\tImage?.Dispose();\r\n\t\t\t\tTextPage?.Dispose();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Processor/NullXmlWriter.cs",
    "content": "﻿using System;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class NullXmlWriter : System.Xml.XmlWriter\r\n\t{\r\n\t\tpublic override void Close() {\r\n\t\t}\r\n\t\tpublic override void Flush() {\r\n\t\t}\r\n\t\tpublic override string LookupPrefix(string ns) {\r\n\t\t\treturn String.Empty;\r\n\t\t}\r\n\t\tpublic override void WriteBase64(byte[] buffer, int index, int count) {\r\n\t\t}\r\n\t\tpublic override void WriteCData(string text) {\r\n\t\t}\r\n\t\tpublic override void WriteCharEntity(char ch) {\r\n\t\t}\r\n\t\tpublic override void WriteChars(char[] buffer, int index, int count) {\r\n\t\t}\r\n\t\tpublic override void WriteComment(string text) {\r\n\t\t}\r\n\t\tpublic override void WriteDocType(string name, string pubid, string sysid, string subset) {\r\n\t\t}\r\n\t\tpublic override void WriteEndAttribute() {\r\n\t\t}\r\n\t\tpublic override void WriteEndDocument() {\r\n\t\t}\r\n\t\tpublic override void WriteEndElement() {\r\n\t\t}\r\n\t\tpublic override void WriteEntityRef(string name) {\r\n\t\t}\r\n\t\tpublic override void WriteFullEndElement() {\r\n\t\t}\r\n\t\tpublic override void WriteProcessingInstruction(string name, string text) {\r\n\t\t}\r\n\t\tpublic override void WriteRaw(string data) {\r\n\t\t}\r\n\t\tpublic override void WriteRaw(char[] buffer, int index, int count) {\r\n\t\t}\r\n\t\tpublic override void WriteStartAttribute(string prefix, string localName, string ns) {\r\n\t\t}\r\n\t\tpublic override void WriteStartDocument(bool standalone) {\r\n\t\t}\r\n\t\tpublic override void WriteStartDocument() {\r\n\t\t}\r\n\t\tpublic override void WriteStartElement(string prefix, string localName, string ns) {\r\n\t\t}\r\n\t\tpublic override System.Xml.WriteState WriteState => System.Xml.WriteState.Content;\r\n\t\tpublic override void WriteString(string text) {\r\n\t\t}\r\n\t\tpublic override void WriteSurrogateCharEntity(char lowChar, char highChar) {\r\n\t\t}\r\n\t\tpublic override void WriteWhitespace(string ws) {\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/OcrProcessor.cs",
    "content": "﻿#if DEBUG\r\n#define DEBUGOCR\r\n#endif\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text.RegularExpressions;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing PDFPatcher.Processor.Imaging;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class OcrProcessor\r\n\t{\r\n\t\tinternal sealed class Result\r\n\t\t{\r\n\t\t\tpublic ImageDisposition Image { get; }\r\n\t\t\tpublic List<TextLine> Texts { get; }\r\n\t\t\tpublic Result(ImageDisposition image) {\r\n\t\t\t\tImage = image;\r\n\t\t\t\tTexts = new List<TextLine>();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst int OpenWorkload = 1;\r\n\t\tconst string __punctuations = @\"·．“”，,\\.－\"\"～∼。:：\\p{P}\";\r\n\t\tstatic readonly AutoBookmarkOptions __MergeOptions = new AutoBookmarkOptions { MergeAdjacentTitles = true, MergeDifferentSizeTitles = true };\r\n\t\tstatic readonly Regex __ContentPunctuationExpression = new Regex(@\"[\" + __punctuations + @\"][\" + __punctuations + @\"0一\\s]+[\" + __punctuations + @\"]\\s*\", RegexOptions.Compiled);\r\n\t\tstatic readonly Regex __ContinuousWhiteSpaceExpression = new Regex(@\"[ 　]{3,}\", RegexOptions.Compiled);\r\n\t\tstatic readonly Regex __WhiteSpaceBetweenChineseCharacters = new Regex(@\"([\\u4E00-\\u9FFF\\u3400-\\u4DBF])[ 　]+(?=[\\u4E00-\\u9FFF\\u3400-\\u4DBF])\", RegexOptions.Compiled);\r\n\r\n\t\tprivate readonly ModiOcr _Ocr;\r\n\t\tprivate readonly float _OcrQuantitativeFactor;\r\n\t\tprivate readonly PdfReader _reader;\r\n\t\tprivate readonly ImageExtractor _ocrImageExp;\r\n\t\tprivate readonly OcrOptions _options;\r\n\t\tprivate IResultWriter _resultWriter;\r\n\r\n\t\tpublic OcrProcessor(PdfReader reader, OcrOptions options) : this(options) {\r\n\t\t\tvar expOptions = new ImageExtracterOptions() {\r\n\t\t\t\tOutputPath = Path.GetTempPath(),\r\n\t\t\t\tFileMask = \"\\\"ocr-\" + DateTime.Now.ToString(\"yyMMddHHmmss\") + \"-\\\"0000\",\r\n\t\t\t\tMergeImages = true,\r\n\t\t\t\tMergeJpgToPng = true,\r\n\t\t\t\tMinHeight = 100,\r\n\t\t\t\tMinWidth = 100\r\n\t\t\t};\r\n\t\t\tCleanUpTempFiles(expOptions.OutputPath);\r\n\t\t\t_reader = reader;\r\n\t\t\t_ocrImageExp = new ImageExtractor(expOptions) {\r\n\t\t\t\tPrintImageLocation = false\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tprivate OcrProcessor(OcrOptions options) {\r\n\t\t\t_Ocr = new ModiOcr {\r\n\t\t\t\tLangID = options.OcrLangID,\r\n\t\t\t\tStretchPage = options.StretchPage,\r\n\t\t\t\tOrientPage = options.OrientPage,\r\n\t\t\t\tWritingDirection = options.WritingDirection\r\n\t\t\t};\r\n\t\t\t_OcrQuantitativeFactor = options.QuantitativeFactor;\r\n\t\t\t_options = options;\r\n\t\t}\r\n\r\n\t\tprivate static void CleanUpTempFiles(string folderPath) {\r\n\t\t\tvar tf = Directory.GetFiles(folderPath, \"ocr-*.tif\");\r\n\t\t\tforeach (var file in tf) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tFile.Delete(file);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal int EstimateWorkload() {\r\n\t\t\tvar n = _reader.NumberOfPages;\r\n\t\t\tvar load = 0;\r\n\t\t\tload += OpenWorkload;\r\n\t\t\tvar t = PageRangeCollection.Parse(_options.PageRanges, 1, n, true).TotalPages;\r\n\t\t\tload += t > 0 ? t : n;\r\n\t\t\treturn load;\r\n\t\t}\r\n\r\n\t\tinternal void SetWriter(XmlWriter writer) {\r\n\t\t\t_resultWriter = new XmlResultWriter(writer);\r\n\t\t}\r\n\t\tinternal void SetWriter(TextWriter writer) {\r\n\t\t\t_resultWriter = new TextResultWriter(writer);\r\n\t\t}\r\n\r\n\t\tinternal void PerformOcr() {\r\n\t\t\tTracker.IncrementProgress(OpenWorkload);\r\n\t\t\tvar ranges = PageRangeCollection.Parse(_options.PageRanges, 1, _reader.NumberOfPages, true);\r\n\t\t\t__MergeOptions.DetectColumns = _options.DetectColumns;\r\n\t\t\t__MergeOptions.WritingDirection = _options.WritingDirection;\r\n\t\t\tTextLine.DefaultDirection = _options.WritingDirection;\r\n\t\t\tif (FileHelper.IsPathValid(_options.SaveOcredImagePath)) {\r\n\t\t\t\tFile.Delete(_options.SaveOcredImagePath);\r\n\t\t\t}\r\n\t\t\tvar el = new List<int>();\r\n\t\t\tforeach (PageRange r in ranges) {\r\n\t\t\t\tfor (int i = r.StartValue; i <= r.EndValue; i++) {\r\n\t\t\t\t\tTracker.TraceMessage(\"正在识别第 \" + i + \" 页。\");\r\n\t\t\t\t\tvar or = OcrPage(i, el);\r\n\t\t\t\t\tif (or.Count > 0) {\r\n\t\t\t\t\t\t_resultWriter?.BeginWritePage(i);\r\n\r\n\t\t\t\t\t\tforeach (var result in or) {\r\n\t\t\t\t\t\t\t_resultWriter?.BeginWriteImage(result.Image);\r\n\t\t\t\t\t\t\tif (_options.OutputOriginalOcrResult) {\r\n\t\t\t\t\t\t\t\tif (_resultWriter != null) {\r\n\t\t\t\t\t\t\t\t\tforeach (var item in result.Texts) {\r\n\t\t\t\t\t\t\t\t\t\t_resultWriter.WriteText(item, null);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tWriteOcrResult(i, result);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t_resultWriter?.EndWriteImage();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_resultWriter?.EndWritePage();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (el.Count > 0) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, String.Concat(\"有 \", el.Count, \" 页在识别过程中出现错误，页码为：\", String.Join(\", \", el)));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void WriteOcrResult(int i, Result result) {\r\n\t\t\tSortRecognizedText(result.Texts, _options);\r\n\t\t\tvar pr = _reader.GetPageNRelease(i).GetPageVisibleRectangle();\r\n\t\t\tvar tl = _options.WritingDirection != WritingDirection.Unknown\r\n\t\t\t\t? AutoBookmarkCreator.MergeTextInfoList(pr, result.Texts.ConvertAll((l) => GetMergedTextInfo(result.Image, l)), __MergeOptions) // 按照书写方向重组识别文本\r\n\t\t\t\t: result.Texts;\r\n\t\t\tforeach (var item in tl) {\r\n\t\t\t\tvar t = item.Text;\r\n\t\t\t\tvar ir = item.Region;\r\n\r\n\t\t\t\tt = CleanUpText(t, _options);\r\n\t\t\t\tif (_options.PrintOcrResult) {\r\n#if DEBUG\r\n\t\t\t\t\tTracker.TraceMessage(String.Concat(item.Direction.ToString()[0], ir.Top.ToString(\" 0000\"), ',', ir.Left.ToString(\"0000\"), \"(\", ir.Width.ToString(\"0000\"), ',', ir.Height.ToString(\"0000\"), \")\\t\", t));\r\n#else\r\n\t\t\t\t\tTracker.TraceMessage (t);\r\n#endif\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_resultWriter?.WriteText(item, t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 根据识别选项优化输出结果。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"text\">文本内容。</param>\r\n\t\t/// <param name=\"options\">识别选项。</param>\r\n\t\t/// <returns>优化后的文本。</returns>\r\n\t\tinternal static string CleanUpText(string text, OcrOptions options) {\r\n\t\t\tif (options.DetectContentPunctuations) {\r\n\t\t\t\ttext = __ContentPunctuationExpression.Replace(text, \" .... \");\r\n\t\t\t}\r\n\t\t\tif (options.CompressWhiteSpaces) {\r\n\t\t\t\ttext = __ContinuousWhiteSpaceExpression.Replace(text, \"  \");\r\n\t\t\t}\r\n\t\t\tif (options.RemoveWhiteSpacesBetweenChineseCharacters) {\r\n\t\t\t\ttext = __WhiteSpaceBetweenChineseCharacters.Replace(text, \"$1\");\r\n\t\t\t}\r\n\t\t\treturn text;\r\n\t\t}\r\n\r\n\t\tprivate IList<Result> OcrPage(int i, List<int> errorList) {\r\n#if DEBUGOCR\r\n\t\t\tTracker.TraceMessage(\"导出第 \" + i + \" 页的图片。\");\r\n#endif\r\n\t\t\t_ocrImageExp.ExtractPageImages(_reader, i);\r\n#if DEBUGOCR\r\n\t\t\tTracker.TraceMessage(\"完成导出第 \" + i + \" 页的图片。\");\r\n#endif\r\n\t\t\tvar or = new List<Result>();\r\n\t\t\ttry {\r\n\t\t\t\tforeach (var item in _ocrImageExp.PosList) {\r\n\t\t\t\t\tvar r = new Result(item);\r\n\t\t\t\t\tOcrPage(r);\r\n\t\t\t\t\tor.Add(r);\r\n\t\t\t\t\tr = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (System.Runtime.InteropServices.COMException ex) {\r\n\t\t\t\tstring err = null;\r\n\t\t\t\tswitch (ex.ErrorCode) {\r\n\t\t\t\t\tcase -959967087:\r\n\t\t\t\t\t\terr = \"页面的图片不包含可识别的文本。\";\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"在执行第 \" + i + \" 页的光学字符识别时出错：\");\r\n\t\t\t\t\t\tif (err != null) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(err);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(\"错误编号：\" + ex.ErrorCode);\r\n\t\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t\t\terrorList.Add(i);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"在执行第 \" + i + \" 页的光学字符识别时出错：\");\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\terrorList.Add(i);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tforeach (var item in _ocrImageExp.InfoList) {\r\n\t\t\t\t\tif (String.IsNullOrEmpty(item.FileName)) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tFile.Delete(item.FileName);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, ex.Message);\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"无法删除识别过程中产生的临时文件：\" + item.FileName);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn or;\r\n\t\t}\r\n\r\n\t\tprivate void OcrPage(Result result) {\r\n\t\t\tvar image = result.Image;\r\n\t\t\tvar p = image.Image.FileName;\r\n\t\t\tif (String.IsNullOrEmpty(p)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n#if DEBUGOCR\r\n\t\t\tTracker.TraceMessage(\"识别图片：\" + p);\r\n#endif\r\n#if DEBUG\r\n\t\t\tTracker.TraceMessage(p);\r\n#endif\r\n\t\t\tresult.Texts.Clear();\r\n\t\t\tOcrImageFile(result.Texts, p);\r\n\t\t\t#region Legacy code\r\n\t\t\t//            var ll = new List<TextLine> ();\r\n\t\t\t//            // 同行合并宽度最小值\r\n\t\t\t//            var cw = image.Image.Width / 4;\r\n\r\n\t\t\t//            // 遍历识别所得的各 TextInfo，使用最小距离聚类方法将其聚类为行\r\n\t\t\t//            foreach (var item in or) {\r\n\t\t\t//                var ir = item.Region;\r\n\t\t\t//                DistanceInfo cd = null; // TextInfo 到 TextLine 的距离\r\n\t\t\t//                DistanceInfo md = new DistanceInfo (DistanceInfo.Placement.Unknown, float.MaxValue); // 最小距离\r\n\t\t\t//                TextLine ml = null; // 最小距离的 TextLine\r\n\r\n\t\t\t//if (item.Text == \"哉\") {\r\n\t\t\t//    var lxx = 1;\r\n\t\t\t//}\r\n\t\t\t//                // 求最小距离的 TextLine\r\n\t\t\t//                foreach (var li in ll) {\r\n\t\t\t//                    cd = li.GetDistance (ir);\r\n\t\t\t//                    if ((cd.Location == DistanceInfo.Placement.Overlapping // 当前项与文本行交叠\r\n\t\t\t//                            && (md.Location != DistanceInfo.Placement.Overlapping // 最小距离不是交叠\r\n\t\t\t//                                || cd.Distance < md.Distance) // 当前项与文本行的交叠中心距离小于最小距离\r\n\t\t\t//                            )\r\n\t\t\t//                        || ((md.Location == DistanceInfo.Placement.Unknown // 未知最小距离\r\n\t\t\t//                            || (cd.Location != DistanceInfo.Placement.Overlapping\r\n\t\t\t//                                && md.Location != DistanceInfo.Placement.Overlapping\r\n\t\t\t//                                && cd.Distance < md.Distance) // 当前项与文本行的距离小于最小距离\r\n\t\t\t//                            )\r\n\t\t\t//                            && (((cd.Location == DistanceInfo.Placement.Left || cd.Location == DistanceInfo.Placement.Right) // 相对位置为水平\r\n\t\t\t//                                    && li.Direction != TextLine.WritingDirection.Vertical // 文本行方向不为纵向\r\n\t\t\t//                                    )\r\n\t\t\t//                                || ((cd.Location == DistanceInfo.Placement.Up || cd.Location == DistanceInfo.Placement.Down) // 相对位置为垂直\r\n\t\t\t//                                    && li.Direction != TextLine.WritingDirection.Horizontal // 文本行方向不为横向\r\n\t\t\t//                                    )\r\n\t\t\t//                                )\r\n\t\t\t//                            && cd.Distance < cw\r\n\t\t\t//                        )\r\n\t\t\t//                        ) {\r\n\t\t\t//                        md = cd;\r\n\t\t\t//                        ml = li;\r\n\t\t\t//                    }\r\n\t\t\t//                }\r\n\r\n\t\t\t//                if (ml != null) {\r\n\t\t\t//                    // 若存在最小距离的 TextLine 且可合并，则将 item 归入 TextLine\r\n\t\t\t//                    if (md.Location == DistanceInfo.Placement.Overlapping) {\r\n\t\t\t//                        // 检查是否存在交叠重复的文本\r\n\t\t\t//                        foreach (var t in ml.Texts) {\r\n\t\t\t//                            if (t.Region.IntersectWith (item.Region) // item 与 TextLine 中某项交叠\r\n\t\t\t//                                && (t.Text.Contains (item.Text) || item.Text.Contains (t.Text) // 交叠的项文本和 item 的文本相同\r\n\t\t\t//                                )\r\n\t\t\t//                                ) {\r\n\t\t\t//                                goto Next; // 忽略此项目\r\n\t\t\t//                            }\r\n\t\t\t//                        }\r\n\t\t\t//                    }\r\n\t\t\t//                    ml.AddText (item);\r\n\t\t\t//                }\r\n\t\t\t//                else {\r\n\t\t\t//                    // 否则，用 item 创建新的 TextLine\r\n\t\t\t//                    ll.Add (new TextLine (item));\r\n\t\t\t//                }\r\n\t\t\t//            Next:\r\n\t\t\t//                continue;\r\n\t\t\t//            }\r\n\r\n\t\t\t//if (or.Count > 0) {\r\n\t\t\t//    float size = 0, size2 = 0, avgSize, maxSize = 0;\r\n\t\t\t//    float top = or[0].Region.Top, bottom = or[0].Region.Bottom, left = or[0].Region.Left, right = 0;\r\n\t\t\t//    var sb = new System.Text.StringBuilder ();\r\n\t\t\t//    int letterCount = 0;\r\n\t\t\t//    var rr = new List<TextInfo> ();\r\n\t\t\t//    Bound r;\r\n\t\t\t//    var end = or.Count - 1;\r\n\t\t\t//    for (var i = 0; i <= end; i++) {\r\n\t\t\t//        var item = or[i];\r\n\t\t\t//        r = item.Region;\r\n\t\t\t//        avgSize = letterCount > 0 ? size / letterCount : maxSize;\r\n\t\t\t//    AddLine:\r\n\t\t\t//        if (r.Top > bottom + 0.2f * (avgSize) || i > end) { // 新行\r\n\t\t\t//            size = image.YScale * avgSize;\r\n\t\t\t//            if (_OcrQuatitiveFactor > 0) {\r\n\t\t\t//                var a = Math.IEEERemainder (size, _OcrQuatitiveFactor);\r\n\t\t\t//                var b = Math.IEEERemainder (size + _OcrQuatitiveFactor, _OcrQuatitiveFactor);\r\n\t\t\t//                if (a < b) {\r\n\t\t\t//                    size -= (float)a;\r\n\t\t\t//                }\r\n\t\t\t//                else {\r\n\t\t\t//                    size += _OcrQuatitiveFactor - (float)b;\r\n\t\t\t//                }\r\n\t\t\t//            }\r\n\t\t\t//            if (size >= _fontSizeThreshold) {\r\n\t\t\t//                var ni = new TextInfo ()\r\n\t\t\t//                {\r\n\t\t\t//                    Text = sb.ToString (),\r\n\t\t\t//                    Size = size,\r\n\t\t\t//                    Region = new Bound (\r\n\t\t\t//                        image.X + image.XScale * left,\r\n\t\t\t//                        image.Y + image.YScale * (image.Image.Height - bottom),\r\n\t\t\t//                        image.X + image.XScale * right,\r\n\t\t\t//                        image.Y + image.YScale * (image.Image.Height - top)),\r\n\t\t\t//                    Font = -1\r\n\t\t\t//                };\r\n\t\t\t//                rr.Add (ni);\r\n\t\t\t//            }\r\n\t\t\t//            maxSize = size = size2 = 0;\r\n\t\t\t//            left = r.Left;\r\n\t\t\t//            right = r.Right;\r\n\t\t\t//            top = r.Top;\r\n\t\t\t//            bottom = r.Bottom;\r\n\t\t\t//            sb.Length = 0;\r\n\t\t\t//            letterCount = 0;\r\n\t\t\t//            if (i > end) {\r\n\t\t\t//                break;\r\n\t\t\t//            }\r\n\t\t\t//        }\r\n\t\t\t//        if (Char.IsLetter (item.Text[0])) {\r\n\t\t\t//            size += item.Size;\r\n\t\t\t//            size2 += item.Size * item.Size;\r\n\t\t\t//            letterCount++;\r\n\t\t\t//        }\r\n\t\t\t//        if (item.Size > maxSize) {\r\n\t\t\t//            maxSize = item.Size;\r\n\t\t\t//        }\r\n\t\t\t//        if (r.Top < top) {\r\n\t\t\t//            top = r.Top;\r\n\t\t\t//        }\r\n\t\t\t//        if (r.Bottom > bottom) {\r\n\t\t\t//            bottom = r.Bottom;\r\n\t\t\t//        }\r\n\t\t\t//        if (r.Right > right) {\r\n\t\t\t//            right = r.Right;\r\n\t\t\t//        }\r\n\t\t\t//        sb.Append (item.Text);\r\n\t\t\t//        if (i == end) {\r\n\t\t\t//            i++;\r\n\t\t\t//            goto AddLine;\r\n\t\t\t//        }\r\n\t\t\t//    }\r\n\t\t\t//    this._TextList.AddRange (rr);\r\n\t\t\t//}\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tprivate void OcrImageFile(List<TextLine> result, string p) {\r\n\t\t\tvar sp = _options.SaveOcredImagePath;\r\n\t\t\tif (FileHelper.HasExtension(p, Constants.FileExtensions.Tif) == false) {\r\n\t\t\t\tusing (var fi = new FreeImageAPI.FreeImageBitmap(p)) {\r\n#if !DEBUG\r\n\t\t\t\t\tvar t = Path.GetDirectoryName (p) + \"\\\\ocr-\" + new Random ().Next ().ToText () +\".tif\";\r\n#else\r\n\t\t\t\t\tvar t = \"m:\\\\ocr.tif\";\r\n#endif\r\n\t\t\t\t\tif (_options.PreserveColor) {\r\n\t\t\t\t\t\tfi.Save(t, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_TIFF);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tusing (var ti = fi.GetColorConvertedInstance(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_01_BPP_THRESHOLD)) {\r\n\t\t\t\t\t\t\tti.Save(t, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_TIFF);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_Ocr.Ocr(t, sp, result);\r\n#if !DEBUG\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tFile.Delete (t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t\tTracker.TraceMessage (Tracker.Category.Notice, \"无法删除临时文件：\" + t);\r\n\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t_Ocr.Ocr(p, sp, result);\r\n\t\t\t}\r\n#if DEBUGOCR\r\n\t\t\tTracker.TraceMessage(\"完成识别图片：\" + p);\r\n#endif\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 调用图像处理引擎识别位图。如图片中的文本量太少，将无法识别，并会抛出异常。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"bmp\">需要识别的图片。</param>\r\n\t\t/// <param name=\"options\">识别选项。</param>\r\n\t\t/// <exception cref=\"System.Runtime.InteropServices.COMException\">在识别时发生的错误。</exception>\r\n\t\t/// <returns>识别后的文本。</returns>\r\n\t\tinternal static List<TextLine> OcrBitmap(System.Drawing.Bitmap bmp, OcrOptions options) {\r\n\t\t\tconst int minSize = 500;\r\n\t\t\tvar ocr = new OcrProcessor(options);\r\n\t\t\tvar r = new List<TextLine>();\r\n\t\t\tstring p = null;\r\n\t\t\tusing (var fi = new FreeImageAPI.FreeImageBitmap(bmp)) {\r\n\t\t\t\tif (fi.Width < minSize || fi.Height < minSize) {\r\n\t\t\t\t\tfi.EnlargeCanvas<FreeImageAPI.RGBQUAD>(0, 0, fi.Width < minSize ? minSize : fi.Width, fi.Height < minSize ? minSize : fi.Height, new FreeImageAPI.RGBQUAD(fi.GetPixel(0, 0)));\r\n\t\t\t\t}\r\n\t\t\t\tp = FileHelper.CombinePath(Path.GetTempPath(), new Random().Next(Int32.MaxValue).ToText() + Constants.FileExtensions.Tif);\r\n\t\t\t\tfi.Save(p, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_TIFF);\r\n\t\t\t}\r\n\t\t\tocr._Ocr.Ocr(p, null, r);\r\n\t\t\tFile.Delete(p);\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tprivate static TextInfo GetMergedTextInfo(ImageDisposition image, TextLine item) {\r\n\t\t\tvar ti = new TextInfo {\r\n\t\t\t\tFont = null,\r\n\t\t\t\tRegion = item.Region,\r\n\t\t\t\tText = item.Text,\r\n\t\t\t\tSize = (float)Math.Round(item.Direction == WritingDirection.Vertical ? item.Region.Width/* * image.XScale*/ : item.Region.Height/* * image.YScale*/),\r\n\t\t\t\tLetterWidth = item.GetAverageCharSize()\r\n\t\t\t};\r\n\t\t\t//if (item.Texts.Count > 0) {\r\n\t\t\t//    float aw = 0;\r\n\t\t\t//    foreach (var t in item.Texts) {\r\n\t\t\t//        aw += t.LetterWidth;\r\n\t\t\t//    }\r\n\t\t\t//    aw /= item.Texts.Count;\r\n\t\t\t//    ti.LetterWidth = aw;\r\n\t\t\t//}\r\n\t\t\treturn ti;\r\n\t\t}\r\n\r\n\t\tprivate static void SortRecognizedText(List<TextLine> list, OcrOptions ocrOptions) {\r\n\t\t\tif (ocrOptions.WritingDirection == WritingDirection.Horizontal) {\r\n\t\t\t\tlist.Sort((a, b) => {\r\n\t\t\t\t\tvar ra = a.Region;\r\n\t\t\t\t\tvar rb = b.Region;\r\n\t\t\t\t\tif (ra.Bottom > rb.Top) {\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (ra.Top < rb.Bottom) {\r\n\t\t\t\t\t\treturn -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (ra.IsAlignedWith(rb, WritingDirection.Horizontal)) {\r\n\t\t\t\t\t\treturn ra.Center < rb.Center ? -1 : 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn ra.Middle < rb.Middle ? -1 : 1;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse if (ocrOptions.WritingDirection == WritingDirection.Vertical) {\r\n\t\t\t\tlist.Sort((a, b) => {\r\n\t\t\t\t\tvar ra = a.Region;\r\n\t\t\t\t\tvar rb = b.Region;\r\n\t\t\t\t\tif (ra.Left > rb.Right) {\r\n\t\t\t\t\t\treturn -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (ra.Right < rb.Left) {\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (ra.IsAlignedWith(rb, WritingDirection.Vertical)) {\r\n\t\t\t\t\t\treturn ra.Middle > rb.Middle ? -1 : 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn ra.Center > rb.Center ? -1 : 1;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinterface IResultWriter\r\n\t\t{\r\n\t\t\tvoid BeginWritePage(int i);\r\n\t\t\tvoid BeginWriteImage(ImageDisposition image);\r\n\t\t\tvoid WriteText(TextLine text, string optimizedText);\r\n\t\t\tvoid EndWriteImage();\r\n\t\t\tvoid EndWritePage();\r\n\t\t}\r\n\r\n\t\tsealed class XmlResultWriter : IResultWriter\r\n\t\t{\r\n\t\t\treadonly XmlWriter _writer;\r\n\t\t\tpublic XmlResultWriter(XmlWriter writer) {\r\n\t\t\t\t_writer = writer;\r\n\t\t\t}\r\n\r\n\t\t\t#region IResultWriter 成员\r\n\r\n\t\t\tpublic void BeginWritePage(int i) {\r\n\t\t\t\t_writer.WriteStartElement(Constants.Ocr.Result);\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Content.PageNumber, ValueHelper.ToText(i));\r\n\t\t\t}\r\n\r\n\t\t\tpublic void WriteText(TextLine text, string optimizedText) {\r\n\t\t\t\tif (optimizedText != null) {\r\n\t\t\t\t\tWriteTextItem(optimizedText, text.Region, text.Direction);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t_writer.WriteComment(text.Text);\r\n\t\t\t\tforeach (var item in text.Texts) {\r\n\t\t\t\t\tWriteTextItem(item.Text, item.Region, WritingDirection.Unknown);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tprivate void WriteTextItem(string text, Bound ir, WritingDirection direction) {\r\n\t\t\t\t_writer.WriteStartElement(Constants.Ocr.Content);\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Ocr.Text, text);\r\n\t\t\t\tswitch (direction) {\r\n\t\t\t\t\tcase WritingDirection.Horizontal:\r\n\t\t\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Direction, Constants.Coordinates.Horizontal);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase WritingDirection.Vertical:\r\n\t\t\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Direction, Constants.Coordinates.Vertical);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Top, ValueHelper.ToText(Math.Round(ir.Top)));\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Left, ValueHelper.ToText(Math.Round(ir.Left)));\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Bottom, ValueHelper.ToText(Math.Round(ir.Bottom)));\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Right, ValueHelper.ToText(Math.Round(ir.Right)));\r\n\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t}\r\n\r\n\t\t\tpublic void EndWritePage() {\r\n\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t}\r\n\r\n\t\t\tpublic void BeginWriteImage(ImageDisposition image) {\r\n\t\t\t\t_writer.WriteStartElement(Constants.Ocr.Image);\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Width, ValueHelper.ToText(image.Image.Width));\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Coordinates.Height, ValueHelper.ToText(image.Image.Height));\r\n\t\t\t\t_writer.WriteAttributeString(Constants.Content.OperandNames.Matrix, PdfHelper.MatrixToString(image.Ctm));\r\n\t\t\t}\r\n\r\n\t\t\tpublic void EndWriteImage() {\r\n\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t}\r\n\t\t\t#endregion\r\n\t\t}\r\n\r\n\t\tsealed class TextResultWriter : IResultWriter\r\n\t\t{\r\n\t\t\treadonly TextWriter _writer;\r\n\t\t\tpublic TextResultWriter(TextWriter writer) {\r\n\t\t\t\t_writer = writer;\r\n\t\t\t}\r\n\r\n\t\t\t#region IResultWriter 成员\r\n\r\n\t\t\tpublic void BeginWritePage(int i) {\r\n\t\t\t\t_writer.WriteLine(\"#识别页码=\" + i);\r\n\t\t\t}\r\n\r\n\t\t\tpublic void WriteText(TextLine text, string optimizedText) {\r\n\t\t\t\t_writer.WriteLine(optimizedText ?? text.Text);\r\n\t\t\t}\r\n\r\n\t\t\tpublic void EndWritePage() {\r\n\t\t\t\t_writer.WriteLine();\r\n\t\t\t}\r\n\r\n\t\t\tpublic void BeginWriteImage(ImageDisposition image) {\r\n\t\t\t\t_writer.WriteLine(\"#识别图片=\" + PdfHelper.MatrixToString(image.Ctm));\r\n\t\t\t}\r\n\r\n\t\t\tpublic void EndWriteImage() { }\r\n\t\t\t#endregion\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/OperatorGroup.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal sealed class OperatorGroup : PdfContentStreamProcessor.IContentOperator\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 处理内容的 <see cref=\"PdfContentStreamProcessor.IContentOperator\"/> 列表。\r\n\t\t/// </summary>\r\n\t\tpublic List<PdfContentStreamProcessor.IContentOperator> Operators { get; }\r\n\t\tpublic bool HasOutput { get; }\r\n\r\n\t\tpublic OperatorGroup(IEnumerable<PdfContentStreamProcessor.IContentOperator> operators) {\r\n\t\t\tOperators = new List<PdfContentStreamProcessor.IContentOperator>();\r\n\t\t\tif (operators != null) {\r\n\t\t\t\tOperators.AddRange(operators);\r\n\t\t\t\tforeach (var item in operators) {\r\n\t\t\t\t\tif (item.HasOutput) {\r\n\t\t\t\t\t\tHasOutput = true;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#region IContentOperator 成员\r\n\r\n\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\tforeach (var item in Operators) {\r\n\t\t\t\titem.Invoke(processor, oper, operands);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/OutlineManager.cs",
    "content": "﻿using System;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Xml;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\t/// <summary>A class which manages outlines (bookmarks) of PDF documents.</summary>\r\n\tstatic partial class OutlineManager\r\n\t{\r\n\t\tstatic readonly char[] __fullWidthNumbers = \"０１２３４５６７８９\".ToCharArray();\r\n\t\tstatic readonly char[] __halfWidthNumbers = \"0123456789\".ToCharArray();\r\n\t\tstatic readonly char[] __cmdIdentifiers = ['=', '﹦', '＝', ':', '：'];\r\n\t\tstatic readonly char[] __pageLabelSeparators = [';', '；', ',', '，', ' '];\r\n\r\n\t\tinternal static void ImportSimpleBookmarks(TextReader source, PdfInfoXmlDocument target) {\r\n\t\t\tstring cmd, cmdData, s, title, indentString = \"\\t\", pnText;\r\n\t\t\tbool isOpen = false; // 书签是否默认打开\r\n\t\t\tint pageOffset = 0, pageNum;\r\n\t\t\tint currentIndent = -1, indent, p;\r\n\t\t\tint lineNum = 0;\r\n\t\t\tchar[] digits;\r\n\t\t\tvar pattern = new Regex(@\"(.+?)[\\s\\.…　\\-_]*(-?[0-9０１２３４５６７８９]+)?\\s*$\", RegexOptions.Compiled);\r\n\t\t\tvar docInfo = target.InfoNode;\r\n\t\t\tvar root = target.BookmarkRoot;\r\n\t\t\tvar pageLabels = target.PageLabelRoot;\r\n\t\t\tBookmarkContainer currentBookmark = root;\r\n\t\t\tBookmarkElement bookmark;\r\n\t\t\twhile (source.Peek() != -1) {\r\n\t\t\t\ts = source.ReadLine();\r\n\t\t\t\tlineNum++;\r\n\t\t\t\tif (s.Trim().Length == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ((s[0] == '#' || s[0] == '＃') && (p = s.IndexOfAny(__cmdIdentifiers)) != -1) {\r\n\t\t\t\t\tcmd = s.Substring(1, p - 1);\r\n\t\t\t\t\tcmdData = s.Substring(p + 1);\r\n\t\t\t\t\tswitch (cmd) {\r\n\t\t\t\t\t\tcase \"首页页码\":\r\n\t\t\t\t\t\t\tif (cmdData.TryParse(out pageOffset)) {\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(\"首页页码改为 \" + pageOffset);\r\n\t\t\t\t\t\t\t\tpageOffset--;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"缩进标记\":\r\n\t\t\t\t\t\t\tindentString = cmdData;\r\n\t\t\t\t\t\t\tTracker.TraceMessage($\"缩进标记改为“{indentString}”\");\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"版本\":\r\n\t\t\t\t\t\t\tif (lineNum == 1) {\r\n\t\t\t\t\t\t\t\tvar v = cmdData.Trim();\r\n\t\t\t\t\t\t\t\ttarget.DocumentElement.SetAttribute(Constants.Info.ProductVersion, v);\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(\"导入简易书签文件，版本为：\" + v);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"打开书签\":\r\n\t\t\t\t\t\t\tcmdData = cmdData.ToLowerInvariant();\r\n\t\t\t\t\t\t\tisOpen = (cmdData == \"是\" || cmdData == \"true\" || cmdData == \"y\" || cmdData == \"yes\" || cmdData == \"1\");\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase Constants.Info.DocumentPath:\r\n\t\t\t\t\t\t\ttarget.PdfDocumentPath = cmdData.Trim();\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase Constants.PageLabels:\r\n\t\t\t\t\t\t\tvar l = cmdData.Split(__pageLabelSeparators, 3);\r\n\t\t\t\t\t\t\tif (l.Length < 1) {\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(Constants.PageLabels + \"格式不正确，至少应指定起始页码。\");\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tint pn;\r\n\t\t\t\t\t\t\tif (!l[0].TryParse(out pn) || pn < 1) {\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(Constants.PageLabels + \"格式不正确：起始页码应为正整数。\");\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tvar style = l[1].Length > 0\r\n\t\t\t\t\t\t\t\t? ValueHelper.MapValue(l[1][0],\r\n\t\t\t\t\t\t\t\t\tConstants.PageLabelStyles.SimpleInfoIdentifiers,\r\n\t\t\t\t\t\t\t\t\tConstants.PageLabelStyles.Names,\r\n\t\t\t\t\t\t\t\t\tConstants.PageLabelStyles.Names[1])\r\n\t\t\t\t\t\t\t\t: Constants.PageLabelStyles.Names[1];\r\n\t\t\t\t\t\t\tvar prefix = l.Length > 2 ? l[2] : null;\r\n\t\t\t\t\t\t\tvar pl = target.CreateElement(Constants.PageLabelsAttributes.Style) as XmlElement;\r\n\t\t\t\t\t\t\tpl.SetAttribute(Constants.PageLabelsAttributes.PageNumber, pn.ToText());\r\n\t\t\t\t\t\t\tpl.SetAttribute(Constants.PageLabelsAttributes.Style, style);\r\n\t\t\t\t\t\t\tif (!String.IsNullOrEmpty(prefix)) {\r\n\t\t\t\t\t\t\t\tpl.SetAttribute(Constants.PageLabelsAttributes.Prefix, prefix);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tpageLabels.AppendChild(pl);\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\tcase Constants.Info.Title:\r\n\t\t\t\t\t\tcase Constants.Info.Subject:\r\n\t\t\t\t\t\tcase Constants.Info.Keywords:\r\n\t\t\t\t\t\tcase Constants.Info.Author:\r\n\t\t\t\t\t\t\tdocInfo.SetAttribute(cmd, cmdData);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tindent = p = 0;\r\n\t\t\t\twhile (s.IndexOf(indentString, p) == p) {\r\n\t\t\t\t\tp += indentString.Length;\r\n\t\t\t\t\tindent++;\r\n\t\t\t\t}\r\n\t\t\t\tvar m = pattern.Match(s, p);\r\n\t\t\t\tif (!m.Success) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\ttitle = m.Groups[1].Value;\r\n\t\t\t\tpnText = m.Groups[2].Value;\r\n\t\t\t\tif (pnText.Length == 0) {\r\n\t\t\t\t\tpageNum = 0;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (pnText.IndexOfAny(__fullWidthNumbers) != -1) {\r\n\t\t\t\t\t\tdigits = Array.ConvertAll(m.Groups[2].Value.ToCharArray(), d => ValueHelper.MapValue(d, __fullWidthNumbers, __halfWidthNumbers, d));\r\n\t\t\t\t\t\tpnText = new string(digits, 0, digits.Length);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (pnText.TryParse(out pageNum)) {\r\n\t\t\t\t\t\tpageNum += pageOffset;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbookmark = target.CreateBookmark();\r\n\t\t\t\tif (indent == currentIndent) {\r\n\t\t\t\t\tcurrentBookmark.ParentNode.AppendChild(bookmark);\r\n\t\t\t\t}\r\n\t\t\t\telse if (indent > currentIndent) {\r\n\t\t\t\t\tcurrentBookmark.AppendChild(bookmark);\r\n\t\t\t\t\tif (indent - currentIndent > 1) {\r\n\t\t\t\t\t\tthrow new FormatException($\"在简易书签第 {lineNum} 行的缩进格式不正确。\\n\\n说明：下级书签最多只能比上级书签多一个缩进标记。\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcurrentIndent++;\r\n\t\t\t\t}\r\n\t\t\t\telse /* indent < currentIndent */ {\r\n\t\t\t\t\twhile (currentIndent > indent && currentBookmark.ParentNode != root) {\r\n\t\t\t\t\t\tcurrentBookmark = currentBookmark.ParentNode as BookmarkContainer;\r\n\t\t\t\t\t\tcurrentIndent--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcurrentBookmark.ParentNode.AppendChild(bookmark);\r\n\t\t\t\t}\r\n\t\t\t\tbookmark.Title = title;\r\n\t\t\t\tif (!isOpen) {\r\n\t\t\t\t\tbookmark.IsOpen = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (pageNum > 0) {\r\n\t\t\t\t\tbookmark.Page = pageNum;\r\n\t\t\t\t}\r\n\t\t\t\tcurrentBookmark = bookmark;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ImportSimpleBookmarks(string path, PdfInfoXmlDocument target) {\r\n\t\t\tusing (TextReader r = new StreamReader(path, DetectEncoding(path))) {\r\n\t\t\t\tImportSimpleBookmarks(r, target);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic static void WriteSimpleBookmarkInstruction(TextWriter writer, string item, string value) {\r\n\t\t\tif (String.IsNullOrEmpty(value)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\twriter.Write(\"#\");\r\n\t\t\twriter.Write(item);\r\n\t\t\twriter.Write(\"=\");\r\n\t\t\twriter.WriteLine(value);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 XML 书签输出为简易书签。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"writer\">输出目标。</param>\r\n\t\t/// <param name=\"container\">书签节点。</param>\r\n\t\t/// <param name=\"indent\">缩进量。</param>\r\n\t\t/// <param name=\"indentChar\">缩进字符串。</param>\r\n\t\tpublic static void WriteSimpleBookmark(TextWriter writer, BookmarkContainer container, int indent, string indentChar) {\r\n\t\t\tforeach (BookmarkElement item in container.SubBookmarks) {\r\n\t\t\t\tfor (int i = 0; i < indent; i++) {\r\n\t\t\t\t\twriter.Write(indentChar);\r\n\t\t\t\t}\r\n\t\t\t\twriter.Write(item.Title);\r\n\t\t\t\twriter.Write(\"\\t\\t\");\r\n\t\t\t\twriter.Write(item.Page.ToText());\r\n\t\t\t\twriter.WriteLine();\r\n\t\t\t\tWriteSimpleBookmark(writer, item, indent + 1, indentChar);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static Encoding DetectEncoding(string path) {\r\n\t\t\tconst string VersionString = \"#版本\";\r\n\t\t\tconst string VersionString2 = \"＃版本\";\r\n\r\n\t\t\tvar b = new byte[20];\r\n\t\t\tusing (var r = new FileStream(path, FileMode.Open)) {\r\n\t\t\t\tif (r.Length < b.Length) {\r\n\t\t\t\t\tthrow new FormatException(\"简易书签文件内容不足。\");\r\n\t\t\t\t}\r\n\t\t\t\tr.Read(b, 0, b.Length);\r\n\t\t\t}\r\n\t\t\tforeach (var item in Constants.Encoding.Encodings) {\r\n\t\t\t\tif (item == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar s = item.GetString(b);\r\n\t\t\t\tif (s.HasPrefix(VersionString) || s.HasPrefix(VersionString2)) {\r\n\t\t\t\t\treturn item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Encoding.Default;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/OutlineManager.iText.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tpartial class OutlineManager\r\n\t{\r\n\t\t/// <summary>\r\n\t\t/// 从 PDF 导出书签为 XML 元素。\r\n\t\t/// </summary>\r\n\t\tpublic static XmlElement GetBookmark(PdfReader reader, UnitConverter unitConverter) {\r\n\t\t\tvar catalog = reader.Catalog;\r\n\t\t\tvar outlines = catalog.Locate<PdfDictionary>(PdfName.OUTLINES);\r\n\t\t\tif (outlines == null)\r\n\t\t\t\treturn null;\r\n\t\t\tif (unitConverter == null) {\r\n\t\t\t\tthrow new NullReferenceException(\"unitConverter\");\r\n\t\t\t}\r\n\t\t\tvar pages = reader.GetPageRefMapper();\r\n\t\t\tvar doc = new XmlDocument();\r\n\t\t\tdoc.AppendElement(Constants.DocumentBookmark);\r\n\t\t\tvar names = reader.GetNamedDestinations();\r\n\t\t\tusing (var w = doc.DocumentElement.CreateNavigator().AppendChild()) {\r\n\t\t\t\tvar a = new PdfActionExporter(unitConverter);\r\n\t\t\t\tBookmarkDepth(\r\n\t\t\t\t\treader,\r\n\t\t\t\t\tnames,\r\n\t\t\t\t\ta,\r\n\t\t\t\t\t(PdfDictionary)PdfReader.GetPdfObjectRelease(outlines.Get(PdfName.FIRST)),\r\n\t\t\t\t\tpages,\r\n\t\t\t\t\tw);\r\n\t\t\t}\r\n\t\t\treturn doc.DocumentElement;\r\n\t\t}\r\n\r\n\t\tstatic void BookmarkDepth(PdfReader reader, Dictionary<string, PdfObject> names, PdfActionExporter exporter, PdfDictionary outline, Dictionary<int, int> pageRefMap, XmlWriter target) {\r\n\t\t\twhile (outline != null) {\r\n\t\t\t\ttarget.WriteStartElement(Constants.Bookmark);\r\n\r\n\t\t\t\ttarget.WriteAttributeString(Constants.BookmarkAttributes.Title,\r\n\t\t\t\t\tStringHelper.ReplaceControlAndBomCharacters(outline.GetAsString(PdfName.TITLE).Decode(AppContext.Encodings.BookmarkEncoding))\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\tvar color = outline.Locate<PdfArray>(PdfName.C);\r\n\t\t\t\tDocInfoExporter.ExportColor(color, target);\r\n\r\n\t\t\t\tvar style = outline.Locate<PdfNumber>(PdfName.F);\r\n\t\t\t\tif (style != null) {\r\n\t\t\t\t\tint f = style.IntValue & 0x03;\r\n\t\t\t\t\tif (f > 0) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.BookmarkAttributes.Style, Constants.BookmarkAttributes.StyleType.Names[f]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (outline.Get(PdfName.COUNT) is PdfNumber count) {\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.BookmarkAttributes.Open, count.IntValue < 0 ? Constants.Boolean.False : Constants.Boolean.True);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar dest = outline.Locate<PdfObject>(PdfName.DEST);\r\n\t\t\t\tif (dest != null) {\r\n\t\t\t\t\texporter.ExportGotoAction(dest, names, target, pageRefMap);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\texporter.ExportAction(outline.Locate<PdfDictionary>(PdfName.A), names, pageRefMap, target);\r\n\t\t\t\t}\r\n\t\t\t\tvar first = outline.Locate<PdfDictionary>(PdfName.FIRST);\r\n\t\t\t\tif (first != null) {\r\n\t\t\t\t\tBookmarkDepth(reader, names, exporter, first, pageRefMap, target);\r\n\t\t\t\t}\r\n\t\t\t\toutline = outline.Locate<PdfDictionary>(PdfName.NEXT);\r\n\t\t\t\ttarget.WriteEndElement();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static Object[] CreateOutlines(PdfWriter writer, PdfIndirectReference parent, XmlElement kids, int maxPageNumber, bool namedAsNames) {\r\n\t\t\tvar bookmarks = kids.SelectNodes(Constants.Bookmark);\r\n\t\t\tvar refs = new PdfIndirectReference[bookmarks.Count];\r\n\t\t\tfor (int k = 0; k < refs.Length; ++k) {\r\n\t\t\t\trefs[k] = writer.PdfIndirectReference;\r\n\t\t\t}\r\n\r\n\t\t\tint ptr = 0;\r\n\t\t\tint count = 0;\r\n\t\t\tforeach (XmlElement child in bookmarks) {\r\n\t\t\t\tobject[] lower = null;\r\n\t\t\t\tif (child.SelectSingleNode(Constants.Bookmark) != null)\r\n\t\t\t\t\tlower = CreateOutlines(writer, refs[ptr], child, maxPageNumber, namedAsNames);\r\n\t\t\t\tvar outline = new PdfDictionary();\r\n\t\t\t\t++count;\r\n\t\t\t\tif (lower != null) {\r\n\t\t\t\t\toutline.Put(PdfName.FIRST, (PdfIndirectReference)lower[0]);\r\n\t\t\t\t\toutline.Put(PdfName.LAST, (PdfIndirectReference)lower[1]);\r\n\t\t\t\t\tint n = (int)lower[2];\r\n\t\t\t\t\t// 默认关闭书签\r\n\t\t\t\t\tif (child.GetAttribute(Constants.BookmarkAttributes.Open) != Constants.Boolean.True) {\r\n\t\t\t\t\t\toutline.Put(PdfName.COUNT, -n);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\toutline.Put(PdfName.COUNT, n);\r\n\t\t\t\t\t\tcount += n;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\toutline.Put(PdfName.PARENT, parent);\r\n\t\t\t\tif (ptr > 0)\r\n\t\t\t\t\toutline.Put(PdfName.PREV, refs[ptr - 1]);\r\n\t\t\t\tif (ptr < refs.Length - 1)\r\n\t\t\t\t\toutline.Put(PdfName.NEXT, refs[ptr + 1]);\r\n\t\t\t\toutline.Put(PdfName.TITLE, child.GetAttribute(Constants.BookmarkAttributes.Title));\r\n\t\t\t\tDocInfoImporter.ImportColor(child, outline);\r\n\t\t\t\tvar style = child.GetAttribute(Constants.BookmarkAttributes.Style);\r\n\t\t\t\tif (!String.IsNullOrEmpty(style)) {\r\n\t\t\t\t\tint bits = Array.IndexOf(Constants.BookmarkAttributes.StyleType.Names, style);\r\n\t\t\t\t\tif (bits == -1) {\r\n\t\t\t\t\t\tbits = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (bits != 0)\r\n\t\t\t\t\t\toutline.Put(PdfName.F, bits);\r\n\t\t\t\t}\r\n\t\t\t\tDocInfoImporter.ImportAction(writer, outline, child, maxPageNumber, namedAsNames);\r\n\t\t\t\twriter.AddToBody(outline, refs[ptr]);\r\n\t\t\t\t++ptr;\r\n\t\t\t}\r\n\t\t\treturn [refs[0], refs[refs.Length - 1], count];\r\n\t\t}\r\n\r\n\t\tinternal static PdfIndirectReference WriteOutline(PdfWriter writer, XmlElement bookmarks, int maxPageNumber) {\r\n\t\t\tif (bookmarks == null || bookmarks.SelectSingleNode(Constants.Bookmark) == null) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar top = new PdfDictionary();\r\n\t\t\tvar topRef = writer.PdfIndirectReference;\r\n\t\t\tvar kids = CreateOutlines(writer, topRef, bookmarks, maxPageNumber, false);\r\n\t\t\ttop.Put(PdfName.TYPE, PdfName.OUTLINES);\r\n\t\t\ttop.Put(PdfName.FIRST, (PdfIndirectReference)kids[0]);\r\n\t\t\ttop.Put(PdfName.LAST, (PdfIndirectReference)kids[1]);\r\n\t\t\ttop.Put(PdfName.COUNT, (int)kids[2]);\r\n\t\t\twriter.AddToBody(top, topRef);\r\n\t\t\twriter.ExtraCatalog.Put(PdfName.OUTLINES, topRef);\r\n\t\t\treturn topRef;\r\n\t\t}\r\n\r\n\t\tinternal static void KillOutline(PdfReader source) {\r\n\t\t\tvar catalog = source.Catalog;\r\n\t\t\tvar o = catalog.Get(PdfName.OUTLINES);\r\n\t\t\tif (o == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (o != null) {\r\n\t\t\t\tvar outlines = o as PRIndirectReference;\r\n\t\t\t\tOutlineTravel(outlines);\r\n\t\t\t\tPdfReader.KillIndirect(outlines);\r\n\t\t\t}\r\n\t\t\tcatalog.Remove(PdfName.OUTLINES);\r\n\t\t\tPdfReader.KillIndirect(catalog.Get(PdfName.OUTLINES));\r\n\t\t\tif (PdfName.USEOUTLINES.Equals(catalog.GetAsName(PdfName.PAGEMODE))) {\r\n\t\t\t\tcatalog.Remove(PdfName.PAGEMODE);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static void OutlineTravel(PRIndirectReference outline) {\r\n\t\t\twhile (outline != null) {\r\n\t\t\t\tvar outlineR = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline);\r\n\t\t\t\tPdfReader.KillIndirect(outline);\r\n\t\t\t\tif (outlineR != null) {\r\n\t\t\t\t\tvar first = (PRIndirectReference)outlineR.Get(PdfName.FIRST);\r\n\t\t\t\t\tif (first != null) {\r\n\t\t\t\t\t\tOutlineTravel(first);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tPdfReader.KillIndirect(outlineR.Get(PdfName.DEST));\r\n\t\t\t\t\tPdfReader.KillIndirect(outlineR.Get(PdfName.A));\r\n\t\t\t\t\toutline = (PRIndirectReference)outlineR.Get(PdfName.NEXT);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\toutline = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "App/Processor/PageProcessorContext.cs",
    "content": "﻿using System;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class PageProcessorContext\r\n\t{\r\n\t\t/// <summary>正在处理的 PDF 文档。</summary>\r\n\t\tpublic PdfReader Pdf { get; }\r\n\r\n\t\t/// <summary>正在处理的页码。</summary>\r\n\t\tpublic int PageNumber { get; }\r\n\r\n\t\t/// <summary>标记页面内容是否已被更改。</summary>\r\n\t\tpublic bool IsPageContentModified { get; set; }\r\n\r\n\t\tPdfDictionary _Page;\r\n\t\t/// <summary>获取正在处理的页面。</summary>\r\n\t\tpublic PdfDictionary Page => _Page ??= Pdf.GetPageN(PageNumber);\r\n\r\n\t\tPdfPageCommandProcessor _processor;\r\n\t\t/// <summary>获取正在处理的页面指令集合。</summary>\r\n\t\tpublic IPdfPageCommandContainer PageCommands {\r\n\t\t\tget {\r\n\t\t\t\tif (_processor == null) {\r\n\t\t\t\t\t_processor = new PdfPageCommandProcessor();\r\n\t\t\t\t\t_processor.ProcessContent(PdfReader.GetPageContent(Page), Page.Locate<PdfDictionary>(PdfName.RESOURCES));\r\n\t\t\t\t}\r\n\t\t\t\treturn _processor;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic PageProcessorContext(PdfReader pdf, int pageNumber) {\r\n\t\t\tPdf = pdf;\r\n\t\t\tPageNumber = pageNumber;\r\n\t\t}\r\n\r\n\t\t/// <summary>写入页面指令到当前处理的页面。</summary>\r\n\t\tinternal void WritePageCommands() {\r\n\t\t\t_processor.WritePdfCommands(Pdf, PageNumber);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfActionExporter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal sealed class PdfActionExporter\r\n\t{\r\n\t\treadonly Common.UnitConverter _unitConverter;\r\n\r\n\t\tpublic PdfActionExporter(Common.UnitConverter unitConverter) {\r\n\t\t\t_unitConverter = unitConverter;\r\n\t\t}\r\n\r\n\t\tinternal void ExportFileLocation(XmlWriter w, PdfObject file) {\r\n\t\t\tswitch (file.Type) {\r\n\t\t\t\tcase PdfObject.DICTIONARY:\r\n\t\t\t\t\tvar fs = file as PdfDictionary;\r\n\t\t\t\t\tif (fs.Contains(PdfName.UF)) {\r\n\t\t\t\t\t\tw.WriteAttributeString(Constants.DestinationAttributes.Path, PdfHelper.GetValidXmlString(fs.GetAsString(PdfName.UF).ToUnicodeString()));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (fs.Contains(PdfName.F)) {\r\n\t\t\t\t\t\tfile = fs.Get(PdfName.F);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.STRING:\r\n\t\t\t\t\tw.WriteAttributeString(Constants.DestinationAttributes.Path, PdfHelper.GetValidXmlString(((PdfString)file).Decode(System.Text.Encoding.Default)));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ExportAction(PdfDictionary action, Dictionary<string, PdfObject> names, Dictionary<int, int> pageRefMap, XmlWriter target) {\r\n\t\t\tPdfObject dest;\r\n\t\t\tif (action == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar actionType = PdfReader.GetPdfObjectRelease(action.Get(PdfName.S));\r\n\t\t\tif (PdfName.GOTO.Equals(actionType)) {\r\n\t\t\t\tdest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));\r\n\t\t\t\tif (dest != null) {\r\n\t\t\t\t\tExportGotoAction(dest, names, target, pageRefMap);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (PdfName.URI.Equals(actionType)) {\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Action, Constants.ActionType.Uri);\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Path, PdfHelper.GetValidXmlString(action.Locate<PdfString>(PdfName.URI).ToUnicodeString()));\r\n\t\t\t}\r\n\t\t\telse if (PdfName.GOTOR.Equals(actionType)) {\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Action, Constants.ActionType.GotoR);\r\n\t\t\t\tdest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));\r\n\t\t\t\tif (dest != null) {\r\n\t\t\t\t\tif (dest.IsString()) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Named, PdfHelper.GetValidXmlString(dest.ToString()));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (dest.IsName()) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.NamedN, PdfName.DecodeName(dest.ToString()));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (dest.IsArray()) {\r\n\t\t\t\t\t\tvar arr = (PdfArray)dest;\r\n\t\t\t\t\t\tif (arr.Size > 0 && arr[0].IsNumber()) {\r\n\t\t\t\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Page, PdfHelper.GetValidXmlString(((arr[0] as PdfNumber).IntValue + 1).ToText()));\r\n\t\t\t\t\t\t\tExportDestinationView(target, arr);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar file = action.Locate<PdfObject>(PdfName.F) ?? action.Locate<PdfObject>(PdfName.WIN);\r\n\t\t\t\tif (file != null) {\r\n\t\t\t\t\tExportFileLocation(target, file);\r\n\t\t\t\t}\r\n\t\t\t\tvar newWindow = action.Locate<PdfBoolean>(PdfName.NEWWINDOW);\r\n\t\t\t\tif (newWindow != null)\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.NewWindow, newWindow.BooleanValue ? Constants.Boolean.True : Constants.Boolean.False);\r\n\t\t\t}\r\n\t\t\telse if (PdfName.LAUNCH.Equals(actionType)) {\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Action, Constants.ActionType.Launch);\r\n\t\t\t\tvar file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F)) ?? PdfReader.GetPdfObjectRelease(action.Get(PdfName.WIN));\r\n\t\t\t\tif (file != null) {\r\n\t\t\t\t\tExportFileLocation(target, file);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (PdfName.JAVASCRIPT.Equals(actionType)) {\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Action, Constants.ActionType.Javascript);\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.ScriptContent, PdfReader.GetPdfObjectRelease(action.Get(PdfName.JS)).ToString());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ExportGotoAction(PdfObject dest, Dictionary<string, PdfObject> names, XmlWriter target, Dictionary<int, int> pages) {\r\n\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Action, Constants.ActionType.Goto);\r\n\t\t\tstring name;\r\n\t\t\tif (dest.Type == PdfObject.STRING) {\r\n\t\t\t\tname = StringHelper.ReplaceControlAndBomCharacters((dest as PdfString).ToUnicodeString());\r\n\t\t\t\tif (names.ContainsKey(name) == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Named, name);\r\n\t\t\t}\r\n\t\t\telse if (dest.Type == PdfObject.NAME) {\r\n\t\t\t\tname = PdfName.DecodeName(dest.ToString());\r\n\t\t\t\tif (names.ContainsKey(name) == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Named, name);\r\n\t\t\t}\r\n\t\t\telse if (dest.Type == PdfObject.ARRAY) {\r\n\t\t\t\tvar a = dest as PdfArray;\r\n\t\t\t\tif (a.Size > 0) {\r\n\t\t\t\t\tvar p = a[0];\r\n\t\t\t\t\tint pn = 0;\r\n\t\t\t\t\tif (p.Type == PdfObject.INDIRECT && pages.TryGetValue(GetNumber((PdfIndirectReference)a[0]), out pn)) {\r\n\t\t\t\t\t\t// use pn\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (p.Type == PdfObject.NUMBER) {\r\n\t\t\t\t\t\tpn = (p as PdfNumber).IntValue + 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (pn > 0) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.Page, pn.ToText());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tExportDestinationView(target, a);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void ExportDestinationView(XmlWriter target, PdfArray dest) {\r\n\t\t\tif (dest.Size < 2) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (dest[1] is not PdfName pn) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar m = PdfHelper.GetPdfFriendlyName(pn);\r\n\t\t\ttarget.WriteAttributeString(Constants.DestinationAttributes.View, m);\r\n\t\t\tvar p = new string[dest.Size - 2];\r\n\t\t\tPdfObject o;\r\n\t\t\tfor (int i = 0; i < p.Length; i++) {\r\n\t\t\t\to = dest[i + 2];\r\n\t\t\t\tif (o == null) {\r\n\t\t\t\t\tp[i] = String.Empty;\r\n\t\t\t\t}\r\n\t\t\t\tp[i] = (o.Type == PdfObject.NUMBER) ? (m == Constants.DestinationAttributes.ViewType.XYZ && i == 2\r\n\t\t\t\t\t\t\t? ((PdfNumber)o).FloatValue\r\n\t\t\t\t\t\t\t: _unitConverter.FromPoint(((PdfNumber)o).FloatValue)).ToText(\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t: (o.Type == PdfObject.NULL) ? Constants.Coordinates.Unchanged\r\n\t\t\t\t\t: o.ToString();\r\n\t\t\t}\r\n\t\t\tswitch (m) {\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.XYZ:\r\n\t\t\t\t\tif (p.Length < 1) {\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Left, p[0]);\r\n\t\t\t\t\tif (p.Length > 1) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Top, p[1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (p.Length > 2) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.ScaleFactor, p[2]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.Fit:\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitB:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitBH:\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitH:\r\n\t\t\t\t\tif (p.Length < 1) {\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Top, p[0]);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitV:\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitBV:\r\n\t\t\t\t\tif (p.Length < 1) {\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Left, p[0]);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase Constants.DestinationAttributes.ViewType.FitR:\r\n\t\t\t\t\tif (p.Length < 1) {\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Left, p[0]);\r\n\t\t\t\t\tif (p.Length > 1) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Bottom, p[1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (p.Length > 2) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Right, p[2]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (p.Length > 3) {\r\n\t\t\t\t\t\ttarget.WriteAttributeString(Constants.Coordinates.Top, p[3]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tSystem.Diagnostics.Trace.WriteLine(\"目标位置无效\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate static int GetNumber(PdfIndirectReference indirect) {\r\n\t\t\tif (PdfReader.GetPdfObjectRelease(indirect) is not PdfDictionary pdfObj) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif (pdfObj.Contains(PdfName.TYPE)\r\n\t\t\t\t&& PdfName.PAGES.Equals(pdfObj.GetAsName(PdfName.TYPE))\r\n\t\t\t\t&& pdfObj.Contains(PdfName.KIDS)) {\r\n\t\t\t\tvar kids = (PdfArray)pdfObj.Get(PdfName.KIDS);\r\n\t\t\t\tindirect = (PdfIndirectReference)kids[0];\r\n\t\t\t}\r\n\t\t\treturn indirect.Number;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfContentExport.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing Matrix = iTextSharp.text.pdf.parser.Matrix;\r\nusing NameValuePair = System.Collections.Generic.KeyValuePair<string, string>;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class PdfContentExport\r\n\t{\r\n\t\treadonly ExporterOptions _options;\r\n\t\treadonly Dictionary<string, string> _resolvedReferences = new Dictionary<string, string>();\r\n\t\treadonly Stack<string> _tags = new Stack<string>();\r\n\t\treadonly Stack<PdfDictionary> _dictionaries = new Stack<PdfDictionary>();\r\n\t\tbool _streamFolderExists;\r\n\t\tImageExtractor _imageExporter;\r\n\t\tFilePath _exportStreamPath;\r\n\r\n\t\tpublic PdfContentExport(ExporterOptions options) {\r\n\t\t\t_options = options;\r\n\t\t}\r\n\r\n\t\tpublic FilePath BinaryStreamPath {\r\n\t\t\tget => _exportStreamPath;\r\n\t\t\tset {\r\n\t\t\t\t_exportStreamPath = value;\r\n\t\t\t\t_streamFolderExists = value.ExistsDirectory;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbool AddReferenceRecord(PdfIndirectReference r, string type) {\r\n\t\t\tvar k = String.Concat(r.Number, ' ', r.Generation);\r\n\t\t\tif (_resolvedReferences.ContainsKey(k)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t_resolvedReferences.Add(k, type);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tinternal void ExportTrailer(XmlWriter writer, PdfReader reader) {\r\n\t\t\tTracker.TraceMessage(\"导出文档总索引。\");\r\n\t\t\twriter.WriteStartElement(\"Trailer\");\r\n\t\t\twriter.WriteAttributeString(Constants.ContentPrefix, \"http://www.w3.org/2000/xmlns/\", Constants.ContentNamespace);\r\n\t\t\tforeach (var item in reader.Trailer) {\r\n\t\t\t\tif (PdfName.ROOT.Equals(item.Key) == false) {\r\n\t\t\t\t\tExportPdfDictionaryItem(item, writer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tExportCatalog(writer, reader);\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tvoid ExportCatalog(XmlWriter writer, PdfReader reader) {\r\n\t\t\tTracker.TraceMessage(\"导出文档编录。\");\r\n\t\t\twriter.WriteStartElement(Constants.Catalog);\r\n\t\t\twriter.WriteAttributeString(Constants.ContentPrefix, \"http://www.w3.org/2000/xmlns/\", Constants.ContentNamespace);\r\n\t\t\tforeach (var item in reader.Catalog) {\r\n\t\t\t\tif (PdfName.OUTLINES.Equals(item.Key)) {\r\n\t\t\t\t\tif (PdfReader.GetPdfObjectRelease(item.Value) is PdfDictionary o) {\r\n\t\t\t\t\t\tExportPdfOutline(o, writer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tExportPdfDictionaryItem(item, writer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tinternal void ExportContents(XmlWriter writer, PdfReader reader) {\r\n\t\t\tif (_options.ExtractImages) {\r\n\t\t\t\t_imageExporter = new ImageExtractor(_options.Images);\r\n\t\t\t}\r\n\t\t\twriter.WriteStartElement(Constants.Body);\r\n\t\t\twriter.WriteAttributeString(Constants.ContentPrefix, \"http://www.w3.org/2000/xmlns/\", Constants.ContentNamespace);\r\n\t\t\tExportPages(reader, PageRangeCollection.Parse(_options.ExtractPageRange, 1, reader.NumberOfPages, true), writer);\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tvoid ExportPages(PdfReader reader, PageRangeCollection ranges, XmlWriter writer) {\r\n\t\t\tvar p = new ExportProcessor(this, writer, _options);\r\n\t\t\tforeach (PageRange r in ranges) {\r\n\t\t\t\tforeach (var i in r) {\r\n\t\t\t\t\tTracker.TraceMessage(String.Concat(\"导出第 \", i, \" 页。\"));\r\n\t\t\t\t\tExportPage(i, reader, writer, p);\r\n\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportPdfOutline(PdfDictionary outline, XmlWriter writer) {\r\n\t\t\twhile (outline != null) {\r\n\t\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"Outline\", Constants.ContentNamespace);\r\n\t\t\t\tforeach (var i in outline) {\r\n\t\t\t\t\tswitch (i.Key.ToString()) {\r\n\t\t\t\t\t\tcase \"/First\":\r\n\t\t\t\t\t\tcase \"/Last\":\r\n\t\t\t\t\t\tcase \"/Next\":\r\n\t\t\t\t\t\tcase \"/Parent\":\r\n\t\t\t\t\t\tcase \"/Prev\":\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tExportPdfDictionaryItem(i, writer);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (PdfReader.GetPdfObjectRelease(outline.Get(PdfName.FIRST)) is PdfDictionary f) {\r\n\t\t\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"Outlines\", Constants.ContentNamespace);\r\n\t\t\t\t\tExportPdfOutline(f, writer);\r\n\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\toutline = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.NEXT)) as PdfDictionary;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 导出 PDFDictionary。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"writer\"></param>\r\n\t\t/// <param name=\"dict\"></param>\r\n\t\tvoid ExportPdfDictionary(XmlWriter writer, PdfDictionary dict) {\r\n\t\t\t_dictionaries.Push(dict);\r\n\t\t\tforeach (var item in dict) {\r\n\t\t\t\tExportPdfDictionaryItem(item, writer);\r\n\t\t\t}\r\n\t\t\t_dictionaries.Pop();\r\n\t\t}\r\n\r\n\t\tvoid ExportPdfDictionaryItem(KeyValuePair<PdfName, PdfObject> item, XmlWriter writer) {\r\n\t\t\tvar key = PdfHelper.DecodeKeyName(item.Key);\r\n\t\t\tvar value = item.Value;\r\n\t\t\ttry {\r\n\t\t\t\twriter.WriteStartElement(XmlConvert.VerifyNCName(key));\r\n\t\t\t}\r\n\t\t\tcatch (XmlException) {\r\n\t\t\t\twriter.WriteStartElement(Constants.Content.Item, Constants.ContentNamespace);\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.Name, Constants.ContentNamespace, key);\r\n\t\t\t}\r\n\t\t\t_tags.Push(key);\r\n\t\t\tif (value == null) {\r\n\t\t\t\twriter.WriteAttributeString(PdfHelper.GetTypeName(value.Type), \"null\");\r\n\t\t\t\tgoto EndElement;\r\n\t\t\t}\r\n\t\t\tswitch (value.Type) {\r\n\t\t\t\tcase PdfObject.ARRAY:\r\n\t\t\t\t\tvar a = value as PdfArray;\r\n\t\t\t\t\tif (key == \"ColorSpace\" && PdfName.INDEXED.Equals(a.GetAsName(0)) && a.ArrayList.Count == 4) {\r\n\t\t\t\t\t\tExportColorSpaceContent(writer, a);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tExportArray(a.ArrayList, writer);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.STRING:\r\n\t\t\t\t\tvar text = (value as PdfString).ToUnicodeString();\r\n\t\t\t\t\tif (text.StartsWith(\"<?xml\")) {\r\n\t\t\t\t\t\twriter.WriteStartElement(Constants.ContentPrefix, Constants.Content.Value, Constants.ContentNamespace);\r\n\t\t\t\t\t\twriter.WriteCData(text);\r\n\t\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\twriter.WriteAttributeString(PdfHelper.GetTypeName(value.Type), PdfHelper.GetValidXmlString(text));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.INDIRECT:\r\n\t\t\t\t\twriter.WriteAttributeString(Constants.Content.Type, Constants.ContentNamespace, PdfHelper.GetTypeName(PdfObject.INDIRECT));\r\n\t\t\t\t\tExportIndirectReference(value as PdfIndirectReference, writer, key);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.DICTIONARY:\r\n\t\t\t\t\tExportPdfDictionary(writer, value as PdfDictionary);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\twriter.WriteAttributeString(PdfHelper.GetTypeName(value.Type), value.ToString());\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\tEndElement:\r\n\t\t\twriter.WriteEndElement();\r\n\t\t\t_tags.Pop();\r\n\t\t}\r\n\r\n\t\tvoid ExportColorSpaceContent(XmlWriter writer, PdfArray a) {\r\n\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"colorSpace\", Constants.ContentNamespace);\r\n\t\t\twriter.WriteAttributeString(\"type\", a[0].ToString());\r\n\t\t\tvar b = a.GetAsName(1);\r\n\t\t\tif (b != null) {\r\n\t\t\t\twriter.WriteAttributeString(\"base\", a.GetAsName(1).ToString());\r\n\t\t\t}\r\n\t\t\twriter.WriteAttributeString(\"hival\", a.GetAsNumber(2).ToString());\r\n\t\t\twriter.WriteStartAttribute(\"lookup\");\r\n\t\t\tvar cs = a.GetDirectObject(3);\r\n\t\t\tbyte[] l = null;\r\n\t\t\tif (cs.IsString()) {\r\n\t\t\t\tl = (cs as PdfString).GetOriginalBytes();\r\n\t\t\t}\r\n\t\t\telse if (cs.IsStream()) {\r\n\t\t\t\tl = PdfReader.GetStreamBytes(cs as PRStream);\r\n\t\t\t}\r\n\t\t\tif (l != null) {\r\n\t\t\t\tint g;\r\n\t\t\t\tif (b == null) {\r\n\t\t\t\t\tg = l.Length;\r\n\t\t\t\t}\r\n\t\t\t\telse if (b.Equals(PdfName.DEVICERGB)) {\r\n\t\t\t\t\tg = 3;\r\n\t\t\t\t}\r\n\t\t\t\telse if (b.Equals(PdfName.DEVICECMYK)) {\r\n\t\t\t\t\tg = 4;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tg = l.Length;\r\n\t\t\t\t}\r\n\t\t\t\tfor (int i = 0; i < l.Length; i += g) {\r\n\t\t\t\t\twriter.WriteBinHex(l, i, g);\r\n\t\t\t\t\twriter.WriteString(\" \");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twriter.WriteEndAttribute();\r\n\t\t\tif (a[1].IsArray()) {\r\n\t\t\t\tExportArray(a.GetAsArray(1).ArrayList, writer);\r\n\t\t\t}\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tvoid ExportArray(List<PdfObject> array, XmlWriter writer) {\r\n\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"array\", Constants.ContentNamespace);\r\n\t\t\tExportArrayContent(array, writer, false);\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tvoid ExportArrayContent(List<PdfObject> array, XmlWriter writer, bool writeStringBytes) {\r\n\t\t\tint iType = PdfObject.NULL;\r\n\t\t\tforeach (PdfObject i in array) {\r\n\t\t\t\tif (iType == PdfObject.NULL) {\r\n\t\t\t\t\tiType = i.Type;\r\n\t\t\t\t}\r\n\t\t\t\telse if (iType != i.Type) {\r\n\t\t\t\t\tiType = PdfObject.NULL;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (ValueHelper.IsInCollection(iType, PdfObject.NAME, PdfObject.NUMBER, PdfObject.BOOLEAN)) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.Type, PdfHelper.GetTypeName(iType));\r\n\t\t\t\twriter.WriteStartAttribute(Constants.Content.Value);\r\n\t\t\t\tvar l = array;\r\n\t\t\t\tfor (int i = 0; i < l.Count; i++) {\r\n\t\t\t\t\tif (i > 0) {\r\n\t\t\t\t\t\twriter.WriteString(\" \");\r\n\t\t\t\t\t}\r\n\t\t\t\t\twriter.WriteString(l[i].ToString());\r\n\t\t\t\t}\r\n\t\t\t\twriter.WriteEndAttribute();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tforeach (PdfObject i in array) {\r\n\t\t\t\t\tif (i is not PdfArray subArray) {\r\n\t\t\t\t\t\tif (PdfHelper.GetTypeName(i.Type).Length > 0) {\r\n\t\t\t\t\t\t\twriter.WriteStartElement(Constants.ContentPrefix, PdfHelper.GetTypeName(i.Type), Constants.ContentNamespace);\r\n\t\t\t\t\t\t}\r\n#if DEBUG\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\twriter.WriteElementString(\"literal\", i.ToString());\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t\t\tswitch (i.Type) {\r\n\t\t\t\t\t\t\tcase PdfObject.INDIRECT:\r\n\t\t\t\t\t\t\t\tExportIndirectReference(i as PdfIndirectReference, writer, String.Empty);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase PdfObject.DICTIONARY:\r\n\t\t\t\t\t\t\t\tExportPdfDictionary(writer, i as PdfDictionary);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase PdfObject.STRING:\r\n\t\t\t\t\t\t\t\tif (writeStringBytes) {\r\n\t\t\t\t\t\t\t\t\tvar bytes = (i as PdfString).GetBytes();\r\n\t\t\t\t\t\t\t\t\tvar bl = bytes.Length;\r\n\t\t\t\t\t\t\t\t\tif (bl > 0) {\r\n\t\t\t\t\t\t\t\t\t\tint l = 2 * bl + ((bl + 1) >> 1) - 1;\r\n\t\t\t\t\t\t\t\t\t\tvar chArray = new char[l];\r\n\t\t\t\t\t\t\t\t\t\tint num = 0, bi = 0;\r\n\t\t\t\t\t\t\t\t\t\tforeach (byte b in bytes) {\r\n\t\t\t\t\t\t\t\t\t\t\tif ((bi % 2) == 0 && bi > 0) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tchArray[num++] = ' ';\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tchArray[num++] = \"0123456789ABCDEF\"[b >> 4];\r\n\t\t\t\t\t\t\t\t\t\t\tchArray[num++] = \"0123456789ABCDEF\"[b & 15];\r\n\t\t\t\t\t\t\t\t\t\t\tbi++;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\twriter.WriteAttributeString(Constants.Content.Type, \"字节\");\r\n\t\t\t\t\t\t\t\t\t\twriter.WriteAttributeString(Constants.Content.Value, new string(chArray));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\twriter.WriteAttributeString(Constants.Content.Value, PdfHelper.GetValidXmlString(i.ToString()));\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"array\", Constants.ContentNamespace);\r\n\t\t\t\t\t\tExportArrayContent(subArray.ArrayList, writer, writeStringBytes);\r\n\t\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportIndirectReference(PdfIndirectReference r, XmlWriter writer, string key) {\r\n\t\t\tvar obj = PdfReader.GetPdfObjectRelease(r);\r\n\t\t\twriter.WriteAttributeString(Constants.Content.ResourceID, Constants.ContentNamespace, r.ToString());\r\n\t\t\tif (AddReferenceRecord(r, key) == false || obj == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (obj.Type) {\r\n\t\t\t\tcase PdfObject.DICTIONARY:\r\n\t\t\t\t\tvar type = (obj as PdfDictionary).GetAsName(PdfName.TYPE);\r\n\t\t\t\t\tif (type != null) {\r\n\t\t\t\t\t\tvar n = PdfHelper.GetPdfNameString(type);\r\n\t\t\t\t\t\twriter.WriteAttributeString(Constants.Content.RefType, Constants.ContentNamespace, n);\r\n\t\t\t\t\t\tswitch (n) {\r\n\t\t\t\t\t\t\tcase \"Page\":\r\n\t\t\t\t\t\t\tcase \"Pages\":\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tif (key == \"Parent\") {\r\n\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tExportPdfDictionary(writer, obj as PdfDictionary);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.ARRAY:\r\n\t\t\t\t\tExportArray((obj as PdfArray).ArrayList, writer);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PdfObject.STREAM:\r\n\t\t\t\t\tvar s = obj as PdfStream;\r\n\t\t\t\t\tExportPdfDictionary(writer, s);\r\n\t\t\t\t\tif (_imageExporter != null && PdfName.IMAGE.Equals(s.GetAsName(PdfName.SUBTYPE))) {\r\n\t\t\t\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"image\", Constants.ContentNamespace);\r\n\t\t\t\t\t\tvar info = _imageExporter.InfoList.Find(ii => ii.InlineImage.PdfRef == r);\r\n\t\t\t\t\t\tif (info != null) {\r\n\t\t\t\t\t\t\twriter.WriteAttributeString(Constants.Content.Path, Path.GetFileName(info.FileName));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tExportStreamContent(writer, s, r);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\twriter.WriteAttributeString(PdfHelper.GetTypeName(obj.Type), Constants.ContentNamespace, obj.ToString());\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportStreamContent(XmlWriter writer, PdfStream s, PdfIndirectReference pdfIndirect) {\r\n\t\t\tif (s is not PRStream prs || writer is NullXmlWriter || _exportStreamPath.IsEmpty) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar key = _tags.Peek();\r\n\t\t\tvar dict = _dictionaries.Peek();\r\n\t\t\twriter.WriteStartElement(Constants.ContentPrefix, \"stream\", Constants.ContentNamespace);\r\n\t\t\tbyte[] bs;\r\n\t\t\tbool isRaw = false;\r\n\t\t\tvar isForm = PdfName.XOBJECT.Equals(s.GetAsName(PdfName.TYPE)) && PdfName.FORM.Equals(s.GetAsName(PdfName.SUBTYPE));\r\n\t\t\ttry {\r\n\t\t\t\tbs = PdfReader.GetStreamBytes(prs);\r\n\t\t\t}\r\n\t\t\tcatch (IOException) {\r\n\t\t\t\tbs = PdfReader.GetStreamBytesRaw(prs);\r\n\t\t\t\tisRaw = true;\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.Raw, Constants.Boolean.True);\r\n\t\t\t}\r\n\r\n\t\t\tif (pdfIndirect != null) {\r\n\t\t\t\twriter.WriteAttributeString(Constants.Content.Length, bs.Length.ToText());\r\n\t\t\t\tif (bs.Length != 0) {\r\n\t\t\t\t\tif (_streamFolderExists == false) {\r\n\t\t\t\t\t\t_exportStreamPath.CreateDirectory();\r\n\t\t\t\t\t\t_streamFolderExists = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstring extName;\r\n\t\t\t\t\tswitch (key) {\r\n\t\t\t\t\t\tcase \"ToUnicode\":\r\n\t\t\t\t\t\tcase \"Contents\":\r\n\t\t\t\t\t\t\textName = Constants.FileExtensions.Txt;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"Metadata\":\r\n\t\t\t\t\t\t\textName = Constants.FileExtensions.Xml;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"FontFile2\":\r\n\t\t\t\t\t\t\textName = Constants.FileExtensions.Ttf;\r\n\t\t\t\t\t\t\tvar ff = dict.GetAsString(PdfName.FONTFAMILY);\r\n\t\t\t\t\t\t\tif (ff != null) {\r\n\t\t\t\t\t\t\t\tkey += \".\" + ff;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tvar fn = dict.GetAsName(PdfName.FONTNAME);\r\n\t\t\t\t\t\t\t\tif (fn != null) {\r\n\t\t\t\t\t\t\t\t\tkey += \".\" + fn.ToString().Substring(1);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\textName = isForm ? Constants.FileExtensions.Txt : Constants.FileExtensions.Dat;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar fileName = _exportStreamPath.Combine(key + \".\" + pdfIndirect.Number + (pdfIndirect.Generation != 0 ? (\"[\" + pdfIndirect.ToString() + \"]\") : null) + extName);\r\n\t\t\t\t\tusing (FileStream f = new FileStream(fileName, FileMode.Create)) {\r\n\t\t\t\t\t\tf.Write(bs, 0, bs.Length);\r\n\t\t\t\t\t}\r\n\t\t\t\t\twriter.WriteAttributeString(\"file\", fileName.FileName);\r\n\t\t\t\t\tif (isRaw) {\r\n\t\t\t\t\t\twriter.WriteAttributeString(\"isRaw\", \"True\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isRaw == false) {\r\n\t\t\t\tif (key == \"Contents\" || key == \"ToUnicode\" || isForm) {\r\n\t\t\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\t\t\tbyte b;\r\n\t\t\t\t\tint l = bs.Length;\r\n\t\t\t\t\tint p1 = 0, p2 = 0;\r\n\t\t\t\t\tfor (int i = 0; i < l; i++) {\r\n\t\t\t\t\t\tb = bs[i];\r\n\t\t\t\t\t\tif (b == 0x0A || b == 0x0D || i + 1 == l) {\r\n\t\t\t\t\t\t\tp2 = i;\r\n\t\t\t\t\t\t\tif (i > 2 && bs[i - 2] == 'T' && (bs[i - 1] == 'J' || bs[i - 1] == 'j')) {\r\n\t\t\t\t\t\t\t\t// is a text operation\r\n\t\t\t\t\t\t\t\tExportStreamTextContent(bs, sb, p1, p2);\r\n\t\t\t\t\t\t\t\tsb.AppendLine();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tsb.Append(Encoding.ASCII.GetString(bs, p1, p2 - p1));\r\n\t\t\t\t\t\t\t\tsb.AppendLine();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (b == 0x0D && i + 1 < l && bs[i + 1] == 0x0A) {\r\n\t\t\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tp1 = i + 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (sb.Length == 0) {\r\n\t\t\t\t\t\tif (l > 2 && bs[l - 2] == 'T' && (bs[l - 1] == 'J' || bs[l - 1] == 'j')) {\r\n\t\t\t\t\t\t\tExportStreamTextContent(bs, sb, 0, l);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsb.Append(Encoding.Default.GetString(bs, p1, p2));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\twriter.WriteCData(StringBuilderCache.GetStringAndRelease(sb));\r\n\t\t\t\t}\r\n\t\t\t\telse if (key == \"Metadata\") {\r\n\t\t\t\t\tusing (var ms = new MemoryStream(bs))\r\n\t\t\t\t\tusing (var sr = new StreamReader(ms, true)) {\r\n\t\t\t\t\t\t// strip byte-order-marks\r\n\t\t\t\t\t\twriter.WriteCData(sr.ReadToEnd().Replace(\"\\uFFFE\", \"&#xFFFE;\").Replace(\"\\uFEFF\", \"&#xFEFF;\"));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twriter.WriteEndElement();\r\n\t\t}\r\n\r\n\t\tstatic void ExportStreamTextContent(byte[] bs, StringBuilder sb, int p1, int p2) {\r\n\t\t\tbool inText = false;\r\n\t\t\tbool escape = false;\r\n\t\t\tchar ch;\r\n\t\t\tint beginTextPosition = 0;\r\n\t\t\tfor (int c = p1; c < p2; c++) {\r\n\t\t\t\tch = (char)bs[c];\r\n\t\t\t\tswitch (ch) {\r\n\t\t\t\t\tcase '\\\\':\r\n\t\t\t\t\t\tif (escape) {\r\n\t\t\t\t\t\t\tescape = false;\r\n\t\t\t\t\t\t\tsb.Append(ch);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tescape = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tcase '(':\r\n\t\t\t\t\t\tif (escape) {\r\n\t\t\t\t\t\t\tsb.Append(ch);\r\n\t\t\t\t\t\t\tescape = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tinText = true;\r\n\t\t\t\t\t\t\tbeginTextPosition = c;\r\n\t\t\t\t\t\t\tsb.Append(ch);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tcase ')':\r\n\t\t\t\t\t\tif (escape) {\r\n\t\t\t\t\t\t\tescape = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tinText = false;\r\n\t\t\t\t\t\t\t//sb.Append (Encoding.BigEndianUnicode.GetString (buffer, beginTextPosition + 1, c - 1 - beginTextPosition));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsb.Append(ch);\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif (escape) {\r\n\t\t\t\t\t\t\tescape = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (inText == false) {\r\n\t\t\t\t\t\t\tsb.Append(ch);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsb.Append(((byte)ch).ToString(\"X2\"));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ExportPage(PdfReader reader, XmlWriter writer, params int[] pageNumbers) {\r\n\t\t\tvar p = new ExportProcessor(this, writer, _options);\r\n\t\t\tforeach (var pageNum in pageNumbers) {\r\n\t\t\t\tExportPage(pageNum, reader, writer, p);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid ExportPage(int pageNum, PdfReader reader, XmlWriter writer, ExportProcessor exportProcessor) {\r\n\t\t\twriter.WriteStartElement(Constants.Content.Page);\r\n\t\t\t_tags.Push(Constants.Content.Page);\r\n\t\t\twriter.WriteAttributeString(Constants.Content.PageNumber, pageNum.ToText());\r\n\t\t\twriter.WriteAttributeString(Constants.Content.ResourceID, reader.GetPageOrigRef(pageNum).ToString());\r\n\t\t\t_imageExporter?.ExtractPageImages(reader, pageNum);\r\n\r\n\t\t\tif (_options.ExtractPageDictionary) {\r\n\t\t\t\tExportPdfDictionary(writer, reader.GetPageNRelease(pageNum));\r\n\t\t\t}\r\n\t\t\tif (_options.ExportContentOperators || _options.ExportDecodedText) {\r\n\t\t\t\tif (_options.ExportContentOperators) {\r\n\t\t\t\t\twriter.WriteStartElement(Constants.Content.Operators);\r\n\t\t\t\t}\r\n\t\t\t\texportProcessor.Reset();\r\n\t\t\t\texportProcessor.ProcessContent(reader.GetPageContent(pageNum), reader.GetPageNRelease(pageNum).GetAsDict(PdfName.RESOURCES));\r\n\t\t\t\tif (_options.ExportContentOperators) {\r\n\t\t\t\t\texportProcessor.End();\r\n\t\t\t\t\twriter.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//if (_imageExporter != null && _imageExporter.InfoList.Count > 0) {\r\n\t\t\t//    writer.WriteStartElement (\"images\", Constants.ContentNamespace);\r\n\t\t\t//    foreach (var item in _imageExporter.InfoList) {\r\n\t\t\t//        writer.WriteStartElement (\"image\", Constants.ContentNamespace);\r\n\t\t\t//        writer.WriteAttributeString (Constants.Content.ResourceID, Constants.ContentNamespace, item.PdfRef.ToString ());\r\n\t\t\t//        writer.WriteAttributeString (\"位置\", String.Concat (item.X, \", \", item.Y, \", \", item.Z));\r\n\t\t\t//        writer.WriteEndElement ();\r\n\t\t\t//    }\r\n\t\t\t//    writer.WriteEndElement ();\r\n\t\t\t//}\r\n\t\t\twriter.WriteEndElement();\r\n\t\t\t_tags.Pop();\r\n\t\t}\r\n\r\n\t\tsealed class ExportProcessor : PdfContentStreamProcessor\r\n\t\t{\r\n\t\t\treadonly PdfContentExport _export;\r\n\t\t\treadonly XmlWriter _writer;\r\n\t\t\treadonly bool _writeOperators;\r\n\t\t\treadonly List<TextInfo> _textContainer;\r\n\t\t\treadonly List<NameValuePair> _operands = new List<NameValuePair>();\r\n\t\t\tint _writerLevel;\r\n\t\t\tfloat _textWidth;\r\n\r\n\r\n\t\t\tpublic ExportProcessor(PdfContentExport export, XmlWriter writer, ExporterOptions options) {\r\n\t\t\t\t_export = export;\r\n\t\t\t\t_writer = writer;\r\n\t\t\t\t_writeOperators = options.ExportContentOperators;\r\n\t\t\t\t_textContainer = options.ExportDecodedText ? new List<TextInfo>() : null;\r\n\t\t\t\tPopulateOperators();\r\n\t\t\t\tRegisterContentOperator(\"TJ\", new AccumulatedShowTextArray());\r\n\t\t\t}\r\n\r\n\t\t\tpublic void End() {\r\n\t\t\t\tif (_writeOperators == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\twhile (_writerLevel > 0) {\r\n\t\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t\t\t_writerLevel--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tinternal List<TextInfo> TextInfoList => _textContainer;\r\n\t\t\tprotected override void DisplayPdfString(PdfString str) {\r\n\t\t\t\tvar gs = CurrentGraphicState;\r\n\t\t\t\tvar font = gs.Font;\r\n\t\t\t\tfloat totalWidth = 0;\r\n\t\t\t\tforeach (var c in font.DecodeText(str)) {\r\n\t\t\t\t\tfloat w = font.GetWidth(c) / 1000.0f;\r\n\t\t\t\t\tfloat wordSpacing = c == ' ' ? gs.WordSpacing : 0f;\r\n\t\t\t\t\ttotalWidth += (w * gs.FontSize + gs.CharacterSpacing + wordSpacing) * gs.HorizontalScaling;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_textWidth = totalWidth;\r\n\t\t\t}\r\n\r\n\t\t\tprotected override void InvokeOperator(PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tbase.InvokeOperator(oper, operands);\r\n\t\t\t\tstring o, fn, t = null;\r\n\t\t\t\tbool open = false;\r\n\t\t\t\tbool hasDescriptiveOperands = false;\r\n\t\t\t\to = oper.ToString();\r\n\t\t\t\tPdfPageCommand.GetFriendlyCommandName(o, out fn);\r\n\t\t\t\t_operands.Clear();\r\n\t\t\t\tswitch (o) {\r\n\t\t\t\t\tcase \"BDC\":\r\n\t\t\t\t\tcase \"BMC\":\r\n\t\t\t\t\tcase \"BT\":\r\n\t\t\t\t\tcase \"BX\":\r\n\t\t\t\t\tcase \"q\":\r\n\t\t\t\t\t\topen = true;\r\n\t\t\t\t\t\t_writerLevel++;\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase \"EMC\":\r\n\t\t\t\t\tcase \"ET\":\r\n\t\t\t\t\tcase \"EX\":\r\n\t\t\t\t\tcase \"Q\":\r\n\t\t\t\t\t\tif (_writerLevel > 0 && _writeOperators) {\r\n\t\t\t\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t\t\t\t\t_writerLevel--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tcase \"TJ\":\r\n\t\t\t\t\t\tvar array = (PdfArray)operands[0];\r\n\t\t\t\t\t\tusing (var ms = new MemoryStream(array.Length)) {\r\n\t\t\t\t\t\t\tforeach (PdfObject item in array.ArrayList) {\r\n\t\t\t\t\t\t\t\tif (item.Type == PdfObject.STRING) {\r\n\t\t\t\t\t\t\t\t\tms.Write((item as PdfString).GetBytes(), 0, item.Length);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tt = CurrentGraphicState.Font.DecodeText(new PdfString(ms.ToArray()));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tAddTextInfo(t);\r\n\t\t\t\t\t\t_operands.Add(new NameValuePair(Constants.Content.OperandNames.Text, t));\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase \"Tj\":\r\n\t\t\t\t\tcase \"'\":\r\n\t\t\t\t\tcase \"\\\"\":\r\n\t\t\t\t\t\tt = CurrentGraphicState.Font.DecodeText(operands[0] as PdfString);\r\n\t\t\t\t\t\tAddTextInfo(t);\r\n\t\t\t\t\t\t_operands.Add(new NameValuePair(Constants.Content.OperandNames.Text, t));\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase \"Tf\":\r\n\t\t\t\t\t\t_operands.Add(new NameValuePair(Constants.Font.ThisName, CurrentGraphicState.Font.FontName));\r\n\t\t\t\t\t\t_operands.Add(new NameValuePair(Constants.Content.OperandNames.ResourceName, operands[0].ToString()));\r\n\t\t\t\t\t\t_operands.Add(new NameValuePair(Constants.Content.OperandNames.Size, operands[1].ToString()));\r\n\t\t\t\t\t\thasDescriptiveOperands = true;\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase \"cm\":\r\n\t\t\t\t\tcase \"Tm\":\r\n\t\t\t\t\t\t_operands.Add(new NameValuePair(Constants.Content.Operands, GetOperandsTextValue(operands)));\r\n\t\t\t\t\t\thasDescriptiveOperands = true;\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tcase \"BI\":\r\n\t\t\t\t\t\t//case \"EI\":\r\n\t\t\t\t\t\tgoto default;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif (_writeOperators == false) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_writer.WriteStartElement(fn ?? \"未知操作符\");\r\n\t\t\t\t\t\t_writer.WriteAttributeString(\"name\", o);\r\n\t\t\t\t\t\tforeach (var item in _operands) {\r\n\t\t\t\t\t\t\t_writer.WriteAttributeString(item.Key, PdfHelper.GetValidXmlString(item.Value));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (hasDescriptiveOperands == false) {\r\n\t\t\t\t\tif (operands.Count > 0) {\r\n\t\t\t\t\t\t// 删除操作符\r\n\t\t\t\t\t\toperands.RemoveAt(operands.Count - 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (operands.Count > 0) {\r\n\t\t\t\t\t\t_writer.WriteStartElement(Constants.Content.Operands);\r\n\t\t\t\t\t\t_export.ExportArrayContent(operands, _writer, true);\r\n\t\t\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t\t\t\tif (o == \"BI\") {\r\n\t\t\t\t\t\t\t_writer.WriteStartElement(Constants.Content.Raw);\r\n\t\t\t\t\t\t\tvar bs = (operands[0] as PdfImageData).RawBytes;\r\n\t\t\t\t\t\t\t_writer.WriteAttributeString(Constants.Content.Length, bs.Length.ToText());\r\n\t\t\t\t\t\t\t_writer.WriteBinHex(bs, 0, bs.Length);\r\n\t\t\t\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (open == false && _writerLevel >= 0) {\r\n\t\t\t\t\t_writer.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tstatic string GetOperandsTextValue(List<PdfObject> operands) {\r\n\t\t\t\toperands.RemoveAt(operands.Count - 1);\r\n\t\t\t\treturn String.Join(\" \", operands.ConvertAll((po) => po.Type == PdfObject.NUMBER ? ((PdfNumber)po).DoubleValue.ToText() : null).ToArray());\r\n\t\t\t}\r\n\r\n\t\t\tvoid AddTextInfo(string t) {\r\n\t\t\t\tif (_textContainer != null && t != null) {\r\n\t\t\t\t\t_textContainer.Add(new TextInfo() {\r\n\t\t\t\t\t\tText = t,\r\n\t\t\t\t\t\tSize = CurrentGraphicState.FontSize * TextMatrix[Matrix.I11],\r\n\t\t\t\t\t\tRegion = new Bound(TextMatrix[Matrix.I31], TextMatrix[Matrix.I32], TextMatrix[Matrix.I31] + _textWidth, 0),\r\n\t\t\t\t\t\t// note 不要设置该属性，否则可能在文档具有大量字体时占用过高的内存\r\n\t\t\t\t\t\t//Font = CurrentGraphicState.Font\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfContentStreamParser.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.error_messages;\r\nusing iTextSharp.text.pdf;\r\nusing iTextSharp.text.pdf.parser;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal class PdfContentStreamProcessor\r\n\t{\r\n\t\t// Fields\r\n\t\treadonly Stack<Model.GraphicsState> _GsStack = new Stack<Model.GraphicsState>();\r\n\t\treadonly Stack<MarkedContentInfo> _MarkedContentStack = new Stack<MarkedContentInfo>();\r\n\t\treadonly Dictionary<string, IContentOperator> _Operators = new Dictionary<string, IContentOperator>();\r\n\t\treadonly Dictionary<PdfName, IXObjectDoHandler> _XObjectDoHandlers = new Dictionary<PdfName, IXObjectDoHandler>();\r\n\t\treadonly Dictionary<int, FontInfoCache> _FontCache = new Dictionary<int, FontInfoCache>();\r\n\t\treadonly Dictionary<int, string> _FontNameCache = new Dictionary<int, string>();\r\n\t\t//IRenderListener renderListener;\r\n\t\tResourceDictionary _Resources;\r\n\t\tMatrix _TextLineMatrix;\r\n\t\tMatrix _TextMatrix;\r\n\t\tpublic readonly static IContentOperator NopOperator = new IgnoreOperatorContentOperator();\r\n\r\n\t\tinternal PdfContentStreamProcessor() {\r\n\t\t\tReset();\r\n\t\t}\r\n\r\n\t\t// Methods\r\n\t\tinternal Model.GraphicsState CurrentGraphicState => _GsStack.Peek();\r\n\t\tinternal Matrix TextMatrix => _TextMatrix;\r\n\t\tinternal IContentOperator DefaultOperator { get; set; }\r\n\t\tprotected IDictionary<int, string> Fonts => _FontNameCache;\r\n\t\tprotected ResourceDictionary Resource => _Resources;\r\n\r\n\t\tprotected void ApplyTextAdjust(float tj) {\r\n\t\t\tfloat adjustBy = -tj / 1000f * CurrentGraphicState.FontSize * CurrentGraphicState.HorizontalScaling;\r\n\t\t\t_TextMatrix = new Matrix(adjustBy, 0f).Multiply(_TextMatrix);\r\n\t\t}\r\n\r\n\t\tprotected void AdjustTextMatrixX(float x) {\r\n\t\t\t_TextMatrix = new Matrix(x, 0f).Multiply(_TextMatrix);\r\n\t\t}\r\n\r\n\t\tprotected void BeginMarkedContent(PdfName tag, PdfDictionary dict) {\r\n\t\t\t_MarkedContentStack.Push(new MarkedContentInfo(tag, dict));\r\n\t\t}\r\n\r\n\t\tprivate void BeginText() {\r\n\t\t\t//this.renderListener.BeginTextBlock ();\r\n\t\t}\r\n\t\tprivate FontInfo GetFont(PRIndirectReference fontRef) {\r\n\t\t\tif (_FontCache.TryGetValue(fontRef.Number, out var r)) {\r\n\t\t\t\tr.Access++;\r\n\t\t\t\treturn r.Info;\r\n\t\t\t}\r\n\t\t\tvar f = new FontInfo(fontRef);\r\n\t\t\t_FontCache.Add(fontRef.Number, new FontInfoCache(f));\r\n\t\t\t_FontNameCache.Add(fontRef.Number, f.FontName);\r\n\t\t\tif (_FontCache.Count > 53) {\r\n\t\t\t\tvar l = new List<KeyValuePair<int, FontInfoCache>>(_FontCache);\r\n\t\t\t\tl.Sort((x, y) => x.Value.Access - y.Value.Access);\r\n\t\t\t\tfor (int i = 0; i < 10; i++) {\r\n\t\t\t\t\tint k = l[i].Key;\r\n\t\t\t\t\t_FontCache.Remove(k);\r\n\t\t\t\t\t_FontNameCache.Remove(k);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn f;\r\n\t\t}\r\n\r\n\t\tprotected virtual void DisplayPdfString(PdfString str) {\r\n\t\t\t//TextRenderInfo renderInfo = new TextRenderInfo (this.Decode (str), this.CurrentGraphicState, this.textMatrix, this.markedContentStack);\r\n\t\t\t//this.renderListener.RenderText (renderInfo);\r\n\t\t\t//this.textMatrix = new Matrix (renderInfo.GetUnscaledWidth (), 0f).Multiply (this.textMatrix);\r\n\t\t}\r\n\r\n\t\tprotected virtual void DisplayXObject(PdfName xobjectName) {\r\n\t\t\t//IXObjectDoHandler handler;\r\n\t\t\t//PdfDictionary xobjects = this.resources.GetAsDict (PdfName.XOBJECT);\r\n\t\t\t//PdfObject xobject = xobjects.GetDirectObject (xobjectName);\r\n\t\t\t//PdfStream xobjectStream = (PdfStream)xobject;\r\n\t\t\t//PdfName subType = xobjectStream.GetAsName (PdfName.SUBTYPE);\r\n\t\t\t//if (!xobject.IsStream ()) {\r\n\t\t\t//    throw new InvalidOperationException (MessageLocalization.GetComposedMessage (\"XObject.1.is.not.a.stream\", xobjectName));\r\n\t\t\t//}\r\n\t\t\t//this.xobjectDoHandlers.TryGetValue (subType, out handler);\r\n\t\t\t//if (handler == null) {\r\n\t\t\t//    handler = this.xobjectDoHandlers[PdfName.DEFAULT];\r\n\t\t\t//}\r\n\t\t\t//handler.HandleXObject (this, xobjectStream, xobjects.GetAsIndirectObject (xobjectName));\r\n\t\t}\r\n\r\n\t\tprivate void EndMarkedContent() {\r\n\t\t\t_MarkedContentStack.Pop();\r\n\t\t}\r\n\r\n\t\tprivate void EndText() {\r\n\t\t\t//this.renderListener.EndTextBlock ();\r\n\t\t}\r\n\r\n\t\tprotected virtual void InvokeOperator(PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\tif (_Operators.TryGetValue(oper.ToString(), out IContentOperator op)) {\r\n\t\t\t\top.Invoke(this, oper, operands);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tDefaultOperator?.Invoke(this, oper, operands);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected void PopulateOperators() {\r\n\t\t\tRegisterContentOperator(\"q\", new PushGraphicsState());\r\n\t\t\tRegisterContentOperator(\"Q\", new PopGraphicsState());\r\n\t\t\tRegisterContentOperator(\"cm\", new ModifyCurrentTransformationMatrix());\r\n\t\t\tRegisterContentOperator(\"gs\", new ProcessGraphicsStateResource());\r\n\t\t\tvar tcOperator = new SetTextCharacterSpacing();\r\n\t\t\tRegisterContentOperator(\"Tc\", tcOperator);\r\n\t\t\tvar twOperator = new SetTextWordSpacing();\r\n\t\t\tRegisterContentOperator(\"Tw\", twOperator);\r\n\t\t\tRegisterContentOperator(\"Tz\", new SetTextHorizontalScaling());\r\n\t\t\tvar tlOperator = new SetTextLeading();\r\n\t\t\tRegisterContentOperator(\"TL\", tlOperator);\r\n\t\t\tRegisterContentOperator(\"Tf\", new SetTextFont());\r\n\t\t\tRegisterContentOperator(\"Tr\", new SetTextRenderMode());\r\n\t\t\tRegisterContentOperator(\"Ts\", new SetTextRise());\r\n\t\t\tRegisterContentOperator(\"BT\", new BeginTextC());\r\n\t\t\tRegisterContentOperator(\"ET\", new EndTextC());\r\n\t\t\tRegisterContentOperator(\"BMC\", new BeginMarkedContentC());\r\n\t\t\tRegisterContentOperator(\"BDC\", new BeginMarkedContentDictionary());\r\n\t\t\tRegisterContentOperator(\"EMC\", new EndMarkedContentC());\r\n\t\t\tvar tdOperator = new TextMoveStartNextLine();\r\n\t\t\tRegisterContentOperator(\"Td\", tdOperator);\r\n\t\t\tRegisterContentOperator(\"TD\", new TextMoveStartNextLineWithLeading(tdOperator, tlOperator));\r\n\t\t\tRegisterContentOperator(\"Tm\", new TextSetTextMatrix());\r\n\t\t\tvar tstarOperator = new TextMoveNextLine(tdOperator);\r\n\t\t\tRegisterContentOperator(\"T*\", tstarOperator);\r\n\t\t\tvar tjOperator = new ShowText();\r\n\t\t\tRegisterContentOperator(\"Tj\", new ShowText());\r\n\t\t\tRegisterContentOperator(\"TJ\", new ShowTextArray());\r\n\t\t\tvar tickOperator = new MoveNextLineAndShowText(tstarOperator, tjOperator);\r\n\t\t\tRegisterContentOperator(\"'\", tickOperator);\r\n\t\t\tRegisterContentOperator(\"\\\"\", new MoveNextLineAndShowTextWithSpacing(twOperator, tcOperator, tickOperator));\r\n\t\t\tRegisterContentOperator(\"Do\", new Do());\r\n\t\t}\r\n\r\n\t\tprotected void PopulateXObjectDoHandlers() {\r\n\t\t\tRegisterXObjectDoHandler(PdfName.DEFAULT, new IgnoreXObjectDoHandler());\r\n\t\t\tRegisterXObjectDoHandler(PdfName.FORM, new FormXObjectDoHandler());\r\n\t\t\tRegisterXObjectDoHandler(PdfName.IMAGE, new ImageXObjectDoHandler());\r\n\t\t}\r\n\r\n\t\tpublic void ProcessContent(byte[] contentBytes, PdfDictionary resources) {\r\n\t\t\tif (contentBytes.HasContent() == false || resources == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_Resources.Push(resources);\r\n\t\t\tvar tokenizer = new PRTokeniser(new RandomAccessFileOrArray(contentBytes));\r\n\t\t\tvar ps = new PdfContentParser(tokenizer);\r\n\t\t\tvar operands = new List<PdfObject>();\r\n\t\t\twhile (ps.Parse(operands).Count > 0) {\r\n\t\t\t\tvar oper = operands[operands.Count - 1] as PdfLiteral;\r\n\t\t\t\tif (oper is null) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (\"BI\".Equals(oper.ToString())) {\r\n\t\t\t\t\tvar img = InlineImageUtils.ParseInlineImage(ps, resources.GetAsDict(PdfName.COLORSPACE));\r\n\t\t\t\t\tInvokeOperator(oper, new List<PdfObject> { img, oper });\r\n\t\t\t\t\t//    this.renderListener.RenderImage (renderInfo);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tInvokeOperator(oper, operands);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttokenizer.Close();\r\n\t\t\t_Resources.Pop();\r\n\t\t}\r\n\r\n\t\tinternal IContentOperator RegisterContentOperator(string operatorString, IContentOperator oper) {\r\n\t\t\tif (oper == null) {\r\n\t\t\t\t_Operators.Remove(operatorString);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn _Operators[operatorString] = oper;\r\n\t\t}\r\n\r\n\t\tinternal IXObjectDoHandler RegisterXObjectDoHandler(PdfName xobjectSubType, IXObjectDoHandler handler) {\r\n\t\t\t_XObjectDoHandlers.TryGetValue(xobjectSubType, out IXObjectDoHandler old);\r\n\t\t\t_XObjectDoHandlers[xobjectSubType] = handler;\r\n\t\t\treturn old;\r\n\t\t}\r\n\r\n\t\tinternal virtual void Reset() {\r\n\t\t\t_GsStack.Clear();\r\n\t\t\t_GsStack.Push(new Model.GraphicsState());\r\n\t\t\t_TextMatrix = null;\r\n\t\t\t_TextLineMatrix = null;\r\n\t\t\t_Resources = new ResourceDictionary();\r\n\t\t}\r\n\r\n\t\t#region Nested Types\r\n\t\tinternal interface IContentOperator\r\n\t\t{\r\n\t\t\tbool HasOutput { get; }\r\n\t\t\tvoid Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands);\r\n\t\t}\r\n\t\tinternal interface IXObjectDoHandler\r\n\t\t{\r\n\t\t\tvoid HandleXObject(PdfContentStreamProcessor processor, PdfStream stream, PdfIndirectReference refi);\r\n\t\t}\r\n\r\n\t\tprotected sealed class BeginMarkedContentC : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.BeginMarkedContent((PdfName)operands[0], new PdfDictionary());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class BeginMarkedContentDictionary : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tstatic PdfDictionary GetPropertiesDictionary(PdfObject operand1, ResourceDictionary resources) {\r\n\t\t\t\treturn operand1.IsDictionary()\r\n\t\t\t\t\t? (PdfDictionary)operand1\r\n\t\t\t\t\t: resources.GetAsDict((PdfName)operand1);\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.BeginMarkedContent((PdfName)operands[0],\r\n\t\t\t\t\tGetPropertiesDictionary(operands[1], processor._Resources));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class BeginTextC : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor._TextMatrix = new Matrix();\r\n\t\t\t\tprocessor._TextLineMatrix = processor._TextMatrix;\r\n\t\t\t\tprocessor.BeginText();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class Do : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => true;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.DisplayXObject((PdfName)operands[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class EndMarkedContentC : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.EndMarkedContent();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class EndTextC : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor._TextMatrix = null;\r\n\t\t\t\tprocessor._TextLineMatrix = null;\r\n\t\t\t\tprocessor.EndText();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class FormXObjectDoHandler : IXObjectDoHandler\r\n\t\t{\r\n\t\t\tpublic void HandleXObject(PdfContentStreamProcessor processor, PdfStream stream, PdfIndirectReference refi) {\r\n\t\t\t\tvar resources = stream.GetAsDict(PdfName.RESOURCES);\r\n\t\t\t\tvar contentBytes = ContentByteUtils.GetContentBytesFromContentObject(stream);\r\n\t\t\t\tvar matrix = stream.GetAsArray(PdfName.MATRIX);\r\n\t\t\t\tnew PushGraphicsState().Invoke(processor, null, null);\r\n\t\t\t\tif (matrix != null) {\r\n\t\t\t\t\tfloat a = matrix[0].ValueAsFloat();\r\n\t\t\t\t\tfloat b = matrix[1].ValueAsFloat();\r\n\t\t\t\t\tfloat c = matrix[2].ValueAsFloat();\r\n\t\t\t\t\tfloat d = matrix[3].ValueAsFloat();\r\n\t\t\t\t\tfloat e = matrix[4].ValueAsFloat();\r\n\t\t\t\t\tfloat f = matrix[5].ValueAsFloat();\r\n\t\t\t\t\tprocessor.CurrentGraphicState.TransMatrix = new Matrix(a, b, c, d, e, f).Multiply(processor.CurrentGraphicState.TransMatrix);\r\n\t\t\t\t}\r\n\t\t\t\tprocessor.ProcessContent(contentBytes, resources);\r\n\t\t\t\tnew PopGraphicsState().Invoke(processor, null, null);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class IgnoreOperatorContentOperator : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class IgnoreXObjectDoHandler : IXObjectDoHandler\r\n\t\t{\r\n\t\t\tpublic void HandleXObject(PdfContentStreamProcessor processor, PdfStream xobjectStream, PdfIndirectReference refi) {\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class ImageXObjectDoHandler : IXObjectDoHandler\r\n\t\t{\r\n\t\t\tpublic void HandleXObject(PdfContentStreamProcessor processor, PdfStream xobjectStream, PdfIndirectReference refi) {\r\n\t\t\t\t//ImageRenderInfo renderInfo = ImageRenderInfo.CreateForXObject (processor.CurrentGraphicState.TransMatrix, refi);\r\n\t\t\t\t//processor.renderListener.RenderImage (renderInfo);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class ModifyCurrentTransformationMatrix : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tfloat a = operands[0].ValueAsFloat();\r\n\t\t\t\tfloat b = operands[1].ValueAsFloat();\r\n\t\t\t\tfloat c = operands[2].ValueAsFloat();\r\n\t\t\t\tfloat d = operands[3].ValueAsFloat();\r\n\t\t\t\tfloat e = operands[4].ValueAsFloat();\r\n\t\t\t\tfloat f = operands[5].ValueAsFloat();\r\n\t\t\t\tvar gs = processor._GsStack.Peek();\r\n\t\t\t\tgs.TransMatrix = new Matrix(a, b, c, d, e, f).Multiply(gs.TransMatrix);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class MoveNextLineAndShowText : IContentOperator\r\n\t\t{\r\n\t\t\treadonly IContentOperator showText;\r\n\t\t\treadonly IContentOperator textMoveNextLine;\r\n\r\n\t\t\tpublic MoveNextLineAndShowText(IContentOperator textMoveNextLine, IContentOperator showText) {\r\n\t\t\t\tthis.showText = showText;\r\n\t\t\t\tthis.textMoveNextLine = textMoveNextLine;\r\n\t\t\t}\r\n\r\n\t\t\tpublic bool HasOutput => true;\r\n\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\ttextMoveNextLine.Invoke(processor, null, new List<PdfObject>(0));\r\n\t\t\t\tshowText.Invoke(processor, null, operands);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class MoveNextLineAndShowTextWithSpacing : IContentOperator\r\n\t\t{\r\n\t\t\treadonly IContentOperator moveNextLineAndShowText;\r\n\t\t\treadonly IContentOperator setTextCharacterSpacing;\r\n\t\t\treadonly IContentOperator setTextWordSpacing;\r\n\r\n\t\t\tpublic bool HasOutput => true;\r\n\t\t\tpublic MoveNextLineAndShowTextWithSpacing(IContentOperator setTextWordSpacing, IContentOperator setTextCharacterSpacing, IContentOperator moveNextLineAndShowText) {\r\n\t\t\t\tthis.setTextWordSpacing = setTextWordSpacing;\r\n\t\t\t\tthis.setTextCharacterSpacing = setTextCharacterSpacing;\r\n\t\t\t\tthis.moveNextLineAndShowText = moveNextLineAndShowText;\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar twOperands = new List<PdfObject>(1) { (PdfNumber)operands[0] };\r\n\t\t\t\tsetTextWordSpacing.Invoke(processor, null, twOperands);\r\n\t\t\t\tvar tcOperands = new List<PdfObject>(1) { (PdfNumber)operands[1] };\r\n\t\t\t\tsetTextCharacterSpacing.Invoke(processor, null, tcOperands);\r\n\t\t\t\tvar tickOperands = new List<PdfObject>(1) { (PdfString)operands[2] };\r\n\t\t\t\tmoveNextLineAndShowText.Invoke(processor, null, tickOperands);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class PopGraphicsState : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tprocessor._GsStack.Pop();\r\n\t\t\t\t}\r\n\t\t\t\tcatch (InvalidOperationException) {\r\n\t\t\t\t\tTracker.DebugMessage(\"绘图状态堆栈为空。\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class ProcessGraphicsStateResource : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar extGState = processor._Resources.GetAsDict(PdfName.EXTGSTATE)\r\n\t\t\t\t\t?? throw new ArgumentException(MessageLocalization.GetComposedMessage(\"resources.do.not.contain.extgstate.entry.unable.to.process.oper.1\", oper));\r\n\r\n\t\t\t\tvar dictionaryName = (PdfName)operands[0];\r\n\t\t\t\tvar gsDic = extGState.GetAsDict(dictionaryName)\r\n\t\t\t\t\t?? throw new ArgumentException(MessageLocalization.GetComposedMessage(\"1.is.an.unknown.graphics.state.dictionary\", dictionaryName));\r\n\r\n\t\t\t\tvar fontParameter = gsDic.GetAsArray(PdfName.FONT);\r\n\t\t\t\tif (fontParameter != null) {\r\n\t\t\t\t\tvar font = processor.GetFont((PRIndirectReference)fontParameter[0]);\r\n\t\t\t\t\tfloat size = fontParameter.GetAsNumber(1).FloatValue;\r\n\t\t\t\t\tprocessor.CurrentGraphicState.Font = font;\r\n\t\t\t\t\tprocessor.CurrentGraphicState.FontSize = size;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class PushGraphicsState : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor._GsStack.Push(processor._GsStack.Peek().Copy());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class ResourceDictionary : PdfDictionary\r\n\t\t{\r\n\t\t\treadonly IList<PdfDictionary> _ResourcesStack = new List<PdfDictionary>();\r\n\r\n\t\t\tpublic override PdfObject GetDirectObject(PdfName key) {\r\n\t\t\t\tfor (int i = _ResourcesStack.Count - 1; i >= 0; i--) {\r\n\t\t\t\t\tvar subResource = _ResourcesStack[i]?.GetDirectObject(key);\r\n\t\t\t\t\tif (subResource != null) {\r\n\t\t\t\t\t\treturn subResource;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn base.GetDirectObject(key);\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Pop() {\r\n\t\t\t\t_ResourcesStack.RemoveAt(_ResourcesStack.Count - 1);\r\n\t\t\t}\r\n\r\n\t\t\tpublic void Push(PdfDictionary resources) {\r\n\t\t\t\t_ResourcesStack.Add(resources);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextCharacterSpacing : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.CurrentGraphicState.CharacterSpacing = ((PdfNumber)operands[0]).FloatValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextFont : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar fontResourceName = (PdfName)operands[0];\r\n\t\t\t\tvar f = processor._Resources.GetAsDict(PdfName.FONT).Get(fontResourceName);\r\n\t\t\t\tvar g = processor.CurrentGraphicState;\r\n\t\t\t\tif (f is PRIndirectReference fref) {\r\n\t\t\t\t\tg.FontID = fref.Number;\r\n\t\t\t\t\tg.Font = processor.GetFont(fref);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tTracker.DebugMessage($\"字体（{fontResourceName}）不为引用。\");\r\n\t\t\t\t\tg.FontID = 0;\r\n\t\t\t\t\tg.Font = new FontInfo((PdfDictionary)f, 0);\r\n\t\t\t\t}\r\n\t\t\t\tg.FontSize = ((PdfNumber)operands[1]).FloatValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextHorizontalScaling : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.CurrentGraphicState.HorizontalScaling = ((PdfNumber)operands[0]).FloatValue / 100f;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextLeading : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.CurrentGraphicState.Leading = ((PdfNumber)operands[0]).FloatValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextRenderMode : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.CurrentGraphicState.RenderMode = ((PdfNumber)operands[0]).IntValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextRise : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.CurrentGraphicState.Rise = ((PdfNumber)operands[0]).FloatValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class SetTextWordSpacing : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tprocessor.CurrentGraphicState.WordSpacing = ((PdfNumber)operands[0]).FloatValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class ShowText : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => true;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar str = (PdfString)operands[0];\r\n\t\t\t\tprocessor.DisplayPdfString(str);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class AccumulatedShowTextArray : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => true;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar array = (PdfArray)operands[0];\r\n\t\t\t\tfloat adj = 0;\r\n\t\t\t\tusing (var ms = new System.IO.MemoryStream(array.Length)) {\r\n\t\t\t\t\tforeach (PdfObject item in array.ArrayList) {\r\n\t\t\t\t\t\tif (item.Type == PdfObject.STRING) {\r\n\t\t\t\t\t\t\tms.Write((item as PdfString).GetBytes(), 0, item.Length);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tadj += ((PdfNumber)item).FloatValue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tprocessor.DisplayPdfString(new PdfString(ms.ToArray()));\r\n\t\t\t\t}\r\n\t\t\t\tprocessor.ApplyTextAdjust(adj);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class ShowTextArray : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => true;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tvar array = (PdfArray)operands[0];\r\n\t\t\t\tforeach (PdfObject entryObj in array.ArrayList) {\r\n\t\t\t\t\tif (entryObj is PdfString s) {\r\n\t\t\t\t\t\tprocessor.DisplayPdfString(s);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (entryObj is PdfNumber n) {\r\n\t\t\t\t\t\tprocessor.ApplyTextAdjust(n.FloatValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t// ignore\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class TextMoveNextLine : IContentOperator\r\n\t\t{\r\n\t\t\treadonly TextMoveStartNextLine _MoveStartNextLine;\r\n\r\n\t\t\tpublic TextMoveNextLine(TextMoveStartNextLine moveStartNextLine) {\r\n\t\t\t\t_MoveStartNextLine = moveStartNextLine;\r\n\t\t\t}\r\n\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\t_MoveStartNextLine.Invoke(processor, null, new List<PdfObject>(2) {\r\n\t\t\t\t\tnew PdfNumber(0),\r\n\t\t\t\t\tnew PdfNumber(-processor.CurrentGraphicState.Leading)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class TextMoveStartNextLine : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tfloat tx = ((PdfNumber)operands[0]).FloatValue;\r\n\t\t\t\tfloat ty = ((PdfNumber)operands[1]).FloatValue;\r\n\t\t\t\tprocessor._TextMatrix = new Matrix(tx, ty).Multiply(processor._TextLineMatrix);\r\n\t\t\t\tprocessor._TextLineMatrix = processor._TextMatrix;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class TextMoveStartNextLineWithLeading : IContentOperator\r\n\t\t{\r\n\t\t\treadonly TextMoveStartNextLine _MoveStartNextLine;\r\n\t\t\treadonly SetTextLeading _SetTextLeading;\r\n\r\n\t\t\tpublic TextMoveStartNextLineWithLeading(TextMoveStartNextLine moveStartNextLine, SetTextLeading setTextLeading) {\r\n\t\t\t\t_MoveStartNextLine = moveStartNextLine;\r\n\t\t\t\t_SetTextLeading = setTextLeading;\r\n\t\t\t}\r\n\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tfloat ty = ((PdfNumber)operands[1]).FloatValue;\r\n\t\t\t\t_SetTextLeading.Invoke(processor, null, new List<PdfObject>(1) { new PdfNumber(-ty) });\r\n\t\t\t\t_MoveStartNextLine.Invoke(processor, null, operands);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprotected sealed class TextSetTextMatrix : IContentOperator\r\n\t\t{\r\n\t\t\tpublic bool HasOutput => false;\r\n\t\t\tpublic void Invoke(PdfContentStreamProcessor processor, PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\t\tfloat a = operands[0].ValueAsFloat();\r\n\t\t\t\tfloat b = operands[1].ValueAsFloat();\r\n\t\t\t\tfloat c = operands[2].ValueAsFloat();\r\n\t\t\t\tfloat d = operands[3].ValueAsFloat();\r\n\t\t\t\tfloat e = operands[4].ValueAsFloat();\r\n\t\t\t\tfloat f = operands[5].ValueAsFloat();\r\n\t\t\t\tprocessor._TextLineMatrix = new Matrix(a, b, c, d, e, f);\r\n\t\t\t\tprocessor._TextMatrix = processor._TextLineMatrix;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t#endregion\r\n\r\n\t\tinternal static class InlineImageUtils\r\n\t\t{\r\n\t\t\t/**\r\n\t\t\t * Simple class in case users need to differentiate an exception from processing\r\n\t\t\t * inline images vs other exceptions \r\n\t\t\t * @since 5.0.4\r\n\t\t\t */\r\n\t\t\tpublic sealed class InlineImageParseException : System.IO.IOException\r\n\t\t\t{\r\n\t\t\t\tpublic InlineImageParseException(String message)\r\n\t\t\t\t\t: base(message) {\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Map between key abbreviations allowed in dictionary of inline images and their\r\n\t\t\t * equivalent image dictionary keys\r\n\t\t\t */\r\n\t\t\tprivate static readonly IDictionary<PdfName, PdfName> inlineImageEntryAbbreviationMap;\r\n\t\t\t/**\r\n\t\t\t * Map between value abbreviations allowed in dictionary of inline images for COLORSPACE\r\n\t\t\t */\r\n\t\t\tprivate static readonly IDictionary<PdfName, PdfName> inlineImageColorSpaceAbbreviationMap;\r\n\t\t\t/**\r\n\t\t\t * Map between value abbreviations allowed in dictionary of inline images for FILTER\r\n\t\t\t */\r\n\t\t\tprivate static readonly IDictionary<PdfName, PdfName> inlineImageFilterAbbreviationMap;\r\n\t\t\tstatic InlineImageUtils() { // static initializer\r\n\t\t\t\tinlineImageEntryAbbreviationMap = new Dictionary<PdfName, PdfName> {\r\n\r\n\t\t\t\t\t// allowed entries - just pass these through\r\n\t\t\t\t\t[PdfName.BITSPERCOMPONENT] = PdfName.BITSPERCOMPONENT,\r\n\t\t\t\t\t[PdfName.COLORSPACE] = PdfName.COLORSPACE,\r\n\t\t\t\t\t[PdfName.DECODE] = PdfName.DECODE,\r\n\t\t\t\t\t[PdfName.DECODEPARMS] = PdfName.DECODEPARMS,\r\n\t\t\t\t\t[PdfName.FILTER] = PdfName.FILTER,\r\n\t\t\t\t\t[PdfName.HEIGHT] = PdfName.HEIGHT,\r\n\t\t\t\t\t[PdfName.IMAGEMASK] = PdfName.IMAGEMASK,\r\n\t\t\t\t\t[PdfName.INTENT] = PdfName.INTENT,\r\n\t\t\t\t\t[PdfName.INTERPOLATE] = PdfName.INTERPOLATE,\r\n\t\t\t\t\t[PdfName.WIDTH] = PdfName.WIDTH,\r\n\r\n\t\t\t\t\t// abbreviations - transform these to corresponding correct values\r\n\t\t\t\t\t[new PdfName(\"BPC\")] = PdfName.BITSPERCOMPONENT,\r\n\t\t\t\t\t[new PdfName(\"CS\")] = PdfName.COLORSPACE,\r\n\t\t\t\t\t[new PdfName(\"D\")] = PdfName.DECODE,\r\n\t\t\t\t\t[new PdfName(\"DP\")] = PdfName.DECODEPARMS,\r\n\t\t\t\t\t[new PdfName(\"F\")] = PdfName.FILTER,\r\n\t\t\t\t\t[new PdfName(\"H\")] = PdfName.HEIGHT,\r\n\t\t\t\t\t[new PdfName(\"IM\")] = PdfName.IMAGEMASK,\r\n\t\t\t\t\t[new PdfName(\"I\")] = PdfName.INTERPOLATE,\r\n\t\t\t\t\t[new PdfName(\"W\")] = PdfName.WIDTH\r\n\t\t\t\t};\r\n\r\n\t\t\t\tinlineImageColorSpaceAbbreviationMap = new Dictionary<PdfName, PdfName> {\r\n\t\t\t\t\t[new PdfName(\"G\")] = PdfName.DEVICEGRAY,\r\n\t\t\t\t\t[new PdfName(\"RGB\")] = PdfName.DEVICERGB,\r\n\t\t\t\t\t[new PdfName(\"CMYK\")] = PdfName.DEVICECMYK,\r\n\t\t\t\t\t[new PdfName(\"I\")] = PdfName.INDEXED\r\n\t\t\t\t};\r\n\r\n\t\t\t\tinlineImageFilterAbbreviationMap = new Dictionary<PdfName, PdfName> {\r\n\t\t\t\t\t[new PdfName(\"AHx\")] = PdfName.ASCIIHEXDECODE,\r\n\t\t\t\t\t[new PdfName(\"A85\")] = PdfName.ASCII85DECODE,\r\n\t\t\t\t\t[new PdfName(\"LZW\")] = PdfName.LZWDECODE,\r\n\t\t\t\t\t[new PdfName(\"Fl\")] = PdfName.FLATEDECODE,\r\n\t\t\t\t\t[new PdfName(\"RL\")] = PdfName.RUNLENGTHDECODE,\r\n\t\t\t\t\t[new PdfName(\"CCF\")] = PdfName.CCITTFAXDECODE,\r\n\t\t\t\t\t[new PdfName(\"DCT\")] = PdfName.DCTDECODE\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Parses an inline image from the provided content parser.  The parser must be positioned immediately following the BI operator in the content stream.\r\n\t\t\t * The parser will be left with current position immediately following the EI operator that terminates the inline image\r\n\t\t\t * @param ps the content parser to use for reading the image. \r\n\t\t\t * @return the parsed image\r\n\t\t\t * @throws IOException if anything goes wring with the parsing\r\n\t\t\t * @throws InlineImageParseException if parsing of the inline image failed due to issues specific to inline image processing\r\n\t\t\t */\r\n\t\t\tpublic static PdfImageData ParseInlineImage(PdfContentParser ps, PdfDictionary colorSpaceDic) {\r\n\t\t\t\tvar d = ParseInlineImageDictionary(ps);\r\n\t\t\t\treturn new PdfImageData(d, ParseInlineImageSamples(d, colorSpaceDic, ps));\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Parses the next inline image dictionary from the parser.  The parser must be positioned immediately following the EI operator.\r\n\t\t\t * The parser will be left with position immediately following the whitespace character that follows the ID operator that ends the inline image dictionary.\r\n\t\t\t * @param ps the parser to extract the embedded image information from\r\n\t\t\t * @return the dictionary for the inline image, with any abbreviations converted to regular image dictionary keys and values\r\n\t\t\t * @throws IOException if the parse fails\r\n\t\t\t */\r\n\t\t\tprivate static PdfDictionary ParseInlineImageDictionary(PdfContentParser ps) {\r\n\t\t\t\t// by the time we get to here, we have already parsed the BI operator\r\n\t\t\t\tvar dictionary = new PdfDictionary();\r\n\r\n\t\t\t\tfor (PdfObject key = ps.ReadPRObject(); key != null && !\"ID\".Equals(key.ToString()); key = ps.ReadPRObject()) {\r\n\t\t\t\t\tvar value = ps.ReadPRObject();\r\n\r\n\t\t\t\t\tPdfName resolvedKey;\r\n\t\t\t\t\tinlineImageEntryAbbreviationMap.TryGetValue((PdfName)key, out resolvedKey);\r\n\t\t\t\t\tresolvedKey ??= (PdfName)key;\r\n\r\n\t\t\t\t\tdictionary.Put(resolvedKey, GetAlternateValue(resolvedKey, value));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tint ch = ps.GetTokeniser().Read();\r\n\t\t\t\tif (!PRTokeniser.IsWhitespace(ch))\r\n\t\t\t\t\tthrow new System.IO.IOException(\"Unexpected character \" + ch + \" found after ID in inline image\");\r\n\r\n\t\t\t\treturn dictionary;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Transforms value abbreviations into their corresponding real value \r\n\t\t\t * @param key the key that the value is for\r\n\t\t\t * @param value the value that might be an abbreviation\r\n\t\t\t * @return if value is an allowed abbreviation for the key, the expanded value for that abbreviation.  Otherwise, value is returned without modification \r\n\t\t\t */\r\n\t\t\tprivate static PdfObject GetAlternateValue(PdfName key, PdfObject value) {\r\n\t\t\t\tif (key == PdfName.FILTER) {\r\n\t\t\t\t\tif (value is PdfName pdfName\r\n\t\t\t\t\t\t&& inlineImageFilterAbbreviationMap.TryGetValue(pdfName, out PdfName altValue)\r\n\t\t\t\t\t\t&& altValue != null) {\r\n\t\t\t\t\t\treturn altValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (value is PdfArray array) {\r\n\t\t\t\t\t\tvar altArray = new PdfArray();\r\n\t\t\t\t\t\tint count = array.Size;\r\n\t\t\t\t\t\tfor (int i = 0; i < count; i++) {\r\n\t\t\t\t\t\t\taltArray.Add(GetAlternateValue(key, array[i]));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn altArray;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (key == PdfName.COLORSPACE) {\r\n\t\t\t\t\tif (value is PdfName pdfName\r\n\t\t\t\t\t\t&& inlineImageColorSpaceAbbreviationMap.TryGetValue(pdfName, out PdfName altValue)\r\n\t\t\t\t\t\t&& altValue != null) {\r\n\t\t\t\t\t\treturn altValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * @param colorSpaceName the name of the color space. If null, a bi-tonal (black and white) color space is assumed.\r\n\t\t\t * @return the components per pixel for the specified color space\r\n\t\t\t */\r\n\t\t\tprivate static int GetComponentsPerPixel(PdfName colorSpaceName, PdfDictionary colorSpaceDic) {\r\n\t\t\t\tif (colorSpaceName == null)\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\tif (colorSpaceName.Equals(PdfName.DEVICEGRAY))\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\tif (colorSpaceName.Equals(PdfName.DEVICERGB))\r\n\t\t\t\t\treturn 3;\r\n\t\t\t\tif (colorSpaceName.Equals(PdfName.DEVICECMYK))\r\n\t\t\t\t\treturn 4;\r\n\r\n\t\t\t\tif (colorSpaceDic != null) {\r\n\t\t\t\t\tvar colorSpace = colorSpaceDic.GetAsArray(colorSpaceName);\r\n\t\t\t\t\tif (colorSpace != null && PdfName.INDEXED.Equals(colorSpace.GetAsName(0))) {\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthrow new ArgumentException(\"Unexpected color space \" + colorSpaceName);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Computes the number of unfiltered bytes that each row of the image will contain.\r\n\t\t\t * If the number of bytes results in a partial terminating byte, this number is rounded up\r\n\t\t\t * per the PDF specification\r\n\t\t\t * @param imageDictionary the dictionary of the inline image\r\n\t\t\t * @return the number of bytes per row of the image\r\n\t\t\t */\r\n\t\t\tprivate static int ComputeBytesPerRow(PdfDictionary imageDictionary, PdfDictionary colorSpaceDic) {\r\n\t\t\t\tvar wObj = imageDictionary.GetAsNumber(PdfName.WIDTH);\r\n\t\t\t\tvar bpcObj = imageDictionary.GetAsNumber(PdfName.BITSPERCOMPONENT);\r\n\t\t\t\tint cpp = GetComponentsPerPixel(imageDictionary.GetAsName(PdfName.COLORSPACE), colorSpaceDic);\r\n\t\t\t\tint w = wObj.IntValue;\r\n\t\t\t\tint bpc = bpcObj?.IntValue ?? 1;\r\n\t\t\t\treturn (w * bpc * cpp + 7) / 8;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Parses the samples of the image from the underlying content parser, ignoring all filters.\r\n\t\t\t * The parser must be positioned immediately after the ID operator that ends the inline image's dictionary.\r\n\t\t\t * The parser will be left positioned immediately following the EI operator.\r\n\t\t\t * This is primarily useful if no filters have been applied. \r\n\t\t\t * @param imageDictionary the dictionary of the inline image\r\n\t\t\t * @param ps the content parser\r\n\t\t\t * @return the samples of the image\r\n\t\t\t * @throws IOException if anything bad happens during parsing\r\n\t\t\t */\r\n\t\t\tprivate static byte[] ParseUnfilteredSamples(PdfDictionary imageDictionary, PdfDictionary colorSpaceDic, PdfContentParser ps) {\r\n\t\t\t\t// special case:  when no filter is specified, we just read the number of bits\r\n\t\t\t\t// per component, multiplied by the width and height.\r\n\t\t\t\tif (imageDictionary.Contains(PdfName.FILTER))\r\n\t\t\t\t\tthrow new ArgumentException(\"Dictionary contains filters\");\r\n\r\n\t\t\t\tvar h = imageDictionary.GetAsNumber(PdfName.HEIGHT);\r\n\r\n\t\t\t\tint bytesToRead = ComputeBytesPerRow(imageDictionary, colorSpaceDic) * h.IntValue;\r\n\t\t\t\tvar bytes = new byte[bytesToRead];\r\n\t\t\t\tvar tokeniser = ps.GetTokeniser();\r\n\r\n\t\t\t\tint shouldBeWhiteSpace = tokeniser.Read(); // skip next character (which better be a whitespace character - I suppose we could check for this)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // from the PDF spec:  Unless the image uses ASCIIHexDecode or ASCII85Decode as one of its filters, the ID operator shall be followed by a single white-space character, and the next character shall be interpreted as the first byte of image data.\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // unfortunately, we've seen some PDFs where there is no space following the ID, so we have to capture this case and handle it\r\n\t\t\t\tint startIndex = 0;\r\n\t\t\t\tif (!PRTokeniser.IsWhitespace(shouldBeWhiteSpace) || shouldBeWhiteSpace == 0) {\r\n\t\t\t\t\tbytes[0] = (byte)shouldBeWhiteSpace;\r\n\t\t\t\t\tstartIndex++;\r\n\t\t\t\t}\r\n\t\t\t\tfor (int i = startIndex; i < bytesToRead; i++) {\r\n\t\t\t\t\tint ch = tokeniser.Read();\r\n\t\t\t\t\tif (ch == -1)\r\n\t\t\t\t\t\tthrow new InlineImageParseException(\"End of content stream reached before end of image data\");\r\n\r\n\t\t\t\t\tbytes[i] = (byte)ch;\r\n\t\t\t\t}\r\n\t\t\t\tvar ei = ps.ReadPRObject();\r\n\t\t\t\tif (!ei.ToString().Equals(\"EI\"))\r\n\t\t\t\t\tthrow new InlineImageParseException(\"EI not found after end of image data\");\r\n\r\n\t\t\t\treturn bytes;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Parses the samples of the image from the underlying content parser, accounting for filters\r\n\t\t\t * The parser must be positioned immediately after the ID operator that ends the inline image's dictionary.\r\n\t\t\t * The parser will be left positioned immediately following the EI operator.\r\n\t\t\t * <b>Note:</b>This implementation does not actually apply the filters at this time\r\n\t\t\t * @param imageDictionary the dictionary of the inline image\r\n\t\t\t * @param ps the content parser\r\n\t\t\t * @return the samples of the image\r\n\t\t\t * @throws IOException if anything bad happens during parsing\r\n\t\t\t */\r\n\t\t\tprivate static byte[] ParseInlineImageSamples(PdfDictionary imageDictionary, PdfDictionary colorSpaceDic, PdfContentParser ps) {\r\n\t\t\t\t// by the time we get to here, we have already parsed the ID operator\r\n\r\n\t\t\t\tif (!imageDictionary.Contains(PdfName.FILTER)) {\r\n\t\t\t\t\treturn ParseUnfilteredSamples(imageDictionary, colorSpaceDic, ps);\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\t// read all content until we reach an EI operator surrounded by whitespace.\r\n\t\t\t\t// The following algorithm has two potential issues: what if the image stream \r\n\t\t\t\t// contains <ws>EI<ws> ?\r\n\t\t\t\t// Plus, there are some streams that don't have the <ws> before the EI operator\r\n\t\t\t\t// it sounds like we would have to actually decode the content stream, which\r\n\t\t\t\t// I'd rather avoid right now.\r\n\t\t\t\tvar baos = new System.IO.MemoryStream();\r\n\t\t\t\tvar accumulated = new System.IO.MemoryStream();\r\n\t\t\t\tint ch;\r\n\t\t\t\tint found = 0;\r\n\t\t\t\tvar tokeniser = ps.GetTokeniser();\r\n\t\t\t\tbyte[] ff = null;\r\n\r\n\t\t\t\twhile ((ch = tokeniser.Read()) != -1) {\r\n\t\t\t\t\tif (found == 0 && PRTokeniser.IsWhitespace(ch)) {\r\n\t\t\t\t\t\tfound++;\r\n\t\t\t\t\t\taccumulated.WriteByte((byte)ch);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (found == 1 && ch == 'E') {\r\n\t\t\t\t\t\tfound++;\r\n\t\t\t\t\t\taccumulated.WriteByte((byte)ch);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (found == 1 && PRTokeniser.IsWhitespace(ch)) {\r\n\t\t\t\t\t\t// this clause is needed if we have a white space character that is part of the image data\r\n\t\t\t\t\t\t// followed by a whitespace character that precedes the EI operator.  In this case, we need\r\n\t\t\t\t\t\t// to flush the first whitespace, then treat the current whitespace as the first potential\r\n\t\t\t\t\t\t// character for the end of stream check.  Note that we don't increment 'found' here.\r\n\t\t\t\t\t\tbaos.Write(ff = accumulated.ToArray(), 0, ff.Length);\r\n\t\t\t\t\t\taccumulated.SetLength(0);\r\n\t\t\t\t\t\taccumulated.WriteByte((byte)ch);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (found == 2 && ch == 'I') {\r\n\t\t\t\t\t\tfound++;\r\n\t\t\t\t\t\taccumulated.WriteByte((byte)ch);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (found == 3 && PRTokeniser.IsWhitespace(ch)) {\r\n\t\t\t\t\t\treturn baos.ToArray();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tbaos.Write(ff = accumulated.ToArray(), 0, ff.Length);\r\n\t\t\t\t\t\taccumulated.SetLength(0);\r\n\r\n\t\t\t\t\t\tbaos.WriteByte((byte)ch);\r\n\t\t\t\t\t\tfound = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthrow new InlineImageParseException(\"Could not find image data or EI\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsealed class FontInfoCache\r\n\t\t{\r\n\t\t\tpublic readonly FontInfo Info;\r\n\t\t\tpublic int Access;\r\n\r\n\t\t\tpublic FontInfoCache(FontInfo info) {\r\n\t\t\t\tInfo = info;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfDocumentCreator.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Xml;\r\nusing FreeImageAPI;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing iTextImage = iTextSharp.text.Image;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class PdfDocumentCreator\r\n\t{\r\n\t\tinternal static readonly string[] SupportedFileTypes = new string[] { \".pdf\", \".tif\", \".jpg\", \".gif\", \".png\", \".tiff\", \".bmp\", \".jpeg\", \".jp2\", \".j2k\" };\r\n\t\tstatic readonly string[] __BuiltInImageTypes = { \".png\", \".jpg\", \".jpeg\", \".bmp\", \".jp2\", \".j2k\" };\r\n\t\tstatic readonly string[] __MultiFrameImageTypes = { \".tif\", \".tiff\", \".gif\" };\r\n\t\tstatic readonly PixelFormat[] __JpgFormats = new PixelFormat[] {\r\n\t\t\t\t\t\t\t\t\tPixelFormat.Format16bppGrayScale,\r\n\t\t\t\t\t\t\t\t\tPixelFormat.Format16bppRgb555,\r\n\t\t\t\t\t\t\t\t\tPixelFormat.Format16bppRgb565,\r\n\t\t\t\t\t\t\t\t\tPixelFormat.Format24bppRgb,\r\n\t\t\t\t\t\t\t\t\tPixelFormat.Format32bppRgb,\r\n\t\t\t\t\t\t\t\t\tPixelFormat.Format48bppRgb};\r\n\r\n\t\tinternal static readonly PaperSize[] PaperSizes = new PaperSize[] {\r\n\t\t\t\tnew PaperSize (PaperSize.AsPageSize, 0, 0),\r\n\t\t\t\tnew PaperSize (PaperSize.FixedWidthAutoHeight, 0, 0),\r\n\t\t\t\tnew PaperSize (PaperSize.AsWidestPage, 0, 0),\r\n\t\t\t\tnew PaperSize (PaperSize.AsNarrowestPage, 0, 0),\r\n\t\t\t\tnew PaperSize (PaperSize.AsLargestPage, 0, 0),\r\n\t\t\t\tnew PaperSize (PaperSize.AsSmallestPage, 0, 0),\r\n\t\t\t\tnew PaperSize (PaperSize.AsFirstPage, 0, 0),\r\n\t\t\t\tnew PaperSize (\"16 开 (18.4*26.0)\", 1840, 2600),\r\n\t\t\t\tnew PaperSize (\"32 开 (13.0*18.4)\", 1300, 1840),\r\n\t\t\t\tnew PaperSize (\"大 32 开 (14.0*20.3)\", 1400, 2030),\r\n\t\t\t\tnew PaperSize (\"A4 (21.0*29.7)\", 2100, 2970),\r\n\t\t\t\tnew PaperSize (\"A3 (29.7*42.0)\", 2970, 4200),\r\n\t\t\t\tnew PaperSize (\"自定义\", 0, 0),\r\n\t\t\t\tnew PaperSize (\"————————————\", 0, 0),\r\n\t\t\t\tnew PaperSize (\"8 开 (26.0*36.8)\", 2600, 3680),\r\n\t\t\t\tnew PaperSize (\"16 开 (18.4*26.0)\", 1840, 2600),\r\n\t\t\t\tnew PaperSize (\"大 16 开 (21.0*28.5)\", 2100, 2850),\r\n\t\t\t\tnew PaperSize (\"32 开 (13.0*18.4)\", 1300, 1840),\r\n\t\t\t\tnew PaperSize (\"大 32 开 (14.0*20.3)\", 1400, 2030),\r\n\t\t\t\tnew PaperSize (\"8 K (27.3*39.3)\", 2730, 3930),\r\n\t\t\t\tnew PaperSize (\"16 K (19.6*27.3)\", 1960, 2730),\r\n\t\t\t\tnew PaperSize (\"A0 (84.1*118.9)\", 8410, 11890),\r\n\t\t\t\tnew PaperSize (\"A1 (59.4*84.1)\", 5940, 8410),\r\n\t\t\t\tnew PaperSize (\"A2 (42.0*59.4)\", 4200, 5940),\r\n\t\t\t\tnew PaperSize (\"A3 (29.7*42.0)\", 2970, 4200),\r\n\t\t\t\tnew PaperSize (\"A4 (21.0*29.7)\", 2100, 2970),\r\n\t\t\t\tnew PaperSize (\"A5 (14.8*21.0)\", 1480, 2100),\r\n\t\t\t\tnew PaperSize (\"A6 (10.5*14.8)\", 1050, 1480),\r\n\t\t\t\tnew PaperSize (\"B0 (100.0*141.3)\", 10000, 14130),\r\n\t\t\t\tnew PaperSize (\"B1 (70.7*100.0)\", 7070, 10000),\r\n\t\t\t\tnew PaperSize (\"B2 (50.0*70.7)\", 5000, 7070),\r\n\t\t\t\tnew PaperSize (\"B3 (35.3*50.0)\", 3530, 5000),\r\n\t\t\t\tnew PaperSize (\"B4 (25.0*35.3)\", 2500, 3530),\r\n\t\t\t\tnew PaperSize (\"B5 (17.6*25.0)\", 1760, 2500),\r\n\t\t\t\tnew PaperSize (\"B6 (12.5*17.6)\", 1250, 1760)\r\n\t\t\t};\r\n\t\treadonly MergerOptions _option;\r\n\t\treadonly Document _doc;\r\n\t\treadonly PdfCopy _writer;\r\n\t\treadonly PaperSize _content;\r\n\t\treadonly DocumentSink _sink;\r\n\t\treadonly PageBoxSettings _pageSettings;\r\n\t\treadonly bool _autoRotate;\r\n\t\treadonly HorizontalAlignment hAlign;\r\n\t\treadonly VerticalAlignment vAlign;\r\n\t\treadonly bool scaleUp, scaleDown;\r\n\t\treadonly bool areMarginsEqual;\r\n\t\tbool _portrait;\r\n\t\tint _inputDocumentCount;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 在传入构造函数选项中保留链接时，获取最近处理的 PDF 文档的书签。\r\n\t\t/// </summary>\r\n\t\tpublic PdfInfoXmlDocument PdfBookmarks { get; }\r\n\t\t/// <summary>获取输入的文档数量。</summary>\r\n\t\tpublic int InputDocumentCount => _inputDocumentCount;\r\n\r\n\t\tpublic PdfDocumentCreator(DocumentSink sink, MergerOptions option, ImporterOptions impOptions, Document document, PdfCopy writer) {\r\n\t\t\t_sink = sink;\r\n\t\t\t_option = option;\r\n\t\t\t_doc = document;\r\n\t\t\t_writer = writer;\r\n\t\t\tvar ps = _pageSettings = option.PageSettings;\r\n\t\t\t_content = new PaperSize(ps.PaperSize.PaperName, option.ContentWidth, option.ContentHeight);\r\n\t\t\t_portrait = _content.Height > _content.Width;\r\n\t\t\t_autoRotate = ps.AutoRotation && (_content.Height != _content.Width);\r\n\t\t\thAlign = ps.HorizontalAlign;\r\n\t\t\tvAlign = ps.VerticalAlign;\r\n\t\t\tscaleUp = option.AutoScaleUp;\r\n\t\t\tscaleDown = option.AutoScaleDown;\r\n\t\t\tareMarginsEqual = (ps.Margins.Top == ps.Margins.Left\r\n\t\t\t\t&& ps.Margins.Top == ps.Margins.Right\r\n\t\t\t\t&& ps.Margins.Top == ps.Margins.Bottom);\r\n\t\t\tif (impOptions.ImportBookmarks) {\r\n\t\t\t\tPdfBookmarks = new PdfInfoXmlDocument();\r\n\t\t\t\tvar root = PdfBookmarks.BookmarkRoot;\r\n\t\t\t}\r\n\t\t\tif (_content.SpecialSize == SpecialPaperSize.None) {\r\n\t\t\t\t_doc.SetPageSize(new Rectangle(ps.PaperSize.Width, ps.PaperSize.Height));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void ProcessFile(SourceItem sourceFile, BookmarkContainer bookmarkContainer) {\r\n\t\t\tif (sourceFile.Type != SourceItem.ItemType.Empty) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile.FilePath.ToString());\r\n\t\t\t}\r\n\t\t\tvar b = CreateAutoBookmark(sourceFile, bookmarkContainer);\r\n\t\t\tswitch (sourceFile.Type) {\r\n\t\t\t\tcase SourceItem.ItemType.Empty:\r\n\t\t\t\t\tTracker.TraceMessage(\"添加空白页。\");\r\n\t\t\t\t\tAddEmptyPage();\r\n\t\t\t\t\tSetBookmarkAction(b);\r\n\t\t\t\t\t++_inputDocumentCount;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SourceItem.ItemType.Pdf:\r\n\t\t\t\t\tTracker.TraceMessage(\"添加文档：\" + sourceFile);\r\n\t\t\t\t\tAddPdfPages(sourceFile as SourceItem.Pdf, b);\r\n\t\t\t\t\tTracker.IncrementProgress(sourceFile.FileSize);\r\n\t\t\t\t\t++_inputDocumentCount;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SourceItem.ItemType.Image:\r\n\t\t\t\t\tTracker.TraceMessage(\"添加图片：\" + sourceFile);\r\n\t\t\t\t\tAddImagePage(sourceFile, b);\r\n\t\t\t\t\tTracker.IncrementProgress(sourceFile.FileSize);\r\n\t\t\t\t\t++_inputDocumentCount;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SourceItem.ItemType.Folder:\r\n\t\t\t\t\tif (sourceFile.HasContent == false) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"已忽略不包含内容的文件夹：\" + sourceFile);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.TraceMessage(\"添加文件夹：\" + sourceFile);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (!sourceFile.HasSubItems) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar p = false;\r\n\t\t\tvar pn = _writer.CurrentPageNumber;\r\n\t\t\tforeach (var item in sourceFile.Items) {\r\n\t\t\t\tProcessFile(item, b ?? bookmarkContainer);\r\n\t\t\t\tif (p) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tp = true;\r\n\t\t\t\tvar t = b;\r\n\t\t\t\twhile (b?.Page == 0) {\r\n\t\t\t\t\tb.Page = pn;\r\n\t\t\t\t\tb.DestinationView = Constants.DestinationAttributes.ViewType.XYZ;\r\n\t\t\t\t\tb.Top = _doc.PageSize.Height;\r\n\t\t\t\t\tb = b.ParentBookmark;\r\n\t\t\t\t}\r\n\t\t\t\tb = t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid AddImagePage(SourceItem source, BookmarkElement bookmark) {\r\n\t\t\tvar ext = source.FilePath.FileExtension.ToLowerInvariant();\r\n\t\t\tvar isIndexed = false;\r\n\t\t\tif (__BuiltInImageTypes.Contains(ext)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tusing (var fi = new FreeImageBitmap(source.FilePath, (FREE_IMAGE_LOAD_FLAGS)0x0800/*仅加载图像尺寸信息*/)) {\r\n\t\t\t\t\t\tif (fi.HasPalette && fi.ImageFormat != FREE_IMAGE_FORMAT.FIF_JPEG && fi.ImageFormat != FREE_IMAGE_FORMAT.FIF_JP2) {\r\n\t\t\t\t\t\t\tisIndexed = true;\r\n\t\t\t\t\t\t\tgoto ADVANCED_LOAD;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (FreeImageException) {\r\n\t\t\t\t\tTracker.TraceMessage(\"无法添加文件：\" + source.FilePath);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar image = LoadImage(source, ext);\r\n\t\t\t\tif (image == null) {\r\n\t\t\t\t\tTracker.TraceMessage(\"无法添加文件：\" + source.FilePath);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (_option.DpiX > 0 || _option.DpiY > 0) {\r\n\t\t\t\t\timage.SetDpi(_option.DpiX.SubstituteDefault(image.DpiX), _option.DpiY.SubstituteDefault(image.DpiY));\r\n\t\t\t\t}\r\n\t\t\t\tvar cs = image.Additional?.GetAsArray(PdfName.COLORSPACE);\r\n\t\t\t\tif (cs?.Size == 4 && PdfName.INDEXED.Equals(cs[0])) {\r\n\t\t\t\t\tisIndexed = true;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif ((ext == Constants.FileExtensions.Jpg || ext == Constants.FileExtensions.Jpeg)\r\n\t\t\t\t\t\t&& Imaging.JpgHelper.TryGetExifOrientation(source.FilePath, out var o)\r\n\t\t\t\t\t\t&& o != 0) {\r\n\t\t\t\t\t\tswitch (o) {\r\n\t\t\t\t\t\t\tcase 6: image.RotationDegrees = -90; break;\r\n\t\t\t\t\t\t\tcase 3: image.RotationDegrees = 180; break;\r\n\t\t\t\t\t\t\tcase 8: image.RotationDegrees = 90; break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tAddImage(image);\r\n\t\t\t\t\tSetBookmarkAction(bookmark);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tADVANCED_LOAD:\r\n\t\t\tif (isIndexed || __MultiFrameImageTypes.Contains(ext)) {\r\n\t\t\t\tFreeImageBitmap fi = null;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tfi = FreeImageBitmap.FromFile(source.FilePath);\r\n\t\t\t\t\tvar c = fi.FrameCount;\r\n\t\t\t\t\tfor (int i = 0; i < c; i++) {\r\n\t\t\t\t\t\tfi.SelectActiveFrame(i);\r\n\t\t\t\t\t\tvar img = LoadImageFrame(source as SourceItem.Image, _option.RecompressWithJbig2, ref fi);\r\n\t\t\t\t\t\tif (_option.DpiX > 0 || _option.DpiY > 0) {\r\n\t\t\t\t\t\t\timg.SetDpi(_option.DpiX.SubstituteDefault(img.DpiX), _option.DpiY.SubstituteDefault(img.DpiY));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tAddImage(img);\r\n\t\t\t\t\t\tif (i == 0) {\r\n\t\t\t\t\t\t\tSetBookmarkAction(bookmark);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfinally {\r\n\t\t\t\t\tfi?.Dispose();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid SetBookmarkAction(BookmarkElement bookmark) {\r\n\t\t\tif (bookmark == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbookmark.Page = _writer.PageEmpty ? _writer.CurrentPageNumber - 1 : _writer.CurrentPageNumber;\r\n\t\t\tbookmark.DestinationView = Constants.DestinationAttributes.ViewType.XYZ;\r\n\t\t\tbookmark.Top = _doc.PageSize.Height;\r\n\t\t}\r\n\r\n\t\tvoid AddEmptyPage() {\r\n\t\t\tswitch (_content.SpecialSize) {\r\n\t\t\t\tcase SpecialPaperSize.None:\r\n\t\t\t\tcase SpecialPaperSize.AsSpecificPage:\r\n\t\t\t\t\t// 插入空白页\r\n\t\t\t\t\t_doc.NewPage();\r\n\t\t\t\t\t_writer.PageEmpty = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SpecialPaperSize.AsPageSize:\r\n\t\t\t\t\tif (_doc.PageSize.Width > 0) {\r\n\t\t\t\t\t\tgoto case SpecialPaperSize.AsSpecificPage;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tTracker.TraceMessage(\"没有指定页面尺寸，无法插入空白页。\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid AddPdfPages(SourceItem.Pdf sourceFile, BookmarkContainer bookmark) {\r\n\t\t\tvar pdf = _sink.GetPdfReader(sourceFile.FilePath);\r\n\t\t\tif (pdf.ConfirmUnethicalMode() == false) {\r\n\t\t\t\tTracker.TraceMessage(\"忽略了没有权限处理的文件：\" + sourceFile.FilePath);\r\n\t\t\t\tif (_sink.DecrementReference(sourceFile.FilePath) < 1) {\r\n\t\t\t\t\tpdf.Close();\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar ranges = PageRangeCollection.Parse(sourceFile.PageRanges, 1, pdf.NumberOfPages, true);\r\n\t\t\tvar pageRemapper = new int[pdf.NumberOfPages + 1];\r\n\t\t\tRectangle r;\r\n\t\t\t// 统一页面旋转角度\r\n\t\t\tif (_option.UnifyPageOrientation) {\r\n\t\t\t\tvar rv = _option.RotateVerticalPages;\r\n\t\t\t\tvar a = _option.RotateAntiClockwise ? -90 : 90;\r\n\t\t\t\tfor (int i = pdf.NumberOfPages; i > 0; i--) {\r\n\t\t\t\t\tvar p = pdf.GetPageN(i);\r\n\t\t\t\t\tr = p.GetPageVisibleRectangle();\r\n\t\t\t\t\tif (rv && r.Width < r.Height\r\n\t\t\t\t\t\t|| rv == false && r.Width > r.Height) {\r\n\t\t\t\t\t\tp.Put(PdfName.ROTATE, (r.Rotation + a) % 360);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (bookmark != null) {\r\n\t\t\t\tvar n = _writer.CurrentPageNumber + 1;\r\n\t\t\t\tif (_writer.PageEmpty) {\r\n\t\t\t\t\tn--;\r\n\t\t\t\t}\r\n\t\t\t\tbookmark.SetAttribute(Constants.DestinationAttributes.Page, n.ToText());\r\n\t\t\t\tbookmark.SetAttribute(Constants.DestinationAttributes.View, Constants.DestinationAttributes.ViewType.XYZ);\r\n\t\t\t\tr = pdf.GetPageN(ranges[0].StartValue).GetPageVisibleRectangle();\r\n\t\t\t\tfloat t = 0;\r\n\t\t\t\tswitch (r.Rotation % 360 / 90) {\r\n\t\t\t\t\tcase 0: t = r.Top; break;\r\n\t\t\t\t\tcase 1: t = r.Right; break;\r\n\t\t\t\t\tcase 2: t = r.Bottom; break;\r\n\t\t\t\t\tcase 3: t = r.Left; break;\r\n\t\t\t\t}\r\n\t\t\t\tbookmark.SetAttribute(Constants.Coordinates.Top, t.ToText());\r\n\t\t\t}\r\n\t\t\tbool importImagesOnly = sourceFile.ImportImagesOnly;\r\n\t\t\tint pn = pdf.NumberOfPages;\r\n\t\t\tImageExtractor imgExp = null;\r\n\t\t\tif (importImagesOnly) {\r\n\t\t\t\timgExp = new ImageExtractor(sourceFile.ExtractImageOptions);\r\n\t\t\t}\r\n\t\t\tif (_option.KeepBookmarks) {\r\n\t\t\t\tpdf.ConsolidateNamedDestinations();\r\n\t\t\t}\r\n\t\t\tvar pp = new byte[pdf.NumberOfPages + 1]; // 已处理过的页面\r\n\t\t\tvar cts = _pageSettings.PaperSize.SpecialSize != SpecialPaperSize.AsPageSize ? new CoordinateTranslationSettings[pdf.NumberOfPages + 1] : null; // 页面的位置偏移量\r\n\t\t\tforeach (var range in ranges) {\r\n\t\t\t\tforeach (var i in range) {\r\n\t\t\t\t\tif (i < 1 || i > pn) {\r\n\t\t\t\t\t\tgoto Exit;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (pageRemapper != null) {\r\n\t\t\t\t\t\tpageRemapper[i] = _writer.CurrentPageNumber;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_doc.NewPage();\r\n\t\t\t\t\tif (imgExp != null) {\r\n\t\t\t\t\t\timgExp.ExtractPageImages(pdf, i);\r\n\t\t\t\t\t\tforeach (var item in imgExp.InfoList) {\r\n\t\t\t\t\t\t\tif (item.FileName != null) {\r\n\t\t\t\t\t\t\t\tProcessFile(new SourceItem.Image(item.FileName), bookmark);\r\n\t\t\t\t\t\t\t\tFile.Delete(item.FileName);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (pp[i] == 0) {\r\n\t\t\t\t\t\t\tvar page = pdf.GetPageN(i);\r\n\t\t\t\t\t\t\t//if (DocInfoImporter.RemovePageAdditionalInfo (_docSettings, page)) {\r\n\t\t\t\t\t\t\t//    pdf.ResetReleasePage ();\r\n\t\t\t\t\t\t\t//}\r\n\t\t\t\t\t\t\t//if (_docSettings.AutoMaskBWImages) {\r\n\t\t\t\t\t\t\t//    SetBWImageMask (page);\r\n\t\t\t\t\t\t\t//    pdf.ResetReleasePage ();\r\n\t\t\t\t\t\t\t//}\r\n\t\t\t\t\t\t\t//PdfHelper.ClearPageLinks (pdf, i);\r\n\t\t\t\t\t\t\tif (_pageSettings.PaperSize.SpecialSize != SpecialPaperSize.AsPageSize) {\r\n\t\t\t\t\t\t\t\tpdf.ResetReleasePage();\r\n\t\t\t\t\t\t\t\tvar ct = PageDimensionProcessor.ResizePage(page, _pageSettings, null);\r\n\t\t\t\t\t\t\t\tif (_pageSettings.ScaleContent) {\r\n\t\t\t\t\t\t\t\t\tPageDimensionProcessor.ScaleContent(pdf, i, ct);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (cts != null) {\r\n\t\t\t\t\t\t\t\t\tcts[i] = ct;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tpdf.ResetReleasePage();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t//var og = new OperatorGroup (null);\r\n\t\t\t\t\t\t\t//if (_docSettings.FixContents) {\r\n\t\t\t\t\t\t\t//    og.Operators.Add (PdfContentStreamProcessor.NopOperator);\r\n\t\t\t\t\t\t\t//}\r\n\t\t\t\t\t\t\t//if (og.Operators.Count > 0) {\r\n\t\t\t\t\t\t\t//    var cp = new PdfPageCommandProcessor ();\r\n\t\t\t\t\t\t\t//    cp.ProcessContent (cb ?? pdf.GetPageContent (i), pdf.GetPageN (i).GetAsDict (PdfName.RESOURCES));\r\n\t\t\t\t\t\t\t//    cp.WritePdfCommands (pdf, i);\r\n\t\t\t\t\t\t\t//}\r\n\r\n\t\t\t\t\t\t\tpp[i] = 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_writer.AddPage(_writer.GetImportedPage(pdf, i));\r\n\t\t\t\t\t}\r\n\t\t\t\tExit:\r\n\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tr = pdf.GetPageNRelease(ranges[ranges.Count - 1].EndValue).GetPageVisibleRectangle();\r\n\t\t\tr.Normalize();\r\n\t\t\t_doc.SetPageSize(r);\r\n\t\t\t_portrait = r.Height > r.Width;\r\n\t\t\t_content.Width = r.Width;\r\n\t\t\t_content.Height = r.Height;\r\n\t\t\tif (_option.ExtraEmptyPageForOddPdf && imgExp == null && ranges.TotalPages % 2 == 1) {\r\n\t\t\t\t_writer.AddPage(new Rectangle(r.Width, r.Height, 0), 0);\r\n\t\t\t}\r\n\t\t\tif (_option.KeepBookmarks) {\r\n\t\t\t\tbookmark = KeepBookmarks(bookmark, pdf, pageRemapper, cts);\r\n\t\t\t}\r\n\t\t\tif (_sink.DecrementReference(sourceFile.FilePath) < 1) {\r\n\t\t\t\t_writer.FreeReader(pdf);\r\n\t\t\t\tpdf.Close();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tBookmarkContainer KeepBookmarks(BookmarkContainer bookmark, PdfReader pdf, int[] pageRemapper, CoordinateTranslationSettings[] cts) {\r\n\t\t\tvar bm = OutlineManager.GetBookmark(pdf, new UnitConverter() { Unit = Constants.Units.Point });\r\n\t\t\tvar processors = new List<IInfoDocProcessor>();\r\n\t\t\tif (_option.ViewerPreferences.CollapseBookmark != BookmarkStatus.AsIs) {\r\n\t\t\t\tprocessors.Add(new CollapseBookmarkProcessor() { BookmarkStatus = _option.ViewerPreferences.CollapseBookmark });\r\n\t\t\t}\r\n\t\t\tif (_option.ViewerPreferences.RemoveZoomRate) {\r\n\t\t\t\tprocessors.Add(new RemoveZoomRateProcessor());\r\n\t\t\t}\r\n\t\t\tif (_option.ViewerPreferences.ForceInternalLink) {\r\n\t\t\t\tprocessors.Add(new ForceInternalDestinationProcessor());\r\n\t\t\t}\r\n\t\t\tprocessors.Add(new GotoDestinationProcessor() {\r\n\t\t\t\tRemoveOrphanDestination = _option.RemoveOrphanBookmarks,\r\n\t\t\t\tPageRemapper = pageRemapper,\r\n\t\t\t\tTransitionMapper = cts\r\n\t\t\t});\r\n\t\t\tProcessInfoItem(bm, processors);\r\n\t\t\tif (bookmark != null) {\r\n\t\t\t\tbookmark.SetAttribute(Constants.BookmarkAttributes.Open,\r\n\t\t\t\t\t_option.ViewerPreferences.CollapseBookmark == BookmarkStatus.CollapseAll\r\n\t\t\t\t\t\t? Constants.Boolean.False : Constants.Boolean.True);\r\n\t\t\t}\r\n\t\t\telse if (PdfBookmarks != null) {\r\n\t\t\t\tbookmark = PdfBookmarks.BookmarkRoot;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn bookmark;\r\n\t\t\t}\r\n\t\t\tif (bm != null) {\r\n\t\t\t\tXmlNode c;\r\n\t\t\t\twhile ((c = bm.FirstChild) != null) {\r\n\t\t\t\t\tif (c.NodeType == XmlNodeType.Element) {\r\n\t\t\t\t\t\tbookmark.AppendChild(bookmark.OwnerDocument.ImportNode(c, true));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbm.RemoveChild(c);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn bookmark;\r\n\t\t}\r\n\r\n\t\tinternal static void ProcessInfoItem(XmlElement item, ICollection<IInfoDocProcessor> processors) {\r\n\t\t\tif (item == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tforeach (var p in processors) {\r\n\t\t\t\tp.Process(item);\r\n\t\t\t}\r\n\r\n\t\t\tvar c = item.FirstChild;\r\n\t\t\tXmlNode r;\r\n\t\t\tXmlElement ce;\r\n\t\t\twhile (c != null) {\r\n\t\t\t\tce = c as XmlElement;\r\n\t\t\t\tr = c.PreviousSibling;\r\n\t\t\t\tif (ce != null) {\r\n\t\t\t\t\tProcessInfoItem(ce, processors);\r\n\t\t\t\t}\r\n\t\t\t\tif (c.ParentNode == null) {\r\n\t\t\t\t\t// 节点在处理过程中被删除\r\n\t\t\t\t\tc = r != null ? r.NextSibling : item.FirstChild;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tc = c.NextSibling;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//internal static void SetBWImageMask (PdfDictionary page) {\r\n\t\t//    var xo = PdfHelper.Locate<PdfDictionary> (page, true, PdfName.RESOURCES, PdfName.XOBJECT);\r\n\t\t//    foreach (var item in xo) {\r\n\t\t//        var o = PdfReader.GetPdfObject (item.Value) as PdfDictionary;\r\n\t\t//        if (o == null\r\n\t\t//            || PdfName.IMAGE.Equals(o.Get(PdfName.SUBTYPE)) == false\r\n\t\t//            || PdfHelper.ValueIs (o.GetAsBoolean (PdfName.IMAGEMASK), true)\r\n\t\t//            || PdfHelper.ValueIs (o.GetAsNumber (PdfName.BITSPERCOMPONENT), 1) == false) {\r\n\t\t//            continue;\r\n\t\t//        }\r\n\t\t//        o.Put (PdfName.IMAGEMASK, PdfBoolean.PDFTRUE);\r\n\t\t//        o.Remove (PdfName.MASK);\r\n\t\t//        var cs = o.GetAsArray (PdfName.COLORSPACE);\r\n\t\t//        if (cs != null && cs.Size == 4\r\n\t\t//            && PdfHelper.ValueIs (cs.GetAsName (0), PdfName.INDEXED)\r\n\t\t//            && PdfHelper.ValueIs (cs.GetAsName (1), PdfName.DEVICERGB)\r\n\t\t//            && PdfHelper.ValueIs (cs.GetAsNumber (2), 1)) {\r\n\t\t//            PdfObject cl = cs.GetDirectObject (3);\r\n\t\t//            byte[] l = null;\r\n\t\t//            if (cs.IsString ()) {\r\n\t\t//                l = (cl as PdfString).GetOriginalBytes ();\r\n\t\t//            }\r\n\t\t//            else if (cs.IsStream ()) {\r\n\t\t//                l = PdfReader.GetStreamBytes (cl as PRStream);\r\n\t\t//            }\r\n\t\t//            Array.Resize (ref l, 6);\r\n\t\t//            if (l[0] == 0xFF) {\r\n\r\n\t\t//            }\r\n\t\t//        }\r\n\t\t//        o.Remove (PdfName.COLORSPACE);\r\n\t\t//    }\r\n\t\t//}\r\n\r\n\t\tstatic iTextImage LoadImage(SourceItem sourceFile, string ext) {\r\n\t\t\tvar imageItem = sourceFile as SourceItem.Image;\r\n\t\t\tvar cropOptions = imageItem.Cropping;\r\n\t\t\tif (imageItem == null || cropOptions.NeedCropping == false) {\r\n\t\t\t\treturn Image.GetInstance(sourceFile.FilePath.ToString());\r\n\t\t\t}\r\n\t\t\text = ext.ToLowerInvariant();\r\n\t\t\tusing (var fi = new FreeImageBitmap(sourceFile.FilePath)) {\r\n\t\t\t\tif (fi.Height < cropOptions.MinHeight // 不满足尺寸限制\r\n\t\t\t\t\t|| fi.Width < cropOptions.MinWidth\r\n\t\t\t\t\t|| fi.Height <= cropOptions.Top + cropOptions.Bottom // 裁剪后尺寸小于 0\r\n\t\t\t\t\t|| fi.Width <= cropOptions.Left + cropOptions.Right\r\n\t\t\t\t\t) {\r\n\t\t\t\t\treturn Image.GetInstance(sourceFile.FilePath.ToString());\r\n\t\t\t\t}\r\n\t\t\t\tif (ext == Constants.FileExtensions.Jpg || ext == Constants.FileExtensions.Jpeg) {\r\n\t\t\t\t\t// is JPEG file\r\n\t\t\t\t\tvar t = sourceFile.FilePath.EnsureExtension(Constants.FileExtensions.Jpg);\r\n\t\t\t\t\tif (FreeImageBitmap.JPEGCrop(sourceFile.FilePath, t, cropOptions.Left, cropOptions.Top, fi.Width - cropOptions.Right, fi.Height - cropOptions.Bottom)) {\r\n\t\t\t\t\t\tiTextImage image;\r\n\t\t\t\t\t\tusing (var fs = new FileStream(t, FileMode.Open)) {\r\n\t\t\t\t\t\t\timage = Image.GetInstance(fs);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tFile.Delete(t);\r\n\t\t\t\t\t\treturn image;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tusing (var tmp = fi.Copy(cropOptions.Left, cropOptions.Top, fi.Width - cropOptions.Right, fi.Height - cropOptions.Bottom))\r\n\t\t\t\tusing (MemoryStream ms = new MemoryStream()) {\r\n\t\t\t\t\ttmp.Save(ms, fi.ImageFormat);\r\n\t\t\t\t\tms.Flush();\r\n\t\t\t\t\tms.Position = 0;\r\n\t\t\t\t\treturn Image.GetInstance(ms);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tBookmarkElement CreateAutoBookmark(SourceItem sourceFile, XmlElement bookmarkContainer) {\r\n\t\t\tif (PdfBookmarks == null\r\n\t\t\t\t|| sourceFile.Bookmark == null\r\n\t\t\t\t|| String.IsNullOrEmpty(sourceFile.Bookmark.Title)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar b = PdfBookmarks.CreateBookmark(sourceFile.Bookmark);\r\n\t\t\tbookmarkContainer.AppendChild(b);\r\n\t\t\treturn b;\r\n\t\t}\r\n\r\n\t\tvoid AddImage(iTextImage image) {\r\n\t\t\tif (_option.AutoMaskBWImages && image.Bpc == 1 && image.IsMaskCandidate()) {\r\n\t\t\t\timage.MakeMask();\r\n\t\t\t}\r\n\t\t\timage.ScalePercent(72f / image.DpiX.SubstituteDefault(72) * 100f, 72f / image.DpiY.SubstituteDefault(72) * 100f);\r\n\t\t\tif (_content.SpecialSize == SpecialPaperSize.AsPageSize) {\r\n\t\t\t\t_doc.SetPageSize(new Rectangle(image.ScaledWidth + _doc.LeftMargin + _doc.RightMargin, image.ScaledHeight + _doc.TopMargin + _doc.BottomMargin));\r\n\t\t\t}\r\n\t\t\telse if (_content.SpecialSize == SpecialPaperSize.FixedWidthAutoHeight) {\r\n\t\t\t\tif ((scaleDown && image.ScaledWidth > _content.Width) ||\r\n\t\t\t\t\t(scaleUp && image.ScaledWidth < _content.Width)) {\r\n\t\t\t\t\timage.ScaleToFit(_content.Width, 999999);\r\n\t\t\t\t}\r\n\t\t\t\t_doc.SetPageSize(new Rectangle(_content.Width, image.ScaledHeight + _doc.TopMargin + _doc.BottomMargin));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (_autoRotate\r\n\t\t\t\t\t&& (// 页面不足以放下当前尺寸的图片\r\n\t\t\t\t\t\t(image.ScaledHeight > _content.Height || image.ScaledWidth > _content.Width)\r\n\t\t\t\t\t\t\t&& (image.ScaledWidth > image.ScaledHeight && _portrait == true\r\n\t\t\t\t\t\t\t\t|| image.ScaledHeight > image.ScaledWidth && _portrait == false)\r\n\t\t\t\t\t\t||\r\n\t\t\t\t\t\t// 图片较小，可以还原为原始的页面方向\r\n\t\t\t\t\t\t(_portrait != image.Height > image.Width\r\n\t\t\t\t\t\t\t&& image.ScaledHeight <= _content.Height && image.ScaledWidth <= _content.Width\r\n\t\t\t\t\t\t\t&& image.ScaledHeight <= _content.Width && image.ScaledWidth <= _content.Height)\r\n\t\t\t\t\t)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\tvar t = _content.Height;\r\n\t\t\t\t\t_content.Height = _content.Width;\r\n\t\t\t\t\t_content.Width = t;\r\n\t\t\t\t\t_doc.SetPageSize(new Rectangle(_doc.PageSize.Height, _doc.PageSize.Width));\r\n\t\t\t\t\tif (areMarginsEqual == false) {\r\n\t\t\t\t\t\tif (_portrait) {\r\n\t\t\t\t\t\t\t_doc.SetMargins(_doc.BottomMargin, _doc.TopMargin, _doc.LeftMargin, _doc.RightMargin);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t_doc.SetMargins(_doc.TopMargin, _doc.BottomMargin, _doc.RightMargin, _doc.LeftMargin);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_portrait = !_portrait;\r\n\t\t\t\t}\r\n\t\t\t\tif ((scaleDown && (image.ScaledHeight > _content.Height || image.ScaledWidth > _content.Width))\r\n\t\t\t\t\t|| (scaleUp && image.ScaledHeight < _content.Height && image.ScaledWidth < _content.Width)) {\r\n\t\t\t\t\timage.ScaleToFit(_content.Width, _content.Height);\r\n\t\t\t\t}\r\n\t\t\t\tfloat px = 0, py = 0;\r\n\t\t\t\tif (hAlign == HorizontalAlignment.Center) {\r\n\t\t\t\t\tpx = (_content.Width - image.ScaledWidth) / 2f;\r\n\t\t\t\t}\r\n\t\t\t\telse if (hAlign == HorizontalAlignment.Right) {\r\n\t\t\t\t\tpx = _content.Width - image.ScaledWidth;\r\n\t\t\t\t}\r\n\t\t\t\tif (vAlign == VerticalAlignment.Middle) {\r\n\t\t\t\t\tpy = (_content.Height - image.ScaledHeight) / 2f;\r\n\t\t\t\t}\r\n\t\t\t\telse if (vAlign == VerticalAlignment.Top) {\r\n\t\t\t\t\tpy = _content.Height - image.ScaledHeight;\r\n\t\t\t\t}\r\n\t\t\t\timage.SetAbsolutePosition(_doc.LeftMargin + px, _doc.BottomMargin + py);\r\n\t\t\t}\r\n\t\t\t_doc.NewPage();\r\n\t\t\t_doc.Add(image);\r\n\t\t\t_doc.NewPage();\r\n\t\t}\r\n\r\n\t\tstatic Image LoadImageFrame(SourceItem.Image source, bool recompressWithJbig2, ref FreeImageBitmap fi) {\r\n\t\t\tiTextImage image;\r\n\t\t\tvar cropOptions = source.Cropping;\r\n\t\t\tFREE_IMAGE_FORMAT format;\r\n\t\t\tif (fi.ImageFormat == FREE_IMAGE_FORMAT.FIF_GIF\r\n\t\t\t\t|| fi.InfoHeader.biCompression == FreeImage.BI_PNG) {\r\n\t\t\t\tformat = FREE_IMAGE_FORMAT.FIF_PNG;\r\n\t\t\t}\r\n\t\t\telse if (fi.ColorDepth > 8\r\n\t\t\t\t&& fi.ColorType == FREE_IMAGE_COLOR_TYPE.FIC_RGB\r\n\t\t\t\t&& fi.HasPalette == false\r\n\t\t\t\t&& __JpgFormats.Contains(fi.PixelFormat)\r\n\t\t\t\t&& (fi.ImageFormat != FREE_IMAGE_FORMAT.FIF_TIFF || fi.InfoHeader.biCompression != 0)) {\r\n\t\t\t\tformat = FREE_IMAGE_FORMAT.FIF_JPEG;\r\n\t\t\t}\r\n\t\t\telse if (fi.PixelFormat == PixelFormat.Format1bppIndexed && fi.ImageFormat != FREE_IMAGE_FORMAT.FIF_TIFF && recompressWithJbig2 == false) {\r\n\t\t\t\tformat = FREE_IMAGE_FORMAT.FIF_TIFF;\r\n\t\t\t}\r\n\t\t\telse if (fi.ColorDepth > 8) {\r\n\t\t\t\tformat = FREE_IMAGE_FORMAT.FIF_PNG;\r\n\t\t\t}\r\n\t\t\telse if (fi.InfoHeader.biCompression == FreeImage.BI_JPEG) {\r\n\t\t\t\tformat = FREE_IMAGE_FORMAT.FIF_JPEG;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tformat = fi.ImageFormat;\r\n\t\t\t}\r\n\t\t\tusing (MemoryStream ms = new MemoryStream()) {\r\n\t\t\t\tif (cropOptions.NeedCropping\r\n\t\t\t\t\t&& (fi.Height < cropOptions.MinHeight // 不满足尺寸限制\r\n\t\t\t\t\t\t|| fi.Width < cropOptions.MinWidth\r\n\t\t\t\t\t\t|| fi.Height <= cropOptions.Top + cropOptions.Bottom // 裁剪后尺寸小于 0\r\n\t\t\t\t\t\t|| fi.Width <= cropOptions.Left + cropOptions.Right) == false) {\r\n\t\t\t\t\tvar temp = fi.Copy(cropOptions.Left, cropOptions.Top, fi.Width - cropOptions.Right, fi.Height - cropOptions.Bottom);\r\n\t\t\t\t\ttemp.Save(ms, format);\r\n\t\t\t\t\tfi.Dispose();\r\n\t\t\t\t\tfi = temp;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tfi.Save(ms, format);\r\n\t\t\t\t}\r\n\t\t\t\tms.Flush();\r\n\t\t\t\tms.Position = 0;\r\n\t\t\t\tif (recompressWithJbig2 && fi.PixelFormat == PixelFormat.Format1bppIndexed) {\r\n\t\t\t\t\timage = iTextImage.GetInstance(fi.Width, fi.Height, Imaging.JBig2Encoder.Encode(fi), null);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\timage = iTextImage.GetInstance(ms.ToArray(), true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (IndexOutOfRangeException) {\r\n\t\t\t\t\t\t// 在某些场合下 FreeImage 保存的流无法被读取，尝试读原始文件，让 iTextImage 自行解析\r\n\t\t\t\t\t\timage = iTextImage.GetInstance(source.FilePath.ReadAllBytes(), true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (fi.HorizontalResolution != fi.VerticalResolution) {\r\n\t\t\t\timage.SetDpi(fi.HorizontalResolution.ToInt32(), fi.VerticalResolution.ToInt32());\r\n\t\t\t}\r\n\t\t\treturn image;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing iTextSharp.text.pdf;\r\nusing MuPDF.Extensions;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal static class PdfHelper\r\n\t{\r\n\t\tinternal static readonly int[] CompoundTypes = new int[] { PdfObject.DICTIONARY, PdfObject.ARRAY, PdfObject.STREAM };\r\n\r\n\t\tstatic readonly DualKeyDictionary<PdfName, string> __PdfNameMap;\r\n\t\tstatic readonly Dictionary<string, byte[]> __PdfPasswordCache = new Dictionary<string, byte[]>(StringComparer.OrdinalIgnoreCase);\r\n\t\tstatic bool __SuppressUnethicalWarning;\r\n\r\n\t\t/// <summary>\r\n\t\t/// 切换强制读取加密文档模式。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"unethicalreading\">是否打开强制读取模式。</param>\r\n\t\tinternal static void ToggleUnethicalMode(bool unethicalreading) {\r\n\t\t\tPdfReader.unethicalreading = unethicalreading;\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 切换容错模式（忽略 PDF 文档的错误）。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"debugMode\">是否打开容错模式。</param>\r\n\t\tinternal static void ToggleReaderDebugMode(bool debugMode) {\r\n\t\t\tPdfReader.debugmode = debugMode;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 打开 PDF 文件，在有需要时提示输入密码。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sourceFile\">需要打开的 PDF 文件。</param>\r\n\t\t/// <param name=\"partial\">是否仅打开文件的部分内容。</param>\r\n\t\t/// <returns><see cref=\"PdfReader\"/> 实例。</returns>\r\n\t\tinternal static PdfReader OpenPdfFile(string sourceFile, bool partial, bool removeUnusedObjects) {\r\n\t\t\tbyte[] password;\r\n\t\t\t__PdfPasswordCache.TryGetValue(sourceFile, out password);\r\n\t\t\twhile (true) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (File.Exists(sourceFile) == false) {\r\n\t\t\t\t\t\tthrow new FileNotFoundException($\"找不到文件：{sourceFile}\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\tPdfReader r;\r\n\t\t\t\t\tif (partial) {\r\n\t\t\t\t\t\tr = new PdfReader(new RandomAccessFileOrArray(sourceFile), password);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tr = new PdfReader(sourceFile, password);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (password != null && password.Length > 0) {\r\n\t\t\t\t\t\t__PdfPasswordCache[sourceFile] = password;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (removeUnusedObjects) {\r\n\t\t\t\t\t\tr.RemoveUnusedObjects();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn r;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (iTextSharp.text.exceptions.BadPasswordException) {\r\n\t\t\t\t\tvar f = new PasswordEntryForm(sourceFile);\r\n\t\t\t\t\tif (f.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) {\r\n\t\t\t\t\t\tthrow new iTextSharp.text.exceptions.BadPasswordException(\"密码错误，没有权限打开 PDF 文件。\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpassword = Encoding.Default.GetBytes(f.Password);\r\n\t\t\t\t}\r\n\t\t\t\tcatch (iTextSharp.text.exceptions.InvalidPdfException ex) {\r\n\t\t\t\t\tFormHelper.ErrorBox($\"PDF 文档已经损坏，或使用了不支持的加密方式：{ex.Message}\");\r\n\t\t\t\t\tthrow;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static bool ConfirmUnethicalMode(this PdfReader pdf) {\r\n\t\t\tToggleUnethicalMode(false);\r\n\t\t\tvar r = pdf.IsOpenedWithFullPermissions\r\n\t\t\t\t\t|| __SuppressUnethicalWarning\r\n\t\t\t\t\t|| FormHelper.ConfirmOKBox(Messages.UserRightRequired);\r\n\t\t\tToggleUnethicalMode(true);\r\n\t\t\tif (__SuppressUnethicalWarning == false && FormHelper.IsCtrlKeyDown) {\r\n\t\t\t\t__SuppressUnethicalWarning = true;\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 有些奇怪的 PDF 会让 Root 和 Info 共用一个对象，\r\n\t\t/// 这将导致处理后的文档无法读取，应将其复制成副本，分别修改。\r\n\t\t/// </summary>\r\n\t\tinternal static void SeparateConjoinedRootAndInfo(this PdfReader pdf) {\r\n\t\t\tif (pdf.Catalog == pdf.Trailer.GetAsDict(PdfName.INFO)) {\r\n\t\t\t\tvar d = new PdfDictionary();\r\n\t\t\t\tpdf.Trailer.Put(PdfName.INFO, d);\r\n\t\t\t\td.Merge(pdf.Catalog);\r\n\t\t\t\td.Put(PdfName.TYPE, PdfName.INFO);\r\n\t\t\t\td.Remove(PdfName.PAGES);\r\n\t\t\t\td.Remove(PdfName.OUTLINES);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static MuPDF.Document OpenMuDocument(string sourceFile) {\r\n\t\t\tvar d = MuPDF.Document.Open(sourceFile);\r\n\t\t\tif (d.NeedsPassword) {\r\n\t\t\t\tvar authenticated = false;\r\n\t\t\t\tif (__PdfPasswordCache.TryGetValue(sourceFile, out byte[] password)) {\r\n\t\t\t\t\tauthenticated = d.CheckPassword(password != null ? Encoding.Default.GetString(password) : String.Empty);\r\n\t\t\t\t}\r\n\t\t\t\twhile (authenticated == false) {\r\n\t\t\t\t\tusing (var f = new PasswordEntryForm(sourceFile)) {\r\n\t\t\t\t\t\tif (f.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) {\r\n\t\t\t\t\t\t\tthrow new iTextSharp.text.exceptions.BadPasswordException(\"密码错误，没有权限打开 PDF 文件。\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t__PdfPasswordCache[sourceFile] = password = Encoding.Default.GetBytes(f.Password);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tauthenticated = d.CheckPassword(password != null ? Encoding.Default.GetString(password) : String.Empty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn d;\r\n\t\t}\r\n\r\n\t\tstatic PdfHelper() {\r\n\t\t\t__PdfNameMap = InitPdfNameMap();\r\n\t\t}\r\n\r\n\t\tstatic DualKeyDictionary<PdfName, string> InitPdfNameMap() {\r\n\t\t\tvar m = new DualKeyDictionary<PdfName, string> {\r\n\t\t\t\t{ PdfName.PAGELAYOUT, Constants.PageLayout },\r\n\r\n\t\t\t\t{ PdfName.PAGEMODE, Constants.PageMode },\r\n\r\n\t\t\t\t{ PdfName.DIRECTION, Constants.ViewerPreferencesType.Direction },\r\n\r\n\t\t\t\t{ PdfName.ST, Constants.PageLabelsAttributes.StartPage },\r\n\t\t\t\t{ PdfName.P, Constants.PageLabelsAttributes.Prefix },\r\n\t\t\t\t{ PdfName.S, Constants.PageLabelsAttributes.Style },\r\n\r\n\t\t\t\t{ PdfName.XYZ, Constants.DestinationAttributes.ViewType.XYZ },\r\n\t\t\t\t{ PdfName.FIT, Constants.DestinationAttributes.ViewType.Fit },\r\n\t\t\t\t{ PdfName.FITB, Constants.DestinationAttributes.ViewType.FitB },\r\n\t\t\t\t{ PdfName.FITBH, Constants.DestinationAttributes.ViewType.FitBH },\r\n\t\t\t\t{ PdfName.FITBV, Constants.DestinationAttributes.ViewType.FitBV },\r\n\t\t\t\t{ PdfName.FITH, Constants.DestinationAttributes.ViewType.FitH },\r\n\t\t\t\t{ PdfName.FITR, Constants.DestinationAttributes.ViewType.FitR },\r\n\t\t\t\t{ PdfName.FITV, Constants.DestinationAttributes.ViewType.FitV },\r\n\r\n\t\t\t\t{ PdfName.GOTO, Constants.ActionType.Goto },\r\n\t\t\t\t{ PdfName.GOTOR, Constants.ActionType.GotoR },\r\n\t\t\t\t{ PdfName.LAUNCH, Constants.ActionType.Launch },\r\n\t\t\t\t{ PdfName.URI, Constants.ActionType.Uri }\r\n\t\t\t};\r\n\r\n\t\t\treturn m;\r\n\t\t}\r\n\r\n\t\tinternal static string GetTypeName(int t) {\r\n\t\t\tswitch (t) {\r\n\t\t\t\tcase PdfObject.ARRAY: return \"array\";\r\n\t\t\t\tcase PdfObject.BOOLEAN: return \"bool\";\r\n\t\t\t\tcase PdfObject.DICTIONARY: return \"dictionary\";\r\n\t\t\t\tcase PdfObject.INDIRECT: return \"reference\";\r\n\t\t\t\tcase PdfObject.NAME: return \"name\";\r\n\t\t\t\tcase PdfObject.NULL: return \"null\";\r\n\t\t\t\tcase PdfObject.NUMBER: return \"number\";\r\n\t\t\t\tcase PdfObject.STREAM: return \"stream\";\r\n\t\t\t\tcase PdfObject.STRING: return \"string\";\r\n\t\t\t\tdefault: return String.Empty;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取友好的 PdfName 文本。\r\n\t\t/// </summary>\r\n\t\tinternal static string GetPdfFriendlyName(PdfName name) {\r\n\t\t\treturn (__PdfNameMap.ContainsKey(name) ? __PdfNameMap[name] : GetPdfNameString(name));\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 解析 PdfName。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"friendlyName\">从 <seealso cref=\"GetPdfFriendlyName\"/> 转换所得的 PdfName 说明文本。</param>\r\n\t\t/// <returns>与文本说明对应的 PdfName。</returns>\r\n\t\tinternal static PdfName ResolvePdfName(string friendlyName) {\r\n\t\t\treturn (__PdfNameMap.ContainsValue(friendlyName) ? __PdfNameMap.GetKeyByValue(friendlyName) : new PdfName(friendlyName));\r\n\t\t}\r\n\r\n\t\tinternal static string DecodeKeyName(object name) {\r\n\t\t\treturn name is PdfName ? PdfName.DecodeName(name.ToString()) : name.ToString();\r\n\t\t}\r\n\r\n\t\tinternal static string GetFriendlyValue(this PdfString s) {\r\n\t\t\tvar bytes = s.GetOriginalBytes();\r\n\t\t\tif (s.IsHexWriting()) {\r\n\t\t\t\treturn \"<\" + bytes.ToHexBinString() + \">\";\r\n\t\t\t}\r\n\t\t\tif (bytes.All(i => i < 127)) {\r\n\t\t\t\treturn Encoding.ASCII.GetString(bytes);\r\n\t\t\t}\r\n\t\t\tvar sb = new StringBuilder(bytes.Length + 10);\r\n\t\t\tbool h = false;\r\n\t\t\tforeach (var item in bytes) {\r\n\t\t\t\tif (item > 127) {\r\n\t\t\t\t\tif (!h) {\r\n\t\t\t\t\t\tsb.Append('<');\r\n\t\t\t\t\t\th = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsb.Append(item.ToHexBinString(true));\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (h) {\r\n\t\t\t\t\t\tsb.Append('>');\r\n\t\t\t\t\t\th = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsb.Append((char)item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (h) {\r\n\t\t\t\tsb.Append('>');\r\n\t\t\t}\r\n\t\t\treturn sb.ToString();\r\n\t\t}\r\n\r\n\t\tpublic static Dictionary<string, PdfObject> GetNamedDestinations(this PdfReader pdf) {\r\n\t\t\tvar d = pdf.GetNamedDestinationFromStrings();\r\n\t\t\tforeach (var item in pdf.GetNamedDestinationFromNames(false)) {\r\n\t\t\t\tif (item.Key is string name) {\r\n\t\t\t\t\td[name] = item.Value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn d;\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 获取 PDF 页面引用与页数的映射关系表。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"reader\">源 PDF 文档。</param>\r\n\t\t/// <returns>键为 <see cref=\"PdfIndirectReference\"/> 的数值，值为页数的字典。</returns>\r\n\t\tinternal static Dictionary<int, int> GetPageRefMapper(this PdfReader reader) {\r\n\t\t\tint numPages = reader.NumberOfPages;\r\n\t\t\tvar pages = new Dictionary<int, int>(numPages);\r\n\t\t\tfor (int k = 1; k <= numPages; ++k) {\r\n\t\t\t\tpages[reader.GetPageOrigRef(k).Number] = k;\r\n\t\t\t\treader.ReleasePage(k);\r\n\t\t\t}\r\n\t\t\treturn pages;\r\n\t\t}\r\n\r\n\t\t/// <summary>获取 <see cref=\"PdfWriter\"/> 实际写出的页数。</summary>\r\n\t\tpublic static int GetPageCount(this PdfWriter writer) {\r\n\t\t\treturn writer.PageEmpty ? writer.CurrentPageNumber - 1 : writer.CurrentPageNumber;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 解析形如“D:20111021090818+08'00'”的日期格式。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"date\">日期格式。</param>\r\n\t\t/// <returns></returns>\r\n\t\tinternal static DateTimeOffset ParseDateTime(string date) {\r\n\t\t\tif (date == null\r\n\t\t\t\t|| date.Length != 23 && date.Length != 16\r\n\t\t\t\t|| date.StartsWith(\"D:\") == false) {\r\n\t\t\t\treturn DateTimeOffset.MinValue;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\treturn new DateTimeOffset(\r\n\t\t\t\t\tdate.Take(2, 4).ToInt32(), date.Take(6, 2).ToInt32(), date.Take(8, 2).ToInt32(),\r\n\t\t\t\t\tdate.Take(10, 2).ToInt32(), date.Take(12, 2).ToInt32(), date.Take(14, 2).ToInt32(),\r\n\t\t\t\t\tnew TimeSpan(date.Take(16, 3).ToInt32(), date.Take(20, 2).ToInt32(), 0)\r\n\t\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\treturn DateTimeOffset.MinValue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取解码后的 PDF 名称字符串。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"name\">需要解码的 PDF 名称。</param>\r\n\t\t/// <returns>解码后的 PDF 名称字符串</returns>\r\n\t\tinternal static string GetPdfNameString(PdfName name) {\r\n\t\t\treturn GetPdfNameString(name, PdfName.DefaultEncoding);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取解码后的 PDF 名称字符串。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"name\">需要解码的 PDF 名称。</param>\r\n\t\t/// <param name=\"encoding\">用于解码的文本编码。</param>\r\n\t\t/// <returns>解码后的 PDF 名称字符串</returns>\r\n\t\tinternal static string GetPdfNameString(PdfName name, Encoding encoding) {\r\n\t\t\tvar s = name.ToString();\r\n\t\t\tint len = s.Length;\r\n\t\t\tvar buf = new byte[len];\r\n\t\t\tint l = 0;\r\n\t\t\tfor (int k = 1; k < len; ++k) {\r\n\t\t\t\tchar c = s[k];\r\n\t\t\t\tif (c == '#') {\r\n\t\t\t\t\tbuf[l] = (byte)((PRTokeniser.GetHex(s[++k]) << 4) + PRTokeniser.GetHex(s[++k]));\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf[l] = (byte)c;\r\n\t\t\t\t}\r\n\t\t\t\tl++;\r\n\t\t\t}\r\n\t\t\treturn (encoding ?? System.Text.Encoding.Default).GetString(buf, 0, l);\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取页面可见的边框。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"page\">页面字典。</param>\r\n\t\t/// <returns>页面的可见边框。</returns>\r\n\t\tinternal static iTextSharp.text.Rectangle GetPageVisibleRectangle(this PdfDictionary page) {\r\n\t\t\tPdfArray box;\r\n\t\t\tif (page == null\r\n\t\t\t\t|| ((box = page.GetAsArray(PdfName.CROPBOX)) == null || box.Size != 4)\r\n\t\t\t\t\t&& ((box = page.GetAsArray(PdfName.MEDIABOX)) == null || box.Size != 4)) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar c = new float[4];\r\n\t\t\tfor (int i = 0; i < 4; i++) {\r\n\t\t\t\tc[i] = box.GetAsNumber(i).FloatValue;\r\n\t\t\t}\r\n\t\t\tvar r = page.GetAsNumber(PdfName.ROTATE);\r\n\t\t\treturn r != null && r.IntValue != 0 && r.IntValue != 180\r\n\t\t\t\t? new iTextSharp.text.Rectangle(c[0], c[1], c[2], c[3], r.IntValue).Rotate()\r\n\t\t\t\t: new iTextSharp.text.Rectangle(c[0], c[1], c[2], c[3]);\r\n\t\t}\r\n\r\n\t\tinternal static void ClearPageLinks(this PdfReader r) {\r\n\t\t\tint pageCount = r.NumberOfPages + 1;\r\n\t\t\tfor (int i = 1; i < pageCount; i++) {\r\n\t\t\t\tClearPageLinks(r, i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ClearPageLinks(this PdfReader r, int pageNumber) {\r\n\t\t\tr.ResetReleasePage();\r\n\t\t\tvar pageDic = r.GetPageN(pageNumber);\r\n\t\t\tvar annots = (PdfArray)PdfReader.GetPdfObjectRelease(pageDic.Get(PdfName.ANNOTS));\r\n\t\t\tif (annots == null) {\r\n\t\t\t\tr.ReleasePage(pageNumber);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tIList<PdfObject> arr = annots.ArrayList;\r\n\t\t\t\tfor (int j = arr.Count - 1; j >= 0; j--) {\r\n\t\t\t\t\tvar item = arr[j];\r\n\t\t\t\t\tvar annot = (PdfDictionary)PdfReader.GetPdfObjectRelease(item);\r\n\t\t\t\t\tif (PdfName.LINK.Equals(annot.Get(PdfName.SUBTYPE))) {\r\n\t\t\t\t\t\tarr.RemoveAt(j);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (annots.ArrayList.Count == 0) {\r\n\t\t\t\t\tpageDic.Remove(PdfName.ANNOTS);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tr.ResetReleasePage();\r\n\t\t}\r\n\r\n\t\tinternal static string GetValidXmlString(string value) {\r\n\t\t\tif (String.IsNullOrEmpty(value)) {\r\n\t\t\t\treturn String.Empty;\r\n\t\t\t}\r\n\t\t\tvar marks = new List<int>(3);\r\n\t\t\tint p = 0;\r\n\t\t\tforeach (char c in value) {\r\n\t\t\t\tswitch (c) {\r\n\t\t\t\t\tcase '\\t':\r\n\t\t\t\t\tcase '\\r':\r\n\t\t\t\t\tcase '\\n':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t// invalid character\r\n\t\t\t\t\t\tif (Char.IsControl(c)) {\r\n\t\t\t\t\t\t\tif (marks.Count == 0) {\r\n\t\t\t\t\t\t\t\tmarks.Add(0);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tmarks.Add(p + 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tp++;\r\n\t\t\t}\r\n\t\t\tif (marks.Count > 0) {\r\n\t\t\t\tmarks.Add(value.Length + 1);\r\n\t\t\t}\r\n\t\t\tif (marks.Count > 1) {\r\n\t\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\t\tfor (int i = 1; i < marks.Count; i++) {\r\n\t\t\t\t\tif (i > 1) {\r\n\t\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsb.Append(value, marks[i - 1], marks[i] - 1 - marks[i - 1]);\r\n\t\t\t\t}\r\n\t\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static string GetArrayString(PdfArray array) {\r\n\t\t\treturn GetArrayString(array.ArrayList);\r\n\t\t}\r\n\r\n\t\tinternal static string GetArrayString(ICollection<PdfObject> array) {\r\n\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\tint k = 0;\r\n\t\t\tforeach (var item in array) {\r\n\t\t\t\tif (++k > 1) {\r\n\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t}\r\n\t\t\t\tif (item.Type == PdfObject.ARRAY) {\r\n\t\t\t\t\tsb.Append('[');\r\n\t\t\t\t\tsb.Append(GetArrayString(item as PdfArray));\r\n\t\t\t\t\tsb.Append(']');\r\n\t\t\t\t}\r\n\t\t\t\telse if (item.Type == PdfObject.DICTIONARY || item.Type == PdfObject.STREAM) {\r\n\t\t\t\t\tsb.Append(\"<<...>>\");\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsb.Append(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t}\r\n\r\n\t\tinternal static string GetNumericArrayString(PdfArray a, float unitFactor) {\r\n\t\t\tvar sb = StringBuilderCache.Acquire();\r\n\t\t\tfor (int k = 0; k < a.ArrayList.Count; k++) {\r\n\t\t\t\tif (k != 0) {\r\n\t\t\t\t\tsb.Append(' ');\r\n\t\t\t\t}\r\n\t\t\t\tif (a.GetAsArray(k) != null) {\r\n\t\t\t\t\tsb.Append('[');\r\n\t\t\t\t\tsb.Append(a.GetAsArray(k));\r\n\t\t\t\t\tsb.Append(']');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar o = a.ArrayList[k];\r\n\t\t\t\t\tsb.Append(o.Type == PdfObject.NUMBER ? UnitConverter.FromPoint(o.ToString(), unitFactor) : o.ToString());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn StringBuilderCache.GetStringAndRelease(sb);\r\n\t\t}\r\n\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, string value) {\r\n\t\t\tdict.Put(key, value.ToPdfString());\r\n\t\t}\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, int value) {\r\n\t\t\tdict.Put(key, new PdfNumber(value));\r\n\t\t}\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, double value) {\r\n\t\t\tdict.Put(key, new PdfNumber(value));\r\n\t\t}\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, float value) {\r\n\t\t\tdict.Put(key, new PdfNumber(value));\r\n\t\t}\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, bool value) {\r\n\t\t\tdict.Put(key, new PdfBoolean(value));\r\n\t\t}\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, float[] values) {\r\n\t\t\tdict.Put(key, new PdfArray(values));\r\n\t\t}\r\n\t\tinternal static void Put(this PdfDictionary dict, PdfName key, int[] values) {\r\n\t\t\tdict.Put(key, new PdfArray(values));\r\n\t\t}\r\n\r\n\t\tinternal static PdfDictionary CreateDictionaryPath(this PdfDictionary source, params PdfName[] path) {\r\n\t\t\tPdfDictionary d;\r\n\t\t\tforeach (var item in path) {\r\n\t\t\t\tif (source.Contains(item)) {\r\n\t\t\t\t\td = source.GetAsDict(item);\r\n\t\t\t\t\tif (d == null) {\r\n\t\t\t\t\t\tthrow new InvalidCastException(item.ToString() + \"不是 PdfDictionary。\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsource = d;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\td = new PdfDictionary();\r\n\t\t\t\tsource.Put(item, d);\r\n\t\t\t\tsource = d;\r\n\t\t\t\td = null;\r\n\t\t\t}\r\n\t\t\treturn source;\r\n\t\t}\r\n\r\n\t\tinternal static bool PdfReferencesAreEqual(PdfIndirectReference r1, PdfIndirectReference r2) {\r\n\t\t\tif (r1 == null || r2 == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn r1.Number == r2.Number && r1.Generation == r2.Generation;\r\n\t\t}\r\n\r\n\t\tinternal static int GetPageRotation(PdfDictionary page) {\r\n\t\t\treturn NormalizeRotationNumber(page.TryGetInt32(PdfName.ROTATE, 0));\r\n\t\t}\r\n\r\n\t\tinternal static int NormalizeRotationNumber(int rotation) {\r\n\t\t\tswitch (rotation) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\tcase 90:\r\n\t\t\t\tcase 180:\r\n\t\t\t\tcase 270:\r\n\t\t\t\t\treturn rotation;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\trotation = rotation % 90;\r\n\t\t\t\t\tif (rotation < 0) {\r\n\t\t\t\t\t\trotation += 360;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn (rotation / 90 * 90);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static IList<PdfObject> GetObjectDirectOrFromContainerArray(this PdfDictionary d, PdfName name, int pdfObjectType) {\r\n\t\t\tvar results = new List<PdfObject>();\r\n\r\n\t\t\tPdfObject tmp;\r\n\t\t\ttmp = d.Get(name);\r\n\t\t\tif (tmp == null) {\r\n\t\t\t}\r\n\t\t\telse if (tmp.Type == pdfObjectType) {\r\n\t\t\t\tresults.Add(tmp);\r\n\t\t\t}\r\n\t\t\telse if (tmp.Type == PdfObject.ARRAY) {\r\n\t\t\t\tvar a = tmp as PdfArray;\r\n\t\t\t\tfor (int i = 0; i < a.Size; i++) {\r\n\t\t\t\t\ttmp = a.GetDirectObject(i);\r\n\t\t\t\t\tif (tmp == null) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tmp.Type == pdfObjectType) {\r\n\t\t\t\t\t\tresults.Add(tmp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn results;\r\n\t\t}\r\n\r\n\t\tinternal static string MatrixToString(iTextSharp.text.pdf.parser.Matrix ctm) {\r\n\t\t\treturn String.Join(\" \", ctm[0].ToText(), ctm[1].ToText(), ctm[3].ToText(), ctm[4].ToText(), ctm[6].ToText(), ctm[7].ToText());\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 获取未使用对象的列表。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pdf\">需要检查的 PDF 文档。</param>\r\n\t\t/// <param name=\"partial\">待检查 PDF 文档是否为部分加载。</param>\r\n\t\t/// <returns>包含未使用对象索引值的列表。</returns>\r\n\t\tinternal static List<int> ListUnusedObjects(PdfReader pdf, bool partial) {\r\n\t\t\tvar hits = new bool[pdf.XrefSize];\r\n\t\t\tGetUnusedNode(pdf, partial, pdf.Trailer, hits);\r\n\t\t\tint i = 0;\r\n\t\t\tvar result = new List<int>();\r\n\t\t\tforeach (var item in hits) {\r\n\t\t\t\tif (item == false && i > 0) {\r\n\t\t\t\t\tresult.Add(i);\r\n\t\t\t\t}\r\n\t\t\t\t++i;\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tinternal static void SafeSetPageContent(this PdfReader pdf, int pageNumber, byte[] content) {\r\n\t\t\tvar p = pdf.GetPageN(pageNumber);\r\n\t\t\tvar c = p.GetDirectObject(PdfName.CONTENTS);\r\n\t\t\tif (c != null && c.IsArray()) {\r\n\t\t\t\tvar cs = new PRStream(pdf, content);\r\n\t\t\t\tif (content.Length > 30) {\r\n\t\t\t\t\tcs.FlateCompress();\r\n\t\t\t\t}\r\n\t\t\t\tp.Put(PdfName.CONTENTS, pdf.AddPdfObject(cs));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpdf.SetPageContent(pageNumber, content);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void GetUnusedNode(PdfReader pdf, bool partial, PdfObject obj, bool[] hits) {\r\n\t\t\tvar state = new Stack<object>();\r\n\t\t\tstate.Push(obj);\r\n\t\t\tint oc = pdf.XrefSize;\r\n\t\t\twhile (state.Count != 0) {\r\n\t\t\t\tvar current = state.Pop();\r\n\t\t\t\tif (current == null)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tList<PdfObject> ar = null;\r\n\t\t\t\tPdfDictionary dic = null;\r\n\t\t\t\tPdfName[] keys = null;\r\n\t\t\t\tObject[] objs = null;\r\n\t\t\t\tint idx = 0;\r\n\t\t\t\tif (current is PdfObject pdfObject) {\r\n\t\t\t\t\tobj = pdfObject;\r\n\t\t\t\t\tswitch (obj.Type) {\r\n\t\t\t\t\t\tcase PdfObject.DICTIONARY:\r\n\t\t\t\t\t\tcase PdfObject.STREAM:\r\n\t\t\t\t\t\t\tdic = (PdfDictionary)obj;\r\n\t\t\t\t\t\t\tkeys = new PdfName[dic.Size];\r\n\t\t\t\t\t\t\tdic.Keys.CopyTo(keys, 0);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase PdfObject.ARRAY:\r\n\t\t\t\t\t\t\tar = ((PdfArray)obj).ArrayList;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase PdfObject.INDIRECT:\r\n\t\t\t\t\t\t\tvar refi = (PRIndirectReference)obj;\r\n\t\t\t\t\t\t\tint num = refi.Number;\r\n\t\t\t\t\t\t\tif (!hits[num]) {\r\n\t\t\t\t\t\t\t\thits[num] = true;\r\n\t\t\t\t\t\t\t\tstate.Push(PdfReader.GetPdfObjectRelease(refi));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tobjs = (object[])current;\r\n\t\t\t\t\tif (objs[0] is List<PdfObject>) {\r\n\t\t\t\t\t\tar = (List<PdfObject>)objs[0];\r\n\t\t\t\t\t\tidx = (int)objs[1];\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tkeys = (PdfName[])objs[0];\r\n\t\t\t\t\t\tdic = (PdfDictionary)objs[1];\r\n\t\t\t\t\t\tidx = (int)objs[2];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (ar != null) {\r\n\t\t\t\t\tfor (int k = idx; k < ar.Count; ++k) {\r\n\t\t\t\t\t\tvar v = ar[k];\r\n\t\t\t\t\t\tif (v.IsIndirect()) {\r\n\t\t\t\t\t\t\tint num = ((PRIndirectReference)v).Number;\r\n\t\t\t\t\t\t\tif (num >= oc || (!partial && pdf.GetPdfObjectRelease(num) == null)) {\r\n\t\t\t\t\t\t\t\tar[k] = PdfNull.PDFNULL;\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (objs == null) {\r\n\t\t\t\t\t\t\tstate.Push(new object[] { ar, k + 1 });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tobjs[1] = k + 1;\r\n\t\t\t\t\t\t\tstate.Push(objs);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tstate.Push(v);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tfor (int k = idx; k < keys.Length; ++k) {\r\n\t\t\t\t\t\tvar key = keys[k];\r\n\t\t\t\t\t\tvar v = dic.Get(key);\r\n\t\t\t\t\t\tif (v.IsIndirect()) {\r\n\t\t\t\t\t\t\tint num = ((PRIndirectReference)v).Number;\r\n\t\t\t\t\t\t\tif (num >= oc || (!partial && pdf.GetPdfObjectRelease(num) == null)) {\r\n\t\t\t\t\t\t\t\tdic.Put(key, PdfNull.PDFNULL);\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (objs == null) {\r\n\t\t\t\t\t\t\tstate.Push(new object[] { keys, dic, k + 1 });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tobjs[2] = k + 1;\r\n\t\t\t\t\t\t\tstate.Push(objs);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tstate.Push(v);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfPageCommandProcessor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing Matrix = iTextSharp.text.pdf.parser.Matrix;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class PdfPageCommandProcessor : PdfContentStreamProcessor, IPdfPageCommandContainer\r\n\t{\r\n\t\treadonly Stack<EnclosingCommand> _commandStack = new Stack<EnclosingCommand>();\r\n\t\tEnclosingCommand _currentCommand;\r\n\t\tfloat _textWidth;\r\n\r\n\t\tpublic bool HasCommand => Commands.Count > 0;\r\n\t\t/// <summary>\r\n\t\t/// 分析内容后得到的 PDF 命令操作符及操作数列表。\r\n\t\t/// </summary>\r\n\t\tpublic IList<PdfPageCommand> Commands { get; } = new List<PdfPageCommand>();\r\n\t\tpublic string LastError { get; private set; }\r\n\r\n\t\tpublic PdfPageCommandProcessor() {\r\n\t\t\tPopulateOperators();\r\n\t\t\tRegisterContentOperator(\"TJ\", new AccumulatedShowTextArray());\r\n\t\t}\r\n\r\n\t\tpublic PdfPageCommandProcessor(PRStream form)\r\n\t\t\t: this() {\r\n\t\t\tProcessContent(PdfReader.GetStreamBytes(form), form.Locate<PdfDictionary>(PdfName.RESOURCES));\r\n\t\t}\r\n\r\n\t\tprotected override void DisplayPdfString(PdfString str) {\r\n\t\t\tvar gs = CurrentGraphicState;\r\n\t\t\tvar font = gs.Font;\r\n\t\t\tif (font == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tfloat totalWidth = 0;\r\n\t\t\tforeach (var c in font.DecodeText(str)) {\r\n\t\t\t\tvar w = font.GetWidth(c) / 1000.0f;\r\n\t\t\t\tvar wordSpacing = (c == ' ' ? gs.WordSpacing : 0f);\r\n\t\t\t\ttotalWidth += (w * gs.FontSize + gs.CharacterSpacing + wordSpacing) * gs.HorizontalScaling;\r\n\t\t\t}\r\n\r\n\t\t\t_textWidth = totalWidth;\r\n\t\t}\r\n\r\n\t\tprotected override void InvokeOperator(PdfLiteral oper, List<PdfObject> operands) {\r\n\t\t\tPdfPageCommand cmd;\r\n\t\t\ttry {\r\n\t\t\t\tbase.InvokeOperator(oper, operands);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tcmd = new InvalidCommand(oper, operands) {\r\n\t\t\t\t\tError = LastError = oper + \" \" + (ex is IndexOutOfRangeException ? \"指令参数不足\"\r\n\t\t\t\t\t\t: ex is ArgumentOutOfRangeException ? \"指令参数不足\"\r\n\t\t\t\t\t\t: ex is InvalidCastException ? \"指令参数类型不匹配\"\r\n\t\t\t\t\t\t: ex.Message)\r\n\t\t\t\t};\r\n\t\t\t\tgoto ADD_COMMAND;\r\n\t\t\t}\r\n\r\n\t\t\tswitch (oper.ToString()) {\r\n\t\t\t\tcase \"TJ\":\r\n\t\t\t\t\tcmd = new PaceAndTextCommand(oper, operands, GetTextInfo(new PdfString()), CurrentGraphicState.Font);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"Tj\":\r\n\t\t\t\tcase \"'\":\r\n\t\t\t\tcase \"\\\"\":\r\n\t\t\t\t\tcmd = new TextCommand(oper, operands, GetTextInfo(operands[0] as PdfString));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"Tf\":\r\n\t\t\t\t\tcmd = new FontCommand(oper, operands, CurrentGraphicState.Font.FontName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"cm\":\r\n\t\t\t\tcase \"Tm\":\r\n\t\t\t\t\tcmd = new MatrixCommand(oper, operands);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"Do\":\r\n\t\t\t\tcase \"S\":\r\n\t\t\t\tcase \"s\":\r\n\t\t\t\tcase \"F\":\r\n\t\t\t\tcase \"f\":\r\n\t\t\t\tcase \"f*\":\r\n\t\t\t\tcase \"B\":\r\n\t\t\t\tcase \"B*\":\r\n\t\t\t\tcase \"b\":\r\n\t\t\t\tcase \"b*\":\r\n\t\t\t\tcase \"n\":\r\n\t\t\t\t\tcmd = new OutputCommand(oper, operands);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"q\":\r\n\t\t\t\tcase \"BT\":\r\n\t\t\t\tcase \"BMC\":\r\n\t\t\t\tcase \"BDC\":\r\n\t\t\t\tcase \"BX\":\r\n\t\t\t\t\tcmd = new EnclosingCommand(oper, operands);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"Q\":\r\n\t\t\t\tcase \"ET\":\r\n\t\t\t\tcase \"EMC\":\r\n\t\t\t\tcase \"EX\":\r\n\t\t\t\t\t// 兼容结构异常的 PDF 文档（github: #121）\r\n\t\t\t\t\tif (_commandStack.Count > 0) {\r\n\t\t\t\t\t\t_commandStack.Pop();\r\n\t\t\t\t\t\t_currentCommand = _commandStack.Count > 0 ? _commandStack.Peek() : null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t_currentCommand = null;\r\n\t\t\t\t\t\tcmd = new InvalidCommand(oper, operands) { Error = \"嵌套指令不配对\" };\r\n\t\t\t\t\t\tgoto ADD_COMMAND;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\tcase \"BI\":\r\n\t\t\t\t\tcmd = new InlineImageCommand(oper, operands);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tcmd = new AdjustCommand(oper, operands);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tADD_COMMAND:\r\n\t\t\tif (_currentCommand != null) {\r\n\t\t\t\t_currentCommand.Commands.Add(cmd);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tCommands.Add(cmd);\r\n\t\t\t}\r\n\t\t\tif (cmd is EnclosingCommand ec) {\r\n\t\t\t\t_commandStack.Push(ec);\r\n\t\t\t\t_currentCommand = ec;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 <see cref=\"Operands\"/> 的内容写入到目标 <see cref=\"System.IO.Stream\"/>。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"target\">目标流对象。</param>\r\n\t\tinternal void WritePdfCommands(System.IO.Stream target) {\r\n\t\t\tforeach (var item in Commands) {\r\n\t\t\t\titem.WriteToPdf(target);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// 将 <see cref=\"Operands\"/> 的内容写入到目标 <paramref name=\"pdf\"/> 的第 <paramref name=\"pageNumber\"/> 页。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"pdf\">目标 <see cref=\"PdfReader\"/>。</param>\r\n\t\t/// <param name=\"pageNumber\">要写入的页码。</param>\r\n\t\tinternal void WritePdfCommands(PdfReader pdf, int pageNumber) {\r\n\t\t\tusing (var ms = new System.IO.MemoryStream()) {\r\n\t\t\t\tWritePdfCommands(ms);\r\n\t\t\t\tms.Flush();\r\n\t\t\t\tpdf.SafeSetPageContent(pageNumber, ms.ToArray());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal void WritePdfCommands(PageProcessorContext context) {\r\n\t\t\tWritePdfCommands(context.Pdf, context.PageNumber);\r\n\t\t}\r\n\r\n\t\tprivate static string GetOperandsTextValue(List<PdfObject> operands) {\r\n\t\t\tvar n = operands.ConvertAll((po) => po.Type == PdfObject.NUMBER ? ValueHelper.ToText(((PdfNumber)po).DoubleValue) : null);\r\n\t\t\tn.RemoveAt(n.Count - 1);\r\n\t\t\treturn String.Join(\" \", n.ToArray());\r\n\t\t}\r\n\r\n\t\tprivate TextInfo GetTextInfo(PdfString text) {\r\n\t\t\tvar gs = CurrentGraphicState;\r\n\t\t\tvar m = TextMatrix;\r\n\t\t\treturn new TextInfo {\r\n\t\t\t\tPdfString = text,\r\n\t\t\t\tText = gs.Font != null ? gs.Font.DecodeText(text) : String.Empty,\r\n\t\t\t\tSize = gs.FontSize * m[Matrix.I11],\r\n\t\t\t\tRegion = new Bound(m[Matrix.I31], m[Matrix.I32], m[Matrix.I31] + _textWidth, 0),\r\n\t\t\t\tFont = gs.Font\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfPageExtractor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing Ext = PDFPatcher.Constants.FileExtensions;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tstatic class PdfPageExtractor\r\n\t{\r\n\t\tinternal static void ExtractPages(ExtractPageOptions options, string sourceFile, string targetFile, PdfReader pdf) {\r\n\t\t\tvar pn = pdf.NumberOfPages;\r\n\t\t\tif (pn == 1) {\r\n\t\t\t\tTracker.TraceMessage(\"文档只有一页，无法拆分。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (options.SeparatingMode) {\r\n\t\t\t\tcase 0: goto default;\r\n\t\t\t\tcase 1: // 按顶层书签拆分\r\n\t\t\t\t\tSeparateByBookmarks(options, sourceFile, targetFile, ref pdf);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2: // 按页数拆分\r\n\t\t\t\t\tSeparateByPageNumber(options, sourceFile, targetFile, ref pdf);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tSeparateByPageRanges(options, sourceFile, targetFile, ref pdf);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SeparateByPageNumber(ExtractPageOptions options, string sourceFile, string targetFile, ref PdfReader pdf) {\r\n\t\t\tvar c = 1;\r\n\t\t\tvar pn = pdf.NumberOfPages;\r\n\t\t\tif (pn <= options.SeparateByPage) {\r\n\t\t\t\tTracker.TraceMessage(\"拆分的页数超过文档页数，无法拆分。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tfor (int i = 1; i <= pn; i += options.SeparateByPage) {\r\n\t\t\t\tpdf ??= PdfHelper.OpenPdfFile(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\t\tvar tf = RewriteTargetFileName(sourceFile, targetFile, pdf);\r\n\t\t\t\tvar e = i + options.SeparateByPage - 1;\r\n\t\t\t\tif (e > pn) {\r\n\t\t\t\t\te = pn;\r\n\t\t\t\t}\r\n\t\t\t\tvar s = options.NumberFileNames || c > 1 ? $\"[{c.ToText()}]\" : null;\r\n\t\t\t\tif (s != null) {\r\n\t\t\t\t\ttf = string.Concat(tf.Substring(0, tf.LastIndexOf('.')), s, Ext.Pdf);\r\n\t\t\t\t}\r\n\t\t\t\tExtractPages(options, sourceFile, tf, pdf, PageRangeCollection.CreateSingle(i, e));\r\n\t\t\t\tpdf.Close();\r\n\t\t\t\tpdf = null;\r\n\t\t\t\t++c;\r\n\t\t\t\tTracker.IncrementProgress(e - i + 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SeparateByPageRanges(ExtractPageOptions options, string sourceFile, string targetFile, ref PdfReader pdf) {\r\n\t\t\tvar rl = options.PageRanges.Split(';', '；');\r\n\t\t\tvar pn = pdf.NumberOfPages;\r\n\t\t\tvar i = 1;\r\n\t\t\tvar c = 0;\r\n\t\t\tforeach (var range in rl) {\r\n\t\t\t\tc += PageRangeCollection.Parse(range, 1, pn, true).TotalPages;\r\n\t\t\t}\r\n\t\t\tTracker.SetProgressGoal(c);\r\n\t\t\tforeach (var range in rl) {\r\n\t\t\t\tpdf ??= PdfHelper.OpenPdfFile(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\t\tvar tf = RewriteTargetFileName(sourceFile, targetFile, pdf);\r\n\t\t\t\tvar s = options.NumberFileNames || i > 1 ? $\"[{i.ToText()}]\" : null;\r\n\t\t\t\tif (s != null) {\r\n\t\t\t\t\ttf = string.Concat(tf.Substring(0, tf.LastIndexOf('.')), s, Ext.Pdf);\r\n\t\t\t\t}\r\n\t\t\t\tvar ranges = PageRangeCollection.Parse(range, 1, pn, true);\r\n\t\t\t\tExtractPages(options, sourceFile, tf, pdf, ranges);\r\n\t\t\t\tpdf.Close();\r\n\t\t\t\tpdf = null;\r\n\t\t\t\t++i;\r\n\t\t\t\tTracker.IncrementProgress(ranges.TotalPages);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SeparateByBookmarks(ExtractPageOptions options, string sourceFile, string targetFile, ref PdfReader pdf) {\r\n\t\t\tvar n = pdf.NumberOfPages;\r\n\t\t\tTracker.TraceMessage(\"导出文档书签。\");\r\n\t\t\tpdf.ConsolidateNamedDestinations();\r\n\t\t\tvar b = OutlineManager.GetBookmark(pdf, new UnitConverter());\r\n\t\t\tpdf.Close();\r\n\t\t\tif (b == null) {\r\n\t\t\t\tTracker.TraceMessage(\"文档没有书签，无法拆分。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tTracker.SetProgressGoal(n);\r\n\t\t\tvar l = new List<KeyValuePair<int, string>>();\r\n\t\t\tvar pp = 0;\r\n\t\t\tforeach (XmlElement item in b.ChildNodes) {\r\n\t\t\t\tif (item == null) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tvar p = item.GetAttribute(Constants.DestinationAttributes.Page).ToInt32();\r\n\t\t\t\tvar t = FileHelper.GetValidFileName(item.GetAttribute(Constants.BookmarkAttributes.Title));\r\n\t\t\t\tvar a = item.GetAttribute(Constants.DestinationAttributes.Action);\r\n\t\t\t\tif (a.Length > 0 && a != Constants.ActionType.Goto) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (p == 0 || p > n || p <= pp || t.Length == 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tl.Add(new KeyValuePair<int, string>(p, t));\r\n\t\t\t\tpp = p;\r\n\t\t\t}\r\n\t\t\tif (l.Count == 1 && l[0].Key == 1) {\r\n\t\t\t\tTracker.TraceMessage(\"文档只有一个有效书签，无法拆分。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (l[0].Key > 1) {\r\n\t\t\t\tl.Insert(0, new KeyValuePair<int, string>(1, Path.GetFileNameWithoutExtension(sourceFile)));\r\n\t\t\t}\r\n\t\t\ttargetFile = RewriteTargetFileName(sourceFile, targetFile, pdf);\r\n\t\t\tvar dn = Path.GetDirectoryName(targetFile);\r\n\t\t\tvar fn = Path.GetFileNameWithoutExtension(targetFile);\r\n\t\t\tfor (int i = 0; i < l.Count; i++) {\r\n\t\t\t\tint s = l[i].Key, e = i < l.Count - 1 ? l[i + 1].Key - 1 : n;\r\n\t\t\t\tpdf = PdfHelper.OpenPdfFile(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\t\tvar tf = FileHelper.CombinePath(dn, String.Concat(\r\n\t\t\t\t\tfn, Path.DirectorySeparatorChar.ToString(),\r\n\t\t\t\t\toptions.NumberFileNames ? (i + 1).ToText() + \" - \" : String.Empty,\r\n\t\t\t\t\tl[i].Value,\r\n\t\t\t\t\tExt.Pdf));\r\n\t\t\t\tExtractPages(options, sourceFile, tf, pdf, PageRangeCollection.CreateSingle(s, e));\r\n\t\t\t\tpdf.Close();\r\n\t\t\t\tTracker.IncrementProgress(e - s + 1);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tstatic void ExtractPages(ExtractPageOptions options, string sourceFile, FilePath targetFile, PdfReader pdf, PageRangeCollection ranges) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\tif (FileHelper.ComparePath(sourceFile, targetFile)) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输入文件和输出文件不能相同。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.CheckOverwrite(targetFile) == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar excludeRanges = PageRangeCollection.Parse(options.ExcludePageRanges, 1, pdf.NumberOfPages, false);\r\n\t\t\ttargetFile.CreateContainingDirectory();\r\n\r\n\t\t\tusing (var s = new FileStream(targetFile, FileMode.Create)) {\r\n\t\t\t\tvar pages = new int[ranges.TotalPages];\r\n\t\t\t\tvar remapper = new int[pdf.NumberOfPages + 1];\r\n\t\t\t\tint i = 0;\r\n\t\t\t\tforeach (var range in excludeRanges) {\r\n\t\t\t\t\tforeach (var item in range) {\r\n\t\t\t\t\t\tremapper[item] = -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tforeach (var range in ranges) {\r\n\t\t\t\t\tforeach (var item in range) {\r\n\t\t\t\t\t\tif (remapper[item] < 0) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tpages[i++] = item;\r\n\t\t\t\t\t\tif (remapper[item] == 0) {\r\n\t\t\t\t\t\t\tremapper[item] = i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar w = new PdfStamper(pdf, s);\r\n\t\t\t\tXmlElement bm = null;\r\n\t\t\t\tif (options.KeepBookmarks) {\r\n\t\t\t\t\tTracker.TraceMessage(\"导出原文档书签。\");\r\n\t\t\t\t\tpdf.ConsolidateNamedDestinations();\r\n\t\t\t\t\tbm = OutlineManager.GetBookmark(pdf, new UnitConverter() { Unit = Constants.Units.Point });\r\n\t\t\t\t\tif (bm?.HasChildNodes == true) {\r\n\t\t\t\t\t\tvar processors = new IInfoDocProcessor[]\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tnew GotoDestinationProcessor () {\r\n\t\t\t\t\t\t\t\t\tRemoveOrphanDestination = options.RemoveOrphanBookmarks,\r\n\t\t\t\t\t\t\t\t\tPageRemapper = remapper,\r\n\t\t\t\t\t\t\t\t\tTransitionMapper = null\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\tPdfDocumentCreator.ProcessInfoItem(bm, processors);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tOutlineManager.KillOutline(pdf);\r\n\t\t\t\t}\r\n\t\t\t\tpdf.SelectPages(pages);\r\n\t\t\t\tpdf.Catalog.Remove(PdfName.PAGELABELS);\r\n\t\t\t\tif (options.KeepDocumentProperties == false) {\r\n\t\t\t\t\tpdf.Trailer.Remove(PdfName.INFO);\r\n\t\t\t\t\tpdf.Catalog.Remove(PdfName.METADATA);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tpdf.SeparateConjoinedRootAndInfo();\r\n\t\t\t\t}\r\n\t\t\t\tif (options.EnableFullCompression) {\r\n\t\t\t\t\tpdf.RemoveUnusedObjects();\r\n\t\t\t\t\tw.SetFullCompression();\r\n\t\t\t\t}\r\n\t\t\t\tif (bm != null) {\r\n\t\t\t\t\tpdf.Catalog.Put(PdfName.OUTLINES, OutlineManager.WriteOutline(w.Writer, bm, ranges.TotalPages));\r\n\t\t\t\t\tw.ViewerPreferences = PdfWriter.PageModeUseOutlines;\r\n\t\t\t\t}\r\n\t\t\t\tw.Writer.Info.Put(PdfName.PRODUCER, new PdfString($\"{Application.ProductName} {Application.ProductVersion}\"));\r\n\t\t\t\tTracker.TraceMessage(\"保存文件：\" + targetFile);\r\n\t\t\t\tw.Close();\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Alert, $\"成功提取文件内容到 <<{targetFile}>>。\");\r\n\t\t}\r\n\r\n\t\tstatic string RewriteTargetFileName(string sourceFile, string targetFile, PdfReader pdf) {\r\n\t\t\tDocInfoExporter.RewriteDocInfoWithEncoding(pdf, AppContext.Encodings.DocInfoEncoding);\r\n\t\t\ttargetFile = Worker.ReplaceTargetFileNameMacros(sourceFile, targetFile, pdf);\r\n\t\t\ttargetFile = FileHelper.MakePathRootedAndWithExtension(targetFile, sourceFile, Ext.Pdf, true);\r\n\t\t\treturn targetFile;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/PdfProcessingEngine.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tsealed class PdfProcessingEngine\r\n\t{\r\n\t\t///<summary>获取文档处理器列表。</summary>\r\n\t\tinternal List<IDocProcessor> DocumentProcessors { get; private set; }\r\n\r\n\t\t///<summary>获取页面处理器列表。</summary>\r\n\t\tinternal List<IPageProcessor> PageProcessors { get; private set; }\r\n\r\n\t\tpublic PdfReader Pdf { get; private set; }\r\n\t\tpublic Dictionary<int, object> ExtraData { get; private set; }\r\n\r\n\t\tpublic PdfProcessingEngine(PdfReader pdf) {\r\n\t\t\tDocumentProcessors = new List<IDocProcessor>();\r\n\t\t\tPageProcessors = new List<IPageProcessor>();\r\n\t\t\tPdf = pdf;\r\n\t\t\tExtraData = new Dictionary<int, object>();\r\n\t\t}\r\n\r\n\t\tpublic void CreateProcessors(PatcherOptions settings) {\r\n\t\t\tif (settings.RemoveBookmarks) {\r\n\t\t\t\tDocumentProcessors.Add(new RemoveBookmarkProcessor());\r\n\t\t\t}\r\n\t\t\tif (settings.FixContents) {\r\n\t\t\t\tPageProcessors.Add(new FixContentProcessor());\r\n\t\t\t}\r\n\t\t\tif (settings.EmbedFonts || settings.EnableFontSubstitutions && settings.FontSubstitutions.Count > 0) {\r\n\t\t\t\tvar d = new Dictionary<string, FontSubstitution>(settings.FontSubstitutions.Count, StringComparer.CurrentCultureIgnoreCase);\r\n\t\t\t\tif (settings.EnableFontSubstitutions) {\r\n\t\t\t\t\tforeach (var item in settings.FontSubstitutions) {\r\n\t\t\t\t\t\tif (String.IsNullOrEmpty(item.OriginalFont) || String.IsNullOrEmpty(item.Substitution)) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\td[item.OriginalFont] = item;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (settings.EmbedFonts || d.Count > 0) {\r\n\t\t\t\t\tPageProcessors.Add(new ReplaceFontProcessor(settings.EmbedFonts, settings.TrimTrailingWhiteSpace, d));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (settings.RemovePageForms) {\r\n\t\t\t\tPageProcessors.Add(new RemoveFormProcessor());\r\n\t\t\t}\r\n\t\t\tif (settings.RemovePageLinks) {\r\n\t\t\t\tPageProcessors.Add(new RemoveAnnotationProcessor(PdfName.LINK));\r\n\t\t\t}\r\n\t\t\tif (settings.RecompressWithJbig2) {\r\n\t\t\t\tPageProcessors.Add(new ImageRecompressor() {\r\n\t\t\t\t\tBinaryThreshold = settings.RecompressImageToBinary ? settings.BinaryImageThreshold : (byte)0,\r\n\t\t\t\t\tAlgorithm = settings.UseThresholdAlgorithm ? (byte)255 : settings.DitherAlgorithm\r\n\t\t\t\t});\r\n\t\t\t\t//this.PageProcessors.Add (new ColorizeBinaryImageProcessor ());\r\n\t\t\t}\r\n\t\t\tif (settings.RemovePageTextBlocks) {\r\n\t\t\t\tPageProcessors.Add(new RemoveTextBlockProcessor());\r\n\t\t\t}\r\n\t\t\tif (settings.RemovePageThumbnails) {\r\n\t\t\t\tPageProcessors.Add(new RemoveThumbnailProcessor());\r\n\t\t\t}\r\n\t\t\tif (settings.UnifiedPageSettings.NeedAdjustMargins || settings.UnifiedPageSettings.NeedResize) {\r\n\t\t\t\tPageProcessors.Add(new PageDimensionProcessor { Settings = settings.UnifiedPageSettings });\r\n\t\t\t}\r\n\t\t\tif (settings.RemoveLeadingCommandCount > 0 || settings.RemoveTrailingCommandCount > 0) {\r\n\t\t\t\tPageProcessors.Add(new RemoveWrappedCommandProcessor(settings.RemoveLeadingCommandCount, settings.RemoveTrailingCommandCount));\r\n\t\t\t}\r\n\t\t\tif (settings.PageSettings.Count > 0) {\r\n\t\t\t\tforeach (var item in settings.PageSettings) {\r\n\t\t\t\t\tPageProcessors.Add(new PageDimensionProcessor { Settings = item });\r\n\t\t\t\t}\r\n\t\t\t}\r\n#if DEBUG\r\n\t\t\tPageProcessors.Add(new CleanContentStreamProcessor());\r\n#endif\r\n\t\t\t//if (settings.DeskewImages) {\r\n\t\t\t//    this.PageProcessors.Add (new ImageDeskewProcessor ());\r\n\t\t\t//}\r\n\t\t\tPageProcessors.Add(new CommonProcessor(settings));\r\n\t\t}\r\n\r\n\t\tinternal int EstimateWorkload() {\r\n\t\t\tint workload = 0;\r\n\t\t\tforeach (var p in DocumentProcessors) {\r\n\t\t\t\tworkload += p.EstimateWorkload(Pdf);\r\n\t\t\t}\r\n\t\t\tforeach (var p in PageProcessors) {\r\n\t\t\t\tworkload += p.EstimateWorkload(Pdf);\r\n\t\t\t}\r\n\t\t\treturn workload;\r\n\t\t}\r\n\r\n\t\tinternal void ProcessDocument(PdfWriter writer) {\r\n\t\t\tProcessDocument(writer, null);\r\n\t\t}\r\n\t\tinternal void ProcessDocument(PdfWriter writer, Document document) {\r\n\t\t\tvar pp = PageProcessors.ToArray();\r\n\t\t\tvar dc = new DocProcessorContext(this, writer, document);\r\n\t\t\tforeach (var p in DocumentProcessors) {\r\n\t\t\t\tTracker.TraceMessage(p.Name);\r\n\t\t\t\tp.BeginProcess(dc);\r\n\t\t\t}\r\n\t\t\tforeach (var p in pp) {\r\n\t\t\t\tTracker.TraceMessage(p.Name);\r\n\t\t\t\tp.BeginProcess(dc);\r\n\t\t\t}\r\n\t\t\tforeach (var p in DocumentProcessors) {\r\n\t\t\t\tp.Process(dc);\r\n\t\t\t}\r\n\t\t\tvar pn = Pdf.NumberOfPages;\r\n\t\t\tvar i = 0;\r\n\t\t\twhile (++i <= pn) {\r\n\t\t\t\tvar pc = new PageProcessorContext(Pdf, i);\r\n\t\t\t\ttry {\r\n\t\t\t\t\tforeach (var p in pp) {\r\n\t\t\t\t\t\tp.Process(pc);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (pc.IsPageContentModified) {\r\n\t\t\t\t\t\tpc.WritePageCommands();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\tTracker.TraceMessage($\"在处理文档第 {i} 页时出错。\");\r\n\t\t\t\t\tthrow;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tforeach (var p in DocumentProcessors) {\r\n\t\t\t\tp.EndProcess(dc);\r\n\t\t\t}\r\n\t\t\tforeach (var p in pp) {\r\n\t\t\t\tp.EndProcess(Pdf);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/SourceItemSerializer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal static class SourceItemSerializer\r\n\t{\r\n\t\tstatic readonly BookmarkSettings __EmptyBookmark = new BookmarkSettings();\r\n\r\n\t\t/// <summary>\r\n\t\t/// 保存合并文件功能的列表。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"list\">文件列表项目。</param>\r\n\t\t/// <param name=\"path\">文件列表的保存路径。</param>\r\n\t\tinternal static void Serialize(IList<SourceItem> list, FilePath path) {\r\n\t\t\tvar d = new PdfInfoXmlDocument();\r\n\t\t\tvar b = d.BookmarkRoot;\r\n\t\t\tforeach (var item in list) {\r\n\t\t\t\tSerializeSourceItem(d, b, item, path);\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\td.Save(path);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"保存文件列表时遇到错误\", ex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic void SerializeSourceItem(PdfInfoXmlDocument doc, BookmarkContainer container, SourceItem item, FilePath basePath) {\r\n\t\t\tvar e = doc.CreateBookmark(item.Bookmark ?? __EmptyBookmark);\r\n\t\t\tswitch (item.Type) {\r\n\t\t\t\tcase SourceItem.ItemType.Empty:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase SourceItem.ItemType.Pdf:\r\n\t\t\t\t\te.SetValue(Constants.PageRange, ((SourceItem.Pdf)item).PageRanges);\r\n\t\t\t\t\tgoto default;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\te.SetValue(Constants.DestinationAttributes.Path, basePath.GetRelativePath(item.FilePath));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcontainer.AppendChild(e);\r\n\t\t\tif (item.HasSubItems) {\r\n\t\t\t\tforeach (var sub in item.Items) {\r\n\t\t\t\t\tSerializeSourceItem(doc, e, sub, basePath);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static List<SourceItem> Deserialize(FilePath path) {\r\n\t\t\tvar d = new PdfInfoXmlDocument();\r\n\t\t\ttry {\r\n\t\t\t\td.Load(path);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"在加载文件列表时遇到错误\", ex);\r\n\t\t\t}\r\n\t\t\tvar bl = d.Bookmarks;\r\n\t\t\tvar l = new List<SourceItem>(bl.Count);\r\n\t\t\tpath = path.Directory;\r\n\t\t\tforeach (BookmarkElement item in bl) {\r\n\t\t\t\tDeserializeSourceItem(l, item, path);\r\n\t\t\t}\r\n\t\t\treturn l;\r\n\t\t}\r\n\r\n\t\tstatic void DeserializeSourceItem(List<SourceItem> list, BookmarkElement bookmark, FilePath basePath) {\r\n\t\t\tvar b = new BookmarkSettings(bookmark);\r\n\t\t\tvar p = bookmark.GetValue(Constants.DestinationAttributes.Path);\r\n\t\t\tvar s = String.IsNullOrEmpty(p) ? SourceItem.Create() : SourceItem.Create(basePath.Combine(p), false);\r\n\t\t\tif (b.Title.IsNullOrWhiteSpace() == false || b.IsOpened || b.IsBold || b.IsItalic || b.ForeColor.IsEmptyOrTransparent() == false) {\r\n\t\t\t\ts.Bookmark = b;\r\n\t\t\t}\r\n\t\t\tif (s.Type == SourceItem.ItemType.Pdf) {\r\n\t\t\t\t((SourceItem.Pdf)s).PageRanges = bookmark.GetValue(Constants.PageRange);\r\n\t\t\t}\r\n\t\t\tlist.Add(s);\r\n\t\t\tif (bookmark.HasSubBookmarks) {\r\n\t\t\t\tforeach (BookmarkElement sub in bookmark.SubBookmarks) {\r\n\t\t\t\t\tDeserializeSourceItem(s.Items, sub, basePath);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Processor/Worker.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Windows.Forms;\r\nusing System.Xml;\r\nusing iTextSharp.text;\r\nusing iTextSharp.text.pdf;\r\nusing PDFPatcher.Common;\r\nusing PDFPatcher.Model;\r\nusing MuDocument = MuPDF.Document;\r\nusing ImageRendererOptions = MuPDF.ImageRendererOptions;\r\nusing MuImageFormat = MuPDF.ImageFormat;\r\nusing Ext = PDFPatcher.Constants.FileExtensions;\r\nusing MuPDF.Extensions;\r\n\r\nnamespace PDFPatcher.Processor\r\n{\r\n\tinternal static class Worker\r\n\t{\r\n\t\tconst string OperationCanceled = \"已经取消操作。\";\r\n\r\n\t\tprivate static PdfReader OpenPdf(string sourceFile, bool loadPartial, bool removeUnusedObjects) {\r\n\t\t\ttry {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"打开 PDF 文件：<<{sourceFile}>>。\");\r\n\t\t\t\treturn PdfHelper.OpenPdfFile(sourceFile, loadPartial, removeUnusedObjects);\r\n\t\t\t}\r\n\t\t\tcatch (FileNotFoundException) {\r\n\t\t\t\tFormHelper.ErrorBox($\"找不到文件：“{sourceFile}”。\");\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tcatch (iTextSharp.text.exceptions.BadPasswordException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, Messages.PasswordInvalid);\r\n\t\t\t\tFormHelper.ErrorBox(Messages.PasswordInvalid);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"打开 PDF 文件时遇到错误\", ex);\r\n#if DEBUG\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n#endif\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ExtractImages(string sourceFile, ImageExtracterOptions options) {\r\n\t\t\tconst int loadDocProgressWeight = 10;\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tvar pdf = OpenPdf(sourceFile, true, false); // 由于导出图片一般不需要往复访问文档，可用此选项降低内存占用及提高打开速度\r\n\t\t\tif (pdf == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar targetPath = options.OutputPath;\r\n\t\t\tvar ranges = PageRangeCollection.Parse(options.PageRange, 1, pdf.NumberOfPages, true);\r\n\t\t\tvar loadCount = loadDocProgressWeight + ranges.TotalPages;\r\n\t\t\tTracker.SetProgressGoal(loadCount);\r\n\t\t\tvar op = targetPath;\r\n\t\t\tvar om = options.FileMask;\r\n\t\t\ttry {\r\n\t\t\t\tif (Directory.Exists(targetPath) == false) {\r\n\t\t\t\t\tDirectory.CreateDirectory(targetPath);\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TraceMessage(\"正在导出图片。\");\r\n\t\t\t\tTracker.TrackProgress(loadDocProgressWeight);\r\n\t\t\t\tif (FileHelper.HasFileNameMacro(op)) {\r\n\t\t\t\t\toptions.OutputPath = ReplaceTargetFileNameMacros(sourceFile, op, pdf);\r\n\t\t\t\t}\r\n\t\t\t\tif (FileHelper.HasFileNameMacro(om)) {\r\n\t\t\t\t\toptions.FileMask = ReplaceTargetFileNameMacros(sourceFile, om, pdf);\r\n\t\t\t\t}\r\n\t\t\t\tvar exp = new ImageExtractor(options);\r\n\t\t\t\tforeach (var range in ranges) {\r\n\t\t\t\t\tforeach (var i in range) {\r\n\t\t\t\t\t\texp.ExtractPageImages(pdf, i);\r\n\t\t\t\t\t\tif (exp.InfoList.Count > 0) {\r\n\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, exp.InfoList[exp.InfoList.Count - 1].FileName);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TrackProgress(loadCount);\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"成功提取图片文件，存放目录为：<<\" + targetPath + \">>。\");\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"导出图片时遇到错误\", ex);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\toptions.OutputPath = op;\r\n\t\t\t\toptions.FileMask = om;\r\n\t\t\t\tpdf?.Close();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void RenderPages(string sourceFile, ImageRendererOptions options) {\r\n\t\t\tconst int loadDocProgressWeight = 10;\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\toptions.TintColor = System.Drawing.Color.Transparent;\r\n\t\t\tif (Directory.Exists(options.ExtractImagePath) == false) {\r\n\t\t\t\tDirectory.CreateDirectory(options.ExtractImagePath);\r\n\t\t\t}\r\n\t\t\tMuDocument mupdf = null;\r\n\t\t\ttry {\r\n\t\t\t\tmupdf = PdfHelper.OpenMuDocument(sourceFile);\r\n\t\t\t\tvar ranges = PageRangeCollection.Parse(options.ExtractPageRange, 1, mupdf.PageCount, true);\r\n\t\t\t\tint loadCount = loadDocProgressWeight + ranges.TotalPages;\r\n\t\t\t\tTracker.SetProgressGoal(loadCount);\r\n\t\t\t\tTracker.TraceMessage(\"正在转换图片。\");\r\n\t\t\t\tTracker.TrackProgress(loadDocProgressWeight);\r\n\t\t\t\tvar cookie = new MuPDF.Cookie();\r\n\t\t\t\tforeach (var range in ranges) {\r\n\t\t\t\t\tforeach (var i in range) {\r\n\t\t\t\t\t\tvar fn = FileHelper.CombinePath(options.ExtractImagePath, i.ToString(options.FileMask) + options.FileFormatExtension);\r\n\t\t\t\t\t\tusing (var p = mupdf.LoadPage(i - 1))\r\n\t\t\t\t\t\tusing (var bmp = p.RenderBitmapPage(options.ImageWidth, 0, options, cookie)) {\r\n\t\t\t\t\t\t\tif (bmp == null) {\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"页面\" + i + \"的尺寸为空。\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (options.FileFormat == MuImageFormat.Tiff) {\r\n\t\t\t\t\t\t\t\tusing (var b = Imaging.BitmapHelper.ToBitonal(bmp)) {\r\n\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(b, fn);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tvar uc = Imaging.BitmapHelper.GetPalette(bmp);\r\n\t\t\t\t\t\t\t\tif (uc.Length > 256 && options.Quantize) {\r\n\t\t\t\t\t\t\t\t\tusing (var b = Imaging.WuQuantizer.QuantizeImage(bmp)) {\r\n\t\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(b, fn);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if (uc.Length <= 256 && Imaging.BitmapHelper.IsIndexed(bmp) == false) {\r\n\t\t\t\t\t\t\t\t\tusing (var b = Imaging.BitmapHelper.ToIndexImage(bmp, uc)) {\r\n\t\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(b, fn);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if (options.FileFormat == MuImageFormat.Jpeg) {\r\n\t\t\t\t\t\t\t\t\tImaging.JpgHelper.Save(bmp, fn, options.JpegQuality);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(bmp, fn);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, fn);\r\n\t\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TrackProgress(loadCount);\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"成功转换图片文件，存放目录为：<<\" + options.ExtractImagePath + \">>。\");\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"转换图片时遇到错误\", ex);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tmupdf?.Dispose();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void RenderPagesToPdf(string sourceFile, ImageRendererOptions options, Document doc) {\r\n\t\t\tconst int loadDocProgressWeight = 10;\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, options.ExtractImagePath);\r\n\t\t\toptions.TintColor = System.Drawing.Color.Transparent;\r\n\t\t\t((FilePath)options.ExtractImagePath).CreateContainingDirectory();\r\n\t\t\tMuDocument mupdf = null;\r\n\t\t\ttry {\r\n\t\t\t\tmupdf = PdfHelper.OpenMuDocument(sourceFile);\r\n\t\t\t\tvar ranges = PageRangeCollection.Parse(options.ExtractPageRange, 1, mupdf.PageCount, true);\r\n\t\t\t\tint loadCount = loadDocProgressWeight + ranges.TotalPages;\r\n\t\t\t\tTracker.SetProgressGoal(loadCount);\r\n\t\t\t\tTracker.TraceMessage(\"正在转换图片。\");\r\n\t\t\t\tTracker.TrackProgress(loadDocProgressWeight);\r\n\t\t\t\tMemoryStream ms = new MemoryStream();\r\n\t\t\t\tvar fn = options.FileFormatExtension;\r\n\t\t\t\tvar cookie = new MuPDF.Cookie();\r\n\t\t\t\tforeach (var range in ranges) {\r\n\t\t\t\t\tforeach (var i in range) {\r\n\t\t\t\t\t\tms.Position = 0;\r\n\t\t\t\t\t\tusing (var p = mupdf.LoadPage(i - 1))\r\n\t\t\t\t\t\tusing (var bmp = p.RenderBitmapPage(options.ImageWidth, 0, options, cookie)) {\r\n\t\t\t\t\t\t\tif (bmp == null) {\r\n\t\t\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"页面\" + i + \"的尺寸为空。\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (options.FileFormat == MuImageFormat.Tiff) {\r\n\t\t\t\t\t\t\t\tusing (var b = Imaging.BitmapHelper.ToBitonal(bmp)) {\r\n\t\t\t\t\t\t\t\t\tb.SetResolution(options.Dpi, options.Dpi);\r\n\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(b, fn, ms);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tvar uc = Imaging.BitmapHelper.GetPalette(bmp);\r\n\t\t\t\t\t\t\t\tif (uc.Length > 256 && options.Quantize) {\r\n\t\t\t\t\t\t\t\t\tusing (var b = Imaging.WuQuantizer.QuantizeImage(bmp)) {\r\n\t\t\t\t\t\t\t\t\t\tb.SetResolution(options.Dpi, options.Dpi);\r\n\t\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(b, fn, ms);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if (uc.Length <= 256 && Imaging.BitmapHelper.IsIndexed(bmp) == false) {\r\n\t\t\t\t\t\t\t\t\tusing (var b = Imaging.BitmapHelper.ToIndexImage(bmp, uc)) {\r\n\t\t\t\t\t\t\t\t\t\tb.SetResolution(options.Dpi, options.Dpi);\r\n\t\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(b, fn, ms);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if (options.FileFormat == MuImageFormat.Jpeg) {\r\n\t\t\t\t\t\t\t\t\tImaging.JpgHelper.Save(bmp, ms, options.JpegQuality);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\tImaging.BitmapHelper.SaveAs(bmp, fn, ms);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tdoc.SetPageSize((options.Rotation % 180) == 0\r\n\t\t\t\t\t\t\t\t? new Rectangle(p.Bound.Width, p.Bound.Height)\r\n\t\t\t\t\t\t\t\t: new Rectangle(p.Bound.Height, p.Bound.Width));\r\n\t\t\t\t\t\t\tdoc.NewPage();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar image = Image.GetInstance(ms.ToArray(), true);\r\n\t\t\t\t\t\timage.ScalePercent(72f / image.DpiX.SubstituteDefault(72) * 100f, 72f / image.DpiY.SubstituteDefault(72) * 100f);\r\n\t\t\t\t\t\tdoc.Add(image);\r\n\t\t\t\t\t\tTracker.IncrementProgress(1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TrackProgress(loadCount);\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"成功转换图片文件，存放位置为：<<\" + options.ExtractImagePath + \">>。\");\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"转换图片时遇到错误\", ex);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tmupdf?.Dispose();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ExportInfo(FilePath sourceFile, FilePath targetFile) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\tvar r = OpenPdf(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\tif (r == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (targetFile.IsValidPath == false || targetFile.FileName.Length == 0) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, Messages.InfoFileNameInvalid);\r\n\t\t\t\tFormHelper.ErrorBox(Messages.InfoFileNameInvalid);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttargetFile = FileHelper.MakePathRootedAndWithExtension(targetFile, sourceFile, Ext.Xml, false);\r\n\t\t\ttargetFile.CreateContainingDirectory();\r\n\t\t\tvar export = new DocInfoExporter(r, AppContext.Exporter);\r\n\t\t\tif (AppContext.Exporter.ExportBinaryStream) {\r\n\t\t\t\texport.BinaryStreamPath = targetFile.Directory.Combine(targetFile.FileNameWithoutExtension).Combine(\"数据流\");\r\n\t\t\t}\r\n\t\t\tif (AppContext.Exporter.ExtractImages) {\r\n\t\t\t\tAppContext.Exporter.Images.OutputPath = FileHelper.CombinePath(targetFile.Directory, targetFile.FileNameWithoutExtension + \"\\\\图片文件\\\\\");\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tTracker.TraceMessage(\"正在导出信息文件。\");\r\n\t\t\t\tif (targetFile.HasExtension(Ext.Txt)) {\r\n\t\t\t\t\tTracker.SetProgressGoal(50);\r\n\t\t\t\t\tusing (TextWriter w = new StreamWriter(targetFile, false, AppContext.Exporter.GetEncoding())) {\r\n\t\t\t\t\t\tDocInfoExporter.WriteDocumentInfoAttributes(w, sourceFile, r.NumberOfPages);\r\n\t\t\t\t\t\texport.ExportDocument(w);\r\n\t\t\t\t\t\tw.WriteLine();\r\n\t\t\t\t\t\tTracker.SetProgressGoal(10);\r\n\t\t\t\t\t\tr.ConsolidateNamedDestinations();\r\n\t\t\t\t\t\texport.ExportBookmarks(OutlineManager.GetBookmark(r, new UnitConverter()), w, 0, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar workload = export.EstimateWorkload();\r\n\t\t\t\t\tTracker.SetProgressGoal(workload);\r\n\t\t\t\t\tusing (XmlWriter w = XmlWriter.Create(targetFile, DocInfoExporter.GetWriterSettings())) {\r\n\t\t\t\t\t\tw.WriteStartDocument();\r\n\t\t\t\t\t\tw.WriteStartElement(Constants.PdfInfo);\r\n\t\t\t\t\t\tDocInfoExporter.WriteDocumentInfoAttributes(w, sourceFile, r.NumberOfPages);\r\n\t\t\t\t\t\texport.ExportDocument(w);\r\n\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"成功导出信息文件到 <<\" + targetFile + \">>。\");\r\n\t\t\t\t//if (this._BookmarkBox.Text.Length == 0) {\r\n\t\t\t\t//    this._BookmarkBox.Text = targetFile;\r\n\t\t\t\t//}\r\n\t\t\t\t//if (Common.Form.YesNoBox (\"已完成导出信息文件到 \" + targetFile + \"，是否使用内置的编辑器编辑文件？\") == DialogResult.Yes) {\r\n\t\t\t\t//    ShowInfoFileEditorForm (targetFile);\r\n\t\t\t\t//}\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (System.Text.EncoderFallbackException ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(\"在导出信息文件时遇到错误：\\n\" + ex.Message + \"\\n\\n请选择在导出信息选项中选择其它编码方式。\");\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(\"在导出信息文件时遇到错误：\\n\" + ex.Message);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tr?.Close();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void ConvertBookmark(string sourceFile, string targetFile) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\ttry {\r\n\t\t\t\tvar infoDoc = new PdfInfoXmlDocument();\r\n\t\t\t\tOutlineManager.ImportSimpleBookmarks(sourceFile, infoDoc);\r\n\t\t\t\tusing (var w = XmlWriter.Create(targetFile, DocInfoExporter.GetWriterSettings())) {\r\n\t\t\t\t\tinfoDoc.Save(w);\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"成功转换信息文件到 <<\" + targetFile + \">>。\");\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"转换书签文件时发生错误\", ex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static bool PatchDocument(SourceItem.Pdf sourceFile, FilePath targetFile, object infoDoc, ImporterOptions options, PatcherOptions pdfSettings, bool suppressWarning = false) {\r\n\t\t\tvar sourcePath = sourceFile.FilePath.ToString();\r\n\t\t\tif (sourceFile.FilePath.IsEmpty) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输入文件名为空。\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (String.IsNullOrEmpty(targetFile) || targetFile.IsEmpty) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输出文件名为空。\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourcePath);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\tbool overwriteSource = false;\r\n\t\t\tDateTime sourceCreationTime = DateTime.Now;\r\n\t\t\tvar pdf = OpenPdf(sourcePath, AppContext.LoadPartialPdfFile, true);\r\n\t\t\tif (pdf == null) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tpdf.SeparateConjoinedRootAndInfo();\r\n\t\t\ttry {\r\n\t\t\t\tDocInfoImporter import;\r\n\t\t\t\tvar xInfoDoc = infoDoc as PdfInfoXmlDocument;\r\n\t\t\t\tvar docPath = infoDoc as string;\r\n\t\t\t\tif (xInfoDoc != null) {\r\n\t\t\t\t\timport = new DocInfoImporter(options, pdf, pdfSettings, xInfoDoc);\r\n\t\t\t\t}\r\n\t\t\t\telse if (String.IsNullOrEmpty(docPath)) {\r\n\t\t\t\t\tTracker.TraceMessage(\"没有指定信息文件，将按程序界面的设置执行补丁。\");\r\n\t\t\t\t\timport = new DocInfoImporter(options, pdf, pdfSettings, null);\r\n\t\t\t\t\tTracker.TraceMessage(\"加载源 PDF 文件信息完毕，准备执行补丁操作。\");\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"加载信息文件：<<{docPath}>>。\");\r\n\t\t\t\t\timport = new DocInfoImporter(options, docPath);\r\n\t\t\t\t\tif (import.InfoDoc != null && VerifyInfoDocument(import.InfoDoc) == false) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar pdfEngine = new PdfProcessingEngine(pdf);\r\n\t\t\t\tpdfEngine.CreateProcessors(pdfSettings);\r\n\t\t\t\tint workload = 110;\r\n\t\t\t\tworkload += pdfEngine.EstimateWorkload();\r\n\t\t\t\tTracker.SetProgressGoal(workload);\r\n\t\t\t\tTracker.TrackProgress(10);\r\n\r\n\t\t\t\tif (pdf.ConfirmUnethicalMode() == false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tTracker.TraceMessage(\"导入文档属性。\");\r\n\t\t\t\t//var pdfInfo = DocInfoExporter.RewriteDocInfoWithEncoding (pdf.Trailer.GetAsDict (PdfName.INFO), AppContext.Encodings.DocInfoEncoding);\r\n\t\t\t\tvar info = pdfSettings.MetaData.SpecifyMetaData\r\n\t\t\t\t\t? pdfSettings.MetaData\r\n\t\t\t\t\t//: sourceFile.DocInfo;\r\n\t\t\t\t\t// 不再使用书签文件的文件属性\r\n\t\t\t\t\t: import.ImportDocumentInformation()\r\n\t\t\t\t\t?? sourceFile.DocInfo;\r\n\t\t\t\tDocInfoImporter.ImportDocumentInformation(info, pdf, sourcePath);\r\n\t\t\t\tTracker.TrackProgress(20);\r\n\r\n\t\t\t\tif (FileHelper.HasFileNameMacro(targetFile)) {\r\n\t\t\t\t\ttargetFile = ReplaceTargetFileNameMacros(sourcePath, targetFile, pdf);\r\n\t\t\t\t}\r\n\t\t\t\ttargetFile = FileHelper.MakePathRootedAndWithExtension(targetFile, sourcePath, Ext.Pdf, true);\r\n\t\t\t\ttargetFile = targetFile.Normalize();\r\n\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\t\tif (FileHelper.ComparePath(sourcePath, targetFile)) {\r\n\t\t\t\t\tif (suppressWarning == false && FileHelper.CheckOverwrite(targetFile) == false) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, Messages.SourceFileEqualsTargetFile);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\toverwriteSource = true;\r\n\t\t\t\t\tsourceCreationTime = sourceFile.FilePath.ToFileInfo().CreationTime;\r\n\t\t\t\t\ttargetFile = sourceFile.FilePath.ChangeExtension(Ext.Tmp).ToString();\r\n\t\t\t\t}\r\n\t\t\t\telse if (suppressWarning == false && FileHelper.CheckOverwrite(targetFile) == false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttargetFile.CreateContainingDirectory();\r\n\r\n\t\t\t\tusing (Stream s = new FileStream(targetFile, FileMode.Create)) {\r\n\t\t\t\t\tvar st = new PdfStamper(pdf, s);\r\n\t\t\t\t\tpdf.Catalog.Put(new PdfName(Application.ProductName), Application.ProductVersion);\r\n\t\t\t\t\tif (String.IsNullOrWhiteSpace(info.CreationDate) == false) {\r\n\t\t\t\t\t\tst.Writer.Info.Put(PdfName.CREATIONDATE, new PdfString(info.CreationDate));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpdfEngine.ProcessDocument(st.Writer);\r\n\t\t\t\t\t#region 处理信息文件\r\n\t\t\t\t\tvar processors = new List<IInfoDocProcessor>();\r\n\t\t\t\t\tif (pdfSettings.ViewerPreferences.RemoveZoomRate) {\r\n\t\t\t\t\t\tprocessors.Add(new RemoveZoomRateProcessor());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (pdfSettings.UnifiedPageSettings.ScaleContent\r\n\t\t\t\t\t\t&& pdfEngine.ExtraData.TryGetValue(DocProcessorContext.CoordinateTransition, out var o)\r\n\t\t\t\t\t\t&& o is CoordinateTranslationSettings[] cts) {\r\n\t\t\t\t\t\tprocessors.Add(new GotoDestinationProcessor() {\r\n\t\t\t\t\t\t\tTransitionMapper = cts\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (pdfSettings.ViewerPreferences.ForceInternalLink) {\r\n\t\t\t\t\t\tprocessors.Add(new ForceInternalDestinationProcessor());\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//var cts = new CoordinateTranslationSettings[pdf.NumberOfPages + 1]; // 页面的位置偏移量\r\n\t\t\t\t\t//var sc = false;\r\n\t\t\t\t\t//if (pdfSettings.PageSettings.Count > 0) {\r\n\t\t\t\t\t//    Tracker.TraceMessage (\"重设页面尺寸。\");\r\n\t\t\t\t\t//    pdf.ResetReleasePage ();\r\n\t\t\t\t\t//    foreach (var item in pdfSettings.PageSettings) {\r\n\t\t\t\t\t//        var ranges = PageRangeCollection.Parse (item.PageRanges, 1, pdf.NumberOfPages, true);\r\n\t\t\t\t\t//        foreach (var range in ranges) {\r\n\t\t\t\t\t//            foreach (var i in range) {\r\n\t\t\t\t\t//                var s = PageDimensionProcessor.ResizePage (pdf.GetPageN (i), item.PaperSize, item.HorizontalAlign, item.VerticalAlign, -1, item.ScaleContent);\r\n\t\t\t\t\t//                if (item.ScaleContent && s.XScale != 1 && s.YScale != 1) {\r\n\t\t\t\t\t//                    PageDimensionProcessor.ScaleContent (pdf, i, s);\r\n\t\t\t\t\t//                    cts[i] = s; // TODO: 需要解决重复指定相同页面的问题\r\n\t\t\t\t\t//                    sc = true;\r\n\t\t\t\t\t//                }\r\n\t\t\t\t\t//            }\r\n\t\t\t\t\t//        }\r\n\t\t\t\t\t//    }\r\n\t\t\t\t\t//    pdf.ResetReleasePage ();\r\n\t\t\t\t\t//}\r\n\t\t\t\t\tif (pdfSettings.UnifiedPageSettings.PaperSize.PaperName == PaperSize.AsPageSize) {\r\n\t\t\t\t\t\timport.ImportPageSettings(pdf);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//if (sc == false) {\r\n\t\t\t\t\t//    cts = null;\r\n\t\t\t\t\t//}\r\n\t\t\t\t\t#endregion\r\n\r\n\t\t\t\t\tif (pdfSettings.FullCompression) {\r\n\t\t\t\t\t\tst.SetFullCompression();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//st.Writer.CompressionLevel = ContextData.CreateDocumentOptions.CompressionLevel;\r\n\t\t\t\t\tvar labels = DocInfoImporter.ImportPageLabels(pdfSettings.PageLabels) ?? import.ImportPageLabels();\r\n\t\t\t\t\tif (labels != null) {\r\n\t\t\t\t\t\tst.Writer.PageLabels = labels;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (options.ImportPageLinks || pdfSettings.UnifiedPageSettings.PaperSize.PaperName != PaperSize.AsPageSize/* sc*/) {\r\n\t\t\t\t\t\timport.ImportPageLinks(pdf, st);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (import.InfoDoc != null) {\r\n\t\t\t\t\t\tPdfDocumentCreator.ProcessInfoItem(import.InfoDoc.DocumentElement.SelectSingleNode(Constants.PageLink) as XmlElement, processors);\r\n\t\t\t\t\t\tPdfDocumentCreator.ProcessInfoItem(import.InfoDoc.DocumentElement.SelectSingleNode(Constants.NamedDestination) as XmlElement, processors);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tXmlElement bookmarks = null;\r\n\t\t\t\t\tif (options.ImportBookmarks && pdfSettings.RemoveBookmarks == false || xInfoDoc != null) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"导入书签。\");\r\n\t\t\t\t\t\tbookmarks = import.GetBookmarks() ?? OutlineManager.GetBookmark(pdf, new UnitConverter() { Unit = Constants.Units.Point });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (bookmarks != null) {\r\n\t\t\t\t\t\t// 预处理书签\r\n\t\t\t\t\t\tprocessors.Add(new CollapseBookmarkProcessor() { BookmarkStatus = pdfSettings.ViewerPreferences.CollapseBookmark });\r\n\t\t\t\t\t\tPdfDocumentCreator.ProcessInfoItem(bookmarks, processors);\r\n\t\t\t\t\t\tif (bookmarks.ChildNodes.Count > 0 || xInfoDoc != null) {\r\n\t\t\t\t\t\t\timport.ImportNamedDestinations(pdf, st.Writer);\r\n\t\t\t\t\t\t\tOutlineManager.KillOutline(pdf);\r\n\t\t\t\t\t\t\tvar bm = OutlineManager.WriteOutline(st.Writer, bookmarks, pdf.NumberOfPages);\r\n\t\t\t\t\t\t\tif (bm != null) {\r\n\t\t\t\t\t\t\t\tpdf.Catalog.Put(PdfName.OUTLINES, bm);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (pdf.Catalog.Contains(PdfName.PAGEMODE) == false) {\r\n\t\t\t\t\t\t\t\tpdf.Catalog.Put(PdfName.PAGEMODE, PdfName.USEOUTLINES);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (String.IsNullOrEmpty(docPath) == false) {\r\n\t\t\t\t\t\t\tOutlineManager.KillOutline(pdf);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.IncrementProgress(10);\r\n\t\t\t\t\tTracker.TraceMessage(\"导入文档设置。\");\r\n\t\t\t\t\timport.ImportViewerPreferences(pdf);\r\n\t\t\t\t\tDocInfoImporter.OverrideViewerPreferences(pdfSettings.ViewerPreferences, pdf, st.Writer);\r\n\t\t\t\t\t//import.OverrideDocumentSettings (pdf);\r\n\t\t\t\t\tTracker.IncrementProgress(5);\r\n\t\t\t\t\tTracker.TraceMessage(\"清理输出文件。\");\r\n\t\t\t\t\tpdf.RemoveUnusedObjects();\r\n\t\t\t\t\tif (pdf.AcroForm == null) {\r\n\t\t\t\t\t\tpdf.Trailer.Locate<PdfDictionary>(PdfName.ROOT).Remove(PdfName.ACROFORM);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.IncrementProgress(10);\r\n\t\t\t\t\tTracker.TraceMessage($\"保存文件：{targetFile}\");\r\n\t\t\t\t\tst.Close();\r\n\t\t\t\t\tTracker.TrackProgress(workload);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"导入信息时发生错误\", ex);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (pdf != null) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tpdf.Close();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\t// ignore exception\r\n\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (overwriteSource) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tTracker.TraceMessage(\"覆盖输入文件。\");\r\n\t\t\t\t\tFile.Delete(sourcePath);\r\n\t\t\t\t\tFile.Move(targetFile, sourcePath);\r\n\t\t\t\t\ttargetFile = sourcePath;\r\n\t\t\t\t\ttargetFile.ToFileInfo().CreationTime = sourceCreationTime;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception) {\r\n\t\t\t\t\tFormHelper.ErrorBox($\"无法覆盖输入文件。\\n请手工将“{Ext.Tmp}”后缀的临时文件更名为输入文件。\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(Tracker.Category.Alert, $\"成功导入信息到 <<{targetFile}>>。\");\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tinternal static string ReplaceTargetFileNameMacros(string sourceFile, string targetFile, PdfReader pdf) {\r\n\t\t\ttry {\r\n\t\t\t\treturn ReplaceTargetFileNameMacros(sourceFile, targetFile, pdf.Trailer.GetAsDict(PdfName.INFO), pdf.NumberOfPages);\r\n\t\t\t}\r\n\t\t\tcatch (IOException) {\r\n\t\t\t\treturn ReplaceTargetFileNameMacros(sourceFile, targetFile, null as PdfDictionary, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\t/// <summary>\r\n\t\t/// 替换目标文件名的替代符。\r\n\t\t/// </summary>\r\n\t\t/// <param name=\"sourceFile\">用于替换的源文件名。</param>\r\n\t\t/// <param name=\"targetFile\">包含替代符的目标文件名。</param>\r\n\t\t/// <param name=\"info\">源文件的元数据属性。</param>\r\n\t\t/// <param name=\"pageCount\">源文件的页数。</param>\r\n\t\t/// <returns>替换目标文件名后的文件名。</returns>\r\n\t\tinternal static string ReplaceTargetFileNameMacros(string sourceFile, string targetFile, PdfDictionary info, int pageCount) {\r\n\t\t\tstring p = null; // 文档属性\r\n\t\t\tif (info != null) {\r\n\t\t\t\tif (info.Contains(PdfName.TITLE)) {\r\n\t\t\t\t\tp = FileHelper.GetValidFileName(info.GetAsString(PdfName.TITLE).ToUnicodeString());\r\n\t\t\t\t}\r\n\t\t\t\ttargetFile = targetFile.Replace(Constants.FileNameMacros.TitleProperty, p ?? Path.GetFileNameWithoutExtension(sourceFile));\r\n\t\t\t\tp = String.Empty;\r\n\t\t\t\tif (info.Contains(PdfName.SUBJECT)) {\r\n\t\t\t\t\tp = FileHelper.GetValidFileName(info.GetAsString(PdfName.SUBJECT).ToUnicodeString());\r\n\t\t\t\t}\r\n\t\t\t\ttargetFile = targetFile.Replace(Constants.FileNameMacros.SubjectProperty, p);\r\n\t\t\t\tp = String.Empty;\r\n\t\t\t\tif (info.Contains(PdfName.AUTHOR)) {\r\n\t\t\t\t\tp = FileHelper.GetValidFileName(info.GetAsString(PdfName.AUTHOR).ToUnicodeString());\r\n\t\t\t\t}\r\n\t\t\t\ttargetFile = targetFile.Replace(Constants.FileNameMacros.AuthorProperty, p);\r\n\t\t\t\tp = String.Empty;\r\n\t\t\t\tif (info.Contains(PdfName.KEYWORDS)) {\r\n\t\t\t\t\tp = FileHelper.GetValidFileName(info.GetAsString(PdfName.KEYWORDS).ToUnicodeString());\r\n\t\t\t\t}\r\n\t\t\t\ttargetFile = targetFile.Replace(Constants.FileNameMacros.KeywordsProperty, p);\r\n\t\t\t}\r\n\t\t\treturn targetFile\r\n\t\t\t\t.Replace(Constants.FileNameMacros.FileName, Path.GetFileNameWithoutExtension(sourceFile))\r\n\t\t\t\t.Replace(Constants.FileNameMacros.FolderName, Path.GetFileName(Path.GetDirectoryName(sourceFile)))\r\n\t\t\t\t.Replace(Constants.FileNameMacros.PathName, FileHelper.CombinePath(sourceFile.Substring(0, sourceFile.LastIndexOf(Path.DirectorySeparatorChar)), String.Empty))\r\n\t\t\t\t.Replace(Constants.FileNameMacros.PageCount, pageCount.ToText());\r\n\t\t}\r\n\r\n\t\tprivate static bool VerifyInfoDocument(XmlDocument infoDoc) {\r\n\t\t\tvar root = infoDoc.DocumentElement;\r\n\t\t\tswitch (root.Name) {\r\n\t\t\t\tcase Constants.PdfInfo:\r\n\t\t\t\t\t// 使用中文的书签\r\n\t\t\t\t\tvar v = root.GetAttribute(Constants.Info.ProductVersion);\r\n\t\t\t\t\tif (v != Constants.InfoDocVersion\r\n\t\t\t\t\t\t&& FormHelper.YesNoBox($\"信息文件不是用这个版本的程序生成的，可能会导入不成功，是否继续？\\n当前程序的版本是：{Application.ProductVersion}\\n信息文件的导出程序版本是：{v}\") == DialogResult.No) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tFormHelper.ErrorBox(\"信息文件格式有误，根元素不是“\" + Constants.PdfInfo + \"”。\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tinternal static void ExtractPages(ExtractPageOptions options, string sourceFile, string targetFile) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\tvar pdf = OpenPdf(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\tif (pdf == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tif (pdf.ConfirmUnethicalMode() == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tPdfPageExtractor.ExtractPages(options, sourceFile, targetFile, pdf);\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"导出页面内容时出错\", ex);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (pdf != null) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tpdf.Close();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\t// ignore exception\r\n\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void MergeDocuments(ICollection<SourceItem> sources, FilePath targetFile, string infoFile) {\r\n\t\t\ttargetFile = targetFile.EnsureExtension(Ext.Pdf);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile.ToString());\r\n\t\t\tvar option = AppContext.Merger;\r\n\t\t\tvar impOptions = AppContext.Importer;\r\n\t\t\tDocument doc = null;\r\n\t\t\tvar sink = new DocumentSink(sources, true);\r\n\t\t\tif (sink.Workload == 0) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, \"合并文件列表不包含图片或 PDF 文件。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tTracker.SetProgressGoal(10 + sink.Workload);\r\n\t\t\tTracker.TrackProgress(1);\r\n\t\t\ttry {\r\n\t\t\t\tGeneralInfo info = null;\r\n\t\t\t\tPdfPageLabels labels = null;\r\n\t\t\t\tBookmarkContainer bookmarks = null;\r\n\t\t\t\tif (String.IsNullOrEmpty(infoFile) == false) {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"加载信息文件：<<{infoFile}>>。\");\r\n\t\t\t\t\tvar import = new DocInfoImporter(impOptions, infoFile);\r\n\t\t\t\t\tinfo = import.ImportDocumentInformation();\r\n\t\t\t\t\tlabels = import.ImportPageLabels();\r\n\t\t\t\t\tbookmarks = import.GetBookmarks();\r\n\t\t\t\t}\r\n\t\t\t\tif (labels == null && option.PageLabels.Count > 0) {\r\n\t\t\t\t\tlabels = DocInfoImporter.ImportPageLabels(option.PageLabels);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar f = targetFile.EnsureExtension(Ext.Pdf);\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, f.ToString());\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"输出到文件：{f}。\");\r\n\t\t\t\tif (f.IsValidPath == false) {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输出文件路径无效。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tf.CreateContainingDirectory();\r\n\t\t\t\tusing (Stream s = new FileStream(f, FileMode.Create)) {\r\n\t\t\t\t\tvar ps = option.PageSettings;\r\n\t\t\t\t\tdoc = new Document(\r\n\t\t\t\t\t\tnew iTextSharp.text.Rectangle(ps.PaperSize.Width, ps.PaperSize.Height),\r\n\t\t\t\t\t\tps.Margins.Left, ps.Margins.Right, ps.Margins.Top, ps.Margins.Bottom\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tPdfCopy w = option.Deduplicate ? new PdfSmartCopy(doc, s) : new PdfCopy(doc, s);\r\n\t\t\t\t\tw.Info.Put(PdfName.PRODUCER, new PdfString($\"{Application.ProductName} {Application.ProductVersion}\"));\r\n\t\t\t\t\tif (option.FullCompression) {\r\n\t\t\t\t\t\tw.SetFullCompression();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//w.CompressionLevel = ContextData.CreateDocumentOptions.CompressionLevel;\r\n\t\t\t\t\tdoc.Open();\r\n\t\t\t\t\tdoc.AddCreator(Application.ProductName + \" \" + Application.ProductVersion);\r\n\t\t\t\t\tif (labels != null) {\r\n\t\t\t\t\t\tw.PageLabels = labels;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tTracker.IncrementProgress(10);\r\n\t\t\t\t\tvar creator = new PdfDocumentCreator(sink, option, impOptions, doc, w);\r\n\t\t\t\t\tforeach (var item in sources) {\r\n\t\t\t\t\t\tcreator.ProcessFile(item, creator.PdfBookmarks.BookmarkRoot);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.TraceMessage(\"设置文档选项。\");\r\n\t\t\t\t\tDocInfoImporter.ImportDocumentInformation(option.MetaData.SpecifyMetaData\r\n\t\t\t\t\t\t\t? option.MetaData\r\n\t\t\t\t\t\t\t: info, doc);\r\n\t\t\t\t\tDocInfoImporter.OverrideViewerPreferences(option.ViewerPreferences, null, w);\r\n\t\t\t\t\tif ((bookmarks == null || bookmarks.HasChildNodes == false) && creator.PdfBookmarks.DocumentElement.HasChildNodes) {\r\n\t\t\t\t\t\tbookmarks = creator.PdfBookmarks.BookmarkRoot;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (bookmarks != null && bookmarks.HasChildNodes) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"写入文档书签。\");\r\n\t\t\t\t\t\tOutlineManager.WriteOutline(w, bookmarks, w.GetPageCount());\r\n\t\t\t\t\t\tw.ViewerPreferences = PdfWriter.PageModeUseOutlines;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tTracker.TraceMessage(\"写入文件索引。\");\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, $\"合并了 {creator.InputDocumentCount.ToText()} 个文件共 {w.GetPageCount()} 页到：<<\" + targetFile.ToString() + \">>。\");\r\n\t\t\t\t\tw.Close();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"生成文档时出错\", ex);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (doc != null) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tdoc.Close();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\t// ignore exception\r\n\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void CreateBookmark(string sourceFile, string bookmarkFile, AutoBookmarkOptions options) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, bookmarkFile);\r\n\t\t\tvar r = OpenPdf(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\tif (r == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.IsPathValid(bookmarkFile) == false || Path.GetFileName(bookmarkFile).Length == 0) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, Messages.InfoFileNameInvalid);\r\n\t\t\t\tFormHelper.ErrorBox(Messages.InfoFileNameInvalid);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbookmarkFile = FileHelper.MakePathRootedAndWithExtension(bookmarkFile, sourceFile, Ext.Xml, false);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, bookmarkFile);\r\n\r\n\t\t\tif (options.CreateBookmarkForFirstPage) {\r\n\t\t\t\toptions.FirstPageTitle = Path.GetFileNameWithoutExtension(sourceFile);\r\n\t\t\t}\r\n\t\t\tvar creator = new AutoBookmarkCreator(r, options);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tTracker.TraceMessage(\"正在分析 PDF 文件。\");\r\n\t\t\t\tvar workload = creator.EstimateWorkload();\r\n\t\t\t\tTracker.SetProgressGoal(workload);\r\n\t\t\t\tusing (XmlWriter w = XmlWriter.Create(bookmarkFile, DocInfoExporter.GetWriterSettings())) {\r\n\t\t\t\t\tw.WriteStartDocument();\r\n\t\t\t\t\tw.WriteStartElement(Constants.PdfInfo);\r\n\t\t\t\t\tw.WriteAttributeString(Constants.Info.ProductName, Application.ProductName);\r\n\t\t\t\t\tw.WriteAttributeString(Constants.Info.ProductVersion, Constants.InfoDocVersion);\r\n\t\t\t\t\tw.WriteAttributeString(Constants.Info.ExportDate, DateTime.Now.ToString(\"yyyy年MM月dd日 HH:mm:ss\"));\r\n\t\t\t\t\t//w.WriteAttributeString (Constants.Info.DocumentName, Path.GetFileNameWithoutExtension (sourceFile));\r\n\t\t\t\t\tw.WriteAttributeString(Constants.Info.DocumentPath, sourceFile);\r\n\t\t\t\t\tw.WriteAttributeString(Constants.Info.PageNumber, r.NumberOfPages.ToText());\r\n\t\t\t\t\tcreator.ExportAutoBookmarks(w, options);\r\n\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"成功导出信息文件到 <<\" + bookmarkFile + \">>。\");\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (System.Text.EncoderFallbackException ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(\"在导出信息文件时遇到错误：\\n\" + ex.Message + \"\\n\\n请选择在导出信息选项中选择其它编码方式。\");\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(\"在导出信息文件时遇到错误：\\n\" + ex.Message);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (r != null) {\r\n\t\t\t\t\tr.Close();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void Ocr(string sourceFile, string bookmarkFile, OcrOptions options) {\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, bookmarkFile);\r\n\t\t\tvar r = OpenPdf(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\tif (r == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbool noOutputFile = false;\r\n\t\t\tif (String.IsNullOrEmpty(bookmarkFile)) {\r\n\t\t\t\tnoOutputFile = true;\r\n\t\t\t}\r\n\t\t\telse if (FileHelper.IsPathValid(bookmarkFile) == false || Path.GetFileName(bookmarkFile).Length == 0) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, Messages.InfoFileNameInvalid);\r\n\t\t\t\tFormHelper.ErrorBox(Messages.InfoFileNameInvalid);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tif (FileHelper.CheckOverwrite(bookmarkFile) == false) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tbookmarkFile = FileHelper.MakePathRootedAndWithExtension(bookmarkFile, sourceFile, Ext.Xml, false);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, bookmarkFile);\r\n\r\n\t\t\tOcrProcessor ocr;\r\n\t\t\ttry {\r\n\t\t\t\tocr = new OcrProcessor(r, options);\r\n\t\t\t}\r\n\t\t\tcatch (FileNotFoundException ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(ex.Message);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tTracker.TraceMessage(\"正在分析 PDF 文件。\");\r\n\t\t\t\tvar workload = ocr.EstimateWorkload();\r\n\t\t\t\tTracker.SetProgressGoal(workload);\r\n\t\t\t\tif (noOutputFile) {\r\n\t\t\t\t\tocr.PerformOcr();\r\n\t\t\t\t}\r\n\t\t\t\telse if (new FilePath(bookmarkFile).HasExtension(Ext.Txt)) {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, bookmarkFile);\r\n\t\t\t\t\tTracker.TraceMessage(\"输出简易信息文件：\" + bookmarkFile);\r\n\t\t\t\t\tusing (var w = new StreamWriter(bookmarkFile, false, AppContext.Exporter.GetEncoding())) {\r\n\t\t\t\t\t\tDocInfoExporter.WriteDocumentInfoAttributes(w, sourceFile, r.NumberOfPages);\r\n\t\t\t\t\t\tocr.SetWriter(w);\r\n\t\t\t\t\t\tocr.PerformOcr();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, bookmarkFile);\r\n\t\t\t\t\tTracker.TraceMessage(\"输出信息文件：\" + bookmarkFile);\r\n\t\t\t\t\tusing (var w = XmlWriter.Create(bookmarkFile, DocInfoExporter.GetWriterSettings())) {\r\n\t\t\t\t\t\tw.WriteStartDocument();\r\n\t\t\t\t\t\tw.WriteStartElement(Constants.PdfInfo);\r\n\t\t\t\t\t\tDocInfoExporter.WriteDocumentInfoAttributes(w, sourceFile, r.NumberOfPages);\r\n\t\t\t\t\t\tocr.SetWriter(w);\r\n\t\t\t\t\t\tocr.PerformOcr();\r\n\t\t\t\t\t\tw.WriteEndElement();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (noOutputFile == false) {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"已完成导出信息文件到 <<\" + bookmarkFile + \">>。\");\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"分析文档完毕。\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (System.Text.EncoderFallbackException ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(\"在导出信息文件时遇到错误：\\n\" + ex.Message + \"\\n\\n请选择在导出信息选项中选择其它编码方式。\");\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tFormHelper.ErrorBox(\"在导出信息文件时遇到错误：\\n\" + ex.Message);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (r != null) {\r\n\t\t\t\t\tr.Close();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static string GetExpandedFileName(SourceItem.Pdf item, string template) {\r\n\t\t\tstring t;\r\n\t\t\tvar s = item.FilePath;\r\n\t\t\tvar d = new PdfDictionary();\r\n\t\t\tDocInfoImporter.UpdateInfoValue(d, PdfName.TITLE, item.DocInfo.Title, s);\r\n\t\t\tDocInfoImporter.UpdateInfoValue(d, PdfName.AUTHOR, item.DocInfo.Author, s);\r\n\t\t\tDocInfoImporter.UpdateInfoValue(d, PdfName.SUBJECT, item.DocInfo.Subject, s);\r\n\t\t\tDocInfoImporter.UpdateInfoValue(d, PdfName.KEYWORDS, item.DocInfo.Keywords, s);\r\n\t\t\tt = ReplaceTargetFileNameMacros(s.ToString(), template, d, item.PageCount);\r\n\t\t\tif (FileHelper.IsPathValid(t) == false) {\r\n\t\t\t\treturn t;\r\n\t\t\t}\r\n\t\t\telse if (Path.GetFileName(t).Length > 0) {\r\n\t\t\t\tt = new FilePath(t).EnsureExtension(Ext.Pdf).ToString();\r\n\t\t\t}\r\n\t\t\treturn Path.GetFullPath(t);\r\n\t\t}\r\n\r\n\t\tinternal static void RenameFiles(List<SourceItem.Pdf> items, string template, bool keepSourceFile) {\r\n\t\t\tTracker.SetTotalProgressGoal(items.Count);\r\n\t\t\tTracker.TraceMessage($\"使用“{template}”模板重命名。\");\r\n\t\t\tforeach (var item in items) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar s = item.FilePath.ToFullPath();\r\n\t\t\t\t\tif (s.ExistsFile == false) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, $\"找不到 PDF 文件：{s}\");\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar t = GetExpandedFileName(item, template);\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, s.ToString());\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, t);\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"重命名 PDF 文件：{s}\");\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, $\"到目标 PDF 文件：<<{t}>>。\");\r\n\t\t\t\t\tif (FileHelper.IsPathValid(t) == false) {\r\n\t\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, $\"输出文件名 {t} 无效。\");\r\n\t\t\t\t\t\tgoto Exit;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (s.Equals(t)) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"源文件与目标文件名称相同。不需重命名。\");\r\n\t\t\t\t\t\tgoto Exit;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (Path.GetFileName(t).Trim().Length == 0) {\r\n\t\t\t\t\t\tTracker.TraceMessage(\"输出文件名为空，无法重命名。\");\r\n\t\t\t\t\t\tgoto Exit;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (File.Exists(t)) {\r\n\t\t\t\t\t\tswitch (FormHelper.YesNoCancelBox(\"是否覆盖已存在的 PDF 文件：\" + t)) {\r\n\t\t\t\t\t\t\tcase DialogResult.No:\r\n\t\t\t\t\t\t\t\tgoto Exit;\r\n\t\t\t\t\t\t\tcase DialogResult.Cancel:\r\n\t\t\t\t\t\t\t\tthrow new OperationCanceledException();\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tFile.Delete(t);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (Directory.Exists(Path.GetDirectoryName(t)) == false) {\r\n\t\t\t\t\t\tDirectory.CreateDirectory(Path.GetDirectoryName(t));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (keepSourceFile) {\r\n\t\t\t\t\t\tFile.Copy(s.ToString(), t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tFile.Move(s.ToString(), t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\t\tTracker.TraceMessage(Tracker.Category.Alert, \"已取消重命名操作。\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t}\r\n\t\t\tExit:\r\n\t\t\t\tTracker.IncrementTotalProgress();\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(\"重命名操作已完成。\");\r\n\t\t}\r\n\r\n\t\tinternal static void ImportOcr(string sourceFile, string infoFile, string targetFile) {\r\n\t\t\tif (FileHelper.IsPathValid(sourceFile) == false) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输入 PDF 文件路径无效。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.IsPathValid(targetFile) == false) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输出 PDF 文件路径无效。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.IsPathValid(infoFile) == false) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"信息文件路径无效。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.HasExtension(infoFile, Ext.Xml) == false) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"信息文件不是 XML 文件，只有扩展名为 XML 的识别结果文件才能写入 PDF 文档。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tTracker.TraceMessage(Tracker.Category.InputFile, sourceFile);\r\n\t\t\tTracker.TraceMessage(Tracker.Category.OutputFile, targetFile);\r\n\t\t\tif (FileHelper.ComparePath(sourceFile, targetFile)) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.Error, \"输入文件和输出文件不能相同。\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (FileHelper.CheckOverwrite(targetFile) == false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar pdf = OpenPdf(sourceFile, AppContext.LoadPartialPdfFile, false);\r\n\t\t\tif (pdf == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tusing (var infoReader = XmlReader.Create(infoFile, new XmlReaderSettings() { IgnoreComments = true, IgnoreProcessingInstructions = true })) {\r\n\t\t\t\t\tinfoReader.MoveToContent(); // 移到根元素\r\n\t\t\t\t\tusing (var s = new FileStream(targetFile, FileMode.Create)) {\r\n\t\t\t\t\t\tvar st = new PdfStamper(pdf, s);\r\n\t\t\t\t\t\tvar en = new PdfProcessingEngine(pdf);\r\n\t\t\t\t\t\ten.ExtraData[DocProcessorContext.OcrData] = infoReader;\r\n\t\t\t\t\t\ten.DocumentProcessors.Add(new ImportOcrResultProcessor());\r\n\t\t\t\t\t\tTracker.SetProgressGoal(en.EstimateWorkload());\r\n\t\t\t\t\t\ten.ProcessDocument(st.Writer);\r\n\t\t\t\t\t\tst.Close();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, \"成功写入识别结果到文件：<<\" + targetFile + \">>。\");\r\n\t\t\t}\r\n\t\t\tcatch (OperationCanceledException) {\r\n\t\t\t\tTracker.TraceMessage(Tracker.Category.ImportantMessage, OperationCanceled);\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\tAppContext.MainForm.ErrorBox(\"导入信息时发生错误\", ex);\r\n\t\t\t}\r\n\t\t\tfinally {\r\n\t\t\t\tif (pdf != null) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tpdf.Close();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (Exception ex) {\r\n\t\t\t\t\t\t// ignore exception\r\n\t\t\t\t\t\tTracker.TraceMessage(ex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Program.cs",
    "content": "﻿using System;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Windows.Forms;\r\nusing System.Threading;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tstatic class Program\r\n\t{\r\n\t\t[STAThread]\r\n\t\tstatic void Main(string[] args) {\r\n\t\t\tusing (var m = new Mutex(true, Constants.AppEngName)) {\r\n\t\t\t\tif (FormHelper.IsCtrlKeyDown || m.WaitOne(100)) {\r\n\t\t\t\t\tApplication.EnableVisualStyles();\r\n\t\t\t\t\tApplication.SetCompatibleTextRenderingDefault(false);\r\n\t\t\t\t\tApplication.Run(AppContext.MainForm = new MainForm());\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tProcess.GetProcesses()\r\n\t\t\t\t\t\t.FirstOrDefault(p => p.MainWindowTitle.HasPrefix($\"{Constants.AppName} [\"))\r\n\t\t\t\t\t\t?.SendCopyDataMessage(String.Join(\"\\n\", args));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// 有关程序集的常规信息通过下列属性集\r\n// 控制。更改这些属性值可修改\r\n// 与程序集关联的信息。\r\n[assembly: AssemblyTitle(PDFPatcher.Constants.AppName)]\r\n[assembly: AssemblyDescription(PDFPatcher.Constants.AppName + \" - 解除 PDF 文档的烦恼\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"wmjordan@163.com\")]\r\n[assembly: AssemblyProduct(PDFPatcher.Constants.AppEngName)]\r\n[assembly: AssemblyCopyright(\"著作权所有 © WMJordan 2009～2025\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// 将 ComVisible 设置为 false 使此程序集中的类型\r\n// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型，\r\n// 则将该类型上的 ComVisible 属性设置为 true。\r\n[assembly: ComVisible(false)]\r\n\r\n// 如果此项目向 COM 公开，则下列 GUID 用于类型库的 ID\r\n[assembly: Guid(\"e8969c5f-a5fe-4dce-a08b-555686483732\")]\r\n\r\n[assembly: AssemblyVersion(\"1.1.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.1.3.4662\")]\r\n"
  },
  {
    "path": "App/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace PDFPatcher.Properties {\r\n    using System;\r\n    \r\n    \r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources {\r\n        \r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n        \r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n        \r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources() {\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager {\r\n            get {\r\n                if (object.ReferenceEquals(resourceMan, null)) {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"PDFPatcher.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture {\r\n            get {\r\n                return resourceCulture;\r\n            }\r\n            set {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap About {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"About\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;\r\n        ///&lt;html&gt;\r\n        ///\t&lt;head&gt;\r\n        ///\t\t&lt;title&gt;关于 $AppName&lt;/title&gt;\r\n        ///\t\t&lt;style&gt;\r\n        ///body {\r\n        ///\tmargin: 0;\r\n        ///\tpadding: 5pt;\r\n        ///}\r\n        ///h1 {\r\n        ///\tfont-size: 15pt;\r\n        ///\tcolor: #6666cc;\r\n        ///\tborder-bottom: 1px dashed #9900ff;\r\n        ///\tmargin: 5pt 0;\r\n        ///}\r\n        ///p, td {\r\n        ///\tpadding: 3pt 0pt;\r\n        ///\tmargin: 0pt;\r\n        ///\tfont-size: 11pt;\r\n        ///}\r\n        ///h2 {\r\n        ///\tfont-size: 12pt;\r\n        ///\tpadding: 3pt 0;\r\n        ///\tmargin: 0;\r\n        ///\tcolor: #6666cc;\r\n        ///}\r\n        ///span {\r\n        ///\tdisplay: inline-block;\r\n        ///\twidth: 50%;\r\n        ///}\r\n        ///\t\t&lt;/style&gt;\r\n        ///\t&lt;/head&gt;\r\n        ///\t&lt;body&gt;\r\n        ///\t\t&lt;h1&gt;关于 $AppName&lt;/h1&gt;\r\n        ///\t\t&lt;div style=&quot;padding: 0  [rest of string was truncated]&quot;;.\r\n        /// </summary>\r\n        internal static string AboutPage {\r\n            get {\r\n                return ResourceManager.GetString(\"AboutPage\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Actions {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Actions\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Add {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Add\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap AddChildNode {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"AddChildNode\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap AlphabeticSort {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"AlphabeticSort\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap AppOptions {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"AppOptions\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap AutoBookmark {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"AutoBookmark\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Bold {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Bold\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap BookmarkFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"BookmarkFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ChangeCase {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ChangeCase\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap CheckUpdate {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"CheckUpdate\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Close {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Close\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Collapse {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Collapse\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ColorDisplay {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ColorDisplay\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Convert {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Convert\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Copy {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Copy\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap CreateDocument {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"CreateDocument\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap CursorMode {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"CursorMode\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap CustomizeToolbar {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"CustomizeToolbar\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap DarkMode {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"DarkMode\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Delete {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Delete\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap DocumentInspector {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"DocumentInspector\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap DocumentProcessor {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"DocumentProcessor\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Donation {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Donation\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap EditItem {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"EditItem\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Editor {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Editor\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap EmptyPage {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"EmptyPage\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap EvenPage {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"EvenPage\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Expand {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Expand\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ExportFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ExportFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ExportInfoFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ExportInfoFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ExtractImage {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ExtractImage\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ExtractPages {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ExtractPages\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Fonts {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Fonts\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;\r\n        ///&lt;html&gt;\r\n        ///\t&lt;head&gt;\r\n        ///\t\t&lt;title&gt;$appName&lt;/title&gt;\r\n        ///\t\t&lt;style&gt;\r\n        ///body {\r\n        ///\tmargin: 0;\r\n        ///\tpadding: 5pt;\r\n        ///}\r\n        ///h1 {\r\n        ///\tfont-size: 15pt;\r\n        ///\tcolor: #6666cc;\r\n        ///\tborder-bottom: 1px dashed #9900ff;\r\n        ///\tmargin: 5pt 0;\r\n        ///}\r\n        ///p {\r\n        ///\tpadding: 3pt 10pt;\r\n        ///\tmargin: 0pt;\r\n        ///\tfont-size: 11pt;\r\n        ///\tcolor: #999999;\r\n        ///}\r\n        ///h2 {\r\n        ///\tfont-size: 12pt;\r\n        ///\tpadding: 3pt 0;\r\n        ///\tmargin: 0;\r\n        ///\tcolor: #6666cc;\r\n        ///}\r\n        ///td {\r\n        ///\tvertical-align: top;\r\n        ///}\r\n        ///\t\t&lt;/style&gt;\r\n        ///\t&lt;/head&gt;\r\n        ///\t&lt;body&gt;\r\n        ///\t\t&lt;h1&gt;&lt;a href=&quot;func:About&quot;&gt;$appName&lt;/a&gt;&lt;/h1&gt;\r\n        ///\t\t&lt;table&gt; [rest of string was truncated]&quot;;.\r\n        /// </summary>\r\n        internal static string FrontPage {\r\n            get {\r\n                return ResourceManager.GetString(\"FrontPage\", resourceCulture);\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap GrayScaleDisplay {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"GrayScaleDisplay\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap GreenMode {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"GreenMode\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap HomePage {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"HomePage\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Image {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Image\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ImageFolder {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ImageFolder\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ImportFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ImportFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ImportInfoFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ImportInfoFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ImportOcr {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ImportOcr\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap InfoFileOptions {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"InfoFileOptions\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap InsertMacro {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"InsertMacro\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap InvertColor {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"InvertColor\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Italic {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Italic\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Lanscape {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Lanscape\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Log {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Log\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Logo {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Logo\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Mark {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Mark\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Merge {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Merge\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Merger {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Merger\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Move {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Move\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap MoveBottom {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"MoveBottom\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap MoveDown {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"MoveDown\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap MoveLeft {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"MoveLeft\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap MoveRight {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"MoveRight\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap MoveTop {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"MoveTop\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap MoveUp {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"MoveUp\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap NaturalSort {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"NaturalSort\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap NewPdfFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"NewPdfFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Ocr {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Ocr\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap OddPage {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"OddPage\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Open {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Open\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap OpenFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"OpenFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap OriginalPdfFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"OriginalPdfFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap PageProcessor {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"PageProcessor\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap PageRange {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"PageRange\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Palette {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Palette\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Paste {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Paste\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap PdfOptions {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"PdfOptions\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap PdfPageRange {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"PdfPageRange\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Pin {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Pin\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Portrait {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Portrait\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Property {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Property\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Refresh {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Refresh\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Rename {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Rename\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap RenderDocument {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"RenderDocument\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap RenderImage {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"RenderImage\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Replace {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Replace\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Reset {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Reset\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Return {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Return\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap RotateLeft {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"RotateLeft\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap RotateRight {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"RotateRight\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Save {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Save\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap SaveAs {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"SaveAs\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ScrollHorizontal {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ScrollHorizontal\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ScrollPosition {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ScrollPosition\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ScrollVertical {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ScrollVertical\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap SearchReplace {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"SearchReplace\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap SelectAll {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"SelectAll\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap SelectItem {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"SelectItem\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap SelectMarks {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"SelectMarks\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ShortCut {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ShortCut\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Sort {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Sort\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap SortReverse {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"SortReverse\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap TextFile {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"TextFile\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Time {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Time\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Undo {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Undo\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Unmark {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Unmark\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap ViewContent {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"ViewContent\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r\n        /// </summary>\r\n        internal static System.Drawing.Bitmap Zoom {\r\n            get {\r\n                object obj = ResourceManager.GetObject(\"Zoom\", resourceCulture);\r\n                return ((System.Drawing.Bitmap)(obj));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "App/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\r\n  <data name=\"MoveRight\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-000-medium.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ExportFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"SelectMarks\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\bookmarks.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"PdfPageRange\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-pdf-number.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"RotateLeft\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\layer-rotate-left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"InsertMacro\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ui-text-field-select.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"CreateDocument\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\book-open-text-image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Bold\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\edit-bold.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Sort\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\edit-list-order.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Copy\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Return\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-stop-180.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ImportFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Logo\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\pdf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ScrollPosition\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ui-scroll-pane-both.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"BookmarkFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-bookmark.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Delete\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\101.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Convert\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-convert.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"NewPdfFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-pdf-text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Save\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\096.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Italic\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\edit-italic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"OpenFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\blue-folder-open-document.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"TextFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Undo\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-circle-225-left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ExportInfoFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-bookmark-export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Merge\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-merge-180-left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ExtractPages\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\documents.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"MoveUp\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\108.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"SelectItem\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\table-select-row.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"MoveDown\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\107.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Zoom\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\magnifier-zoom.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Open\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\folder-open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Mark\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\bookmark--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Refresh\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-circle-double.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Unmark\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\bookmark--minus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Reset\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\exclamation-red-frame.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"EditItem\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\notebook--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Paste\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\clipboard-paste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"RotateRight\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\layer-rotate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"PageRange\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-number.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"OriginalPdfFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-pdf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Add\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\103.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ChangeCase\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\edit-uppercase.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ImageFolder\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\folder-open-image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"SearchReplace\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\magnifier--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ImportInfoFile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-bookmark-import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ExtractImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\image--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"EmptyPage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"SelectAll\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\table-select-all.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"MoveLeft\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-180-medium.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Palette\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\resources\\palette.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Ocr\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\Ocr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ViewContent\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\inbox-document-text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ImportOcr\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ImportOcr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Collapse\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\toggle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Expand\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\toggle-expand.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"RenderImage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-text-image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"AppOptions\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\application-task.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"DocumentInspector\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\DocumentInspector.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"InfoFileOptions\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\InfoFileOptions.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Log\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\application-list.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"PdfOptions\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\PdfOptions.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Actions\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\wand-magic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"DocumentProcessor\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-processor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"PageProcessor\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\page-processor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Merger\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-merge.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"AddChildNode\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\node-insert-next.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Image\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Fonts\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\fonts.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"MoveBottom\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-stop-270.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"MoveTop\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-stop-090.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"AlphabeticSort\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\alphabetic-sort.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"NaturalSort\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\natural-sort.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"EvenPage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-number-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Lanscape\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"OddPage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-number-1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Portrait\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\image-vertical.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"About\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\user-black.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"CheckUpdate\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\application-home.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"HomePage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\home.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ShortCut\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-045-small.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"FrontPage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Functions\\FrontPage.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\r\n  </data>\r\n  <data name=\"Rename\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-rename.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ScrollHorizontal\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ui-scroll-bar-horizontal.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ScrollVertical\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ui-scroll-bar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"SaveAs\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\disk-rename.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"ColorDisplay\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\color.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"GrayScaleDisplay\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\grayscale.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"InvertColor\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ui-color-picker-switch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"CursorMode\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\cursor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Move\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-move.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"CustomizeToolbar\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\ui-check-boxes-series.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Property\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\property.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Pin\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\pin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"DarkMode\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\spectacle-sunglass.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"GreenMode\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\leaf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"AboutPage\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Functions\\AboutPage.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\r\n  </data>\r\n  <data name=\"AutoBookmark\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-bookmark-wand.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"RenderDocument\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-pdf-render.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Close\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\cross-button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Editor\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\document-pdf-edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Replace\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\edit-replace.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Donation\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\donation.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"SortReverse\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\arrow-continue-090.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n  <data name=\"Time\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\r\n    <value>..\\Resources\\clock.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "App/ShellHelper.cs",
    "content": "﻿using System;\r\nusing Microsoft.Win32;\r\nusing PDFPatcher.Common;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tstatic class ShellHelper\r\n\t{\r\n\t\tinternal static void CreateShortcut() {\r\n\t\t\tvar p = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);\r\n\t\t\tvar s = new ShortcutFile(FileHelper.CombinePath(p, $\"{Constants.AppEngName}.exe\")) {\r\n\t\t\t\tWorkingDirectory = p,\r\n\t\t\t\tDescription = Constants.AppName\r\n\t\t\t};\r\n\t\t\tvar desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);\r\n\t\t\ts.Save(FileHelper.CombinePath(desktopPath, $\"{Constants.AppName}.lnk\"));\r\n\r\n\t\t\tFormHelper.InfoBox($\"已在桌面创建{Constants.AppName}的快捷方式。\");\r\n\t\t}\r\n\r\n\t\tinternal static void VisitHomePage() {\r\n\t\t\tSystem.Diagnostics.Process.Start(Constants.AppHomePage);\r\n\t\t}\r\n\r\n\t\tinternal static bool CheckPdfOpenWithAssociation() {\r\n\t\t\ttry {\r\n\t\t\t\treturn OpenWithAssociation.HasAssociation();\r\n\t\t\t}\r\n\t\t\tcatch (Exception) {\r\n\t\t\t\t// ignore\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void AddPdfOpenWithAssociation() {\r\n\t\t\ttry {\r\n\t\t\t\tOpenWithAssociation.Create();\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tFormHelper.ErrorBox(ex.ToString());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinternal static void RemovePdfOpenWithAssociation() {\r\n\t\t\ttry {\r\n\t\t\t\tOpenWithAssociation.Delete();\r\n\t\t\t}\r\n\t\t\tcatch (Exception ex) {\r\n\t\t\t\tFormHelper.ErrorBox(ex.ToString());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstatic RegistryKey OpenOrCreateSubKey(this RegistryKey baseKey, string keyPath, bool createIfInexistent) {\r\n\t\t\tvar key = baseKey.OpenSubKey(keyPath, true);\r\n\t\t\treturn key == null && createIfInexistent\r\n\t\t\t\t? baseKey.CreateSubKey(keyPath)\r\n\t\t\t\t: key;\r\n\t\t}\r\n\r\n\t\tsealed class OpenWithAssociation\r\n\t\t{\r\n\t\t\tconst string MRUList = \"MRUList\";\r\n\t\t\tconst string ApplicationKey = @\"SOFTWARE\\Classes\\Applications\\PDFPatcher.exe\";\r\n\t\t\tconst string ShellOpenCommandKey = @\"\\shell\\open\\command\";\r\n\t\t\tconst string OpenWithList = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.pdf\\OpenWithList\";\r\n\t\t\tstatic readonly string AppName = FilePath.AppPath.FileName;\r\n\r\n\t\t\tpublic static bool HasAssociation() {\r\n\t\t\t\tusing (var command = Registry.CurrentUser.OpenOrCreateSubKey(ApplicationKey + ShellOpenCommandKey, false)) {\r\n\t\t\t\t\tif (command?.GetValue(String.Empty) is string != true) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tusing (var openWithList = Registry.CurrentUser.OpenOrCreateSubKey(OpenWithList, false)) {\r\n\t\t\t\t\tif (openWithList == null) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar mruList = openWithList.GetValue(MRUList) as string;\r\n\t\t\t\t\tif (mruList == null) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var k in mruList) {\r\n\t\t\t\t\t\tvar appName = openWithList.GetValue(k.ToString()) as string;\r\n\t\t\t\t\t\tif (String.Equals(appName, AppName, StringComparison.OrdinalIgnoreCase)) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tpublic static void Create() {\r\n\t\t\t\tusing (var command = Registry.CurrentUser.OpenOrCreateSubKey(ApplicationKey + ShellOpenCommandKey, true)) {\r\n\t\t\t\t\tcommand.SetValue(String.Empty, $\"\\\"{FilePath.AppPath}\\\" \\\"%1\\\"\");\r\n\t\t\t\t}\r\n\t\t\t\tusing (var openWithList = Registry.CurrentUser.OpenOrCreateSubKey(OpenWithList, true)) {\r\n\t\t\t\t\tvar mruList = openWithList.GetValue(MRUList) as string;\r\n\t\t\t\t\tif (mruList == null) {\r\n\t\t\t\t\t\topenWithList.SetValue(MRUList, \"a\");\r\n\t\t\t\t\t\topenWithList.SetValue(\"a\", AppName);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar slots = new bool[26];\r\n\t\t\t\t\tforeach (var k in mruList) {\r\n\t\t\t\t\t\tvar appName = openWithList.GetValue(k.ToString()) as string;\r\n\t\t\t\t\t\tif (String.Equals(appName, AppName, StringComparison.OrdinalIgnoreCase)) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ((uint)(k - 'a') <= ('z' - 'a')) {\r\n\t\t\t\t\t\t\tslots[k - 'a'] = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (char i = 'a'; i <= 'z'; i++) {\r\n\t\t\t\t\t\tif (slots[i - 'a'] == false) {\r\n\t\t\t\t\t\t\topenWithList.SetValue(i.ToString(), AppName);\r\n\t\t\t\t\t\t\tif (mruList.IndexOf(i) < 0) {\r\n\t\t\t\t\t\t\t\topenWithList.SetValue(MRUList, i + mruList);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tpublic static void Delete() {\r\n\t\t\t\tRegistry.CurrentUser.DeleteSubKeyTree(ApplicationKey);\r\n\t\t\t\tusing (var openWithList = Registry.CurrentUser.OpenOrCreateSubKey(OpenWithList, false)) {\r\n\t\t\t\t\tif (openWithList == null) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar mruList = openWithList.GetValue(MRUList) as string;\r\n\t\t\t\t\tif (mruList == null) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforeach (var k in mruList) {\r\n\t\t\t\t\t\tvar keyName = k.ToString();\r\n\t\t\t\t\t\tvar appName = openWithList.GetValue(keyName) as string;\r\n\t\t\t\t\t\tif (String.Equals(appName, AppName, StringComparison.OrdinalIgnoreCase)) {\r\n\t\t\t\t\t\t\topenWithList.DeleteValue(keyName);\r\n\t\t\t\t\t\t\topenWithList.SetValue(MRUList, mruList.Replace(keyName, String.Empty));\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "App/Toolkit.cs",
    "content": "﻿using System.Windows.Forms;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\t/// <summary>\r\n\t/// 支持自定义工具栏。\r\n\t/// </summary>\r\n\tsealed class Toolkit\r\n\t{\r\n\t\tinternal static readonly Toolkit[] Toolkits = {\r\n\t\t\tnew Toolkit (\"编辑器\",\"Editor\",\"Editor\",\"创建或修改 PDF 文档的书签，修改 PDF 文档的设置\", true),\r\n\t\t\tnew Toolkit (\"批量修改文档\",\"Patcher\",\"DocumentProcessor\",\"根据配置批量处理 PDF 文档，生成新的文档\", true),\r\n\t\t\tnew Toolkit (\"合并文档\",\"Merger\",\"Merger\",\"将多个图片和 PDF 文档合并为新的 PDF 文档\", true),\r\n\t\t\tnew Toolkit (\"识别文本\",\"Ocr\",\"Ocr\",\"识别扫描 PDF 文档的文字（需微软 Office 2003或2007的光学字符识别（OCR）引擎支持）\"),\r\n\t\t\tnew Toolkit (\"自动书签\",\"BookmarkGenerator\",\"AutoBookmark\",\"根据 PDF 的文本样式生成书签文件\"),\r\n\t\t\tnew Toolkit (\"批量重命名\",\"Rename\",\"Rename\",\"根据 PDF 的文本属性更改文件名\", false, false),\r\n\t\t\tnew Toolkit (\"提取页面或拆分文档\",\"ExtractPages\",\"ExtractPages\",\"提取 PDF 文档的页面或重排页面\"),\r\n\t\t\tnew Toolkit (\"提取图片\",\"ExtractImages\",\"ExtractImage\",\"无损提取 PDF 文档中的图片\", true),\r\n\t\t\tnew Toolkit (\"转换页面为图片\",\"RenderPages\",\"RenderDocument\",\"将 PDF 文档的页面转换为图片\"),\r\n\t\t\tnew Toolkit (\"结构探查器\",\"Inspector\",\"DocumentInspector\",\"探查 PDF 文档的内部结构\", false, false),\r\n\t\t\tnew Toolkit (\"导出导入信息文件\",\"InfoExchanger\",\"ExportInfoFile\",\"导出书签、文档元数据、阅读器设定等信息到信息文件\"),\r\n\t\t\tnew Toolkit (\"程序配置\",\"Options\",\"AppOptions\",\"修改 PDF 补丁丁的程序配置\", false, false)\r\n\t\t};\r\n\t\tinternal static Toolkit Get(string id) {\r\n\t\t\tforeach (var item in Toolkits) {\r\n\t\t\t\tif (item.Identifier == id) {\r\n\t\t\t\t\treturn item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tpublic string Identifier { get; }\r\n\t\tpublic string Icon { get; }\r\n\t\tpublic string Name { get; }\r\n\t\tpublic string Description { get; }\r\n\t\tpublic bool ShowText { get; }\r\n\t\tpublic bool DefaultVisible { get; }\r\n\r\n\t\tprivate Toolkit(string name, string id, string icon, string description)\r\n\t\t\t: this(name, id, icon, description, false, true) {\r\n\t\t}\r\n\t\tprivate Toolkit(string name, string id, string icon, string description, bool showText)\r\n\t\t\t: this(name, id, icon, description, showText, true) {\r\n\t\t}\r\n\t\tprivate Toolkit(string name, string id, string icon, string description, bool showText, bool defaultVisible) {\r\n\t\t\tName = name;\r\n\t\t\tIdentifier = id;\r\n\t\t\tIcon = icon;\r\n\t\t\tDescription = description;\r\n\t\t\tShowText = showText;\r\n\t\t\tDefaultVisible = defaultVisible;\r\n\t\t}\r\n\r\n\t\tinternal ToolStripButton CreateButton() {\r\n\t\t\treturn new ToolStripButton(Name, Properties.Resources.ResourceManager.GetObject(Icon) as System.Drawing.Image) {\r\n\t\t\t\tName = Identifier,\r\n\t\t\t\tTag = Identifier,\r\n\t\t\t\tToolTipText = Description,\r\n\t\t\t\tDisplayStyle = ShowText ? ToolStripItemDisplayStyle.ImageAndText : ToolStripItemDisplayStyle.Image\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "App/Tracker.cs",
    "content": "﻿using System;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\n\r\nnamespace PDFPatcher\r\n{\r\n\tstatic class Tracker\r\n\t{\r\n\t\tinternal enum Category\r\n\t\t{\r\n\t\t\tMessage = -1,\r\n\t\t\tImportantMessage = -2,\r\n\t\t\tError = -3,\r\n\t\t\tAlert = -4,\r\n\t\t\tNotice = -5,\r\n\t\t\tInputFile = -10,\r\n\t\t\tOutputFile = -11\r\n\t\t}\r\n\r\n\t\tstatic BackgroundWorker __Worker;\r\n\r\n\t\t///<summary>指定后台工作进程。</summary>\r\n\t\tinternal static void SetWorker(BackgroundWorker value) {\r\n\t\t\t__Worker = value;\r\n\t\t}\r\n\r\n\t\tinternal static void TrackProgress(int progress) {\r\n\t\t\tReportProgress(progress, null);\r\n\t\t}\r\n\r\n\t\tinternal static void IncrementProgress(int progress) {\r\n\t\t\tReportProgress(progress, \"INC\");\r\n\t\t}\r\n\r\n\t\tinternal static void IncrementTotalProgress() {\r\n\t\t\tReportProgress(1, \"TINC\");\r\n\t\t}\r\n\t\tinternal static void SetProgressGoal(int goalNumber) {\r\n\t\t\tReportProgress(goalNumber, \"GOAL\");\r\n\t\t}\r\n\t\tinternal static void SetTotalProgressGoal(int goalNumber) {\r\n\t\t\tReportProgress(goalNumber, \"TGOAL\");\r\n\t\t}\r\n\t\tinternal static void DebugMessage(string message) {\r\n\t\t\tDebug.Write(DateTime.Now.ToString(\"HH:mm:ss.fff \"));\r\n\t\t\tDebug.WriteLine(message);\r\n\t\t}\r\n\t\tinternal static void TraceMessage(Category level, string message) {\r\n\t\t\tTrace.Write(DateTime.Now.ToString(\"HH:mm:ss.fff \"));\r\n\t\t\tTrace.WriteLine(message);\r\n\t\t\tvar worker = __Worker;\r\n\t\t\tif (worker?.IsBusy == true) {\r\n\t\t\t\tworker.ReportProgress((int)level, message);\r\n\t\t\t}\r\n\t\t}\r\n\t\tinternal static void TraceMessage(string message) {\r\n\t\t\tTraceMessage(Category.Message, message);\r\n\t\t}\r\n\t\tinternal static void TraceMessage(Exception exception) {\r\n\t\t\tTraceMessage(Category.Error, exception.Message);\r\n#if DEBUG\r\n\t\t\tTraceMessage(Category.Message, exception.StackTrace);\r\n#endif\r\n\t\t}\r\n\r\n\t\tstatic void ReportProgress(int progress, string category) {\r\n\t\t\tvar worker = __Worker;\r\n\t\t\tif (worker == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (worker.CancellationPending) {\r\n\t\t\t\tthrow new OperationCanceledException();\r\n\t\t\t}\r\n\t\t\tworker.ReportProgress(progress, category);\r\n\t\t}\r\n\t}\r\n\r\n}"
  },
  {
    "path": "App/app.config",
    "content": "<?xml version=\"1.0\"?>\r\n<configuration>\r\n<startup>\r\n\t<supportedRuntime version=\"v4.0\"/>\r\n</startup>\r\n</configuration>\r\n"
  },
  {
    "path": "App/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"ILRepack.Lib.MSBuild.Task\" version=\"2.0.34.2\" targetFramework=\"net40\" developmentDependency=\"true\" />\r\n  <package id=\"ObjectListView.Official\" version=\"2.9.1\" targetFramework=\"net40\" />\r\n</packages>"
  },
  {
    "path": "CODEOWNERS",
    "content": "# Below is a list of PDFPatcher team members' GitHub handles who are\n# suggested reviewers for contributions to this repository.\n#\n# These names are just suggestions. It is fine to have your changes\n# reviewed by someone else.\n#\n# Use git ls-files '<pattern>' without a / prefix to see the list of matching files.\n\n/ @wmjordan\n"
  },
  {
    "path": "CONTRIBUTING.zh-CN.md",
    "content": "# 贡献给 PDF 补丁丁\n\n欢迎使用 PDF 补丁丁! 本文档是有关如何为 PDF 补丁丁 做出贡献的指南。如果发现不正确或缺失的内容，请留下评论/建议。\n\n## 开始之前\n\n### 设置您的开发环境\n\n请参阅 [README](https://github.com/wmjordan/PDFPatcher#%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83)。\n\n## 贡献\n\n无论是对于拼写错误，Bug 修复还是重要的新功能，我们总是很乐意接受您的贡献。请不要犹豫，在 [Github Issue](https://github.com/wmjordan/PDFPatcher/issues) 上进行讨论。\n\n我们非常重视文档，我们很高兴接受这些方面的改进。\n\n### GitHub 工作流程\n\n我们将 `master` 分支用作开发分支。\n\n这是贡献者的工作流程 :\n\n复刻 (Fork) 到您的个人仓库。\n\n克隆到本地。\n\n```git\ngit clone git@github.com:yourgithub/PDFPatcher.git\n```\n\n创建一个新分支并对其进行处理。\n\n```git\ngit checkout -b your_branch\n```\n\n(不建议将 `master` 作为 `your_branch`。)\n\n保持分支与上游仓库同步：\n\n```git\ngit remote add upstream git@github.com:wmjordan/PDFPatcher.git\ngit remote update\ngit rebase upstream/master\n```\n\n提交您的更改 (确保您的提交说明清晰完整)。\n\n```git\ngit commit -a\n```\n\n整理提交，然后将您的提交推送到复刻的存储库。\n\n```git\ngit push origin your_branch\n```\n\n创建 Pull request 合并请求。\n\n后续在修改更改后，一般应强制推送到复刻的存储库：\n\n```git\ngit push origin your_branch -f\n```\n\n请确保 PR 对应有相应的 Issue。请参阅 [将拉取请求链接到议题 - GitHub Docs](https://docs.github.com/cn/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) 。\n\n创建 PR 后，社区会有成员帮助 Review，Review 通过之后，PR 将会合并到主仓库，相应的 Issue 会被关闭。\n\n### 打开 Issue/PR\n\n我们使用 Issue 和 Pull Requests 作为跟踪器：\n\n- [GitHub Issues](https://github.com/wmjordan/PDFPatcher/issues)\n- [Pull Requests](https://github.com/wmjordan/PDFPatcher/pulls)\n\n如果您发现新的 Bug，想要新功能或提出新当建议，您可以在 GitHub 上[创建 Issue](https://github.com/wmjordan/PDFPatcher/issues/new/choose) ，请按照 Issue 模板中的准则进行操作。\n\n如果您在文档中发现拼写错误，或者发现代码中存在可以进行微小的优化的地方，您可以无需创建 Issue， 直接提交一个 PR。\n\n如果您想贡献，请先创建一个新的 PR。 如果您的 PR 包含较大的更改，请写详细描述有关其设计和使用的信息。\n\n> **注意**\n>\n> 单个 PR 不应太大。如果需要进行重大更改，最好将更改分开到一些 PR。\n\n### PR 审查\n\n所有 PR 应进行良好的审查。一些原则:\n\n- 易用性。更改不应对软件的易用性产生负面作用。\n\n- 第三方代码尽量保持原状。PDFPatcher 命名空间外的代码为第三方代码，如非必要尽量不修改。\n\n### PR 合并\n\nPR 经过 Approve 之后会由 Committer 负责合并，在合并的时候，Committer 可以对提交说明进行修改。\n在合并时一般使用 Rebase and merge。对于大型多人协助的 PR，使用 Merge 进行合并，在合并之前通过 Rebase 修正提交。\n"
  },
  {
    "path": "JBig2/COPYING",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\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\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions 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 convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            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\nstate 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 Affero General Public License as published by\n    the Free Software Foundation, either version 3 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 Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "JBig2/JBig2.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 16\r\nVisualStudioVersion = 16.0.31829.152\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jbig2enc\", \"jbig2enc\\jbig2enc.vcxproj\", \"{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jbig2dec\", \"jbig2dec\\jbig2dec.vcxproj\", \"{2E30CFBD-3501-4C46-9C81-2A071D1C1005}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tDLL Release|Any CPU = DLL Release|Any CPU\r\n\t\tDLL Release|Win32 = DLL Release|Win32\r\n\t\tDLL Release|x64 = DLL Release|x64\r\n\t\tDLL Release|x86 = DLL Release|x86\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Debug|Any CPU.ActiveCfg = Debug|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.DLL Release|Any CPU.ActiveCfg = DLL Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.DLL Release|Win32.Build.0 = DLL Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.DLL Release|x64.ActiveCfg = DLL Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.DLL Release|x86.ActiveCfg = DLL Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.DLL Release|x86.Build.0 = DLL Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Release|Any CPU.ActiveCfg = Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Release|x64.ActiveCfg = Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Release|x86.ActiveCfg = Release|Win32\r\n\t\t{D66B0FA7-0273-4902-B7D4-B752EBAF2D35}.Release|x86.Build.0 = Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Debug|Any CPU.ActiveCfg = Debug|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.DLL Release|Any CPU.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.DLL Release|Win32.Build.0 = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.DLL Release|x64.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.DLL Release|x86.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.DLL Release|x86.Build.0 = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|Any CPU.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|Any CPU.Build.0 = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|Win32.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|Win32.Build.0 = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|x64.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|x64.Build.0 = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|x86.ActiveCfg = DLL Release|Win32\r\n\t\t{2E30CFBD-3501-4C46-9C81-2A071D1C1005}.Release|x86.Build.0 = DLL Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {5B304BF5-4485-496A-A72B-98B7FDFE2020}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "JBig2/LICENSE",
    "content": "  The files in this directory (folder) and any subdirectories \n  (sub-folders) thereof are part of jbig2dec, with the exception\n  of certain source files included to support portability which are\n  marked otherwise in their copyright headers.\n\n  jbig2dec is free software; you can redistribute it and/or modify\n  it under the terms the GNU Affero General Public License as\n  published by the Free Software Foundation, either version 3 of the\n  License, or (at your option) any later version.\n\n  This software 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 Affero General Public\n  License along with this program in the file named COPYING. If not,\n  write  to the Free Software Foundation, Inc., 59 Temple Place Suite\n  330, Boston, MA 02111-1307, USA.\n\n  In addition, specific permission is given to link jbig2dec to or \n  compile jbig2dec into AFPL Ghostscript and to distribute same\n  under the Aladdin Free Public License (AFPL) version 9.\n"
  },
  {
    "path": "JBig2/README",
    "content": "jbig2dec is a decoder library and example utility implementing the JBIG2\nbi-level image compression spec. Also known as ITU T.88 and ISO IEC\n14492, and included by reference in Adobe's PDF version 1.4 and later.\n\nThe basic invocation is:\n\n    jbig2dec [-o <output file>] file.jbig2\n\nIt also supports separate 'global' and 'page' streams, generally\nextracted from some embedded format:\n\n    jbig2dec [-o <output file>] <global_stream> <page_stream>\n\nThe program is only partially functional at this time, but should be\nuseful in some limited contexts. We welcome files that the decoder can't\nhandle, or renders incorrectly.\n\nMore information about jbig2dec and updated versions are available from:\nhttps://jbig2dec.com/\n\nA set of example files is available from\nhttps://jbig2dec.com/tests/\n\nDevelopment source code is kept in a git repository at:\nhttp://git.ghostscript.com/?p=jbig2dec.git\n\nReport bugs at https://bugs.ghostscript.com\nFor security issues please use the \"Security - Other\" product,\nand for normal bugs the \"jbig2dec\" product.\n\nContact the developers on Discord or IRC at #ghostscript at libera.chat\nor via the mailing list <gs-devel@ghostscript.com>.\n"
  },
  {
    "path": "JBig2/include/config_win32.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* configuration header file for compiling under Microsoft Windows */\n\n#ifdef _MSC_VER\n\n/* VS 2012 and later have stdint.h */\n# if _MSC_VER >= 1700\n#  include <stdint.h>\n# else\ntypedef signed char int8_t;\ntypedef short int int16_t;\ntypedef int int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned char uint8_t;\ntypedef unsigned short int uint16_t;\ntypedef unsigned int uint32_t;\ntypedef unsigned __int64 uint64_t;\n#ifndef SIZE_MAX\n#define SIZE_MAX (~((size_t) 0))\n#endif\n# endif\n\n/* VS 2008 and later have vsnprintf */\n# if _MSC_VER < 1500\n#  define vsnprintf _vsnprintf\n/* Previously we defined inline as nothing for 2005 and below */\n#  define inline\n#else\n/* VS 2008 has __inline but not inline, later versions (unknown exactly where) define inline\n * so cater for it being defined already.\n */\n# if !(defined(inline))\n#  define inline __inline\n# endif\n# endif\n\n/* VS 2014 and later have (finally) snprintf */\n# if _MSC_VER >= 1900\n#  define STDC99\n# else\n#  define snprintf _snprintf\n# endif\n\n#else /* _MSC_VER */\n\n/* Not VS -- it had best behave */\n# include <stdint.h>\n\n#endif /* _MSC_VER */\n"
  },
  {
    "path": "JBig2/include/getopt.h",
    "content": "/* Declarations for getopt.\n   Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc.\n   This file is part of the GNU C Library.\n\n   The GNU C Library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   The GNU C Library 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 GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with the GNU C Library; if not, write to the Free\n   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\n   02111-1307 USA.  */\n\n#ifndef _GETOPT_H\n\n#ifndef __need_getopt\n# define _GETOPT_H 1\n#endif\n\n/* If __GNU_LIBRARY__ is not already defined, either we are being used\n   standalone, or this is the first header included in the source file.\n   If we are being used with glibc, we need to include <features.h>, but\n   that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is\n   not defined, include <ctype.h>, which will pull in <features.h> for us\n   if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it\n   doesn't flood the namespace with stuff the way some other headers do.)  */\n#if !defined __GNU_LIBRARY__\n# include <ctype.h>\n#endif\n\n#ifdef\t__cplusplus\nextern \"C\"\n{\n#endif\n\n/* For communication from `getopt' to the caller.\n   When `getopt' finds an option that takes an argument,\n   the argument value is returned here.\n   Also, when `ordering' is RETURN_IN_ORDER,\n   each non-option ARGV-element is returned here.  */\n\nextern char *optarg;\n\n/* Index in ARGV of the next element to be scanned.\n   This is used for communication to and from the caller\n   and for communication between successive calls to `getopt'.\n\n   On entry to `getopt', zero means this is the first call; initialize.\n\n   When `getopt' returns -1, this is the index of the first of the\n   non-option elements that the caller should itself scan.\n\n   Otherwise, `optind' communicates from one call to the next\n   how much of ARGV has been scanned so far.  */\n\nextern int optind;\n\n/* Callers store zero here to inhibit the error message `getopt' prints\n   for unrecognized options.  */\n\nextern int opterr;\n\n/* Set to an option character which was unrecognized.  */\n\nextern int optopt;\n\n#ifndef __need_getopt\n/* Describe the long-named options requested by the application.\n   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector\n   of `struct option' terminated by an element containing a name which is\n   zero.\n\n   The field `has_arg' is:\n   no_argument\t\t(or 0) if the option does not take an argument,\n   required_argument\t(or 1) if the option requires an argument,\n   optional_argument \t(or 2) if the option takes an optional argument.\n\n   If the field `flag' is not NULL, it points to a variable that is set\n   to the value given in the field `val' when the option is found, but\n   left unchanged if the option is not found.\n\n   To have a long-named option do something other than set an `int' to\n   a compiled-in constant, such as set a value from `optarg', set the\n   option's `flag' field to zero and its `val' field to a nonzero\n   value (the equivalent single-letter option character, if there is\n   one).  For long options that have a zero `flag' field, `getopt'\n   returns the contents of the `val' field.  */\n\nstruct option {\n# if (defined __STDC__ && __STDC__) || defined __cplusplus\n    const char *name;\n# else\n    char *name;\n# endif\n    /* has_arg can't be an enum because some compilers complain about\n       type mismatches in all the code that assumes it is an int.  */\n    int has_arg;\n    int *flag;\n    int val;\n};\n\n/* Names for the values of the `has_arg' field of `struct option'.  */\n\n# define no_argument\t\t0\n# define required_argument\t1\n# define optional_argument\t2\n#endif                          /* need getopt */\n\n/* Get definitions and prototypes for functions to process the\n   arguments in ARGV (ARGC of them, minus the program name) for\n   options given in OPTS.\n\n   Return the option character from OPTS just read.  Return -1 when\n   there are no more options.  For unrecognized options, or options\n   missing arguments, `optopt' is set to the option letter, and '?' is\n   returned.\n\n   The OPTS string is a list of characters which are recognized option\n   letters, optionally followed by colons, specifying that that letter\n   takes an argument, to be placed in `optarg'.\n\n   If a letter in OPTS is followed by two colons, its argument is\n   optional.  This behavior is specific to the GNU `getopt'.\n\n   The argument `--' causes premature termination of argument\n   scanning, explicitly telling `getopt' that there are no more\n   options.\n\n   If OPTS begins with `--', then non-option arguments are treated as\n   arguments to the option '\\0'.  This behavior is specific to the GNU\n   `getopt'.  */\n\n#if (defined __STDC__ && __STDC__) || defined __cplusplus\n# ifdef __GNU_LIBRARY__\n/* Many other libraries have conflicting prototypes for getopt, with\n   differences in the consts, in stdlib.h.  To avoid compilation\n   errors, only prototype getopt for the GNU C library.  */\nextern int getopt(int __argc, char *const *__argv, const char *__shortopts);\n# else                          /* not __GNU_LIBRARY__ */\nextern int getopt();\n# endif                         /* __GNU_LIBRARY__ */\n\n# ifndef __need_getopt\nextern int getopt_long(int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind);\nextern int getopt_long_only(int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind);\n\n/* Internal only.  Users should not call this directly.  */\nextern int _getopt_internal(int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only);\n# endif\n#else                           /* not __STDC__ */\nextern int getopt();\n# ifndef __need_getopt\nextern int getopt_long();\nextern int getopt_long_only();\n\nextern int _getopt_internal();\n# endif\n#endif                          /* __STDC__ */\n\n#ifdef\t__cplusplus\n}\n#endif\n\n/* Make sure we later can get all the definitions and declarations.  */\n#undef __need_getopt\n\n#endif                          /* getopt.h */\n"
  },
  {
    "path": "JBig2/include/jbig2.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_H\n#define _JBIG2_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#define JBIG2_VERSION_MAJOR (0)\n#define JBIG2_VERSION_MINOR (19)\n\n/* warning levels */\ntypedef enum {\n    JBIG2_SEVERITY_DEBUG,\n    JBIG2_SEVERITY_INFO,\n    JBIG2_SEVERITY_WARNING,\n    JBIG2_SEVERITY_FATAL\n} Jbig2Severity;\n\ntypedef enum {\n    JBIG2_OPTIONS_EMBEDDED = 1\n} Jbig2Options;\n\n/* forward public structure declarations */\ntypedef struct _Jbig2Allocator Jbig2Allocator;\ntypedef struct _Jbig2Ctx Jbig2Ctx;\ntypedef struct _Jbig2GlobalCtx Jbig2GlobalCtx;\n\n/*\n   this is the general image structure used by the jbig2dec library\n   images are 1 bpp, packed into rows a byte at a time. stride gives\n   the byte offset to the next row, while width and height define\n   the size of the image area in pixels.\n*/\ntypedef struct _Jbig2Image Jbig2Image;\nstruct _Jbig2Image {\n    uint32_t width;\n    uint32_t height;\n    uint32_t stride;\n    uint8_t *data;\n    int refcount;\n};\n\n/* errors are returned from the library via a callback. If no callback\n   is provided (a NULL argument is passed to jbig2_ctx_new) a default\n   handler is used which prints fatal errors to the stderr stream. */\n\n/* error callback */\n#define JBIG2_UNKNOWN_SEGMENT_NUMBER ~0U\ntypedef void (*Jbig2ErrorCallback)(void *data, const char *msg, Jbig2Severity severity, uint32_t seg_idx);\n\n/* memory allocation is likewise done via a set of callbacks so that\n   clients can better control memory usage. If a NULL is passed for\n   this argument of jbig2_ctx_new, a default allocator based on malloc()\n   is used. */\n\n/* dynamic memory callbacks */\nstruct _Jbig2Allocator {\n    void *(*alloc)(Jbig2Allocator *allocator, size_t size);\n    void (*free)(Jbig2Allocator *allocator, void *p);\n    void *(*realloc)(Jbig2Allocator *allocator, void *p, size_t size);\n};\n\n/* decoder context */\n#define jbig2_ctx_new(allocator, options, global_ctx, error_callback, error_callback_data) jbig2_ctx_new_imp((allocator), (options), (global_ctx), (error_callback), (error_callback_data), JBIG2_VERSION_MAJOR, JBIG2_VERSION_MINOR)\nJbig2Ctx *jbig2_ctx_new_imp(Jbig2Allocator *allocator,\n                        Jbig2Options options,\n                        Jbig2GlobalCtx *global_ctx,\n                        Jbig2ErrorCallback error_callback,\n                        void *error_callback_data,\n                        int jbig2_version_major,\n                        int jbig2_version_minor);\nJbig2Allocator *jbig2_ctx_free(Jbig2Ctx *ctx);\n\n/* global context for embedded streams */\nJbig2GlobalCtx *jbig2_make_global_ctx(Jbig2Ctx *ctx);\nJbig2Allocator *jbig2_global_ctx_free(Jbig2GlobalCtx *global_ctx);\n\n/* submit data to the decoder */\nint jbig2_data_in(Jbig2Ctx *ctx, const unsigned char *data, size_t size);\n\n/* get the next available decoded page image. NULL means there isn't one. */\nJbig2Image *jbig2_page_out(Jbig2Ctx *ctx);\n/* mark a returned page image as no longer needed. */\nvoid jbig2_release_page(Jbig2Ctx *ctx, Jbig2Image *image);\n/* mark the current page as complete, simulating an end-of-page segment (for broken streams) */\nint jbig2_complete_page(Jbig2Ctx *ctx);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif                          /* _JBIG2_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_arith.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_ARITH_H\n#define _JBIG2_ARITH_H\n\ntypedef struct _Jbig2ArithState Jbig2ArithState;\n\n/* An arithmetic coding context is stored as a single byte, with the\n   index in the low order 7 bits (actually only 6 are used), and the\n   MPS in the top bit. */\ntypedef unsigned char Jbig2ArithCx;\n\n/* allocate and initialize a new arithmetic coding state */\nJbig2ArithState *jbig2_arith_new(Jbig2Ctx *ctx, Jbig2WordStream *ws);\n\n/* decode a bit */\n/* Normally returns 0 or 1. May return negative in case of error. */\nint jbig2_arith_decode(Jbig2Ctx *ctx, Jbig2ArithState *as, Jbig2ArithCx *pcx);\n\n/* returns true if the end of the data stream has been reached (for sanity checks) */\nbool jbig2_arith_has_reached_marker(Jbig2ArithState *as);\n\n#endif /* _JBIG2_ARITH_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_arith_iaid.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_ARITH_IAID_H\n#define _JBIG2_ARITH_IAID_H\n\ntypedef struct _Jbig2ArithIaidCtx Jbig2ArithIaidCtx;\n\nJbig2ArithIaidCtx *jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, uint8_t SBSYMCODELEN);\n\nint jbig2_arith_iaid_decode(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *actx, Jbig2ArithState *as, int32_t *p_result);\n\nvoid jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax);\n\n#endif /* _JBIG2_ARITH_IAID_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_arith_int.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_ARITH_INT_H\n#define _JBIG2_ARITH_INT_H\n\ntypedef struct _Jbig2ArithIntCtx Jbig2ArithIntCtx;\n\nJbig2ArithIntCtx *jbig2_arith_int_ctx_new(Jbig2Ctx *ctx);\n\nint jbig2_arith_int_decode(Jbig2Ctx *ctx, Jbig2ArithIntCtx *actx, Jbig2ArithState *as, int32_t *p_result);\n\nvoid jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax);\n\n#endif /* _JBIG2_ARITH_INT_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_generic.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_GENERIC_H\n#define _JBIG2_GENERIC_H\n\n/**\n * Headers for Generic and Generic Refinement region handling\n **/\n\n/* 6.4 Table 2 */\ntypedef struct {\n    bool MMR;\n    /* GBW */\n    /* GBH */\n    int GBTEMPLATE;\n    bool TPGDON;\n    bool USESKIP;\n    Jbig2Image *SKIP;\n    int8_t gbat[8];\n} Jbig2GenericRegionParams;\n\n/* return the appropriate context size for the given template */\nint jbig2_generic_stats_size(Jbig2Ctx *ctx, int template);\n\nint\njbig2_decode_generic_region(Jbig2Ctx *ctx,\n                            Jbig2Segment *segment, const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats);\n\n/* 7.4 */\nint jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);\n\n#endif /* _JBIG2_GENERIC_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_halftone.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_HALFTONE_H\n#define _JBIG2_HALFTONE_H\n\ntypedef struct {\n    int n_patterns;\n    Jbig2Image **patterns;\n    uint32_t HPW, HPH;\n} Jbig2PatternDict;\n\n/* Table 24 */\ntypedef struct {\n    bool HDMMR;\n    uint32_t HDPW;\n    uint32_t HDPH;\n    uint32_t GRAYMAX;\n    int HDTEMPLATE;\n} Jbig2PatternDictParams;\n\n/* Table 33 */\ntypedef struct {\n    byte flags;\n    uint32_t HGW;\n    uint32_t HGH;\n    int32_t HGX;\n    int32_t HGY;\n    uint16_t HRX;\n    uint16_t HRY;\n    bool HMMR;\n    int HTEMPLATE;\n    bool HENABLESKIP;\n    Jbig2ComposeOp HCOMBOP;\n    bool HDEFPIXEL;\n} Jbig2HalftoneRegionParams;\n\nvoid jbig2_hd_release(Jbig2Ctx *ctx, Jbig2PatternDict *dict);\n\nint jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);\nint jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);\n\n#endif /* _JBIG2_HALFTONE_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_huffman.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_HUFFMAN_H\n#define _JBIG2_HUFFMAN_H\n\n/* Huffman coder interface */\n\ntypedef struct _Jbig2HuffmanEntry Jbig2HuffmanEntry;\ntypedef struct _Jbig2HuffmanState Jbig2HuffmanState;\ntypedef struct _Jbig2HuffmanTable Jbig2HuffmanTable;\ntypedef struct _Jbig2HuffmanParams Jbig2HuffmanParams;\n\nstruct _Jbig2HuffmanEntry {\n    union {\n        int32_t RANGELOW;\n        Jbig2HuffmanTable *ext_table;\n    } u;\n    byte PREFLEN;\n    byte RANGELEN;\n    byte flags;\n};\n\nstruct _Jbig2HuffmanTable {\n    int log_table_size;\n    Jbig2HuffmanEntry *entries;\n};\n\ntypedef struct _Jbig2HuffmanLine Jbig2HuffmanLine;\n\nstruct _Jbig2HuffmanLine {\n    int PREFLEN;\n    int RANGELEN;\n    int RANGELOW;\n};\n\nstruct _Jbig2HuffmanParams {\n    bool HTOOB;\n    int n_lines;\n    const Jbig2HuffmanLine *lines;\n};\n\nJbig2HuffmanState *jbig2_huffman_new(Jbig2Ctx *ctx, Jbig2WordStream *ws);\n\nvoid jbig2_huffman_free(Jbig2Ctx *ctx, Jbig2HuffmanState *hs);\n\nint jbig2_huffman_skip(Jbig2HuffmanState *hs);\n\nint jbig2_huffman_advance(Jbig2HuffmanState *hs, size_t advance);\n\nuint32_t jbig2_huffman_offset(Jbig2HuffmanState *hs);\n\nint32_t jbig2_huffman_get(Jbig2HuffmanState *hs, const Jbig2HuffmanTable *table, bool *oob);\n\nint32_t jbig2_huffman_get_bits(Jbig2HuffmanState *hs, const int bits, int *err);\n\n#ifdef JBIG2_DEBUG\nvoid jbig2_dump_huffman_state(Jbig2HuffmanState *hs);\nvoid jbig2_dump_huffman_binary(Jbig2HuffmanState *hs);\n#endif\n\nJbig2HuffmanTable *jbig2_build_huffman_table(Jbig2Ctx *ctx, const Jbig2HuffmanParams *params);\n\nvoid jbig2_release_huffman_table(Jbig2Ctx *ctx, Jbig2HuffmanTable *table);\n\n/* standard Huffman templates defined by the specification */\nextern const Jbig2HuffmanParams jbig2_huffman_params_A; /* Table B.1  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_B; /* Table B.2  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_C; /* Table B.3  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_D; /* Table B.4  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_E; /* Table B.5  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_F; /* Table B.6  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_G; /* Table B.7  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_H; /* Table B.8  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_I; /* Table B.9  */\nextern const Jbig2HuffmanParams jbig2_huffman_params_J; /* Table B.10 */\nextern const Jbig2HuffmanParams jbig2_huffman_params_K; /* Table B.11 */\nextern const Jbig2HuffmanParams jbig2_huffman_params_L; /* Table B.12 */\nextern const Jbig2HuffmanParams jbig2_huffman_params_M; /* Table B.13 */\nextern const Jbig2HuffmanParams jbig2_huffman_params_N; /* Table B.14 */\nextern const Jbig2HuffmanParams jbig2_huffman_params_O; /* Table B.15 */\n\n/* Routines to handle \"code table segment (53)\" */\n\n/* Parse a code table segment, store Jbig2HuffmanParams in segment->result */\nint jbig2_table(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);\n\n/* free Jbig2HuffmanParams allocated by jbig2_huffman_table() */\nvoid jbig2_table_free(Jbig2Ctx *ctx, Jbig2HuffmanParams *params);\n\n/* find a user supplied table used by 'segment' and by 'index' */\nconst Jbig2HuffmanParams *jbig2_find_table(Jbig2Ctx *ctx, Jbig2Segment *segment, int index);\n\n#endif /* _JBIG2_HUFFMAN_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_hufftab.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* predefined Huffman table definitions\n    -- See Annex B.5 of the JBIG2 specification */\n\n#ifndef _JBIG2_HUFFTAB_H\n#define _JBIG2_HUFFTAB_H\n\nextern const Jbig2HuffmanParams jbig2_huffman_params_A;\nextern const Jbig2HuffmanParams jbig2_huffman_params_B;\nextern const Jbig2HuffmanParams jbig2_huffman_params_C;\nextern const Jbig2HuffmanParams jbig2_huffman_params_D;\nextern const Jbig2HuffmanParams jbig2_huffman_params_E;\nextern const Jbig2HuffmanParams jbig2_huffman_params_F;\nextern const Jbig2HuffmanParams jbig2_huffman_params_G;\nextern const Jbig2HuffmanParams jbig2_huffman_params_H;\nextern const Jbig2HuffmanParams jbig2_huffman_params_I;\nextern const Jbig2HuffmanParams jbig2_huffman_params_J;\nextern const Jbig2HuffmanParams jbig2_huffman_params_K;\nextern const Jbig2HuffmanParams jbig2_huffman_params_L;\nextern const Jbig2HuffmanParams jbig2_huffman_params_M;\nextern const Jbig2HuffmanParams jbig2_huffman_params_N;\nextern const Jbig2HuffmanParams jbig2_huffman_params_O;\n\n#endif /* _JBIG2_HUFFTAB_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_image.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_IMAGE_H\n#define _JBIG2_IMAGE_H\n\ntypedef enum {\n    JBIG2_COMPOSE_OR = 0,\n    JBIG2_COMPOSE_AND = 1,\n    JBIG2_COMPOSE_XOR = 2,\n    JBIG2_COMPOSE_XNOR = 3,\n    JBIG2_COMPOSE_REPLACE = 4\n} Jbig2ComposeOp;\n\nJbig2Image *jbig2_image_new(Jbig2Ctx *ctx, uint32_t width, uint32_t height);\nvoid jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image);\nJbig2Image *jbig2_image_reference(Jbig2Ctx *ctx, Jbig2Image *image);\nvoid jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image);\nvoid jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value);\nJbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image, uint32_t width, uint32_t height, int value);\nint jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op);\n\nint jbig2_image_get_pixel(Jbig2Image *image, int x, int y);\nvoid jbig2_image_set_pixel(Jbig2Image *image, int x, int y, bool value);\n\n#endif /* _JBIG2_IMAGE_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_image_rw.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_IMAGE_RW_H\n#define _JBIG2_IMAGE_RW_H\n\n/* routines for dumping the image data in various formats */\n\n#include <stdio.h>\n\nint jbig2_image_write_pbm_file(Jbig2Image *image, char *filename);\nint jbig2_image_write_pbm(Jbig2Image *image, FILE *out);\nJbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename);\nJbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in);\n\n#ifdef HAVE_LIBPNG\nint jbig2_image_write_png_file(Jbig2Image *image, char *filename);\nint jbig2_image_write_png(Jbig2Image *image, FILE *out);\n#endif\n\n#endif /* _JBIG2_IMAGE_RW_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_mmr.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_MMR_H\n#define _JBIG2_MMR_H\n\nint\njbig2_decode_generic_mmr(Jbig2Ctx *ctx, Jbig2Segment *segment, const Jbig2GenericRegionParams *params, const byte *data, size_t size, Jbig2Image *image);\n\nint\njbig2_decode_halftone_mmr(Jbig2Ctx *ctx, const Jbig2GenericRegionParams *params, const byte *data, size_t size, Jbig2Image *image, size_t *consumed_bytes);\n\n#endif /* _JBIG2_MMR_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_page.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_PAGE_H\n#define _JBIG2_PAGE_H\n\n/* the page structure handles decoded page\n   results. it's allocated by a 'page info'\n   segment and marked complete by an 'end of page'\n   segment.\n*/\ntypedef enum {\n    JBIG2_PAGE_FREE,\n    JBIG2_PAGE_NEW,\n    JBIG2_PAGE_COMPLETE,\n    JBIG2_PAGE_RETURNED,\n    JBIG2_PAGE_RELEASED\n} Jbig2PageState;\n\nstruct _Jbig2Page {\n    Jbig2PageState state;\n    uint32_t number;\n    uint32_t height, width;     /* in pixels */\n    uint32_t x_resolution, y_resolution;        /* in pixels per meter */\n    uint16_t stripe_size;\n    bool striped;\n    uint32_t end_row;\n    uint8_t flags;\n    Jbig2Image *image;\n};\n\nint jbig2_page_info(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);\nint jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);\nint jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);\nint jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *src, uint32_t x, uint32_t y, Jbig2ComposeOp op);\n\n#endif /* _JBIG2_PAGE_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_priv.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_PRIV_H\n#define _JBIG2_PRIV_H\n\n/* To enable Memento predefine MEMENTO while building by setting\n   CFLAGS=-DMEMENTO. */\n\n/* If we are being compiled as part of a larger project that includes\n * Memento, that project should define JBIG_EXTERNAL_MEMENTO_H to point\n * to the include file to use.\n */\n#ifdef JBIG_EXTERNAL_MEMENTO_H\n#include JBIG_EXTERNAL_MEMENTO_H\n#else\n#include \"memento.h\"\n#endif\n\n/* library internals */\n\n/* If we don't have a definition for inline, make it nothing so the code will compile */\n#ifndef inline\n#define inline\n#endif\n\ntypedef uint8_t byte;\n\n#define bool int\n\n#ifdef __cplusplus\n#define template template_C\n#define new new_C\n#endif\n\n#ifndef TRUE\n#define TRUE 1\n#endif\n#ifndef FALSE\n#define FALSE 0\n#endif\n\n#ifndef NULL\n#define NULL ((void*)0)\n#endif\n\n#if !defined (INT32_MIN)\n#define INT32_MIN (-0x7fffffff - 1)\n#endif\n#if !defined (INT32_MAX)\n#define INT32_MAX  0x7fffffff\n#endif\n#if !defined (UINT32_MAX)\n#define UINT32_MAX 0xffffffffu\n#endif\n\ntypedef struct _Jbig2Page Jbig2Page;\ntypedef struct _Jbig2Segment Jbig2Segment;\n\ntypedef enum {\n    JBIG2_FILE_HEADER,\n    JBIG2_FILE_SEQUENTIAL_HEADER,\n    JBIG2_FILE_SEQUENTIAL_BODY,\n    JBIG2_FILE_RANDOM_HEADERS,\n    JBIG2_FILE_RANDOM_BODIES,\n    JBIG2_FILE_EOF\n} Jbig2FileState;\n\nstruct _Jbig2Ctx {\n    Jbig2Allocator *allocator;\n    Jbig2Options options;\n    const Jbig2Ctx *global_ctx;\n    Jbig2ErrorCallback error_callback;\n    void *error_callback_data;\n\n    byte *buf;\n    size_t buf_size;\n    size_t buf_rd_ix;\n    size_t buf_wr_ix;\n\n    Jbig2FileState state;\n\n    uint8_t file_header_flags;\n    uint32_t n_pages;\n\n    uint32_t n_segments_max;\n    Jbig2Segment **segments;\n    uint32_t n_segments;             /* index of last segment header parsed */\n    uint32_t segment_index;          /* index of last segment body parsed */\n\n    /* list of decoded pages, including the one in progress,\n       currently stored as a contiguous, 0-indexed array. */\n    uint32_t current_page;\n    uint32_t max_page_index;\n    Jbig2Page *pages;\n};\n\nuint32_t jbig2_get_uint32(const byte *bptr);\n\nint32_t jbig2_get_int32(const byte *buf);\n\nuint16_t jbig2_get_uint16(const byte *bptr);\n\nint16_t jbig2_get_int16(const byte *buf);\n\n/* dynamic memory management */\nvoid *jbig2_alloc(Jbig2Allocator *allocator, size_t size, size_t num);\n\nvoid jbig2_free(Jbig2Allocator *allocator, void *p);\n\nvoid *jbig2_realloc(Jbig2Allocator *allocator, void *p, size_t size, size_t num);\n\n#define jbig2_new(ctx, t, size) ((t *)jbig2_alloc(ctx->allocator, size, sizeof(t)))\n\n#define jbig2_renew(ctx, p, t, size) ((t *)jbig2_realloc(ctx->allocator, (p), size, sizeof(t)))\n\nint jbig2_error(Jbig2Ctx *ctx, Jbig2Severity severity, uint32_t seg_idx, const char *fmt, ...)\n#ifdef __GNUC__\n    __attribute__ ((format (__printf__, 4, 5)))\n#endif\n    ;\n\n/* The word stream design is a compromise between simplicity and\n   trying to amortize the number of method calls. Each ::get_next_word\n   invocation pulls 4 bytes from the stream, packed big-endian into a\n   32 bit word. The offset argument is provided as a convenience. It\n   begins at 0 and increments by 4 for each successive invocation. */\ntypedef struct _Jbig2WordStream Jbig2WordStream;\n\nstruct _Jbig2WordStream {\n    int (*get_next_word)(Jbig2Ctx *ctx, Jbig2WordStream *self, size_t offset, uint32_t *word);\n};\n\nJbig2WordStream *jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size);\n\nvoid jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws);\n\n/* restrict is standard in C99, but not in all C++ compilers. */\n#if defined (__STDC_VERSION_) && (__STDC_VERSION__ >= 199901L) /* C99 */\n#define JBIG2_RESTRICT restrict\n#elif defined(_MSC_VER) && (_MSC_VER >= 1600) /* MSVC 10 or newer */\n#define JBIG2_RESTRICT __restrict\n#elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC 3 or newer */\n#define JBIG2_RESTRICT __restrict\n#else /* Unknown or ancient */\n#define JBIG2_RESTRICT\n#endif\n\n#endif /* _JBIG2_PRIV_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_refinement.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_REFINEMENT_H\n#define _JBIG2_REFINEMENT_H\n\n/* 6.3 Table 6 */\ntypedef struct {\n    /* GRW */\n    /* GRH */\n    bool GRTEMPLATE;\n    Jbig2Image *GRREFERENCE;\n    int32_t GRREFERENCEDX, GRREFERENCEDY;\n    bool TPGRON;\n    int8_t grat[4];\n} Jbig2RefinementRegionParams;\n\nint\njbig2_decode_refinement_region(Jbig2Ctx *ctx,\n                               Jbig2Segment *segment,\n                               const Jbig2RefinementRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats);\n\n/* 7.4 */\nint jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);\n\n#endif /* _JBIG2_REFINEMENT_H */\n\n"
  },
  {
    "path": "JBig2/include/jbig2_segment.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_SEGMENT_H\n#define _JBIG2_SEGMENT_H\n\n/* segment header routines */\n\nstruct _Jbig2Segment {\n    uint32_t number;\n    uint8_t flags;\n    uint32_t page_association;\n    size_t data_length;\n    int referred_to_segment_count;\n    uint32_t *referred_to_segments;\n    uint32_t rows;\n    void *result;\n};\n\nJbig2Segment *jbig2_parse_segment_header(Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size, size_t *p_header_size);\nint jbig2_parse_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);\nvoid jbig2_free_segment(Jbig2Ctx *ctx, Jbig2Segment *segment);\nJbig2Segment *jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number);\n\n/* region segment info */\n\ntypedef struct {\n    uint32_t width;\n    uint32_t height;\n    uint32_t x;\n    uint32_t y;\n    Jbig2ComposeOp op;\n    uint8_t flags;\n} Jbig2RegionSegmentInfo;\n\nvoid jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data);\n\n#endif /* _JBIG2_SEGMENT_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_symbol_dict.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_SYMBOL_DICT_H\n#define _JBIG2_SYMBOL_DICT_H\n\n/* symbol dictionary header */\n\n/* the results of decoding a symbol dictionary */\ntypedef struct {\n    uint32_t n_symbols;\n    Jbig2Image **glyphs;\n} Jbig2SymbolDict;\n\n/* decode a symbol dictionary segment and store the results */\nint jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);\n\n/* get a particular glyph by index */\nJbig2Image *jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id);\n\n/* return a new empty symbol dict */\nJbig2SymbolDict *jbig2_sd_new(Jbig2Ctx *ctx, uint32_t n_symbols);\n\n/* release the memory associated with a symbol dict */\nvoid jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict);\n\n/* generate a new symbol dictionary by concatenating a list of\n   existing dictionaries */\nJbig2SymbolDict *jbig2_sd_cat(Jbig2Ctx *ctx, uint32_t n_dicts, Jbig2SymbolDict **dicts);\n\n/* count the number of dictionary segments referred\n   to by the given segment */\nuint32_t jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment);\n\n/* return an array of pointers to symbol dictionaries referred\n   to by a segment */\nJbig2SymbolDict **jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment);\n\n#endif /* _JBIG2_SYMBOL_DICT_H */\n"
  },
  {
    "path": "JBig2/include/jbig2_text.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifndef _JBIG2_TEXT_H\n#define _JBIG2_TEXT_H\n\n/**\n * Headers for Text region handling\n **/\n\ntypedef enum {\n    JBIG2_CORNER_BOTTOMLEFT = 0,\n    JBIG2_CORNER_TOPLEFT = 1,\n    JBIG2_CORNER_BOTTOMRIGHT = 2,\n    JBIG2_CORNER_TOPRIGHT = 3\n} Jbig2RefCorner;\n\ntypedef struct {\n    bool SBHUFF;\n    bool SBREFINE;\n    bool SBDEFPIXEL;\n    Jbig2ComposeOp SBCOMBOP;\n    bool TRANSPOSED;\n    Jbig2RefCorner REFCORNER;\n    int SBDSOFFSET;\n    /* int SBW; */\n    /* int SBH; */\n    uint32_t SBNUMINSTANCES;\n    int LOGSBSTRIPS;\n    int SBSTRIPS;\n    /* int SBNUMSYMS; */\n    /* SBSYMCODES */\n    /* SBSYMCODELEN */\n    /* SBSYMS */\n    Jbig2HuffmanTable *SBHUFFFS;\n    Jbig2HuffmanTable *SBHUFFDS;\n    Jbig2HuffmanTable *SBHUFFDT;\n    Jbig2HuffmanTable *SBHUFFRDW;\n    Jbig2HuffmanTable *SBHUFFRDH;\n    Jbig2HuffmanTable *SBHUFFRDX;\n    Jbig2HuffmanTable *SBHUFFRDY;\n    Jbig2HuffmanTable *SBHUFFRSIZE;\n    Jbig2ArithIntCtx *IADT;\n    Jbig2ArithIntCtx *IAFS;\n    Jbig2ArithIntCtx *IADS;\n    Jbig2ArithIntCtx *IAIT;\n    Jbig2ArithIaidCtx *IAID;\n    Jbig2ArithIntCtx *IARI;\n    Jbig2ArithIntCtx *IARDW;\n    Jbig2ArithIntCtx *IARDH;\n    Jbig2ArithIntCtx *IARDX;\n    Jbig2ArithIntCtx *IARDY;\n    bool SBRTEMPLATE;\n    int8_t sbrat[4];\n} Jbig2TextRegionParams;\n\nint\njbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,\n                         const Jbig2TextRegionParams *params,\n                         const Jbig2SymbolDict *const *dicts, const uint32_t n_dicts,\n                         Jbig2Image *image, const byte *data, const size_t size, Jbig2ArithCx *GR_stats, Jbig2ArithState *as, Jbig2WordStream *ws);\n\nint jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data);\n\n#endif /* _JBIG2_TEXT_H */\n"
  },
  {
    "path": "JBig2/include/jbig2arith.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef JBIG2ENC_JBIG2ENC_H__\n#define JBIG2ENC_JBIG2ENC_H__\n\n#if defined(sun)\n#include <sys/types.h>\n#else\n#include <stdint.h>\n#endif\n\n#include <vector>\n\n#define JBIG2_MAX_CTX 65536\n#define JBIG2_OUTPUTBUFFER_SIZE 20 * 1024\n\n#ifdef _MSC_VER\n#define __restrict__ __restrict\n#endif\n\n//#define JBIG2_DEBUGGING\n//#define CODER_DEBUGGING\n//#define SYM_DEBUGGING\n//#define SYMBOL_COMPRESSION_DEBUGGING\n\n// -----------------------------------------------------------------------------\n// This is the context for the arithmetic encoder used in JBIG2. The coder is a\n// state machine and there are many different states used - one for coding\n// images, many more for coding numbers etc.\n//\n// When outputting data, the bytes are collected into chunks of size\n// JBIG2_OUTPUTBUFFER_SIZE. These are chained in a linked list.\n// -----------------------------------------------------------------------------\nstruct jbig2enc_ctx {\n  // these are the current state of the arithmetic coder\n  uint32_t c;\n  uint16_t a;\n  uint8_t ct, b;\n  int bp;\n\n  // This is a list of output chunks, not including the current one\n  std::vector<uint8_t *> *output_chunks;\n  uint8_t *outbuf;  // this is the current output chunk\n  int outbuf_used;  // number of bytes used in outbuf\n  uint8_t context[JBIG2_MAX_CTX];  // state machine context for encoding images\n  uint8_t intctx[13][512];  // 512 bytes of context indexes for each of 13 different int decodings\n                            // this data is also used for refinement coding\n  uint8_t *iaidctx;  // size of this context not known at construction time\n};\n\n// these are the proc numbers for encoding different classes of integers\nenum {\n  JBIG2_IAAI = 0,\n  JBIG2_IADH,\n  JBIG2_IADS,\n  JBIG2_IADT,\n  JBIG2_IADW,\n  JBIG2_IAEX,\n  JBIG2_IAFS,\n  JBIG2_IAIT,\n  JBIG2_IARDH,\n  JBIG2_IARDW,\n  JBIG2_IARDX,\n  JBIG2_IARDY,\n  JBIG2_IARI\n};\n\n// -----------------------------------------------------------------------------\n// Returns the number of bytes of output in the given context\n//\n// Before doing this you should make sure that the coder is _flush()'ed\n// -----------------------------------------------------------------------------\nunsigned jbig2enc_datasize(const struct jbig2enc_ctx *ctx);\n\n// -----------------------------------------------------------------------------\n// Writes the output of the given context to a buffer. The buffer must be at\n// least long enough to contain all the data (see _datasize)\n// -----------------------------------------------------------------------------\nvoid jbig2enc_tobuffer(const struct jbig2enc_ctx *__restrict__ ctx,\n                       uint8_t *__restrict__ buffer);\n\n// -----------------------------------------------------------------------------\n// Encode an integer of a given class. proc is one of JBIG2_IA* and specifies\n// the type of the number. IAID is special and is handled by another function.\n// -----------------------------------------------------------------------------\nvoid jbig2enc_int(struct jbig2enc_ctx *__restrict__ ctx, int proc, int value);\n\n\n// -----------------------------------------------------------------------------\n// Encode an IAID number. This needs to know how many bits to use.\n// -----------------------------------------------------------------------------\nvoid jbig2enc_iaid(struct jbig2enc_ctx *__restrict__ ctx, int symcodelen,\n                   int value);\n\n// -----------------------------------------------------------------------------\n// Encode the special out-of-bounds (-0) number for a given type. proc is one\n// of JBIG2_IA*\n// -----------------------------------------------------------------------------\nvoid jbig2enc_oob(struct jbig2enc_ctx *__restrict__ ctx, int proc);\n\n// -----------------------------------------------------------------------------\n// Encode a bitmap with the arithmetic encoder.\n//   data: an array of mx * my bytes\n//   mx: max x value\n//   my: max y value\n//   duplicate_line_removal: if true, TPGD is used\n//\n// TPGD often takes very slightly more bytes to encode, but cuts the time taken\n// by half.\n// -----------------------------------------------------------------------------\nvoid jbig2enc_image(struct jbig2enc_ctx *__restrict__ ctx,\n                    const uint8_t *__restrict__ data, int mx, int my,\n                    bool duplicate_line_removal);\n\n// -----------------------------------------------------------------------------\n// This function takes almost the same arguments as _image, above. But in this\n// case the data pointer points to packed data.\n//\n// This is designed for Leptonica's 1bpp packed format images. Each row is some\n// number of 32-bit words.\n//\n// *The pad bits at the end of each line must be zero.*\n// -----------------------------------------------------------------------------\nvoid jbig2enc_bitimage(struct jbig2enc_ctx *__restrict__ ctx,\n                       const uint8_t *__restrict__ data, int mx, int my,\n                       bool duplicate_line_removal);\n\n\n// -----------------------------------------------------------------------------\n// Encode the refinement of an exemplar to a bitmap.\n//\n// This encodes the difference between two images. If the template image is\n// close to the final image the amount of data needed should hopefully be\n// small.\n//   templ: the template image\n//   tx, ty: the size of the template image\n//   target: the desired image\n//   mx, my: the size of the desired image\n//   ox, oy: offset of the desired image from the template image.\n//           ox is limited to [-1, 0, 1]\n//\n// This uses Leptonica's 1bpp packed images (see comments above last function).\n//\n// *The pad bits at the end of each line, for both images, must be zero*\n// -----------------------------------------------------------------------------\nvoid jbig2enc_refine(struct jbig2enc_ctx *__restrict__ ctx,\n                     const uint8_t *__restrict__ templ, int tx, int ty,\n                     const uint8_t *__restrict__ target, int mx, int my,\n                     int ox, int oy);\n\n// -----------------------------------------------------------------------------\n// Init a new context\n// -----------------------------------------------------------------------------\nvoid jbig2enc_init(struct jbig2enc_ctx *ctx);\n\n// -----------------------------------------------------------------------------\n// Destroy a context\n// -----------------------------------------------------------------------------\nvoid jbig2enc_dealloc(struct jbig2enc_ctx *ctx);\n\n// -----------------------------------------------------------------------------\n// Flush all the data stored in a context\n// -----------------------------------------------------------------------------\nvoid jbig2enc_flush(struct jbig2enc_ctx *ctx);\n\n// -----------------------------------------------------------------------------\n// Reset the arithmetic coder back to a init state\n// -----------------------------------------------------------------------------\nvoid jbig2enc_reset(struct jbig2enc_ctx *ctx);\n\n// -----------------------------------------------------------------------------\n// Flush any remaining arithmetic encoder context to the output.\n// -----------------------------------------------------------------------------\nvoid jbig2enc_final(struct jbig2enc_ctx *ctx);\n\n#endif  // EXPERIMENTAL_USERS_AGL_JBIG2ENC_JBIG2ENC_H__\n"
  },
  {
    "path": "JBig2/include/jbig2enc.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef JBIG2ENC_JBIG2_H__\n#define JBIG2ENC_JBIG2_H__\n\n// -----------------------------------------------------------------------------\n// Welcome gentle reader,\n//\n// This is an encoder for JBIG2:\n// www.jpeg.org/public/fcd14492.pdf\n//\n// JBIG2 encodes bi-level (1 bpp) images using a number of clever tricks to get\n// better compression than G4. This encoder can:\n//    * Generate JBIG2 files, or fragments for embedding in PDFs\n//    * Generic region encoding\n//    * Symbol extraction, classification and text region coding\n//\n// It uses the (Apache-ish licensed) Leptonica library:\n//   http://www.leptonica.com/\n// -----------------------------------------------------------------------------\n\n#if defined(sun)\n#include <sys/types.h>\n#else\n#include <stdint.h>\n#endif\n\nstruct Pix;\n// This is the (opaque) structure which handles multi-page compression.\nstruct jbig2ctx;\n\n// -----------------------------------------------------------------------------\n// Multipage compression.\n//\n// First call jbig2_init to setup the structure. This structure must be free'ed\n// by calling jbig2_destroy when you are finished.\n//\n// First, add all the pages with jbig2_add_page. This will collect all the\n// information required. If refinement is on, it will also save all the\n// component images, so this may take large amounts of memory.\n//\n// Then call jbig2_pages_complete. This returns a malloced buffer with the\n// symbol table encoded.\n//\n// Then call jbig2_produce_page for each page. You must call it with pages\n// numbered from zero, and for every page.\n// -----------------------------------------------------------------------------\n\n// -----------------------------------------------------------------------------\n// Create a multi-page compression context structure\n//\n// thresh: The threshold for the classifier. The larger the number the larger\n//         the number of different symbols, the more bits used and the closer\n//         the resulting image is to the original. (0.85 is a good value)\n// weight: Use 0.5\n// xres: the ppi in the X direction. If 0, the ppi is taken from bw\n// yres: see xres\n// full_headers: if true a full JBIG2 file is produced, otherwise the data is\n//               only good for embedding in PDFs\n// refine: If < 0, disable refinement. Otherwise, the number of incorrect\n//         pixels which will be accepted per symbol. Enabling refinement\n//         increases memory use.\n// -----------------------------------------------------------------------------\nstruct jbig2ctx *jbig2_init(float thresh, float weight, int xres, int yres,\n                            bool full_headers, int refine_level);\n\n// -----------------------------------------------------------------------------\n// Delete a context returned by jbig2_init\n// -----------------------------------------------------------------------------\nvoid jbig2_destroy(struct jbig2ctx *);\n// -----------------------------------------------------------------------------\n// Classify and record information about a page.\n//\n// bw: A 1-bpp image\n// -----------------------------------------------------------------------------\nvoid jbig2_add_page(struct jbig2ctx *ctx, struct Pix *bw);\n// -----------------------------------------------------------------------------\n// Finalise information about the document and encode the symbol table.\n//\n// WARNING: returns a malloced buffer which the caller must free\n// -----------------------------------------------------------------------------\nuint8_t *jbig2_pages_complete(struct jbig2ctx *ctx, int *const length);\n// -----------------------------------------------------------------------------\n// Encode a page.\n//\n// page_no: number of this page, indexed from 0. This *must* match the order of\n//          pages presented to jbig2_add_page.\n// xres, yres: if -1, use values given in _init. Otherwise, set the resolution\n//             for this page only\n//\n// WARNING: returns a malloced buffer which the caller must free\n// -----------------------------------------------------------------------------\nuint8_t *jbig2_produce_page(struct jbig2ctx *ctx, int page_no, int xres,\n                            int yres, int *const length);\n\n// WARNING: returns a malloced buffer which the caller must free\n// -----------------------------------------------------------------------------\n\n\n// -----------------------------------------------------------------------------\n// Single page compression\n// -----------------------------------------------------------------------------\n\n// -----------------------------------------------------------------------------\n// Encode an image as a single generic region. This is lossless. It should not\n// be used for images as half-tone coding is not implemented.\n//\n// see argument comments for jbig2_init\n// duplicate_line_removal: turning this on\n//    * Breaks ghostscript\n//    * Takes ever so slightly more bytes to encode\n//    * Cuts the encode time by half\n//\n// WARNING: returns a malloced buffer which the caller must free\n// -----------------------------------------------------------------------------\nuint8_t *\njbig2_encode_generic(struct Pix *const bw, const bool full_headers,\n                     const int xres, const int yres,\n                     const bool duplicate_line_removal,\n                     int *const length);\n\n#endif  // JBIG2ENC_JBIG2_H__\n"
  },
  {
    "path": "JBig2/include/jbig2enc.lossless.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef JBIG2ENC_JBIG2_H__\n#define JBIG2ENC_JBIG2_H__\n\n// -----------------------------------------------------------------------------\n// Welcome gentle reader,\n//\n// This is an encoder for JBIG2:\n// www.jpeg.org/public/fcd14492.pdf\n//\n// JBIG2 encodes bi-level (1 bpp) images using a number of clever tricks to get\n// better compression than G4. This encoder can:\n//    * Generate JBIG2 files, or fragments for embedding in PDFs\n//    * Generic region encoding\n//    * Symbol extraction, classification and text region coding\n//\n// -----------------------------------------------------------------------------\n\n#if defined(sun)\n#include <sys/types.h>\n#else\n#include <stdint.h>\n#endif\n\nstruct Pix;\n\n// -----------------------------------------------------------------------------\n// Single page compression\n// -----------------------------------------------------------------------------\n\n// -----------------------------------------------------------------------------\n// Encode an image as a single generic region. This is lossless. It should not\n// be used for images as half-tone coding is not implemented.\n//\n// see argument comments for jbig2_init\n// xres: the ppi in the X direction. If 0, the ppi is taken from bw\n// yres: see xres\n// duplicate_line_removal: turning this on\n//    * Breaks ghostscript\n//    * Takes ever so slightly more bytes to encode\n//    * Cuts the encode time by half\n//\n// WARNING: returns a malloced buffer which the caller must free\n// -----------------------------------------------------------------------------\nuint8_t *\njbig2_encode_generic(struct Pix *const bw, const bool full_headers,\n                     const int xres, const int yres,\n                     const bool duplicate_line_removal,\n                     int *const length);\n\n// -----------------------------------------------------------------------------\n// Encode an image as a single generic region. This is lossless. It should not\n// be used for images as half-tone coding is not implemented.\n//\n// full_headers: if true a full JBIG2 file is produced, otherwise the data is\n//               only good for embedding in PDFs\n// source: pointer to the scan0 of the black and white Bitmap\n// length: [out] the length of the output buffer\n// WARNING: returns a malloced buffer which the caller must free\n// -----------------------------------------------------------------------------\nuint8_t *\njbig2_encode (int width, int height, int stride, bool zeroIsWhite, uint8_t * const source, int *const length);\n\n// -----------------------------------------------------------------------------\n// Release the memory buffer returned from jbig2_encode_generic or jbig2_encode.\n// This function is purely for interoperation outside of C/C++ world.\n// -----------------------------------------------------------------------------\nvoid jbig2_freemem (uint8_t * const memblock);\n#endif  // JBIG2ENC_JBIG2_H__\n"
  },
  {
    "path": "JBig2/include/jbig2segments.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef THIRD_PARTY_JBIG2ENC_JBIG2SEGMENTS_H__\n#define THIRD_PARTY_JBIG2ENC_JBIG2SEGMENTS_H__\n\n#include <vector>\n#ifdef WIN32\n#include <winsock2.h>\n#else\n#include <netinet/in.h>\n#endif\n\n// -----------------------------------------------------------------------------\n// See comments in jbig2structs.h about the bit packing in this structure.\n// -----------------------------------------------------------------------------\n#if defined(WIN32)\n#pragma pack(1)\n#endif\nstruct jbig2_segment {\n  u32 number;\n#ifndef _BIG_ENDIAN\n  unsigned char type : 6;\n  unsigned char page_assoc_size : 1;\n  unsigned char deferred_non_retain : 1;\n#else\n  unsigned char deferred_non_retain : 1;\n  unsigned char page_assoc_size : 1;\n  unsigned char type : 6;\n#endif\n\n#ifndef _BIG_ENDIAN\n  unsigned char retain_bits : 5;\n  unsigned char segment_count : 3;\n#else\n  unsigned char segment_count : 3;\n  unsigned char retain_bits : 5;\n#endif\n}\n#if defined(WIN32)\n;\n#pragma pack()\n#else\n__attribute__((packed));\n#endif\n;\n\n// -----------------------------------------------------------------------------\n// This structure represents a JBIG2 segment header because they have too many\n// variable length fields (number of referred to segments, page length etc).\n// You should access and set the members directly. Endian swapping is carried\n// out internally.\n// -----------------------------------------------------------------------------\nstruct Segment {\n  unsigned number;  // segment number\n  int type;  // segment type (see enum in jbig2structs.h)\n  int deferred_non_retain;  // see JBIG2 spec\n  int retain_bits;\n  std::vector<unsigned> referred_to;  // list of segment numbers referred to\n  unsigned page;  // page number\n  unsigned len;   // length of trailing data\n\n  Segment()\n      : number(0),\n        type(0),\n        deferred_non_retain(0),\n        retain_bits(0),\n        page(0),\n        len(0) {}\n\n  // ---------------------------------------------------------------------------\n  // Return the size of the segment reference for this segment. Segments can\n  // only refer to previous segments, so the bits needed is determined by the\n  // number of this segment. (7.2.5)\n  // ---------------------------------------------------------------------------\n  unsigned reference_size() const {\n    int refsize;\n    if (number <= 256) {\n      refsize = 1;\n    } else if (number <= 65536) {\n      refsize = 2;\n    } else {\n      refsize = 4;\n    }\n\n    return refsize;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Return the size of the segment page association field for this segment.\n  // (7.2.6)\n  // ---------------------------------------------------------------------------\n  unsigned page_size() const {\n      return page <= 255 ? 1 : 4;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Return the number of bytes that this segment header will take up\n  // ---------------------------------------------------------------------------\n  unsigned size() const {\n    const int refsize = reference_size();\n    const int pagesize = page_size();\n\n    return sizeof(struct jbig2_segment) + refsize * referred_to.size() +\n           pagesize + sizeof(u32);\n  }\n\n  // ---------------------------------------------------------------------------\n  // Serialise this segment header into the memory pointed to by buf, which\n  // must be at least long enough to contain it (e.g. size() bytes)\n  // ---------------------------------------------------------------------------\n  void write(u8 *buf) {\n    struct jbig2_segment s;\n    memset(&s, 0, sizeof(s));\n#define F(x) s.x = x;\n    s.number = htonl(number);\n    s.type = type;\n    s.deferred_non_retain = deferred_non_retain;\n    s.retain_bits = retain_bits;\n#undef F\n    s.segment_count = referred_to.size();\n\n    const int pagesize = page_size();\n    const int refsize = reference_size();\n    if (pagesize == 4) s.page_assoc_size = 1;\n\n    unsigned j = 0;\n\n    memcpy(buf, &s, sizeof(s));\n    j += sizeof(s);\n#define APPEND(type, val) type __i; __i = val; \\\n    memcpy(&buf[j], &__i, sizeof(type)); \\\n    j += sizeof(type)\n\n    for (std::vector<unsigned>::const_iterator i = referred_to.begin();\n         i != referred_to.end(); ++i) {\n      if (refsize == 4) {\n        APPEND(u32, htonl(*i));\n      } else if (refsize == 2) {\n        APPEND(u16, htons(*i));\n      } else {\n        APPEND(u8, *i);\n      }\n    }\n\n    if (pagesize == 4) {\n      APPEND(u32, htonl(page));\n    } else {\n      APPEND(u8, page);\n    }\n\n    APPEND(u32, htonl(len));\n\n    if (j != size()) abort();\n  }\n};\n\n#endif  // THIRD_PARTY_JBIG2ENC_JBIG2SEGMENTS_H__\n"
  },
  {
    "path": "JBig2/include/jbig2structs.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef JBIG2ENC_JBIG2STRUCTS_H__\n#define JBIG2ENC_JBIG2STRUCTS_H__\n\n// GCC packs bit fields in a different order on big endian machines\n\nenum {\n  segment_symbol_table = 0,\n  segment_imm_generic_region = 38,\n  segment_page_information = 48,\n  segment_imm_text_region =  6,\n  segment_end_of_page = 49,\n  segment_end_of_file = 51\n};\n\n// note that the < 1 byte fields are packed from the LSB upwards - unless\n// you're bigendian, in which case they are packed MSB downwards. Joy.\n\n#define JBIG2_FILE_MAGIC \"\\x97\\x4a\\x42\\x32\\x0d\\x0a\\x1a\\x0a\"\n\n#if defined(WIN32)\n#pragma pack(1)\n#define PACKED\n#else\n#define PACKED __attribute__((packed))\n#endif\n\nstruct jbig2_file_header {\n  u8 id[8];\n#ifndef _BIG_ENDIAN\n  u8 organisation_type : 1;\n  u8 unknown_n_pages : 1;\n  u8 reserved : 6;\n#else\n  u8 reserved : 6;\n  u8 unknown_n_pages : 1;\n  u8 organisation_type : 1;\n#endif\n  u32 n_pages;\n} PACKED;\n\nstruct jbig2_page_info {\n  u32 width;\n  u32 height;\n  u32 xres;\n  u32 yres;\n#ifndef _BIG_ENDIAN\n  u8 is_lossless : 1;\n  u8 contains_refinements : 1;\n  u8 default_pixel : 1;\n  u8 default_operator : 2;\n  u8 aux_buffers : 1;\n  u8 operator_override : 1;\n  u8 reserved : 1;\n#else\n  u8 reserved : 1;\n  u8 operator_override : 1;\n  u8 aux_buffers : 1;\n  u8 default_operator : 2;\n  u8 default_pixel : 1;\n  u8 contains_refinements : 1;\n  u8 is_lossless : 1;\n#endif\n  u16 segment_flags;\n} PACKED;\n\nstruct jbig2_generic_region {\n  u32 width;\n  u32 height;\n  u32 x;\n  u32 y;\n  u8 comb_operator;\n\n#ifndef _BIG_ENDIAN\n  u8 mmr : 1;\n  u8 gbtemplate : 2;\n  u8 tpgdon : 1;\n  u8 reserved : 4;\n#else\n  u8 reserved : 4;\n  u8 tpgdon : 1;\n  u8 gbtemplate : 2;\n  u8 mmr : 1;\n#endif\n\n  // generic region segment here. You may not need to write all 8 bytes here.\n  // If the template is 1..3 only the first two are needed.\n  signed char a1x, a1y, a2x, a2y, a3x, a3y, a4x, a4y;\n} PACKED ;\n\nstruct jbig2_symbol_dict {\n#ifndef _BIG_ENDIAN\n  u8 sdhuff:1;\n  u8 sdrefagg:1;\n  u8 sdhuffdh:2;\n  u8 sdhuffdw:2;\n  u8 sdhuffbmsize:1;\n  u8 sdhuffagginst:1;\n  u8 bmcontext:1;\n  u8 bmcontextretained:1;\n  u8 sdtemplate:2;\n  u8 sdrtemplate:1;\n  u8 reserved:3;\n#else\n  u8 reserved:3;\n  u8 sdrtemplate:1;\n  u8 sdtemplate:2;\n  u8 bmcontextretained:1;\n  u8 bmcontext:1;\n  u8 sdhuffagginst:1;\n  u8 sdhuffbmsize:1;\n  u8 sdhuffdw:2;\n  u8 sdhuffdh:2;\n  u8 sdrefagg:1;\n  u8 sdhuff:1;\n#endif\n\n  signed char a1x, a1y, a2x, a2y, a3x, a3y, a4x, a4y;\n\n  // refinement AT flags omitted\n\n  u32 exsyms;\n  u32 newsyms;\n} PACKED;\n\nstruct jbig2_text_region {\n  u32 width;\n  u32 height;\n  u32 x;\n  u32 y;\n  u8 comb_operator;\n\n#ifndef _BIG_ENDIAN\n  u8 sbcombop2:1;\n  u8 sbdefpixel:1;\n  u8 sbdsoffset:5;\n  u8 sbrtemplate:1;\n  u8 sbhuff:1;\n  u8 sbrefine:1;\n  u8 logsbstrips:2;\n  u8 refcorner:2;\n  u8 transposed:1;\n  u8 sbcombop1:1;\n#else\n  u8 sbcombop1:1;\n  u8 transposed:1;\n  u8 refcorner:2;\n  u8 logsbstrips:2;\n  u8 sbrefine:1;\n  u8 sbhuff:1;\n  u8 sbrtemplate:1;\n  u8 sbdsoffset:5;\n  u8 sbdefpixel:1;\n  u8 sbcombop2:1;\n#endif\n\n  // huffman flags omitted\n} PACKED;\n\n\nstruct jbig2_text_region_atflags {\n  signed char a1x, a1y, a2x, a2y;\n} PACKED;\n\nstruct jbig2_text_region_syminsts {\n  u32 sbnuminstances;\n  // huffman decoding table omitted\n} PACKED;\n\n#if defined(WIN32)\n#pragma pack()\n#endif\n\n#endif  // JBIG2ENC_JBIG2STRUCTS_H__\n"
  },
  {
    "path": "JBig2/include/jbig2sym.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef JBIG2ENC_JBIG2SYM_H__\n#define JBIG2ENC_JBIG2SYM_H__\n\nstruct jbig2enc_ctx;\n\n// -----------------------------------------------------------------------------\n// Write a symbol table.\n//\n// symbols: A 2d array. The first dimention is of different classes of symbols.\n//          Then, for each class, there are all the examples of that class. The\n//          first member of the class is taken as the exemplar.\n// symbol_list: a list of symbols to encode\n// symmap: an empty map which is filled. The symbols are written to the file in\n//         a different order than they are given in symbols. The maps an index\n//         into the symbols array to a symbol number in the file\n// unborder_symbols: if true, remove a border from every element of symbols\n// -----------------------------------------------------------------------------\nvoid jbig2enc_symboltable(struct jbig2enc_ctx *__restrict__ ctx,\n                          PIXA *__restrict__ const symbols,\n                          std::vector<unsigned> *__restrict__ symbol_list,\n                          std::map<int, int> *symmap,\n                          bool unborder_symbols);\n\n// -----------------------------------------------------------------------------\n// Write a text region.\n//\n// A text region is a list of placements of symbols. The symbols must already\n// have been coded.\n//\n// symmap: This maps class numbers to symbol numbers. Only symbol numbers\n//         appear in the JBIG2 data stream\n// symmap2: If not found in the first symmap, try this one\n// comps: a list of connected-component numbers for this page\n// ll: This is an array of the lower-left corners of the boxes for each symbol\n// assignments: an array, of the same length as boxes, mapping each box to a\n//              symbol\n// stripwidth: 1 is a safe default (one of [1, 2, 4, 8])\n// symbits: number of bits needed to code the symbol number (log2(number of\n//          symbols) - rounded up)\n// source: an array of the original images for all the connected components.\n//         If NULL, refinement is disabled. (page indexed)\n// boxes: if source is non-NULL, this is page based list of boxes of symbols on\n//        the page\n// baseindex: if source is non-NULL, this is the component number of the first\n//            component on this page\n// refine_level: the number of incorrect pixels allowed before refining.\n// unborder_symbols: if true, symbols have a 6px border around them\n// -----------------------------------------------------------------------------\nvoid jbig2enc_textregion(struct jbig2enc_ctx *__restrict__ ctx,\n                         /*const*/ std::map<int, int> &symmap,\n                         /*const*/ std::map<int, int> &symmap2,\n                         const std::vector<int> &comps,\n                         PTA *const ll, PIXA *const symbols,\n                         NUMA *assignments,\n                         int stripwidth, int symbits,\n                         PIXA *const source, BOXA *boxes, int baseindex,\n                         int refine_level, bool unborder_symbols);\n\n#endif  // JBIG2ENC_JBIG2SYM_H__\n"
  },
  {
    "path": "JBig2/include/memento.h",
    "content": "/* Copyright (C) 2009-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied, modified\n   or distributed except as expressly authorized under the terms of that\n   license. Refer to licensing information at http://www.artifex.com\n   or contact Artifex Software, Inc.,  1305 Grant Avenue - Suite 200,\n   Novato, CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/* Memento: A library to aid debugging of memory leaks/heap corruption.\n *\n * Usage (with C):\n *    First, build your project with MEMENTO defined, and include this\n *    header file wherever you use malloc, realloc or free.\n *    This header file will use macros to point malloc, realloc and free to\n *    point to Memento_malloc, Memento_realloc, Memento_free.\n *\n *    Run your program, and all mallocs/frees/reallocs should be redirected\n *    through here. When the program exits, you will get a list of all the\n *    leaked blocks, together with some helpful statistics. You can get the\n *    same list of allocated blocks at any point during program execution by\n *    calling Memento_listBlocks();\n *\n *    Every call to malloc/free/realloc counts as an 'allocation event'.\n *    On each event Memento increments a counter. Every block is tagged with\n *    the current counter on allocation. Every so often during program\n *    execution, the heap is checked for consistency. By default this happens\n *    after 1024 events, then after 2048 events, then after 4096 events, etc.\n *    This can be changed at runtime by using Memento_setParanoia(int level).\n *    0 turns off such checking, 1 sets checking to happen on every event,\n *    any positive number n sets checking to happen once every n events,\n *    and any negative number n sets checking to happen after -n events, then\n *    after -2n events etc.\n *\n *    The default paranoia level is therefore -1024.\n *\n *    Memento keeps blocks around for a while after they have been freed, and\n *    checks them as part of these heap checks to see if they have been\n *    written to (or are freed twice etc).\n *\n *    A given heap block can be checked for consistency (it's 'pre' and\n *    'post' guard blocks are checked to see if they have been written to)\n *    by calling Memento_checkBlock(void *blockAddress);\n *\n *    A check of all the memory can be triggered by calling Memento_check();\n *    (or Memento_checkAllMemory(); if you'd like it to be quieter).\n *\n *    A good place to breakpoint is Memento_breakpoint, as this will then\n *    trigger your debugger if an error is detected. This is done\n *    automatically for debug windows builds.\n *\n *    If a block is found to be corrupt, information will be printed to the\n *    console, including the address of the block, the size of the block,\n *    the type of corruption, the number of the block and the event on which\n *    it last passed a check for correctness.\n *\n *    If you rerun, and call Memento_paranoidAt(int event); with this number\n *    the code will wait until it reaches that event and then start\n *    checking the heap after every allocation event. Assuming it is a\n *    deterministic failure, you should then find out where in your program\n *    the error is occurring (between event x-1 and event x).\n *\n *    Then you can rerun the program again, and call\n *    Memento_breakAt(int event); and the program will call\n *    Memento_Breakpoint() when event x is reached, enabling you to step\n *    through.\n *\n *    Memento_find(address) will tell you what block (if any) the given\n *    address is in.\n *\n * An example:\n *    Suppose we have a gs invocation that crashes with memory corruption.\n *     * Build with -DMEMENTO.\n *     * In your debugger put a breakpoint on Memento_breakpoint.\n *     * Run the program. It will stop in Memento_inited.\n *     * Execute Memento_setParanoia(1);  (In VS use Ctrl-Alt-Q). (Note #1)\n *     * Continue execution.\n *     * It will detect the memory corruption on the next allocation event\n *       after it happens, and stop in Memento_breakpoint. The console should\n *       show something like:\n *\n *       Freed blocks:\n *         0x172e610(size=288,num=1415) index 256 (0x172e710) onwards corrupted\n *           Block last checked OK at allocation 1457. Now 1458.\n *\n *     * This means that the block became corrupted between allocation 1457\n *       and 1458 - so if we rerun and stop the program at 1457, we can then\n *       step through, possibly with a data breakpoint at 0x172e710 and see\n *       when it occurs.\n *     * So restart the program from the beginning. When we stop after\n *       initialisation execute Memento_breakAt(1457); (and maybe\n *       Memento_setParanoia(1), or Memento_setParanoidAt(1457))\n *     * Continue execution until we hit Memento_breakpoint.\n *     * Now you can step through and watch the memory corruption happen.\n *\n *    Note #1: Using Memento_setParanoia(1) can cause your program to run\n *    very slowly. You may instead choose to use Memento_setParanoia(100)\n *    (or some other figure). This will only exhaustively check memory on\n *    every 100th allocation event. This trades speed for the size of the\n *    average allocation event range in which detection of memory corruption\n *    occurs. You may (for example) choose to run once checking every 100\n *    allocations and discover that the corruption happens between events\n *    X and X+100. You can then rerun using Memento_paranoidAt(X), and\n *    it'll only start exhaustively checking when it reaches X.\n *\n * More than one memory allocator?\n *\n *    If you have more than one memory allocator in the system (like for\n *    instance the ghostscript chunk allocator, that builds on top of the\n *    standard malloc and returns chunks itself), then there are some things\n *    to note:\n *\n *    * If the secondary allocator gets its underlying blocks from calling\n *      malloc, then those will be checked by Memento, but 'subblocks' that\n *      are returned to the secondary allocator will not. There is currently\n *      no way to fix this other than trying to bypass the secondary\n *      allocator. One way I have found to do this with the chunk allocator\n *      is to tweak its idea of a 'large block' so that it puts every\n *      allocation in its own chunk. Clearly this negates the point of having\n *      a secondary allocator, and is therefore not recommended for general\n *      use.\n *\n *    * Again, if the secondary allocator gets its underlying blocks from\n *      calling malloc (and hence Memento) leak detection should still work\n *      (but whole blocks will be detected rather than subblocks).\n *\n *    * If on every allocation attempt the secondary allocator calls into\n *      Memento_failThisEvent(), and fails the allocation if it returns true\n *      then more useful features can be used; firstly memory squeezing will\n *      work, and secondly, Memento will have a \"finer grained\" paranoia\n *      available to it.\n *\n * Usage with C++:\n *\n *    Memento has some experimental code in it to trap new/delete (and\n *    new[]/delete[] if required) calls.\n *\n *    In order for this to work, either:\n *\n *    1) Build memento.c with the c++ compiler.\n *\n *    or\n *\n *    2) Build memento.c as normal with the C compiler, then from any\n *       one of your .cpp files, do:\n *\n *       #define MEMENTO_CPP_EXTRAS_ONLY\n *       #include \"memento.c\"\n *\n *       In the case where MEMENTO is not defined, this will not do anything.\n *\n *    Both Windows and GCC provide separate new[] and delete[] operators\n *    for arrays. Apparently some systems do not. If this is the case for\n *    your system, define MEMENTO_CPP_NO_ARRAY_CONSTRUCTORS.\n *\n * \"libbacktrace.so failed to load\"\n *\n *    In order to give nice backtraces on unix, Memento will try to use\n *    a libbacktrace dynamic library. If it can't find it, you'll see\n *    that warning, and your backtraces won't include file/line information.\n *\n *    To fix this you'll need to build your own libbacktrace. Don't worry\n *    it's really easy:\n *       git clone git://github.com/ianlancetaylor/libbacktrace\n *       cd libbacktrace\n *       ./configure\n *       make\n *\n *    This leaves the build .so as .libs/libbacktrace.so\n *\n *    Memento will look for this on LD_LIBRARY_PATH, or in /opt/lib/,\n *    or in /lib/, or  in /usr/lib/, or in /usr/local/lib/. I recommend\n *    using /opt/lib/ as this won't conflict with anything that you\n *    get via a package manager like apt.\n *\n *       sudo mkdir /opt\n *       sudo mkdir /opt/lib\n *       sudo cp .libs/libbacktrace.so /opt/lib/\n */\n\n#ifndef MEMENTO_H\n\n#include <stdlib.h>\n\n#define MEMENTO_H\n\n#ifndef MEMENTO_UNDERLYING_MALLOC\n#define MEMENTO_UNDERLYING_MALLOC malloc\n#endif\n#ifndef MEMENTO_UNDERLYING_FREE\n#define MEMENTO_UNDERLYING_FREE free\n#endif\n#ifndef MEMENTO_UNDERLYING_REALLOC\n#define MEMENTO_UNDERLYING_REALLOC realloc\n#endif\n#ifndef MEMENTO_UNDERLYING_CALLOC\n#define MEMENTO_UNDERLYING_CALLOC calloc\n#endif\n\n#ifndef MEMENTO_MAXALIGN\n#define MEMENTO_MAXALIGN (sizeof(int))\n#endif\n\n#define MEMENTO_PREFILL   0xa6\n#define MEMENTO_POSTFILL  0xa7\n#define MEMENTO_ALLOCFILL 0xa8\n#define MEMENTO_FREEFILL  0xa9\n\n#define MEMENTO_FREELIST_MAX 0x2000000\n\nint Memento_checkBlock(void *);\nint Memento_checkAllMemory(void);\nint Memento_check(void);\n\nint Memento_setParanoia(int);\nint Memento_paranoidAt(int);\nint Memento_breakAt(int);\nvoid Memento_breakOnFree(void *a);\nvoid Memento_breakOnRealloc(void *a);\nint Memento_getBlockNum(void *);\nint Memento_find(void *a);\nvoid Memento_breakpoint(void);\nint Memento_failAt(int);\nint Memento_failThisEvent(void);\nvoid Memento_listBlocks(void);\nvoid Memento_listNewBlocks(void);\nsize_t Memento_setMax(size_t);\nvoid Memento_stats(void);\nvoid *Memento_label(void *, const char *);\nvoid Memento_tick(void);\n\nvoid *Memento_malloc(size_t s);\nvoid *Memento_realloc(void *, size_t s);\nvoid  Memento_free(void *);\nvoid *Memento_calloc(size_t, size_t);\n\nvoid Memento_info(void *addr);\nvoid Memento_listBlockInfo(void);\nvoid *Memento_takeByteRef(void *blk);\nvoid *Memento_dropByteRef(void *blk);\nvoid *Memento_takeShortRef(void *blk);\nvoid *Memento_dropShortRef(void *blk);\nvoid *Memento_takeIntRef(void *blk);\nvoid *Memento_dropIntRef(void *blk);\nvoid *Memento_takeRef(void *blk);\nvoid *Memento_dropRef(void *blk);\nvoid *Memento_adjustRef(void *blk, int adjust);\nvoid *Memento_reference(void *blk);\n\nint Memento_checkPointerOrNull(void *blk);\nint Memento_checkBytePointerOrNull(void *blk);\nint Memento_checkShortPointerOrNull(void *blk);\nint Memento_checkIntPointerOrNull(void *blk);\n\nvoid Memento_startLeaking(void);\nvoid Memento_stopLeaking(void);\n\nint Memento_sequence(void);\n\nint Memento_squeezing(void);\n\nvoid Memento_fin(void);\n\nvoid Memento_bt(void);\n\n#ifdef MEMENTO\n\n#ifndef COMPILING_MEMENTO_C\n#define malloc  Memento_malloc\n#define free    Memento_free\n#define realloc Memento_realloc\n#define calloc  Memento_calloc\n#endif\n\n#else\n\n#define Memento_malloc  MEMENTO_UNDERLYING_MALLOC\n#define Memento_free    MEMENTO_UNDERLYING_FREE\n#define Memento_realloc MEMENTO_UNDERLYING_REALLOC\n#define Memento_calloc  MEMENTO_UNDERLYING_CALLOC\n\n#define Memento_checkBlock(A)              0\n#define Memento_checkAllMemory()           0\n#define Memento_check()                    0\n#define Memento_setParanoia(A)             0\n#define Memento_paranoidAt(A)              0\n#define Memento_breakAt(A)                 0\n#define Memento_breakOnFree(A)             0\n#define Memento_breakOnRealloc(A)          0\n#define Memento_getBlockNum(A)             0\n#define Memento_find(A)                    0\n#define Memento_breakpoint()               do {} while (0)\n#define Memento_failAt(A)                  0\n#define Memento_failThisEvent()            0\n#define Memento_listBlocks()               do {} while (0)\n#define Memento_listNewBlocks()            do {} while (0)\n#define Memento_setMax(A)                  0\n#define Memento_stats()                    do {} while (0)\n#define Memento_label(A,B)                 (A)\n#define Memento_info(A)                    do {} while (0)\n#define Memento_listBlockInfo()            do {} while (0)\n#define Memento_takeByteRef(A)             (A)\n#define Memento_dropByteRef(A)             (A)\n#define Memento_takeShortRef(A)            (A)\n#define Memento_dropShortRef(A)            (A)\n#define Memento_takeIntRef(A)              (A)\n#define Memento_dropIntRef(A)              (A)\n#define Memento_takeRef(A)                 (A)\n#define Memento_dropRef(A)                 (A)\n#define Memento_adjustRef(A,V)             (A)\n#define Memento_reference(A)               (A)\n#define Memento_checkPointerOrNull(A)      0\n#define Memento_checkBytePointerOrNull(A)  0\n#define Memento_checkShortPointerOrNull(A) 0\n#define Memento_checkIntPointerOrNull(A)   0\n\n#define Memento_tick()                     do {} while (0)\n#define Memento_startLeaking()             do {} while (0)\n#define Memento_stopLeaking()              do {} while (0)\n#define Memento_fin()                      do {} while (0)\n#define Memento_bt()                       do {} while (0)\n#define Memento_sequence()                 (0)\n#define Memento_squeezing()                (0)\n\n#endif /* MEMENTO */\n\n#endif /* MEMENTO_H */\n"
  },
  {
    "path": "JBig2/include/os_types.h",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/*\n   indirection layer for build and platform-specific definitions\n\n   in general, this header should ensure that the stdint types are\n   available, and that any optional compile flags are defined if\n   the build system doesn't pass them directly.\n*/\n\n#ifndef _JBIG2_OS_TYPES_H\n#define _JBIG2_OS_TYPES_H\n\n#if defined(HAVE_CONFIG_H)\n# include \"config_types.h\"\n#elif defined(_WIN32)\n# include \"config_win32.h\"\n#elif defined (STD_INT_USE_SYS_TYPES_H)\n# include <sys/types.h>\n#elif defined (STD_INT_USE_INTTYPES_H)\n# include <inttypes.h>\n#elif defined (STD_INT_USE_SYS_INTTYPES_H)\n# include <sys/inttypes.h>\n#elif defined (STD_INT_USE_SYS_INT_TYPES_H)\n# include <sys/int_types.h>\n#else\n# include <stdint.h>\n#endif\n\n#endif /* _JBIG2_OS_TYPES_H */\n"
  },
  {
    "path": "JBig2/include/pix.h",
    "content": "#include <stdint.h>\nstruct Pix\n{\n    uint32_t             w;           /* width in pixels                   */\n    uint32_t             h;           /* height in pixels                  */\n    int32_t              xres;        /* image res (ppi) in x direction    */\n                                      /* (use 0 if unknown)                */\n    int32_t              yres;        /* image res (ppi) in y direction    */\n                                      /* (use 0 if unknown)                */\n    uint32_t            *data;        /* the image data                    */\n};\ntypedef struct Pix PIX;"
  },
  {
    "path": "JBig2/include/sha1.h",
    "content": "/* public api for steve reid's public domain SHA-1 implementation */\n/* this file is in the public domain */\n\n#ifndef __SHA1_H\n#define __SHA1_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\ntypedef struct {\n    uint32_t state[5];\n    uint32_t count[2];\n    uint8_t buffer[64];\n} SHA1_CTX;\n\n#define SHA1_DIGEST_SIZE 20\n\nvoid SHA1_Init(SHA1_CTX *context);\nvoid SHA1_Update(SHA1_CTX *context, const uint8_t *data, const size_t len);\nvoid SHA1_Final(SHA1_CTX *context, uint8_t digest[SHA1_DIGEST_SIZE]);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif                          /* __SHA1_H */\n"
  },
  {
    "path": "JBig2/include/stdint.h",
    "content": "// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 \n// \n//  Copyright (c) 2006 Alexander Chemeris\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// \n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n// \n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n// \n//   3. The name of the author may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// \n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef _MSC_VER // [\n#error \"Use this header only with Microsoft Visual C++ compilers!\"\n#endif // _MSC_VER ]\n\n#ifndef _MSC_STDINT_H_ // [\n#define _MSC_STDINT_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#include <limits.h>\n\n// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern \"C++\" {}'\n// or compiler give many errors like this:\n//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed\n#if (_MSC_VER < 1300) && defined(__cplusplus)\n   extern \"C++\" {\n#endif \n#     include <wchar.h>\n#if (_MSC_VER < 1300) && defined(__cplusplus)\n   }\n#endif\n\n// 7.18.1 Integer types\n\n// 7.18.1.1 Exact-width integer types\ntypedef __int8            int8_t;\ntypedef __int16           int16_t;\ntypedef __int32           int32_t;\ntypedef __int64           int64_t;\ntypedef unsigned __int8   uint8_t;\ntypedef unsigned __int16  uint16_t;\ntypedef unsigned __int32  uint32_t;\ntypedef unsigned __int64  uint64_t;\n\n// 7.18.1.2 Minimum-width integer types\ntypedef int8_t    int_least8_t;\ntypedef int16_t   int_least16_t;\ntypedef int32_t   int_least32_t;\ntypedef int64_t   int_least64_t;\ntypedef uint8_t   uint_least8_t;\ntypedef uint16_t  uint_least16_t;\ntypedef uint32_t  uint_least32_t;\ntypedef uint64_t  uint_least64_t;\n\n// 7.18.1.3 Fastest minimum-width integer types\ntypedef int8_t    int_fast8_t;\ntypedef int16_t   int_fast16_t;\ntypedef int32_t   int_fast32_t;\ntypedef int64_t   int_fast64_t;\ntypedef uint8_t   uint_fast8_t;\ntypedef uint16_t  uint_fast16_t;\ntypedef uint32_t  uint_fast32_t;\ntypedef uint64_t  uint_fast64_t;\n\n// 7.18.1.4 Integer types capable of holding object pointers\n#ifdef _WIN64 // [\n   typedef __int64           intptr_t;\n   typedef unsigned __int64  uintptr_t;\n#else // _WIN64 ][\n   typedef int               intptr_t;\n   typedef unsigned int      uintptr_t;\n#endif // _WIN64 ]\n\n// 7.18.1.5 Greatest-width integer types\ntypedef int64_t   intmax_t;\ntypedef uint64_t  uintmax_t;\n\n\n// 7.18.2 Limits of specified-width integer types\n\n#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259\n\n// 7.18.2.1 Limits of exact-width integer types\n#define INT8_MIN     ((int8_t)_I8_MIN)\n#define INT8_MAX     _I8_MAX\n#define INT16_MIN    ((int16_t)_I16_MIN)\n#define INT16_MAX    _I16_MAX\n#define INT32_MIN    ((int32_t)_I32_MIN)\n#define INT32_MAX    _I32_MAX\n#define INT64_MIN    ((int64_t)_I64_MIN)\n#define INT64_MAX    _I64_MAX\n#define UINT8_MAX    _UI8_MAX\n#define UINT16_MAX   _UI16_MAX\n#define UINT32_MAX   _UI32_MAX\n#define UINT64_MAX   _UI64_MAX\n\n// 7.18.2.2 Limits of minimum-width integer types\n#define INT_LEAST8_MIN    INT8_MIN\n#define INT_LEAST8_MAX    INT8_MAX\n#define INT_LEAST16_MIN   INT16_MIN\n#define INT_LEAST16_MAX   INT16_MAX\n#define INT_LEAST32_MIN   INT32_MIN\n#define INT_LEAST32_MAX   INT32_MAX\n#define INT_LEAST64_MIN   INT64_MIN\n#define INT_LEAST64_MAX   INT64_MAX\n#define UINT_LEAST8_MAX   UINT8_MAX\n#define UINT_LEAST16_MAX  UINT16_MAX\n#define UINT_LEAST32_MAX  UINT32_MAX\n#define UINT_LEAST64_MAX  UINT64_MAX\n\n// 7.18.2.3 Limits of fastest minimum-width integer types\n#define INT_FAST8_MIN    INT8_MIN\n#define INT_FAST8_MAX    INT8_MAX\n#define INT_FAST16_MIN   INT16_MIN\n#define INT_FAST16_MAX   INT16_MAX\n#define INT_FAST32_MIN   INT32_MIN\n#define INT_FAST32_MAX   INT32_MAX\n#define INT_FAST64_MIN   INT64_MIN\n#define INT_FAST64_MAX   INT64_MAX\n#define UINT_FAST8_MAX   UINT8_MAX\n#define UINT_FAST16_MAX  UINT16_MAX\n#define UINT_FAST32_MAX  UINT32_MAX\n#define UINT_FAST64_MAX  UINT64_MAX\n\n// 7.18.2.4 Limits of integer types capable of holding object pointers\n#ifdef _WIN64 // [\n#  define INTPTR_MIN   INT64_MIN\n#  define INTPTR_MAX   INT64_MAX\n#  define UINTPTR_MAX  UINT64_MAX\n#else // _WIN64 ][\n#  define INTPTR_MIN   INT32_MIN\n#  define INTPTR_MAX   INT32_MAX\n#  define UINTPTR_MAX  UINT32_MAX\n#endif // _WIN64 ]\n\n// 7.18.2.5 Limits of greatest-width integer types\n#define INTMAX_MIN   INT64_MIN\n#define INTMAX_MAX   INT64_MAX\n#define UINTMAX_MAX  UINT64_MAX\n\n// 7.18.3 Limits of other integer types\n\n#ifdef _WIN64 // [\n#  define PTRDIFF_MIN  _I64_MIN\n#  define PTRDIFF_MAX  _I64_MAX\n#else  // _WIN64 ][\n#  define PTRDIFF_MIN  _I32_MIN\n#  define PTRDIFF_MAX  _I32_MAX\n#endif  // _WIN64 ]\n\n#define SIG_ATOMIC_MIN  INT_MIN\n#define SIG_ATOMIC_MAX  INT_MAX\n\n#ifndef SIZE_MAX // [\n#  ifdef _WIN64 // [\n#     define SIZE_MAX  _UI64_MAX\n#  else // _WIN64 ][\n#     define SIZE_MAX  _UI32_MAX\n#  endif // _WIN64 ]\n#endif // SIZE_MAX ]\n\n// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>\n#ifndef WCHAR_MIN // [\n#  define WCHAR_MIN  0\n#endif  // WCHAR_MIN ]\n#ifndef WCHAR_MAX // [\n#  define WCHAR_MAX  _UI16_MAX\n#endif  // WCHAR_MAX ]\n\n#define WINT_MIN  0\n#define WINT_MAX  _UI16_MAX\n\n#endif // __STDC_LIMIT_MACROS ]\n\n\n// 7.18.4 Limits of other integer types\n\n#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\n\n// 7.18.4.1 Macros for minimum-width integer constants\n\n#define INT8_C(val)  val##i8\n#define INT16_C(val) val##i16\n#define INT32_C(val) val##i32\n#define INT64_C(val) val##i64\n\n#define UINT8_C(val)  val##ui8\n#define UINT16_C(val) val##ui16\n#define UINT32_C(val) val##ui32\n#define UINT64_C(val) val##ui64\n\n// 7.18.4.2 Macros for greatest-width integer constants\n#define INTMAX_C   INT64_C\n#define UINTMAX_C  UINT64_C\n\n#endif // __STDC_CONSTANT_MACROS ]\n\n\n#endif // _MSC_STDINT_H_ ]\n"
  },
  {
    "path": "JBig2/include/unistd.h",
    "content": "/** This file is part of the Mingw32 package.\n *  unistd.h maps     (roughly) to io.h\n */\n\n#ifndef _UNISTD_H\n#define _UNISTD_H\n\n#include <io.h>\n#include <process.h>\n\n#endif /* _UNISTD_H */"
  },
  {
    "path": "JBig2/jbig2.def",
    "content": "LIBRARY JBig2Dec\nEXPORTS\n\n; jBig2Enc\n\n;\tjbig2_init\n;\tjbig2_destroy\n;\tjbig2_add_page\n;\tjbig2_pages_complete\n;\tjbig2_produce_page\n\tjbig2_encode\n\tjbig2_encode_generic\n\tjbig2_freemem\n\n; jBig2Dec\n\n\tjbig2_ctx_new_imp\n\tjbig2_data_in\n\tjbig2_make_global_ctx\n\tjbig2_complete_page\n\tjbig2_global_ctx_free\n\tjbig2_release_page\n\tjbig2_ctx_free\n\tjbig2_page_out\n"
  },
  {
    "path": "JBig2/jbig2.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"src\\jbig2.c\" />\r\n    <ClCompile Include=\"src\\jbig2arith.cc\" />\r\n    <ClCompile Include=\"src\\jbig2enc.lossless.cc\" />\r\n    <ClCompile Include=\"src\\jbig2_arith.c\" />\r\n    <ClCompile Include=\"src\\jbig2_arith_iaid.c\" />\r\n    <ClCompile Include=\"src\\jbig2_arith_int.c\" />\r\n    <ClCompile Include=\"src\\jbig2_generic.c\" />\r\n    <ClCompile Include=\"src\\jbig2_halftone.c\" />\r\n    <ClCompile Include=\"src\\jbig2_huffman.c\" />\r\n    <ClCompile Include=\"src\\jbig2_hufftab.c\" />\r\n    <ClCompile Include=\"src\\jbig2_image.c\" />\r\n    <ClCompile Include=\"src\\jbig2_mmr.c\" />\r\n    <ClCompile Include=\"src\\jbig2_page.c\" />\r\n    <ClCompile Include=\"src\\jbig2_refinement.c\" />\r\n    <ClCompile Include=\"src\\jbig2_segment.c\" />\r\n    <ClCompile Include=\"src\\jbig2_symbol_dict.c\" />\r\n    <ClCompile Include=\"src\\jbig2_text.c\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"include\\config_win32.h\" />\r\n    <ClInclude Include=\"include\\jbig2.h\" />\r\n    <ClInclude Include=\"include\\jbig2arith.h\" />\r\n    <ClInclude Include=\"include\\jbig2enc.lossless.h\" />\r\n    <ClInclude Include=\"include\\jbig2segments.h\" />\r\n    <ClInclude Include=\"include\\jbig2structs.h\" />\r\n    <ClInclude Include=\"include\\jbig2_arith.h\" />\r\n    <ClInclude Include=\"include\\jbig2_arith_iaid.h\" />\r\n    <ClInclude Include=\"include\\jbig2_arith_int.h\" />\r\n    <ClInclude Include=\"include\\jbig2_generic.h\" />\r\n    <ClInclude Include=\"include\\jbig2_halftone.h\" />\r\n    <ClInclude Include=\"include\\jbig2_huffman.h\" />\r\n    <ClInclude Include=\"include\\jbig2_hufftab.h\" />\r\n    <ClInclude Include=\"include\\jbig2_image.h\" />\r\n    <ClInclude Include=\"include\\jbig2_mmr.h\" />\r\n    <ClInclude Include=\"include\\jbig2_page.h\" />\r\n    <ClInclude Include=\"include\\jbig2_priv.h\" />\r\n    <ClInclude Include=\"include\\jbig2_refinement.h\" />\r\n    <ClInclude Include=\"include\\jbig2_segment.h\" />\r\n    <ClInclude Include=\"include\\jbig2_symbol_dict.h\" />\r\n    <ClInclude Include=\"include\\jbig2_text.h\" />\r\n    <ClInclude Include=\"include\\memento.h\" />\r\n    <ClInclude Include=\"include\\os_types.h\" />\r\n    <ClInclude Include=\"include\\pix.h\" />\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <VCProjectVersion>16.0</VCProjectVersion>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <ProjectGuid>{a8c76a16-25e3-45b6-b974-4f4cb88e5ae2}</ProjectGuid>\r\n    <RootNamespace>jbig2</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup>\r\n    <PlatformToolset Condition=\"'$(VCTargetsPath16)' != ''\">v142</PlatformToolset>\r\n    <PlatformToolset Condition=\"'$(VCTargetsPath17)' != ''\">v143</PlatformToolset>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"Shared\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <IncludePath>$(ProjectDir)include;$(IncludePath)</IncludePath>\r\n    <OutDir>$(SolutionDir)bin\\$(Configuration)\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <IncludePath>$(ProjectDir)include;$(IncludePath)</IncludePath>\r\n    <OutDir>$(SolutionDir)bin\\$(Configuration)\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)bin\\$(Platform)\\$(Configuration)\\</OutDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)bin\\$(Platform)\\$(Configuration)\\</OutDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>WIN32;__STDC_LIMIT_MACROS;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <AdditionalOptions>-w44146 -w44244 %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <ModuleDefinitionFile>jbig2.def</ModuleDefinitionFile>\r\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>WIN32;__STDC_LIMIT_MACROS;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <AdditionalOptions>-w44146 -w44244 %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <ModuleDefinitionFile>jbig2.def</ModuleDefinitionFile>\r\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "JBig2/jbig2.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Resource Files\">\r\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Encoder Header Files\">\r\n      <UniqueIdentifier>{a673f5df-1884-4ec9-bd85-f0a85eb846e0}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"Decoder Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"src\\jbig2_arith_iaid.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_arith_int.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_generic.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_halftone.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_huffman.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_hufftab.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_image.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_mmr.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_page.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_refinement.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_segment.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_symbol_dict.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_text.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2_arith.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2arith.cc\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"src\\jbig2enc.lossless.cc\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"include\\config_win32.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_arith.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_arith_iaid.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_arith_int.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_generic.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_halftone.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_huffman.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_hufftab.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_image.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_mmr.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_page.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_priv.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_refinement.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_segment.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_symbol_dict.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2_text.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\memento.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\os_types.h\">\r\n      <Filter>Decoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\pix.h\">\r\n      <Filter>Encoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2arith.h\">\r\n      <Filter>Encoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2enc.lossless.h\">\r\n      <Filter>Encoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2segments.h\">\r\n      <Filter>Encoder Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"include\\jbig2structs.h\">\r\n      <Filter>Encoder Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "JBig2/src/jbig2.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <limits.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_segment.h\"\n\nstatic void *\njbig2_default_alloc(Jbig2Allocator *allocator, size_t size)\n{\n    return malloc(size);\n}\n\nstatic void\njbig2_default_free(Jbig2Allocator *allocator, void *p)\n{\n    free(p);\n}\n\nstatic void *\njbig2_default_realloc(Jbig2Allocator *allocator, void *p, size_t size)\n{\n    return realloc(p, size);\n}\n\nstatic Jbig2Allocator jbig2_default_allocator = {\n    jbig2_default_alloc,\n    jbig2_default_free,\n    jbig2_default_realloc\n};\n\nvoid *\njbig2_alloc(Jbig2Allocator *allocator, size_t size, size_t num)\n{\n    /* Check for integer multiplication overflow when computing\n    the full size of the allocation. */\n    if (num > 0 && size > SIZE_MAX / num)\n        return NULL;\n    return allocator->alloc(allocator, size * num);\n}\n\n/* jbig2_free and jbig2_realloc moved to the bottom of this file */\n\nstatic void\njbig2_default_error(void *data, const char *msg, Jbig2Severity severity, uint32_t seg_idx)\n{\n    /* report only fatal errors by default */\n    if (severity == JBIG2_SEVERITY_FATAL) {\n        fprintf(stderr, \"jbig2 decoder FATAL ERROR: %s\", msg);\n        if (seg_idx != JBIG2_UNKNOWN_SEGMENT_NUMBER)\n            fprintf(stderr, \" (segment 0x%02x)\", seg_idx);\n        fprintf(stderr, \"\\n\");\n        fflush(stderr);\n    }\n}\n\nint\njbig2_error(Jbig2Ctx *ctx, Jbig2Severity severity, uint32_t segment_number, const char *fmt, ...)\n{\n    char buf[1024];\n    va_list ap;\n    int n;\n\n    va_start(ap, fmt);\n    n = vsnprintf(buf, sizeof(buf), fmt, ap);\n    va_end(ap);\n    if (n < 0 || n == sizeof(buf))\n        strncpy(buf, \"failed to generate error string\", sizeof(buf));\n    ctx->error_callback(ctx->error_callback_data, buf, severity, segment_number);\n    return -1;\n}\n\nJbig2Ctx *\njbig2_ctx_new_imp(Jbig2Allocator *allocator, Jbig2Options options, Jbig2GlobalCtx *global_ctx, Jbig2ErrorCallback error_callback, void *error_callback_data, int jbig2_version_major, int jbig2_version_minor)\n{\n    Jbig2Ctx *result;\n\n    if (jbig2_version_major != JBIG2_VERSION_MAJOR || jbig2_version_minor != JBIG2_VERSION_MINOR) {\n        Jbig2Ctx fakectx;\n        fakectx.error_callback = error_callback;\n        fakectx.error_callback_data = error_callback_data;\n        jbig2_error(&fakectx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"incompatible jbig2dec header (%d.%d) and library (%d.%d) versions\",\n            jbig2_version_major, jbig2_version_minor, JBIG2_VERSION_MAJOR, JBIG2_VERSION_MINOR);\n        return NULL;\n    }\n\n    if (allocator == NULL)\n        allocator = &jbig2_default_allocator;\n    if (error_callback == NULL)\n        error_callback = &jbig2_default_error;\n\n    result = (Jbig2Ctx *) jbig2_alloc(allocator, sizeof(Jbig2Ctx), 1);\n    if (result == NULL) {\n        error_callback(error_callback_data, \"failed to allocate initial context\", JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER);\n        return NULL;\n    }\n\n    result->allocator = allocator;\n    result->options = options;\n    result->global_ctx = (const Jbig2Ctx *)global_ctx;\n    result->error_callback = error_callback;\n    result->error_callback_data = error_callback_data;\n\n    result->state = (options & JBIG2_OPTIONS_EMBEDDED) ? JBIG2_FILE_SEQUENTIAL_HEADER : JBIG2_FILE_HEADER;\n\n    result->buf = NULL;\n\n    result->n_segments = 0;\n    result->n_segments_max = 16;\n    result->segments = jbig2_new(result, Jbig2Segment *, result->n_segments_max);\n    if (result->segments == NULL) {\n        error_callback(error_callback_data, \"failed to allocate initial segments\", JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER);\n        jbig2_free(allocator, result);\n        return NULL;\n    }\n    result->segment_index = 0;\n\n    result->current_page = 0;\n    result->max_page_index = 4;\n    result->pages = jbig2_new(result, Jbig2Page, result->max_page_index);\n    if (result->pages == NULL) {\n        error_callback(error_callback_data, \"failed to allocated initial pages\", JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER);\n        jbig2_free(allocator, result->segments);\n        jbig2_free(allocator, result);\n        return NULL;\n    }\n    {\n        uint32_t index;\n\n        for (index = 0; index < result->max_page_index; index++) {\n            result->pages[index].state = JBIG2_PAGE_FREE;\n            result->pages[index].number = 0;\n            result->pages[index].width = 0;\n            result->pages[index].height = 0xffffffff;\n            result->pages[index].x_resolution = 0;\n            result->pages[index].y_resolution = 0;\n            result->pages[index].stripe_size = 0;\n            result->pages[index].striped = 0;\n            result->pages[index].end_row = 0;\n            result->pages[index].flags = 0;\n            result->pages[index].image = NULL;\n        }\n    }\n\n    return result;\n}\n\n#define get_uint16(bptr)\\\n    (((bptr)[0] << 8) | (bptr)[1])\n#define get_int16(bptr)\\\n    (((int)get_uint16(bptr) ^ 0x8000) - 0x8000)\n\n/* coverity[ -tainted_data_return ] */\n/* coverity[ -tainted_data_argument : arg-0 ] */\nint16_t\njbig2_get_int16(const byte *bptr)\n{\n    return get_int16(bptr);\n}\n\n/* coverity[ -tainted_data_return ] */\n/* coverity[ -tainted_data_argument : arg-0 ] */\nuint16_t\njbig2_get_uint16(const byte *bptr)\n{\n    return get_uint16(bptr);\n}\n\n/* coverity[ -tainted_data_return ] */\n/* coverity[ -tainted_data_argument : arg-0 ] */\nint32_t\njbig2_get_int32(const byte *bptr)\n{\n    return ((int32_t) get_int16(bptr) << 16) | get_uint16(bptr + 2);\n}\n\n/* coverity[ -tainted_data_return ] */\n/* coverity[ -tainted_data_argument : arg-0 ] */\nuint32_t\njbig2_get_uint32(const byte *bptr)\n{\n    return ((uint32_t) get_uint16(bptr) << 16) | get_uint16(bptr + 2);\n}\n\nstatic size_t\njbig2_find_buffer_size(size_t desired)\n{\n    const size_t initial_buf_size = 1024;\n    size_t size = initial_buf_size;\n\n    if (desired == SIZE_MAX)\n        return SIZE_MAX;\n\n    while (size < desired)\n        size <<= 1;\n\n    return size;\n}\n\n\n/**\n * jbig2_data_in: submit data for decoding\n * @ctx: The jbig2dec decoder context\n * @data: a pointer to the data buffer\n * @size: the size of the data buffer in bytes\n *\n * Copies the specified data into internal storage and attempts\n * to (continue to) parse it as part of a jbig2 data stream.\n *\n * Return code: 0 on success\n *             -1 if there is a parsing error\n **/\nint\njbig2_data_in(Jbig2Ctx *ctx, const unsigned char *data, size_t size)\n{\n    if (ctx->buf == NULL) {\n        size_t buf_size = jbig2_find_buffer_size(size);\n        ctx->buf = jbig2_new(ctx, byte, buf_size);\n        if (ctx->buf == NULL) {\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate buffer when reading data\");\n        }\n        ctx->buf_size = buf_size;\n        ctx->buf_rd_ix = 0;\n        ctx->buf_wr_ix = 0;\n    } else if (size > ctx->buf_size - ctx->buf_wr_ix) {\n        size_t already = ctx->buf_wr_ix - ctx->buf_rd_ix;\n\n        if (ctx->buf_rd_ix <= (ctx->buf_size >> 1) && size <= ctx->buf_size - already) {\n            memmove(ctx->buf, ctx->buf + ctx->buf_rd_ix, already);\n        } else {\n            byte *buf;\n            size_t buf_size;\n\n            if (already > SIZE_MAX - size) {\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"read data causes buffer to grow too large\");\n            }\n\n            buf_size = jbig2_find_buffer_size(size + already);\n\n            buf = jbig2_new(ctx, byte, buf_size);\n            if (buf == NULL) {\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate bigger buffer when reading data\");\n            }\n            memcpy(buf, ctx->buf + ctx->buf_rd_ix, already);\n            jbig2_free(ctx->allocator, ctx->buf);\n            ctx->buf = buf;\n            ctx->buf_size = buf_size;\n        }\n        ctx->buf_wr_ix -= ctx->buf_rd_ix;\n        ctx->buf_rd_ix = 0;\n    }\n\n    memcpy(ctx->buf + ctx->buf_wr_ix, data, size);\n    ctx->buf_wr_ix += size;\n\n    /* data has now been added to buffer */\n\n    for (;;) {\n        const byte jbig2_id_string[8] = { 0x97, 0x4a, 0x42, 0x32, 0x0d, 0x0a, 0x1a, 0x0a };\n        Jbig2Segment *segment;\n        size_t header_size;\n        int code;\n\n        switch (ctx->state) {\n        case JBIG2_FILE_HEADER:\n            /* D.4.1 */\n            if (ctx->buf_wr_ix - ctx->buf_rd_ix < 9)\n                return 0;\n            if (memcmp(ctx->buf + ctx->buf_rd_ix, jbig2_id_string, 8))\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"not a JBIG2 file header\");\n            /* D.4.2 */\n            ctx->file_header_flags = ctx->buf[ctx->buf_rd_ix + 8];\n            /* Check for T.88 amendment 2 */\n            if (ctx->file_header_flags & 0x04)\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"file header indicates use of 12 adaptive template pixels (NYI)\");\n            /* Check for T.88 amendment 3 */\n            if (ctx->file_header_flags & 0x08)\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"file header indicates use of colored region segments (NYI)\");\n            if (ctx->file_header_flags & 0xFC) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"reserved bits (2-7) of file header flags are not zero (0x%02x)\", ctx->file_header_flags);\n            }\n            /* D.4.3 */\n            if (!(ctx->file_header_flags & 2)) {        /* number of pages is known */\n                if (ctx->buf_wr_ix - ctx->buf_rd_ix < 13)\n                    return 0;\n                ctx->n_pages = jbig2_get_uint32(ctx->buf + ctx->buf_rd_ix + 9);\n                ctx->buf_rd_ix += 13;\n                if (ctx->n_pages == 1)\n                    jbig2_error(ctx, JBIG2_SEVERITY_INFO, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"file header indicates a single page document\");\n                else\n                    jbig2_error(ctx, JBIG2_SEVERITY_INFO, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"file header indicates a %d page document\", ctx->n_pages);\n            } else {            /* number of pages not known */\n                ctx->n_pages = 0;\n                ctx->buf_rd_ix += 9;\n            }\n            /* determine the file organization based on the flags - D.4.2 again */\n            if (ctx->file_header_flags & 1) {\n                ctx->state = JBIG2_FILE_SEQUENTIAL_HEADER;\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"file header indicates sequential organization\");\n            } else {\n                ctx->state = JBIG2_FILE_RANDOM_HEADERS;\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"file header indicates random-access organization\");\n            }\n            break;\n        case JBIG2_FILE_SEQUENTIAL_HEADER:\n        case JBIG2_FILE_RANDOM_HEADERS:\n            segment = jbig2_parse_segment_header(ctx, ctx->buf + ctx->buf_rd_ix, ctx->buf_wr_ix - ctx->buf_rd_ix, &header_size);\n            if (segment == NULL)\n                return 0; /* need more data */\n            ctx->buf_rd_ix += header_size;\n\n            if (ctx->n_segments >= ctx->n_segments_max) {\n                Jbig2Segment **segments;\n\n                if (ctx->n_segments_max == UINT32_MAX) {\n                    ctx->state = JBIG2_FILE_EOF;\n                    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"too many segments in jbig2 image\");\n                }\n                else if (ctx->n_segments_max > (UINT32_MAX >> 2)) {\n                    ctx->n_segments_max = UINT32_MAX;\n                }\n\n                segments = jbig2_renew(ctx, ctx->segments, Jbig2Segment *, (ctx->n_segments_max <<= 2));\n                if (segments == NULL) {\n                    ctx->state = JBIG2_FILE_EOF;\n                    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate space for more segments\");\n                }\n                ctx->segments = segments;\n            }\n\n            ctx->segments[ctx->n_segments++] = segment;\n            if (ctx->state == JBIG2_FILE_RANDOM_HEADERS) {\n                if ((segment->flags & 63) == 51)        /* end of file */\n                    ctx->state = JBIG2_FILE_RANDOM_BODIES;\n            } else              /* JBIG2_FILE_SEQUENTIAL_HEADER */\n                ctx->state = JBIG2_FILE_SEQUENTIAL_BODY;\n            break;\n        case JBIG2_FILE_SEQUENTIAL_BODY:\n        case JBIG2_FILE_RANDOM_BODIES:\n            segment = ctx->segments[ctx->segment_index];\n\n            /* immediate generic regions may have unknown size */\n            if (segment->data_length == 0xffffffff && (segment->flags & 63) == 38) {\n                byte *s, *e, *p;\n                int mmr;\n                byte mmr_marker[2] = { 0x00, 0x00 };\n                byte arith_marker[2] = { 0xff, 0xac };\n                byte *desired_marker;\n\n                s = p = ctx->buf + ctx->buf_rd_ix;\n                e = ctx->buf + ctx->buf_wr_ix;\n\n                if (e - p < 18)\n                        return 0; /* need more data */\n\n                mmr = p[17] & 1;\n                p += 18;\n                desired_marker = mmr ? mmr_marker : arith_marker;\n\n                /* look for two byte marker */\n                if (e - p < 2)\n                    return 0; /* need more data */\n\n                while (p[0] != desired_marker[0] || p[1] != desired_marker[1]) {\n                    p++;\n                    if (e - p < 2)\n                        return 0; /* need more data */\n                }\n                p += 2;\n\n                /* the marker is followed by a four byte row count */\n                if (e - p < 4)\n                        return 0; /* need more data */\n                segment->rows = jbig2_get_uint32(p);\n                p += 4;\n\n                segment->data_length = (size_t) (p - s);\n                jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"unknown length determined to be %lu\", (long) segment->data_length);\n            }\n            else if (segment->data_length > ctx->buf_wr_ix - ctx->buf_rd_ix)\n                    return 0; /* need more data */\n\n            code = jbig2_parse_segment(ctx, segment, ctx->buf + ctx->buf_rd_ix);\n            ctx->buf_rd_ix += segment->data_length;\n            ctx->segment_index++;\n            if (ctx->state == JBIG2_FILE_RANDOM_BODIES) {\n                if (ctx->segment_index == ctx->n_segments)\n                    ctx->state = JBIG2_FILE_EOF;\n            } else {            /* JBIG2_FILE_SEQUENTIAL_BODY */\n                ctx->state = JBIG2_FILE_SEQUENTIAL_HEADER;\n            }\n            if (code < 0) {\n                ctx->state = JBIG2_FILE_EOF;\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode; treating as end of file\");\n            }\n            break;\n        case JBIG2_FILE_EOF:\n            if (ctx->buf_rd_ix == ctx->buf_wr_ix)\n                return 0;\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"garbage beyond end of file\");\n        }\n    }\n}\n\nJbig2Allocator *\njbig2_ctx_free(Jbig2Ctx *ctx)\n{\n    Jbig2Allocator *ca;\n    uint32_t i;\n\n    if (ctx == NULL)\n        return NULL;\n\n    ca = ctx->allocator;\n    jbig2_free(ca, ctx->buf);\n    if (ctx->segments != NULL) {\n        for (i = 0; i < ctx->n_segments; i++)\n            jbig2_free_segment(ctx, ctx->segments[i]);\n        jbig2_free(ca, ctx->segments);\n    }\n\n    if (ctx->pages != NULL) {\n        for (i = 0; i <= ctx->current_page; i++)\n            if (ctx->pages[i].image != NULL)\n                jbig2_image_release(ctx, ctx->pages[i].image);\n        jbig2_free(ca, ctx->pages);\n    }\n\n    jbig2_free(ca, ctx);\n\n    return ca;\n}\n\nJbig2GlobalCtx *\njbig2_make_global_ctx(Jbig2Ctx *ctx)\n{\n    return (Jbig2GlobalCtx *) ctx;\n}\n\nJbig2Allocator *\njbig2_global_ctx_free(Jbig2GlobalCtx *global_ctx)\n{\n    return jbig2_ctx_free((Jbig2Ctx *) global_ctx);\n}\n\n/* I'm not committed to keeping the word stream interface. It's handy\n   when you think you may be streaming your input, but if you're not\n   (as is currently the case), it just adds complexity.\n*/\n\ntypedef struct {\n    Jbig2WordStream super;\n    const byte *data;\n    size_t size;\n} Jbig2WordStreamBuf;\n\nstatic int\njbig2_word_stream_buf_get_next_word(Jbig2Ctx *ctx, Jbig2WordStream *self, size_t offset, uint32_t *word)\n{\n    Jbig2WordStreamBuf *z = (Jbig2WordStreamBuf *) self;\n    uint32_t val = 0;\n    int ret = 0;\n\n    if (self == NULL || word == NULL) {\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read next word of stream because stream or output missing\");\n    }\n    if (offset >= z->size) {\n        *word = 0;\n        return 0;\n    }\n\n    if (offset < z->size) {\n        val = (uint32_t) z->data[offset] << 24;\n        ret++;\n    }\n    if (offset + 1 < z->size) {\n        val |= (uint32_t) z->data[offset + 1] << 16;\n        ret++;\n    }\n    if (offset + 2 < z->size) {\n        val |= (uint32_t) z->data[offset + 2] << 8;\n        ret++;\n    }\n    if (offset + 3 < z->size) {\n        val |= z->data[offset + 3];\n        ret++;\n    }\n    *word = val;\n    return ret;\n}\n\nJbig2WordStream *\njbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size)\n{\n    Jbig2WordStreamBuf *result = jbig2_new(ctx, Jbig2WordStreamBuf, 1);\n\n    if (result == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate word stream\");\n        return NULL;\n    }\n\n    result->super.get_next_word = jbig2_word_stream_buf_get_next_word;\n    result->data = data;\n    result->size = size;\n\n    return &result->super;\n}\n\nvoid\njbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws)\n{\n    jbig2_free(ctx->allocator, ws);\n}\n\n/* When Memento is in use, the ->free and ->realloc calls get\n * turned into ->Memento_free and ->Memento_realloc, which is\n * obviously problematic. Undefine free and realloc here to\n * avoid this. */\n#ifdef MEMENTO\n#undef free\n#undef realloc\n#endif\n\nvoid\njbig2_free(Jbig2Allocator *allocator, void *p)\n{\n    allocator->free(allocator, p);\n}\n\nvoid *\njbig2_realloc(Jbig2Allocator *allocator, void *p, size_t size, size_t num)\n{\n    /* check for integer multiplication overflow */\n    if (num > 0 && size >= SIZE_MAX / num)\n        return NULL;\n    return allocator->realloc(allocator, p, size * num);\n}\n"
  },
  {
    "path": "JBig2/src/jbig2.cc",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include <vector>\n\n#include <sys/types.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <fcntl.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <allheaders.h>\n#include <pix.h>\n\n#include \"jbig2enc.h\"\n\n#if defined(WIN32)\n#define WINBINARY O_BINARY\n#else\n#define WINBINARY 0\n#endif\n\nstatic void\nusage(const char *argv0) {\n  fprintf(stderr, \"Usage: %s [options] <input filenames...>\\n\", argv0);\n  fprintf(stderr, \"Options:\\n\");\n  fprintf(stderr, \"  -b <basename>: output file root name when using symbol coding\\n\");\n  fprintf(stderr, \"  -d --duplicate-line-removal: use TPGD in generic region coder\\n\");\n  fprintf(stderr, \"  -p --pdf: produce PDF ready data\\n\");\n  fprintf(stderr, \"  -s --symbol-mode: use text region, not generic coder\\n\");\n  fprintf(stderr, \"  -t <threshold>: set classification threshold for symbol coder (def: 0.85)\\n\");\n  fprintf(stderr, \"  -T <bw threshold>: set 1 bpp threshold (def: 188)\\n\");\n  fprintf(stderr, \"  -r --refine: use refinement (requires -s: lossless)\\n\");\n  fprintf(stderr, \"  -O <outfile>: dump thresholded image as PNG\\n\");\n  fprintf(stderr, \"  -2: upsample 2x before thresholding\\n\");\n  fprintf(stderr, \"  -4: upsample 4x before thresholding\\n\");\n  fprintf(stderr, \"  -S: remove images from mixed input and save separately\\n\");\n  fprintf(stderr, \"  -j --jpeg-output: write images from mixed input as JPEG\\n\");\n  fprintf(stderr, \"  -v: be verbose\\n\");\n}\n\nstatic bool verbose = false;\n\n\nstatic void\npixInfo(PIX *pix, const char *msg) {\n  if (msg != NULL) fprintf(stderr, \"%s \", msg);\n  if (pix == NULL) {\n    fprintf(stderr, \"NULL pointer!\\n\");\n    return;\n  }\n  fprintf(stderr, \"%u x %u (%d bits) %udpi x %udpi, refcount = %u\\n\",\n          pix->w, pix->h, pix->d, pix->xres, pix->yres, pix->refcount);\n}\n\n#ifdef _MSC_VER\n// -----------------------------------------------------------------------------\n// Windows, sadly, lacks asprintf\n// -----------------------------------------------------------------------------\n#include <stdarg.h>\nint\nasprintf(char **strp, const char *fmt, ...) {\n    va_list va;\n    va_start(va, fmt);\n\n    const int required = vsnprintf(NULL, 0, fmt, va);\n    char *const buffer = (char *) malloc(required + 1);\n    const int ret = vsnprintf(buffer, required + 1, fmt, va);\n    *strp = buffer;\n\n    va_end(va);\n\n    return ret;\n}\n#endif\n\n// -----------------------------------------------------------------------------\n// Morphological operations for segmenting an image into text regions\n// -----------------------------------------------------------------------------\nstatic const char *segment_mask_sequence = \"r11\";\nstatic const char *segment_seed_sequence = \"r1143 + o4.4 + x4\"; /* maybe o6.6 */\nstatic const char *segment_dilation_sequence = \"d3.3\";\n\n// -----------------------------------------------------------------------------\n// Takes two pix as input, generated from the same original image:\n//   1. pixb   - a binary thresholded image\n//   2. piximg - a full color or grayscale image\n// and segments them by finding the areas that contain color or grayscale\n// graphics, removing those areas from the binary image, and doing the\n// opposite for the full color/grayscale image.  The upshot is that after\n// this routine has been run, the binary image contains only text and the\n// full color image contains only the graphics.\n//\n// Both input images are modified by this procedure.  If no text is found,\n// pixb is set to NULL.  If no graphics is found, piximg is set to NULL.\n//\n// Thanks to Dan Bloomberg for this\n// -----------------------------------------------------------------------------\n\nstatic PIX*\nsegment_image(PIX *pixb, PIX *piximg) {\n  // Make seed and mask, and fill seed into mask\n  PIX *pixmask4 = pixMorphSequence(pixb, (char *) segment_mask_sequence, 0);\n  PIX *pixseed4 = pixMorphSequence(pixb, (char *) segment_seed_sequence, 0);\n  PIX *pixsf4 = pixSeedfillBinary(NULL, pixseed4, pixmask4, 8);\n  PIX *pixd4 = pixMorphSequence(pixsf4, (char *) segment_dilation_sequence, 0);\n\n  // we want to force the binary mask to be the same size as the\n  // input color image, so we have to do it this way...\n  // is there a better way?\n  // PIX *pixd = pixExpandBinary(pixd4, 4);\n  PIX *pixd = pixCreate(piximg->w, piximg->h, 1);\n  pixCopyResolution(pixd, piximg);\n  if (verbose) pixInfo(pixd, \"mask image: \");\n  expandBinaryPower2Low(pixd->data, pixd->w, pixd->h, pixd->wpl,\n                        pixd4->data, pixd4->w, pixd4->h, pixd4->wpl, 4);\n\n  pixDestroy(&pixd4);\n  pixDestroy(&pixsf4);\n  pixDestroy(&pixseed4);\n  pixDestroy(&pixmask4);\n\n  pixSubtract(pixb, pixb, pixd);\n\n  // now see what we got from the segmentation\n  static l_int32 *tab = NULL;\n  if (tab == NULL) tab = makePixelSumTab8();\n\n  // if no image portion was found, set the image pointer to NULL and return\n  l_int32  pcount;\n  pixCountPixels(pixd, &pcount, tab);\n  if (verbose) fprintf(stderr, \"pixel count of graphics image: %u\\n\", pcount);\n  if (pcount < 100) {\n    pixDestroy(&pixd);\n    return NULL;\n  }\n\n  // if no text portion found, set the binary pointer to NULL\n  pixCountPixels(pixb, &pcount, tab);\n  if (verbose) fprintf(stderr, \"pixel count of binary image: %u\\n\", pcount);\n  if (pcount < 100) {\n    pixDestroy(&pixb);\n  }\n\n  PIX *piximg1;\n  if (piximg->d == 1 || piximg->d == 8 || piximg->d == 32) {\n    piximg1 = pixClone(piximg);\n  } else if (piximg->d > 8) {\n    piximg1 = pixConvertTo32(piximg);\n  } else {\n    piximg1 = pixConvertTo8(piximg, FALSE);\n  }\n\n  PIX *pixd1;\n  if (piximg1->d == 32) {\n    pixd1 = pixConvertTo32(pixd);\n  } else if (piximg1->d == 8) {\n    pixd1 = pixConvertTo8(pixd, FALSE);\n  } else {\n    pixd1 = pixClone(pixd);\n  }\n  pixDestroy(&pixd);\n\n  if (verbose) {\n    pixInfo(pixd1, \"binary mask image:\");\n    pixInfo(piximg1, \"graphics image:\");\n  }\n  pixRasteropFullImage(pixd1, piximg1, PIX_SRC | PIX_DST);\n\n  pixDestroy(&piximg1);\n  if (verbose) {\n    pixInfo(pixb, \"segmented binary text image:\");\n    pixInfo(pixd1, \"segmented graphics image:\");\n  }\n\n  return pixd1;\n}\n\nint\nmain(int argc, char **argv) {\n  bool duplicate_line_removal = false;\n  bool pdfmode = false;\n  float threshold = 0.85;\n  int bw_threshold = 188;\n  bool symbol_mode = false;\n  bool refine = false;\n  bool up2 = false, up4 = false;\n  const char *output_threshold = NULL;\n  const char *basename = \"output\";\n  l_int32 img_fmt = IFF_PNG;\n  const char *img_ext = \"png\";\n  bool segment = false;\n  int i;\n\n  for (i = 1; i < argc; ++i) {\n    if (strcmp(argv[i], \"-h\") == 0 ||\n        strcmp(argv[i], \"--help\") == 0) {\n      usage(argv[0]);\n      return 0;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-b\") == 0 ||\n        strcmp(argv[i], \"--basename\") == 0) {\n      basename = argv[i+1];\n      i++;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-d\") == 0 ||\n        strcmp(argv[i], \"--duplicate-line-removal\") == 0) {\n      duplicate_line_removal = true;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-p\") == 0 ||\n        strcmp(argv[i], \"--pdf\") == 0) {\n      pdfmode = true;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-s\") == 0 ||\n        strcmp(argv[i], \"--symbol-mode\") == 0) {\n      symbol_mode = true;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-r\") == 0 ||\n        strcmp(argv[i], \"--refine\") == 0) {\n      fprintf(stderr, \"Refinement broke in recent releases since it's \"\n                      \"rarely used. If you need it you should bug \"\n                      \"agl@imperialviolet.org to fix it\\n\");\n      return 1;\n      refine = true;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-2\") == 0) {\n      up2 = true;\n      continue;\n    }\n    if (strcmp(argv[i], \"-4\") == 0) {\n      up4 = true;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-O\") == 0) {\n      output_threshold = argv[i+1];\n      i++;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-S\") == 0) {\n      segment = true;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-j\") == 0 ||\n        strcmp(argv[i], \"--jpeg-output\") == 0) {\n      img_ext = \"jpg\";\n      img_fmt = IFF_JFIF_JPEG;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-t\") == 0) {\n      char *endptr;\n      threshold = strtod(argv[i+1], &endptr);\n      if (*endptr) {\n        fprintf(stderr, \"Cannot parse float value: %s\\n\", argv[i+1]);\n        usage(argv[0]);\n        return 1;\n      }\n\n      if (threshold > 0.9 || threshold < 0.4) {\n        fprintf(stderr, \"Invalid value for threshold\\n\");\n        fprintf(stderr, \"(must be between 0.4 and 0.9)\\n\");\n        return 10;\n      }\n      i++;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-T\") == 0) {\n      char *endptr;\n      bw_threshold = strtol(argv[i+1], &endptr, 10);\n      if (*endptr) {\n        fprintf(stderr, \"Cannot parse int value: %s\\n\", argv[i+1]);\n        usage(argv[0]);\n        return 1;\n      }\n      if (bw_threshold < 0 || bw_threshold > 255) {\n        fprintf(stderr, \"Invalid bw threshold: (0..255)\\n\");\n        return 11;\n      }\n      i++;\n      continue;\n    }\n\n    if (strcmp(argv[i], \"-v\") == 0) {\n      verbose = true;\n      continue;\n    }\n\n    break;\n  }\n\n  if (i == argc) {\n    fprintf(stderr, \"No filename given\\n\\n\");\n    usage(argv[0]);\n    return 4;\n  }\n\n  if (refine && !symbol_mode) {\n    fprintf(stderr, \"Refinement makes not sense unless in symbol mode!\\n\");\n    fprintf(stderr, \"(if you have -r, you must have -s)\\n\");\n    return 5;\n  }\n\n  if (up2 && up4) {\n    fprintf(stderr, \"Can't have both -2 and -4!\\n\");\n    return 6;\n  }\n\n  struct jbig2ctx *ctx = jbig2_init(threshold, 0.5, 0, 0, !pdfmode, refine ? 10 : -1);\n  int pageno = -1;\n\n  int numsubimages=0, subimage=0, num_pages = 0;\n  while (i < argc) {\n    if (subimage==numsubimages) {\n      subimage = numsubimages = 0;\n      FILE *fp;\n      if ((fp=fopen(argv[i], \"r\"))==NULL) {\n        fprintf(stderr, \"Unable to open \\\"%s\\\"\", argv[i]);\n        return 1;\n      }\n      l_int32 filetype;\n      findFileFormatStream(fp, &filetype);\n      if (filetype==IFF_TIFF && tiffGetCount(fp, &numsubimages)) {\n        return 1;\n      }\n      fclose(fp);\n    }\n\n    PIX *source;\n    if (numsubimages<=1) {\n      source = pixRead(argv[i]);\n    } else {\n      source = pixReadTiff(argv[i], subimage++);\n    }\n\n    if (!source) return 3;\n    if (verbose)\n      pixInfo(source, \"source image:\");\n\n    PIX *pixl, *gray, *pixt;\n    if ((pixl = pixRemoveColormap(source, REMOVE_CMAP_BASED_ON_SRC)) == NULL) {\n      fprintf(stderr, \"Failed to remove colormap from %s\\n\", argv[i]);\n      return 1;\n    }\n    pixDestroy(&source);\n    pageno++;\n\n    if (pixl->d > 1) {\n      if (pixl->d > 8) {\n        gray = pixConvertRGBToGrayFast(pixl);\n        if (!gray) return 1;\n      } else {\n        gray = pixClone(pixl);\n      }\n      if (up2) {\n        pixt = pixScaleGray2xLIThresh(gray, bw_threshold);\n      } else if (up4) {\n        pixt = pixScaleGray4xLIThresh(gray, bw_threshold);\n      } else {\n        pixt = pixThresholdToBinary(gray, bw_threshold);\n      }\n      pixDestroy(&gray);\n    } else {\n      pixt = pixClone(pixl);\n    }\n    if (verbose)\n      pixInfo(pixt, \"thresholded image:\");\n\n    if (output_threshold) {\n      pixWrite(output_threshold, pixt, IFF_PNG);\n    }\n\n    if (segment && pixl->d > 1) {\n      PIX *graphics = segment_image(pixt, pixl);\n      if (graphics) {\n        if (verbose)\n          pixInfo(graphics, \"graphics image:\");\n        char *filename;\n        asprintf(&filename, \"%s.%04d.%s\", basename, pageno, img_ext);\n        pixWrite(filename, graphics, img_fmt);\n        free(filename);\n      } else if (verbose) {\n        fprintf(stderr, \"%s: no graphics found in input image\\n\", argv[i]);\n      }\n      if (! pixt) {\n        fprintf(stderr, \"%s: no text portion found in input image\\n\", argv[i]);\n        i++;\n        continue;\n      }\n    }\n\n    pixDestroy(&pixl);\n\n    if (!symbol_mode) {\n      int length;\n      uint8_t *ret;\n      ret = jbig2_encode_generic(pixt, !pdfmode, 0, 0, duplicate_line_removal,\n                                 &length);\n\t  _setmode (1, O_BINARY);\n      write(1, ret, length);\n      return 0;\n    }\n\n    jbig2_add_page(ctx, pixt);\n    pixDestroy(&pixt);\n    num_pages++;\n    if (subimage==numsubimages) {\n      i++;\n    }\n  }\n\n  uint8_t *ret;\n  int length;\n  ret = jbig2_pages_complete(ctx, &length);\n  if (pdfmode) {\n    char *filename;\n    asprintf(&filename, \"%s.sym\", basename);\n    const int fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT | WINBINARY, 0600);\n    free(filename);\n    if (fd < 0) abort();\n    write(fd, ret, length);\n    close(fd);\n  } else {\n    write(1, ret, length);\n  }\n  free(ret);\n\n  for (int i = 0; i < num_pages; ++i) {\n    ret = jbig2_produce_page(ctx, i, -1, -1, &length);\n    if (pdfmode) {\n      char *filename;\n      asprintf(&filename, \"%s.%04d\", basename, i);\n      const int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | WINBINARY, 0600);\n      free(filename);\n      if (fd < 0) abort();\n      write(fd, ret, length);\n      close(fd);\n    } else {\n      write(1, ret, length);\n    }\n    free(ret);\n  }\n\n  jbig2_destroy(ctx);\n}\n\n"
  },
  {
    "path": "JBig2/src/jbig2_arith.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n\nstruct _Jbig2ArithState {\n    uint32_t C;\n    uint32_t A;\n\n    int CT;\n\n    uint32_t next_word;\n    size_t next_word_bytes;\n    int err;\n\n    Jbig2WordStream *ws;\n    size_t offset;\n};\n\n/*\n  Previous versions of this code had a #define to allow\n  us to choose between using the revised arithmetic decoding\n  specified in the 'Software Convention' section of the spec.\n  Back to back tests showed that the 'Software Convention'\n  version was indeed slightly faster. We therefore enable it\n  by default. We also strip the option out, because a) it\n  makes the code harder to read, and b) such things are an\n  invitation to bitrot.\n*/\n\nstatic int\njbig2_arith_bytein(Jbig2Ctx *ctx, Jbig2ArithState *as)\n{\n    byte B;\n\n    /* Treat both errors and reading beyond end of stream as an error. */\n    if (as->err != 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read from underlying stream during arithmetic decoding\");\n        return -1;\n    }\n    if (as->next_word_bytes == 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read beyond end of underlying stream during arithmetic decoding\");\n        return -1;\n    }\n\n    /* At this point there is at least one byte in as->next_word. */\n\n    /* This code confused me no end when I first read it, so a quick note\n     * to save others (and future me's) from being similarly confused.\n     * 'next_word' does indeed contain 'next_word_bytes' of valid data\n     * (always starting at the most significant byte). The confusing\n     * thing is that the first byte has always already been read.\n     * i.e. it serves only as an indication that the last byte we read\n     * was FF or not.\n     *\n     * The jbig2 bytestream uses FF bytes, followed by a byte > 0x8F as\n     * marker bytes. These never occur in normal streams of arithmetic\n     * encoding, so meeting one terminates the stream (with an infinite\n     * series of 1 bits).\n     *\n     * If we meet an FF byte, we return it as normal. We just 'remember'\n     * that fact for the next byte we read.\n     */\n\n    /* Figure F.3 */\n    B = (byte)((as->next_word >> 24) & 0xFF);\n    if (B == 0xFF) {\n        byte B1;\n\n        /* next_word_bytes can only be == 1 here, but let's be defensive. */\n        if (as->next_word_bytes <= 1) {\n            int ret = as->ws->get_next_word(ctx, as->ws, as->offset, &as->next_word);\n            if (ret < 0) {\n                as->err = 1;\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to check for marker code due to failure in underlying stream during arithmetic decoding\");\n            }\n            as->next_word_bytes = (size_t) ret;\n\n            if (as->next_word_bytes == 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read end of possible terminating marker code, assuming terminating marker code\");\n                as->next_word = 0xFF900000;\n                as->next_word_bytes = 2;\n                as->C += 0xFF00;\n                as->CT = 8;\n                return 0;\n            }\n\n            as->offset += as->next_word_bytes;\n\n            B1 = (byte)((as->next_word >> 24) & 0xFF);\n            if (B1 > 0x8F) {\n#ifdef JBIG2_DEBUG_ARITH\n                fprintf(stderr, \"read %02x (aa)\\n\", B);\n#endif\n                as->CT = 8;\n                as->next_word = 0xFF000000 | (as->next_word >> 8);\n                as->next_word_bytes = 2;\n                as->offset--;\n            } else {\n#ifdef JBIG2_DEBUG_ARITH\n                fprintf(stderr, \"read %02x (a)\\n\", B);\n#endif\n                as->C += 0xFE00 - (B1 << 9);\n                as->CT = 7;\n            }\n        } else {\n            B1 = (byte)((as->next_word >> 16) & 0xFF);\n            if (B1 > 0x8F) {\n#ifdef JBIG2_DEBUG_ARITH\n                fprintf(stderr, \"read %02x (ba)\\n\", B);\n#endif\n                as->CT = 8;\n            } else {\n                as->next_word_bytes--;\n                as->next_word <<= 8;\n#ifdef JBIG2_DEBUG_ARITH\n                fprintf(stderr, \"read %02x (b)\\n\", B);\n#endif\n\n                as->C += 0xFE00 - (B1 << 9);\n                as->CT = 7;\n            }\n        }\n    } else {\n#ifdef JBIG2_DEBUG_ARITH\n        fprintf(stderr, \"read %02x\\n\", B);\n#endif\n        as->next_word <<= 8;\n        as->next_word_bytes--;\n\n        if (as->next_word_bytes == 0) {\n            int ret = as->ws->get_next_word(ctx, as->ws, as->offset, &as->next_word);\n            if (ret < 0) {\n                as->err = 1;\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read from underlying stream during arithmetic decoding\");\n            }\n            as->next_word_bytes = (size_t) ret;\n\n            if (as->next_word_bytes == 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to find terminating marker code before end of underlying stream, assuming terminating marker code\");\n                as->next_word = 0xFF900000;\n                as->next_word_bytes = 2;\n                as->C += 0xFF00;\n                as->CT = 8;\n                return 0;\n            }\n\n            as->offset += as->next_word_bytes;\n        }\n\n        B = (byte)((as->next_word >> 24) & 0xFF);\n        as->C += 0xFF00 - (B << 8);\n        as->CT = 8;\n    }\n\n    return 0;\n}\n\n/** Allocate and initialize a new arithmetic coding state\n *  the returned pointer can simply be freed; this does\n *  not affect the associated Jbig2WordStream.\n */\nJbig2ArithState *\njbig2_arith_new(Jbig2Ctx *ctx, Jbig2WordStream *ws)\n{\n    Jbig2ArithState *result;\n    int ret;\n\n    result = jbig2_new(ctx, Jbig2ArithState, 1);\n    if (result == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate arithmetic coding state\");\n        return NULL;\n    }\n\n    result->err = 0;\n    result->ws = ws;\n    result->offset = 0;\n\n    ret = result->ws->get_next_word(ctx, result->ws, result->offset, &result->next_word);\n    if (ret < 0) {\n        jbig2_free(ctx->allocator, result);\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to initialize underlying stream of arithmetic decoder\");\n        return NULL;\n    }\n\n    result->next_word_bytes = (size_t) ret;\n    if (result->next_word_bytes == 0) {\n        jbig2_free(ctx->allocator, result);\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read first byte from underlying stream when initializing arithmetic decoder\");\n        return NULL;\n    }\n\n    result->offset += result->next_word_bytes;\n\n    /* Figure F.1 */\n    result->C = (~(result->next_word >> 8)) & 0xFF0000;\n\n    /* Figure E.20 (2) */\n    if (jbig2_arith_bytein(ctx, result) < 0) {\n        jbig2_free(ctx->allocator, result);\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read second byte from underlying stream when initializing arithmetic decoder\");\n        return NULL;\n    }\n\n    /* Figure E.20 (3) */\n    result->C <<= 7;\n    result->CT -= 7;\n    result->A = 0x8000;\n\n    return result;\n}\n\n#define MAX_QE_ARRAY_SIZE 47\n\n/* could put bit fields in to minimize memory usage */\ntypedef struct {\n    uint16_t Qe;\n    byte mps_xor;               /* mps_xor = index ^ NMPS */\n    byte lps_xor;               /* lps_xor = index ^ NLPS ^ (SWITCH << 7) */\n} Jbig2ArithQe;\n\nstatic const Jbig2ArithQe jbig2_arith_Qe[MAX_QE_ARRAY_SIZE] = {\n    {0x5601, 1 ^ 0, 1 ^ 0 ^ 0x80},\n    {0x3401, 2 ^ 1, 6 ^ 1},\n    {0x1801, 3 ^ 2, 9 ^ 2},\n    {0x0AC1, 4 ^ 3, 12 ^ 3},\n    {0x0521, 5 ^ 4, 29 ^ 4},\n    {0x0221, 38 ^ 5, 33 ^ 5},\n    {0x5601, 7 ^ 6, 6 ^ 6 ^ 0x80},\n    {0x5401, 8 ^ 7, 14 ^ 7},\n    {0x4801, 9 ^ 8, 14 ^ 8},\n    {0x3801, 10 ^ 9, 14 ^ 9},\n    {0x3001, 11 ^ 10, 17 ^ 10},\n    {0x2401, 12 ^ 11, 18 ^ 11},\n    {0x1C01, 13 ^ 12, 20 ^ 12},\n    {0x1601, 29 ^ 13, 21 ^ 13},\n    {0x5601, 15 ^ 14, 14 ^ 14 ^ 0x80},\n    {0x5401, 16 ^ 15, 14 ^ 15},\n    {0x5101, 17 ^ 16, 15 ^ 16},\n    {0x4801, 18 ^ 17, 16 ^ 17},\n    {0x3801, 19 ^ 18, 17 ^ 18},\n    {0x3401, 20 ^ 19, 18 ^ 19},\n    {0x3001, 21 ^ 20, 19 ^ 20},\n    {0x2801, 22 ^ 21, 19 ^ 21},\n    {0x2401, 23 ^ 22, 20 ^ 22},\n    {0x2201, 24 ^ 23, 21 ^ 23},\n    {0x1C01, 25 ^ 24, 22 ^ 24},\n    {0x1801, 26 ^ 25, 23 ^ 25},\n    {0x1601, 27 ^ 26, 24 ^ 26},\n    {0x1401, 28 ^ 27, 25 ^ 27},\n    {0x1201, 29 ^ 28, 26 ^ 28},\n    {0x1101, 30 ^ 29, 27 ^ 29},\n    {0x0AC1, 31 ^ 30, 28 ^ 30},\n    {0x09C1, 32 ^ 31, 29 ^ 31},\n    {0x08A1, 33 ^ 32, 30 ^ 32},\n    {0x0521, 34 ^ 33, 31 ^ 33},\n    {0x0441, 35 ^ 34, 32 ^ 34},\n    {0x02A1, 36 ^ 35, 33 ^ 35},\n    {0x0221, 37 ^ 36, 34 ^ 36},\n    {0x0141, 38 ^ 37, 35 ^ 37},\n    {0x0111, 39 ^ 38, 36 ^ 38},\n    {0x0085, 40 ^ 39, 37 ^ 39},\n    {0x0049, 41 ^ 40, 38 ^ 40},\n    {0x0025, 42 ^ 41, 39 ^ 41},\n    {0x0015, 43 ^ 42, 40 ^ 42},\n    {0x0009, 44 ^ 43, 41 ^ 43},\n    {0x0005, 45 ^ 44, 42 ^ 44},\n    {0x0001, 45 ^ 45, 43 ^ 45},\n    {0x5601, 46 ^ 46, 46 ^ 46}\n};\n\nstatic int\njbig2_arith_renormd(Jbig2Ctx *ctx, Jbig2ArithState *as)\n{\n    /* Figure E.18 */\n    do {\n        if (as->CT == 0 && jbig2_arith_bytein(ctx, as) < 0) {\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read byte from compressed data stream\");\n        }\n        as->A <<= 1;\n        as->C <<= 1;\n        as->CT--;\n    } while ((as->A & 0x8000) == 0);\n\n    return 0;\n}\n\nint\njbig2_arith_decode(Jbig2Ctx *ctx, Jbig2ArithState *as, Jbig2ArithCx *pcx)\n{\n    Jbig2ArithCx cx = *pcx;\n    const Jbig2ArithQe *pqe;\n    unsigned int index = cx & 0x7f;\n    bool D;\n\n    if (index >= MAX_QE_ARRAY_SIZE) {\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to determine probability estimate because index out of range\");\n    }\n\n    pqe = &jbig2_arith_Qe[index];\n\n    /* Figure F.2 */\n    as->A -= pqe->Qe;\n    if ((as->C >> 16) < as->A) {\n        if ((as->A & 0x8000) == 0) {\n            /* MPS_EXCHANGE, Figure E.16 */\n            if (as->A < pqe->Qe) {\n                D = 1 - (cx >> 7);\n                *pcx ^= pqe->lps_xor;\n            } else {\n                D = cx >> 7;\n                *pcx ^= pqe->mps_xor;\n            }\n            if (jbig2_arith_renormd(ctx, as) < 0) {\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to renormalize decoder\");\n            }\n\n            return D;\n        } else {\n            return cx >> 7;\n        }\n    } else {\n        as->C -= (as->A) << 16;\n        /* LPS_EXCHANGE, Figure E.17 */\n        if (as->A < pqe->Qe) {\n            as->A = pqe->Qe;\n            D = cx >> 7;\n            *pcx ^= pqe->mps_xor;\n        } else {\n            as->A = pqe->Qe;\n            D = 1 - (cx >> 7);\n            *pcx ^= pqe->lps_xor;\n        }\n        if (jbig2_arith_renormd(ctx, as) < 0) {\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to renormalize decoder\");\n        }\n\n        return D;\n    }\n}\n\n#ifdef TEST\n\nstatic const byte test_stream[] = {\n    0x84, 0xC7, 0x3B, 0xFC, 0xE1, 0xA1, 0x43, 0x04, 0x02, 0x20, 0x00, 0x00,\n    0x41, 0x0D, 0xBB, 0x86, 0xF4, 0x31, 0x7F, 0xFF, 0x88, 0xFF, 0x37, 0x47,\n    0x1A, 0xDB, 0x6A, 0xDF, 0xFF, 0xAC,\n    0x00, 0x00\n};\n\n#if defined(JBIG2_DEBUG) || defined(JBIG2_DEBUG_ARITH)\nstatic void\njbig2_arith_trace(Jbig2ArithState *as, Jbig2ArithCx cx)\n{\n    fprintf(stderr, \"I = %2d, MPS = %d, A = %04x, CT = %2d, C = %08x\\n\", cx & 0x7f, cx >> 7, as->A, as->CT, as->C);\n}\n#endif\n\nstatic int\ntest_get_word(Jbig2Ctx *ctx, Jbig2WordStream *self, size_t offset, uint32_t *word)\n{\n    uint32_t val = 0;\n    int ret = 0;\n\n    if (self == NULL || word == NULL)\n        return -1;\n    if (offset >= sizeof (test_stream))\n        return 0;\n\n    if (offset < sizeof(test_stream)) {\n        val |= test_stream[offset] << 24;\n        ret++;\n    }\n    if (offset + 1 < sizeof(test_stream)) {\n        val |= test_stream[offset + 1] << 16;\n        ret++;\n    }\n    if (offset + 2 < sizeof(test_stream)) {\n        val |= test_stream[offset + 2] << 8;\n        ret++;\n    }\n    if (offset + 3 < sizeof(test_stream)) {\n        val |= test_stream[offset + 3];\n        ret++;\n    }\n    *word = val;\n    return ret;\n}\n\nint\nmain(int argc, char **argv)\n{\n    Jbig2Ctx *ctx;\n    Jbig2WordStream ws;\n    Jbig2ArithState *as;\n    int i;\n    Jbig2ArithCx cx = 0;\n\n    ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);\n\n    ws.get_next_word = test_get_word;\n    as = jbig2_arith_new(ctx, &ws);\n#ifdef JBIG2_DEBUG_ARITH\n    jbig2_arith_trace(as, cx);\n#endif\n\n    for (i = 0; i < 256; i++) {\n#ifdef JBIG2_DEBUG_ARITH\n        int D =\n#else\n        (void)\n#endif\n            jbig2_arith_decode(ctx, as, &cx);\n\n#ifdef JBIG2_DEBUG_ARITH\n        fprintf(stderr, \"%3d: D = %d, \", i, D);\n        jbig2_arith_trace(as, cx);\n#endif\n    }\n\n    jbig2_free(ctx->allocator, as);\n\n    jbig2_ctx_free(ctx);\n\n    return 0;\n}\n#endif\n"
  },
  {
    "path": "JBig2/src/jbig2_arith_iaid.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* Annex A.3 */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>\n#include <string.h>             /* memset() */\n\n#ifdef VERBOSE\n#include <stdio.h>              /* for debug printing only */\n#endif\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_arith_iaid.h\"\n\nstruct _Jbig2ArithIaidCtx {\n    uint8_t SBSYMCODELEN;\n    Jbig2ArithCx *IAIDx;\n};\n\nJbig2ArithIaidCtx *\njbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, uint8_t SBSYMCODELEN)\n{\n    Jbig2ArithIaidCtx *result;\n    size_t ctx_size;\n\n    if (sizeof(ctx_size) * 8 <= SBSYMCODELEN)\n    {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"requested IAID arithmetic coding state size too large\");\n        return NULL;\n    }\n\n    ctx_size = (size_t) 1U << SBSYMCODELEN;\n\n    result = jbig2_new(ctx, Jbig2ArithIaidCtx, 1);\n    if (result == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate IAID arithmetic coding state\");\n        return NULL;\n    }\n\n    result->SBSYMCODELEN = SBSYMCODELEN;\n    result->IAIDx = jbig2_new(ctx, Jbig2ArithCx, ctx_size);\n    if (result->IAIDx == NULL)\n    {\n        jbig2_free(ctx->allocator, result);\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate symbol ID in IAID arithmetic coding state\");\n        return NULL;\n    }\n\n    memset(result->IAIDx, 0, ctx_size);\n    return result;\n}\n\n/* A.3 */\n/* Return value: -1 on error, 0 on normal value */\nint\njbig2_arith_iaid_decode(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *actx, Jbig2ArithState *as, int32_t *p_result)\n{\n    Jbig2ArithCx *IAIDx = actx->IAIDx;\n    uint8_t SBSYMCODELEN = actx->SBSYMCODELEN;\n    /* A.3 (1) */\n    int PREV = 1;\n    int D;\n    int i;\n\n    /* A.3 (2) */\n    for (i = 0; i < SBSYMCODELEN; i++) {\n        D = jbig2_arith_decode(ctx, as, &IAIDx[PREV]);\n        if (D < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAIDx code\");\n#ifdef VERBOSE\n        fprintf(stderr, \"IAID%x: D = %d\\n\", PREV, D);\n#endif\n        PREV = (PREV << 1) | D;\n    }\n    /* A.3 (3) */\n    PREV -= 1 << SBSYMCODELEN;\n#ifdef VERBOSE\n    fprintf(stderr, \"IAID result: %d\\n\", PREV);\n#endif\n    *p_result = PREV;\n    return 0;\n}\n\nvoid\njbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax)\n{\n    if (iax != NULL) {\n        jbig2_free(ctx->allocator, iax->IAIDx);\n        jbig2_free(ctx->allocator, iax);\n    }\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_arith_int.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* Annex A */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>\n#include <string.h>             /* memset() */\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_arith_int.h\"\n\nstruct _Jbig2ArithIntCtx {\n    Jbig2ArithCx IAx[512];\n};\n\nJbig2ArithIntCtx *\njbig2_arith_int_ctx_new(Jbig2Ctx *ctx)\n{\n    Jbig2ArithIntCtx *result = jbig2_new(ctx, Jbig2ArithIntCtx, 1);\n\n    if (result == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate arithmetic integer coding state\");\n        return NULL;\n    } else {\n        memset(result->IAx, 0, sizeof(result->IAx));\n    }\n\n    return result;\n}\n\n/* A.2 */\n/* Return value: -1 on error, 0 on normal value, 1 on OOB return. */\nint\njbig2_arith_int_decode(Jbig2Ctx *ctx, Jbig2ArithIntCtx *actx, Jbig2ArithState *as, int32_t *p_result)\n{\n    Jbig2ArithCx *IAx = actx->IAx;\n    int PREV = 1;\n    int S;\n    int32_t V;\n    int bit;\n    int n_tail, offset;\n    int i;\n\n    S = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n    if (S < 0)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx S\");\n    PREV = (PREV << 1) | S;\n\n    bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n    if (bit < 0)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx decision bit 0\");\n    PREV = (PREV << 1) | bit;\n    if (bit) {\n        bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx decision bit 1\");\n        PREV = (PREV << 1) | bit;\n\n        if (bit) {\n            bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n            if (bit < 0)\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx decision bit 2\");\n            PREV = (PREV << 1) | bit;\n\n            if (bit) {\n                bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx decision bit 3\");\n                PREV = (PREV << 1) | bit;\n\n                if (bit) {\n                    bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n                    if (bit < 0)\n                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx decision bit 4\");\n                    PREV = (PREV << 1) | bit;\n\n                    if (bit) {\n                        n_tail = 32;\n                        offset = 4436;\n                    } else {\n                        n_tail = 12;\n                        offset = 340;\n                    }\n                } else {\n                    n_tail = 8;\n                    offset = 84;\n                }\n            } else {\n                n_tail = 6;\n                offset = 20;\n            }\n        } else {\n            n_tail = 4;\n            offset = 4;\n        }\n    } else {\n        n_tail = 2;\n        offset = 0;\n    }\n\n    V = 0;\n    for (i = 0; i < n_tail; i++) {\n        bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode IAx V bit %d\", i);\n        PREV = ((PREV << 1) & 511) | (PREV & 256) | bit;\n        V = (V << 1) | bit;\n    }\n\n    /* offset is always >=0, so underflow can't happen. */\n    /* avoid overflow by clamping 32 bit value. */\n    if (V > INT32_MAX - offset)\n        V = INT32_MAX;\n    else\n        V += offset;\n    V = S ? -V : V;\n    *p_result = V;\n    return S && V == 0 ? 1 : 0;\n}\n\nvoid\njbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax)\n{\n    jbig2_free(ctx->allocator, iax);\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_generic.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/**\n * Generic region handlers.\n **/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>\n#include <string.h>             /* memcpy(), memset() */\n\n#ifdef OUTPUT_PBM\n#include <stdio.h>\n#endif\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_mmr.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_segment.h\"\n\n/*\nThis is an explanation of the unoptimized and optimized generic\nregion decoder implementations below, wherein we try to explain\nall the magic numbers.\n\nThe generic region decoders decode the output pixels one row at a\ntime, top to bottom. Within each row the pixels are decoded left\nto right. The input for the arithmetic integer decoder used to\ndecode each pixel is a context consisting of up to 16 previously\ndecoded pixels. These pixels are chosen according to a predefined\ntemplate placed relative to the location of the pixel to be\ndecoded (6.2.5.3 figures 3, 4, 5 and 6). There are four different\ntemplate that may be used (6.2.5.3). The template to use is\ndetermined by GBTEMPLATE. GBTEMPLATE is set in the symbol\ndictionary (6.5.8.1), generic region (7.4.6.4), or when decoding\na halftone region's gray-scale image (annex C.5).\n\nMost of the pixels in each template have fixed locations relative\nto the pixel to be decoded. However, all templates have at least\none adaptive pixel. The adaptive pixels have nominal locations,\nbut these locations may be changed by GBAT. GBAT is set in the\nsymbol dictionary (7.4.2.1.2), generic region (7.4.6.1), or hard\ncoded as for halftone patterns (6.7.5).\n\nAdaptive pixels are restricted to fall within a field of\npreviously decoded pixels relative to the pixel to be decoded\n(figure 7). The relative Y-coordinate for these adaptive pixels\nmay vary between -128 and 0. The relative X-coordinate may vary\nbetween -128 and +127 (however, if the Y-coordinate is 0 the\nrange of the X-coordinate is further restricted to -128 to -1\nsince the pixels at locations 0 to +127 have not yet been\ndecoded). If a template refers to a pixel location that reside\noutside of the image boundaries its value is assumed to be 0.\n\nUNOPTIMIZED DECODER\n\nThe unoptimized decoders first check the contents of GBAT. If\nGBAT specifies that any of the adaptive pixels reside outside the\nallowed field the decoding is aborted. Next, each row is\nprocessed top to bottom, left to right, one pixel at a time. For\neach pixel a context is created containing the bit values of the\npixels that fall inside the template.\n\nThe order these bits are stored in the context is implementation\ndependent (6.2.5.3). We store the bit values in the CONTEXT\nvariable from LSB to MSB, starting with the value of the pixel to\nthe left of the current pixel, continuing right to left, bottom\nto top following the template. Using the CONTEXT created from\nthese pixel values, the arithmetic integer decoder retrieves the\npixel value, which is then written into the output image.\n\nExample when GBTEMPLATE is 2:\n\nThe figure below represents a pixel grid of the output image.\nEach pixel is a single bit in the image. The pixel \"OO\" in the\nfigure below is about to be decoded. The pixels \"??\" have not\nbeen decoded yet. The CONTEXT variable is constructed by\ncombining the bit values from the pixels referred to by the\ntemplate, shifted to their corresponding bit position.\n\n     .    .    .    .    .    .    .    .\n     .    .    .    .    .    .    .    .\n  ...+----+----+----+----+----+----+----+...\n     |    |    | X9 | X8 | X7 |    |    |\n  ...+----+----+----+----+----+----+----+...\n     |    | X6 | X5 | X4 | X3 | A1 |    |\n  ...+----+----+----+----+----+----+----+...\n     |    | X2 | X1 | OO | ?? | ?? | ?? |\n  ...+----+----+----+----+----+----+----+...\n     .    .    .    .    .    .    .    .\n     .    .    .    .    .    .    .    .\n\nIn the table below pixel OO is assumed to be at coordinate (x, y).\n\nBit 9: Pixel at location (x-1, y-2) (This is fixed pixel X9)\nBit 8: Pixel at location (x  , y-2) (This is fixed pixel X8)\nBit 7: Pixel at location (x+1, y-2) (This is fixed pixel X7)\nBit 6: Pixel at location (x-2, y-1) (This is fixed pixel X6)\nBit 5: Pixel at location (x-1, y-1) (This is fixed pixel X5)\nBit 4: Pixel at location (x  , y-1) (This is fixed pixel X4)\nBit 3: Pixel at location (x+1, y-1) (This is fixed pixel X3)\nBit 2: Pixel at location (x+2, y-1) (This is adaptive pixel A1)\nBit 1: Pixel at location (x-2, y  ) (This is fixed pixel X2)\nBit 0: Pixel at location (x-1, y  ) (This is fixed pixel X1)\n\nThe location of adaptive pixel A1 may not always be at the\nnominal location (x+2, y-1). It could be at any pixel location to\nthe left or above OO as specified by GBAT, e.g. at the location\n(x-128, y+127).\n\nOPTIMIZED DECODER\n\nThe optimized decoders work differently. They strive to avoid\nrecreating the arithmetic integer decoder context from scratch\nfor every pixel decoded. Instead they reuse part of the CONTEXT\nused to compute the previous pixel (the pixel to left of the one\nnow being decoded). They also keep two sliding windows of pixel\nbit values from the two rows of pixels immediately above the\npixel to be decoded. These are stored in the 32-bit variables\nline_m1 (row above the pixel to be decoded) and line_m2 (row\nabove that of line_m1). These optimized decoders ONLY work for\nthe nominal adaptive pixel locations since these locations are\nhard-coded into the implementation.\n\nThe bit ordering in the CONTEXT variable is identical to the\nunoptimized case described above.\n\nThe optimized decoders decode the output pixels one row at a\ntime, top to bottom. Within each row the pixels are decoded in\nbatches of up to eight pixels at a time (except possibly the\nright most batch which may be less than eight pixels). The\nbatches in a row are decoded in sequence from left to right.\nWithin each such batch the pixels are decoded in sequence from\nleft to right.\n\nBefore decoding the pixels in a row the two sliding windows of\npixel values are reset. The first eight pixels of the row above\nthe pixel to be decoded is stored in line_m1, while line_m2\nstores the first eight pixels of the row above that of line_m1.\n\nThe figure below illustrates the situation where the template has\nbeen placed so that the decoded pixel OO is the very first pixel\nof a row. It also gives labels to various pixels that we will\nrefer to below.\n\n             .    .    .    .    .    .    .    .    .    .    .\n             |    .    .    .    .    .    .    .    .    .    .\n   +    +    +----+----+----+----+----+----+----+----+----+----+...\n          X9 | X8 | X7 | m1 | m2 | m3 | m4 | m5 | m6 | m7 |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+...\n     X6   X5 | X4 | X3 | A1 | n1 | n2 | n3 | n4 | n5 | n6 | n7 |\n   +    +    +----+----+----+----+----+----+----+----+----+----+...\n     X2   X1 | OO |    |    |    |    |    |    |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+...\n             |    .    .    .    .    .    .    .    .    .    .\n             .    .    .    .    .    .    .    .    .    .    .\n\nThe pixels X1, X2, X5, X6 and X9 all reside outside the left edge\nof the image. These pixels (like all others outside the image)\ncan according to 6.2.5.2 be assumed to be 0. line_m1 stores n5\nthrough n1 as well as A1, and X3 through X6. line_m2 stores m6\nthrough m1 as well as X7 through X9. The bits in line_m2 are also\nshifted left four bits as seen below.\n\n15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 | bit position\n------------------------------------------------+------------------\n 0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5 | line_m1\n 0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0  0  0  0 | line_m2\n\nThe way line_m1 and line_m2 are stored means we can simply shift\nthem by the same amount to move the sliding window.\n\nThe bit order in line_m1 and line_m2 matches the ordering in the\nCONTEXT variable. Each bit for the 'A' and 'X' pixels in line_m1\nand line_m2 correspond to the equivalent bits in CONTEXT, only\nshifted right by 3 bits. Thus X3 is bit 3 in CONTEXT and bit 6 in\nline_m1, etc.\n\nThe initial arithmetic integer decoder context is created and\nstored in the CONTEXT variable by masking, shifting, and bitwise\nORing the contents of line_m1 and line_m2. The \"CONTEXT contents\"\nrow is only shown for clarity, it is not present in the code.\n\n15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 | bit position\n------------------------------------------------+---------------------------\n 0  0  0  0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 | line_m1 >> 3\n 0  0  0  0  0  0  0  0  0  1  1  1  1  1  0  0 | mask for line_m1 (0x7c)\n 0  0  0  0  0  0  0  0  0 X6 X5 X4 X3 A1  0  0 | line_m1 AND mask\n------------------------------------------------+---------------------------\n 0  0  0  0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0 | line_m2 >> 3\n 0  0  0  0  0  0  1  1  1  0  0  0  0  0  0  0 | mask for line_m2 (0x380)\n 0  0  0  0  0  0 X9 X8 X7  0  0  0  0  0  0  0 | line_m2 AND mask\n------------------------------------------------+---------------------------\n 0  0  0  0  0  0 X9 X8 X7 X6 X5 X4 X3 A1  0  0 | CONTEXT = line_m1 OR line_m2\n------------------------------------------------+---------------------------\n 0  0  0  0  0  0 X9 X8 X7 X6 X5 X4 X3 A1 X2 X1 | CONTEXT contents\n\nEach batch is normally 8 bits, but at the right edge of the image\nwe may have fewer pixels to decode. The minor_width is how many\npixels the current batch should decode, with a counter variable\nx_minor to keep track of the current pixel being decoded.\n\nIn order to process a new batch of pixels, unless we're at the\nrightmost batch of pixels, we need to refill the sliding window\nvariables with eight new bits. Looking at the diagram above we\ncan see that in order to decode eight pixels starting with O0\nwe'll need to have bits up to pixel 'n7' for line_m1 and 'm7' for\nline_m2 available (A1 and X7 moved right 7 times). To do this\nsimply and quickly, we shift line_m1 left by 8 bits, and OR in\nthe next byte from corresponding row. Likewise for line_m2, but\nthe next byte from the image is also shifted left by 4 bits to\ncompensate for line_m2 having the four least significant bits\nunused.\n\nThese new eight bits contain the bit values of the eight pixels\nto the right of those already present in line_m1 and line_m2. We\ncall these new bits m7 through mE, and n6 through nD, as\nillustrated below.\n\n23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 | bit position\n------------------------------------------------------------------------+-------------\n 0  0  0  0  0  0  0  0  0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5 | original line_m1\n 0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5  0  0  0  0  0  0  0  0 | line_m1 shifted left by 8\n 0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5 n6 n7 n8 n9 nA nB nC nD | line_m1 with new bits ORed in\n------------------------------------------------------------------------+-------------\n 0  0  0  0  0  0  0  0  0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0  0  0  0 | original line_m2\n 0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0  0  0  0  0  0  0  0  0  0  0  0 | line_m2 shifted left by 8\n 0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6 m7 m8 m9 mA mB mC mD mE  0  0  0  0 | line_m2 with new bits ORed in\n\n             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n          X9 | X8 | X7 | m1 | m2 | m3 | m4 | m5 | m6 | m7 | m8 | m9 | mA | mB | mC | mD | mE |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n     X6   X5 | X4 | X3 | A1 | n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | nA | nB | nC | nD |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n     X2   X1 | OO |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n\nCONTEXT, line_m1 and line_m2 now contain all necessary bits to\ndecode a full batch of eight pixels.\n\nThe first pixel in the batch is decoded using this CONTEXT. After\nthat, for each following pixel we need to update the CONTEXT\nusing both the last decoded pixel value and new bits from line_m1\nand line_m2.\n\n             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n         (X9)|_X8_|_X7_|>m1<| m2 | m3 | m4 | m5 | m6 | m7 | m8 | m9 | mA | mB | mC | mD | mE |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n    (X6) _X5_|_X4_|_X3_|_A1_|>n1<| n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | nA | nB | nC | nD |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n    (X2) _X1_|>OO<| oo |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |\n   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...\n             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .\n\nThis figure illustrates what happens when the same template is\noverlaid on itself shifted one pixel to the right in order to\ndecode the next pixel. Pixels marked with _  _ are pixels that\nare present in both templates' CONTEXTs and can be reused. Pixels\nmarked with (  ) are pixels from the first template that are no\nlonger necessary and can be removed from CONTEXT. Pixels marked\nwith >  < are new pixels that were not part of the original\nCONTEXT, and so need to be moved into the CONTEXT at the\nappropriate locations. In general the leftmost pixels of each\ntemplate row can be forgotten, while new pixels are needed at the\nright most location of each row.\n\nThe CONTEXT corresponding to the current pixel OO and how it is\nmasked is shown below. Note how the left most pixel of each row\nof the template is NOT propagated to the CONTEXT, these pixels\nare X2, X6 and X9. This is done by having the mask being 0 at the\ncorresponding locations.\n\n 9  8  7  6  5  4  3  2  1  0 | bit position\n------------------------------+-------------\nX9 X8 X7 X6 X5 X4 X3 A1 X2 X1 | pixel values from CONTEXT\n 0  1  1  0  1  1  1  1  0  1 | reused pixel bit value mask (0x1bd)\n 0 X8 X7  0 X5 X4 X3 A1  0 X1 | reused pixel values from CONTEXT\n\nNext the CONTEXT is shifted left by one bit to make it reference\nthe next pixel to be decoded. The pixel bit value we just decoded\nis then written into the bit corresponding to X1. The sliding\nwindows in line_m1 and line_m2 are both shifted (10 - x_minor)\nbits to the right to make the needed pixels' bit values appear at\nthe correct positions to be ORed into CONTEXT. Note that this\nshift amount depends on which bit in the batch is currently being\ncomputed, as is given by the x_minor counter. In the example\nbelow we assume that x_minor is 0.\n\n 9  8  7  6  5  4  3  2  1  0 | bit position\n------------------------------+--------------\n 0 X8 X7  0 X5 X4 X3 A1  0  0 | reused pixels from CONTEXT\nX8 X7  0 X5 X4 X3 A1  0  0  0 | reused pixels shifted left 1 bit\n------------------------------+--------------\nX8 X7  0 X5 X4 X3 A1  0 X1 OO | new CONTEXT with current pixel at LSB\n------------------------------+--------------\n 0  0 X6 X5 X4 X3 A1 n1 n2 n3 | line_m1 shifted (10 - x_minor) bits to the right\n 0  0  0  0  0  0  0  1  0  0 | mask for new adaptive pixel one row above (0x4)\nX8 X7  0 X5 X4 X3 A1 n1 X1 OO | new CONTEXT with new adaptive pixel\n------------------------------+--------------\nX8 X7 m1 m2 m3 m4 m5 m6 m7 m8 | line_m2 with new bits ORed in\n 0  0  1  0  0  0  0  0  0  0 | mask for new pixel two rows above (0x80)\nX8 X7 m1 X5 X4 X3 A1 n1 X1 OO | new CONTEXT with new pixel\n\nThis makes the computation of the new CONTEXT be:\n\nNEWCONTEXT = (CONTEXT & 0x1bd) << 1\nNEWCONTEXT |= newbit;\nNEWCONTEXT |= (line_m1 >> (10-x_minor)) & 0x4;\nNEWCONTEXT |= (line_m2 >> (10-x_minor)) & 0x80;\n\nThe optimized decoding functions for GBTEMPLATE 0, 1 and 3 all\nwork similarly. */\n\n/* Get a bit. No bounds checking. */\nstatic inline int\njbig2_image_get_pixel_fast(Jbig2Image *image, int x, int y)\n{\n    const int byte = (x >> 3) + y * image->stride;\n    const int bit = 7 - (x & 7);\n\n    return ((image->data[byte] >> bit) & 1);\n}\n\n/* return the appropriate context size for the given template */\nint\njbig2_generic_stats_size(Jbig2Ctx *ctx, int template)\n{\n    int stats_size = template == 0 ? 1 << 16 : template == 1 ? 1 << 13 : 1 << 10;\n\n    return stats_size;\n}\n\nstatic int\njbig2_decode_generic_template0(Jbig2Ctx *ctx,\n                               Jbig2Segment *segment,\n                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as,\n                               Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    const uint32_t rowstride = image->stride;\n    uint32_t x, y;\n    byte *line2 = NULL;\n    byte *line1 = NULL;\n    byte *gbreg_line = (byte *) image->data;\n\n#ifdef OUTPUT_PBM\n    printf(\"P4\\n%d %d\\n\", GBW, GBH);\n#endif\n\n    if (GBW <= 0)\n        return 0;\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t CONTEXT;\n        uint32_t line_m1;\n        uint32_t line_m2;\n        uint32_t padded_width = (GBW + 7) & -8;\n\n        line_m1 = line1 ? line1[0] : 0;\n        line_m2 = line2 ? line2[0] << 6 : 0;\n        CONTEXT = (line_m1 & 0x7f0) | (line_m2 & 0xf800);\n\n        /* 6.2.5.7 3d */\n        for (x = 0; x < padded_width; x += 8) {\n            byte result = 0;\n            int x_minor;\n            int minor_width = GBW - x > 8 ? 8 : GBW - x;\n\n            if (line1)\n                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);\n\n            if (line2)\n                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 6 : 0);\n\n            /* This is the speed-critical inner loop. */\n            for (x_minor = 0; x_minor < minor_width; x_minor++) {\n                int bit;\n\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template0 optimized\");\n                result |= bit << (7 - x_minor);\n                CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bit | ((line_m1 >> (7 - x_minor)) & 0x10) | ((line_m2 >> (7 - x_minor)) & 0x800);\n            }\n            gbreg_line[x >> 3] = result;\n        }\n#ifdef OUTPUT_PBM\n        fwrite(gbreg_line, 1, rowstride, stdout);\n#endif\n        line2 = line1;\n        line1 = gbreg_line;\n        gbreg_line += rowstride;\n    }\n\n    return 0;\n}\n\n#define pixel_outside_field(x, y) \\\n    ((y) < -128 || (y) > 0 || (x) < -128 || ((y) < 0 && (x) > 127) || ((y) == 0 && (x) >= 0))\n\nstatic int\njbig2_decode_generic_template0_unopt(Jbig2Ctx *ctx,\n                                     Jbig2Segment *segment,\n                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int bit;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||\n        pixel_outside_field(params->gbat[2], params->gbat[3]) ||\n        pixel_outside_field(params->gbat[4], params->gbat[5]) ||\n        pixel_outside_field(params->gbat[6], params->gbat[7]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t out_byte = 0;\n        int out_bits_to_go_in_byte = 8;\n        uint8_t *d = &image->data[image->stride * y];\n        uint8_t *pline  = &image->data[image->stride * (y-1)];\n        uint8_t *ppline = &image->data[image->stride * (y-2)];\n        uint32_t pd = 0;\n        uint32_t ppd = 0;\n        if (y > 0) {\n            pd = (*pline++ << 8);\n            if (GBW > 8)\n                pd |= *pline++;\n            if (y > 1) {\n                ppd = (*ppline++ << 8);\n                if (GBW > 8)\n                    ppd |= *ppline++;\n            }\n        }\n        for (x = 0; x < GBW; x++) {\n            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                bit = 0;\n            } else {\n                CONTEXT  = out_byte & 0x000F; /* First 4 pixels */\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;\n                CONTEXT |= (pd>>8) & 0x03E0; /* Next 5 pixels */\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;\n                CONTEXT |= (ppd>>2) & 0x7000; /* Next 3 pixels */\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template0 unoptimized\");\n            }\n            pd = pd<<1;\n            ppd = ppd<<1;\n            out_byte = (out_byte<<1) | bit;\n            out_bits_to_go_in_byte--;\n            *d = out_byte<<out_bits_to_go_in_byte;\n            if (out_bits_to_go_in_byte == 0) {\n                out_bits_to_go_in_byte = 8;\n                d++;\n                if (x+9 < GBW && y > 0) {\n                    pd |= *pline++;\n                    if (y > 1)\n                        ppd |= *ppline++;\n                }\n            }\n        }\n        if (out_bits_to_go_in_byte != 8)\n            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n    }\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template1_unopt(Jbig2Ctx *ctx,\n                                     Jbig2Segment *segment,\n                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int bit;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t out_byte = 0;\n        int out_bits_to_go_in_byte = 8;\n        uint8_t *d = &image->data[image->stride * y];\n        uint8_t *pline  = &image->data[image->stride * (y-1)];\n        uint8_t *ppline = &image->data[image->stride * (y-2)];\n        uint32_t pd = 0;\n        uint32_t ppd = 0;\n        if (y > 0) {\n            pd = (*pline++ << 8);\n            if (GBW > 8)\n                pd |= *pline++;\n            if (y > 1) {\n                ppd = (*ppline++ << 8);\n                if (GBW > 8)\n                    ppd |= *ppline++;\n            }\n        }\n        for (x = 0; x < GBW; x++) {\n            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                bit = 0;\n            } else {\n                CONTEXT  = out_byte & 0x0007; /* First 3 pixels */\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;\n                CONTEXT |= (pd>>9) & 0x01F0; /* Next 5 pixels */\n                CONTEXT |= (ppd>>4) & 0x1E00; /* Next 4 pixels */\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template1 unoptimized\");\n            }\n            pd = pd<<1;\n            ppd = ppd<<1;\n            out_byte = (out_byte<<1) | bit;\n            out_bits_to_go_in_byte--;\n            *d = out_byte<<out_bits_to_go_in_byte;\n            if (out_bits_to_go_in_byte == 0) {\n                out_bits_to_go_in_byte = 8;\n                d++;\n                if (x+9 < GBW && y > 0) {\n                    pd |= *pline++;\n                    if (y > 1)\n                        ppd |= *ppline++;\n                }\n            }\n        }\n        if (out_bits_to_go_in_byte != 8)\n            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n    }\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template1(Jbig2Ctx *ctx,\n                               Jbig2Segment *segment,\n                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    const uint32_t rowstride = image->stride;\n    uint32_t x, y;\n    byte *line2 = NULL;\n    byte *line1 = NULL;\n    byte *gbreg_line = (byte *) image->data;\n\n#ifdef OUTPUT_PBM\n    printf(\"P4\\n%d %d\\n\", GBW, GBH);\n#endif\n\n    if (GBW <= 0)\n        return 0;\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t CONTEXT;\n        uint32_t line_m1;\n        uint32_t line_m2;\n        uint32_t padded_width = (GBW + 7) & -8;\n\n        line_m1 = line1 ? line1[0] : 0;\n        line_m2 = line2 ? line2[0] << 5 : 0;\n        CONTEXT = ((line_m1 >> 1) & 0x1f8) | ((line_m2 >> 1) & 0x1e00);\n\n        /* 6.2.5.7 3d */\n        for (x = 0; x < padded_width; x += 8) {\n            byte result = 0;\n            int x_minor;\n            int minor_width = GBW - x > 8 ? 8 : GBW - x;\n\n            if (line1)\n                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);\n\n            if (line2)\n                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 5 : 0);\n\n            /* This is the speed-critical inner loop. */\n            for (x_minor = 0; x_minor < minor_width; x_minor++) {\n                int bit;\n\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template1 optimized\");\n                result |= bit << (7 - x_minor);\n                CONTEXT = ((CONTEXT & 0xefb) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x8) | ((line_m2 >> (8 - x_minor)) & 0x200);\n            }\n            gbreg_line[x >> 3] = result;\n        }\n#ifdef OUTPUT_PBM\n        fwrite(gbreg_line, 1, rowstride, stdout);\n#endif\n        line2 = line1;\n        line1 = gbreg_line;\n        gbreg_line += rowstride;\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template2_unopt(Jbig2Ctx *ctx,\n                               Jbig2Segment *segment,\n                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int bit;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t out_byte = 0;\n        int out_bits_to_go_in_byte = 8;\n        uint8_t *d = &image->data[image->stride * y];\n        uint8_t *pline  = &image->data[image->stride * (y-1)];\n        uint8_t *ppline = &image->data[image->stride * (y-2)];\n        uint32_t pd = 0;\n        uint32_t ppd = 0;\n        if (y > 0) {\n            pd = (*pline++ << 8);\n            if (GBW > 8)\n                pd |= *pline++;\n            if (y > 1) {\n                ppd = (*ppline++ << 8);\n                if (GBW > 8)\n                    ppd |= *ppline++;\n            }\n        }\n        for (x = 0; x < GBW; x++) {\n            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                bit = 0;\n            } else {\n                CONTEXT  = out_byte & 0x003; /* First 2 pixels */\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;\n                CONTEXT |= (pd>>11) & 0x078; /* Next 4 pixels */\n                CONTEXT |= (ppd>>7) & 0x380; /* Next 3 pixels */\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template2 unoptimized\");\n            }\n            pd = pd<<1;\n            ppd = ppd<<1;\n            out_byte = (out_byte<<1) | bit;\n            out_bits_to_go_in_byte--;\n            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n            if (out_bits_to_go_in_byte == 0) {\n                out_bits_to_go_in_byte = 8;\n                d++;\n                if (x+9 < GBW && y > 0) {\n                    pd |= *pline++;\n                    if (y > 1)\n                        ppd |= *ppline++;\n                }\n            }\n        }\n        if (out_bits_to_go_in_byte != 8)\n            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template2(Jbig2Ctx *ctx,\n                                Jbig2Segment *segment,\n                                const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    const uint32_t rowstride = image->stride;\n    uint32_t x, y;\n    byte *line2 = NULL;\n    byte *line1 = NULL;\n    byte *gbreg_line = (byte *) image->data;\n\n#ifdef OUTPUT_PBM\n    printf(\"P4\\n%d %d\\n\", GBW, GBH);\n#endif\n\n    if (GBW <= 0)\n        return 0;\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t CONTEXT;\n        uint32_t line_m1;\n        uint32_t line_m2;\n        uint32_t padded_width = (GBW + 7) & -8;\n\n        line_m1 = line1 ? line1[0] : 0;\n        line_m2 = line2 ? line2[0] << 4 : 0;\n        CONTEXT = ((line_m1 >> 3) & 0x7c) | ((line_m2 >> 3) & 0x380);\n\n        /* 6.2.5.7 3d */\n        for (x = 0; x < padded_width; x += 8) {\n            byte result = 0;\n            int x_minor;\n            int minor_width = GBW - x > 8 ? 8 : GBW - x;\n\n            if (line1)\n                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);\n\n            if (line2)\n                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 4 : 0);\n\n            /* This is the speed-critical inner loop. */\n            for (x_minor = 0; x_minor < minor_width; x_minor++) {\n                int bit;\n\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template2 optimized\");\n                result |= bit << (7 - x_minor);\n                CONTEXT = ((CONTEXT & 0x1bd) << 1) | bit | ((line_m1 >> (10 - x_minor)) & 0x4) | ((line_m2 >> (10 - x_minor)) & 0x80);\n            }\n            gbreg_line[x >> 3] = result;\n        }\n#ifdef OUTPUT_PBM\n        fwrite(gbreg_line, 1, rowstride, stdout);\n#endif\n        line2 = line1;\n        line1 = gbreg_line;\n        gbreg_line += rowstride;\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template3(Jbig2Ctx *ctx,\n                               Jbig2Segment *segment,\n                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    const uint32_t rowstride = image->stride;\n    byte *line1 = NULL;\n    byte *gbreg_line = (byte *) image->data;\n    uint32_t x, y;\n\n#ifdef OUTPUT_PBM\n    printf(\"P4\\n%d %d\\n\", GBW, GBH);\n#endif\n\n    if (GBW <= 0)\n        return 0;\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t CONTEXT;\n        uint32_t line_m1;\n        uint32_t padded_width = (GBW + 7) & -8;\n\n        line_m1 = line1 ? line1[0] : 0;\n        CONTEXT = (line_m1 >> 1) & 0x3f0;\n\n        /* 6.2.5.7 3d */\n        for (x = 0; x < padded_width; x += 8) {\n            byte result = 0;\n            int x_minor;\n            int minor_width = GBW - x > 8 ? 8 : GBW - x;\n\n            if (line1)\n                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);\n\n            /* This is the speed-critical inner loop. */\n            for (x_minor = 0; x_minor < minor_width; x_minor++) {\n                int bit;\n\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template3 optimized\");\n                result |= bit << (7 - x_minor);\n                CONTEXT = ((CONTEXT & 0x1f7) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x10);\n            }\n            gbreg_line[x >> 3] = result;\n        }\n#ifdef OUTPUT_PBM\n        fwrite(gbreg_line, 1, rowstride, stdout);\n#endif\n        line1 = gbreg_line;\n        gbreg_line += rowstride;\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template3_unopt(Jbig2Ctx *ctx,\n                                     Jbig2Segment *segment,\n                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int bit;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        uint32_t out_byte = 0;\n        int out_bits_to_go_in_byte = 8;\n        uint8_t *d = &image->data[image->stride * y];\n        uint8_t *pline  = &image->data[image->stride * (y-1)];\n        uint32_t pd = 0;\n        if (y > 0) {\n            pd = (*pline++ << 8);\n            if (GBW > 8)\n                pd |= *pline++;\n        }\n        for (x = 0; x < GBW; x++) {\n            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                bit = 0;\n            } else {\n                CONTEXT  = out_byte & 0x00F; /* First 4 pixels */\n                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;\n                CONTEXT |= (pd>>9) & 0x3E0; /* Next 5 pixels */\n                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template3 unoptimized\");\n            }\n            pd = pd<<1;\n            out_byte = (out_byte<<1) | bit;\n            out_bits_to_go_in_byte--;\n            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n            if (out_bits_to_go_in_byte == 0) {\n                out_bits_to_go_in_byte = 8;\n                d++;\n                if (x+9 < GBW && y > 0)\n                    pd |= *pline++;\n            }\n        }\n        if (out_bits_to_go_in_byte != 8)\n            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n    }\n    return 0;\n}\n\nstatic void\ncopy_prev_row(Jbig2Image *image, int row)\n{\n    if (!row) {\n        /* no previous row */\n        memset(image->data, 0, image->stride);\n    } else {\n        /* duplicate data from the previous row */\n        uint8_t *src = image->data + (row - 1) * image->stride;\n\n        memcpy(src + image->stride, src, image->stride);\n    }\n}\n\nstatic int\njbig2_decode_generic_template0_TPGDON(Jbig2Ctx *ctx,\n                                      Jbig2Segment *segment,\n                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int LTP = 0;\n    int gmin, gmax;\n    uint32_t left, right, top;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||\n        pixel_outside_field(params->gbat[2], params->gbat[3]) ||\n        pixel_outside_field(params->gbat[4], params->gbat[5]) ||\n        pixel_outside_field(params->gbat[6], params->gbat[7]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    /* JBig2 has 'standard' values for gbat (see 6.2.5.4 of the spec).\n     * Have an optimised version for those locations. This greatly\n     * simplifies some of the fetches. It's almost like they thought\n     * it through. */\n    if (params->gbat[0] ==  3 && params->gbat[1] == -1 &&\n        params->gbat[2] == -3 && params->gbat[3] == -1 &&\n        params->gbat[4] ==  2 && params->gbat[5] == -2 &&\n        params->gbat[6] == -2 && params->gbat[7] == -2)\n    {\n        for (y = 0; y < GBH; y++) {\n            int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);\n            if (bit < 0)\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template0 TPGDON1\");\n            LTP ^= bit;\n            if (!LTP) {\n                uint32_t out_byte = 0;\n                int out_bits_to_go_in_byte = 8;\n                uint8_t *d = &image->data[image->stride * y];\n                uint8_t *pline  = &image->data[image->stride * (y-1)];\n                uint8_t *ppline = &image->data[image->stride * (y-2)];\n                uint32_t pd = 0;\n                uint32_t ppd = 0;\n                if (y > 0) {\n                    pd = (*pline++ << 8);\n                    if (GBW > 8)\n                        pd |= *pline++;\n                    if (y > 1) {\n                        ppd = (*ppline++ << 8);\n                        if (GBW > 8)\n                            ppd |= *ppline++;\n                    }\n                }\n                for (x = 0; x < GBW; x++) {\n                    if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                        bit = 0;\n                    } else {\n                        CONTEXT  = out_byte & 0x00F; /* First 4 pixels */\n                        CONTEXT |= (pd>>8) & 0x7F0; /* Next 7 pixels */\n                        CONTEXT |= (ppd>>2) & 0xF800; /* Final 5 pixels */\n                        bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                        if (bit < 0)\n                            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template0 TPGDON2\");\n                    }\n                    pd = pd<<1;\n                    ppd = ppd<<1;\n                    out_byte = (out_byte<<1) | bit;\n                    out_bits_to_go_in_byte--;\n                    if (out_bits_to_go_in_byte == 0) {\n                        out_bits_to_go_in_byte = 8;\n                        *d++ = (uint8_t)out_byte;\n                        if (x+9 < GBW && y > 0) {\n                            pd |= *pline++;\n                            if (y > 1)\n                                ppd |= *ppline++;\n                        }\n                    }\n                }\n                if (out_bits_to_go_in_byte != 8)\n                    *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n            } else {\n                copy_prev_row(image, y);\n            }\n        }\n        return 0;\n    }\n\n    /* We divide the width into 3 regions 0..left...right...GBW,\n     * between left and right, we know that our accesses will never\n     * step outside the image, enabling us to use faster accessors. */\n    left = 4;\n    right = 2;\n    gmin = gmax = params->gbat[0];\n    if (params->gbat[2] < gmin)\n        gmin = params->gbat[2];\n    if (gmax < params->gbat[2])\n        gmax = params->gbat[2];\n    if (params->gbat[4] < gmin)\n        gmin = params->gbat[4];\n    if (gmax < params->gbat[4])\n        gmax = params->gbat[4];\n    if (params->gbat[6] < gmin)\n        gmin = params->gbat[6];\n    if (gmax < params->gbat[6])\n        gmax = params->gbat[6];\n    if ((int)left < -gmin)\n        left = -gmin;\n    if ((int)right < gmax)\n        right = gmax;\n    if (right > GBW)\n        right = GBW;\n    right = GBW - right;\n    /* So 0 <= x < left or right <= x < GBW needs bounds checking. */\n\n    /* Now we do the same for the height, but here there is no bottom\n     * region, as we only ever look up for y. */\n    top = 2;\n    gmin = params->gbat[1];\n    if (params->gbat[3] < gmin)\n        gmin = params->gbat[3];\n    if (params->gbat[5] < gmin)\n        gmin = params->gbat[5];\n    if (params->gbat[7] < gmin)\n        gmin = params->gbat[7];\n    if ((int)top < -gmin)\n        top = -gmin;\n    /* So 0 <= y < top needs bounds checking. */\n\n    for (y = 0; y < GBH; y++) {\n        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template0 TPGDON1\");\n        LTP ^= bit;\n        if (!LTP) {\n            uint32_t out_byte = 0;\n            int out_bits_to_go_in_byte = 8;\n            uint8_t *d = &image->data[image->stride * y];\n            uint8_t *pline  = &image->data[image->stride * (y-1)];\n            uint8_t *ppline = &image->data[image->stride * (y-2)];\n            uint32_t pd = 0;\n            uint32_t ppd = 0;\n            if (y > 0) {\n                pd = (*pline++ << 8);\n                if (GBW > 8)\n                    pd |= *pline++;\n                if (y > 1) {\n                    ppd = (*ppline++ << 8);\n                    if (GBW > 8)\n                        ppd |= *ppline++;\n                }\n            }\n            for (x = 0; x < GBW; x++) {\n                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                    bit = 0;\n                } else {\n                    CONTEXT = out_byte & 0x000F; /* First 4 pixels */\n                    CONTEXT |= (pd>>8) & 0x03E0; /* Skip one, next 5 pixels */\n                    CONTEXT |= (ppd>>2) & 0x7000; /* Skip 2, next 3 pixels, skip one */\n                    if (y >= top && x >= left && x < right)\n                    {\n                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[0], y + params->gbat[1]) << 4;\n                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[2], y + params->gbat[3]) << 10;\n                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[4], y + params->gbat[5]) << 11;\n                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[6], y + params->gbat[7]) << 15;\n                    }\n                    else\n                    {\n                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;\n                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;\n                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;\n                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;\n                    }\n                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                    if (bit < 0)\n                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template0 TPGDON2\");\n                }\n                pd = pd<<1;\n                ppd = ppd<<1;\n                out_byte = (out_byte<<1) | bit;\n                out_bits_to_go_in_byte--;\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n                if (out_bits_to_go_in_byte == 0) {\n                    out_bits_to_go_in_byte = 8;\n                    d++;\n                    if (x+9 < GBW && y > 0) {\n                        pd |= *pline++;\n                        if (y > 1)\n                            ppd |= *ppline++;\n                    }\n                }\n            }\n            if (out_bits_to_go_in_byte != 8)\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n        } else {\n            copy_prev_row(image, y);\n        }\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template1_TPGDON(Jbig2Ctx *ctx,\n                                      Jbig2Segment *segment,\n                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int LTP = 0;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0795]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template1 TPGDON1\");\n        LTP ^= bit;\n        if (!LTP) {\n            uint32_t out_byte = 0;\n            int out_bits_to_go_in_byte = 8;\n            uint8_t *d = &image->data[image->stride * y];\n            uint8_t *pline  = &image->data[image->stride * (y-1)];\n            uint8_t *ppline = &image->data[image->stride * (y-2)];\n            uint32_t pd = 0;\n            uint32_t ppd = 0;\n            if (y > 0) {\n                pd = (*pline++ << 8);\n                if (GBW > 8)\n                    pd |= *pline++;\n                if (y > 1) {\n                    ppd = (*ppline++ << 8);\n                    if (GBW > 8)\n                        ppd |= *ppline++;\n                }\n            }\n            for (x = 0; x < GBW; x++) {\n                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                    bit = 0;\n                } else {\n                    CONTEXT  = out_byte & 0x0007; /* First 3 pixels */\n                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;\n                    CONTEXT |= (pd>>9) & 0x01F0; /* next 5 pixels */\n                    CONTEXT |= (ppd>>4) & 0x1E00; /* next 4 pixels */\n                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                    if (bit < 0)\n                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template1 TPGDON2\");\n                }\n                pd = pd<<1;\n                ppd = ppd<<1;\n                out_byte = (out_byte<<1) | bit;\n                out_bits_to_go_in_byte--;\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n                if (out_bits_to_go_in_byte == 0) {\n                    out_bits_to_go_in_byte = 8;\n                    d++;\n                    if (x+9 < GBW && y > 0) {\n                        pd |= *pline++;\n                        if (y > 1)\n                            ppd |= *ppline++;\n                    }\n                }\n            }\n            if (out_bits_to_go_in_byte != 8)\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n        } else {\n            copy_prev_row(image, y);\n        }\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template2_TPGDON(Jbig2Ctx *ctx,\n                                      Jbig2Segment *segment,\n                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int LTP = 0;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0xE5]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template2 TPGDON1\");\n        LTP ^= bit;\n        if (!LTP) {\n            uint32_t out_byte = 0;\n            int out_bits_to_go_in_byte = 8;\n            uint8_t *d = &image->data[image->stride * y];\n            uint8_t *pline  = &image->data[image->stride * (y-1)];\n            uint8_t *ppline = &image->data[image->stride * (y-2)];\n            uint32_t pd = 0;\n            uint32_t ppd = 0;\n            if (y > 0) {\n                pd = (*pline++ << 8);\n                if (GBW > 8)\n                    pd |= *pline++;\n                if (y > 1) {\n                    ppd = (*ppline++ << 8);\n                    if (GBW > 8)\n                        ppd |= *ppline++;\n                }\n            }\n            for (x = 0; x < GBW; x++) {\n                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                    bit = 0;\n                } else {\n                    CONTEXT  = out_byte & 0x003; /* First 2 pixels */\n                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;\n                    CONTEXT |= (pd>>11) & 0x078; /* next 4 pixels */\n                    CONTEXT |= (ppd>>7) & 0x380; /* next 3 pixels */\n                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                    if (bit < 0)\n                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template2 TPGDON2\");\n                }\n                pd = pd<<1;\n                ppd = ppd<<1;\n                out_byte = (out_byte<<1) | bit;\n                out_bits_to_go_in_byte--;\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n                if (out_bits_to_go_in_byte == 0) {\n                    out_bits_to_go_in_byte = 8;\n                    d++;\n                    if (x+9 < GBW && y > 0) {\n                        pd |= *pline++;\n                        if (y > 1)\n                            ppd |= *ppline++;\n                    }\n                }\n            }\n            if (out_bits_to_go_in_byte != 8)\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n        } else {\n            copy_prev_row(image, y);\n        }\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_template3_TPGDON(Jbig2Ctx *ctx,\n                                      Jbig2Segment *segment,\n                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const uint32_t GBW = image->width;\n    const uint32_t GBH = image->height;\n    uint32_t CONTEXT;\n    uint32_t x, y;\n    int LTP = 0;\n\n    if (pixel_outside_field(params->gbat[0], params->gbat[1]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GBH; y++) {\n        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0195]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template3 TPGDON1\");\n        LTP ^= bit;\n        if (!LTP) {\n            uint32_t out_byte = 0;\n            int out_bits_to_go_in_byte = 8;\n            uint8_t *d = &image->data[image->stride * y];\n            uint8_t *pline  = &image->data[image->stride * (y-1)];\n            uint32_t pd = 0;\n            if (y > 0) {\n                pd = (*pline++ << 8);\n                if (GBW > 8)\n                    pd |= *pline++;\n            }\n            for (x = 0; x < GBW; x++) {\n                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {\n                    bit = 0;\n                } else {\n                    CONTEXT  = out_byte & 0x0F; /* First 4 pixels */\n                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;\n                    CONTEXT |= (pd>>9) & 0x3E0; /* next 5 pixels */\n                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);\n                    if (bit < 0)\n                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling generic template3 TPGDON2\");\n                }\n                pd = pd<<1;\n                out_byte = (out_byte<<1) | bit;\n                out_bits_to_go_in_byte--;\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n                if (out_bits_to_go_in_byte == 0) {\n                    out_bits_to_go_in_byte = 8;\n                    d++;\n                    if (x+9 < GBW && y > 0)\n                        pd |= *pline++;\n                }\n            }\n            if (out_bits_to_go_in_byte != 8)\n                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;\n        } else {\n            copy_prev_row(image, y);\n        }\n    }\n\n    return 0;\n}\n\nstatic int\njbig2_decode_generic_region_TPGDON(Jbig2Ctx *ctx,\n                                   Jbig2Segment *segment,\n                                   const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    switch (params->GBTEMPLATE) {\n    case 0:\n        return jbig2_decode_generic_template0_TPGDON(ctx, segment, params, as, image, GB_stats);\n    case 1:\n        return jbig2_decode_generic_template1_TPGDON(ctx, segment, params, as, image, GB_stats);\n    case 2:\n        return jbig2_decode_generic_template2_TPGDON(ctx, segment, params, as, image, GB_stats);\n    case 3:\n        return jbig2_decode_generic_template3_TPGDON(ctx, segment, params, as, image, GB_stats);\n    }\n\n    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"unsupported GBTEMPLATE (%d)\", params->GBTEMPLATE);\n}\n\n/**\n * jbig2_decode_generic_region: Decode a generic region.\n * @ctx: The context for allocation and error reporting.\n * @segment: A segment reference for error reporting.\n * @params: Decoding parameter set.\n * @as: Arithmetic decoder state.\n * @image: Where to store the decoded data.\n * @GB_stats: Arithmetic stats.\n *\n * Decodes a generic region, according to section 6.2. The caller should\n * pass an already allocated Jbig2Image object for @image\n *\n * Because this API is based on an arithmetic decoding state, it is\n * not suitable for MMR decoding.\n *\n * Return code: 0 on success.\n **/\nint\njbig2_decode_generic_region(Jbig2Ctx *ctx,\n                            Jbig2Segment *segment, const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    const int8_t *gbat = params->gbat;\n\n    if (!params->MMR && params->TPGDON)\n        return jbig2_decode_generic_region_TPGDON(ctx, segment, params, as, image, GB_stats);\n\n    if (!params->MMR && params->GBTEMPLATE == 0) {\n        if (!params->USESKIP && gbat[0] == +3 && gbat[1] == -1 && gbat[2] == -3 && gbat[3] == -1 && gbat[4] == +2 && gbat[5] == -2 && gbat[6] == -2 && gbat[7] == -2)\n            return jbig2_decode_generic_template0(ctx, segment, params, as, image, GB_stats);\n        else\n            return jbig2_decode_generic_template0_unopt(ctx, segment, params, as, image, GB_stats);\n    } else if (!params->MMR && params->GBTEMPLATE == 1) {\n        if (!params->USESKIP && gbat[0] == +3 && gbat[1] == -1)\n            return jbig2_decode_generic_template1(ctx, segment, params, as, image, GB_stats);\n        else\n            return jbig2_decode_generic_template1_unopt(ctx, segment, params, as, image, GB_stats);\n    }\n    else if (!params->MMR && params->GBTEMPLATE == 2) {\n        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)\n            return jbig2_decode_generic_template2(ctx, segment, params, as, image, GB_stats);\n        else\n            return jbig2_decode_generic_template2_unopt(ctx, segment, params, as, image, GB_stats);\n    } else if (!params->MMR && params->GBTEMPLATE == 3) {\n        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)\n            return jbig2_decode_generic_template3(ctx, segment, params, as, image, GB_stats);\n        else\n            return jbig2_decode_generic_template3_unopt(ctx, segment, params, as, image, GB_stats);\n    }\n\n    {\n        int i;\n\n        for (i = 0; i < 8; i++)\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"gbat[%d] = %d\", i, params->gbat[i]);\n    }\n\n    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"unsupported generic region (MMR=%d, GBTEMPLATE=%d)\", params->MMR, params->GBTEMPLATE);\n}\n\n/**\n * Handler for immediate generic region segments\n */\nint\njbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    Jbig2RegionSegmentInfo rsi;\n    byte seg_flags;\n    int8_t gbat[8];\n    int offset;\n    uint32_t gbat_bytes = 0;\n    Jbig2GenericRegionParams params;\n    int code = 0;\n    Jbig2Image *image = NULL;\n    Jbig2WordStream *ws = NULL;\n    Jbig2ArithState *as = NULL;\n    Jbig2ArithCx *GB_stats = NULL;\n    uint32_t height;\n    Jbig2Page *page = &ctx->pages[ctx->current_page];\n\n    /* 7.4.6 */\n    if (segment->data_length < 18)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n\n    jbig2_get_region_segment_info(&rsi, segment_data);\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"generic region: %u x %u @ (%u, %u), flags = %02x\", rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags);\n\n    /* 7.4.6.4 */\n    height = rsi.height;\n    if (segment->rows != UINT32_MAX) {\n        if (segment->rows > rsi.height)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment contains more rows than stated in header\");\n        height = segment->rows;\n    }\n\n    /* 7.4.6.2 */\n    seg_flags = segment_data[17];\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"segment flags = %02x\", seg_flags);\n    if ((seg_flags & 1) && (seg_flags & 6))\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"MMR is 1, but GBTEMPLATE is not 0\");\n\n    /* 7.4.6.3 */\n    if (!(seg_flags & 1)) {\n        gbat_bytes = (seg_flags & 6) ? 2 : 8;\n        if (18 + gbat_bytes > segment->data_length)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n        memcpy(gbat, segment_data + 18, gbat_bytes);\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"gbat: %d, %d\", gbat[0], gbat[1]);\n    }\n\n    offset = 18 + gbat_bytes;\n\n    /* Check for T.88 amendment 2 */\n    if ((seg_flags >> 5) & 1)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment uses 12 adaptive template pixels (NYI)\");\n\n    /* Table 34 */\n    params.MMR = seg_flags & 1;\n    params.GBTEMPLATE = (seg_flags & 6) >> 1;\n    params.TPGDON = (seg_flags & 8) >> 3;\n    params.USESKIP = 0;\n    memcpy(params.gbat, gbat, gbat_bytes);\n\n    if (page->height == 0xffffffff && page->striped && page->stripe_size > 0) {\n        if (rsi.y >= page->end_row + page->stripe_size) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"ignoring %u x %u region at (%u, %u) outside of stripe at row %u covering %u rows, on page of height %u\", rsi.width, rsi.height, rsi.x, rsi.y, page->end_row, page->stripe_size, page->image->height);\n            return 0;\n        }\n        if (height > page->end_row + page->stripe_size) {\n            height = page->end_row + page->stripe_size;\n        }\n    } else {\n        if (rsi.y >= page->height) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"ignoring %u x %u region at (%u, %u) outside of page of height %u\", rsi.width, rsi.height, rsi.x, rsi.y, page->height);\n            return 0;\n        }\n        if (height > page->height - rsi .y) {\n            height = page->height - rsi.y;\n        }\n    }\n    if (height == 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"nothing remains of region, ignoring\");\n        return 0;\n    }\n\n    image = jbig2_image_new(ctx, rsi.width, height);\n    if (image == NULL)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate generic image\");\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"allocated %d x %d image buffer for region decode results\", rsi.width, height);\n\n    if (params.MMR) {\n        code = jbig2_decode_generic_mmr(ctx, segment, &params, segment_data + offset, segment->data_length - offset, image);\n        if (code < 0) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode MMR-coded generic region\");\n            goto cleanup;\n        }\n    } else {\n        int stats_size = jbig2_generic_stats_size(ctx, params.GBTEMPLATE);\n\n        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GB_stats == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate arithmetic decoder states when handling immediate generic region\");\n            goto cleanup;\n        }\n        memset(GB_stats, 0, stats_size);\n\n        ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);\n        if (ws == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocated word stream when handling immediate generic region\");\n            goto cleanup;\n        }\n        as = jbig2_arith_new(ctx, ws);\n        if (as == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding state when handling immediate generic region\");\n            goto cleanup;\n        }\n        code = jbig2_decode_generic_region(ctx, segment, &params, as, image, GB_stats);\n        if (code < 0) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode immediate generic region\");\n            goto cleanup;\n        }\n    }\n\n    code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, rsi.x, rsi.y, rsi.op);\n    if (code < 0)\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to add result to page\");\n\ncleanup:\n    jbig2_free(ctx->allocator, as);\n    jbig2_word_stream_buf_free(ctx, ws);\n    jbig2_free(ctx->allocator, GB_stats);\n    jbig2_image_release(ctx, image);\n\n    return code;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_halftone.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* JBIG2 Pattern Dictionary and Halftone Region decoding */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <string.h>             /* memset() */\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_halftone.h\"\n#include \"jbig2_mmr.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_segment.h\"\n\n/**\n * jbig2_hd_new: create a new dictionary from a collective bitmap\n */\nstatic Jbig2PatternDict *\njbig2_hd_new(Jbig2Ctx *ctx, const Jbig2PatternDictParams *params, Jbig2Image *image)\n{\n    Jbig2PatternDict *new;\n    const uint32_t N = params->GRAYMAX + 1;\n    const uint32_t HPW = params->HDPW;\n    const uint32_t HPH = params->HDPH;\n    int code;\n    uint32_t i, j;\n\n    if (N == 0) {\n        /* We've wrapped. */\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"params->GRAYMAX out of range\");\n        return NULL;\n    }\n\n    /* allocate a new struct */\n    new = jbig2_new(ctx, Jbig2PatternDict, 1);\n    if (new != NULL) {\n        new->patterns = jbig2_new(ctx, Jbig2Image *, N);\n        if (new->patterns == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate pattern in collective bitmap dictionary\");\n            jbig2_free(ctx->allocator, new);\n            return NULL;\n        }\n        new->n_patterns = N;\n        new->HPW = HPW;\n        new->HPH = HPH;\n\n        /* 6.7.5(4) - copy out the individual pattern images */\n        for (i = 0; i < N; i++) {\n            new->patterns[i] = jbig2_image_new(ctx, HPW, HPH);\n            if (new->patterns[i] == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate pattern element image\");\n                /* new->patterns[i] above did not succeed, so releasing patterns 0..i-1 is enough */\n                for (j = 0; j < i; j++)\n                    jbig2_image_release(ctx, new->patterns[j]);\n                jbig2_free(ctx->allocator, new->patterns);\n                jbig2_free(ctx->allocator, new);\n                return NULL;\n            }\n            /* compose with the REPLACE operator; the source\n               will be clipped to the destination, selecting the\n               proper sub image */\n            code = jbig2_image_compose(ctx, new->patterns[i], image, -i * (int32_t) HPW, 0, JBIG2_COMPOSE_REPLACE);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to compose image into collective bitmap dictionary\");\n                /* new->patterns[i] above succeeded, so release all patterns 0..i */\n                for (j = 0; j <= i; j++)\n                    jbig2_image_release(ctx, new->patterns[j]);\n                jbig2_free(ctx->allocator, new->patterns);\n                jbig2_free(ctx->allocator, new);\n                return NULL;\n            }\n        }\n    } else {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate collective bitmap dictionary\");\n    }\n\n    return new;\n}\n\n/**\n * jbig2_hd_release: release a pattern dictionary\n */\nvoid\njbig2_hd_release(Jbig2Ctx *ctx, Jbig2PatternDict *dict)\n{\n    int i;\n\n    if (dict == NULL)\n        return;\n    if (dict->patterns != NULL)\n        for (i = 0; i < dict->n_patterns; i++)\n            jbig2_image_release(ctx, dict->patterns[i]);\n    jbig2_free(ctx->allocator, dict->patterns);\n    jbig2_free(ctx->allocator, dict);\n}\n\n/**\n * jbig2_decode_pattern_dict: decode pattern dictionary data\n *\n * @ctx: jbig2 decoder context\n * @segment: jbig2 segment (header) structure\n * @params: parameters from the pattern dictionary header\n * @data: pointer to text region data to be decoded\n * @size: length of text region data\n * @GB_stats: arithmetic coding context to use\n *\n * Implements the pattern dictionary decoding procedure\n * described in section 6.7 of the JBIG2 spec.\n *\n * returns: a pointer to the resulting dictionary on success\n * returns: 0 on failure\n **/\nstatic Jbig2PatternDict *\njbig2_decode_pattern_dict(Jbig2Ctx *ctx, Jbig2Segment *segment,\n                          const Jbig2PatternDictParams *params, const byte *data, const size_t size, Jbig2ArithCx *GB_stats)\n{\n    Jbig2PatternDict *hd = NULL;\n    Jbig2Image *image = NULL;\n    Jbig2GenericRegionParams rparams;\n    int code = 0;\n\n    /* allocate the collective image */\n    image = jbig2_image_new(ctx, params->HDPW * (params->GRAYMAX + 1), params->HDPH);\n    if (image == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate collective bitmap for halftone dictionary\");\n        return NULL;\n    }\n\n    /* fill out the generic region decoder parameters */\n    rparams.MMR = params->HDMMR;\n    rparams.GBTEMPLATE = params->HDTEMPLATE;\n    rparams.TPGDON = 0;         /* not used if HDMMR = 1 */\n    rparams.USESKIP = 0;\n    rparams.gbat[0] = -(int8_t) params->HDPW;\n    rparams.gbat[1] = 0;\n    rparams.gbat[2] = -3;\n    rparams.gbat[3] = -1;\n    rparams.gbat[4] = 2;\n    rparams.gbat[5] = -2;\n    rparams.gbat[6] = -2;\n    rparams.gbat[7] = -2;\n\n    if (params->HDMMR) {\n        code = jbig2_decode_generic_mmr(ctx, segment, &rparams, data, size, image);\n    } else {\n        Jbig2WordStream *ws = jbig2_word_stream_buf_new(ctx, data, size);\n\n        if (ws != NULL) {\n            Jbig2ArithState *as = jbig2_arith_new(ctx, ws);\n\n            if (as != NULL) {\n                code = jbig2_decode_generic_region(ctx, segment, &rparams, as, image, GB_stats);\n            } else {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding state when handling halftone dictionary\");\n            }\n\n            jbig2_free(ctx->allocator, as);\n            jbig2_word_stream_buf_free(ctx, ws);\n        } else {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate word stream when handling halftone dictionary\");\n        }\n    }\n\n    if (code == 0)\n        hd = jbig2_hd_new(ctx, params, image);\n    else\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode immediate generic region\");\n    jbig2_image_release(ctx, image);\n\n    return hd;\n}\n\n/* 7.4.4 */\nint\njbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    Jbig2PatternDictParams params;\n    Jbig2ArithCx *GB_stats = NULL;\n    byte flags;\n    int offset = 0;\n\n    /* 7.4.4.1 - Data header */\n    if (segment->data_length < 7) {\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n    }\n    flags = segment_data[0];\n    params.HDMMR = flags & 1;\n    params.HDTEMPLATE = (flags & 6) >> 1;\n    params.HDPW = segment_data[1];\n    params.HDPH = segment_data[2];\n    params.GRAYMAX = jbig2_get_uint32(segment_data + 3);\n    offset += 7;\n\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"pattern dictionary, flags=%02x, %d grays (%dx%d cell)\", flags, params.GRAYMAX + 1, params.HDPW, params.HDPH);\n\n    if (params.HDMMR && params.HDTEMPLATE) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"HDTEMPLATE is %d when HDMMR is %d, contrary to spec\", params.HDTEMPLATE, params.HDMMR);\n    }\n    if (flags & 0xf8) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"reserved flag bits non-zero\");\n    }\n\n    /* 7.4.4.2 */\n    if (!params.HDMMR) {\n        /* allocate and zero arithmetic coding stats */\n        int stats_size = jbig2_generic_stats_size(ctx, params.HDTEMPLATE);\n\n        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GB_stats == NULL)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding state when handling pattern dictionary\");\n        memset(GB_stats, 0, stats_size);\n    }\n\n    segment->result = jbig2_decode_pattern_dict(ctx, segment, &params, segment_data + offset, segment->data_length - offset, GB_stats);\n\n    /* todo: retain GB_stats? */\n    if (!params.HDMMR) {\n        jbig2_free(ctx->allocator, GB_stats);\n    }\n\n    return (segment->result != NULL) ? 0 : -1;\n}\n\n/**\n * jbig2_decode_gray_scale_image: decode gray-scale image\n *\n * @ctx: jbig2 decoder context\n * @segment: jbig2 segment (header) structure\n * @data: pointer to text region data to be decoded\n * @size: length of text region data\n * @GSMMR: if MMR is used\n * @GSW: width of gray-scale image\n * @GSH: height of gray-scale image\n * @GSBPP: number of bitplanes/Jbig2Images to use\n * @GSKIP: mask indicating which values should be skipped\n * @GSTEMPLATE: template used to code the gray-scale bitplanes\n * @GB_stats: arithmetic coding context to use\n *\n * Implements the decoding a gray-scale image described in\n * annex C.5. This is part of the halftone region decoding.\n *\n * returns: array of gray-scale values with GSW x GSH width/height\n *          0 on failure\n **/\nstatic uint16_t **\njbig2_decode_gray_scale_image(Jbig2Ctx *ctx, Jbig2Segment *segment,\n                              const byte *data, const size_t size,\n                              bool GSMMR, uint32_t GSW, uint32_t GSH,\n                              uint32_t GSBPP, bool GSUSESKIP, Jbig2Image *GSKIP, int GSTEMPLATE, Jbig2ArithCx *GB_stats)\n{\n    uint16_t **GSVALS = NULL;\n    size_t consumed_bytes = 0;\n    uint32_t i, j, stride, x, y;\n    int code;\n    Jbig2Image **GSPLANES;\n    Jbig2GenericRegionParams rparams;\n    Jbig2WordStream *ws = NULL;\n    Jbig2ArithState *as = NULL;\n\n    /* allocate GSPLANES */\n    GSPLANES = jbig2_new(ctx, Jbig2Image *, GSBPP);\n    if (GSPLANES == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate %d bytes for GSPLANES\", GSBPP);\n        return NULL;\n    }\n\n    for (i = 0; i < GSBPP; ++i) {\n        GSPLANES[i] = jbig2_image_new(ctx, GSW, GSH);\n        if (GSPLANES[i] == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate %dx%d image for GSPLANES\", GSW, GSH);\n            /* free already allocated */\n            for (j = i; j > 0;)\n                jbig2_image_release(ctx, GSPLANES[--j]);\n            jbig2_free(ctx->allocator, GSPLANES);\n            return NULL;\n        }\n    }\n\n    /* C.5 step 1. Decode GSPLANES[GSBPP-1] */\n    /* fill generic region decoder parameters */\n    rparams.MMR = GSMMR;\n    rparams.GBTEMPLATE = GSTEMPLATE;\n    rparams.TPGDON = 0;\n    rparams.USESKIP = GSUSESKIP;\n    rparams.SKIP = GSKIP;\n    rparams.gbat[0] = (GSTEMPLATE <= 1 ? 3 : 2);\n    rparams.gbat[1] = -1;\n    rparams.gbat[2] = -3;\n    rparams.gbat[3] = -1;\n    rparams.gbat[4] = 2;\n    rparams.gbat[5] = -2;\n    rparams.gbat[6] = -2;\n    rparams.gbat[7] = -2;\n\n    if (GSMMR) {\n        code = jbig2_decode_halftone_mmr(ctx, &rparams, data, size, GSPLANES[GSBPP - 1], &consumed_bytes);\n    } else {\n        ws = jbig2_word_stream_buf_new(ctx, data, size);\n        if (ws == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate word stream when decoding gray scale image\");\n            goto cleanup;\n        }\n\n        as = jbig2_arith_new(ctx, ws);\n        if (as == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding state when decoding gray scale image\");\n            goto cleanup;\n        }\n\n        code = jbig2_decode_generic_region(ctx, segment, &rparams, as, GSPLANES[GSBPP - 1], GB_stats);\n    }\n    if (code < 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"error decoding GSPLANES for halftone image\");\n        goto cleanup;\n    }\n\n    /* C.5 step 2. Set j = GSBPP-2 */\n    j = GSBPP - 1;\n    /* C.5 step 3. decode loop */\n    while (j > 0) {\n        j--;\n        /*  C.5 step 3. (a) */\n        if (GSMMR) {\n            code = jbig2_decode_halftone_mmr(ctx, &rparams, data + consumed_bytes, size - consumed_bytes, GSPLANES[j], &consumed_bytes);\n        } else {\n            code = jbig2_decode_generic_region(ctx, segment, &rparams, as, GSPLANES[j], GB_stats);\n        }\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode GSPLANES for halftone image\");\n            goto cleanup;\n        }\n\n        /* C.5 step 3. (b):\n         * for each [x,y]\n         * GSPLANES[j][x][y] = GSPLANES[j+1][x][y] XOR GSPLANES[j][x][y] */\n        stride = GSPLANES[j]->stride;\n        for (i = 0; i < stride * GSH; ++i)\n            GSPLANES[j]->data[i] ^= GSPLANES[j + 1]->data[i];\n\n        /*  C.5 step 3. (c) */\n    }\n\n    /* allocate GSVALS */\n    GSVALS = jbig2_new(ctx, uint16_t *, GSW);\n    if (GSVALS == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate GSVALS: %d bytes\", GSW);\n        goto cleanup;\n    }\n    for (i = 0; i < GSW; ++i) {\n        GSVALS[i] = jbig2_new(ctx, uint16_t, GSH);\n        if (GSVALS[i] == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate GSVALS: %d bytes\", GSH * GSW);\n            /* free already allocated */\n            for (j = i; j > 0;)\n                jbig2_free(ctx->allocator, GSVALS[--j]);\n            jbig2_free(ctx->allocator, GSVALS);\n            GSVALS = NULL;\n            goto cleanup;\n        }\n    }\n\n    /*  C.5 step 4.  */\n    for (x = 0; x < GSW; ++x) {\n        for (y = 0; y < GSH; ++y) {\n            GSVALS[x][y] = 0;\n\n            for (j = 0; j < GSBPP; ++j)\n                GSVALS[x][y] += jbig2_image_get_pixel(GSPLANES[j], x, y) << j;\n        }\n    }\n\ncleanup:\n    /* free memory */\n    if (!GSMMR) {\n        jbig2_free(ctx->allocator, as);\n        jbig2_word_stream_buf_free(ctx, ws);\n    }\n    for (i = 0; i < GSBPP; ++i)\n        jbig2_image_release(ctx, GSPLANES[i]);\n\n    jbig2_free(ctx->allocator, GSPLANES);\n\n    return GSVALS;\n}\n\n/**\n * jbig2_decode_ht_region_get_hpats: get pattern dictionary\n *\n * @ctx: jbig2 decoder context\n * @segment: jbig2 halftone region segment\n *\n * Returns the first referred pattern dictionary of segment\n *\n * returns: pattern dictionary\n *          0 if search failed\n **/\nstatic Jbig2PatternDict *\njbig2_decode_ht_region_get_hpats(Jbig2Ctx *ctx, Jbig2Segment *segment)\n{\n    int index = 0;\n    Jbig2PatternDict *pattern_dict = NULL;\n    Jbig2Segment *rsegment = NULL;\n\n    /* loop through all referred segments */\n    while (!pattern_dict && segment->referred_to_segment_count > index) {\n        rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]);\n        if (rsegment) {\n            /* segment type is pattern dictionary and result is not empty */\n            if ((rsegment->flags & 0x3f) == 16 && rsegment->result) {\n                pattern_dict = (Jbig2PatternDict *) rsegment->result;\n                return pattern_dict;\n            }\n        }\n        index++;\n    }\n    return pattern_dict;\n}\n\n/**\n * jbig2_decode_halftone_region: decode a halftone region\n *\n * @ctx: jbig2 decoder context\n * @segment: jbig2 halftone region segment\n * @params: parameters\n * @data: pointer to halftone region data to be decoded\n * @size: length of halftone region data\n * @GB_stats: arithmetic coding context to use\n *\n * Implements the halftone region decoding procedure\n * described in section 6.6.5 of the JBIG2 spec.\n *\n * returns: 0 on success\n *         <0 on failure\n **/\nstatic int\njbig2_decode_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment,\n                             Jbig2HalftoneRegionParams *params, const byte *data, const size_t size, Jbig2Image *image, Jbig2ArithCx *GB_stats)\n{\n    uint32_t HBPP;\n    uint32_t HNUMPATS;\n    uint16_t **GI = NULL;\n    Jbig2Image *HSKIP = NULL;\n    Jbig2PatternDict *HPATS;\n    uint32_t i;\n    uint32_t mg, ng;\n    uint16_t gray_val;\n    int code = 0;\n\n    /* We need the patterns used in this region, get them from the referred pattern dictionary */\n    HPATS = jbig2_decode_ht_region_get_hpats(ctx, segment);\n    if (!HPATS) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"no pattern dictionary found, skipping halftone image\");\n        goto cleanup;\n    }\n\n    /* 6.6.5 point 1. Fill bitmap with HDEFPIXEL */\n    memset(image->data, params->HDEFPIXEL, image->stride * image->height);\n\n    /* 6.6.5 point 2. compute HSKIP according to 6.6.5.1 */\n    if (params->HENABLESKIP == 1) {\n        HSKIP = jbig2_image_new(ctx, params->HGW, params->HGH);\n        if (HSKIP == NULL)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate skip image\");\n\n        for (mg = 0; mg < params->HGH; ++mg) {\n            for (ng = 0; ng < params->HGW; ++ng) {\n                int64_t x = ((int64_t) params->HGX + mg * params->HRY + ng * params->HRX) >> 8;\n                int64_t y = ((int64_t) params->HGY + mg * params->HRX - ng * params->HRY) >> 8;\n\n                if (x + HPATS->HPW <= 0 || x >= image->width || y + HPATS->HPH <= 0 || y >= image->height) {\n                    jbig2_image_set_pixel(HSKIP, ng, mg, 1);\n                } else {\n                    jbig2_image_set_pixel(HSKIP, ng, mg, 0);\n                }\n            }\n        }\n    }\n\n    /* 6.6.5 point 3. set HBPP to ceil(log2(HNUMPATS)): */\n    HNUMPATS = HPATS->n_patterns;\n    HBPP = 0;\n    while (HNUMPATS > (1U << ++HBPP));\n    if (HBPP > 16) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"HBPP is larger than supported (%u)\", HBPP);\n        goto cleanup;\n    }\n\n    /* 6.6.5 point 4. decode gray-scale image as mentioned in annex C */\n    GI = jbig2_decode_gray_scale_image(ctx, segment, data, size,\n                                       params->HMMR, params->HGW, params->HGH, HBPP, params->HENABLESKIP, HSKIP, params->HTEMPLATE, GB_stats);\n    if (!GI) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to acquire gray-scale image, skipping halftone image\");\n        goto cleanup;\n    }\n\n    /* 6.6.5 point 5. place patterns with procedure mentioned in 6.6.5.2 */\n    for (mg = 0; mg < params->HGH; ++mg) {\n        for (ng = 0; ng < params->HGW; ++ng) {\n            int64_t x = ((int64_t) params->HGX + mg * params->HRY + ng * params->HRX) >> 8;\n            int64_t y = ((int64_t) params->HGY + mg * params->HRX - ng * params->HRY) >> 8;\n\n            /* prevent pattern index >= HNUMPATS */\n            gray_val = GI[ng][mg];\n            if (gray_val >= HNUMPATS) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"gray-scale index %d out of range, using largest index\", gray_val);\n                /* use highest available pattern */\n                gray_val = HNUMPATS - 1;\n            }\n            code = jbig2_image_compose(ctx, image, HPATS->patterns[gray_val], x, y, params->HCOMBOP);\n            if (code < 0) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to compose pattern with gray-scale image\");\n                goto cleanup;\n            }\n        }\n    }\n\ncleanup:\n    if (GI) {\n        for (i = 0; i < params->HGW; ++i) {\n            jbig2_free(ctx->allocator, GI[i]);\n        }\n    }\n    jbig2_free(ctx->allocator, GI);\n    jbig2_image_release(ctx, HSKIP);\n\n    return code;\n}\n\n/**\n * jbig2_halftone_region: read a halftone region segment header\n **/\nint\njbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    int offset = 0;\n    Jbig2RegionSegmentInfo region_info;\n    Jbig2HalftoneRegionParams params;\n    Jbig2Image *image = NULL;\n    Jbig2ArithCx *GB_stats = NULL;\n    int code = 0;\n\n    /* 7.4.5.1 */\n    if (segment->data_length < 17)\n        goto too_short;\n    jbig2_get_region_segment_info(&region_info, segment_data);\n    offset += 17;\n\n    if (segment->data_length < 18)\n        goto too_short;\n\n    /* 7.4.5.1.1 Figure 42 */\n    params.flags = segment_data[offset];\n    params.HMMR = params.flags & 1;\n    params.HTEMPLATE = (params.flags & 6) >> 1;\n    params.HENABLESKIP = (params.flags & 8) >> 3;\n    params.HCOMBOP = (Jbig2ComposeOp)((params.flags & 0x70) >> 4);\n    params.HDEFPIXEL = (params.flags & 0x80) >> 7;\n    offset += 1;\n\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"halftone region: %u x %u @ (%u, %u), flags = %02x\", region_info.width, region_info.height, region_info.x, region_info.y, params.flags);\n\n    if (params.HMMR && params.HTEMPLATE) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"HTEMPLATE is %d when HMMR is %d, contrary to spec\", params.HTEMPLATE, params.HMMR);\n    }\n    if (params.HMMR && params.HENABLESKIP) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"HENABLESKIP is %d when HMMR is %d, contrary to spec\", params.HENABLESKIP, params.HMMR);\n    }\n\n    /* 7.4.5.1.2 Figure 43 */\n    if (segment->data_length - offset < 16)\n        goto too_short;\n    params.HGW = jbig2_get_uint32(segment_data + offset);\n    params.HGH = jbig2_get_uint32(segment_data + offset + 4);\n    params.HGX = jbig2_get_int32(segment_data + offset + 8);\n    params.HGY = jbig2_get_int32(segment_data + offset + 12);\n    offset += 16;\n\n    /* 7.4.5.1.3 Figure 44 */\n    if (segment->data_length - offset < 4)\n        goto too_short;\n    params.HRX = jbig2_get_uint16(segment_data + offset);\n    params.HRY = jbig2_get_uint16(segment_data + offset + 2);\n    offset += 4;\n\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"grid %d x %d @ (%d.%d,%d.%d) vector (%d.%d,%d.%d)\",\n                params.HGW, params.HGH,\n                params.HGX >> 8, params.HGX & 0xff,\n                params.HGY >> 8, params.HGY & 0xff,\n                params.HRX >> 8, params.HRX & 0xff,\n                params.HRY >> 8, params.HRY & 0xff);\n\n    /* 7.4.5.2 */\n    if (!params.HMMR) {\n        /* allocate and zero arithmetic coding stats */\n        int stats_size = jbig2_generic_stats_size(ctx, params.HTEMPLATE);\n\n        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GB_stats == NULL) {\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate arithmetic decoder states in halftone region\");\n        }\n        memset(GB_stats, 0, stats_size);\n    }\n\n    image = jbig2_image_new(ctx, region_info.width, region_info.height);\n    if (image == NULL) {\n        jbig2_free(ctx->allocator, GB_stats);\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate halftone image\");\n    }\n\n    code = jbig2_decode_halftone_region(ctx, segment, &params, segment_data + offset, segment->data_length - offset, image, GB_stats);\n    if (code < 0) {\n        jbig2_image_release(ctx, image);\n        jbig2_free(ctx->allocator, GB_stats);\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode halftone region\");\n    }\n\n    /* todo: retain GB_stats? */\n    if (!params.HMMR) {\n        jbig2_free(ctx->allocator, GB_stats);\n    }\n\n    code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, region_info.x, region_info.y, region_info.op);\n    if (code < 0) {\n        jbig2_image_release(ctx, image);\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to add halftone region to page\");\n    }\n\n    jbig2_image_release(ctx, image);\n\n    return code;\n\ntoo_short:\n    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_huffman.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* Huffman table decoding procedures\n    -- See Annex B of the JBIG2 specification */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef JBIG2_DEBUG\n#include <stdio.h>\n#endif\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_huffman.h\"\n#include \"jbig2_hufftab.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_segment.h\"\n\n#define JBIG2_HUFFMAN_FLAGS_ISOOB 1\n#define JBIG2_HUFFMAN_FLAGS_ISLOW 2\n#define JBIG2_HUFFMAN_FLAGS_ISEXT 4\n\nstruct _Jbig2HuffmanState {\n    /* The current bit offset is equal to (offset * 8) + offset_bits.\n       The MSB of this_word is the current bit offset. The MSB of next_word\n       is (offset + 4) * 8. */\n    uint32_t this_word;\n    uint32_t next_word;\n    uint32_t offset_bits;\n    uint32_t offset;\n    uint32_t offset_limit;\n\n    Jbig2WordStream *ws;\n    Jbig2Ctx *ctx;\n};\n\n#define huff_get_next_word(hs, offset, word) \\\n    (hs)->ws->get_next_word((hs)->ctx, (hs)->ws, (offset), (word))\n\n/** Allocate and initialize a new huffman coding state\n *  the returned pointer can simply be freed; this does\n *  not affect the associated Jbig2WordStream.\n */\nJbig2HuffmanState *\njbig2_huffman_new(Jbig2Ctx *ctx, Jbig2WordStream *ws)\n{\n    Jbig2HuffmanState *result = NULL;\n    int code;\n\n    result = jbig2_new(ctx, Jbig2HuffmanState, 1);\n\n    if (result != NULL) {\n        result->offset = 0;\n        result->offset_bits = 0;\n        result->offset_limit = 0;\n        result->ws = ws;\n        result->ctx = ctx;\n        code = huff_get_next_word(result, 0, &result->this_word);\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read first huffman word\");\n            jbig2_huffman_free(ctx, result);\n            return NULL;\n        }\n        code = huff_get_next_word(result, 4, &result->next_word);\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read second huffman word\");\n            jbig2_huffman_free(ctx, result);\n            return NULL;\n        }\n    } else {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate new huffman coding state\");\n        return NULL;\n    }\n\n    return result;\n}\n\n/** Free an allocated huffman coding state.\n *  This just calls jbig2_free() if the pointer is not NULL\n */\nvoid\njbig2_huffman_free(Jbig2Ctx *ctx, Jbig2HuffmanState *hs)\n{\n    jbig2_free(ctx->allocator, hs);\n}\n\n/** debug routines **/\n#ifdef JBIG2_DEBUG\n\n/** print current huffman state */\nvoid\njbig2_dump_huffman_state(Jbig2HuffmanState *hs)\n{\n    fprintf(stderr, \"huffman state %08x %08x offset %d.%d\\n\", hs->this_word, hs->next_word, hs->offset, hs->offset_bits);\n}\n\n/** print the binary string we're reading from */\nvoid\njbig2_dump_huffman_binary(Jbig2HuffmanState *hs)\n{\n    const uint32_t word = hs->this_word;\n    int i;\n\n    fprintf(stderr, \"huffman binary \");\n    for (i = 31; i >= 0; i--)\n        fprintf(stderr, ((word >> i) & 1) ? \"1\" : \"0\");\n    fprintf(stderr, \"\\n\");\n}\n\n/** print huffman table */\nvoid\njbig2_dump_huffman_table(const Jbig2HuffmanTable *table)\n{\n    int i;\n    int table_size = (1 << table->log_table_size);\n\n    fprintf(stderr, \"huffman table %p (log_table_size=%d, %d entries, entries=%p):\\n\", table, table->log_table_size, table_size, table->entries);\n    for (i = 0; i < table_size; i++) {\n        fprintf(stderr, \"%6d: PREFLEN=%d, RANGELEN=%d, \", i, table->entries[i].PREFLEN, table->entries[i].RANGELEN);\n        if (table->entries[i].flags & JBIG2_HUFFMAN_FLAGS_ISEXT) {\n            fprintf(stderr, \"ext=%p\", table->entries[i].u.ext_table);\n        } else {\n            fprintf(stderr, \"RANGELOW=%d\", table->entries[i].u.RANGELOW);\n        }\n        if (table->entries[i].flags) {\n            int need_comma = 0;\n\n            fprintf(stderr, \", flags=0x%x(\", table->entries[i].flags);\n            if (table->entries[i].flags & JBIG2_HUFFMAN_FLAGS_ISOOB) {\n                fprintf(stderr, \"OOB\");\n                need_comma = 1;\n            }\n            if (table->entries[i].flags & JBIG2_HUFFMAN_FLAGS_ISLOW) {\n                if (need_comma)\n                    fprintf(stderr, \",\");\n                fprintf(stderr, \"LOW\");\n                need_comma = 1;\n            }\n            if (table->entries[i].flags & JBIG2_HUFFMAN_FLAGS_ISEXT) {\n                if (need_comma)\n                    fprintf(stderr, \",\");\n                fprintf(stderr, \"EXT\");\n            }\n            fprintf(stderr, \")\");\n        }\n        fprintf(stderr, \"\\n\");\n    }\n    fprintf(stderr, \"\\n\");\n}\n\n#endif /* JBIG2_DEBUG */\n\n/** Skip bits up to the next byte boundary\n */\nint\njbig2_huffman_skip(Jbig2HuffmanState *hs)\n{\n    uint32_t bits = hs->offset_bits & 7;\n    int code;\n\n    if (bits) {\n        bits = 8 - bits;\n        hs->offset_bits += bits;\n        hs->this_word = (hs->this_word << bits) | (hs->next_word >> (32 - hs->offset_bits));\n    }\n\n    if (hs->offset_bits >= 32) {\n        hs->this_word = hs->next_word;\n        hs->offset += 4;\n        code = huff_get_next_word(hs, hs->offset + 4, &hs->next_word);\n        if (code < 0) {\n            return jbig2_error(hs->ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to read next huffman word when skipping\");\n        }\n        hs->offset_bits -= 32;\n        if (hs->offset_bits) {\n            hs->this_word = (hs->this_word << hs->offset_bits) | (hs->next_word >> (32 - hs->offset_bits));\n        }\n    }\n    return 0;\n}\n\n/* skip ahead a specified number of bytes in the word stream\n */\nint\njbig2_huffman_advance(Jbig2HuffmanState *hs, size_t advance)\n{\n    int code;\n    hs->offset += advance & ~3;\n    hs->offset_bits += (advance & 3) << 3;\n    if (hs->offset_bits >= 32) {\n        hs->offset += 4;\n        hs->offset_bits -= 32;\n    }\n    code = huff_get_next_word(hs, hs->offset, &hs->this_word);\n    if (code < 0) {\n        return jbig2_error(hs->ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to get first huffman word after advancing\");\n    }\n    code = huff_get_next_word(hs, hs->offset + 4, &hs->next_word);\n    if (code < 0) {\n        return jbig2_error(hs->ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to get second huffman word after advancing\");\n    }\n    if (hs->offset_bits > 0)\n        hs->this_word = (hs->this_word << hs->offset_bits) | (hs->next_word >> (32 - hs->offset_bits));\n    return 0;\n}\n\n/* return the offset of the huffman decode pointer (in bytes)\n * from the beginning of the WordStream\n */\nuint32_t\njbig2_huffman_offset(Jbig2HuffmanState *hs)\n{\n    return hs->offset + (hs->offset_bits >> 3);\n}\n\n/* read a number of bits directly from the huffman state\n * without decoding against a table\n */\nint32_t\njbig2_huffman_get_bits(Jbig2HuffmanState *hs, const int bits, int *err)\n{\n    uint32_t this_word = hs->this_word;\n    int32_t result;\n    int code;\n\n    if (hs->offset_limit && hs->offset >= hs->offset_limit) {\n        *err = -1;\n        return jbig2_error(hs->ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"end of jbig2 buffer reached at offset %d\", hs->offset);\n    }\n\n    result = this_word >> (32 - bits);\n    hs->offset_bits += bits;\n    if (hs->offset_bits >= 32) {\n        hs->offset += 4;\n        hs->offset_bits -= 32;\n        hs->this_word = hs->next_word;\n        code = huff_get_next_word(hs, hs->offset + 4, &hs->next_word);\n        if (code < 0) {\n            return jbig2_error(hs->ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to get next huffman word\");\n        }\n        if (hs->offset_bits) {\n            hs->this_word = (hs->this_word << hs->offset_bits) | (hs->next_word >> (32 - hs->offset_bits));\n        } else {\n            hs->this_word = (hs->this_word << hs->offset_bits);\n        }\n    } else {\n        hs->this_word = (this_word << bits) | (hs->next_word >> (32 - hs->offset_bits));\n    }\n\n    return result;\n}\n\nint32_t\njbig2_huffman_get(Jbig2HuffmanState *hs, const Jbig2HuffmanTable *table, bool *oob)\n{\n    Jbig2HuffmanEntry *entry;\n    byte flags;\n    int offset_bits = hs->offset_bits;\n    uint32_t this_word = hs->this_word;\n    uint32_t next_word;\n    int RANGELEN;\n    int32_t result;\n\n    if (hs->offset_limit && hs->offset >= hs->offset_limit) {\n        if (oob)\n            *oob = -1;\n        return jbig2_error(hs->ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"end of Jbig2WordStream reached at offset %d\", hs->offset);\n    }\n\n    for (;;) {\n        int log_table_size = table->log_table_size;\n        int PREFLEN;\n        int code;\n\n        /* SumatraPDF: shifting by the size of the operand is undefined */\n        entry = &table->entries[log_table_size > 0 ? this_word >> (32 - log_table_size) : 0];\n        flags = entry->flags;\n        PREFLEN = entry->PREFLEN;\n        if (flags == (byte) -1 || PREFLEN == (byte) -1) {\n            if (oob)\n                *oob = -1;\n            return jbig2_error(hs->ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"encountered unpopulated huffman table entry\");\n        }\n\n        next_word = hs->next_word;\n        offset_bits += PREFLEN;\n        if (offset_bits >= 32) {\n            this_word = next_word;\n            hs->offset += 4;\n            code = huff_get_next_word(hs, hs->offset + 4, &next_word);\n            if (code < 0) {\n                return jbig2_error(hs->ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to get next huffman word\");\n            }\n            offset_bits -= 32;\n            hs->next_word = next_word;\n            PREFLEN = offset_bits;\n        }\n        if (PREFLEN)\n            this_word = (this_word << PREFLEN) | (next_word >> (32 - offset_bits));\n        if (flags & JBIG2_HUFFMAN_FLAGS_ISEXT) {\n            table = entry->u.ext_table;\n        } else\n            break;\n    }\n    result = entry->u.RANGELOW;\n    RANGELEN = entry->RANGELEN;\n    if (RANGELEN > 0) {\n        int32_t HTOFFSET;\n        int code;\n\n        HTOFFSET = this_word >> (32 - RANGELEN);\n        if (flags & JBIG2_HUFFMAN_FLAGS_ISLOW)\n            result -= HTOFFSET;\n        else\n            result += HTOFFSET;\n\n        offset_bits += RANGELEN;\n        if (offset_bits >= 32) {\n            this_word = next_word;\n            hs->offset += 4;\n            code = huff_get_next_word(hs, hs->offset + 4, &next_word);\n            if (code < 0) {\n                return jbig2_error(hs->ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to get next huffman word\");\n            }\n            offset_bits -= 32;\n            hs->next_word = next_word;\n            RANGELEN = offset_bits;\n        }\n        if (RANGELEN)\n            this_word = (this_word << RANGELEN) | (next_word >> (32 - offset_bits));\n    }\n\n    hs->this_word = this_word;\n    hs->offset_bits = offset_bits;\n\n    if (oob != NULL)\n        *oob = (flags & JBIG2_HUFFMAN_FLAGS_ISOOB);\n\n    return result;\n}\n\n/* TODO: more than 8 bits here is wasteful of memory. We have support\n   for sub-trees in jbig2_huffman_get() above, but don't use it here.\n   We should, and then revert to 8 bits */\n#define LOG_TABLE_SIZE_MAX 16\n\n/** Build an in-memory representation of a Huffman table from the\n *  set of template params provided by the spec or a table segment\n */\nJbig2HuffmanTable *\njbig2_build_huffman_table(Jbig2Ctx *ctx, const Jbig2HuffmanParams *params)\n{\n    int *LENCOUNT;\n    int LENMAX = -1;\n    const int lencountcount = 256;\n    const Jbig2HuffmanLine *lines = params->lines;\n    int n_lines = params->n_lines;\n    int i, j;\n    uint32_t max_j;\n    int log_table_size = 0;\n    Jbig2HuffmanTable *result;\n    Jbig2HuffmanEntry *entries;\n    int CURLEN;\n    int firstcode = 0;\n    int CURCODE;\n    int CURTEMP;\n\n    LENCOUNT = jbig2_new(ctx, int, lencountcount);\n\n    if (LENCOUNT == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate huffman histogram\");\n        return NULL;\n    }\n    memset(LENCOUNT, 0, sizeof(int) * lencountcount);\n\n    /* B.3, 1. */\n    for (i = 0; i < params->n_lines; i++) {\n        int PREFLEN = lines[i].PREFLEN;\n        int lts;\n\n        if (PREFLEN > LENMAX) {\n            for (j = LENMAX + 1; j < PREFLEN + 1; j++)\n                LENCOUNT[j] = 0;\n            LENMAX = PREFLEN;\n        }\n        LENCOUNT[PREFLEN]++;\n\n        lts = PREFLEN + lines[i].RANGELEN;\n        if (lts > LOG_TABLE_SIZE_MAX)\n            lts = PREFLEN;\n        if (lts <= LOG_TABLE_SIZE_MAX && log_table_size < lts)\n            log_table_size = lts;\n    }\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"constructing huffman table log size %d\", log_table_size);\n    max_j = 1 << log_table_size;\n\n    result = jbig2_new(ctx, Jbig2HuffmanTable, 1);\n    if (result == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate result\");\n        jbig2_free(ctx->allocator, LENCOUNT);\n        return NULL;\n    }\n    result->log_table_size = log_table_size;\n    entries = jbig2_new(ctx, Jbig2HuffmanEntry, max_j);\n    if (entries == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate result entries\");\n        jbig2_free(ctx->allocator, result);\n        jbig2_free(ctx->allocator, LENCOUNT);\n        return NULL;\n    }\n    /* fill now to catch missing JBIG2Globals later */\n    memset(entries, 0xFF, sizeof(Jbig2HuffmanEntry) * max_j);\n    result->entries = entries;\n\n    LENCOUNT[0] = 0;\n\n    for (CURLEN = 1; CURLEN <= LENMAX; CURLEN++) {\n        int shift = log_table_size - CURLEN;\n\n        /* B.3 3.(a) */\n        firstcode = (firstcode + LENCOUNT[CURLEN - 1]) << 1;\n        CURCODE = firstcode;\n        /* B.3 3.(b) */\n        for (CURTEMP = 0; CURTEMP < n_lines; CURTEMP++) {\n            int PREFLEN = lines[CURTEMP].PREFLEN;\n\n            if (PREFLEN == CURLEN) {\n                int RANGELEN = lines[CURTEMP].RANGELEN;\n                uint32_t start_j = CURCODE << shift;\n                uint32_t end_j = (CURCODE + 1) << shift;\n                uint32_t cur_j;\n                byte eflags = 0;\n\n                if (end_j > max_j) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ran off the end of the entries table! (%d >= %d)\", end_j, max_j);\n                    jbig2_free(ctx->allocator, result->entries);\n                    jbig2_free(ctx->allocator, result);\n                    jbig2_free(ctx->allocator, LENCOUNT);\n                    return NULL;\n                }\n                /* todo: build extension tables */\n                if (params->HTOOB && CURTEMP == n_lines - 1)\n                    eflags |= JBIG2_HUFFMAN_FLAGS_ISOOB;\n                if (CURTEMP == n_lines - (params->HTOOB ? 3 : 2))\n                    eflags |= JBIG2_HUFFMAN_FLAGS_ISLOW;\n                if (PREFLEN + RANGELEN > LOG_TABLE_SIZE_MAX) {\n                    for (cur_j = start_j; cur_j < end_j; cur_j++) {\n                        entries[cur_j].u.RANGELOW = lines[CURTEMP].RANGELOW;\n                        entries[cur_j].PREFLEN = PREFLEN;\n                        entries[cur_j].RANGELEN = RANGELEN;\n                        entries[cur_j].flags = eflags;\n                    }\n                } else {\n                    for (cur_j = start_j; cur_j < end_j; cur_j++) {\n                        int32_t HTOFFSET = (cur_j >> (shift - RANGELEN)) & ((1 << RANGELEN) - 1);\n\n                        if (eflags & JBIG2_HUFFMAN_FLAGS_ISLOW)\n                            entries[cur_j].u.RANGELOW = lines[CURTEMP].RANGELOW - HTOFFSET;\n                        else\n                            entries[cur_j].u.RANGELOW = lines[CURTEMP].RANGELOW + HTOFFSET;\n                        entries[cur_j].PREFLEN = PREFLEN + RANGELEN;\n                        entries[cur_j].RANGELEN = 0;\n                        entries[cur_j].flags = eflags;\n                    }\n                }\n                CURCODE++;\n            }\n        }\n    }\n\n    jbig2_free(ctx->allocator, LENCOUNT);\n\n    return result;\n}\n\n/** Free the memory associated with the representation of table */\nvoid\njbig2_release_huffman_table(Jbig2Ctx *ctx, Jbig2HuffmanTable *table)\n{\n    if (table != NULL) {\n        jbig2_free(ctx->allocator, table->entries);\n        jbig2_free(ctx->allocator, table);\n    }\n}\n\n/* Routines to handle \"code table segment (53)\" */\n\n/* return 'bitlen' bits from 'bitoffset' of 'data' */\nstatic uint32_t\njbig2_table_read_bits(const byte *data, size_t *bitoffset, const int bitlen)\n{\n    uint32_t result = 0;\n    uint32_t byte_offset = *bitoffset / 8;\n    const int endbit = (*bitoffset & 7) + bitlen;\n    const int n_proc_bytes = (endbit + 7) / 8;\n    const int rshift = n_proc_bytes * 8 - endbit;\n    int i;\n\n    for (i = n_proc_bytes - 1; i >= 0; i--) {\n        uint32_t d = data[byte_offset++];\n        const int nshift = i * 8 - rshift;\n\n        if (nshift > 0)\n            d <<= nshift;\n        else if (nshift < 0)\n            d >>= -nshift;\n        result |= d;\n    }\n    result &= ~(-1 << bitlen);\n    *bitoffset += bitlen;\n    return result;\n}\n\n/* Parse a code table segment, store Jbig2HuffmanParams in segment->result */\nint\njbig2_table(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    Jbig2HuffmanParams *params = NULL;\n    Jbig2HuffmanLine *line = NULL;\n\n    segment->result = NULL;\n    if (segment->data_length < 10)\n        goto too_short;\n\n    {\n        /* B.2 1) (B.2.1) Code table flags */\n        const int code_table_flags = segment_data[0];\n        const int HTOOB = code_table_flags & 0x01;      /* Bit 0: HTOOB */\n\n        /* Bits 1-3: Number of bits used in code table line prefix size fields */\n        const int HTPS = (code_table_flags >> 1 & 0x07) + 1;\n\n        /* Bits 4-6: Number of bits used in code table line range size fields */\n        const int HTRS = (code_table_flags >> 4 & 0x07) + 1;\n\n        /* B.2 2) (B.2.2) The lower bound of the first table line in the encoded table */\n        const int32_t HTLOW = jbig2_get_int32(segment_data + 1);\n\n        /* B.2 3) (B.2.3) One larger than the upper bound of\n           the last normal table line in the encoded table */\n        const int32_t HTHIGH = jbig2_get_int32(segment_data + 5);\n\n        /* estimated number of lines in this table, used for allocating memory for lines */\n        const size_t lines_max = (segment->data_length * 8 - HTPS * (HTOOB ? 3 : 2)) / (HTPS + HTRS) + (HTOOB ? 3 : 2);\n\n        /* points to a first table line data */\n        const byte *lines_data = segment_data + 9;\n        const size_t lines_data_bitlen = (segment->data_length - 9) * 8;        /* length in bit */\n\n        /* bit offset: controls bit reading */\n        size_t boffset = 0;\n\n        /* B.2 4) */\n        int32_t CURRANGELOW = HTLOW;\n        size_t NTEMP = 0;\n\n#ifdef JBIG2_DEBUG\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                    \"DECODING USER TABLE... Flags: %d, HTOOB: %d, HTPS: %d, HTRS: %d, HTLOW: %d, HTHIGH: %d\",\n                    code_table_flags, HTOOB, HTPS, HTRS, HTLOW, HTHIGH);\n#endif\n\n        if (HTLOW >= HTHIGH) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"invalid Huffman Table range\");\n            goto error_exit;\n        }\n\n        /* allocate HuffmanParams & HuffmanLine */\n        params = jbig2_new(ctx, Jbig2HuffmanParams, 1);\n        if (params == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate Huffman Table Parameter\");\n            goto error_exit;\n        }\n        line = jbig2_new(ctx, Jbig2HuffmanLine, lines_max);\n        if (line == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate huffman table lines\");\n            goto error_exit;\n        }\n        /* B.2 5) */\n        while (CURRANGELOW < HTHIGH) {\n            /* B.2 5) a) */\n            if (boffset + HTPS >= lines_data_bitlen)\n                goto too_short;\n            line[NTEMP].PREFLEN = jbig2_table_read_bits(lines_data, &boffset, HTPS);\n            /* B.2 5) b) */\n            if (boffset + HTRS >= lines_data_bitlen)\n                goto too_short;\n            line[NTEMP].RANGELEN = jbig2_table_read_bits(lines_data, &boffset, HTRS);\n            /* B.2 5) c) */\n            line[NTEMP].RANGELOW = CURRANGELOW;\n            CURRANGELOW += (1 << line[NTEMP].RANGELEN);\n            NTEMP++;\n        }\n        /* B.2 6), B.2 7) lower range table line */\n        if (boffset + HTPS >= lines_data_bitlen)\n            goto too_short;\n        line[NTEMP].PREFLEN = jbig2_table_read_bits(lines_data, &boffset, HTPS);\n        line[NTEMP].RANGELEN = 32;\n        line[NTEMP].RANGELOW = HTLOW - 1;\n        NTEMP++;\n        /* B.2 8), B.2 9) upper range table line */\n        if (boffset + HTPS >= lines_data_bitlen)\n            goto too_short;\n        line[NTEMP].PREFLEN = jbig2_table_read_bits(lines_data, &boffset, HTPS);\n        line[NTEMP].RANGELEN = 32;\n        line[NTEMP].RANGELOW = HTHIGH;\n        NTEMP++;\n        /* B.2 10) */\n        if (HTOOB) {\n            /* B.2 10) a), B.2 10) b) out-of-bound table line */\n            if (boffset + HTPS >= lines_data_bitlen)\n                goto too_short;\n            line[NTEMP].PREFLEN = jbig2_table_read_bits(lines_data, &boffset, HTPS);\n            line[NTEMP].RANGELEN = 0;\n            line[NTEMP].RANGELOW = 0;\n            NTEMP++;\n        }\n        if (NTEMP != lines_max) {\n            Jbig2HuffmanLine *new_line = jbig2_renew(ctx, line,\n                                                     Jbig2HuffmanLine, NTEMP);\n\n            if (new_line == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to reallocate huffman table lines\");\n                goto error_exit;\n            }\n            line = new_line;\n        }\n        params->HTOOB = HTOOB;\n        params->n_lines = NTEMP;\n        params->lines = line;\n        segment->result = params;\n\n#ifdef JBIG2_DEBUG\n        {\n            int i;\n\n            for (i = 0; i < NTEMP; i++) {\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                            \"Line: %d, PREFLEN: %d, RANGELEN: %d, RANGELOW: %d\",\n                            i, params->lines[i].PREFLEN, params->lines[i].RANGELEN, params->lines[i].RANGELOW);\n            }\n        }\n#endif\n    }\n    return 0;\n\ntoo_short:\n    jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\nerror_exit:\n    jbig2_free(ctx->allocator, line);\n    jbig2_free(ctx->allocator, params);\n    return -1;\n}\n\n/* free Jbig2HuffmanParams allocated by jbig2_huffman_table() */\nvoid\njbig2_table_free(Jbig2Ctx *ctx, Jbig2HuffmanParams *params)\n{\n    if (params != NULL) {\n        jbig2_free(ctx->allocator, (void *)params->lines);\n        jbig2_free(ctx->allocator, params);\n    }\n}\n\n/* find a user supplied table used by 'segment' and by 'index' */\nconst Jbig2HuffmanParams *\njbig2_find_table(Jbig2Ctx *ctx, Jbig2Segment *segment, int index)\n{\n    int i, table_index = 0;\n\n    for (i = 0; i < segment->referred_to_segment_count; i++) {\n        const Jbig2Segment *const rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[i]);\n\n        if (rsegment && (rsegment->flags & 63) == 53) {\n            if (table_index == index)\n                return (const Jbig2HuffmanParams *)rsegment->result;\n            ++table_index;\n        }\n    }\n\n    jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"huffman table not found (%d)\", index);\n    return NULL;\n}\n\n#ifdef TEST\n#include <stdio.h>\n\n/* cc -g -o jbig2_huffman.test1 -DTEST jbig2_huffman.c .libs/libjbig2dec.a */\n\n/* a test bitstream, and a list of the table indices\n   to use in decoding it. 1 = table B.1 (A), 2 = table B.2 (B), and so on */\n/* this test stream should decode to { 8, 5, oob, 8 } */\n\nstatic const byte test_stream[] = { 0xe9, 0xcb, 0xf4, 0x00 };\nstatic const byte test_tabindex[] = { 4, 2, 2, 1 };\n\nstatic int\ntest_get_word1(Jbig2Ctx *ctx, Jbig2WordStream *self, size_t offset, uint32_t *word)\n{\n    uint32_t val = 0;\n    int ret = 0;\n\n    if (self == NULL || word == NULL)\n        return -1;\n    if (offset >= sizeof (test_stream))\n        return 0;\n\n    if (offset < sizeof(test_stream)) {\n        val |= test_stream[offset] << 24;\n        ret++;\n    }\n    if (offset + 1 < sizeof(test_stream)) {\n        val |= test_stream[offset + 1] << 16;\n        ret++;\n    }\n    if (offset + 2 < sizeof(test_stream)) {\n        val |= test_stream[offset + 2] << 8;\n        ret++;\n    }\n    if (offset + 3 < sizeof(test_stream)) {\n        val |= test_stream[offset + 3];\n        ret++;\n    }\n    *word = val;\n    return ret;\n}\n\nstatic int test1()\n{\n    Jbig2Ctx *ctx;\n    Jbig2HuffmanTable *tables[5];\n    Jbig2HuffmanState *hs = NULL;\n    Jbig2WordStream ws;\n    bool oob;\n    int32_t code;\n    int i;\n    int success = 0;\n\n    ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);\n    if (ctx == NULL) {\n        fprintf(stderr, \"Failed to allocate jbig2 context\\n\");\n        goto cleanup;\n    }\n\n    tables[0] = NULL;\n    tables[1] = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_A);\n    tables[2] = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_B);\n    tables[3] = NULL;\n    tables[4] = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_D);\n    if (tables[1] == NULL || tables[2] == NULL || tables[4] == NULL)\n    {\n        fprintf(stderr, \"Failed to build huffman tables\");\n        goto cleanup;\n    }\n\n    ws.get_next_word = test_get_word1;\n    hs = jbig2_huffman_new(ctx, &ws);\n    if (hs == NULL) {\n        fprintf(stderr, \"Failed to allocate huffman state\");\n        goto cleanup;\n    }\n\n    printf(\"testing jbig2 huffman decoding...\");\n    printf(\"\\t(should be 8 5 (oob) 8)\\n\");\n\n    {\n        int i;\n        int sequence_length = sizeof(test_tabindex);\n\n        for (i = 0; i < sequence_length; i++) {\n            code = jbig2_huffman_get(hs, tables[test_tabindex[i]], &oob);\n            if (oob)\n                printf(\"(oob) \");\n            else\n                printf(\"%d \", code);\n        }\n    }\n\n    printf(\"\\n\");\n\n    success = 1;\n\ncleanup:\n    jbig2_huffman_free(ctx, hs);\n    for (i = 0; i < 5; i++)\n        jbig2_release_huffman_table(ctx, tables[i]);\n    jbig2_ctx_free(ctx);\n\n    return success;\n}\n\n#include <stdio.h>\n\n/* a decoding test of each line from each standard table */\n\n/* test code for Table B.1 - Standard Huffman table A */\nconst int32_t test_output_A[] = {\n    /* line 0, PREFLEN=1, RANGELEN=4, VAL=0..15, 0+VAL */\n    0,      /* 0 0000 */\n    1,      /* 0 0001 */\n    14,     /* 0 1110 */\n    15,     /* 0 1111 */\n    /* line 1, PREFLEN=2, RANGELEN=8, VAL=16..271, 10+(VAL-16) */\n    16,     /* 10 00000000 */\n    17,     /* 10 00000001 */\n    270,    /* 10 11111110 */\n    271,    /* 10 11111111 */\n    /* line 2, PREFLEN=3, RANGELEN=16, VAL=272..65807, 110+(VAL-272) */\n    272,    /* 110 00000000 00000000 */\n    273,    /* 110 00000000 00000001 */\n    65806,  /* 110 11111111 11111110 */\n    65807,  /* 110 11111111 11111111 */\n    /* line 3, PREFLEN=3, RANGELEN=32, VAL=65808..INF, 111+(VAL-65808) */\n    65808,  /* 111 00000000 00000000 00000000 00000000 */\n    65809,  /* 111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_A[] = {\n    /* 0000 0000 0101 1100 1111 1000 0000 0010 */\n       0x00,     0x5c,     0xf8,     0x02,\n    /* 0000 0001 1011 1111 1010 1111 1111 1100 */\n       0x01,     0xbf,     0xaf,     0xfc,\n    /* 0000 0000 0000 0001 1000 0000 0000 0000 */\n       0x00,     0x01,     0x80,     0x00,\n    /* 0111 0111 1111 1111 1111 0110 1111 1111 */\n       0x77,     0xff,     0xf6,     0xff,\n    /* 1111 1111 1110 0000 0000 0000 0000 0000 */\n       0xff,     0xe0,     0x00,     0x00,\n    /* 0000 0000 0001 1100 0000 0000 0000 0000 */\n       0x00,     0x1c,     0x00,     0x00,\n    /* 0000 0000 0000 01 */\n       0x00,     0x04,\n};\n\n/* test code for Table B.2 - Standard Huffman table B */\nconst int32_t test_output_B[] = {\n    /* line 0, PREFLEN=1, RANGELEN=0, VAL=0, 0 */\n    0,      /* 0 */\n    /* line 1, PREFLEN=2, RANGELEN=0, VAL=1, 10 */\n    1,      /* 10 */\n    /* line 2, PREFLEN=3, RANGELEN=0, VAL=2, 110 */\n    2,      /* 110 */\n    /* line 3, PREFLEN=4, RANGELEN=3, VAL=3..10, 1110+(VAL-3) */\n    3,      /* 1110 000 */\n    4,      /* 1110 001 */\n    9,      /* 1110 110 */\n    10,     /* 1110 111 */\n    /* line 4, PREFLEN=5, RANGELEN=6, VAL=11..74, 11110+(VAL-11) */\n    11,     /* 11110 000000 */\n    12,     /* 11110 000001 */\n    73,     /* 11110 111110 */\n    74,     /* 11110 111111 */\n    /* line 5, PREFLEN=6, RANGELEN=32, VAL=75..INF, 111110+(VAL-75) */\n    75,     /* 111110 00000000 00000000 00000000 00000000 */\n    76,     /* 111110 00000000 00000000 00000000 00000001 */\n    /* line 6, PREFLEN=6, VAL=OOB, 111111 */\n    /*OOB*/ /* 111111 */\n};\nconst byte test_input_B[] = {\n    /* 0101 1011 1000 0111 0001 1110 1101 1101 */\n       0x5b,     0x87,     0x1e,     0xdd,\n    /* 1111 1100 0000 0111 1000 0001 1111 0111 */\n       0xfc,     0x07,     0x81,     0xf7,\n    /* 1101 1110 1111 1111 1110 0000 0000 0000 */\n       0xde,     0xff,     0xe0,     0x00,\n    /* 0000 0000 0000 0000 0000 1111 1000 0000 */\n       0x00,     0x00,     0x0f,     0x80,\n    /* 0000 0000 0000 0000 0000 0000 0111 1111 */\n       0x00,     0x00,     0x00,     0x7f,\n};\n\n/* test code for Table B.3 - Standard Huffman table C */\nconst int32_t test_output_C[] = {\n    /* line 0, PREFLEN=8, RANGELEN=8, VAL=-256..-1, 11111110+(VAL+256) */\n    -256,   /* 11111110 00000000 */\n    -255,   /* 11111110 00000001 */\n    -2,     /* 11111110 11111110 */\n    -1,     /* 11111110 11111111 */\n    /* line 1, PREFLEN=1, RANGELEN=0, VAL=0, 0 */\n    0,      /* 0 */\n    /* line 2, PREFLEN=2, RANGELEN=0, VAL=1, 10 */\n    1,      /* 10 */\n    /* line 3, PREFLEN=3, RANGELEN=0, VAL=2, 110 */\n    2,      /* 110 */\n    /* line 4, PREFLEN=4, RANGELEN=3, VAL=3..10, 1110+(VAL-3) */\n    3,      /* 1110 000 */\n    4,      /* 1110 001 */\n    9,      /* 1110 110 */\n    10,     /* 1110 111 */\n    /* line 5, PREFLEN=5, RANGELEN=6, VAL=11..74, 11110+(VAL-11) */\n    11,     /* 11110 000000 */\n    12,     /* 11110 000001 */\n    73,     /* 11110 111110 */\n    74,     /* 11110 111111 */\n    /* line 6, PREFLEN=8, RANGELEN=32, VAL=-INF..-257, 11111111+(-257-VAL) */\n    -257,   /* 11111111 00000000 00000000 00000000 00000000 */\n    -258,   /* 11111111 00000000 00000000 00000000 00000001 */\n    /* line 7, PREFLEN=7, RANGELEN=32, VAL=75..INF, 1111110+(VAL-75) */\n    75,     /* 1111110 00000000 00000000 00000000 00000000 */\n    76,     /* 1111110 00000000 00000000 00000000 00000001 */\n    /* line 8, PREFLEN=6, VAL=OOB, 111110 */\n    /*OOB*/ /* 111110 */\n};\nconst byte test_input_C[] = {\n    /* 1111 1110 0000 0000 1111 1110 0000 0001 */\n       0xfe,     0x00,     0xfe,     0x01,\n    /* 1111 1110 1111 1110 1111 1110 1111 1111 */\n       0xfe,     0xfe,     0xfe,     0xff,\n    /* 0101 1011 1000 0111 0001 1110 1101 1101 */\n       0x5b,     0x87,     0x1e,     0xdd,\n    /* 1111 1100 0000 0111 1000 0001 1111 0111 */\n       0xfc,     0x07,     0x81,     0xf7,\n    /* 1101 1110 1111 1111 1111 1100 0000 0000 */\n       0xde,     0xff,     0xfc,     0x00,\n    /* 0000 0000 0000 0000 0000 0011 1111 1100 */\n       0x00,     0x00,     0x03,     0xfc,\n    /* 0000 0000 0000 0000 0000 0000 0000 0111 */\n       0x00,     0x00,     0x00,     0x07,\n    /* 1111 0000 0000 0000 0000 0000 0000 0000 */\n       0xf0,     0x00,     0x00,     0x00,\n    /* 0000 0111 1110 0000 0000 0000 0000 0000 */\n       0x07,     0xe0,     0x00,     0x00,\n    /* 0000 0000 0001 1111 10 */\n       0x00,     0x1f,     0x80,\n};\n\n/* test code for Table B.4 - Standard Huffman table D */\nconst int32_t test_output_D[] = {\n    /* line 0, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    1,      /* 0 */\n    /* line 1, PREFLEN=2, RANGELEN=0, VAL=2, 10 */\n    2,      /* 10 */\n    /* line 2, PREFLEN=3, RANGELEN=0, VAL=3, 110 */\n    3,      /* 110 */\n    /* line 3, PREFLEN=4, RANGELEN=3, VAL=4..11, 1110+(VAL-4) */\n    4,      /* 1110 000 */\n    5,      /* 1110 001 */\n    10,     /* 1110 110 */\n    11,     /* 1110 111 */\n    /* line 4, PREFLEN=5, RANGELEN=6, VAL=12..75, 11110+(VAL-12) */\n    12,     /* 11110 000000 */\n    13,     /* 11110 000001 */\n    74,     /* 11110 111110 */\n    75,     /* 11110 111111 */\n    /* line 5, PREFLEN=5, RANGELEN=32, VAL=76..INF, 11111+(VAL-76) */\n    76,     /* 11111 00000000 00000000 00000000 00000000 */\n    77,     /* 11111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_D[] = {\n    /* 0101 1011 1000 0111 0001 1110 1101 1101 */\n       0x5b,     0x87,     0x1e,     0xdd,\n    /* 1111 1100 0000 0111 1000 0001 1111 0111 */\n       0xfc,     0x07,     0x81,     0xf7,\n    /* 1101 1110 1111 1111 1110 0000 0000 0000 */\n       0xde,     0xff,     0xe0,     0x00,\n    /* 0000 0000 0000 0000 0001 1111 0000 0000 */\n       0x00,     0x00,     0x1f,     0x00,\n    /* 0000 0000 0000 0000 0000 0001 */\n       0x00,     0x00,     0x01,\n};\n\n/* test code for Table B.5 - Standard Huffman table E */\nconst int32_t test_output_E[] = {\n    /* line 0, PREFLEN=7, RANGELEN=8, VAL=-255..0, 1111110+(VAL+255) */\n    -255,   /* 1111110 00000000 */\n    -254,   /* 1111110 00000001 */\n    -1,     /* 1111110 11111110 */\n    0,      /* 1111110 11111111 */\n    /* line 1, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    1,      /* 0 */\n    /* line 2, PREFLEN=2, RANGELEN=0, VAL=2, 10 */\n    2,      /* 10 */\n    /* line 3, PREFLEN=3, RANGELEN=0, VAL=3, 110 */\n    3,      /* 110 */\n    /* line 4, PREFLEN=4, RANGELEN=3, VAL=4..11, 1110+(VAL-4) */\n    4,      /* 1110 000 */\n    5,      /* 1110 001 */\n    10,     /* 1110 110 */\n    11,     /* 1110 111 */\n    /* line 5, PREFLEN=5, RANGELEN=6, VAL=12..75, 11110+(VAL-12) */\n    12,     /* 11110 000000 */\n    13,     /* 11110 000001 */\n    74,     /* 11110 111110 */\n    75,     /* 11110 111111 */\n    /* line 6, PREFLEN=7, RANGELEN=32, VAL=-INF..-256, 1111111+(-256-VAL) */\n    -256,   /* 1111111 00000000 00000000 00000000 00000000 */\n    -257,   /* 1111111 00000000 00000000 00000000 00000001 */\n    /* line 6, PREFLEN=6, RANGELEN=32, VAL=76..INF, 111110+(VAL-76) */\n    76,     /* 111110 00000000 00000000 00000000 00000000 */\n    77,     /* 111110 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_E[] = {\n    /* 1111 1100 0000 0001 1111 1000 0000 0111 */\n       0xfc,     0x01,     0xf8,     0x07,\n    /* 1111 0111 1111 0111 1110 1111 1111 0101 */\n       0xf7,     0xf7,     0xef,     0xf5,\n    /* 1011 1000 0111 0001 1110 1101 1101 1111 */\n       0xb8,     0x71,     0xed,     0xdf,\n    /* 1100 0000 0111 1000 0001 1111 0111 1101 */\n       0xc0,     0x78,     0x1f,     0x7d,\n    /* 1110 1111 1111 1111 1000 0000 0000 0000 */\n       0xef,     0xff,     0x80,     0x00,\n    /* 0000 0000 0000 0000 0111 1111 0000 0000 */\n       0x00,     0x00,     0x7f,     0x00,\n    /* 0000 0000 0000 0000 0000 0001 1111 1000 */\n       0x00,     0x00,     0x01,     0xf8,\n    /* 0000 0000 0000 0000 0000 0000 0000 0011 */\n       0x00,     0x00,     0x00,     0x03,\n    /* 1110 0000 0000 0000 0000 0000 0000 0000 */\n       0xe0,     0x00,     0x00,     0x00,\n    /* 0001 */\n       0x10,\n};\n\n/* test code for Table B.6 - Standard Huffman table F */\nconst int32_t test_output_F[] = {\n    /* line 0, PREFLEN=5, RANGELEN=10, VAL=-2048..-1025, 11100+(VAL+2048) */\n    -2048,  /* 11100 00000000 00 */\n    -2047,  /* 11100 00000000 01 */\n    -1026,  /* 11100 11111111 10 */\n    -1025,  /* 11100 11111111 11 */\n    /* line 1, PREFLEN=4, RANGELEN=9, VAL=-1024..-513, 1000+(VAL+1024) */\n    -1024,  /* 1000 00000000 0 */\n    -1023,  /* 1000 00000000 1 */\n    -514,   /* 1000 11111111 0 */\n    -513,   /* 1000 11111111 1 */\n    /* line 2, PREFLEN=4, RANGELEN=8, VAL=-512..-257, 1001+(VAL+512) */\n    -512,   /* 1001 00000000 */\n    -511,   /* 1001 00000001 */\n    -258,   /* 1001 11111110 */\n    -257,   /* 1001 11111111 */\n    /* line 3, PREFLEN=4, RANGELEN=7, VAL=-256..-129, 1010+(VAL+256) */\n    -256,   /* 1010 0000000 */\n    -255,   /* 1010 0000001 */\n    -130,   /* 1010 1111110 */\n    -129,   /* 1010 1111111 */\n    /* line 4, PREFLEN=5, RANGELEN=6, VAL=-128..-65, 11101+(VAL+128) */\n    -128,   /* 11101 000000 */\n    -127,   /* 11101 000001 */\n    -66,    /* 11101 111110 */\n    -65,    /* 11101 111111 */\n    /* line 5, PREFLEN=5, RANGELEN=5, VAL=-64..-33, 11110+(VAL+64) */\n    -64,    /* 11110 00000 */\n    -63,    /* 11110 00001 */\n    -34,    /* 11110 11110 */\n    -33,    /* 11110 11111 */\n    /* line 6, PREFLEN=4, RANGELEN=5, VAL=-32..-1, 1011+(VAL+32) */\n    -32,    /* 1011 00000 */\n    -31,    /* 1011 00001 */\n    -2,     /* 1011 11110 */\n    -1,     /* 1011 11111 */\n    /* line 7, PREFLEN=2, RANGELEN=7, VAL=0..127, 00+VAL */\n    0,      /* 00 0000000 */\n    1,      /* 00 0000001 */\n    126,    /* 00 1111110 */\n    127,    /* 00 1111111 */\n    /* line 8, PREFLEN=3, RANGELEN=7, VAL=128..255, 010+(VAL-128) */\n    128,    /* 010 0000000 */\n    129,    /* 010 0000001 */\n    254,    /* 010 1111110 */\n    255,    /* 010 1111111 */\n    /* line 9, PREFLEN=3, RANGELEN=8, VAL=256..511, 011+(VAL-256) */\n    256,    /* 011 00000000 */\n    257,    /* 011 00000001 */\n    510,    /* 011 11111110 */\n    511,    /* 011 11111111 */\n    /* line 10, PREFLEN=4, RANGELEN=9, VAL=512..1023, 1100+(VAL-512) */\n    512,    /* 1100 00000000 0 */\n    513,    /* 1100 00000000 1 */\n    1022,   /* 1100 11111111 0 */\n    1023,   /* 1100 11111111 1 */\n    /* line 11, PREFLEN=4, RANGELEN=10, VAL=1024..2047, 1101+(VAL-1024) */\n    1024,   /* 1101 00000000 00 */\n    1025,   /* 1101 00000000 01 */\n    2046,   /* 1101 11111111 10 */\n    2047,   /* 1101 11111111 11 */\n    /* line 12, PREFLEN=6, RANGELEN=32, VAL=-INF..-2049, 111110+(-2049-VAL) */\n    -2049,  /* 111110 00000000 00000000 00000000 00000000 */\n    -2050,  /* 111110 00000000 00000000 00000000 00000001 */\n    /* line 13, PREFLEN=6, RANGELEN=32, VAL=2048..INF, 111111+(VAL-2048) */\n    2048,   /* 111111 00000000 00000000 00000000 00000000 */\n    2049,   /* 111111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_F[] = {\n    /* 1110 0000 0000 0001 1100 0000 0000 0111 */\n       0xe0,     0x01,     0xc0,     0x07,\n    /* 1001 1111 1111 0111 0011 1111 1111 1000 */\n       0x9f,     0xf7,     0x3f,     0xf8,\n    /* 0000 0000 0100 0000 0000 0110 0011 1111 */\n       0x00,     0x40,     0x06,     0x3f,\n    /* 1101 0001 1111 1111 1001 0000 0000 1001 */\n       0xd1,     0xff,     0x90,     0x09,\n    /* 0000 0001 1001 1111 1110 1001 1111 1111 */\n       0x01,     0x9f,     0xe9,     0xff,\n    /* 1010 0000 0001 0100 0000 0110 1011 1111 */\n       0xa0,     0x14,     0x06,     0xbf,\n    /* 0101 0111 1111 1110 1000 0001 1101 0000 */\n       0x57,     0xfe,     0x81,     0xd0,\n    /* 0111 1011 1111 0111 0111 1111 1111 0000 */\n       0x7b,     0xf7,     0x7f,     0xf0,\n    /* 0011 1100 0001 1111 0111 1011 1101 1111 */\n       0x3c,     0x1f,     0x7b,     0xdf,\n    /* 1011 0000 0101 1000 0110 1111 1101 0111 */\n       0xb0,     0x58,     0x6f,     0xd7,\n    /* 1111 0000 0000 0000 0000 0100 1111 1100 */\n       0xf0,     0x00,     0x04,     0xfc,\n    /* 0111 1111 0100 0000 0001 0000 0001 0101 */\n       0x7f,     0x40,     0x10,     0x15,\n    /* 1111 1001 0111 1111 0110 0000 0000 1100 */\n       0xf9,     0x7f,     0x60,     0x0c,\n    /* 0000 0101 1111 1111 0011 1111 1111 1100 */\n       0x05,     0xff,     0x3f,     0xfc,\n    /* 0000 0000 0110 0000 0000 0111 0011 1111 */\n       0x00,     0x60,     0x07,     0x3f,\n    /* 1101 1001 1111 1111 1101 0000 0000 0011 */\n       0xd9,     0xff,     0xd0,     0x03,\n    /* 0100 0000 0001 1101 1111 1111 1011 0111 */\n       0x40,     0x1d,     0xff,     0xb7,\n    /* 1111 1111 1111 1000 0000 0000 0000 0000 */\n       0xff,     0xf8,     0x00,     0x00,\n    /* 0000 0000 0000 0011 1110 0000 0000 0000 */\n       0x00,     0x03,     0xe0,     0x00,\n    /* 0000 0000 0000 0000 0001 1111 1100 0000 */\n       0x00,     0x00,     0x1f,     0xc0,\n    /* 0000 0000 0000 0000 0000 0000 0011 1111 */\n       0x00,     0x00,     0x00,     0x3f,\n    /* 0000 0000 0000 0000 0000 0000 0000 0001 */\n       0x00,     0x00,     0x00,     0x01,\n};\n\n/* test code for Table B.7 - Standard Huffman table G */\nconst int32_t test_output_G[] = {\n    /* line 0, PREFLEN=4, RANGELEN=9, VAL=-1024..-513, 1000+(VAL+1024) */\n    -1024,  /* 1000 00000000 0 */\n    -1023,  /* 1000 00000000 1 */\n    -514,   /* 1000 11111111 0 */\n    -513,   /* 1000 11111111 1 */\n    /* line 1, PREFLEN=3, RANGELEN=8, VAL=-512..-257, 000+(VAL+512) */\n    -512,   /* 000 00000000 */\n    -511,   /* 000 00000001 */\n    -258,   /* 000 11111110 */\n    -257,   /* 000 11111111 */\n    /* line 2, PREFLEN=4, RANGELEN=7, VAL=-256..-129, 1001+(VAL+256) */\n    -256,   /* 1001 0000000 */\n    -255,   /* 1001 0000001 */\n    -130,   /* 1001 1111110 */\n    -129,   /* 1001 1111111 */\n    /* line 3, PREFLEN=5, RANGELEN=6, VAL=-128..-65, 11010+(VAL+128) */\n    -128,   /* 11010 000000 */\n    -127,   /* 11010 000001 */\n    -66,    /* 11010 111110 */\n    -65,    /* 11010 111111 */\n    /* line 4, PREFLEN=5, RANGELEN=5, VAL=-64..-33, 11011+(VAL+64) */\n    -64,    /* 11011 00000 */\n    -63,    /* 11011 00001 */\n    -34,    /* 11011 11110 */\n    -33,    /* 11011 11111 */\n    /* line 5, PREFLEN=4, RANGELEN=5, VAL=-32..-1, 1010+(VAL+32) */\n    -32,    /* 1010 00000 */\n    -31,    /* 1010 00001 */\n    -2,     /* 1010 11110 */\n    -1,     /* 1010 11111 */\n    /* line 6, PREFLEN=4, RANGELEN=5, VAL=0..31, 1011+VAL */\n    0,      /* 1011 00000 */\n    1,      /* 1011 00001 */\n    30,     /* 1011 11110 */\n    31,     /* 1011 11111 */\n    /* line 7, PREFLEN=5, RANGELEN=5, VAL=32..63, 11100+(VAL-32) */\n    32,     /* 11100 00000 */\n    33,     /* 11100 00001 */\n    62,     /* 11100 11110 */\n    63,     /* 11100 11111 */\n    /* line 8, PREFLEN=5, RANGELEN=6, VAL=64..127, 11101+(VAL-64) */\n    64,     /* 11101 000000 */\n    65,     /* 11101 000001 */\n    126,    /* 11101 111110 */\n    127,    /* 11101 111111 */\n    /* line 9, PREFLEN=4, RANGELEN=7, VAL=128..255, 1100+(VAL-128) */\n    128,    /* 1100 0000000 */\n    129,    /* 1100 0000001 */\n    254,    /* 1100 1111110 */\n    255,    /* 1100 1111111 */\n    /* line 10, PREFLEN=3, RANGELEN=8, VAL=256..511, 001+(VAL-256) */\n    256,    /* 001 00000000 */\n    257,    /* 001 00000001 */\n    510,    /* 001 11111110 */\n    511,    /* 001 11111111 */\n    /* line 11, PREFLEN=3, RANGELEN=9, VAL=512..1023, 010+(VAL-512) */\n    512,    /* 010 00000000 0 */\n    513,    /* 010 00000000 1 */\n    1022,   /* 010 11111111 0 */\n    1023,   /* 010 11111111 1 */\n    /* line 12, PREFLEN=3, RANGELEN=10, VAL=1024..2047, 011+(VAL-1024) */\n    1024,   /* 011 00000000 00 */\n    1025,   /* 011 00000000 01 */\n    2046,   /* 011 11111111 10 */\n    2047,   /* 011 11111111 11 */\n    /* line 13, PREFLEN=5, RANGELEN=32, VAL=-INF..-1025, 11110+(-1025-VAL) */\n    -1025,  /* 11110 00000000 00000000 00000000 00000000 */\n    -1026,  /* 11110 00000000 00000000 00000000 00000001 */\n    /* line 14, PREFLEN=5, RANGELEN=32, VAL=2048..INF, 11111+(VAL-2048) */\n    2048,   /* 11111 00000000 00000000 00000000 00000000 */\n    2049,   /* 11111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_G[] = {\n    /* 1000 0000 0000 0100 0000 0000 0110 0011 */\n       0x80,     0x04,     0x00,     0x63,\n    /* 1111 1101 0001 1111 1111 0000 0000 0000 */\n       0xfd,     0x1f,     0xf0,     0x00,\n    /* 0000 0000 0100 0111 1111 0000 1111 1111 */\n       0x00,     0x47,     0xf0,     0xff,\n    /* 1001 0000 0001 0010 0000 0110 0111 1111 */\n       0x90,     0x12,     0x06,     0x7f,\n    /* 0100 1111 1111 1101 0000 0001 1010 0000 */\n       0x4f,     0xfd,     0x01,     0xa0,\n    /* 0111 0101 1111 0110 1011 1111 1101 1000 */\n       0x75,     0xf6,     0xbf,     0xd8,\n    /* 0011 0110 0001 1101 1111 1011 0111 1111 */\n       0x36,     0x1d,     0xfb,     0x7f,\n    /* 1010 0000 0101 0000 0110 1011 1101 0101 */\n       0xa0,     0x50,     0x6b,     0xd5,\n    /* 1111 1011 0000 0101 1000 0110 1111 1101 */\n       0xfb,     0x05,     0x86,     0xfd,\n    /* 0111 1111 1110 0000 0011 1000 0001 1110 */\n       0x7f,     0xe0,     0x38,     0x1e,\n    /* 0111 1011 1001 1111 1110 1000 0001 1101 */\n       0x7b,     0x9f,     0xe8,     0x1d,\n    /* 0000 0111 1011 1111 0111 0111 1111 1100 */\n       0x07,     0xbf,     0x77,     0xfc,\n    /* 0000 0001 1000 0000 0111 0011 1111 0110 */\n       0x01,     0x80,     0x73,     0xf6,\n    /* 0111 1111 0010 0000 0000 0100 0000 0100 */\n       0x7f,     0x20,     0x04,     0x04,\n    /* 1111 1111 0001 1111 1111 0100 0000 0000 */\n       0xff,     0x1f,     0xf4,     0x00,\n    /* 0100 0000 0001 0101 1111 1110 0101 1111 */\n       0x40,     0x15,     0xfe,     0x5f,\n    /* 1111 0110 0000 0000 0011 0000 0000 0101 */\n       0xf6,     0x00,     0x30,     0x05,\n    /* 1111 1111 1100 1111 1111 1111 1111 0000 */\n       0xff,     0xcf,     0xff,     0xf0,\n    /* 0000 0000 0000 0000 0000 0000 0000 0111 */\n       0x00,     0x00,     0x00,     0x07,\n    /* 1000 0000 0000 0000 0000 0000 0000 0000 */\n       0x80,     0x00,     0x00,     0x00,\n    /* 0111 1110 0000 0000 0000 0000 0000 0000 */\n       0x7e,     0x00,     0x00,     0x00,\n    /* 0000 0001 1111 0000 0000 0000 0000 0000 */\n       0x01,     0xf0,     0x00,     0x00,\n    /* 0000 0000 0001 */\n       0x00,     0x10,\n};\n\n/* test code for Table B.8 - Standard Huffman table H */\nconst int32_t test_output_H[] = {\n    /* line 0, PREFLEN=8, RANGELEN=3, VAL=-15..-8, 11111100+(VAL+15) */\n    -15,    /* 11111100 000 */\n    -14,    /* 11111100 001 */\n    -9,     /* 11111100 110 */\n    -8,     /* 11111100 111 */\n    /* line 1, PREFLEN=9, RANGELEN=1, VAL=-7..-6, 111111100+(VAL+7) */\n    -7,     /* 111111100 0 */\n    -6,     /* 111111100 1 */\n    /* line 2, PREFLEN=8, RANGELEN=1, VAL=-5..-4, 11111101+(VAL+5) */\n    -5,     /* 11111101 0 */\n    -4,     /* 11111101 1 */\n    /* line 3, PREFLEN=9, RANGELEN=0, VAL=-3, 111111101 */\n    -3,     /* 111111101 */\n    /* line 4, PREFLEN=7, RANGELEN=0, VAL=-2, 1111100 */\n    -2,     /* 1111100 */\n    /* line 5, PREFLEN=4, RANGELEN=0, VAL=-1, 1010 */\n    -1,     /* 1010 */\n    /* line 6, PREFLEN=2, RANGELEN=1, VAL=0..1, 00+VAL */\n    0,      /* 00 0 */\n    1,      /* 00 1 */\n    /* line 7, PREFLEN=5, RANGELEN=0, VAL=2, 11010 */\n    2,      /* 11010 */\n    /* line 8, PREFLEN=6, RANGELEN=0, VAL=3, 111010 */\n    3,      /* 111010 */\n    /* line 9, PREFLEN=3, RANGELEN=4, VAL=4..19, 100+(VAL-4) */\n    4,      /* 100 0000 */\n    5,      /* 100 0001 */\n    18,     /* 100 1110 */\n    19,     /* 100 1111 */\n    /* line 10, PREFLEN=6, RANGELEN=1, VAL=20..21, 111011+(VAL-20) */\n    20,     /* 111011 0 */\n    21,     /* 111011 1 */\n    /* line 11, PREFLEN=4, RANGELEN=4, VAL=22..37, 1011+(VAL-22) */\n    22,     /* 1011 0000 */\n    23,     /* 1011 0001 */\n    36,     /* 1011 1110 */\n    37,     /* 1011 1111 */\n    /* line 12, PREFLEN=4, RANGELEN=5, VAL=38..69, 1100+(VAL-38) */\n    38,     /* 1100 00000 */\n    39,     /* 1100 00001 */\n    68,     /* 1100 11110 */\n    69,     /* 1100 11111 */\n    /* line 13, PREFLEN=5, RANGELEN=6, VAL=70..133, 11011+(VAL-70) */\n    70,     /* 11011 000000 */\n    71,     /* 11011 000001 */\n    132,    /* 11011 111110 */\n    133,    /* 11011 111111 */\n    /* line 14, PREFLEN=5, RANGELEN=7, VAL=134..261, 11100+(VAL-134) */\n    134,    /* 11100 0000000 */\n    135,    /* 11100 0000001 */\n    260,    /* 11100 1111110 */\n    261,    /* 11100 1111111 */\n    /* line 15, PREFLEN=6, RANGELEN=7, VAL=262..389, 111100+(VAL-262) */\n    262,    /* 111100 0000000 */\n    263,    /* 111100 0000001 */\n    388,    /* 111100 1111110 */\n    389,    /* 111100 1111111 */\n    /* line 16, PREFLEN=7, RANGELEN=8, VAL=390..645, 1111101+(VAL-390) */\n    390,    /* 1111101 00000000 */\n    391,    /* 1111101 00000001 */\n    644,    /* 1111101 11111110 */\n    645,    /* 1111101 11111111 */\n    /* line 17, PREFLEN=6, RANGELEN=10, VAL=646..1669, 111101+(VAL-646) */\n    646,    /* 111101 00000000 00 */\n    647,    /* 111101 00000000 01 */\n    1668,   /* 111101 11111111 10 */\n    1669,   /* 111101 11111111 11 */\n    /* line 18, PREFLEN=9, RANGELEN=32, VAL=-INF..-16, 111111110+(-16-VAL) */\n    -16,    /* 111111110 00000000 00000000 00000000 00000000 */\n    -17,    /* 111111110 00000000 00000000 00000000 00000001 */\n    /* line 19, PREFLEN=9, RANGELEN=32, VAL=1670..INF, 111111111+(VAL-1670) */\n    1670,   /* 111111111 00000000 00000000 00000000 00000000 */\n    1671,   /* 111111111 00000000 00000000 00000000 00000001 */\n    /* line 20, PREFLEN=2, VAL=OOB, 01 */\n    /*OOB*/ /* 01 */\n};\nconst byte test_input_H[] = {\n    /* 1111 1100  0001 1111 1000 0111 1111 0011 */\n       0xfc,     0x1f,     0x87,     0xf3,\n    /* 0111 1110  0111 1111 1110 0011 1111 1001 */\n       0x7e,     0x7f,     0xe3,     0xf9,\n    /* 1111 1101  0111 1110 1111 1111 1011 1111 */\n       0xfd,     0x7e,     0xff,     0xbf,\n    /* 0010 1000  0001 1101 0111 0101 0000 0010 */\n       0x28,     0x1d,     0x75,     0x02,\n    /* 0000 1100  1110 1001 1111 1101 1011 1011 */\n       0x0c,     0xe9,     0xfd,     0xbb,\n    /* 1101 1000  0101 1000 1101 1111 0101 1111 */\n       0xd8,     0x58,     0xdf,     0x5f,\n    /* 1110 0000  0011 0000 0011 1001 1110 1100 */\n       0xe0,     0x30,     0x39,     0xec,\n    /* 1111 1110  1100 0000 1101 1000 0011 1011 */\n       0xfe,     0xc0,     0xd8,     0x3b,\n    /* 1111 1011  0111 1111 1111 0000 0000 0111 */\n       0xfb,     0x7f,     0xf0,     0x07,\n    /* 0000 0000  1111 0011 1111 0111 0011 1111 */\n       0x00,     0xf3,     0xf7,     0x3f,\n    /* 1111 1000  0000 0011 1100 0000 0011 1110 */\n       0xf8,     0x03,     0xc0,     0x3e,\n    /* 0111 1110  1111 0011 1111 1111 1101 0000 */\n       0x7e,     0xf3,     0xff,     0xd0,\n    /* 0000 1111  1010 0000 0011 1111 0111 1111 */\n       0x0f,     0xa0,     0x3f,     0x7f,\n    /* 1011 1110  1111 1111 1111 1010 0000 0000 */\n       0xbe,     0xff,     0xfa,     0x00,\n    /* 0111 1010  0000 0000 1111 1011 1111 1111 */\n       0x7a,     0x00,     0xfb,     0xff,\n    /* 0111 1011  1111 1111 1111 1111 1000 0000 */\n       0x7b,     0xff,     0xff,     0x80,\n    /* 0000 0000  0000 0000 0000 0000 0011 1111 */\n       0x00,     0x00,     0x00,     0x3f,\n    /* 1100 0000  0000 0000 0000 0000 0000 0000 */\n       0xc0,     0x00,     0x00,     0x00,\n    /* 0011 1111  1111 0000 0000 0000 0000 0000 */\n       0x3f,     0xf0,     0x00,     0x00,\n    /* 0000 0000  0000 1111 1111 1000 0000 0000 */\n       0x00,     0x0f,     0xf8,     0x00,\n    /* 0000 0000  0000 0000 0000 101 */\n       0x00,     0x00,     0x0a,\n};\n\n/* test code for Table B.9 - Standard Huffman table I */\nconst int32_t test_output_I[] = {\n    /* line 0, PREFLEN=8, RANGELEN=4, VAL=-31..-16, 11111100+(VAL+31) */\n    -31,    /* 11111100 0000 */\n    -30,    /* 11111100 0001 */\n    -17,    /* 11111100 1110 */\n    -16,    /* 11111100 1111 */\n    /* line 1, PREFLEN=9, RANGELEN=2, VAL=-15..-12, 111111100+(VAL+15) */\n    -15,    /* 111111100 00 */\n    -14,    /* 111111100 01 */\n    -13,    /* 111111100 10 */\n    -12,    /* 111111100 11 */\n    /* line 2, PREFLEN=8, RANGELEN=2, VAL=-11..-8, 11111101+(VAL+11) */\n    -11,    /* 11111101 00 */\n    -10,    /* 11111101 01 */\n    -9,     /* 11111101 10 */\n    -8,     /* 11111101 11 */\n    /* line 3, PREFLEN=9, RANGELEN=1, VAL=-7..-6, 111111101+(VAL+7) */\n    -7,     /* 111111101 0 */\n    -6,     /* 111111101 1 */\n    /* line 4, PREFLEN=7, RANGELEN=1, VAL=-5..-4, 1111100+(VAL+5) */\n    -5,     /* 1111100 0 */\n    -4,     /* 1111100 1 */\n    /* line 5, PREFLEN=4, RANGELEN=1, VAL=-3..-2, 1010+(VAL+3) */\n    -3,     /* 1010 0 */\n    -2,     /* 1010 1 */\n    /* line 6, PREFLEN=3, RANGELEN=1, VAL=-1..0, 010+(VAL+1) */\n    -1,     /* 010 0 */\n    0,      /* 010 1 */\n    /* line 7, PREFLEN=3, RANGELEN=1, VAL=1..2, 011+(VAL-1) */\n    1,      /* 011 0 */\n    2,      /* 011 1 */\n    /* line 8, PREFLEN=5, RANGELEN=1, VAL=3..4, 11010+(VAL-3) */\n    3,      /* 11010 0 */\n    4,      /* 11010 1 */\n    /* line 9, PREFLEN=6, RANGELEN=1, VAL=5..6, 111010+(VAL-5) */\n    5,      /* 111010 0 */\n    6,      /* 111010 1 */\n    /* line 10, PREFLEN=3, RANGELEN=5, VAL=7..38, 100+(VAL-7) */\n    7,      /* 100 00000 */\n    8,      /* 100 00001 */\n    37,     /* 100 11110 */\n    38,     /* 100 11111 */\n    /* line 11, PREFLEN=6, RANGELEN=2, VAL=39..42, 111011+(VAL-39) */\n    39,     /* 111011 00 */\n    40,     /* 111011 01 */\n    41,     /* 111011 10 */\n    42,     /* 111011 11 */\n    /* line 12, PREFLEN=4, RANGELEN=5, VAL=43..74, 1011+(VAL-43) */\n    43,     /* 1011 00000 */\n    44,     /* 1011 00001 */\n    73,     /* 1011 11110 */\n    74,     /* 1011 11111 */\n    /* line 13, PREFLEN=4, RANGELEN=6, VAL=75..138, 1100+(VAL-75) */\n    75,     /* 1100 000000 */\n    76,     /* 1100 000001 */\n    137,    /* 1100 111110 */\n    138,    /* 1100 111111 */\n    /* line 14, PREFLEN=5, RANGELEN=7, VAL=139..266, 11011+(VAL-139) */\n    139,    /* 11011 0000000 */\n    140,    /* 11011 0000001 */\n    265,    /* 11011 1111110 */\n    266,    /* 11011 1111111 */\n    /* line 15, PREFLEN=5, RANGELEN=8, VAL=267..522, 11100+(VAL-267) */\n    267,    /* 11100 00000000 */\n    268,    /* 11100 00000001 */\n    521,    /* 11100 11111110 */\n    522,    /* 11100 11111111 */\n    /* line 16, PREFLEN=6, RANGELEN=8, VAL=523..778, 111100+(VAL-523) */\n    523,    /* 111100 00000000 */\n    524,    /* 111100 00000001 */\n    777,    /* 111100 11111110 */\n    778,    /* 111100 11111111 */\n    /* line 17, PREFLEN=7, RANGELEN=9, VAL=779..1290, 1111101+(VAL-779) */\n    779,    /* 1111101 00000000 0 */\n    780,    /* 1111101 00000000 1 */\n    1289,   /* 1111101 11111111 0 */\n    1290,   /* 1111101 11111111 1 */\n    /* line 18, PREFLEN=6, RANGELEN=11, VAL=1291..3338, 111101+(VAL-1291) */\n    1291,   /* 111101 00000000 000 */\n    1292,   /* 111101 00000000 001 */\n    3337,   /* 111101 11111111 110 */\n    3338,   /* 111101 11111111 111 */\n    /* line 19, PREFLEN=9, RANGELEN=32, VAL=-INF..-32, 111111110+(-32-VAL) */\n    -32,    /* 111111110 00000000 00000000 00000000 00000000 */\n    -33,    /* 111111110 00000000 00000000 00000000 00000001 */\n    /* line 20, PREFLEN=9, RANGELEN=32, VAL=3339..INF, 111111111+(VAL-3339) */\n    3339,   /* 111111111 00000000 00000000 00000000 00000000 */\n    3340,   /* 111111111 00000000 00000000 00000000 00000001 */\n    /* line 21, PREFLEN=2, VAL=OOB, 00 */\n    /*OOB*/ /* 00 */\n};\nconst byte test_input_I[] = {\n    /* 1111 1100 0000 1111 1100 0001 1111 1100 */\n       0xfc,     0x0f,     0xc1,     0xfc,\n    /* 1110 1111 1100 1111 1111 1110 0001 1111 */\n       0xef,     0xcf,     0xfe,     0x1f,\n    /* 1100 0111 1111 1001 0111 1111 0011 1111 */\n       0xc7,     0xf9,     0x7f,     0x3f,\n    /* 1101 0011 1111 0101 1111 1101 1011 1111 */\n       0xd3,     0xf5,     0xfd,     0xbf,\n    /* 0111 1111 1110 1011 1111 1011 1111 1000 */\n       0x7f,     0xeb,     0xfb,     0xf8,\n    /* 1111 1001 1010 0101 0101 0001 0101 1001 */\n       0xf9,     0xa5,     0x51,     0x59,\n    /* 1111 0100 1101 0111 1010 0111 0101 1000 */\n       0xf4,     0xd7,     0xa7,     0x58,\n    /* 0000 1000 0001 1001 1110 1001 1111 1110 */\n       0x08,     0x19,     0xe9,     0xfe,\n    /* 1100 1110 1101 1110 1110 1110 1111 1011 */\n       0xce,     0xde,     0xee,     0xfb,\n    /* 0000 0101 1000 0110 1111 1101 0111 1111 */\n       0x05,     0x86,     0xfd,     0x7f,\n    /* 1100 0000 0011 0000 0001 1100 1111 1011 */\n       0xc0,     0x30,     0x1c,     0xfb,\n    /* 0011 1111 1101 1000 0000 1101 1000 0001 */\n       0x3f,     0xd8,     0x0d,     0x81,\n    /* 1101 1111 1110 1101 1111 1111 1110 0000 */\n       0xdf,     0xed,     0xff,     0xe0,\n    /* 0000 0111 0000 0000 0111 1001 1111 1101 */\n       0x07,     0x00,     0x79,     0xfd,\n    /* 1100 1111 1111 1111 0000 0000 0011 1100 */\n       0xcf,     0xff,     0x00,     0x3c,\n    /* 0000 0001 1111 0011 1111 1011 1100 1111 */\n       0x01,     0xf3,     0xfb,     0xcf,\n    /* 1111 1111 1010 0000 0000 1111 1010 0000 */\n       0xff,     0xa0,     0x0f,     0xa0,\n    /* 0001 1111 1011 1111 1110 1111 1011 1111 */\n       0x1f,     0xbf,     0xef,     0xbf,\n    /* 1111 1111 0100 0000 0000 0111 1010 0000 */\n       0xff,     0x40,     0x07,     0xa0,\n    /* 0000 0111 1101 1111 1111 1101 1110 1111 */\n       0x07,     0xdf,     0xfd,     0xef,\n    /* 1111 1111 1111 1111 0000 0000 0000 0000 */\n       0xff,     0xff,     0x00,     0x00,\n    /* 0000 0000 0000 0000 0111 1111 1000 0000 */\n       0x00,     0x00,     0x7f,     0x80,\n    /* 0000 0000 0000 0000 0000 0000 0111 1111 */\n       0x00,     0x00,     0x00,     0x7f,\n    /* 1110 0000 0000 0000 0000 0000 0000 0000 */\n       0xe0,     0x00,     0x00,     0x00,\n    /* 0001 1111 1111 0000 0000 0000 0000 0000 */\n       0x1f,     0xf0,     0x00,     0x00,\n    /* 0000 0000 0001 00 */\n       0x00,     0x10,\n};\n\n/* test code for Table B.10 - Standard Huffman table J */\nconst int32_t test_output_J[] = {\n    /* line 0, PREFLEN=7, RANGELEN=4, VAL=-21..-6, 1111010+(VAL+21) */\n    -21,    /* 1111010 0000 */\n    -20,    /* 1111010 0001 */\n    -7,     /* 1111010 1110 */\n    -6,     /* 1111010 1111 */\n    /* line 1, PREFLEN=8, RANGELEN=0, VAL=-5, 11111100 */\n    -5,     /* 11111100 */\n    /* line 2, PREFLEN=7, RANGELEN=0, VAL=-5, 1111011 */\n    -4,     /* 1111011 */\n    /* line 3, PREFLEN=5, RANGELEN=0, VAL=-3, 11000 */\n    -3,     /* 11000 */\n    /* line 4, PREFLEN=2, RANGELEN=2, VAL=-2..1, 00+(VAL+2) */\n    -2,     /* 00 00 */\n    -1,     /* 00 01 */\n    0,      /* 00 10 */\n    1,      /* 00 11 */\n    /* line 5, PREFLEN=5, RANGELEN=0, VAL=2, 11001 */\n    2,      /* 11001 */\n    /* line 6, PREFLEN=6, RANGELEN=0, VAL=3, 110110 */\n    3,      /* 110110 */\n    /* line 7, PREFLEN=7, RANGELEN=0, VAL=4, 1111100 */\n    4,      /* 1111100 */\n    /* line 8, PREFLEN=8, RANGELEN=0, VAL=5, 11111101 */\n    5,      /* 11111101 */\n    /* line 9, PREFLEN=2, RANGELEN=6, VAL=6..69, 01+(VAL-6) */\n    6,      /* 01 000000 */\n    7,      /* 01 000001 */\n    68,     /* 01 111110 */\n    69,     /* 01 111111 */\n    /* line 8, PREFLEN=5, RANGELEN=5, VAL=70..101, 11010+(VAL-70) */\n    70,     /* 11010 00000 */\n    71,     /* 11010 00001 */\n    100,    /* 11010 11110 */\n    101,    /* 11010 11111 */\n    /* line 9, PREFLEN=6, RANGELEN=5, VAL=102..133, 110111+(VAL-102) */\n    102,    /* 110111 00000 */\n    103,    /* 110111 00001 */\n    132,    /* 110111 11110 */\n    133,    /* 110111 11111 */\n    /* line 10, PREFLEN=6, RANGELEN=6, VAL=134..197, 111000+(VAL-134) */\n    134,    /* 111000 000000 */\n    135,    /* 111000 000001 */\n    196,    /* 111000 111110 */\n    197,    /* 111000 111111 */\n    /* line 11, PREFLEN=6, RANGELEN=7, VAL=198..325, 111001+(VAL-198) */\n    198,    /* 111001 0000000 */\n    199,    /* 111001 0000001 */\n    324,    /* 111001 1111110 */\n    325,    /* 111001 1111111 */\n    /* line 12, PREFLEN=6, RANGELEN=8, VAL=326..581, 111010+(VAL-326) */\n    326,    /* 111010 00000000 */\n    327,    /* 111010 00000001 */\n    580,    /* 111010 11111110 */\n    581,    /* 111010 11111111 */\n    /* line 13, PREFLEN=6, RANGELEN=9, VAL=582..1093, 111011+(VAL-582) */\n    582,    /* 111011 00000000 0 */\n    583,    /* 111011 00000000 1 */\n    1092,   /* 111011 11111111 0 */\n    1093,   /* 111011 11111111 1 */\n    /* line 14, PREFLEN=6, RANGELEN=10, VAL=1094..2117, 111100+(VAL-1094) */\n    1094,   /* 111100 00000000 00 */\n    1095,   /* 111100 00000000 01 */\n    2116,   /* 111100 11111111 10 */\n    2117,   /* 111100 11111111 11 */\n    /* line 15, PREFLEN=7, RANGELEN=11, VAL=2118..4165, 1111101+(VAL-2118) */\n    2118,   /* 1111101 00000000 000 */\n    2119,   /* 1111101 00000000 001 */\n    4164,   /* 1111101 11111111 110 */\n    4165,   /* 1111101 11111111 111 */\n    /* line 16, PREFLEN=8, RANGELEN=32, VAL=-INF..-22, 11111110+(-22-VAL) */\n    -22,    /* 11111110 00000000 00000000 00000000 00000000 */\n    -23,    /* 11111110 00000000 00000000 00000000 00000001 */\n    /* line 17, PREFLEN=8, RANGELEN=32, VAL=4166..INF, 11111111+(VAL-4166) */\n    4166,   /* 11111111 00000000 00000000 00000000 00000000 */\n    4167,   /* 11111111 00000000 00000000 00000000 00000001 */\n    /* line 8, PREFLEN=2, VAL=OOB, 10 */\n    /*OOB*/ /* 10 */\n};\nconst byte test_input_J[] = {\n    /* 1111 0100 0001 1110 1000 0111 1101 0111 */\n       0xf4,     0x1e,     0x87,     0xd7,\n    /* 0111 1010 1111 1111 1100 1111 0111 1000 */\n       0x7a,     0xff,     0xcf,     0x78,\n    /* 0000 0001 0010 0011 1100 1110 1101 1111 */\n       0x01,     0x23,     0xce,     0xdf,\n    /* 0011 1111 0101 0000 0001 0000 0101 1111 */\n       0x3f,     0x50,     0x10,     0x5f,\n    /* 1001 1111 1111 0100 0000 1101 0000 0111 */\n       0x9f,     0xf4,     0x0d,     0x07,\n    /* 0101 1110 1101 0111 1111 0111 0000 0110 */\n       0x5e,     0xd7,     0xf7,     0x06,\n    /* 1110 0001 1101 1111 1101 1011 1111 1111 */\n       0xe1,     0xdf,     0xdb,     0xff,\n    /* 1000 0000 0011 1000 0000 0111 1000 1111 */\n       0x80,     0x38,     0x07,     0x8f,\n    /* 1011 1000 1111 1111 1001 0000 0001 1100 */\n       0xb8,     0xff,     0x90,     0x1c,\n    /* 1000 0001 1110 0111 1111 0111 0011 1111 */\n       0x81,     0xe7,     0xf7,     0x3f,\n    /* 1111 1010 0000 0000 1110 1000 0000 0111 */\n       0xfa,     0x00,     0xe8,     0x07,\n    /* 1010 1111 1110 1110 1011 1111 1111 1011 */\n       0xaf,     0xee,     0xbf,     0xfb,\n    /* 0000 0000 0111 0110 0000 0001 1110 1111 */\n       0x00,     0x76,     0x01,     0xef,\n    /* 1111 1101 1101 1111 1111 1111 1100 0000 */\n       0xfd,     0xdf,     0xff,     0xc0,\n    /* 0000 0011 1100 0000 0000 0111 1100 1111 */\n       0x03,     0xc0,     0x07,     0xcf,\n    /* 1111 1011 1100 1111 1111 1111 1110 1000 */\n       0xfb,     0xcf,     0xff,     0xe8,\n    /* 0000 0000 1111 1010 0000 0000 0111 1110 */\n       0x00,     0xfa,     0x00,     0x7e,\n    /* 1111 1111 1110 1111 1011 1111 1111 1111 */\n       0xff,     0xef,     0xbf,     0xff,\n    /* 1111 1000 0000 0000 0000 0000 0000 0000 */\n       0xf8,     0x00,     0x00,     0x00,\n    /* 0000 0011 1111 1000 0000 0000 0000 0000 */\n       0x03,     0xf8,     0x00,     0x00,\n    /* 0000 0000 0000 0111 1111 1100 0000 0000 */\n       0x00,     0x07,     0xfc,     0x00,\n    /* 0000 0000 0000 0000 0000 0011 1111 1100 */\n       0x00,     0x00,     0x03,     0xfc,\n    /* 0000 0000 0000 0000 0000 0000 0000 0110 */\n       0x00,     0x00,     0x00,     0x06,\n};\n\n/* test code for Table B.11 - Standard Huffman table K */\nconst int32_t test_output_K[] = {\n    /* line 0, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    1,      /* 0 */\n    /* line 1, PREFLEN=2, RANGELEN=1, VAL=2..3, 10+(VAL-2) */\n    2,      /* 10 0 */\n    3,      /* 10 1 */\n    /* line 2, PREFLEN=4, RANGELEN=0, VAL=4, 1100 */\n    4,      /* 1100 */\n    /* line 3, PREFLEN=4, RANGELEN=1, VAL=5..6, 1101+(VAL-5) */\n    5,      /* 1101 0 */\n    6,      /* 1101 1 */\n    /* line 4, PREFLEN=5, RANGELEN=1, VAL=7..8, 11100+(VAL-7) */\n    7,      /* 11100 0 */\n    8,      /* 11100 1 */\n    /* line 5, PREFLEN=5, RANGELEN=2, VAL=9..12, 11101+(VAL-9) */\n    9,      /* 11101 00 */\n    10,     /* 11101 01 */\n    11,     /* 11101 10 */\n    12,     /* 11101 11 */\n    /* line 6, PREFLEN=6, RANGELEN=2, VAL=13..16, 111100+(VAL-13) */\n    13,     /* 111100 00 */\n    14,     /* 111100 01 */\n    15,     /* 111100 10 */\n    16,     /* 111100 11 */\n    /* line 7, PREFLEN=7, RANGELEN=2, VAL=17..20, 1111010+(VAL-17) */\n    17,     /* 1111010 00 */\n    18,     /* 1111010 01 */\n    19,     /* 1111010 10 */\n    20,     /* 1111010 11 */\n    /* line 8, PREFLEN=7, RANGELEN=3, VAL=21..28, 1111011+(VAL-21) */\n    21,     /* 1111011 000 */\n    22,     /* 1111011 001 */\n    27,     /* 1111011 110 */\n    28,     /* 1111011 111 */\n    /* line 9, PREFLEN=7, RANGELEN=4, VAL=29..44, 1111100+(VAL-29) */\n    29,     /* 1111100 0000 */\n    30,     /* 1111100 0001 */\n    43,     /* 1111100 1110 */\n    44,     /* 1111100 1111 */\n    /* line 10, PREFLEN=7, RANGELEN=5, VAL=45..76, 1111101+(VAL-45) */\n    45,     /* 1111101 00000 */\n    46,     /* 1111101 00001 */\n    75,     /* 1111101 11110 */\n    76,     /* 1111101 11111 */\n    /* line 11, PREFLEN=7, RANGELEN=6, VAL=77..140, 1111110+(VAL-77) */\n    77,     /* 1111110 000000 */\n    78,     /* 1111110 000001 */\n    139,    /* 1111110 111110 */\n    140,    /* 1111110 111111 */\n    /* line 12, PREFLEN=7, RANGELEN=32, VAL=141..INF, 1111111+(VAL-141) */\n    141,    /* 1111111 00000000 00000000 00000000 00000000 */\n    142,    /* 1111111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_K[] = {\n    /* 0100 1011 1001 1010 1101 1111 0001 1100 */\n       0x4b,     0x9a,     0xdf,     0x1c,\n    /* 1111 0100 1110 1011 1101 1011 1011 1111 */\n       0xf4,     0xeb,     0xdb,     0xbf,\n    /* 1000 0111 1000 1111 1001 0111 1001 1111 */\n       0x87,     0x8f,     0x97,     0x9f,\n    /* 1010 0011 1101 0011 1110 1010 1111 0101 */\n       0xa3,     0xd3,     0xea,     0xf5,\n    /* 1111 1011 0001 1110 1100 1111 1011 1101 */\n       0xfb,     0x1e,     0xcf,     0xbd,\n    /* 1110 1111 1111 1100 0000 1111 1000 0011 */\n       0xef,     0xfc,     0x0f,     0x83,\n    /* 1111 0011 1011 1110 0111 1111 1101 0000 */\n       0xf3,     0xbe,     0x7f,     0xd0,\n    /* 0111 1101 0000 1111 1101 1111 0111 1101 */\n       0x7d,     0x0f,     0xdf,     0x7d,\n    /* 1111 1111 1110 0000 0011 1111 0000 0011 */\n       0xff,     0xe0,     0x3f,     0x03,\n    /* 1111 1011 1110 1111 1101 1111 1111 1111 */\n       0xfb,     0xef,     0xdf,     0xff,\n    /* 0000 0000 0000 0000 0000 0000 0000 0000 */\n       0x00,     0x00,     0x00,     0x00,\n    /* 1111 1110 0000 0000 0000 0000 0000 0000 */\n       0xfe,     0x00,     0x00,     0x00,\n    /* 0000 001 */\n       0x02,\n};\n\n/* test code for Table B.12 - Standard Huffman table L */\nconst int32_t test_output_L[] = {\n    /* line 0, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    1,      /* 0 */\n    /* line 1, PREFLEN=2, RANGELEN=0, VAL=2, 10 */\n    2,      /* 10 */\n    /* line 2, PREFLEN=3, RANGELEN=1, VAL=3..4, 110+(VAL-3) */\n    3,      /* 110 0 */\n    4,      /* 110 1 */\n    /* line 3, PREFLEN=5, RANGELEN=0, VAL=5, 11100 */\n    5,      /* 11100 */\n    /* line 4, PREFLEN=5, RANGELEN=1, VAL=6..7, 11101+(VAL-7) */\n    6,      /* 11101 0 */\n    7,      /* 11101 1 */\n    /* line 5, PREFLEN=6, RANGELEN=1, VAL=8..9, 111100+(VAL-8) */\n    8,      /* 111100 0 */\n    9,      /* 111100 1 */\n    /* line 6, PREFLEN=7, RANGELEN=0, VAL=10, 1111010 */\n    10,     /* 1111010 */\n    /* line 7, PREFLEN=7, RANGELEN=1, VAL=11..12, 1111011+(VAL-11) */\n    11,     /* 1111011 0 */\n    12,     /* 1111011 1 */\n    /* line 8, PREFLEN=7, RANGELEN=2, VAL=13..16, 1111100+(VAL-13) */\n    13,     /* 1111100 00 */\n    14,     /* 1111100 01 */\n    15,     /* 1111100 10 */\n    16,     /* 1111100 11 */\n    /* line 9, PREFLEN=7, RANGELEN=3, VAL=17..24, 1111101+(VAL-17) */\n    17,     /* 1111101 000 */\n    18,     /* 1111101 001 */\n    23,     /* 1111101 110 */\n    24,     /* 1111101 111 */\n    /* line 10, PREFLEN=7, RANGELEN=4, VAL=25..40, 1111110+(VAL-25) */\n    25,     /* 1111110 0000 */\n    26,     /* 1111110 0001 */\n    39,     /* 1111110 1110 */\n    40,     /* 1111110 1111 */\n    /* line 11, PREFLEN=8, RANGELEN=5, VAL=41..72, 11111110+(VAL-41) */\n    41,     /* 11111110 00000 */\n    42,     /* 11111110 00001 */\n    71,     /* 11111110 11110 */\n    72,     /* 11111110 11111 */\n    /* line 12, PREFLEN=8, RANGELEN=32, VAL=73..INF, 11111111+(VAL-73) */\n    73,     /* 11111111 00000000 00000000 00000000 00000000 */\n    74,     /* 11111111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_L[] = {\n    /* 0101 1001 1011 1100 1110 1011 1011 1111 */\n       0x59,     0xbc,     0xeb,     0xbf,\n    /* 0001 1110 0111 1101 0111 1011 0111 1011 */\n       0x1e,     0x7d,     0x7b,     0x7b,\n    /* 1111 1100 0011 1110 0011 1111 0010 1111 */\n       0xfc,     0x3e,     0x3f,     0x2f,\n    /* 1001 1111 1101 0001 1111 0100 1111 1101 */\n       0x9f,     0xd1,     0xf4,     0xfd,\n    /* 1101 1111 0111 1111 1110 0000 1111 1100 */\n       0xdf,     0x7f,     0xe0,     0xfc,\n    /* 0011 1111 1011 1011 1111 0111 1111 1111 */\n       0x3f,     0xbb,     0xf7,     0xff,\n    /* 0000 0011 1111 1000 0011 1111 1101 1110 */\n       0x03,     0xf8,     0x3f,     0xde,\n    /* 1111 1110 1111 1111 1111 1000 0000 0000 */\n       0xfe,     0xff,     0xf8,     0x00,\n    /* 0000 0000 0000 0000 0000 0111 1111 1000 */\n       0x00,     0x00,     0x07,     0xf8,\n    /* 0000 0000 0000 0000 0000 0000 0000 1 */\n       0x00,     0x00,     0x00,     0x08,\n};\n\n/* test code for Table B.13 - Standard Huffman table M */\nconst int32_t test_output_M[] = {\n    /* line 0, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    1,      /* 0 */\n    /* line 1, PREFLEN=3, RANGELEN=0, VAL=2, 100 */\n    2,      /* 100 */\n    /* line 2, PREFLEN=3, RANGELEN=0, VAL=3, 1100 */\n    3,      /* 1100 */\n    /* line 3, PREFLEN=5, RANGELEN=0, VAL=4, 11100 */\n    4,      /* 11100 */\n    /* line 4, PREFLEN=4, RANGELEN=1, VAL=5..6, 1101+(VAL-5) */\n    5,      /* 1101 0 */\n    6,      /* 1101 1 */\n    /* line 5, PREFLEN=3, RANGELEN=3, VAL=7..14, 101+(VAL-7) */\n    7,      /* 101 000 */\n    8,      /* 101 001 */\n    13,     /* 101 110 */\n    14,     /* 101 111 */\n    /* line 6, PREFLEN=6, RANGELEN=1, VAL=15..16, 111010+(VAL-15) */\n    15,     /* 111010 0 */\n    16,     /* 111010 1 */\n    /* line 7, PREFLEN=6, RANGELEN=2, VAL=17..20, 111011+(VAL-17) */\n    17,     /* 111011 00 */\n    18,     /* 111011 01 */\n    19,     /* 111011 10 */\n    20,     /* 111011 11 */\n    /* line 8, PREFLEN=6, RANGELEN=3, VAL=21..28, 111100+(VAL-21) */\n    21,     /* 111100 000 */\n    22,     /* 111100 001 */\n    27,     /* 111100 110 */\n    28,     /* 111100 111 */\n    /* line 9, PREFLEN=6, RANGELEN=4, VAL=29..44, 111101+(VAL-29) */\n    29,     /* 111101 0000 */\n    30,     /* 111101 0001 */\n    43,     /* 111101 1110 */\n    44,     /* 111101 1111 */\n    /* line 10, PREFLEN=6, RANGELEN=5, VAL=45..76, 111110+(VAL-45) */\n    45,     /* 111110 00000 */\n    46,     /* 111110 00001 */\n    75,     /* 111110 11110 */\n    76,     /* 111110 11111 */\n    /* line 11, PREFLEN=7, RANGELEN=6, VAL=77..140, 1111110+(VAL-77) */\n    77,     /* 1111110 000000 */\n    78,     /* 1111110 000001 */\n    139,    /* 1111110 111110 */\n    140,    /* 1111110 111111 */\n    /* line 12, PREFLEN=7, RANGELEN=32, VAL=141..INF, 1111111+(VAL-141) */\n    141,    /* 1111111 00000000 00000000 00000000 00000000 */\n    142,    /* 1111111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_M[] = {\n    /* 0100 1100 1110 0110 1011 0111 0100 0101 */\n       0x4c,     0xe6,     0xb7,     0x45,\n    /* 0011 0111 0101 1111 1101 0011 1010 1111 */\n       0x37,     0x5f,     0xd3,     0xaf,\n    /* 0110 0111 0110 1111 0111 0111 0111 1111 */\n       0x67,     0x6f,     0x77,     0x7f,\n    /* 1000 0011 1100 0011 1110 0110 1111 0011 */\n       0x83,     0xc3,     0xe6,     0xf3,\n    /* 1111 1010 0001 1110 1000 1111 1011 1101 */\n       0xfa,     0x1e,     0x8f,     0xbd,\n    /* 1110 1111 1111 1100 0000 1111 1000 0011 */\n       0xef,     0xfc,     0x0f,     0x83,\n    /* 1111 0111 1011 1110 1111 1111 1110 0000 */\n       0xf7,     0xbe,     0xff,     0xe0,\n    /* 0011 1111 0000 0011 1111 1011 1110 1111 */\n       0x3f,     0x03,     0xfb,     0xef,\n    /* 1101 1111 1111 1111 0000 0000 0000 0000 */\n       0xdf,     0xff,     0x00,     0x00,\n    /* 0000 0000 0000 0000 1111 1110 0000 0000 */\n       0x00,     0x00,     0xfe,     0x00,\n    /* 0000 0000 0000 0000 0000 001 */\n       0x00,     0x00,     0x02,\n};\n\n/* test code for Table B.14 - Standard Huffman table N */\nconst int32_t test_output_N[] = {\n    /* line 0, PREFLEN=3, RANGELEN=0, VAL=-2, 100 */\n    -2,     /* 100 */\n    /* line 1, PREFLEN=3, RANGELEN=0, VAL=-1, 101 */\n    -1,     /* 101 */\n    /* line 2, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    0,      /* 0 */\n    /* line 3, PREFLEN=3, RANGELEN=0, VAL=1, 110 */\n    1,      /* 110 */\n    /* line 4, PREFLEN=3, RANGELEN=0, VAL=2, 111 */\n    2,      /* 111 */\n};\nconst byte test_input_N[] = {\n    /* 1001 0101 1011 1 */\n       0x95,     0xb8,\n};\n\n/* test code for Table B.15 - Standard Huffman table O */\nconst int32_t test_output_O[] = {\n    /* line 0, PREFLEN=7, RANGELEN=4, VAL=-24..-9, 1111100+(VAL+24) */\n    -24,    /* 1111100 0000 */\n    -23,    /* 1111100 0001 */\n    -10,    /* 1111100 1110 */\n    -9,     /* 1111100 1111 */\n    /* line 1, PREFLEN=6, RANGELEN=2, VAL=-8..-5, 111100+(VAL+8) */\n    -8,     /* 111100 00 */\n    -7,     /* 111100 01 */\n    -6,     /* 111100 10 */\n    -5,     /* 111100 11 */\n    /* line 2, PREFLEN=5, RANGELEN=1, VAL=-4..-3, 11100+(VAL+4) */\n    -4,     /* 11100 0 */\n    -3,     /* 11100 1 */\n    /* line 3, PREFLEN=4, RANGELEN=0, VAL=-2, 1100 */\n    -2,     /* 1100 */\n    /* line 4, PREFLEN=3, RANGELEN=0, VAL=-1, 100 */\n    -1,     /* 100 */\n    /* line 5, PREFLEN=1, RANGELEN=0, VAL=1, 0 */\n    0,      /* 0 */\n    /* line 6, PREFLEN=3, RANGELEN=0, VAL=1, 101 */\n    1,      /* 101 */\n    /* line 7, PREFLEN=4, RANGELEN=0, VAL=2, 1101 */\n    2,      /* 1101 */\n    /* line 8, PREFLEN=5, RANGELEN=1, VAL=3..4, 11101+(VAL-3) */\n    3,      /* 11101 0 */\n    4,      /* 11101 1 */\n    /* line 9, PREFLEN=6, RANGELEN=2, VAL=5..8, 111101+(VAL-5) */\n    5,      /* 111101 00 */\n    6,      /* 111101 01 */\n    7,      /* 111101 10 */\n    8,      /* 111101 11 */\n    /* line 10, PREFLEN=7, RANGELEN=4, VAL=9..24, 1111101+(VAL-9) */\n    9,      /* 1111101 0000 */\n    10,     /* 1111101 0001 */\n    23,     /* 1111101 1110 */\n    24,     /* 1111101 1111 */\n    /* line 11, PREFLEN=7, RANGELEN=32, VAL=-INF..-25, 1111110+(-25-VAL) */\n    -25,    /* 1111110 00000000 00000000 00000000 00000000 */\n    -26,    /* 1111110 00000000 00000000 00000000 00000001 */\n    /* line 12, PREFLEN=7, RANGELEN=32, VAL=25..INF, 1111111+(VAL-25) */\n    25,     /* 1111111 00000000 00000000 00000000 00000000 */\n    26,     /* 1111111 00000000 00000000 00000000 00000001 */\n};\nconst byte test_input_O[] = {\n    /* 1111 1000 0001 1111 0000 0111 1110 0111 */\n       0xf8,     0x1f,     0x07,     0xe7,\n    /* 0111 1100 1111 1111 0000 1111 0001 1111 */\n       0x7c,     0xff,     0x0f,     0x1f,\n    /* 0010 1111 0011 1110 0011 1001 1100 1000 */\n       0x2f,     0x3e,     0x39,     0xc8,\n    /* 1011 1011 1101 0111 0111 1110 1001 1110 */\n       0xbb,     0xd7,     0x7e,     0x9e,\n    /* 1011 1110 1101 1110 1111 1111 0100 0011 */\n       0xbe,     0xde,     0xff,     0x43,\n    /* 1110 1000 1111 1101 1110 1111 1011 1111 */\n       0xe8,     0xfd,     0xef,     0xbf,\n    /* 1111 1000 0000 0000 0000 0000 0000 0000 */\n       0xf8,     0x00,     0x00,     0x00,\n    /* 0000 0011 1111 0000 0000 0000 0000 0000 */\n       0x03,     0xf0,     0x00,     0x00,\n    /* 0000 0000 0000 1111 1111 0000 0000 0000 */\n       0x00,     0x0f,     0xf0,     0x00,\n    /* 0000 0000 0000 0000 0000 1111 1110 0000 */\n       0x00,     0x00,     0x0f,     0xe0,\n    /* 0000 0000 0000 0000 0000 0000 001 */\n       0x00,     0x00,     0x00,     0x20,\n};\n\ntypedef struct test_huffmancodes {\n    const char *name;\n    const Jbig2HuffmanParams *params;\n    const byte *input;\n    const size_t input_len;\n    const int32_t *output;\n    const size_t output_len;\n} test_huffmancodes_t;\n\n#define countof(x) (sizeof((x)) / sizeof((x)[0]))\n\n#define DEF_TEST_HUFFMANCODES(x) { \\\n    #x, \\\n    &jbig2_huffman_params_##x, \\\n    test_input_##x, countof(test_input_##x), \\\n    test_output_##x, countof(test_output_##x), \\\n}\n\ntest_huffmancodes_t tests[] = {\n    DEF_TEST_HUFFMANCODES(A),\n    DEF_TEST_HUFFMANCODES(B),\n    DEF_TEST_HUFFMANCODES(C),\n    DEF_TEST_HUFFMANCODES(D),\n    DEF_TEST_HUFFMANCODES(E),\n    DEF_TEST_HUFFMANCODES(F),\n    DEF_TEST_HUFFMANCODES(G),\n    DEF_TEST_HUFFMANCODES(H),\n    DEF_TEST_HUFFMANCODES(I),\n    DEF_TEST_HUFFMANCODES(J),\n    DEF_TEST_HUFFMANCODES(K),\n    DEF_TEST_HUFFMANCODES(L),\n    DEF_TEST_HUFFMANCODES(M),\n    DEF_TEST_HUFFMANCODES(N),\n    DEF_TEST_HUFFMANCODES(O),\n};\n\ntypedef struct test_stream {\n    Jbig2WordStream ws;\n    test_huffmancodes_t *h;\n} test_stream_t;\n\nstatic int\ntest_get_word2(Jbig2Ctx *ctx, Jbig2WordStream *self, size_t offset, uint32_t *word)\n{\n    test_stream_t *st = (test_stream_t *) self;\n    uint32_t val = 0;\n    int ret = 0;\n\n    if (st == NULL || st->h == NULL || word == NULL)\n        return -1;\n    if (offset >= st->h->input_len)\n        return 0;\n\n    if (offset < st->h->input_len) {\n        val |= (st->h->input[offset] << 24);\n        ret++;\n    }\n    if (offset + 1 < st->h->input_len) {\n        val |= (st->h->input[offset + 1] << 16);\n        ret++;\n    }\n    if (offset + 2 < st->h->input_len) {\n        val |= (st->h->input[offset + 2] << 8);\n        ret++;\n    }\n    if (offset + 3 < st->h->input_len) {\n        val |= st->h->input[offset + 3];\n        ret++;\n    }\n    *word = val;\n    return ret;\n}\n\nstatic int test2()\n{\n    Jbig2Ctx *ctx;\n    int success = 0;\n    int i;\n\n    ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);\n    if (ctx == NULL) {\n        fprintf(stderr, \"Failed to allocate jbig2 context\\n\");\n        return 0;\n    }\n\n    for (i = 0; i < (int) countof(tests); i++) {\n        Jbig2HuffmanTable *table;\n        Jbig2HuffmanState *hs;\n        test_stream_t st;\n        int32_t code;\n        bool oob;\n        size_t j;\n\n        st.ws.get_next_word = test_get_word2;\n        st.h = &tests[i];\n        printf(\"testing Standard Huffman table %s: \", st.h->name);\n        table = jbig2_build_huffman_table(ctx, st.h->params);\n        if (table == NULL) {\n            fprintf(stderr, \"jbig2_build_huffman_table() returned NULL!\\n\");\n            jbig2_ctx_free(ctx);\n            return 0;\n        }\n        /* jbig2_dump_huffman_table(table); */\n        hs = jbig2_huffman_new(ctx, &st.ws);\n        if (hs == NULL) {\n            fprintf(stderr, \"jbig2_huffman_new() returned NULL!\\n\");\n            jbig2_release_huffman_table(ctx, table);\n            jbig2_ctx_free(ctx);\n            return 0;\n        }\n        for (j = 0; j < st.h->output_len; j++) {\n            printf(\"%d...\", st.h->output[j]);\n            code = jbig2_huffman_get(hs, table, &oob);\n            if (code == st.h->output[j] && !oob) {\n                printf(\"ok, \");\n            } else {\n                int need_comma = 0;\n\n                printf(\"NG(\");\n                if (code != st.h->output[j]) {\n                    printf(\"%d\", code);\n                    need_comma = 1;\n                }\n                if (oob) {\n                    if (need_comma)\n                        printf(\",\");\n                    printf(\"OOB\");\n                }\n                printf(\"), \");\n            }\n        }\n        if (st.h->params->HTOOB) {\n            printf(\"OOB...\");\n            code = jbig2_huffman_get(hs, table, &oob);\n            if (oob) {\n                printf(\"ok\");\n            } else {\n                printf(\"NG(%d)\", code);\n            }\n        }\n        printf(\"\\n\");\n        jbig2_huffman_free(ctx, hs);\n        jbig2_release_huffman_table(ctx, table);\n    }\n\n    jbig2_ctx_free(ctx);\n\n    if (i == countof(tests))\n        success = 1;\n\n    return success;\n}\n\nint\nmain(int argc, char **argv)\n{\n    return test1() && test2() ? 0 : 1;\n}\n#endif\n"
  },
  {
    "path": "JBig2/src/jbig2_hufftab.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* predefined Huffman table definitions\n    -- See Annex B of the JBIG2 specification */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdlib.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_huffman.h\"\n#include \"jbig2_hufftab.h\"\n\n#define JBIG2_COUNTOF(x) (sizeof((x)) / sizeof((x)[0]))\n\n/* Table B.1 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_A[] = {\n    {1, 4, 0},\n    {2, 8, 16},\n    {3, 16, 272},\n    {0, 32, -1},                /* low */\n    {3, 32, 65808}              /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_A = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_A), jbig2_huffman_lines_A };\n\n/* Table B.2 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_B[] = {\n    {1, 0, 0},\n    {2, 0, 1},\n    {3, 0, 2},\n    {4, 3, 3},\n    {5, 6, 11},\n    {0, 32, -1},                /* low */\n    {6, 32, 75},                /* high */\n    {6, 0, 0}                   /* OOB */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_B = { TRUE, JBIG2_COUNTOF(jbig2_huffman_lines_B), jbig2_huffman_lines_B };\n\n/* Table B.3 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_C[] = {\n    {8, 8, -256},\n    {1, 0, 0},\n    {2, 0, 1},\n    {3, 0, 2},\n    {4, 3, 3},\n    {5, 6, 11},\n    {8, 32, -257},              /* low */\n    {7, 32, 75},                /* high */\n    {6, 0, 0}                   /* OOB */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_C = { TRUE, JBIG2_COUNTOF(jbig2_huffman_lines_C), jbig2_huffman_lines_C };\n\n/* Table B.4 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_D[] = {\n    {1, 0, 1},\n    {2, 0, 2},\n    {3, 0, 3},\n    {4, 3, 4},\n    {5, 6, 12},\n    {0, 32, -1},                /* low */\n    {5, 32, 76},                /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_D = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_D), jbig2_huffman_lines_D };\n\n/* Table B.5 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_E[] = {\n    {7, 8, -255},\n    {1, 0, 1},\n    {2, 0, 2},\n    {3, 0, 3},\n    {4, 3, 4},\n    {5, 6, 12},\n    {7, 32, -256},              /* low */\n    {6, 32, 76}                 /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_E = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_E), jbig2_huffman_lines_E };\n\n/* Table B.6 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_F[] = {\n    {5, 10, -2048},\n    {4, 9, -1024},\n    {4, 8, -512},\n    {4, 7, -256},\n    {5, 6, -128},\n    {5, 5, -64},\n    {4, 5, -32},\n    {2, 7, 0},\n    {3, 7, 128},\n    {3, 8, 256},\n    {4, 9, 512},\n    {4, 10, 1024},\n    {6, 32, -2049},             /* low */\n    {6, 32, 2048}               /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_F = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_F), jbig2_huffman_lines_F };\n\n/* Table B.7 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_G[] = {\n    {4, 9, -1024},\n    {3, 8, -512},\n    {4, 7, -256},\n    {5, 6, -128},\n    {5, 5, -64},\n    {4, 5, -32},\n    {4, 5, 0},\n    {5, 5, 32},\n    {5, 6, 64},\n    {4, 7, 128},\n    {3, 8, 256},\n    {3, 9, 512},\n    {3, 10, 1024},\n    {5, 32, -1025},             /* low */\n    {5, 32, 2048}               /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_G = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_G), jbig2_huffman_lines_G };\n\n/* Table B.8 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_H[] = {\n    {8, 3, -15},\n    {9, 1, -7},\n    {8, 1, -5},\n    {9, 0, -3},\n    {7, 0, -2},\n    {4, 0, -1},\n    {2, 1, 0},\n    {5, 0, 2},\n    {6, 0, 3},\n    {3, 4, 4},\n    {6, 1, 20},\n    {4, 4, 22},\n    {4, 5, 38},\n    {5, 6, 70},\n    {5, 7, 134},\n    {6, 7, 262},\n    {7, 8, 390},\n    {6, 10, 646},\n    {9, 32, -16},               /* low */\n    {9, 32, 1670},              /* high */\n    {2, 0, 0}                   /* OOB */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_H = { TRUE, JBIG2_COUNTOF(jbig2_huffman_lines_H), jbig2_huffman_lines_H };\n\n/* Table B.9 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_I[] = {\n    {8, 4, -31},\n    {9, 2, -15},\n    {8, 2, -11},\n    {9, 1, -7},\n    {7, 1, -5},\n    {4, 1, -3},\n    {3, 1, -1},\n    {3, 1, 1},\n    {5, 1, 3},\n    {6, 1, 5},\n    {3, 5, 7},\n    {6, 2, 39},\n    {4, 5, 43},\n    {4, 6, 75},\n    {5, 7, 139},\n    {5, 8, 267},\n    {6, 8, 523},\n    {7, 9, 779},\n    {6, 11, 1291},\n    {9, 32, -32},               /* low */\n    {9, 32, 3339},              /* high */\n    {2, 0, 0}                   /* OOB */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_I = { TRUE, JBIG2_COUNTOF(jbig2_huffman_lines_I), jbig2_huffman_lines_I };\n\n/* Table B.10 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_J[] = {\n    {7, 4, -21},\n    {8, 0, -5},\n    {7, 0, -4},\n    {5, 0, -3},\n    {2, 2, -2},\n    {5, 0, 2},\n    {6, 0, 3},\n    {7, 0, 4},\n    {8, 0, 5},\n    {2, 6, 6},\n    {5, 5, 70},\n    {6, 5, 102},\n    {6, 6, 134},\n    {6, 7, 198},\n    {6, 8, 326},\n    {6, 9, 582},\n    {6, 10, 1094},\n    {7, 11, 2118},\n    {8, 32, -22},               /* low */\n    {8, 32, 4166},              /* high */\n    {2, 0, 0}                   /* OOB */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_J = { TRUE, JBIG2_COUNTOF(jbig2_huffman_lines_J), jbig2_huffman_lines_J };\n\n/* Table B.11 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_K[] = {\n    {1, 0, 1},\n    {2, 1, 2},\n    {4, 0, 4},\n    {4, 1, 5},\n    {5, 1, 7},\n    {5, 2, 9},\n    {6, 2, 13},\n    {7, 2, 17},\n    {7, 3, 21},\n    {7, 4, 29},\n    {7, 5, 45},\n    {7, 6, 77},\n    {0, 32, -1},                /* low */\n    {7, 32, 141}                /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_K = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_K), jbig2_huffman_lines_K };\n\n/* Table B.12 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_L[] = {\n    {1, 0, 1},\n    {2, 0, 2},\n    {3, 1, 3},\n    {5, 0, 5},\n    {5, 1, 6},\n    {6, 1, 8},\n    {7, 0, 10},\n    {7, 1, 11},\n    {7, 2, 13},\n    {7, 3, 17},\n    {7, 4, 25},\n    {8, 5, 41},\n    {8, 32, 73},\n    {0, 32, -1},                /* low */\n    {0, 32, 0}                  /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_L = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_L), jbig2_huffman_lines_L };\n\n/* Table B.13 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_M[] = {\n    {1, 0, 1},\n    {3, 0, 2},\n    {4, 0, 3},\n    {5, 0, 4},\n    {4, 1, 5},\n    {3, 3, 7},\n    {6, 1, 15},\n    {6, 2, 17},\n    {6, 3, 21},\n    {6, 4, 29},\n    {6, 5, 45},\n    {7, 6, 77},\n    {0, 32, -1},                /* low */\n    {7, 32, 141}                /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_M = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_M), jbig2_huffman_lines_M };\n\n/* Table B.14 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_N[] = {\n    {3, 0, -2},\n    {3, 0, -1},\n    {1, 0, 0},\n    {3, 0, 1},\n    {3, 0, 2},\n    {0, 32, -1},                /* low */\n    {0, 32, 3},                 /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_N = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_N), jbig2_huffman_lines_N };\n\n/* Table B.15 */\nstatic const Jbig2HuffmanLine jbig2_huffman_lines_O[] = {\n    {7, 4, -24},\n    {6, 2, -8},\n    {5, 1, -4},\n    {4, 0, -2},\n    {3, 0, -1},\n    {1, 0, 0},\n    {3, 0, 1},\n    {4, 0, 2},\n    {5, 1, 3},\n    {6, 2, 5},\n    {7, 4, 9},\n    {7, 32, -25},               /* low */\n    {7, 32, 25}                 /* high */\n};\n\nconst Jbig2HuffmanParams jbig2_huffman_params_O = { FALSE, JBIG2_COUNTOF(jbig2_huffman_lines_O), jbig2_huffman_lines_O };\n"
  },
  {
    "path": "JBig2/src/jbig2_image.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>             /* memcpy() */\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_image.h\"\n\n/* allocate a Jbig2Image structure and its associated bitmap */\nJbig2Image *\njbig2_image_new(Jbig2Ctx *ctx, uint32_t width, uint32_t height)\n{\n    Jbig2Image *image;\n    uint32_t stride;\n\n    if (width == 0 || height == 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to create zero sized image\");\n        return NULL;\n    }\n\n    image = jbig2_new(ctx, Jbig2Image, 1);\n    if (image == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate image\");\n        return NULL;\n    }\n\n    stride = ((width - 1) >> 3) + 1;    /* generate a byte-aligned stride */\n\n    /* check for integer multiplication overflow */\n    if (height > (INT32_MAX / stride)) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"integer multiplication overflow (stride=%u, height=%u)\", stride, height);\n        jbig2_free(ctx->allocator, image);\n        return NULL;\n    }\n    image->data = jbig2_new(ctx, uint8_t, (size_t) height * stride);\n    if (image->data == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate image data buffer (stride=%u, height=%u)\", stride, height);\n        jbig2_free(ctx->allocator, image);\n        return NULL;\n    }\n\n    image->width = width;\n    image->height = height;\n    image->stride = stride;\n    image->refcount = 1;\n\n    return image;\n}\n\n/* bump the reference count for an image pointer */\nJbig2Image *\njbig2_image_reference(Jbig2Ctx *ctx, Jbig2Image *image)\n{\n    if (image)\n        image->refcount++;\n    return image;\n}\n\n/* release an image pointer, freeing it it appropriate */\nvoid\njbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image)\n{\n    if (image == NULL)\n        return;\n    image->refcount--;\n    if (image->refcount == 0)\n        jbig2_image_free(ctx, image);\n}\n\n/* free a Jbig2Image structure and its associated memory */\nvoid\njbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image)\n{\n    if (image != NULL) {\n        jbig2_free(ctx->allocator, image->data);\n        jbig2_free(ctx->allocator, image);\n    }\n}\n\n/* resize a Jbig2Image */\nJbig2Image *\njbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image, uint32_t width, uint32_t height, int value)\n{\n    if (width == image->width) {\n        uint8_t *data;\n\n        /* check for integer multiplication overflow */\n        if (image->height > (INT32_MAX / image->stride)) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"integer multiplication overflow during resize (stride=%u, height=%u)\", image->stride, height);\n            return NULL;\n        }\n        /* use the same stride, just change the length */\n        data = jbig2_renew(ctx, image->data, uint8_t, (size_t) height * image->stride);\n        if (data == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to reallocate image\");\n            return NULL;\n        }\n        image->data = data;\n        if (height > image->height) {\n            const uint8_t fill = value ? 0xFF : 0x00;\n            memset(image->data + (size_t) image->height * image->stride, fill, ((size_t) height - image->height) * image->stride);\n        }\n        image->height = height;\n\n    } else {\n        Jbig2Image *newimage;\n        int code;\n\n        /* Unoptimized implementation, but it works. */\n\n        newimage = jbig2_image_new(ctx, width, height);\n        if (newimage == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate resized image\");\n            return NULL;\n        }\n        jbig2_image_clear(ctx, newimage, value);\n\n        code = jbig2_image_compose(ctx, newimage, image, 0, 0, JBIG2_COMPOSE_REPLACE);\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to compose image buffers when resizing\");\n            jbig2_image_release(ctx, newimage);\n            return NULL;\n        }\n\n        /* if refcount > 1 the original image, its pointer must\n        be kept, so simply replaces its innards, and throw away\n        the empty new image shell. */\n        jbig2_free(ctx->allocator, image->data);\n        image->width = newimage->width;\n        image->height = newimage->height;\n        image->stride = newimage->stride;\n        image->data = newimage->data;\n        jbig2_free(ctx->allocator, newimage);\n    }\n\n    return image;\n}\n\nstatic inline void\ntemplate_image_compose_opt(const uint8_t * JBIG2_RESTRICT ss, uint8_t * JBIG2_RESTRICT dd, int early, int late, uint8_t leftmask, uint8_t rightmask, uint32_t bytewidth_, uint32_t h, uint32_t shift, uint32_t dstride, uint32_t sstride, Jbig2ComposeOp op)\n{\n    int i;\n    uint32_t j;\n    int bytewidth = (int)bytewidth_;\n\n    if (bytewidth == 1) {\n        for (j = 0; j < h; j++) {\n            /* Only 1 byte! */\n            uint8_t v = (((early ? 0 : ss[0]<<8) | (late ? 0 : ss[1]))>>shift);\n            if (op == JBIG2_COMPOSE_OR)\n                *dd |= v & leftmask;\n            else if (op == JBIG2_COMPOSE_AND)\n                *dd &= (v & leftmask) | ~leftmask;\n            else if (op == JBIG2_COMPOSE_XOR)\n                *dd ^= v & leftmask;\n            else if (op == JBIG2_COMPOSE_XNOR)\n                *dd ^= (~v) & leftmask;\n            else /* Replace */\n                *dd = (v & leftmask) | (*dd & ~leftmask);\n            dd += dstride;\n            ss += sstride;\n        }\n        return;\n    }\n    bytewidth -= 2;\n    if (shift == 0) {\n        ss++;\n        for (j = 0; j < h; j++) {\n            /* Left byte */\n            const uint8_t * JBIG2_RESTRICT s = ss;\n            uint8_t * JBIG2_RESTRICT d = dd;\n            if (op == JBIG2_COMPOSE_OR)\n                *d++ |= *s++ & leftmask;\n            else if (op == JBIG2_COMPOSE_AND)\n                *d++ &= (*s++ & leftmask) | ~leftmask;\n            else if (op == JBIG2_COMPOSE_XOR)\n                *d++ ^= *s++ & leftmask;\n            else if (op == JBIG2_COMPOSE_XNOR)\n                *d++ ^= (~*s++) & leftmask;\n            else /* Replace */\n                *d = (*s++ & leftmask) | (*d & ~leftmask), d++;\n            /* Central run */\n            for (i = bytewidth; i != 0; i--) {\n                if (op == JBIG2_COMPOSE_OR)\n                    *d++ |= *s++;\n                else if (op == JBIG2_COMPOSE_AND)\n                    *d++ &= *s++;\n                else if (op == JBIG2_COMPOSE_XOR)\n                    *d++ ^= *s++;\n                else if (op == JBIG2_COMPOSE_XNOR)\n                    *d++ ^= ~*s++;\n                else /* Replace */\n                    *d++ = *s++;\n            }\n            /* Right byte */\n            if (op == JBIG2_COMPOSE_OR)\n                *d |= *s & rightmask;\n            else if (op == JBIG2_COMPOSE_AND)\n                *d &= (*s & rightmask) | ~rightmask;\n            else if (op == JBIG2_COMPOSE_XOR)\n                *d ^= *s & rightmask;\n            else if (op == JBIG2_COMPOSE_XNOR)\n                *d ^= (~*s) & rightmask;\n            else /* Replace */\n                *d = (*s & rightmask) | (*d & ~rightmask);\n            dd += dstride;\n            ss += sstride;\n        }\n    } else {\n        for (j = 0; j < h; j++) {\n            /* Left byte */\n            const uint8_t * JBIG2_RESTRICT s = ss;\n            uint8_t * JBIG2_RESTRICT d = dd;\n            uint8_t s0, s1, v;\n            s0 = early ? 0 : *s;\n            s++;\n            s1 = *s++;\n            v = ((s0<<8) | s1)>>shift;\n            if (op == JBIG2_COMPOSE_OR)\n                *d++ |= v & leftmask;\n            else if (op == JBIG2_COMPOSE_AND)\n                *d++ &= (v & leftmask) | ~leftmask;\n            else if (op == JBIG2_COMPOSE_XOR)\n                *d++ ^= v & leftmask;\n            else if (op == JBIG2_COMPOSE_XNOR)\n                *d++ ^= (~v) & leftmask;\n            else /* Replace */\n                *d = (v & leftmask) | (*d & ~leftmask), d++;\n            /* Central run */\n            for (i = bytewidth; i > 0; i--) {\n                s0 = s1; s1 = *s++;\n                v = ((s0<<8) | s1)>>shift;\n                if (op == JBIG2_COMPOSE_OR)\n                    *d++ |= v;\n                else if (op == JBIG2_COMPOSE_AND)\n                    *d++ &= v;\n                else if (op == JBIG2_COMPOSE_XOR)\n                    *d++ ^= v;\n                else if (op == JBIG2_COMPOSE_XNOR)\n                    *d++ ^= ~v;\n                else /* Replace */\n                    *d++ = v;\n            }\n            /* Right byte */\n            s0 = s1; s1 = (late ? 0 : *s);\n            v = (((s0<<8) | s1)>>shift);\n            if (op == JBIG2_COMPOSE_OR)\n                *d |= v & rightmask;\n            else if (op == JBIG2_COMPOSE_AND)\n                *d &= (v & rightmask) | ~rightmask;\n            else if (op == JBIG2_COMPOSE_XOR)\n                *d ^= v & rightmask;\n            else if (op == JBIG2_COMPOSE_XNOR)\n                *d ^= ~v & rightmask;\n            else /* Replace */\n                *d = (v & rightmask) | (*d & ~rightmask);\n            dd += dstride;\n            ss += sstride;\n        }\n    }\n}\n\nstatic void\njbig2_image_compose_opt_OR(const uint8_t *s, uint8_t *d, int early, int late, uint8_t mask, uint8_t rightmask, uint32_t bytewidth, uint32_t h, uint32_t shift, uint32_t dstride, uint32_t sstride)\n{\n    if (early || late)\n        template_image_compose_opt(s, d, early, late, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_OR);\n    else\n        template_image_compose_opt(s, d, 0, 0, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_OR);\n}\n\nstatic void\njbig2_image_compose_opt_AND(const uint8_t *s, uint8_t *d, int early, int late, uint8_t mask, uint8_t rightmask, uint32_t bytewidth, uint32_t h, uint32_t shift, uint32_t dstride, uint32_t sstride)\n{\n    if (early || late)\n        template_image_compose_opt(s, d, early, late, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_AND);\n    else\n        template_image_compose_opt(s, d, 0, 0, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_AND);\n}\n\nstatic void\njbig2_image_compose_opt_XOR(const uint8_t *s, uint8_t *d, int early, int late, uint8_t mask, uint8_t rightmask, uint32_t bytewidth, uint32_t h, uint32_t shift, uint32_t dstride, uint32_t sstride)\n{\n    if (early || late)\n        template_image_compose_opt(s, d, early, late, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_XOR);\n    else\n        template_image_compose_opt(s, d, 0, 0, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_XOR);\n}\n\nstatic void\njbig2_image_compose_opt_XNOR(const uint8_t *s, uint8_t *d, int early, int late, uint8_t mask, uint8_t rightmask, uint32_t bytewidth, uint32_t h, uint32_t shift, uint32_t dstride, uint32_t sstride)\n{\n    if (early || late)\n        template_image_compose_opt(s, d, early, late, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_XNOR);\n    else\n        template_image_compose_opt(s, d, 0, 0, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_XNOR);\n}\n\nstatic void\njbig2_image_compose_opt_REPLACE(const uint8_t *s, uint8_t *d, int early, int late, uint8_t mask, uint8_t rightmask, uint32_t bytewidth, uint32_t h, uint32_t shift, uint32_t dstride, uint32_t sstride)\n{\n    if (early || late)\n        template_image_compose_opt(s, d, early, late, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_REPLACE);\n    else\n        template_image_compose_opt(s, d, 0, 0, mask, rightmask, bytewidth, h, shift, dstride, sstride, JBIG2_COMPOSE_REPLACE);\n}\n\n/* composite one jbig2_image onto another */\nint\njbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op)\n{\n    uint32_t w, h;\n    uint32_t shift;\n    uint32_t leftbyte;\n    uint8_t *ss;\n    uint8_t *dd;\n    uint8_t leftmask, rightmask;\n    int early = x >= 0;\n    int late;\n    uint32_t bytewidth;\n    uint32_t syoffset = 0;\n\n    if (src == NULL)\n        return 0;\n\n    if ((UINT32_MAX - src->width  < (uint32_t) (x > 0 ? x : -x)) ||\n        (UINT32_MAX - src->height < (uint32_t) (y > 0 ? y : -y)))\n    {\n#ifdef JBIG2_DEBUG\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"overflow in compose_image\");\n#endif\n        return 0;\n    }\n\n    /* This code takes a src image and combines it onto dst at offset (x,y), with operation op. */\n\n    /* Data is packed msb first within a byte, so with bits numbered: 01234567.\n     * Second byte is: 89abcdef. So to combine into a run, we use:\n     *       (s[0]<<8) | s[1] == 0123456789abcdef.\n     * To read from src into dst at offset 3, we need to read:\n     *    read:      0123456789abcdef...\n     *    write:  0123456798abcdef...\n     * In general, to read from src and write into dst at offset x, we need to shift\n     * down by (x&7) bits to allow for bit alignment. So shift = x&7.\n     * So the 'central' part of our runs will see us doing:\n     *   *d++ op= ((s[0]<<8)|s[1])>>shift;\n     * with special cases on the left and right edges of the run to mask.\n     * With the left hand edge, we have to be careful not to 'underread' the start of\n     * the src image; this is what the early flag is about. Similarly we have to be\n     * careful not to read off the right hand edge; this is what the late flag is for.\n     */\n\n    /* clip */\n    w = src->width;\n    h = src->height;\n    shift = (x & 7);\n    ss = src->data - early;\n\n    if (x < 0) {\n        if (w < (uint32_t) -x)\n            w = 0;\n        else\n            w += x;\n        ss += (-x-1)>>3;\n        x = 0;\n    }\n    if (y < 0) {\n        if (h < (uint32_t) -y)\n            h = 0;\n        else\n            h += y;\n        syoffset = -y * src->stride;\n        y = 0;\n    }\n    if ((uint32_t)x + w > dst->width)\n    {\n        if (dst->width < (uint32_t)x)\n            w = 0;\n        else\n            w = dst->width - x;\n    }\n    if ((uint32_t)y + h > dst->height)\n    {\n        if (dst->height < (uint32_t)y)\n            h = 0;\n        else\n            h = dst->height - y;\n    }\n#ifdef JBIG2_DEBUG\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"compositing %dx%d at (%d, %d) after clipping\", w, h, x, y);\n#endif\n\n    /* check for zero clipping region */\n    if ((w <= 0) || (h <= 0)) {\n#ifdef JBIG2_DEBUG\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"zero clipping region\");\n#endif\n        return 0;\n    }\n\n    leftbyte = (uint32_t) x >> 3;\n    dd = dst->data + y * dst->stride + leftbyte;\n    bytewidth = (((uint32_t) x + w - 1) >> 3) - leftbyte + 1;\n    leftmask = 255>>(x&7);\n    rightmask = (((x+w)&7) == 0) ? 255 : ~(255>>((x+w)&7));\n    if (bytewidth == 1)\n        leftmask &= rightmask;\n    late = (ss + bytewidth >= src->data + ((src->width+7)>>3));\n    ss += syoffset;\n\n    switch(op)\n    {\n    case JBIG2_COMPOSE_OR:\n        jbig2_image_compose_opt_OR(ss, dd, early, late, leftmask, rightmask, bytewidth, h, shift, dst->stride, src->stride);\n        break;\n    case JBIG2_COMPOSE_AND:\n        jbig2_image_compose_opt_AND(ss, dd, early, late, leftmask, rightmask, bytewidth, h, shift, dst->stride, src->stride);\n        break;\n    case JBIG2_COMPOSE_XOR:\n        jbig2_image_compose_opt_XOR(ss, dd, early, late, leftmask, rightmask, bytewidth, h, shift, dst->stride, src->stride);\n        break;\n    case JBIG2_COMPOSE_XNOR:\n        jbig2_image_compose_opt_XNOR(ss, dd, early, late, leftmask, rightmask, bytewidth, h, shift, dst->stride, src->stride);\n        break;\n    case JBIG2_COMPOSE_REPLACE:\n        jbig2_image_compose_opt_REPLACE(ss, dd, early, late, leftmask, rightmask, bytewidth, h, shift, dst->stride, src->stride);\n        break;\n    }\n\n    return 0;\n}\n\n/* initialize an image bitmap to a constant value */\nvoid\njbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value)\n{\n    const uint8_t fill = value ? 0xFF : 0x00;\n\n    memset(image->data, fill, image->stride * image->height);\n}\n\n/* look up a pixel value in an image.\n   returns 0 outside the image frame for the convenience of\n   the template code\n*/\nint\njbig2_image_get_pixel(Jbig2Image *image, int x, int y)\n{\n    const int w = image->width;\n    const int h = image->height;\n    const int byte = (x >> 3) + y * image->stride;\n    const int bit = 7 - (x & 7);\n\n    if ((x < 0) || (x >= w))\n        return 0;\n    if ((y < 0) || (y >= h))\n        return 0;\n\n    return ((image->data[byte] >> bit) & 1);\n}\n\n/* set an individual pixel value in an image */\nvoid\njbig2_image_set_pixel(Jbig2Image *image, int x, int y, bool value)\n{\n    const int w = image->width;\n    const int h = image->height;\n    int scratch, mask;\n    int bit, byte;\n\n    if ((x < 0) || (x >= w))\n        return;\n    if ((y < 0) || (y >= h))\n        return;\n\n    byte = (x >> 3) + y * image->stride;\n    bit = 7 - (x & 7);\n    mask = (1 << bit) ^ 0xff;\n\n    scratch = image->data[byte] & mask;\n    image->data[byte] = scratch | (value << bit);\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_image_pbm.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdio.h>\n#include <ctype.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_image_rw.h\"\n\n/* take an image structure and write it to a file in pbm format */\n\nint\njbig2_image_write_pbm_file(Jbig2Image *image, char *filename)\n{\n    FILE *out;\n    int code;\n\n    if ((out = fopen(filename, \"wb\")) == NULL) {\n        fprintf(stderr, \"unable to open '%s' for writing\", filename);\n        return 1;\n    }\n\n    code = jbig2_image_write_pbm(image, out);\n\n    fclose(out);\n    return (code);\n}\n\n/* write out an image struct as a pbm stream to an open file pointer */\n\nint\njbig2_image_write_pbm(Jbig2Image *image, FILE *out)\n{\n    /* pbm header */\n    fprintf(out, \"P4\\n%d %d\\n\", image->width, image->height);\n\n    /* pbm format pads to a byte boundary, so we can\n       just write out the whole data buffer\n       NB: this assumes minimal stride for the width */\n    fwrite(image->data, 1, image->height * image->stride, out);\n\n    /* success */\n    return 0;\n}\n\n/* take an image from a file in pbm format */\nJbig2Image *\njbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename)\n{\n    FILE *in;\n    Jbig2Image *image;\n\n    if ((in = fopen(filename, \"rb\")) == NULL) {\n        fprintf(stderr, \"unable to open '%s' for reading\\n\", filename);\n        return NULL;\n    }\n\n    image = jbig2_image_read_pbm(ctx, in);\n\n    fclose(in);\n\n    return (image);\n}\n\n/* FIXME: should handle multi-image files */\nJbig2Image *\njbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in)\n{\n    int i, dim[2];\n    int done;\n    Jbig2Image *image;\n    int c;\n    char buf[32];\n\n    /* look for 'P4' magic */\n    while ((c = fgetc(in)) != 'P') {\n        if (feof(in))\n            return NULL;\n    }\n    if ((c = fgetc(in)) != '4') {\n        fprintf(stderr, \"not a binary pbm file.\\n\");\n        return NULL;\n    }\n    /* read size. we must find two decimal numbers representing\n       the image dimensions. 'done' will index whether we're\n       looking for the width or the height and 'i' will be our\n       array index for copying strings into our buffer */\n    done = 0;\n    i = 0;\n    while (done < 2) {\n        c = fgetc(in);\n        /* skip whitespace */\n        if (c == ' ' || c == '\\t' || c == '\\r' || c == '\\n')\n            continue;\n        /* skip comments */\n        if (c == '#') {\n            while ((c = fgetc(in)) != '\\n');\n            continue;\n        }\n        /* report unexpected eof */\n        if (c == EOF) {\n            fprintf(stderr, \"end-of-file parsing pbm header\\n\");\n            return NULL;\n        }\n        if (isdigit(c)) {\n            buf[i++] = c;\n            while (isdigit(c = fgetc(in))) {\n                if (i >= 32) {\n                    fprintf(stderr, \"pbm parsing error\\n\");\n                    return NULL;\n                }\n                buf[i++] = c;\n            }\n            buf[i] = '\\0';\n            if (sscanf(buf, \"%d\", &dim[done]) != 1) {\n                fprintf(stderr, \"failed to read pbm image dimensions\\n\");\n                return NULL;\n            }\n            i = 0;\n            done++;\n        }\n    }\n    /* allocate image structure */\n    image = jbig2_image_new(ctx, dim[0], dim[1]);\n    if (image == NULL) {\n        fprintf(stderr, \"failed to allocate %dx%d image for pbm file\\n\", dim[0], dim[1]);\n        return NULL;\n    }\n    /* the pbm data is byte-aligned, so we can\n       do a simple block read */\n    (void)fread(image->data, 1, image->height * image->stride, in);\n    if (feof(in)) {\n        fprintf(stderr, \"unexpected end of pbm file.\\n\");\n        jbig2_image_release(ctx, image);\n        return NULL;\n    }\n    /* success */\n    return image;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_image_png.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <png.h>\n\n#ifndef OLD_LIB_PNG\n# if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR < 2\n#  define OLD_LIB_PNG 1\n# else\n#  define OLD_LIB_PNG 0\n# endif\n#endif\n\n#if OLD_LIB_PNG\n#include <pngstruct.h>\n#endif\n\n#define CVT_PTR(ptr) (ptr)\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_image.h\"\n\n/* take an image structure and write it out in png format */\n\nstatic void\njbig2_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)\n{\n    png_size_t check;\n\n#if OLD_LIB_PNG\n    png_FILE_p f = (png_FILE_p) png_ptr->io_ptr;\n#else\n    png_FILE_p f = (png_FILE_p) png_get_io_ptr(png_ptr);\n#endif\n\n    check = fwrite(data, 1, length, f);\n    if (check != length) {\n        png_error(png_ptr, \"write error\");\n    }\n}\n\nstatic void\njbig2_png_flush(png_structp png_ptr)\n{\n#if OLD_LIB_PNG\n    png_FILE_p f = (png_FILE_p) png_ptr->io_ptr;\n#else\n    png_FILE_p f = (png_FILE_p) png_get_io_ptr(png_ptr);\n#endif\n\n    if (f != NULL)\n        fflush(f);\n}\n\n/* write out an image struct in png format to an open file pointer */\n\nint\njbig2_image_write_png(Jbig2Image *image, FILE *out)\n{\n    uint32_t i;\n    png_structp png;\n    png_infop info;\n    png_bytep rowpointer;\n\n    png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    if (png == NULL) {\n        fprintf(stderr, \"unable to create png structure\\n\");\n        return 2;\n    }\n\n    info = png_create_info_struct(png);\n    if (info == NULL) {\n        fprintf(stderr, \"unable to create png info structure\\n\");\n        png_destroy_write_struct(&png, (png_infopp) NULL);\n        return 3;\n    }\n\n    /* set/check error handling */\n    if (setjmp(png_jmpbuf(png))) {\n        /* we've returned here after an internal error */\n        fprintf(stderr, \"internal error in libpng saving file\\n\");\n        png_destroy_write_struct(&png, &info);\n        return 4;\n    }\n\n    /* png_init_io() doesn't work linking dynamically to libpng on win32\n       one has to either link statically or use callbacks because of runtime\n       variations */\n    /* png_init_io(png, out); */\n    png_set_write_fn(png, (png_voidp) out, jbig2_png_write_data, jbig2_png_flush);\n\n    /* now we fill out the info structure with our format data */\n    png_set_IHDR(png, info, image->width, image->height, 1, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);\n    png_write_info(png, info);\n\n    /* png natively treats 0 as black. This will convert for us */\n    png_set_invert_mono(png);\n\n    /* write out each row in turn */\n    rowpointer = (png_bytep) image->data;\n    for (i = 0; i < image->height; i++) {\n        png_write_row(png, rowpointer);\n        rowpointer += image->stride;\n    }\n\n    /* finish and clean up */\n    png_write_end(png, info);\n    png_destroy_write_struct(&png, &info);\n\n    return 0;\n}\n\nint\njbig2_image_write_png_file(Jbig2Image *image, char *filename)\n{\n    FILE *out;\n    int code;\n\n    if ((out = fopen(filename, \"wb\")) == NULL) {\n        fprintf(stderr, \"unable to open '%s' for writing\\n\", filename);\n        return 1;\n    }\n\n    code = jbig2_image_write_png(image, out);\n\n    fclose(out);\n    return (code);\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_mmr.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* An implementation of MMR decoding. This is based on the\n   implementation in Fitz, which in turn is based on the one\n   in Ghostscript.\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <assert.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_mmr.h\"\n#include \"jbig2_segment.h\"\n\ntypedef struct {\n    uint32_t width;\n    uint32_t height;\n    const byte *data;\n    size_t size;\n    size_t consumed_bits;\n    uint32_t data_index;\n    uint32_t bit_index;\n    uint32_t word;\n} Jbig2MmrCtx;\n\n#define MINUS1 UINT32_MAX\n#define ERROR -1\n#define ZEROES -2\n#define UNCOMPRESSED -3\n\nstatic void\njbig2_decode_mmr_init(Jbig2MmrCtx *mmr, int width, int height, const byte *data, size_t size)\n{\n    mmr->width = width;\n    mmr->height = height;\n    mmr->data = data;\n    mmr->size = size;\n    mmr->data_index = 0;\n    mmr->bit_index = 32;\n    mmr->word = 0;\n    mmr->consumed_bits = 0;\n\n    while (mmr->bit_index >= 8 && mmr->data_index < mmr->size) {\n        mmr->bit_index -= 8;\n        mmr->word |= (mmr->data[mmr->data_index] << mmr->bit_index);\n        mmr->data_index++;\n    }\n}\n\nstatic void\njbig2_decode_mmr_consume(Jbig2MmrCtx *mmr, int n_bits)\n{\n    mmr->consumed_bits += n_bits;\n    if (mmr->consumed_bits > mmr->size * 8)\n        mmr->consumed_bits = mmr->size * 8;\n\n    mmr->word <<= n_bits;\n    mmr->bit_index += n_bits;\n    while (mmr->bit_index >= 8 && mmr->data_index < mmr->size) {\n        mmr->bit_index -= 8;\n        mmr->word |= (mmr->data[mmr->data_index] << mmr->bit_index);\n        mmr->data_index++;\n    }\n}\n\n/*\n<raph> the first 2^(initialbits) entries map bit patterns to decodes\n<raph> let's say initial_bits is 8 for the sake of example\n<raph> and that the code is 1001\n<raph> that means that entries 0x90 .. 0x9f have the entry { val, 4 }\n<raph> because those are all the bytes that start with the code\n<raph> and the 4 is the length of the code\n... if (n_bits > initial_bits) ...\n<raph> anyway, in that case, it basically points to a mini table\n<raph> the n_bits is the maximum length of all codes beginning with that byte\n<raph> so 2^(n_bits - initial_bits) is the size of the mini-table\n<raph> peter came up with this, and it makes sense\n*/\n\ntypedef struct {\n    short val;\n    short n_bits;\n} mmr_table_node;\n\n/* white decode table (runlength huffman codes) */\nconst mmr_table_node jbig2_mmr_white_decode[] = {\n    {256, 12},\n    {272, 12},\n    {29, 8},\n    {30, 8},\n    {45, 8},\n    {46, 8},\n    {22, 7},\n    {22, 7},\n    {23, 7},\n    {23, 7},\n    {47, 8},\n    {48, 8},\n    {13, 6},\n    {13, 6},\n    {13, 6},\n    {13, 6},\n    {20, 7},\n    {20, 7},\n    {33, 8},\n    {34, 8},\n    {35, 8},\n    {36, 8},\n    {37, 8},\n    {38, 8},\n    {19, 7},\n    {19, 7},\n    {31, 8},\n    {32, 8},\n    {1, 6},\n    {1, 6},\n    {1, 6},\n    {1, 6},\n    {12, 6},\n    {12, 6},\n    {12, 6},\n    {12, 6},\n    {53, 8},\n    {54, 8},\n    {26, 7},\n    {26, 7},\n    {39, 8},\n    {40, 8},\n    {41, 8},\n    {42, 8},\n    {43, 8},\n    {44, 8},\n    {21, 7},\n    {21, 7},\n    {28, 7},\n    {28, 7},\n    {61, 8},\n    {62, 8},\n    {63, 8},\n    {0, 8},\n    {320, 8},\n    {384, 8},\n    {10, 5},\n    {10, 5},\n    {10, 5},\n    {10, 5},\n    {10, 5},\n    {10, 5},\n    {10, 5},\n    {10, 5},\n    {11, 5},\n    {11, 5},\n    {11, 5},\n    {11, 5},\n    {11, 5},\n    {11, 5},\n    {11, 5},\n    {11, 5},\n    {27, 7},\n    {27, 7},\n    {59, 8},\n    {60, 8},\n    {288, 9},\n    {290, 9},\n    {18, 7},\n    {18, 7},\n    {24, 7},\n    {24, 7},\n    {49, 8},\n    {50, 8},\n    {51, 8},\n    {52, 8},\n    {25, 7},\n    {25, 7},\n    {55, 8},\n    {56, 8},\n    {57, 8},\n    {58, 8},\n    {192, 6},\n    {192, 6},\n    {192, 6},\n    {192, 6},\n    {1664, 6},\n    {1664, 6},\n    {1664, 6},\n    {1664, 6},\n    {448, 8},\n    {512, 8},\n    {292, 9},\n    {640, 8},\n    {576, 8},\n    {294, 9},\n    {296, 9},\n    {298, 9},\n    {300, 9},\n    {302, 9},\n    {256, 7},\n    {256, 7},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {2, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {3, 4},\n    {128, 5},\n    {128, 5},\n    {128, 5},\n    {128, 5},\n    {128, 5},\n    {128, 5},\n    {128, 5},\n    {128, 5},\n    {8, 5},\n    {8, 5},\n    {8, 5},\n    {8, 5},\n    {8, 5},\n    {8, 5},\n    {8, 5},\n    {8, 5},\n    {9, 5},\n    {9, 5},\n    {9, 5},\n    {9, 5},\n    {9, 5},\n    {9, 5},\n    {9, 5},\n    {9, 5},\n    {16, 6},\n    {16, 6},\n    {16, 6},\n    {16, 6},\n    {17, 6},\n    {17, 6},\n    {17, 6},\n    {17, 6},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {4, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {14, 6},\n    {14, 6},\n    {14, 6},\n    {14, 6},\n    {15, 6},\n    {15, 6},\n    {15, 6},\n    {15, 6},\n    {64, 5},\n    {64, 5},\n    {64, 5},\n    {64, 5},\n    {64, 5},\n    {64, 5},\n    {64, 5},\n    {64, 5},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {7, 4},\n    {-2, 3},\n    {-2, 3},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-3, 4},\n    {1792, 3},\n    {1792, 3},\n    {1984, 4},\n    {2048, 4},\n    {2112, 4},\n    {2176, 4},\n    {2240, 4},\n    {2304, 4},\n    {1856, 3},\n    {1856, 3},\n    {1920, 3},\n    {1920, 3},\n    {2368, 4},\n    {2432, 4},\n    {2496, 4},\n    {2560, 4},\n    {1472, 1},\n    {1536, 1},\n    {1600, 1},\n    {1728, 1},\n    {704, 1},\n    {768, 1},\n    {832, 1},\n    {896, 1},\n    {960, 1},\n    {1024, 1},\n    {1088, 1},\n    {1152, 1},\n    {1216, 1},\n    {1280, 1},\n    {1344, 1},\n    {1408, 1}\n};\n\n/* black decode table (runlength huffman codes) */\nconst mmr_table_node jbig2_mmr_black_decode[] = {\n    {128, 12},\n    {160, 13},\n    {224, 12},\n    {256, 12},\n    {10, 7},\n    {11, 7},\n    {288, 12},\n    {12, 7},\n    {9, 6},\n    {9, 6},\n    {8, 6},\n    {8, 6},\n    {7, 5},\n    {7, 5},\n    {7, 5},\n    {7, 5},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {6, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {5, 4},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {1, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {4, 3},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {3, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {2, 2},\n    {-2, 4},\n    {-2, 4},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-1, 0},\n    {-3, 5},\n    {1792, 4},\n    {1792, 4},\n    {1984, 5},\n    {2048, 5},\n    {2112, 5},\n    {2176, 5},\n    {2240, 5},\n    {2304, 5},\n    {1856, 4},\n    {1856, 4},\n    {1920, 4},\n    {1920, 4},\n    {2368, 5},\n    {2432, 5},\n    {2496, 5},\n    {2560, 5},\n    {18, 3},\n    {18, 3},\n    {18, 3},\n    {18, 3},\n    {18, 3},\n    {18, 3},\n    {18, 3},\n    {18, 3},\n    {52, 5},\n    {52, 5},\n    {640, 6},\n    {704, 6},\n    {768, 6},\n    {832, 6},\n    {55, 5},\n    {55, 5},\n    {56, 5},\n    {56, 5},\n    {1280, 6},\n    {1344, 6},\n    {1408, 6},\n    {1472, 6},\n    {59, 5},\n    {59, 5},\n    {60, 5},\n    {60, 5},\n    {1536, 6},\n    {1600, 6},\n    {24, 4},\n    {24, 4},\n    {24, 4},\n    {24, 4},\n    {25, 4},\n    {25, 4},\n    {25, 4},\n    {25, 4},\n    {1664, 6},\n    {1728, 6},\n    {320, 5},\n    {320, 5},\n    {384, 5},\n    {384, 5},\n    {448, 5},\n    {448, 5},\n    {512, 6},\n    {576, 6},\n    {53, 5},\n    {53, 5},\n    {54, 5},\n    {54, 5},\n    {896, 6},\n    {960, 6},\n    {1024, 6},\n    {1088, 6},\n    {1152, 6},\n    {1216, 6},\n    {64, 3},\n    {64, 3},\n    {64, 3},\n    {64, 3},\n    {64, 3},\n    {64, 3},\n    {64, 3},\n    {64, 3},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {13, 1},\n    {23, 4},\n    {23, 4},\n    {50, 5},\n    {51, 5},\n    {44, 5},\n    {45, 5},\n    {46, 5},\n    {47, 5},\n    {57, 5},\n    {58, 5},\n    {61, 5},\n    {256, 5},\n    {16, 3},\n    {16, 3},\n    {16, 3},\n    {16, 3},\n    {17, 3},\n    {17, 3},\n    {17, 3},\n    {17, 3},\n    {48, 5},\n    {49, 5},\n    {62, 5},\n    {63, 5},\n    {30, 5},\n    {31, 5},\n    {32, 5},\n    {33, 5},\n    {40, 5},\n    {41, 5},\n    {22, 4},\n    {22, 4},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {14, 1},\n    {15, 2},\n    {15, 2},\n    {15, 2},\n    {15, 2},\n    {15, 2},\n    {15, 2},\n    {15, 2},\n    {15, 2},\n    {128, 5},\n    {192, 5},\n    {26, 5},\n    {27, 5},\n    {28, 5},\n    {29, 5},\n    {19, 4},\n    {19, 4},\n    {20, 4},\n    {20, 4},\n    {34, 5},\n    {35, 5},\n    {36, 5},\n    {37, 5},\n    {38, 5},\n    {39, 5},\n    {21, 4},\n    {21, 4},\n    {42, 5},\n    {43, 5},\n    {0, 3},\n    {0, 3},\n    {0, 3},\n    {0, 3}\n};\n\n#define getbit(buf, x) ( ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 )\n\n/* On platforms that enforce aligned memory accesses, we can't just\n * cast the byte * to the type of object we are accessing, we have\n * unpack the requisite number of bytes, and deal with it that way.\n * Note that the comments below about being 16/32 bit boundaries\n * is referring to offsets into the byte stream, *not* memory\n * addresses.\n */\n#define getword16(b)  ((uint16_t)(b[0] | (b[1] << 8)))\n#define getword32(b)  ((uint32_t)(getword16(b) | (getword16((b + 2)) << 16)))\n\nstatic uint32_t\njbig2_find_changing_element(const byte *line, uint32_t x, uint32_t w)\n{\n    int a;\n    uint8_t     all8;\n    uint16_t    all16;\n    uint32_t    all32;\n\n    if (line == NULL)\n        return w;\n\n    if (x == MINUS1) {\n        a = 0;\n        x = 0;\n    } else if (x < w) {\n        a = getbit(line, x);\n        x++;\n    } else {\n        return x;\n    }\n\n    /* We will be looking for a uint8 or uint16 or uint32 that has at least one\n    bit different from <a>, so prepare some useful values for comparison. */\n    all8  = (a) ? 0xff : 0;\n    all16 = (a) ? 0xffff : 0;\n    all32 = (a) ? 0xffffffff : 0;\n\n    /* Check individual bits up to next 8-bit boundary.\n\n    [Would it be worth looking at top 4 bits, then at 2 bits then at 1 bit,\n    instead of iterating over all 8 bits? */\n\n    if ( ((uint8_t*) line)[ x / 8] == all8) {\n        /* Don't bother checking individual bits if the enclosing uint8 equals\n        all8 - just move to the next byte. */\n        x = x / 8 * 8 + 8;\n        if (x >= w) {\n            x = w;\n            goto end;\n        }\n    } else {\n        for(;;) {\n            if (x == w) {\n                goto end;\n            }\n            if (x % 8 == 0) {\n                break;\n            }\n            if (getbit(line, x) != a) {\n                goto end;\n            }\n            x += 1;\n        }\n    }\n\n    assert(x % 8 == 0);\n    /* Check next uint8 if we are not on 16-bit boundary. */\n    if (x % 16) {\n        if (w - x < 8) {\n            goto check1;\n        }\n        if ( ((uint8_t*) line)[ x / 8] != all8) {\n            goto check1;\n        }\n        x += 8; /* This will make x a multiple of 16. */\n    }\n\n    assert(x % 16 == 0);\n    /* Check next uint16 if we are not on 32-bit boundary. */\n    if (x % 32) {\n        if (w - x < 16) {\n            goto check8;\n        }\n        if ( getword16((line + (x / 8))) != all16) {\n            goto check8_no_eof;\n        }\n        x += 16; /* This will make x a multiple of 32. */\n    }\n\n    /* We are now on a 32-bit boundary. Check uint32's until we reach last\n    sub-32-bit region. */\n    assert(x % 32 == 0);\n    for(;;) {\n        if (w - x < 32) {\n            /* We could still look at the uint32 here - if it equals all32, we\n            know there is no match before <w> so could do {x = w; goto end;}.\n\n            But for now we simply fall into the epilogue checking, which will\n            look at the next uint16, then uint8, then last 8 bits. */\n            goto check16;\n        }\n        if ( getword32((line + (x / 8))) != all32) {\n            goto check16_no_eof;\n        }\n        x += 32;\n    }\n\n    /* Check next uint16. */\ncheck16:\n    assert(x % 16 == 0);\n    if (w - x < 16) {\n        goto check8;\n    }\ncheck16_no_eof:\n    assert(w - x >= 16);\n    if ( getword16((line + (x / 8))) != all16) {\n        goto check8_no_eof;\n    }\n    x += 16;\n\n    /* Check next uint8. */\ncheck8:\n    assert(x % 8 == 0);\n    if (w - x < 8) {\n        goto check1;\n    }\ncheck8_no_eof:\n    assert(w - x >= 8);\n    if ( ((uint8_t*) line)[x/8] != all8) {\n        goto check1;\n    }\n    x += 8;\n\n    /* Check up to the next 8 bits. */\ncheck1:\n    assert(x % 8 == 0);\n    if ( ((uint8_t*) line)[ x / 8] == all8) {\n        x = w;\n        goto end;\n    }\n    {\n        for(;;) {\n            if (x == w) {\n                goto end;\n            }\n            if (getbit(line, x) != a) {\n                goto end;\n            }\n            x += 1;\n        }\n    }\n\nend:\n    return x;\n}\n\n#undef getword16\n#undef getword32\n\nstatic uint32_t\njbig2_find_changing_element_of_color(const byte *line, uint32_t x, uint32_t w, int color)\n{\n    if (line == NULL)\n        return w;\n    x = jbig2_find_changing_element(line, x, w);\n    if (x < w && getbit(line, x) != color)\n        x = jbig2_find_changing_element(line, x, w);\n    return x;\n}\n\nstatic const byte lm[8] = { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };\nstatic const byte rm[8] = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE };\n\nstatic void\njbig2_set_bits(byte *line, uint32_t x0, uint32_t x1)\n{\n    uint32_t a0, a1, b0, b1, a;\n\n    a0 = x0 >> 3;\n    a1 = x1 >> 3;\n\n    b0 = x0 & 7;\n    b1 = x1 & 7;\n\n    if (a0 == a1) {\n        line[a0] |= lm[b0] & rm[b1];\n    } else {\n        line[a0] |= lm[b0];\n        for (a = a0 + 1; a < a1; a++)\n            line[a] = 0xFF;\n        if (b1)\n            line[a1] |= rm[b1];\n    }\n}\n\nstatic int\njbig2_decode_get_code(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits)\n{\n    uint32_t word = mmr->word;\n    int table_ix = word >> (32 - initial_bits);\n    int val = table[table_ix].val;\n    int n_bits = table[table_ix].n_bits;\n\n    if (n_bits > initial_bits) {\n        int mask = (1 << (32 - initial_bits)) - 1;\n\n        table_ix = val + ((word & mask) >> (32 - n_bits));\n        val = table[table_ix].val;\n        n_bits = initial_bits + table[table_ix].n_bits;\n    }\n\n    jbig2_decode_mmr_consume(mmr, n_bits);\n\n    return val;\n}\n\nstatic int\njbig2_decode_get_run(Jbig2Ctx *ctx, Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits)\n{\n    int result = 0;\n    int val;\n\n    do {\n        val = jbig2_decode_get_code(mmr, table, initial_bits);\n        if (val == ERROR)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"invalid code detected in MMR-coded data\");\n        else if (val == UNCOMPRESSED)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"uncompressed code in MMR-coded data\");\n        else if (val == ZEROES)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"zeroes code in MMR-coded data\");\n        result += val;\n    } while (val >= 64);\n\n    return result;\n}\n\nstatic int\njbig2_decode_mmr_line(Jbig2Ctx *ctx, Jbig2MmrCtx *mmr, const byte *ref, byte *dst, int *eofb)\n{\n    uint32_t a0 = MINUS1;\n    uint32_t a1, a2, b1, b2;\n    int c = 0;                  /* 0 is white, black is 1 */\n\n    while (1) {\n        uint32_t word = mmr->word;\n\n        /* printf (\"%08x\\n\", word); */\n\n        if (a0 != MINUS1 && a0 >= mmr->width)\n            break;\n\n        if ((word >> (32 - 3)) == 1) {\n            int white_run, black_run;\n\n            jbig2_decode_mmr_consume(mmr, 3);\n\n            if (a0 == MINUS1)\n                a0 = 0;\n\n            if (c == 0) {\n                white_run = jbig2_decode_get_run(ctx, mmr, jbig2_mmr_white_decode, 8);\n                if (white_run < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode white H run\");\n                black_run = jbig2_decode_get_run(ctx, mmr, jbig2_mmr_black_decode, 7);\n                if (black_run < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode black H run\");\n                /* printf (\"H %d %d\\n\", white_run, black_run); */\n                a1 = a0 + white_run;\n                a2 = a1 + black_run;\n                if (a1 > mmr->width)\n                    a1 = mmr->width;\n                if (a2 > mmr->width)\n                    a2 = mmr->width;\n                if (a2 < a1) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative black H run\");\n                    a2 = a1;\n                }\n                if (a1 < mmr->width)\n                    jbig2_set_bits(dst, a1, a2);\n                a0 = a2;\n            } else {\n                black_run = jbig2_decode_get_run(ctx, mmr, jbig2_mmr_black_decode, 7);\n                if (black_run < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode black H run\");\n                white_run = jbig2_decode_get_run(ctx, mmr, jbig2_mmr_white_decode, 8);\n                if (white_run < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode white H run\");\n                /* printf (\"H %d %d\\n\", black_run, white_run); */\n                a1 = a0 + black_run;\n                a2 = a1 + white_run;\n                if (a1 > mmr->width)\n                    a1 = mmr->width;\n                if (a2 > mmr->width)\n                    a2 = mmr->width;\n                if (a1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative white H run\");\n                    a1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, a1);\n                a0 = a2;\n            }\n        }\n\n        else if ((word >> (32 - 4)) == 1) {\n            /* printf (\"P\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 4);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            b2 = jbig2_find_changing_element(ref, b1, mmr->width);\n            if (c) {\n                if (b2 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative P run\");\n                    b2 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b2);\n            }\n            a0 = b2;\n        }\n\n        else if ((word >> (32 - 1)) == 1) {\n            /* printf (\"V(0)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 1);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative V(0) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 3)) == 3) {\n            /* printf (\"VR(1)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 3);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (b1 + 1 <= mmr->width)\n                b1 += 1;\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative VR(1) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 6)) == 3) {\n            /* printf (\"VR(2)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 6);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (b1 + 2 <= mmr->width)\n                b1 += 2;\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative VR(2) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 7)) == 3) {\n            /* printf (\"VR(3)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 7);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (b1 + 3 <= mmr->width)\n                b1 += 3;\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative VR(3) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 3)) == 2) {\n            /* printf (\"VL(1)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 3);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (b1 >= 1)\n                b1 -= 1;\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative VL(1) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 6)) == 2) {\n            /* printf (\"VL(2)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 6);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (b1 >= 2)\n                b1 -= 2;\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative VL(2) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 7)) == 2) {\n            /* printf (\"VL(3)\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 7);\n            b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);\n            if (b1 >= 3)\n                b1 -= 3;\n            if (c) {\n                if (b1 < a0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"ignoring negative VL(3) run\");\n                    b1 = a0;\n                }\n                if (a0 < mmr->width)\n                    jbig2_set_bits(dst, a0, b1);\n            }\n            a0 = b1;\n            c = !c;\n        }\n\n        else if ((word >> (32 - 24)) == 0x1001) {\n            /* printf (\"EOFB\\n\"); */\n            jbig2_decode_mmr_consume(mmr, 24);\n            *eofb = 1;\n            break;\n        }\n\n        else\n            break;\n    }\n\n    return 0;\n}\n\nint\njbig2_decode_generic_mmr(Jbig2Ctx *ctx, Jbig2Segment *segment, const Jbig2GenericRegionParams *params, const byte *data, size_t size, Jbig2Image *image)\n{\n    Jbig2MmrCtx mmr;\n    const uint32_t rowstride = image->stride;\n    byte *dst = image->data;\n    byte *ref = NULL;\n    uint32_t y;\n    int code = 0;\n    int eofb = 0;\n\n    jbig2_decode_mmr_init(&mmr, image->width, image->height, data, size);\n\n    for (y = 0; !eofb && y < image->height; y++) {\n        memset(dst, 0, rowstride);\n        code = jbig2_decode_mmr_line(ctx, &mmr, ref, dst, &eofb);\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode mmr line\");\n        ref = dst;\n        dst += rowstride;\n    }\n\n    if (eofb && y < image->height) {\n        memset(dst, 0, rowstride * (image->height - y));\n    }\n\n    return code;\n}\n\n/**\n * jbig2_decode_halftone_mmr: decode mmr region inside of halftones\n *\n * @ctx: jbig2 decoder context\n * @params: parameters for decoding\n * @data: pointer to text region data to be decoded\n * @size: length of text region data\n * @image: return of decoded image\n * @consumed_bytes: return of consumed bytes from @data\n *\n * MMR decoding that consumes EOFB and returns consumed bytes (@consumed_bytes)\n *\n * returns: 0\n **/\nint\njbig2_decode_halftone_mmr(Jbig2Ctx *ctx, const Jbig2GenericRegionParams *params, const byte *data, size_t size, Jbig2Image *image, size_t *consumed_bytes)\n{\n    Jbig2MmrCtx mmr;\n    const uint32_t rowstride = image->stride;\n    byte *dst = image->data;\n    byte *ref = NULL;\n    uint32_t y;\n    int code = 0;\n    const uint32_t EOFB = 0x001001;\n    int eofb = 0;\n\n    jbig2_decode_mmr_init(&mmr, image->width, image->height, data, size);\n\n    for (y = 0; !eofb && y < image->height; y++) {\n        memset(dst, 0, rowstride);\n        code = jbig2_decode_mmr_line(ctx, &mmr, ref, dst, &eofb);\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode halftone mmr line\");\n        ref = dst;\n        dst += rowstride;\n    }\n\n    if (eofb && y < image->height) {\n        memset(dst, 0, rowstride * (image->height - y));\n    }\n\n    /* test for EOFB (see section 6.2.6) */\n    if (mmr.word >> 8 == EOFB) {\n        jbig2_decode_mmr_consume(&mmr, 24);\n    }\n\n    *consumed_bytes += (mmr.consumed_bits + 7) / 8;\n    return code;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_page.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stdlib.h>\n\n#ifdef OUTPUT_PBM\n#include <stdio.h>\n#endif\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_segment.h\"\n\n/* dump the page struct info */\nstatic void\ndump_page_info(Jbig2Ctx *ctx, Jbig2Segment *segment, Jbig2Page *page)\n{\n    if (page->x_resolution == 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"page %d image is %dx%d (unknown res)\", page->number, page->width, page->height);\n    } else if (page->x_resolution == page->y_resolution) {\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"page %d image is %dx%d (%d ppm)\", page->number, page->width, page->height, page->x_resolution);\n    } else {\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                    \"page %d image is %dx%d (%dx%d ppm)\", page->number, page->width, page->height, page->x_resolution, page->y_resolution);\n    }\n    if (page->striped) {\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"\\tmaximum stripe size: %d\", page->stripe_size);\n    }\n}\n\n/**\n * jbig2_page_info: parse page info segment\n *\n * Parse the page info segment data and fill out a corresponding\n * Jbig2Page struct and ready it for subsequent rendered data,\n * including allocating an image buffer for the page (or the first stripe)\n **/\nint\njbig2_page_info(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)\n{\n    Jbig2Page *page, *pages;\n\n    /* a new page info segment implies the previous page is finished */\n    page = &(ctx->pages[ctx->current_page]);\n    if (page->number != 0 && (page->state == JBIG2_PAGE_NEW || page->state == JBIG2_PAGE_FREE)) {\n        page->state = JBIG2_PAGE_COMPLETE;\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unexpected page info segment, marking previous page finished\");\n    }\n\n    /* find a free page */\n    {\n        size_t index, j;\n\n        index = ctx->current_page;\n        while (ctx->pages[index].state != JBIG2_PAGE_FREE) {\n            index++;\n            if (index >= ctx->max_page_index) {\n                /* grow the list */\n\n                if (ctx->max_page_index == UINT32_MAX) {\n                    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"too many pages in jbig2 image\");\n                }\n                else if (ctx->max_page_index > (UINT32_MAX >> 2)) {\n                    ctx->max_page_index = UINT32_MAX;\n                }\n\n                pages = jbig2_renew(ctx, ctx->pages, Jbig2Page, (ctx->max_page_index <<= 2));\n                if (pages == NULL) {\n                    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to reallocate pages\");\n                }\n                ctx->pages = pages;\n                for (j = index; j < ctx->max_page_index; j++) {\n                    ctx->pages[j].state = JBIG2_PAGE_FREE;\n                    ctx->pages[j].number = 0;\n                    ctx->pages[j].image = NULL;\n                }\n            }\n        }\n        page = &(ctx->pages[index]);\n        ctx->current_page = index;\n        page->state = JBIG2_PAGE_NEW;\n        page->number = segment->page_association;\n    }\n\n    /* FIXME: would be nice if we tried to work around this */\n    if (segment->data_length < 19) {\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n    }\n\n    /* 7.4.8.x */\n    page->width = jbig2_get_uint32(segment_data);\n    page->height = jbig2_get_uint32(segment_data + 4);\n\n    page->x_resolution = jbig2_get_uint32(segment_data + 8);\n    page->y_resolution = jbig2_get_uint32(segment_data + 12);\n    page->flags = segment_data[16];\n    /* Check for T.88 amendment 3 */\n    if (page->flags & 0x80)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"page segment indicates use of color segments (NYI)\");\n\n    /* 7.4.8.6 */\n    {\n        int16_t striping = jbig2_get_int16(segment_data + 17);\n\n        if (striping & 0x8000) {\n            page->striped = TRUE;\n            page->stripe_size = striping & 0x7FFF;\n        } else {\n            page->striped = FALSE;\n            page->stripe_size = 0;      /* would page->height be better? */\n        }\n    }\n    if (page->height == 0xFFFFFFFF && page->striped == FALSE) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"height is unspecified but page is not marked as striped, assuming striped with maximum strip size\");\n        page->striped = TRUE;\n        page->stripe_size = 0x7FFF;\n    }\n    page->end_row = 0;\n\n    if (segment->data_length > 19) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"extra data in segment\");\n    }\n\n    dump_page_info(ctx, segment, page);\n\n    /* allocate an appropriate page image buffer */\n    /* 7.4.8.2 */\n    if (page->height == 0xFFFFFFFF) {\n        page->image = jbig2_image_new(ctx, page->width, page->stripe_size);\n    } else {\n        page->image = jbig2_image_new(ctx, page->width, page->height);\n    }\n    if (page->image == NULL) {\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate buffer for page image\");\n    } else {\n        /* 8.2 (3) fill the page with the default pixel value */\n        jbig2_image_clear(ctx, page->image, (page->flags & 4));\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                    \"allocated %dx%d page image (%d bytes)\", page->image->width, page->image->height, page->image->stride * page->image->height);\n    }\n\n    return 0;\n}\n\n/**\n * jbig2_end_of_stripe: parse and implement an end of stripe segment\n **/\nint\njbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)\n{\n    Jbig2Page *page = &ctx->pages[ctx->current_page];\n    uint32_t end_row;\n\n    if (segment->data_length < 4)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n    end_row = jbig2_get_uint32(segment_data);\n    if (end_row < page->end_row) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,\n                    \"end of stripe segment with non-positive end row advance (new end row %d vs current end row %d)\", end_row, page->end_row);\n    } else {\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"end of stripe: advancing end row from %u to %u\", page->end_row, end_row);\n    }\n\n    page->end_row = end_row;\n\n    return 0;\n}\n\n/**\n * jbig2_complete_page: complete a page image\n *\n * called upon seeing an 'end of page' segment, this routine\n * marks a page as completed so it can be returned.\n * compositing will have already happened in the previous\n * segment handlers.\n **/\nint\njbig2_complete_page(Jbig2Ctx *ctx)\n{\n    int code;\n\n    /* check for unfinished segments */\n    if (ctx->segment_index != ctx->n_segments) {\n        Jbig2Segment *segment = ctx->segments[ctx->segment_index];\n\n        /* Some versions of Xerox Workcentre generate PDF files\n           with the segment data length field of the last segment\n           set to -1. Try to cope with this here. */\n        if ((segment->data_length & 0xffffffff) == 0xffffffff) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"file has an invalid segment data length; trying to decode using the available data\");\n            segment->data_length = ctx->buf_wr_ix - ctx->buf_rd_ix;\n            code = jbig2_parse_segment(ctx, segment, ctx->buf + ctx->buf_rd_ix);\n            ctx->buf_rd_ix += segment->data_length;\n            ctx->segment_index++;\n            if (code < 0) {\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to parse segment\");\n            }\n        }\n    }\n\n    /* ensure image exists before marking page as complete */\n    if (ctx->pages[ctx->current_page].image == NULL) {\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"page has no image, cannot be completed\");\n    }\n\n    ctx->pages[ctx->current_page].state = JBIG2_PAGE_COMPLETE;\n    return 0;\n}\n\n/**\n * jbig2_end_of_page: parse and implement an end of page segment\n **/\nint\njbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)\n{\n    uint32_t page_number = ctx->pages[ctx->current_page].number;\n    int code;\n\n    if (segment->page_association != page_number) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,\n                    \"end of page marker for page %d doesn't match current page number %d\", segment->page_association, page_number);\n    }\n\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"end of page %d\", page_number);\n\n    code = jbig2_complete_page(ctx);\n    if (code < 0)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to complete page\");\n\n#ifdef OUTPUT_PBM\n    code = jbig2_image_write_pbm(ctx->pages[ctx->current_page].image, stdout);\n    if (code < 0)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to write page image\");\n#endif\n\n    return 0;\n}\n\n/**\n * jbig2_add_page_result: composite a decoding result onto a page\n *\n * this is called to add the results of segment decode (when it\n * is an image) to a page image buffer\n **/\nint\njbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *image, uint32_t x, uint32_t y, Jbig2ComposeOp op)\n{\n    int code;\n\n    if (x > INT32_MAX || y > INT32_MAX)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unsupported image coordinates\");\n\n    /* ensure image exists first */\n    if (page->image == NULL)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"page info possibly missing, no image defined\");\n\n    /* grow the page to accommodate a new stripe if necessary */\n    if (page->striped && page->height == 0xFFFFFFFF) {\n        uint32_t new_height;\n\n        if (y > UINT32_MAX - image->height)\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"adding image at coordinate would grow page out of bounds\");\n        new_height = y + image->height;\n\n        if (page->image->height < new_height) {\n            Jbig2Image *resized_image = NULL;\n\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"growing page buffer to %u rows to accommodate new stripe\", new_height);\n            resized_image = jbig2_image_resize(ctx, page->image, page->image->width, new_height, page->flags & 4);\n            if (resized_image == NULL) {\n                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to resize image to accommodate new stripe\");\n            }\n            page->image = resized_image;\n        }\n    }\n\n    code = jbig2_image_compose(ctx, page->image, image, x, y, op);\n    if (code < 0)\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to compose image with page\");\n\n    return 0;\n}\n\n/**\n * jbig2_get_page: return the next available page image buffer\n *\n * the client can call this at any time to check if any pages\n * have been decoded. If so, it returns the first available\n * one. The client should then call jbig2_release_page() when\n * it no longer needs to refer to the image buffer.\n *\n * since this is a public routine for the library clients, we\n * return an image structure pointer, even though the function\n * name refers to a page; the page structure is private.\n **/\nJbig2Image *\njbig2_page_out(Jbig2Ctx *ctx)\n{\n    uint32_t index;\n\n    /* search for a completed page */\n    for (index = 0; index < ctx->max_page_index; index++) {\n        if (ctx->pages[index].state == JBIG2_PAGE_COMPLETE) {\n            Jbig2Image *img = ctx->pages[index].image;\n            uint32_t page_number = ctx->pages[index].number;\n\n            if (img == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"page %d returned with no associated image\", page_number);\n                continue;\n            }\n\n            ctx->pages[index].state = JBIG2_PAGE_RETURNED;\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"page %d returned to the client\", page_number);\n            return jbig2_image_reference(ctx, img);\n        }\n    }\n\n    /* no pages available */\n    return NULL;\n}\n\n/**\n * jbig2_release_page: tell the library a page can be freed\n **/\nvoid\njbig2_release_page(Jbig2Ctx *ctx, Jbig2Image *image)\n{\n    uint32_t index;\n\n    if (image == NULL)\n        return;\n\n    /* find the matching page struct and mark it released */\n    for (index = 0; index < ctx->max_page_index; index++) {\n        if (ctx->pages[index].image == image) {\n            jbig2_image_release(ctx, image);\n            ctx->pages[index].state = JBIG2_PAGE_RELEASED;\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"page %d released by the client\", ctx->pages[index].number);\n            return;\n        }\n    }\n\n    /* no matching pages */\n    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to release unknown page\");\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_refinement.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/**\n * Generic Refinement region handlers.\n **/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>\n#include <string.h>             /* memcpy(), memset() */\n\n#include <stdio.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_refinement.h\"\n#include \"jbig2_segment.h\"\n\n#define pixel_outside_field(x, y) \\\n    ((y) < -128 || (y) > 0 || (x) < -128 || ((y) < 0 && (x) > 127) || ((y) == 0 && (x) >= 0))\n#define refpixel_outside_field(x, y) \\\n    ((y) < -128 || (y) > 127 || (x) < -128 || (x) > 127)\n\nstatic int\njbig2_decode_refinement_template0_unopt(Jbig2Ctx *ctx,\n                                        Jbig2Segment *segment,\n                                        const Jbig2RefinementRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GR_stats)\n{\n    const int GRW = image->width;\n    const int GRH = image->height;\n    Jbig2Image *ref = params->GRREFERENCE;\n    const int dx = params->GRREFERENCEDX;\n    const int dy = params->GRREFERENCEDY;\n    uint32_t CONTEXT;\n    int x, y;\n    int bit;\n\n    if (pixel_outside_field(params->grat[0], params->grat[1]) ||\n        refpixel_outside_field(params->grat[2], params->grat[3]))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GRH; y++) {\n        for (x = 0; x < GRW; x++) {\n            CONTEXT = 0;\n            CONTEXT |= jbig2_image_get_pixel(image, x - 1, y + 0) << 0;\n            CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1;\n            CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2;\n            CONTEXT |= jbig2_image_get_pixel(image, x + params->grat[0], y + params->grat[1]) << 3;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 1) << 4;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 1) << 5;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx - 1, y - dy + 1) << 6;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 0) << 7;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 0) << 8;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx - 1, y - dy + 0) << 9;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy - 1) << 10;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy - 1) << 11;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + params->grat[2], y - dy + params->grat[3]) << 12;\n            bit = jbig2_arith_decode(ctx, as, &GR_stats[CONTEXT]);\n            if (bit < 0)\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling refinement template0\");\n            jbig2_image_set_pixel(image, x, y, bit);\n        }\n    }\n#ifdef JBIG2_DEBUG_DUMP\n    {\n        static count = 0;\n        char name[32];\n        int code;\n\n        snprintf(name, 32, \"refin-%d.pbm\", count);\n        code = jbig2_image_write_pbm_file(ref, name);\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed write refinement input\");\n        snprintf(name, 32, \"refout-%d.pbm\", count);\n        code = jbig2_image_write_pbm_file(image, name);\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed write refinement output\");\n        count++;\n    }\n#endif\n\n    return 0;\n}\n\nstatic int\njbig2_decode_refinement_template1_unopt(Jbig2Ctx *ctx,\n                                        Jbig2Segment *segment,\n                                        const Jbig2RefinementRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GR_stats)\n{\n    const int GRW = image->width;\n    const int GRH = image->height;\n    Jbig2Image *ref = params->GRREFERENCE;\n    const int dx = params->GRREFERENCEDX;\n    const int dy = params->GRREFERENCEDY;\n    uint32_t CONTEXT;\n    int x, y;\n    int bit;\n\n    for (y = 0; y < GRH; y++) {\n        for (x = 0; x < GRW; x++) {\n            CONTEXT = 0;\n            CONTEXT |= jbig2_image_get_pixel(image, x - 1, y + 0) << 0;\n            CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1;\n            CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2;\n            CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 3;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 1) << 4;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 1) << 5;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 0) << 6;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 0) << 7;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx - 1, y - dy + 0) << 8;\n            CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy - 1) << 9;\n            bit = jbig2_arith_decode(ctx, as, &GR_stats[CONTEXT]);\n            if (bit < 0)\n                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling refinement template0\");\n            jbig2_image_set_pixel(image, x, y, bit);\n        }\n    }\n\n#ifdef JBIG2_DEBUG_DUMP\n    {\n        static count = 0;\n        char name[32];\n\n        snprintf(name, 32, \"refin-%d.pbm\", count);\n        code = jbig2_image_write_pbm_file(ref, name);\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to write refinement input\");\n        snprintf(name, 32, \"refout-%d.pbm\", count);\n        code = jbig2_image_write_pbm_file(image, name);\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to write refinement output\");\n        count++;\n    }\n#endif\n\n    return 0;\n}\n\n#if 0                           /* currently not used */\nstatic int\njbig2_decode_refinement_template1(Jbig2Ctx *ctx,\n                                  Jbig2Segment *segment,\n                                  const Jbig2RefinementRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GR_stats)\n{\n    const int GRW = image->width;\n    const int GRH = image->height;\n    const int stride = image->stride;\n    const int refstride = params->reference->stride;\n    const int dy = params->DY;\n    byte *grreg_line = (byte *) image->data;\n    byte *grref_line = (byte *) params->reference->data;\n    int x, y;\n\n    for (y = 0; y < GRH; y++) {\n        const int padded_width = (GRW + 7) & -8;\n        uint32_t CONTEXT;\n        uint32_t refline_m1;    /* previous line of the reference bitmap */\n        uint32_t refline_0;     /* current line of the reference bitmap */\n        uint32_t refline_1;     /* next line of the reference bitmap */\n        uint32_t line_m1;       /* previous line of the decoded bitmap */\n\n        line_m1 = (y >= 1) ? grreg_line[-stride] : 0;\n        refline_m1 = ((y - dy) >= 1) ? grref_line[(-1 - dy) * stride] << 2 : 0;\n        refline_0 = (((y - dy) > 0) && ((y - dy) < GRH)) ? grref_line[(0 - dy) * stride] << 4 : 0;\n        refline_1 = (y < GRH - 1) ? grref_line[(+1 - dy) * stride] << 7 : 0;\n        CONTEXT = ((line_m1 >> 5) & 0x00e) | ((refline_1 >> 5) & 0x030) | ((refline_0 >> 5) & 0x1c0) | ((refline_m1 >> 5) & 0x200);\n\n        for (x = 0; x < padded_width; x += 8) {\n            byte result = 0;\n            int x_minor;\n            const int minor_width = GRW - x > 8 ? 8 : GRW - x;\n\n            if (y >= 1) {\n                line_m1 = (line_m1 << 8) | (x + 8 < GRW ? grreg_line[-stride + (x >> 3) + 1] : 0);\n                refline_m1 = (refline_m1 << 8) | (x + 8 < GRW ? grref_line[-refstride + (x >> 3) + 1] << 2 : 0);\n            }\n\n            refline_0 = (refline_0 << 8) | (x + 8 < GRW ? grref_line[(x >> 3) + 1] << 4 : 0);\n\n            if (y < GRH - 1)\n                refline_1 = (refline_1 << 8) | (x + 8 < GRW ? grref_line[+refstride + (x >> 3) + 1] << 7 : 0);\n            else\n                refline_1 = 0;\n\n            /* this is the speed critical inner-loop */\n            for (x_minor = 0; x_minor < minor_width; x_minor++) {\n                int bit;\n\n                bit = jbig2_arith_decode(ctx, as, &GR_stats[CONTEXT]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode arithmetic code when handling refinement template1\");\n                result |= bit << (7 - x_minor);\n                CONTEXT = ((CONTEXT & 0x0d6) << 1) | bit |\n                          ((line_m1 >> (9 - x_minor)) & 0x002) |\n                          ((refline_1 >> (9 - x_minor)) & 0x010) | ((refline_0 >> (9 - x_minor)) & 0x040) | ((refline_m1 >> (9 - x_minor)) & 0x200);\n            }\n\n            grreg_line[x >> 3] = result;\n\n        }\n\n        grreg_line += stride;\n        grref_line += refstride;\n\n    }\n\n    return 0;\n\n}\n#endif\n\ntypedef uint32_t(*ContextBuilder)(const Jbig2RefinementRegionParams *, Jbig2Image *, int, int);\n\nstatic int\nimplicit_value(const Jbig2RefinementRegionParams *params, Jbig2Image *image, int x, int y)\n{\n    Jbig2Image *ref = params->GRREFERENCE;\n    int i = x - params->GRREFERENCEDX;\n    int j = y - params->GRREFERENCEDY;\n    int m = jbig2_image_get_pixel(ref, i, j);\n\n    return ((jbig2_image_get_pixel(ref, i - 1, j - 1) == m) &&\n            (jbig2_image_get_pixel(ref, i, j - 1) == m) &&\n            (jbig2_image_get_pixel(ref, i + 1, j - 1) == m) &&\n            (jbig2_image_get_pixel(ref, i - 1, j) == m) &&\n            (jbig2_image_get_pixel(ref, i + 1, j) == m) &&\n            (jbig2_image_get_pixel(ref, i - 1, j + 1) == m) &&\n            (jbig2_image_get_pixel(ref, i, j + 1) == m) &&\n            (jbig2_image_get_pixel(ref, i + 1, j + 1) == m)\n           )? m : -1;\n}\n\nstatic uint32_t\nmkctx0(const Jbig2RefinementRegionParams *params, Jbig2Image *image, int x, int y)\n{\n    Jbig2Image *ref = params->GRREFERENCE;\n    const int dx = params->GRREFERENCEDX;\n    const int dy = params->GRREFERENCEDY;\n    uint32_t CONTEXT;\n\n    CONTEXT = jbig2_image_get_pixel(image, x - 1, y + 0);\n    CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1;\n    CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2;\n    CONTEXT |= jbig2_image_get_pixel(image, x + params->grat[0], y + params->grat[1]) << 3;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 1) << 4;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 1) << 5;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx - 1, y - dy + 1) << 6;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 0) << 7;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 0) << 8;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx - 1, y - dy + 0) << 9;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy - 1) << 10;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy - 1) << 11;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + params->grat[2], y - dy + params->grat[3]) << 12;\n    return CONTEXT;\n}\n\nstatic uint32_t\nmkctx1(const Jbig2RefinementRegionParams *params, Jbig2Image *image, int x, int y)\n{\n    Jbig2Image *ref = params->GRREFERENCE;\n    const int dx = params->GRREFERENCEDX;\n    const int dy = params->GRREFERENCEDY;\n    uint32_t CONTEXT;\n\n    CONTEXT = jbig2_image_get_pixel(image, x - 1, y + 0);\n    CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1;\n    CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2;\n    CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 3;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 1) << 4;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 1) << 5;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 1, y - dy + 0) << 6;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy + 0) << 7;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx - 1, y - dy + 0) << 8;\n    CONTEXT |= jbig2_image_get_pixel(ref, x - dx + 0, y - dy - 1) << 9;\n    return CONTEXT;\n}\n\nstatic int\njbig2_decode_refinement_TPGRON(Jbig2Ctx *ctx, const Jbig2RefinementRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GR_stats)\n{\n    const int GRW = image->width;\n    const int GRH = image->height;\n    int x, y, iv, LTP = 0;\n    uint32_t start_context = (params->GRTEMPLATE ? 0x40 : 0x100);\n    ContextBuilder mkctx = (params->GRTEMPLATE ? mkctx1 : mkctx0);\n\n    if (params->GRTEMPLATE == 0 &&\n        (pixel_outside_field(params->grat[0], params->grat[1]) ||\n        refpixel_outside_field(params->grat[2], params->grat[3])))\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER,\n                           \"adaptive template pixel is out of field\");\n\n    for (y = 0; y < GRH; y++) {\n        int bit = jbig2_arith_decode(ctx, as, &GR_stats[start_context]);\n        if (bit < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode arithmetic code when handling refinement TPGRON1\");\n        LTP ^= bit;\n        if (!LTP) {\n            for (x = 0; x < GRW; x++) {\n                bit = jbig2_arith_decode(ctx, as, &GR_stats[mkctx(params, image, x, y)]);\n                if (bit < 0)\n                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode arithmetic code when handling refinement TPGRON1\");\n                jbig2_image_set_pixel(image, x, y, bit);\n            }\n        } else {\n            for (x = 0; x < GRW; x++) {\n                iv = implicit_value(params, image, x, y);\n                if (iv < 0) {\n                    int bit = jbig2_arith_decode(ctx, as, &GR_stats[mkctx(params, image, x, y)]);\n                    if (bit < 0)\n                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to decode arithmetic code when handling refinement TPGRON1\");\n                    jbig2_image_set_pixel(image, x, y, bit);\n                } else\n                    jbig2_image_set_pixel(image, x, y, iv);\n            }\n        }\n    }\n\n    return 0;\n}\n\n/**\n * jbig2_decode_refinement_region: Decode a generic refinement region.\n * @ctx: The context for allocation and error reporting.\n * @segment: A segment reference for error reporting.\n * @params: Decoding parameter set.\n * @as: Arithmetic decoder state.\n * @image: Where to store the decoded image.\n * @GR_stats: Arithmetic stats.\n *\n * Decodes a generic refinement region, according to section 6.3.\n * an already allocated Jbig2Image object in @image for the result.\n *\n * Because this API is based on an arithmetic decoding state, it is\n * not suitable for MMR decoding.\n *\n * Return code: 0 on success.\n **/\nint\njbig2_decode_refinement_region(Jbig2Ctx *ctx,\n                               Jbig2Segment *segment,\n                               const Jbig2RefinementRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GR_stats)\n{\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                \"decoding generic refinement region with offset %d,%x, GRTEMPLATE=%d, TPGRON=%d\",\n                params->GRREFERENCEDX, params->GRREFERENCEDY, params->GRTEMPLATE, params->TPGRON);\n\n    if (params->TPGRON)\n        return jbig2_decode_refinement_TPGRON(ctx, params, as, image, GR_stats);\n\n    if (params->GRTEMPLATE)\n        return jbig2_decode_refinement_template1_unopt(ctx, segment, params, as, image, GR_stats);\n    else\n        return jbig2_decode_refinement_template0_unopt(ctx, segment, params, as, image, GR_stats);\n}\n\n/**\n * Find the first referred-to intermediate region segment\n * with a non-NULL result for use as a reference image\n */\nstatic Jbig2Segment *\njbig2_region_find_referred(Jbig2Ctx *ctx, Jbig2Segment *segment)\n{\n    const int nsegments = segment->referred_to_segment_count;\n    Jbig2Segment *rsegment;\n    int index;\n\n    for (index = 0; index < nsegments; index++) {\n        rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]);\n        if (rsegment == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to find referred to segment %d\", segment->referred_to_segments[index]);\n            continue;\n        }\n        switch (rsegment->flags & 63) {\n        case 4:                /* intermediate text region */\n        case 20:               /* intermediate halftone region */\n        case 36:               /* intermediate generic region */\n        case 40:               /* intermediate generic refinement region */\n            if (rsegment->result)\n                return rsegment;\n            break;\n        default:               /* keep looking */\n            break;\n        }\n    }\n    /* no appropriate reference was found. */\n    return NULL;\n}\n\n/**\n * Handler for generic refinement region segments\n */\nint\njbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    Jbig2RefinementRegionParams params;\n    Jbig2RegionSegmentInfo rsi;\n    int offset = 0;\n    byte seg_flags;\n    int code = 0;\n\n    /* 7.4.7 */\n    if (segment->data_length < 18)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n\n    jbig2_get_region_segment_info(&rsi, segment_data);\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"generic region: %u x %u @ (%u, %u), flags = %02x\", rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags);\n\n    /* 7.4.7.2 */\n    seg_flags = segment_data[17];\n    params.GRTEMPLATE = seg_flags & 0x01;\n    params.TPGRON = seg_flags & 0x02 ? 1 : 0;\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"segment flags = %02x %s%s\", seg_flags, params.GRTEMPLATE ? \" GRTEMPLATE\" : \"\", params.TPGRON ? \" TPGRON\" : \"\");\n    if (seg_flags & 0xFC)\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"reserved segment flag bits are non-zero\");\n    offset += 18;\n\n    /* 7.4.7.3 */\n    if (!params.GRTEMPLATE) {\n        if (segment->data_length < 22)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n        params.grat[0] = segment_data[offset + 0];\n        params.grat[1] = segment_data[offset + 1];\n        params.grat[2] = segment_data[offset + 2];\n        params.grat[3] = segment_data[offset + 3];\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                    \"grat1: (%d, %d) grat2: (%d, %d)\", params.grat[0], params.grat[1], params.grat[2], params.grat[3]);\n        offset += 4;\n    }\n\n    /* 7.4.7.4 - set up the reference image */\n    if (segment->referred_to_segment_count) {\n        Jbig2Segment *ref;\n\n        ref = jbig2_region_find_referred(ctx, segment);\n        if (ref == NULL)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to find reference bitmap\");\n        if (ref->result == NULL)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"reference bitmap has no decoded image\");\n        /* the reference bitmap is the result of a previous\n           intermediate region segment; the reference selection\n           rules say to use the first one available, and not to\n           reuse any intermediate result, so we simply take another\n           reference to it and free the original to keep track of this. */\n        params.GRREFERENCE = jbig2_image_reference(ctx, (Jbig2Image *) ref->result);\n        jbig2_image_release(ctx, (Jbig2Image *) ref->result);\n        ref->result = NULL;\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"found reference bitmap in segment %d\", ref->number);\n    } else {\n        /* the reference is just (a subset of) the page buffer */\n        if (ctx->pages[ctx->current_page].image == NULL)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"reference page bitmap has no decoded image\");\n        params.GRREFERENCE = jbig2_image_reference(ctx, ctx->pages[ctx->current_page].image);\n        /* TODO: subset the image if appropriate */\n    }\n\n    /* 7.4.7.5 */\n    params.GRREFERENCEDX = 0;\n    params.GRREFERENCEDY = 0;\n    {\n        Jbig2WordStream *ws = NULL;\n        Jbig2ArithState *as = NULL;\n        Jbig2ArithCx *GR_stats = NULL;\n        int stats_size;\n        Jbig2Image *image = NULL;\n\n        image = jbig2_image_new(ctx, rsi.width, rsi.height);\n        if (image == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate refinement image\");\n            goto cleanup;\n        }\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"allocated %d x %d image buffer for region decode results\", rsi.width, rsi.height);\n\n        stats_size = params.GRTEMPLATE ? 1 << 10 : 1 << 13;\n        GR_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GR_stats == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate arithmetic decoder state for generic refinement regions\");\n            goto cleanup;\n        }\n        memset(GR_stats, 0, stats_size);\n\n        ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);\n        if (ws == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate word stream when handling refinement region\");\n            goto cleanup;\n        }\n\n        as = jbig2_arith_new(ctx, ws);\n        if (as == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding state when handling refinement region\");\n            goto cleanup;\n        }\n\n        code = jbig2_decode_refinement_region(ctx, segment, &params, as, image, GR_stats);\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode refinement region\");\n            goto cleanup;\n        }\n\n        if ((segment->flags & 63) == 40) {\n            /* intermediate region. save the result for later */\n            segment->result = jbig2_image_reference(ctx, image);\n        } else {\n            /* immediate region. composite onto the page */\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                        \"composing %dx%d decoded refinement region onto page at (%d, %d)\", rsi.width, rsi.height, rsi.x, rsi.y);\n            code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, rsi.x, rsi.y, rsi.op);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to add refinement region to page\");\n                goto cleanup;\n            }\n        }\n\ncleanup:\n        jbig2_image_release(ctx, image);\n        jbig2_image_release(ctx, params.GRREFERENCE);\n        jbig2_free(ctx->allocator, as);\n        jbig2_word_stream_buf_free(ctx, ws);\n        jbig2_free(ctx->allocator, GR_stats);\n    }\n\n    return code;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_segment.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>             /* size_t */\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_arith_int.h\"\n#include \"jbig2_arith_iaid.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_halftone.h\"\n#include \"jbig2_huffman.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_refinement.h\"\n#include \"jbig2_segment.h\"\n#include \"jbig2_symbol_dict.h\"\n#include \"jbig2_text.h\"\n\nJbig2Segment *\njbig2_parse_segment_header(Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size, size_t *p_header_size)\n{\n    Jbig2Segment *result;\n    uint8_t rtscarf;\n    uint32_t rtscarf_long;\n    uint32_t *referred_to_segments;\n    uint32_t referred_to_segment_count;\n    uint32_t referred_to_segment_size;\n    uint32_t pa_size;\n    uint32_t offset;\n\n    /* minimum possible size of a jbig2 segment header */\n    if (buf_size < 11)\n        return NULL;\n\n    result = jbig2_new(ctx, Jbig2Segment, 1);\n    if (result == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate segment\");\n        return NULL;\n    }\n\n    /* 7.2.2 */\n    result->number = jbig2_get_uint32(buf);\n    if (result->number == JBIG2_UNKNOWN_SEGMENT_NUMBER) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"segment number too large\");\n        jbig2_free(ctx->allocator, result);\n        return NULL;\n    }\n\n    /* 7.2.3 */\n    result->flags = buf[4];\n\n    /* 7.2.4 referred-to segments */\n    rtscarf = buf[5];\n    if ((rtscarf & 0xe0) == 0xe0) {\n        rtscarf_long = jbig2_get_uint32(buf + 5);\n        referred_to_segment_count = rtscarf_long & 0x1fffffff;\n        offset = 5 + 4 + (referred_to_segment_count + 1) / 8;\n    } else {\n        referred_to_segment_count = (rtscarf >> 5);\n        offset = 5 + 1;\n    }\n    result->referred_to_segment_count = referred_to_segment_count;\n\n    /* we now have enough information to compute the full header length */\n    referred_to_segment_size = result->number <= 256 ? 1 : result->number <= 65536 ? 2 : 4;     /* 7.2.5 */\n    pa_size = result->flags & 0x40 ? 4 : 1;     /* 7.2.6 */\n    if (offset + referred_to_segment_count * referred_to_segment_size + pa_size + 4 > buf_size) {\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, \"attempted to parse segment header with insufficient data, asking for more data\");\n        jbig2_free(ctx->allocator, result);\n        return NULL;\n    }\n\n    /* 7.2.5 */\n    if (referred_to_segment_count) {\n        uint32_t i;\n\n        referred_to_segments = jbig2_new(ctx, uint32_t, referred_to_segment_count * referred_to_segment_size);\n        if (referred_to_segments == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, result->number, \"failed to allocate referred to segments\");\n            jbig2_free(ctx->allocator, result);\n            return NULL;\n        }\n\n        for (i = 0; i < referred_to_segment_count; i++) {\n            referred_to_segments[i] =\n                (referred_to_segment_size == 1) ? buf[offset] :\n                (referred_to_segment_size == 2) ? jbig2_get_uint16(buf + offset) : jbig2_get_uint32(buf + offset);\n            offset += referred_to_segment_size;\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, \"segment %d refers to segment %d\", result->number, referred_to_segments[i]);\n        }\n        result->referred_to_segments = referred_to_segments;\n    } else {                    /* no referred-to segments */\n\n        result->referred_to_segments = NULL;\n    }\n\n    /* 7.2.6 */\n    if (pa_size == 4) {\n        result->page_association = jbig2_get_uint32(buf + offset);\n        offset += 4;\n    } else {\n        result->page_association = buf[offset++];\n    }\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, \"segment %d is associated with page %d\", result->number, result->page_association);\n\n    /* 7.2.7 */\n    result->rows = UINT32_MAX;\n    result->data_length = jbig2_get_uint32(buf + offset);\n    *p_header_size = offset + 4;\n\n    /* no body parsing results yet */\n    result->result = NULL;\n\n    return result;\n}\n\nvoid\njbig2_free_segment(Jbig2Ctx *ctx, Jbig2Segment *segment)\n{\n    if (segment == NULL)\n        return;\n\n    jbig2_free(ctx->allocator, segment->referred_to_segments);\n    /* todo: we need either some separate fields or\n       a more complex result object rather than this\n       brittle special casing */\n    switch (segment->flags & 63) {\n    case 0:                    /* symbol dictionary */\n        if (segment->result != NULL)\n            jbig2_sd_release(ctx, (Jbig2SymbolDict *) segment->result);\n        break;\n    case 4:                    /* intermediate text region */\n    case 40:                   /* intermediate refinement region */\n        if (segment->result != NULL)\n            jbig2_image_release(ctx, (Jbig2Image *) segment->result);\n        break;\n    case 16:                   /* pattern dictionary */\n        if (segment->result != NULL)\n            jbig2_hd_release(ctx, (Jbig2PatternDict *) segment->result);\n        break;\n    case 53:                   /* user-supplied huffman table */\n        if (segment->result != NULL)\n            jbig2_table_free(ctx, (Jbig2HuffmanParams *) segment->result);\n        break;\n    default:\n        /* anything else is probably an undefined pointer */\n        break;\n    }\n    jbig2_free(ctx->allocator, segment);\n}\n\n/* find a segment by number */\nJbig2Segment *\njbig2_find_segment(Jbig2Ctx *ctx, uint32_t number)\n{\n    int index, index_max = ctx->segment_index - 1;\n    const Jbig2Ctx *global_ctx = ctx->global_ctx;\n\n    /* FIXME: binary search would be better */\n    for (index = index_max; index >= 0; index--)\n        if (ctx->segments[index]->number == number)\n            return (ctx->segments[index]);\n\n    if (global_ctx)\n        for (index = global_ctx->segment_index - 1; index >= 0; index--)\n            if (global_ctx->segments[index]->number == number)\n                return (global_ctx->segments[index]);\n\n    /* didn't find a match */\n    return NULL;\n}\n\n/* parse the generic portion of a region segment data header */\nvoid\njbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data)\n{\n    /* 7.4.1 */\n    info->width = jbig2_get_uint32(segment_data);\n    info->height = jbig2_get_uint32(segment_data + 4);\n    info->x = jbig2_get_uint32(segment_data + 8);\n    info->y = jbig2_get_uint32(segment_data + 12);\n    info->flags = segment_data[16];\n    info->op = (Jbig2ComposeOp)(info->flags & 0x7);\n}\n\n/* dispatch code for extension segment parsing */\nstatic int\njbig2_parse_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)\n{\n    uint32_t type;\n    bool reserved;\n    bool necessary;\n\n    if (segment->data_length < 4)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n\n    type = jbig2_get_uint32(segment_data);\n    reserved = type & 0x20000000;\n    /* Not implemented since this bit\n    is only needed by encoders.\n    dependent = type & 0x40000000;\n    */\n    necessary = type & 0x80000000;\n\n    if (necessary && !reserved) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"extension segment is marked 'necessary' but not 'reserved' contrary to spec\");\n    }\n\n    switch (type) {\n    case 0x20000000:\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"ignoring ASCII comment\");\n        break;\n    case 0x20000002:\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"ignoring UCS-2 comment\");\n        break;\n    default:\n        if (necessary) {\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"unhandled necessary extension segment type 0x%08x\", type);\n        } else {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unhandled non-necessary extension segment, skipping\");\n        }\n    }\n\n    return 0;\n}\n\n/* dispatch code for profile segment parsing */\nstatic int\njbig2_parse_profile_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)\n{\n    uint32_t profiles;\n    uint32_t i;\n    uint32_t profile;\n    int index;\n    const char *requirements;\n    const char *generic_region;\n    const char *refinement_region;\n    const char *halftone_region;\n    const char *numerical_data;\n\n    if (segment->data_length < 4)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"Segment too short\");\n    index = 0;\n\n    profiles = jbig2_get_uint32(&segment_data[index]);\n    index += 4;\n\n    for (i = 0; i < profiles; i++) {\n        if (segment->data_length - index < 4)\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short to store profile\");\n\n        profile = jbig2_get_uint32(&segment_data[index]);\n        index += 4;\n\n        switch (profile) {\n        case 0x00000001:\n            requirements = \"All JBIG2 capabilities\";\n            generic_region = \"No restriction\";\n            refinement_region = \"No restriction\";\n            halftone_region = \"No restriction\";\n            numerical_data = \"No restriction\";\n            break;\n        case 0x00000002:\n            requirements = \"Maximum compression\";\n            generic_region = \"Arithmetic only; any template used\";\n            refinement_region = \"No restriction\";\n            halftone_region = \"No restriction\";\n            numerical_data = \"Arithmetic only\";\n            break;\n        case 0x00000003:\n            requirements = \"Medium complexity and medium compression\";\n            generic_region = \"Arithmetic only; only 10-pixel and 13-pixel templates\";\n            refinement_region = \"10-pixel template only\";\n            halftone_region = \"No skip mask used\";\n            numerical_data = \"Arithmetic only\";\n            break;\n        case 0x00000004:\n            requirements = \"Low complexity with progressive lossless capability\";\n            generic_region = \"MMR only\";\n            refinement_region = \"10-pixel template only\";\n            halftone_region = \"No skip mask used\";\n            numerical_data = \"Huffman only\";\n            break;\n        case 0x00000005:\n            requirements = \"Low complexity\";\n            generic_region = \"MMR only\";\n            refinement_region = \"Not available\";\n            halftone_region = \"No skip mask used\";\n            numerical_data = \"Huffman only\";\n            break;\n        default:\n            requirements = \"Unknown\";\n            generic_region = \"Unknown\";\n            refinement_region = \"Unknown\";\n            halftone_region = \"Unknown\";\n            numerical_data = \"Unknown\";\n            break;\n        }\n\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"Supported profile: 0x%08x\", profile);\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"  Requirements: %s\", requirements);\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"  Generic region coding: %s\", generic_region);\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"  Refinement region coding: %s\", refinement_region);\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"  Halftone region coding: %s\", halftone_region);\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"  Numerical data: %s\", numerical_data);\n    }\n\n    return 0;\n}\n\n/* general segment parsing dispatch */\nint\njbig2_parse_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data)\n{\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"segment %d, flags=%x, type=%d, data_length=%ld\", segment->number, segment->flags, segment->flags & 63, (long) segment->data_length);\n    switch (segment->flags & 63) {\n    case 0:\n        return jbig2_symbol_dictionary(ctx, segment, segment_data);\n    case 4:                    /* intermediate text region */\n    case 6:                    /* immediate text region */\n    case 7:                    /* immediate lossless text region */\n        return jbig2_text_region(ctx, segment, segment_data);\n    case 16:\n        return jbig2_pattern_dictionary(ctx, segment, segment_data);\n    case 20:                   /* intermediate halftone region */\n    case 22:                   /* immediate halftone region */\n    case 23:                   /* immediate lossless halftone region */\n        return jbig2_halftone_region(ctx, segment, segment_data);\n    case 36:\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"unhandled segment type 'intermediate generic region' (NYI)\");\n    case 38:                   /* immediate generic region */\n    case 39:                   /* immediate lossless generic region */\n        return jbig2_immediate_generic_region(ctx, segment, segment_data);\n    case 40:                   /* intermediate generic refinement region */\n    case 42:                   /* immediate generic refinement region */\n    case 43:                   /* immediate lossless generic refinement region */\n        return jbig2_refinement_region(ctx, segment, segment_data);\n    case 48:\n        return jbig2_page_info(ctx, segment, segment_data);\n    case 49:\n        return jbig2_end_of_page(ctx, segment, segment_data);\n    case 50:\n        return jbig2_end_of_stripe(ctx, segment, segment_data);\n    case 51:\n        ctx->state = JBIG2_FILE_EOF;\n        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"end of file\");\n        break;\n    case 52:\n        return jbig2_parse_profile_segment(ctx, segment, segment_data);\n    case 53:                   /* user-supplied huffman table */\n        return jbig2_table(ctx, segment, segment_data);\n    case 54:\n        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unhandled segment type 'color palette' (NYI)\");\n    case 62:\n        return jbig2_parse_extension_segment(ctx, segment, segment_data);\n    default:\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unknown segment type %d\", segment->flags & 63);\n    }\n    return 0;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_symbol_dict.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n/* symbol dictionary segment decode and support */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>\n#include <string.h>             /* memset() */\n\n#if defined(OUTPUT_PBM) || defined(DUMP_SYMDICT)\n#include <stdio.h>\n#endif\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_arith_int.h\"\n#include \"jbig2_arith_iaid.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_huffman.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_mmr.h\"\n#include \"jbig2_refinement.h\"\n#include \"jbig2_segment.h\"\n#include \"jbig2_symbol_dict.h\"\n#include \"jbig2_text.h\"\n\n/* Table 13 */\ntypedef struct {\n    bool SDHUFF;\n    bool SDREFAGG;\n    uint32_t SDNUMINSYMS;\n    Jbig2SymbolDict *SDINSYMS;\n    uint32_t SDNUMNEWSYMS;\n    uint32_t SDNUMEXSYMS;\n    Jbig2HuffmanTable *SDHUFFDH;\n    Jbig2HuffmanTable *SDHUFFDW;\n    Jbig2HuffmanTable *SDHUFFBMSIZE;\n    Jbig2HuffmanTable *SDHUFFAGGINST;\n    int SDTEMPLATE;\n    int8_t sdat[8];\n    bool SDRTEMPLATE;\n    int8_t sdrat[4];\n} Jbig2SymbolDictParams;\n\n/* Utility routines */\n\n#ifdef DUMP_SYMDICT\nvoid\njbig2_dump_symbol_dict(Jbig2Ctx *ctx, Jbig2Segment *segment)\n{\n    Jbig2SymbolDict *dict = (Jbig2SymbolDict *) segment->result;\n    uint32_t index;\n    char filename[24];\n    int code;\n\n    if (dict == NULL)\n        return;\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, \"dumping symbol dictionary as %d individual png files\", dict->n_symbols);\n    for (index = 0; index < dict->n_symbols; index++) {\n        snprintf(filename, sizeof(filename), \"symbol_%02d-%04d.png\", segment->number, index);\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"dumping symbol %d/%d as '%s'\", index, dict->n_symbols, filename);\n#ifdef HAVE_LIBPNG\n        code = jbig2_image_write_png_file(dict->glyphs[index], filename);\n#else\n        code = jbig2_image_write_pbm_file(dict->glyphs[index], filename);\n#endif\n        if (code < 0)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to dump symbol %d/%d as '%s'\", index, dict->n_symbols, filename);\n    }\n}\n#endif /* DUMP_SYMDICT */\n\n/* return a new empty symbol dict */\nJbig2SymbolDict *\njbig2_sd_new(Jbig2Ctx *ctx, uint32_t n_symbols)\n{\n    Jbig2SymbolDict *new_dict = NULL;\n\n    new_dict = jbig2_new(ctx, Jbig2SymbolDict, 1);\n    if (new_dict != NULL) {\n        new_dict->glyphs = jbig2_new(ctx, Jbig2Image *, n_symbols);\n        new_dict->n_symbols = n_symbols;\n    } else {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate new empty symbol dictionary\");\n        return NULL;\n    }\n\n    if (new_dict->glyphs != NULL) {\n        memset(new_dict->glyphs, 0, n_symbols * sizeof(Jbig2Image *));\n    } else if (new_dict->n_symbols > 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate glyphs for new empty symbol dictionary\");\n        jbig2_free(ctx->allocator, new_dict);\n        return NULL;\n    }\n\n    return new_dict;\n}\n\n/* release the memory associated with a symbol dict */\nvoid\njbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict)\n{\n    uint32_t i;\n\n    if (dict == NULL)\n        return;\n    if (dict->glyphs != NULL)\n        for (i = 0; i < dict->n_symbols; i++)\n            jbig2_image_release(ctx, dict->glyphs[i]);\n    jbig2_free(ctx->allocator, dict->glyphs);\n    jbig2_free(ctx->allocator, dict);\n}\n\n/* get a particular glyph by index */\nJbig2Image *\njbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id)\n{\n    if (dict == NULL)\n        return NULL;\n    return dict->glyphs[id];\n}\n\n/* count the number of dictionary segments referred to by the given segment */\nuint32_t\njbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment)\n{\n    int index;\n    Jbig2Segment *rsegment;\n    uint32_t n_dicts = 0;\n\n    for (index = 0; index < segment->referred_to_segment_count; index++) {\n        rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]);\n        if (rsegment && ((rsegment->flags & 63) == 0) &&\n            rsegment->result && (((Jbig2SymbolDict *) rsegment->result)->n_symbols > 0) && ((*((Jbig2SymbolDict *) rsegment->result)->glyphs) != NULL))\n            n_dicts++;\n    }\n\n    return (n_dicts);\n}\n\n/* return an array of pointers to symbol dictionaries referred to by the given segment */\nJbig2SymbolDict **\njbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment)\n{\n    int index;\n    Jbig2Segment *rsegment;\n    Jbig2SymbolDict **dicts;\n    uint32_t n_dicts = jbig2_sd_count_referred(ctx, segment);\n    uint32_t dindex = 0;\n\n    dicts = jbig2_new(ctx, Jbig2SymbolDict *, n_dicts);\n    if (dicts == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate referred list of symbol dictionaries\");\n        return NULL;\n    }\n\n    for (index = 0; index < segment->referred_to_segment_count; index++) {\n        rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]);\n        if (rsegment && ((rsegment->flags & 63) == 0) && rsegment->result &&\n                (((Jbig2SymbolDict *) rsegment->result)->n_symbols > 0) && ((*((Jbig2SymbolDict *) rsegment->result)->glyphs) != NULL)) {\n            /* add this referred to symbol dictionary */\n            dicts[dindex++] = (Jbig2SymbolDict *) rsegment->result;\n        }\n    }\n\n    if (dindex != n_dicts) {\n        /* should never happen */\n        jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"counted %d symbol dictionaries but built a list with %d.\", n_dicts, dindex);\n        jbig2_free(ctx->allocator, dicts);\n        return NULL;\n    }\n\n    return (dicts);\n}\n\n/* generate a new symbol dictionary by concatenating a list of\n   existing dictionaries */\nJbig2SymbolDict *\njbig2_sd_cat(Jbig2Ctx *ctx, uint32_t n_dicts, Jbig2SymbolDict **dicts)\n{\n    uint32_t i, j, k, symbols;\n    Jbig2SymbolDict *new_dict = NULL;\n\n    /* count the imported symbols and allocate a new array */\n    symbols = 0;\n    for (i = 0; i < n_dicts; i++)\n        symbols += dicts[i]->n_symbols;\n\n    /* fill a new array with new references to glyph pointers */\n    new_dict = jbig2_sd_new(ctx, symbols);\n    if (new_dict != NULL) {\n        k = 0;\n        for (i = 0; i < n_dicts; i++)\n            for (j = 0; j < dicts[i]->n_symbols; j++)\n                new_dict->glyphs[k++] = jbig2_image_reference(ctx, dicts[i]->glyphs[j]);\n    } else {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"failed to allocate new symbol dictionary\");\n    }\n\n    return new_dict;\n}\n\n/* Decoding routines */\n\n/* 6.5 */\nstatic Jbig2SymbolDict *\njbig2_decode_symbol_dict(Jbig2Ctx *ctx,\n                         Jbig2Segment *segment,\n                         const Jbig2SymbolDictParams *params, const byte *data, size_t size, Jbig2ArithCx *GB_stats, Jbig2ArithCx *GR_stats)\n{\n    Jbig2SymbolDict *SDNEWSYMS = NULL;\n    Jbig2SymbolDict *SDEXSYMS = NULL;\n    uint32_t HCHEIGHT;\n    uint32_t NSYMSDECODED;\n    uint32_t SYMWIDTH, TOTWIDTH;\n    uint32_t HCFIRSTSYM;\n    uint32_t *SDNEWSYMWIDTHS = NULL;\n    uint8_t SBSYMCODELEN = 0;\n    Jbig2WordStream *ws = NULL;\n    Jbig2HuffmanState *hs = NULL;\n    Jbig2ArithState *as = NULL;\n    Jbig2ArithIntCtx *IADH = NULL;\n    Jbig2ArithIntCtx *IADW = NULL;\n    Jbig2ArithIntCtx *IAEX = NULL;\n    Jbig2ArithIntCtx *IAAI = NULL;\n    int code = 0;\n    Jbig2SymbolDict **refagg_dicts = NULL;\n    uint32_t i;\n    Jbig2TextRegionParams tparams;\n    Jbig2Image *image = NULL;\n    Jbig2Image *glyph = NULL;\n    uint32_t emptyruns = 0;\n\n    memset(&tparams, 0, sizeof(tparams));\n\n    /* 6.5.5 (3) */\n    HCHEIGHT = 0;\n    NSYMSDECODED = 0;\n\n    ws = jbig2_word_stream_buf_new(ctx, data, size);\n    if (ws == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate word stream when decoding symbol dictionary\");\n        return NULL;\n    }\n\n    as = jbig2_arith_new(ctx, ws);\n    if (as == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding state when decoding symbol dictionary\");\n        jbig2_word_stream_buf_free(ctx, ws);\n        return NULL;\n    }\n\n    for (SBSYMCODELEN = 0; ((uint64_t) 1 << SBSYMCODELEN) < ((uint64_t) params->SDNUMINSYMS + params->SDNUMNEWSYMS); SBSYMCODELEN++);\n\n    if (params->SDHUFF) {\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"huffman coded symbol dictionary\");\n        hs = jbig2_huffman_new(ctx, ws);\n        tparams.SBHUFFRDX = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);   /* Table B.15 */\n        tparams.SBHUFFRDY = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);   /* Table B.15 */\n        tparams.SBHUFFRSIZE = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_A); /* Table B.1 */\n        if (hs == NULL || tparams.SBHUFFRDX == NULL ||\n                tparams.SBHUFFRDY == NULL || tparams.SBHUFFRSIZE == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate for symbol bitmap\");\n            goto cleanup;\n        }\n        /* 6.5.5 (2) */\n        if (!params->SDREFAGG) {\n            SDNEWSYMWIDTHS = jbig2_new(ctx, uint32_t, params->SDNUMNEWSYMS);\n            if (SDNEWSYMWIDTHS == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate symbol widths (%u)\", params->SDNUMNEWSYMS);\n                goto cleanup;\n            }\n        } else {\n            tparams.SBHUFFFS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_F);    /* Table B.6 */\n            tparams.SBHUFFDS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_H);    /* Table B.8 */\n            tparams.SBHUFFDT = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_K);    /* Table B.11 */\n            tparams.SBHUFFRDW = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);   /* Table B.15 */\n            tparams.SBHUFFRDH = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);   /* Table B.15 */\n            if (tparams.SBHUFFFS == NULL || tparams.SBHUFFDS == NULL ||\n                    tparams.SBHUFFDT == NULL || tparams.SBHUFFRDW == NULL ||\n                    tparams.SBHUFFRDH == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"out of memory creating text region huffman decoder entries\");\n                goto cleanup;\n            }\n        }\n    } else {\n        IADH = jbig2_arith_int_ctx_new(ctx);\n        IADW = jbig2_arith_int_ctx_new(ctx);\n        IAEX = jbig2_arith_int_ctx_new(ctx);\n        IAAI = jbig2_arith_int_ctx_new(ctx);\n        if (IADH == NULL || IADW == NULL || IAEX == NULL || IAAI == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate symbol bitmap\");\n            goto cleanup;\n        }\n        tparams.IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);\n        tparams.IARDX = jbig2_arith_int_ctx_new(ctx);\n        tparams.IARDY = jbig2_arith_int_ctx_new(ctx);\n        if (tparams.IAID == NULL || tparams.IARDX == NULL ||\n                tparams.IARDY == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region arithmetic decoder contexts\");\n            goto cleanup;\n        }\n        if (params->SDREFAGG) {\n            /* Values from Table 17, section 6.5.8.2 (2) */\n            tparams.IADT = jbig2_arith_int_ctx_new(ctx);\n            tparams.IAFS = jbig2_arith_int_ctx_new(ctx);\n            tparams.IADS = jbig2_arith_int_ctx_new(ctx);\n            tparams.IAIT = jbig2_arith_int_ctx_new(ctx);\n            /* Table 31 */\n            tparams.IARI = jbig2_arith_int_ctx_new(ctx);\n            tparams.IARDW = jbig2_arith_int_ctx_new(ctx);\n            tparams.IARDH = jbig2_arith_int_ctx_new(ctx);\n            if (tparams.IADT == NULL || tparams.IAFS == NULL ||\n                    tparams.IADS == NULL || tparams.IAIT == NULL ||\n                    tparams.IARI == NULL || tparams.IARDW == NULL ||\n                    tparams.IARDH == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region arith decoder contexts\");\n            }\n        }\n    }\n    tparams.SBHUFF = params->SDHUFF;\n    tparams.SBREFINE = 1;\n    tparams.SBSTRIPS = 1;\n    tparams.SBDEFPIXEL = 0;\n    tparams.SBCOMBOP = JBIG2_COMPOSE_OR;\n    tparams.TRANSPOSED = 0;\n    tparams.REFCORNER = JBIG2_CORNER_TOPLEFT;\n    tparams.SBDSOFFSET = 0;\n    tparams.SBRTEMPLATE = params->SDRTEMPLATE;\n\n    /* 6.5.5 (1) */\n    SDNEWSYMS = jbig2_sd_new(ctx, params->SDNUMNEWSYMS);\n    if (SDNEWSYMS == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate new symbols (%u)\", params->SDNUMNEWSYMS);\n        goto cleanup;\n    }\n\n    refagg_dicts = jbig2_new(ctx, Jbig2SymbolDict *, 2);\n    if (refagg_dicts == NULL) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"Out of memory allocating dictionary array\");\n        goto cleanup;\n    }\n    refagg_dicts[0] = jbig2_sd_new(ctx, params->SDNUMINSYMS);\n    if (refagg_dicts[0] == NULL) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"out of memory allocating symbol dictionary\");\n        goto cleanup;\n    }\n    for (i = 0; i < params->SDNUMINSYMS; i++) {\n        refagg_dicts[0]->glyphs[i] = jbig2_image_reference(ctx, params->SDINSYMS->glyphs[i]);\n    }\n    refagg_dicts[1] = SDNEWSYMS;\n\n    /* 6.5.5 (4a) */\n    while (NSYMSDECODED < params->SDNUMNEWSYMS) {\n        int32_t HCDH, DW;\n\n        /* 6.5.6 */\n        if (params->SDHUFF) {\n            HCDH = jbig2_huffman_get(hs, params->SDHUFFDH, &code);\n        } else {\n            code = jbig2_arith_int_decode(ctx, IADH, as, &HCDH);\n        }\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode height class delta\");\n            goto cleanup;\n        }\n        if (code > 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"OOB decoding height class delta\");\n            goto cleanup;\n        }\n\n        /* 6.5.5 (4b) */\n        HCHEIGHT = HCHEIGHT + HCDH;\n        SYMWIDTH = 0;\n        TOTWIDTH = 0;\n        HCFIRSTSYM = NSYMSDECODED;\n\n        if ((int32_t) HCHEIGHT < 0) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"invalid HCHEIGHT value\");\n            goto cleanup;\n        }\n#ifdef JBIG2_DEBUG\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"HCHEIGHT = %d\", HCHEIGHT);\n#endif\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"decoding height class %d with %d syms decoded\", HCHEIGHT, NSYMSDECODED);\n\n        for (;;) {\n            /* 6.5.7 */\n            if (params->SDHUFF) {\n                DW = jbig2_huffman_get(hs, params->SDHUFFDW, &code);\n            } else {\n                code = jbig2_arith_int_decode(ctx, IADW, as, &DW);\n            }\n            if (code < 0)\n            {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode DW\");\n                goto cleanup;\n            }\n            /* 6.5.5 (4c.i) */\n            if (code > 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"OOB when decoding DW signals end of height class %d\", HCHEIGHT);\n                break;\n            }\n\n            /* check for broken symbol table */\n            if (NSYMSDECODED >= params->SDNUMNEWSYMS) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"no OOB signaling end of height class %d, continuing\", HCHEIGHT);\n                break;\n            }\n\n            if (DW < 0 && SYMWIDTH < (uint32_t) -DW) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"DW value (%d) would make SYMWIDTH (%u) negative at symbol %u\", DW, SYMWIDTH, NSYMSDECODED + 1);\n                goto cleanup;\n            }\n            if (DW > 0 && (uint32_t) DW > UINT32_MAX - SYMWIDTH) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"DW value (%d) would make SYMWIDTH (%u) too large at symbol %u\", DW, SYMWIDTH, NSYMSDECODED + 1);\n                goto cleanup;\n            }\n\n            SYMWIDTH = SYMWIDTH + DW;\n            if (SYMWIDTH > UINT32_MAX - TOTWIDTH) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"SYMWIDTH value (%u) would make TOTWIDTH (%u) too large at symbol %u\", SYMWIDTH, TOTWIDTH, NSYMSDECODED + 1);\n                goto cleanup;\n            }\n\n            TOTWIDTH = TOTWIDTH + SYMWIDTH;\n#ifdef JBIG2_DEBUG\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"SYMWIDTH = %u TOTWIDTH = %u\", SYMWIDTH, TOTWIDTH);\n#endif\n            /* 6.5.5 (4c.ii) */\n            if (!params->SDHUFF || params->SDREFAGG) {\n#ifdef JBIG2_DEBUG\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"SDHUFF = %d; SDREFAGG = %d\", params->SDHUFF, params->SDREFAGG);\n#endif\n                /* 6.5.8 */\n                if (!params->SDREFAGG) {\n                    Jbig2GenericRegionParams region_params;\n                    int sdat_bytes;\n\n                    /* Table 16 */\n                    region_params.MMR = 0;\n                    region_params.GBTEMPLATE = params->SDTEMPLATE;\n                    region_params.TPGDON = 0;\n                    region_params.USESKIP = 0;\n                    sdat_bytes = params->SDTEMPLATE == 0 ? 8 : 2;\n                    memcpy(region_params.gbat, params->sdat, sdat_bytes);\n\n                    image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);\n                    if (image == NULL) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate image\");\n                        goto cleanup;\n                    }\n\n                    code = jbig2_decode_generic_region(ctx, segment, &region_params, as, image, GB_stats);\n                    if (code < 0) {\n                        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode generic region\");\n                        goto cleanup;\n                    }\n\n                    SDNEWSYMS->glyphs[NSYMSDECODED] = image;\n                    image = NULL;\n                } else {\n                    /* 6.5.8.2 refinement/aggregate symbol */\n                    uint32_t REFAGGNINST;\n\n                    if (params->SDHUFF) {\n                        REFAGGNINST = jbig2_huffman_get(hs, params->SDHUFFAGGINST, &code);\n                    } else {\n                        code = jbig2_arith_int_decode(ctx, IAAI, as, (int32_t *) &REFAGGNINST);\n                    }\n                    if (code < 0) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode number of symbols in aggregate glyph\");\n                        goto cleanup;\n                    }\n                    if (code > 0) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB in number of symbols in aggregate glyph\");\n                        goto cleanup;\n                    }\n                    if ((int32_t) REFAGGNINST <= 0) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"invalid number of symbols in aggregate glyph\");\n                        goto cleanup;\n                    }\n\n                    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"aggregate symbol coding (%d instances)\", REFAGGNINST);\n\n                    if (REFAGGNINST > 1) {\n                        tparams.SBNUMINSTANCES = REFAGGNINST;\n\n                        image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);\n                        if (image == NULL) {\n                            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate symbol image\");\n                            goto cleanup;\n                        }\n\n                        /* multiple symbols are handled as a text region */\n                        code = jbig2_decode_text_region(ctx, segment, &tparams, (const Jbig2SymbolDict * const *)refagg_dicts,\n                                                        2, image, data, size, GR_stats, as, ws);\n                        if (code < 0) {\n                            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode text region\");\n                            goto cleanup;\n                        }\n\n                        SDNEWSYMS->glyphs[NSYMSDECODED] = image;\n                        image = NULL;\n                    } else {\n                        /* 6.5.8.2.2 */\n                        /* bool SBHUFF = params->SDHUFF; */\n                        Jbig2RefinementRegionParams rparams;\n                        uint32_t ID;\n                        int32_t RDX, RDY;\n                        int BMSIZE = 0;\n                        uint32_t ninsyms = params->SDNUMINSYMS;\n                        int code1 = 0;\n                        int code2 = 0;\n                        int code3 = 0;\n                        int code4 = 0;\n                        int code5 = 0;\n\n                        /* 6.5.8.2.2 (2, 3, 4, 5) */\n                        if (params->SDHUFF) {\n                            ID = jbig2_huffman_get_bits(hs, SBSYMCODELEN, &code1);\n                            RDX = jbig2_huffman_get(hs, tparams.SBHUFFRDX, &code2);\n                            RDY = jbig2_huffman_get(hs, tparams.SBHUFFRDY, &code3);\n                            BMSIZE = jbig2_huffman_get(hs, tparams.SBHUFFRSIZE, &code4);\n                            code5 = jbig2_huffman_skip(hs);\n                        } else {\n                            code1 = jbig2_arith_iaid_decode(ctx, tparams.IAID, as, (int32_t *) &ID);\n                            code2 = jbig2_arith_int_decode(ctx, tparams.IARDX, as, &RDX);\n                            code3 = jbig2_arith_int_decode(ctx, tparams.IARDY, as, &RDY);\n                        }\n\n                        if (code1 < 0 || code2 < 0 || code3 < 0 || code4 < 0 || code5 < 0) {\n                            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode data\");\n                            goto cleanup;\n                        }\n                        if (code1 > 0 || code2 > 0 || code3 > 0 || code4 > 0 || code5 > 0) {\n                            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB in single refinement/aggregate coded symbol data\");\n                            goto cleanup;\n                        }\n\n                        if (ID >= ninsyms + NSYMSDECODED) {\n                            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"refinement references unknown symbol %d\", ID);\n                            goto cleanup;\n                        }\n\n                        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                                    \"symbol is a refinement of ID %d with the refinement applied at (%d,%d)\", ID, RDX, RDY);\n\n                        image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);\n                        if (image == NULL) {\n                            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate symbol image\");\n                            goto cleanup;\n                        }\n\n                        /* Table 18 */\n                        rparams.GRTEMPLATE = params->SDRTEMPLATE;\n                        rparams.GRREFERENCE = (ID < ninsyms) ? params->SDINSYMS->glyphs[ID] : SDNEWSYMS->glyphs[ID - ninsyms];\n                        /* SumatraPDF: fail on missing glyphs */\n                        if (rparams.GRREFERENCE == NULL) {\n                            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"missing glyph %d/%d\", ID, ninsyms);\n                            goto cleanup;\n                        }\n                        rparams.GRREFERENCEDX = RDX;\n                        rparams.GRREFERENCEDY = RDY;\n                        rparams.TPGRON = 0;\n                        memcpy(rparams.grat, params->sdrat, 4);\n                        code = jbig2_decode_refinement_region(ctx, segment, &rparams, as, image, GR_stats);\n                        if (code < 0) {\n                            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode refinement region\");\n                            goto cleanup;\n                        }\n\n                        SDNEWSYMS->glyphs[NSYMSDECODED] = image;\n                        image = NULL;\n\n                        /* 6.5.8.2.2 (7) */\n                        if (params->SDHUFF) {\n                            if (BMSIZE == 0)\n                                BMSIZE = (size_t) SDNEWSYMS->glyphs[NSYMSDECODED]->height *\n                                    SDNEWSYMS->glyphs[NSYMSDECODED]->stride;\n                            code = jbig2_huffman_advance(hs, BMSIZE);\n                            if (code < 0) {\n                                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to advance after huffman decoding in refinement region\");\n                                goto cleanup;\n                            }\n                        }\n                    }\n                }\n\n#ifdef OUTPUT_PBM\n                {\n                    char name[64];\n                    FILE *out;\n                    int code;\n\n                    snprintf(name, 64, \"sd.%04d.%04d.pbm\", segment->number, NSYMSDECODED);\n                    out = fopen(name, \"wb\");\n                    code = jbig2_image_write_pbm(SDNEWSYMS->glyphs[NSYMSDECODED], out);\n                    fclose(out);\n                    if (code < 0) {\n                        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to write glyph\");\n                        goto cleanup;\n                    }\n                    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"writing out glyph as '%s' ...\", name);\n                }\n#endif\n\n            }\n\n            /* 6.5.5 (4c.iii) */\n            if (params->SDHUFF && !params->SDREFAGG) {\n                SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;\n            }\n\n            /* 6.5.5 (4c.iv) */\n            NSYMSDECODED = NSYMSDECODED + 1;\n\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"decoded symbol %u of %u (%ux%u)\", NSYMSDECODED, params->SDNUMNEWSYMS, SYMWIDTH, HCHEIGHT);\n\n        }                       /* end height class decode loop */\n\n        /* 6.5.5 (4d) */\n        if (params->SDHUFF && !params->SDREFAGG) {\n            /* 6.5.9 */\n            size_t BMSIZE;\n            uint32_t j;\n            int x;\n\n            BMSIZE = jbig2_huffman_get(hs, params->SDHUFFBMSIZE, &code);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"error decoding size of collective bitmap\");\n                goto cleanup;\n            }\n            if (code > 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding size of collective bitmap\");\n                goto cleanup;\n            }\n\n            /* skip any bits before the next byte boundary */\n            code = jbig2_huffman_skip(hs);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to skip to next byte when decoding collective bitmap\");\n            }\n\n            image = jbig2_image_new(ctx, TOTWIDTH, HCHEIGHT);\n            if (image == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate collective bitmap image\");\n                goto cleanup;\n            }\n\n            if (BMSIZE == 0) {\n                /* if BMSIZE == 0 bitmap is uncompressed */\n                const byte *src = data + jbig2_huffman_offset(hs);\n                const int stride = (image->width >> 3) + ((image->width & 7) ? 1 : 0);\n                byte *dst = image->data;\n\n                /* SumatraPDF: prevent read access violation */\n                if (size < jbig2_huffman_offset(hs) || (size - jbig2_huffman_offset(hs) < (size_t) image->height * stride) || (size < jbig2_huffman_offset(hs))) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"not enough data for decoding uncompressed (%d/%li)\", image->height * stride,\n                                (long) (size - jbig2_huffman_offset(hs)));\n                    goto cleanup;\n                }\n\n                BMSIZE = (size_t) image->height * stride;\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                            \"reading %dx%d uncompressed bitmap for %d symbols (%li bytes)\", image->width, image->height, NSYMSDECODED - HCFIRSTSYM, (long) BMSIZE);\n\n                for (j = 0; j < image->height; j++) {\n                    memcpy(dst, src, stride);\n                    dst += image->stride;\n                    src += stride;\n                }\n            } else {\n                Jbig2GenericRegionParams rparams;\n\n                /* SumatraPDF: prevent read access violation */\n                if (size < jbig2_huffman_offset(hs) || size < BMSIZE || size - jbig2_huffman_offset(hs) < BMSIZE) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"not enough data for decoding (%li/%li)\", (long) BMSIZE, (long) (size - jbig2_huffman_offset(hs)));\n                    goto cleanup;\n                }\n\n                jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                            \"reading %dx%d collective bitmap for %d symbols (%li bytes)\", image->width, image->height, NSYMSDECODED - HCFIRSTSYM, (long) BMSIZE);\n\n                rparams.MMR = 1;\n                code = jbig2_decode_generic_mmr(ctx, segment, &rparams, data + jbig2_huffman_offset(hs), BMSIZE, image);\n                if (code) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode MMR-coded generic region\");\n                    goto cleanup;\n                }\n            }\n\n            /* advance past the data we've just read */\n            code = jbig2_huffman_advance(hs, BMSIZE);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to advance after huffman decoding MMR bitmap image\");\n                goto cleanup;\n            }\n\n            /* copy the collective bitmap into the symbol dictionary */\n            x = 0;\n            for (j = HCFIRSTSYM; j < NSYMSDECODED; j++) {\n                glyph = jbig2_image_new(ctx, SDNEWSYMWIDTHS[j], HCHEIGHT);\n                if (glyph == NULL) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to copy the collective bitmap into symbol dictionary\");\n                    goto cleanup;\n                }\n                code = jbig2_image_compose(ctx, glyph, image, -x, 0, JBIG2_COMPOSE_REPLACE);\n                if (code) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to compose image into glyph\");\n                    goto cleanup;\n                }\n                x += SDNEWSYMWIDTHS[j];\n                SDNEWSYMS->glyphs[j] = glyph;\n                glyph = NULL;\n            }\n            jbig2_image_release(ctx, image);\n            image = NULL;\n        }\n\n    }                           /* end of symbol decode loop */\n\n    /* 6.5.10 */\n    SDEXSYMS = jbig2_sd_new(ctx, params->SDNUMEXSYMS);\n    if (SDEXSYMS == NULL) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate symbols exported from symbols dictionary\");\n        goto cleanup;\n    } else {\n        uint32_t i = 0;\n        uint32_t j = 0;\n        uint32_t k;\n        int exflag = 0;\n        uint32_t limit = params->SDNUMINSYMS + params->SDNUMNEWSYMS;\n        uint32_t EXRUNLENGTH;\n\n        while (i < limit) {\n            if (params->SDHUFF)\n                EXRUNLENGTH = jbig2_huffman_get(hs, tparams.SBHUFFRSIZE, &code);\n            else\n                code = jbig2_arith_int_decode(ctx, IAEX, as, (int32_t *) &EXRUNLENGTH);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode runlength for exported symbols\");\n                /* skip to the cleanup code and return SDEXSYMS = NULL */\n                jbig2_sd_release(ctx, SDEXSYMS);\n                SDEXSYMS = NULL;\n                break;\n            }\n            if (code > 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB when decoding runlength for exported symbols\");\n                /* skip to the cleanup code and return SDEXSYMS = NULL */\n                jbig2_sd_release(ctx, SDEXSYMS);\n                SDEXSYMS = NULL;\n                break;\n            }\n\n            /* prevent infinite list of empty runs, 1000 is just an arbitrary number */\n            if (EXRUNLENGTH <= 0 && ++emptyruns == 1000) {\n                jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"runlength too small in export symbol table (%u == 0 i = %u limit = %u)\", EXRUNLENGTH, i, limit);\n                /* skip to the cleanup code and return SDEXSYMS = NULL */\n                jbig2_sd_release(ctx, SDEXSYMS);\n                SDEXSYMS = NULL;\n                break;\n            } else if (EXRUNLENGTH > 0) {\n                emptyruns = 0;\n            }\n\n            if (EXRUNLENGTH > limit - i) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"exporting more symbols than available (%u > %u), capping\", i + EXRUNLENGTH, limit);\n                EXRUNLENGTH = limit - i;\n            }\n            if (exflag && j + EXRUNLENGTH > params->SDNUMEXSYMS) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"exporting more symbols than may be exported (%u > %u), capping\", j + EXRUNLENGTH, params->SDNUMEXSYMS);\n                EXRUNLENGTH = params->SDNUMEXSYMS - j;\n            }\n\n            for (k = 0; k < EXRUNLENGTH; k++) {\n                if (exflag) {\n                    Jbig2Image *img;\n                    if (i < params->SDNUMINSYMS) {\n                        img = params->SDINSYMS->glyphs[i];\n                    } else {\n                        img = SDNEWSYMS->glyphs[i - params->SDNUMINSYMS];\n                    }\n                    SDEXSYMS->glyphs[j++] = jbig2_image_reference(ctx, img);\n                }\n                i++;\n            }\n            exflag = !exflag;\n        }\n    }\n\ncleanup:\n    jbig2_image_release(ctx, glyph);\n    jbig2_image_release(ctx, image);\n    if (refagg_dicts != NULL) {\n        if (refagg_dicts[0] != NULL)\n            jbig2_sd_release(ctx, refagg_dicts[0]);\n        /* skip releasing refagg_dicts[1] as that is the same as SDNEWSYMS */\n        jbig2_free(ctx->allocator, refagg_dicts);\n    }\n    jbig2_sd_release(ctx, SDNEWSYMS);\n    if (params->SDHUFF) {\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFRSIZE);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFRDY);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFRDX);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFRDH);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFRDW);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFDT);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFDS);\n        jbig2_release_huffman_table(ctx, tparams.SBHUFFFS);\n        if (!params->SDREFAGG) {\n            jbig2_free(ctx->allocator, SDNEWSYMWIDTHS);\n        }\n        jbig2_huffman_free(ctx, hs);\n    } else {\n        jbig2_arith_int_ctx_free(ctx, tparams.IARDY);\n        jbig2_arith_int_ctx_free(ctx, tparams.IARDX);\n        jbig2_arith_int_ctx_free(ctx, tparams.IARDH);\n        jbig2_arith_int_ctx_free(ctx, tparams.IARDW);\n        jbig2_arith_int_ctx_free(ctx, tparams.IARI);\n        jbig2_arith_iaid_ctx_free(ctx, tparams.IAID);\n        jbig2_arith_int_ctx_free(ctx, tparams.IAIT);\n        jbig2_arith_int_ctx_free(ctx, tparams.IADS);\n        jbig2_arith_int_ctx_free(ctx, tparams.IAFS);\n        jbig2_arith_int_ctx_free(ctx, tparams.IADT);\n        jbig2_arith_int_ctx_free(ctx, IAAI);\n        jbig2_arith_int_ctx_free(ctx, IAEX);\n        jbig2_arith_int_ctx_free(ctx, IADW);\n        jbig2_arith_int_ctx_free(ctx, IADH);\n    }\n    jbig2_free(ctx->allocator, as);\n    jbig2_word_stream_buf_free(ctx, ws);\n\n    return SDEXSYMS;\n}\n\n/* 7.4.2 */\nint\njbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    Jbig2SymbolDictParams params;\n    uint16_t flags;\n    uint32_t sdat_bytes;\n    uint32_t offset;\n    Jbig2ArithCx *GB_stats = NULL;\n    Jbig2ArithCx *GR_stats = NULL;\n    int table_index = 0;\n    const Jbig2HuffmanParams *huffman_params;\n\n    params.SDHUFF = 0;\n\n    if (segment->data_length < 10)\n        goto too_short;\n\n    /* 7.4.2.1.1 */\n    flags = jbig2_get_uint16(segment_data);\n\n    /* zero params to ease cleanup later */\n    memset(&params, 0, sizeof(Jbig2SymbolDictParams));\n\n    params.SDHUFF = flags & 1;\n    params.SDREFAGG = (flags >> 1) & 1;\n    params.SDTEMPLATE = (flags >> 10) & 3;\n    params.SDRTEMPLATE = (flags >> 12) & 1;\n\n    if (params.SDHUFF) {\n        switch ((flags & 0x000c) >> 2) {\n        case 0:                /* Table B.4 */\n            params.SDHUFFDH = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_D);\n            break;\n        case 1:                /* Table B.5 */\n            params.SDHUFFDH = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_E);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom DH huffman table not found (%d)\", table_index);\n                goto cleanup;\n            }\n            params.SDHUFFDH = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:\n        default:\n            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"symbol dictionary specified invalid huffman table\");\n        }\n        if (params.SDHUFFDH == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate DH huffman table\");\n            goto cleanup;\n        }\n\n        switch ((flags & 0x0030) >> 4) {\n        case 0:                /* Table B.2 */\n            params.SDHUFFDW = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_B);\n            break;\n        case 1:                /* Table B.3 */\n            params.SDHUFFDW = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_C);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom DW huffman table not found (%d)\", table_index);\n                goto cleanup;\n            }\n            params.SDHUFFDW = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:\n        default:\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"symbol dictionary specified invalid huffman table\");\n            goto cleanup;       /* Jump direct to cleanup to avoid 2 errors being given */\n        }\n        if (params.SDHUFFDW == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate DW huffman table\");\n            goto cleanup;\n        }\n\n        if (flags & 0x0040) {\n            /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom BMSIZE huffman table not found (%d)\", table_index);\n                goto cleanup;\n            }\n            params.SDHUFFBMSIZE = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n        } else {\n            /* Table B.1 */\n            params.SDHUFFBMSIZE = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_A);\n        }\n        if (params.SDHUFFBMSIZE == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate BMSIZE huffman table\");\n            goto cleanup;\n        }\n\n        if (flags & 0x0080) {\n            /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom REFAGG huffman table not found (%d)\", table_index);\n                goto cleanup;\n            }\n            params.SDHUFFAGGINST = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n        } else {\n            /* Table B.1 */\n            params.SDHUFFAGGINST = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_A);\n        }\n        if (params.SDHUFFAGGINST == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate REFAGG huffman table\");\n            goto cleanup;\n        }\n    }\n\n    /* FIXME: there are quite a few of these conditions to check */\n    /* maybe #ifdef CONFORMANCE and a separate routine */\n    if (!params.SDHUFF) {\n        if (flags & 0x000c) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"SDHUFF is zero, but contrary to spec SDHUFFDH is not.\");\n            goto cleanup;\n        }\n        if (flags & 0x0030) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"SDHUFF is zero, but contrary to spec SDHUFFDW is not.\");\n            goto cleanup;\n        }\n    }\n\n    /* 7.4.2.1.2 */\n    sdat_bytes = params.SDHUFF ? 0 : params.SDTEMPLATE == 0 ? 8 : 2;\n    memcpy(params.sdat, segment_data + 2, sdat_bytes);\n    offset = 2 + sdat_bytes;\n\n    /* 7.4.2.1.3 */\n    if (params.SDREFAGG && !params.SDRTEMPLATE) {\n        if (offset + 4 > segment->data_length)\n            goto too_short;\n        memcpy(params.sdrat, segment_data + offset, 4);\n        offset += 4;\n    }\n\n    if (offset + 8 > segment->data_length)\n        goto too_short;\n\n    /* 7.4.2.1.4 */\n    params.SDNUMEXSYMS = jbig2_get_uint32(segment_data + offset);\n    /* 7.4.2.1.5 */\n    params.SDNUMNEWSYMS = jbig2_get_uint32(segment_data + offset + 4);\n    offset += 8;\n\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"symbol dictionary, flags=%04x, %u exported syms, %u new syms\", flags, params.SDNUMEXSYMS, params.SDNUMNEWSYMS);\n\n    /* 7.4.2.2 (2) */\n    {\n        uint32_t n_dicts = jbig2_sd_count_referred(ctx, segment);\n        Jbig2SymbolDict **dicts = NULL;\n\n        if (n_dicts > 0) {\n            dicts = jbig2_sd_list_referred(ctx, segment);\n            if (dicts == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate dicts in symbol dictionary\");\n                goto cleanup;\n            }\n            params.SDINSYMS = jbig2_sd_cat(ctx, n_dicts, dicts);\n            if (params.SDINSYMS == NULL) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate symbol array in symbol dictionary\");\n                jbig2_free(ctx->allocator, dicts);\n                goto cleanup;\n            }\n            jbig2_free(ctx->allocator, dicts);\n        }\n        if (params.SDINSYMS != NULL) {\n            params.SDNUMINSYMS = params.SDINSYMS->n_symbols;\n        }\n    }\n\n    /* 7.4.2.2 (3, 4) */\n    if (flags & 0x0100) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"segment marks bitmap coding context as used (NYI)\");\n        goto cleanup;\n    } else {\n        int stats_size = params.SDTEMPLATE == 0 ? 65536 : params.SDTEMPLATE == 1 ? 8192 : 1024;\n\n        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GB_stats == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate arithmetic decoder states for generic regions\");\n            goto cleanup;\n        }\n        memset(GB_stats, 0, sizeof (Jbig2ArithCx) * stats_size);\n\n        stats_size = params.SDRTEMPLATE ? 1 << 10 : 1 << 13;\n        GR_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GR_stats == NULL) {\n            jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate arithmetic decoder states for generic refinement regions\");\n            jbig2_free(ctx->allocator, GB_stats);\n            goto cleanup;\n        }\n        memset(GR_stats, 0, sizeof (Jbig2ArithCx) * stats_size);\n    }\n\n    segment->result = (void *)jbig2_decode_symbol_dict(ctx, segment, &params, segment_data + offset, segment->data_length - offset, GB_stats, GR_stats);\n#ifdef DUMP_SYMDICT\n    if (segment->result)\n        jbig2_dump_symbol_dict(ctx, segment);\n#endif\n\n    /* 7.4.2.2 (7) */\n    if (flags & 0x0200) {\n        /* todo: retain GB_stats, GR_stats */\n        jbig2_free(ctx->allocator, GR_stats);\n        jbig2_free(ctx->allocator, GB_stats);\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"segment marks bitmap coding context as retained (NYI)\");\n        goto cleanup;\n    } else {\n        jbig2_free(ctx->allocator, GR_stats);\n        jbig2_free(ctx->allocator, GB_stats);\n    }\n\ncleanup:\n    if (params.SDHUFF) {\n        jbig2_release_huffman_table(ctx, params.SDHUFFDH);\n        jbig2_release_huffman_table(ctx, params.SDHUFFDW);\n        jbig2_release_huffman_table(ctx, params.SDHUFFBMSIZE);\n        jbig2_release_huffman_table(ctx, params.SDHUFFAGGINST);\n    }\n    jbig2_sd_release(ctx, params.SDINSYMS);\n\n    return (segment->result != NULL) ? 0 : -1;\n\ntoo_short:\n    if (params.SDHUFF) {\n        jbig2_release_huffman_table(ctx, params.SDHUFFDH);\n        jbig2_release_huffman_table(ctx, params.SDHUFFDW);\n        jbig2_release_huffman_table(ctx, params.SDHUFFBMSIZE);\n        jbig2_release_huffman_table(ctx, params.SDHUFFAGGINST);\n    }\n    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n}\n"
  },
  {
    "path": "JBig2/src/jbig2_text.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n#include \"os_types.h\"\n\n#include <stddef.h>\n#include <string.h>             /* memset() */\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_arith.h\"\n#include \"jbig2_arith_int.h\"\n#include \"jbig2_arith_iaid.h\"\n#include \"jbig2_generic.h\"\n#include \"jbig2_huffman.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_page.h\"\n#include \"jbig2_refinement.h\"\n#include \"jbig2_segment.h\"\n#include \"jbig2_symbol_dict.h\"\n#include \"jbig2_text.h\"\n\n/**\n * jbig2_decode_text_region: decode a text region segment\n *\n * @ctx: jbig2 decoder context\n * @segment: jbig2 segment (header) structure\n * @params: parameters from the text region header\n * @dicts: an array of referenced symbol dictionaries\n * @n_dicts: the number of referenced symbol dictionaries\n * @image: image structure in which to store the decoded region bitmap\n * @data: pointer to text region data to be decoded\n * @size: length of text region data\n *\n * Implements the text region decoding procedure\n * described in section 6.4 of the JBIG2 spec.\n *\n * returns: 0 on success\n **/\nint\njbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,\n                         const Jbig2TextRegionParams *params,\n                         const Jbig2SymbolDict *const *dicts, const uint32_t n_dicts,\n                         Jbig2Image *image, const byte *data, const size_t size, Jbig2ArithCx *GR_stats, Jbig2ArithState *as, Jbig2WordStream *ws)\n{\n    /* relevant bits of 6.4.4 */\n    uint32_t NINSTANCES;\n    uint32_t ID;\n    int32_t STRIPT;\n    int32_t FIRSTS;\n    int32_t DT;\n    int32_t DFS;\n    int32_t IDS;\n    int32_t CURS;\n    int32_t CURT;\n    int S, T;\n    int x, y;\n    bool first_symbol;\n    uint32_t index, SBNUMSYMS;\n    Jbig2Image *IB = NULL;\n    Jbig2Image *IBO = NULL;\n    Jbig2Image *refimage = NULL;\n    Jbig2HuffmanState *hs = NULL;\n    Jbig2HuffmanTable *SBSYMCODES = NULL;\n    int code = 0;\n    int RI;\n\n    SBNUMSYMS = 0;\n    for (index = 0; index < n_dicts; index++) {\n        SBNUMSYMS += dicts[index]->n_symbols;\n    }\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"symbol list contains %d glyphs in %d dictionaries\", SBNUMSYMS, n_dicts);\n\n    if (params->SBHUFF) {\n        Jbig2HuffmanTable *runcodes = NULL;\n        Jbig2HuffmanParams runcodeparams;\n        Jbig2HuffmanLine runcodelengths[35];\n        Jbig2HuffmanLine *symcodelengths = NULL;\n        Jbig2HuffmanParams symcodeparams;\n        int err, len, range, r;\n\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"huffman coded text region\");\n        hs = jbig2_huffman_new(ctx, ws);\n        if (hs == NULL)\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region\");\n\n        /* 7.4.3.1.7 - decode symbol ID Huffman table */\n        /* this is actually part of the segment header, but it is more\n           convenient to handle it here */\n\n        /* parse and build the runlength code huffman table */\n        for (index = 0; index < 35; index++) {\n            runcodelengths[index].PREFLEN = jbig2_huffman_get_bits(hs, 4, &code);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to read huffman runcode lengths\");\n                goto cleanup1;\n            }\n            if (code > 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB decoding huffman runcode lengths\");\n                goto cleanup1;\n            }\n            runcodelengths[index].RANGELEN = 0;\n            runcodelengths[index].RANGELOW = index;\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"  read runcode%d length %d\", index, runcodelengths[index].PREFLEN);\n        }\n        runcodeparams.HTOOB = 0;\n        runcodeparams.lines = runcodelengths;\n        runcodeparams.n_lines = 35;\n        runcodes = jbig2_build_huffman_table(ctx, &runcodeparams);\n        if (runcodes == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"error constructing symbol ID runcode table\");\n            goto cleanup1;\n        }\n\n        /* decode the symbol ID code lengths using the runlength table */\n        symcodelengths = jbig2_new(ctx, Jbig2HuffmanLine, SBNUMSYMS);\n        if (symcodelengths == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"failed to allocate memory when reading symbol ID huffman table\");\n            goto cleanup1;\n        }\n        index = 0;\n        while (index < SBNUMSYMS) {\n            code = jbig2_huffman_get(hs, runcodes, &err);\n            if (err < 0) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"error reading symbol ID huffman table\");\n                goto cleanup1;\n            }\n            if (err > 0) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB decoding symbol ID huffman table\");\n                goto cleanup1;\n            }\n            if (code < 0 || code >= 35) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"symbol ID huffman table out of range\");\n                goto cleanup1;\n            }\n\n            if (code < 32) {\n                len = code;\n                range = 1;\n            } else {\n                if (code == 32) {\n                    if (index < 1) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"error decoding symbol ID table: run length with no antecedent\");\n                        goto cleanup1;\n                    }\n                    len = symcodelengths[index - 1].PREFLEN;\n                } else {\n                    len = 0;    /* code == 33 or 34 */\n                }\n                err = 0;\n                if (code == 32)\n                    range = jbig2_huffman_get_bits(hs, 2, &err) + 3;\n                else if (code == 33)\n                    range = jbig2_huffman_get_bits(hs, 3, &err) + 3;\n                else if (code == 34)\n                    range = jbig2_huffman_get_bits(hs, 7, &err) + 11;\n                if (err < 0) {\n                    code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to read huffman code\");\n                    goto cleanup1;\n                }\n                if (err > 0) {\n                    code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB decoding huffman code\");\n                    goto cleanup1;\n                }\n            }\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"  read runcode%d at index %d (length %d range %d)\", code, index, len, range);\n            if (index + range > SBNUMSYMS) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,\n                            \"runlength extends %d entries beyond the end of symbol ID table\", index + range - SBNUMSYMS);\n                range = SBNUMSYMS - index;\n            }\n            for (r = 0; r < range; r++) {\n                symcodelengths[index + r].PREFLEN = len;\n                symcodelengths[index + r].RANGELEN = 0;\n                symcodelengths[index + r].RANGELOW = index + r;\n            }\n            index += r;\n        }\n\n        if (index < SBNUMSYMS) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"runlength codes do not cover the available symbol set\");\n            goto cleanup1;\n        }\n\n        symcodeparams.HTOOB = 0;\n        symcodeparams.lines = symcodelengths;\n        symcodeparams.n_lines = SBNUMSYMS;\n\n        /* skip to byte boundary */\n        err = jbig2_huffman_skip(hs);\n        if (err < 0)\n        {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to skip to next byte when building huffman table\");\n            goto cleanup1;\n        }\n\n        /* finally, construct the symbol ID huffman table itself */\n        SBSYMCODES = jbig2_build_huffman_table(ctx, &symcodeparams);\n\ncleanup1:\n        jbig2_free(ctx->allocator, symcodelengths);\n        jbig2_release_huffman_table(ctx, runcodes);\n\n        if (SBSYMCODES == NULL) {\n            jbig2_huffman_free(ctx, hs);\n            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to construct symbol ID huffman table\");\n        }\n    }\n\n    /* 6.4.5 (1) */\n    jbig2_image_clear(ctx, image, params->SBDEFPIXEL);\n\n    /* 6.4.6 */\n    if (params->SBHUFF) {\n        STRIPT = jbig2_huffman_get(hs, params->SBHUFFDT, &code);\n    } else {\n        code = jbig2_arith_int_decode(ctx, params->IADT, as, &STRIPT);\n    }\n    if (code < 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode strip T\");\n        goto cleanup2;\n    }\n    if (code > 0) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding strip T\");\n        goto cleanup2;\n    }\n\n    /* 6.4.5 (2) */\n    STRIPT *= -(params->SBSTRIPS);\n    FIRSTS = 0;\n    NINSTANCES = 0;\n\n    /* 6.4.5 (3) */\n    while (NINSTANCES < params->SBNUMINSTANCES) {\n        /* (3b) */\n        if (params->SBHUFF) {\n            DT = jbig2_huffman_get(hs, params->SBHUFFDT, &code);\n        } else {\n            code = jbig2_arith_int_decode(ctx, params->IADT, as, &DT);\n        }\n        if (code < 0) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode delta T\");\n            goto cleanup2;\n        }\n        if (code > 0) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding delta T\");\n            goto cleanup2;\n        }\n        DT *= params->SBSTRIPS;\n        STRIPT += DT;\n\n        first_symbol = TRUE;\n        /* 6.4.5 (3c) - decode symbols in strip */\n        for (;;) {\n            /* (3c.i) */\n            if (first_symbol) {\n                /* 6.4.7 */\n                if (params->SBHUFF) {\n                    DFS = jbig2_huffman_get(hs, params->SBHUFFFS, &code);\n                } else {\n                    code = jbig2_arith_int_decode(ctx, params->IAFS, as, &DFS);\n                }\n                if (code < 0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode strip symbol S-difference\");\n                    goto cleanup2;\n                }\n                if (code > 0) {\n                    code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding strip symbol S-difference\");\n                    goto cleanup2;\n                }\n                FIRSTS += DFS;\n                CURS = FIRSTS;\n                first_symbol = FALSE;\n            } else {\n                if (NINSTANCES > params->SBNUMINSTANCES) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"too many NINSTANCES (%d) decoded\", NINSTANCES);\n                    break;\n                }\n                /* (3c.ii) / 6.4.8 */\n                if (params->SBHUFF) {\n                    IDS = jbig2_huffman_get(hs, params->SBHUFFDS, &code);\n                } else {\n                    code = jbig2_arith_int_decode(ctx, params->IADS, as, &IDS);\n                }\n                if (code < 0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode symbol instance S coordinate\");\n                    goto cleanup2;\n                }\n                if (code > 0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"OOB obtained when decoding symbol instance S coordinate signals end of strip with T value %d\", DT);\n                    break;\n                }\n                CURS += IDS + params->SBDSOFFSET;\n            }\n\n            /* (3c.iii) / 6.4.9 */\n            if (params->SBSTRIPS == 1) {\n                CURT = 0;\n            } else if (params->SBHUFF) {\n                CURT = jbig2_huffman_get_bits(hs, params->LOGSBSTRIPS, &code);\n            } else {\n                code = jbig2_arith_int_decode(ctx, params->IAIT, as, &CURT);\n            }\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode symbol instance T coordinate\");\n                goto cleanup2;\n            }\n            if (code > 0) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"OOB obtained when decoding symbol instance T coordinate\");\n                goto cleanup2;\n            }\n            T = STRIPT + CURT;\n\n            /* (3b.iv) / 6.4.10 - decode the symbol ID */\n            if (params->SBHUFF) {\n                ID = jbig2_huffman_get(hs, SBSYMCODES, &code);\n            } else {\n                code = jbig2_arith_iaid_decode(ctx, params->IAID, as, (int *)&ID);\n            }\n            if (code < 0) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to obtain symbol instance symbol ID\");\n                goto cleanup2;\n            }\n            if (code > 0) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding symbol instance symbol ID\");\n                goto cleanup2;\n            }\n            if (ID >= SBNUMSYMS) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"ignoring out of range symbol ID (%d/%d)\", ID, SBNUMSYMS);\n                IB = NULL;\n            } else {\n                /* (3c.v) / 6.4.11 - look up the symbol bitmap IB */\n                uint32_t id = ID;\n\n                index = 0;\n                while (id >= dicts[index]->n_symbols)\n                    id -= dicts[index++]->n_symbols;\n                if (dicts[index]->glyphs[id] == NULL) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"missing glyph (%d/%d), ignoring\", index, id);\n                } else {\n                    IB = jbig2_image_reference(ctx, dicts[index]->glyphs[id]);\n                }\n            }\n            if (params->SBREFINE) {\n                if (params->SBHUFF) {\n                    RI = jbig2_huffman_get_bits(hs, 1, &code);\n                } else {\n                    code = jbig2_arith_int_decode(ctx, params->IARI, as, &RI);\n                }\n                if (code < 0) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode symbol bitmap refinement indicator\");\n                    goto cleanup2;\n                }\n                if (code > 0) {\n                    code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding symbol bitmap refinement indicator\");\n                    goto cleanup2;\n                }\n            } else {\n                RI = 0;\n            }\n            if (RI) {\n                Jbig2RefinementRegionParams rparams;\n                int32_t RDW, RDH, RDX, RDY;\n                size_t BMSIZE = 0;\n                int code1 = 0;\n                int code2 = 0;\n                int code3 = 0;\n                int code4 = 0;\n                int code5 = 0;\n                int code6 = 0;\n\n                /* 6.4.11 (1, 2, 3, 4) */\n                if (!params->SBHUFF) {\n                    code1 = jbig2_arith_int_decode(ctx, params->IARDW, as, &RDW);\n                    code2 = jbig2_arith_int_decode(ctx, params->IARDH, as, &RDH);\n                    code3 = jbig2_arith_int_decode(ctx, params->IARDX, as, &RDX);\n                    code4 = jbig2_arith_int_decode(ctx, params->IARDY, as, &RDY);\n                } else {\n                    RDW = jbig2_huffman_get(hs, params->SBHUFFRDW, &code1);\n                    RDH = jbig2_huffman_get(hs, params->SBHUFFRDH, &code2);\n                    RDX = jbig2_huffman_get(hs, params->SBHUFFRDX, &code3);\n                    RDY = jbig2_huffman_get(hs, params->SBHUFFRDY, &code4);\n                    BMSIZE = jbig2_huffman_get(hs, params->SBHUFFRSIZE, &code5);\n                    code6 = jbig2_huffman_skip(hs);\n                }\n\n                if (code1 < 0 || code2 < 0 || code3 < 0 || code4 < 0 || code5 < 0 || code6 < 0) {\n                    jbig2_image_release(ctx, IB);\n                    code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode data\");\n                    goto cleanup2;\n                }\n                if (code1 > 0 || code2 > 0 || code3 > 0 || code4 > 0 || code5 > 0 || code6 > 0) {\n                    code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"OOB obtained when decoding symbol instance refinement data\");\n                    goto cleanup2;\n                }\n\n                /* 6.4.11 (6) */\n                if (IB) {\n                    IBO = IB;\n                    IB = NULL;\n                    if (((int32_t) IBO->width) + RDW < 0 || ((int32_t) IBO->height) + RDH < 0) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"reference image dimensions negative\");\n                        goto cleanup2;\n                    }\n                    refimage = jbig2_image_new(ctx, IBO->width + RDW, IBO->height + RDH);\n                    if (refimage == NULL) {\n                        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate reference image\");\n                        goto cleanup2;\n                    }\n                    jbig2_image_clear(ctx, refimage, 0x00);\n\n                    /* Table 12 */\n                    rparams.GRTEMPLATE = params->SBRTEMPLATE;\n                    rparams.GRREFERENCE = IBO;\n                    rparams.GRREFERENCEDX = (RDW >> 1) + RDX;\n                    rparams.GRREFERENCEDY = (RDH >> 1) + RDY;\n                    rparams.TPGRON = 0;\n                    memcpy(rparams.grat, params->sbrat, 4);\n                    code = jbig2_decode_refinement_region(ctx, segment, &rparams, as, refimage, GR_stats);\n                    if (code < 0) {\n                        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode refinement region\");\n                        goto cleanup2;\n                    }\n\n                    jbig2_image_release(ctx, IBO);\n                    IBO = NULL;\n                    IB = refimage;\n                    refimage = NULL;\n                }\n\n                /* 6.4.11 (7) */\n                if (params->SBHUFF) {\n                    code = jbig2_huffman_advance(hs, BMSIZE);\n                    if (code < 0) {\n                        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to advance after huffman decoding refinement region\");\n                        goto cleanup2;\n                    }\n                }\n            }\n\n            /* (3c.vi) */\n            if ((!params->TRANSPOSED) && (params->REFCORNER > 1) && IB) {\n                CURS += IB->width - 1;\n            } else if ((params->TRANSPOSED) && !(params->REFCORNER & 1) && IB) {\n                CURS += IB->height - 1;\n            }\n\n            /* (3c.vii) */\n            S = CURS;\n\n            /* (3c.viii) */\n            if (!params->TRANSPOSED) {\n                switch (params->REFCORNER) {\n                case JBIG2_CORNER_TOPLEFT:\n                    x = S;\n                    y = T;\n                    break;\n                case JBIG2_CORNER_TOPRIGHT:\n                    if (IB)\n                        x = S - IB->width + 1;\n                    else\n                        x = S + 1;\n                    y = T;\n                    break;\n                case JBIG2_CORNER_BOTTOMLEFT:\n                    x = S;\n                    if (IB)\n                        y = T - IB->height + 1;\n                    else\n                        y = T + 1;\n                    break;\n                default:\n                case JBIG2_CORNER_BOTTOMRIGHT:\n                    if (IB ) {\n                        x = S - IB->width + 1;\n                        y = T - IB->height + 1;\n                    } else {\n                        x = S + 1;\n                        y = T + 1;\n                    }\n                    break;\n                }\n            } else {            /* TRANSPOSED */\n                switch (params->REFCORNER) {\n                case JBIG2_CORNER_TOPLEFT:\n                    x = T;\n                    y = S;\n                    break;\n                case JBIG2_CORNER_TOPRIGHT:\n                    if (IB)\n                        x = T - IB->width + 1;\n                    else\n                        x = T + 1;\n                    y = S;\n                    break;\n                case JBIG2_CORNER_BOTTOMLEFT:\n                    x = T;\n                    if (IB)\n                        y = S - IB->height + 1;\n                    else\n                        y = S + 1;\n                    break;\n                default:\n                case JBIG2_CORNER_BOTTOMRIGHT:\n                    if (IB) {\n                        x = T - IB->width + 1;\n                        y = S - IB->height + 1;\n                    } else {\n                        x = T + 1;\n                        y = S + 1;\n                    }\n                    break;\n                }\n            }\n\n            /* (3c.ix) */\n#ifdef JBIG2_DEBUG\n            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                        \"composing glyph ID %d: %dx%d @ (%d,%d) symbol %d/%d\", ID, IB->width, IB->height, x, y, NINSTANCES + 1, params->SBNUMINSTANCES);\n#endif\n            code = jbig2_image_compose(ctx, image, IB, x, y, params->SBCOMBOP);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to compose symbol instance symbol bitmap into picture\");\n                goto cleanup2;\n            }\n\n            /* (3c.x) */\n            if (IB && (!params->TRANSPOSED) && (params->REFCORNER < 2)) {\n                CURS += IB->width - 1;\n            } else if (IB && (params->TRANSPOSED) && (params->REFCORNER & 1)) {\n                CURS += IB->height - 1;\n            }\n\n            /* (3c.xi) */\n            NINSTANCES++;\n\n            jbig2_image_release(ctx, IB);\n            IB = NULL;\n        }\n        /* end strip */\n    }\n    /* 6.4.5 (4) */\n\ncleanup2:\n    jbig2_image_release(ctx, refimage);\n    jbig2_image_release(ctx, IBO);\n    jbig2_image_release(ctx, IB);\n    if (params->SBHUFF) {\n        jbig2_release_huffman_table(ctx, SBSYMCODES);\n    }\n    jbig2_huffman_free(ctx, hs);\n\n    return code;\n}\n\n/**\n * jbig2_text_region: read a text region segment header\n **/\nint\njbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)\n{\n    uint32_t offset = 0;\n    Jbig2RegionSegmentInfo region_info;\n    Jbig2TextRegionParams params;\n    Jbig2Image *image = NULL;\n    Jbig2SymbolDict **dicts = NULL;\n    uint32_t n_dicts = 0;\n    uint16_t flags = 0;\n    uint16_t huffman_flags = 0;\n    Jbig2ArithCx *GR_stats = NULL;\n    int code = 0;\n    Jbig2WordStream *ws = NULL;\n    Jbig2ArithState *as = NULL;\n    uint32_t table_index = 0;\n    const Jbig2HuffmanParams *huffman_params = NULL;\n\n    /* zero params to ease cleanup later */\n    memset(&params, 0, sizeof(Jbig2TextRegionParams));\n\n    /* 7.4.1 */\n    if (segment->data_length < 17) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n        goto cleanup2;\n    }\n    jbig2_get_region_segment_info(&region_info, segment_data);\n    offset += 17;\n    /* Check for T.88 amendment 3 */\n    if (region_info.flags & 8)\n        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"region segment flags indicate use of colored bitmap (NYI)\");\n\n    /* 7.4.3.1.1 */\n    if (segment->data_length - offset < 2) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n        goto cleanup2;\n    }\n    flags = jbig2_get_uint16(segment_data + offset);\n    offset += 2;\n\n    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"text region header flags 0x%04x\", flags);\n\n    params.SBHUFF = flags & 0x0001;\n    params.SBREFINE = flags & 0x0002;\n    params.LOGSBSTRIPS = (flags & 0x000c) >> 2;\n    params.SBSTRIPS = 1 << params.LOGSBSTRIPS;\n    params.REFCORNER = (Jbig2RefCorner)((flags & 0x0030) >> 4);\n    params.TRANSPOSED = flags & 0x0040;\n    params.SBCOMBOP = (Jbig2ComposeOp)((flags & 0x0180) >> 7);\n    params.SBDEFPIXEL = flags & 0x0200;\n    /* SBDSOFFSET is a signed 5 bit integer */\n    params.SBDSOFFSET = (flags & 0x7C00) >> 10;\n    if (params.SBDSOFFSET > 0x0f)\n        params.SBDSOFFSET -= 0x20;\n    params.SBRTEMPLATE = flags & 0x8000;\n\n    if (params.SBDSOFFSET) {\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, \"text region has SBDSOFFSET %d\", params.SBDSOFFSET);\n    }\n\n    if (params.SBHUFF) {        /* Huffman coding */\n        /* 7.4.3.1.2 */\n        if (segment->data_length - offset < 2) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n            goto cleanup2;\n        }\n        huffman_flags = jbig2_get_uint16(segment_data + offset);\n        offset += 2;\n\n        if (huffman_flags & 0x8000)\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"reserved bit 15 of text region huffman flags is not zero\");\n    } else {                    /* arithmetic coding */\n\n        /* 7.4.3.1.3 */\n        if (segment->data_length - offset < 4) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n            goto cleanup2;\n        }\n        if ((params.SBREFINE) && !(params.SBRTEMPLATE)) {\n            params.sbrat[0] = segment_data[offset];\n            params.sbrat[1] = segment_data[offset + 1];\n            params.sbrat[2] = segment_data[offset + 2];\n            params.sbrat[3] = segment_data[offset + 3];\n            offset += 4;\n        }\n    }\n\n    /* 7.4.3.1.4 */\n    if (segment->data_length - offset < 4) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n        goto cleanup2;\n    }\n    params.SBNUMINSTANCES = jbig2_get_uint32(segment_data + offset);\n    offset += 4;\n\n    if (params.SBHUFF) {\n        /* 7.4.3.1.5 - Symbol ID Huffman table */\n        /* ...this is handled in the segment body decoder */\n\n        /* 7.4.3.1.6 - Other Huffman table selection */\n        switch (huffman_flags & 0x0003) {\n        case 0:                /* Table B.6 */\n            params.SBHUFFFS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_F);\n            break;\n        case 1:                /* Table B.7 */\n            params.SBHUFFFS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_G);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom FS huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFFS = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:                /* invalid */\n        default:\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"text region specified invalid FS huffman table\");\n            goto cleanup1;\n            break;\n        }\n        if (params.SBHUFFFS == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified FS huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x000c) >> 2) {\n        case 0:                /* Table B.8 */\n            params.SBHUFFDS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_H);\n            break;\n        case 1:                /* Table B.9 */\n            params.SBHUFFDS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_I);\n            break;\n        case 2:                /* Table B.10 */\n            params.SBHUFFDS = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_J);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom DS huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFDS = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        }\n        if (params.SBHUFFDS == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified DS huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x0030) >> 4) {\n        case 0:                /* Table B.11 */\n            params.SBHUFFDT = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_K);\n            break;\n        case 1:                /* Table B.12 */\n            params.SBHUFFDT = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_L);\n            break;\n        case 2:                /* Table B.13 */\n            params.SBHUFFDT = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_M);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom DT huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFDT = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        }\n        if (params.SBHUFFDT == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified DT huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x00c0) >> 6) {\n        case 0:                /* Table B.14 */\n            params.SBHUFFRDW = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_N);\n            break;\n        case 1:                /* Table B.15 */\n            params.SBHUFFRDW = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom RDW huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFRDW = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:                /* invalid */\n        default:\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"text region specified invalid RDW huffman table\");\n            goto cleanup1;\n            break;\n        }\n        if (params.SBHUFFRDW == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified RDW huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x0300) >> 8) {\n        case 0:                /* Table B.14 */\n            params.SBHUFFRDH = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_N);\n            break;\n        case 1:                /* Table B.15 */\n            params.SBHUFFRDH = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom RDH huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFRDH = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:                /* invalid */\n        default:\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"text region specified invalid RDH huffman table\");\n            goto cleanup1;\n            break;\n        }\n        if (params.SBHUFFRDH == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified RDH huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x0c00) >> 10) {\n        case 0:                /* Table B.14 */\n            params.SBHUFFRDX = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_N);\n            break;\n        case 1:                /* Table B.15 */\n            params.SBHUFFRDX = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom RDX huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFRDX = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:                /* invalid */\n        default:\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"text region specified invalid RDX huffman table\");\n            goto cleanup1;\n            break;\n        }\n        if (params.SBHUFFRDX == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified RDX huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x3000) >> 12) {\n        case 0:                /* Table B.14 */\n            params.SBHUFFRDY = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_N);\n            break;\n        case 1:                /* Table B.15 */\n            params.SBHUFFRDY = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_O);\n            break;\n        case 3:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom RDY huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFRDY = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        case 2:                /* invalid */\n        default:\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"text region specified invalid RDY huffman table\");\n            goto cleanup1;\n            break;\n        }\n        if (params.SBHUFFRDY == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified RDY huffman table\");\n            goto cleanup1;\n        }\n\n        switch ((huffman_flags & 0x4000) >> 14) {\n        case 0:                /* Table B.1 */\n            params.SBHUFFRSIZE = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_A);\n            break;\n        case 1:                /* Custom table from referred segment */\n            huffman_params = jbig2_find_table(ctx, segment, table_index);\n            if (huffman_params == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"custom RSIZE huffman table not found (%d)\", table_index);\n                goto cleanup1;\n            }\n            params.SBHUFFRSIZE = jbig2_build_huffman_table(ctx, huffman_params);\n            ++table_index;\n            break;\n        }\n        if (params.SBHUFFRSIZE == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region specified RSIZE huffman table\");\n            goto cleanup1;\n        }\n\n        if (huffman_flags & 0x8000) {\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"text region huffman flags bit 15 is set, contrary to spec\");\n        }\n\n        /* 7.4.3.1.7 */\n        /* For convenience this is done in the body decoder routine */\n    }\n\n    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,\n                \"text region: %d x %d @ (%d,%d) %d symbols\", region_info.width, region_info.height, region_info.x, region_info.y, params.SBNUMINSTANCES);\n\n    /* 7.4.3.2 (2) - compose the list of symbol dictionaries */\n    n_dicts = jbig2_sd_count_referred(ctx, segment);\n    if (n_dicts == 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"text region refers to no symbol dictionaries\");\n    } else {\n        dicts = jbig2_sd_list_referred(ctx, segment);\n        if (dicts == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"unable to retrieve symbol dictionaries! previous parsing error?\");\n            goto cleanup1;\n        } else {\n            uint32_t index;\n\n            if (dicts[0] == NULL) {\n                code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to find first referenced symbol dictionary\");\n                goto cleanup1;\n            }\n            for (index = 1; index < n_dicts; index++)\n                if (dicts[index] == NULL) {\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to find all referenced symbol dictionaries\");\n                    n_dicts = index;\n                }\n        }\n    }\n\n    /* 7.4.3.2 (3) */\n    {\n        int stats_size = params.SBRTEMPLATE ? 1 << 10 : 1 << 13;\n\n        GR_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);\n        if (GR_stats == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"could not allocate arithmetic decoder state\");\n            goto cleanup1;\n        }\n        memset(GR_stats, 0, stats_size);\n    }\n\n    image = jbig2_image_new(ctx, region_info.width, region_info.height);\n    if (image == NULL) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region image\");\n        goto cleanup2;\n    }\n\n    if (offset >= segment->data_length) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, \"segment too short\");\n        goto cleanup2;\n    }\n    ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);\n    if (ws == NULL) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate word stream when handling text region image\");\n        goto cleanup2;\n    }\n\n    as = jbig2_arith_new(ctx, ws);\n    if (as == NULL) {\n        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate arithmetic coding context when handling text region image\");\n        goto cleanup3;\n    }\n\n    if (!params.SBHUFF) {\n        uint8_t SBSYMCODELEN;\n        uint32_t index;\n        uint32_t SBNUMSYMS = 0;\n\n        for (index = 0; index < n_dicts; index++) {\n            SBNUMSYMS += dicts[index]->n_symbols;\n        }\n\n        params.IADT = jbig2_arith_int_ctx_new(ctx);\n        params.IAFS = jbig2_arith_int_ctx_new(ctx);\n        params.IADS = jbig2_arith_int_ctx_new(ctx);\n        params.IAIT = jbig2_arith_int_ctx_new(ctx);\n        if (params.IADT == NULL || params.IAFS == NULL || params.IADS == NULL || params.IAIT == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region image data\");\n            goto cleanup4;\n        }\n\n        /* Table 31 */\n        for (SBSYMCODELEN = 0; ((uint64_t) 1 << SBSYMCODELEN) < (uint64_t) SBNUMSYMS; SBSYMCODELEN++);\n\n        params.IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);\n        params.IARI = jbig2_arith_int_ctx_new(ctx);\n        params.IARDW = jbig2_arith_int_ctx_new(ctx);\n        params.IARDH = jbig2_arith_int_ctx_new(ctx);\n        params.IARDX = jbig2_arith_int_ctx_new(ctx);\n        params.IARDY = jbig2_arith_int_ctx_new(ctx);\n        if (params.IAID == NULL || params.IARI == NULL ||\n            params.IARDW == NULL || params.IARDH == NULL || params.IARDX == NULL || params.IARDY == NULL) {\n            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to allocate text region image data\");\n            goto cleanup5;\n        }\n    }\n\n    code = jbig2_decode_text_region(ctx, segment, &params,\n                                    (const Jbig2SymbolDict * const *)dicts, n_dicts, image,\n                                    segment_data + offset, segment->data_length - offset, GR_stats, as, ws);\n    if (code < 0) {\n        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"failed to decode text region image data\");\n        goto cleanup5;\n    }\n\n    if ((segment->flags & 63) == 4) {\n        /* we have an intermediate region here. save it for later */\n        segment->result = jbig2_image_reference(ctx, image);\n    } else {\n        /* otherwise composite onto the page */\n        jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,\n                    \"composing %dx%d decoded text region onto page at (%d, %d)\", region_info.width, region_info.height, region_info.x, region_info.y);\n        code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, region_info.x, region_info.y, region_info.op);\n        if (code < 0)\n            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, \"unable to add text region to page\");\n    }\n\ncleanup5:\n    if (!params.SBHUFF) {\n        jbig2_arith_iaid_ctx_free(ctx, params.IAID);\n        jbig2_arith_int_ctx_free(ctx, params.IARI);\n        jbig2_arith_int_ctx_free(ctx, params.IARDW);\n        jbig2_arith_int_ctx_free(ctx, params.IARDH);\n        jbig2_arith_int_ctx_free(ctx, params.IARDX);\n        jbig2_arith_int_ctx_free(ctx, params.IARDY);\n    }\n\ncleanup4:\n    if (!params.SBHUFF) {\n        jbig2_arith_int_ctx_free(ctx, params.IADT);\n        jbig2_arith_int_ctx_free(ctx, params.IAFS);\n        jbig2_arith_int_ctx_free(ctx, params.IADS);\n        jbig2_arith_int_ctx_free(ctx, params.IAIT);\n    }\n\ncleanup3:\n    jbig2_free(ctx->allocator, as);\n    jbig2_word_stream_buf_free(ctx, ws);\n\ncleanup2:\n    jbig2_free(ctx->allocator, GR_stats);\n    jbig2_image_release(ctx, image);\n\ncleanup1:\n    if (params.SBHUFF) {\n        jbig2_release_huffman_table(ctx, params.SBHUFFFS);\n        jbig2_release_huffman_table(ctx, params.SBHUFFDS);\n        jbig2_release_huffman_table(ctx, params.SBHUFFDT);\n        jbig2_release_huffman_table(ctx, params.SBHUFFRDX);\n        jbig2_release_huffman_table(ctx, params.SBHUFFRDY);\n        jbig2_release_huffman_table(ctx, params.SBHUFFRDW);\n        jbig2_release_huffman_table(ctx, params.SBHUFFRDH);\n        jbig2_release_huffman_table(ctx, params.SBHUFFRSIZE);\n    }\n    jbig2_free(ctx->allocator, dicts);\n\n    return code;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2arith.cc",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include \"jbig2arith.h\"\n\n#include <string.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#define u64 uint64_t\n#define u32 uint32_t\n#define u16 uint16_t\n#define u8  uint8_t\n\n// C++ doesn't have C99 restricted pointers, but GCC does allow __restrict__\n#if !defined(WIN32)\n#define restrict __restrict__\n#else\n#define restrict\n#endif\n\n// -----------------------------------------------------------------------------\n// This the structure for a single state of the adaptive arithmetic compressor\n// -----------------------------------------------------------------------------\nstruct context {\n  u16 qe;\n  u8 mps, lps;\n};\n\n// -----------------------------------------------------------------------------\n// And this is the table of states for that adaptive compressor\n// -----------------------------------------------------------------------------\nstruct context ctbl[] = {\n  // This is the standard state table from\n  // Table E.1 of the standard. The switch has been omitted and\n  // those states are included below\n#define STATETABLE \\\n  {0x5601, F( 1), SWITCH(F( 1))},\\\n  {0x3401, F( 2), F( 6)},\\\n  {0x1801, F( 3), F( 9)},\\\n  {0x0ac1, F( 4), F(12)},\\\n  {0x0521, F( 5), F(29)},\\\n  {0x0221, F(38), F(33)},\\\n  {0x5601, F( 7), SWITCH(F( 6))},\\\n  {0x5401, F( 8), F(14)},\\\n  {0x4801, F( 9), F(14)},\\\n  {0x3801, F(10), F(14)},\\\n  {0x3001, F(11), F(17)},\\\n  {0x2401, F(12), F(18)},\\\n  {0x1c01, F(13), F(20)},\\\n  {0x1601, F(29), F(21)},\\\n  {0x5601, F(15), SWITCH(F(14))},\\\n  {0x5401, F(16), F(14)},\\\n  {0x5101, F(17), F(15)},\\\n  {0x4801, F(18), F(16)},\\\n  {0x3801, F(19), F(17)},\\\n  {0x3401, F(20), F(18)},\\\n  {0x3001, F(21), F(19)},\\\n  {0x2801, F(22), F(19)},\\\n  {0x2401, F(23), F(20)},\\\n  {0x2201, F(24), F(21)},\\\n  {0x1c01, F(25), F(22)},\\\n  {0x1801, F(26), F(23)},\\\n  {0x1601, F(27), F(24)},\\\n  {0x1401, F(28), F(25)},\\\n  {0x1201, F(29), F(26)},\\\n  {0x1101, F(30), F(27)},\\\n  {0x0ac1, F(31), F(28)},\\\n  {0x09c1, F(32), F(29)},\\\n  {0x08a1, F(33), F(30)},\\\n  {0x0521, F(34), F(31)},\\\n  {0x0441, F(35), F(32)},\\\n  {0x02a1, F(36), F(33)},\\\n  {0x0221, F(37), F(34)},\\\n  {0x0141, F(38), F(35)},\\\n  {0x0111, F(39), F(36)},\\\n  {0x0085, F(40), F(37)},\\\n  {0x0049, F(41), F(38)},\\\n  {0x0025, F(42), F(39)},\\\n  {0x0015, F(43), F(40)},\\\n  {0x0009, F(44), F(41)},\\\n  {0x0005, F(45), F(42)},\\\n  {0x0001, F(45), F(43)},\n#undef F\n#define F(x) x\n#define SWITCH(x) (x + 46)\n  STATETABLE\n#undef SWITCH\n#undef F\n\n#define F(x) (x + 46)\n#define SWITCH(x) ((x) - 46)\n  STATETABLE\n#undef SWITCH\n#undef F\n};\n\n#if __GNUC__ >= 4\n#define BRANCH_OPT\n#endif\n\n// GCC peephole optimisations\n#ifdef BRANCH_OPT\n#define likely(x)       __builtin_expect((x),1)\n#define unlikely(x)     __builtin_expect((x),0)\n#else\n#define likely(x)       x\n#define unlikely(x)     x\n#endif\n\n// see comments in .h file\nvoid\njbig2enc_init(struct jbig2enc_ctx *ctx) {\n  memset(ctx->context, 0, JBIG2_MAX_CTX);\n  memset(ctx->intctx, 0, 13 * 512);\n  ctx->a = 0x8000;\n  ctx->c = 0;\n  ctx->ct = 12;\n  ctx->bp = -1;\n  ctx->b = 0;\n  ctx->outbuf_used = 0;\n  ctx->outbuf = (u8 *) malloc(JBIG2_OUTPUTBUFFER_SIZE);\n  ctx->output_chunks = new std::vector<uint8_t *>;\n  ctx->iaidctx = NULL;\n}\n\n// see comments in .h file\nvoid\njbig2enc_reset(struct jbig2enc_ctx *ctx) {\n  ctx->a = 0x8000;\n  ctx->c = 0;\n  ctx->ct = 12;\n  ctx->bp = -1;\n  ctx->b = 0;\n  free(ctx->iaidctx);\n  ctx->iaidctx = NULL;\n  memset(ctx->context, 0, JBIG2_MAX_CTX);\n  memset(ctx->intctx, 0, 13 * 512);\n}\n\n// see comments in .h file\nvoid\njbig2enc_flush(struct jbig2enc_ctx *ctx) {\n  ctx->outbuf_used = 0;\n\n  for (std::vector<uint8_t *>::iterator i = ctx->output_chunks->begin();\n       i != ctx->output_chunks->end(); ++i) {\n    free(*i);\n  }\n  ctx->output_chunks->clear();\n  ctx->bp = -1;\n}\n\n// see comments in .h file\nvoid\njbig2enc_dealloc(struct jbig2enc_ctx *ctx) {\n  for (std::vector<uint8_t *>::iterator i = ctx->output_chunks->begin();\n       i != ctx->output_chunks->end(); ++i) {\n    free(*i);\n  }\n  delete ctx->output_chunks;\n  free(ctx->outbuf);\n  free(ctx->iaidctx);\n}\n\n// -----------------------------------------------------------------------------\n// Emit a byte from the compressor by appending to the current output buffer.\n// If the buffer is full, allocate a new one\n// -----------------------------------------------------------------------------\nstatic void inline\nemit(struct jbig2enc_ctx *restrict ctx) {\n  if (unlikely(ctx->outbuf_used == JBIG2_OUTPUTBUFFER_SIZE)) {\n    ctx->output_chunks->push_back(ctx->outbuf);\n    ctx->outbuf = (u8 *) malloc(JBIG2_OUTPUTBUFFER_SIZE);\n    ctx->outbuf_used = 0;\n  }\n\n  ctx->outbuf[ctx->outbuf_used++] = ctx->b;\n}\n\n// -----------------------------------------------------------------------------\n// The BYTEOUT procedure from the standard\n// -----------------------------------------------------------------------------\nstatic void\nbyteout(struct jbig2enc_ctx *restrict ctx) {\n  if (ctx->b == 0xff) goto rblock;\n\n  if (ctx->c < 0x8000000) goto lblock;\n  ctx->b += 1;\n  if (ctx->b != 0xff) goto lblock;\n  ctx->c &= 0x7ffffff;\n\nrblock:\n  if (ctx->bp >= 0) {\n#ifdef TRACE\n    printf(\"emit %x\\n\", ctx->b);\n#endif\n    emit(ctx);\n  }\n  ctx->b = ctx->c >> 20;\n  ctx->bp++;\n  ctx->c &= 0xfffff;\n  ctx->ct = 7;\n  return;\n\nlblock:\n  if (ctx->bp >= 0) {\n#ifdef TRACE\n    printf(\"emit %x\\n\", ctx->b);\n#endif\n    emit(ctx);\n  }\n  ctx->b = ctx->c >> 19;\n  ctx->bp++;\n  ctx->c &= 0x7ffff;\n  ctx->ct = 8;\n  return;\n}\n\n// -----------------------------------------------------------------------------\n// A merging of the ENCODE, CODELPS and CODEMPS procedures from the standard\n// -----------------------------------------------------------------------------\nstatic void\nencode_bit(struct jbig2enc_ctx *restrict ctx, u8 *restrict context, u32 ctxnum, u8 d) {\n  const u8 i = context[ctxnum];\n  const u8 mps = i > 46 ? 1 : 0;\n  const u16 qe = ctbl[i].qe;\n\n#ifdef CODER_DEBUGGING\n    fprintf(stderr, \"B: %d %d %d %d\\n\", ctxnum, qe, ctx->a, d);\n#endif\n\n#ifdef TRACE\n  static int ec = 0;\n  printf(\"%d\\t%d %d %x %x %x %d %x %d\\n\", ec++, i, mps, qe, ctx->a, ctx->c, ctx->ct, ctx->b, ctx->bp);\n#endif\n\n  if (unlikely(d != mps)) goto codelps;\n#ifdef SURPRISE_MAP\n  {\n  u8 b = static_cast<unsigned char>\n    (((static_cast<float>(qe) / 0xac02) * 255));\n  write(3, &b, 1);\n  }\n#endif\n  ctx->a -= qe;\n  if (unlikely((ctx->a & 0x8000) == 0)) {\n    if (unlikely(ctx->a < qe)) {\n      ctx->a = qe;\n    } else {\n      ctx->c += qe;\n    }\n    context[ctxnum] = ctbl[i].mps;\n    goto renorme;\n  } else {\n    ctx->c += qe;\n  }\n\n  return;\n\ncodelps:\n#ifdef SURPRISE_MAP\n  {\n  u8 b = static_cast<unsigned char>\n    ((1.0f - (static_cast<float>(qe) / 0xac02)) * 255);\n  write(3, &b, 1);\n  }\n#endif\n  ctx->a -= qe;\n  if (ctx->a < qe) {\n    ctx->c += qe;\n  } else {\n    ctx->a = qe;\n  }\n  context[ctxnum] = ctbl[i].lps;\n\nrenorme:\n  do {\n    ctx->a <<= 1;\n    ctx->c <<= 1;\n    ctx->ct -= 1;\n    if (unlikely(!ctx->ct)) {\n      byteout(ctx);\n    }\n  } while ((ctx->a & 0x8000) == 0);\n}\n\n// -----------------------------------------------------------------------------\n// The FINALISE procudure from the standard\n// -----------------------------------------------------------------------------\nstatic void\nencode_final(struct jbig2enc_ctx *restrict ctx) {\n  // SETBITS\n  const u32 tempc = ctx->c + ctx->a;\n  ctx->c |= 0xffff;\n  if (ctx->c >= tempc) {\n    ctx->c -= 0x8000;\n  }\n\n  ctx->c <<= ctx->ct;\n  byteout(ctx);\n  ctx->c <<= ctx->ct;\n  byteout(ctx);\n  emit(ctx);\n  if (ctx->b != 0xff) {\n#ifdef TRACE\n    printf(\"emit 0xff\\n\");\n#endif\n    ctx->b = 0xff;\n    emit(ctx);\n  }\n#ifdef TRACE\n  printf(\"emit 0xac\\n\");\n#endif\n  ctx->b = 0xac;\n  emit(ctx);\n}\n\n// see comments in .h file\nvoid\njbig2enc_final(struct jbig2enc_ctx *restrict ctx) {\n  encode_final(ctx);\n}\n\n// -----------------------------------------------------------------------------\n// When encoding integers there are a number of different cases. This structure\n// contains all the information for one of those cases\n// -----------------------------------------------------------------------------\nstruct intencrange_s {\n  int bot, top;  // the range of numbers for which this is valid\n  u8 data, bits; // the bits of data to write first, and the number which are valid\n                 // These bits are taken from the bottom of the u8, in reverse order\n  u16 delta;     // the amount to subtract from the value before encoding it\n  u8 intbits;    // number of bits to use to encode the integer\n};\n\n// table for how to encode integers of a given range\nstatic struct intencrange_s intencrange[] = {\n  {0,   3,  0, 2, 0, 2},\n  {-1, -1,  9, 4, 0, 0},\n  {-3, -2,  5, 3, 2, 1},\n  {4,  19,  2, 3, 4, 4},\n  {-19,-4,  3, 3, 4, 4},\n  {20, 83,  6, 4, 20, 6},\n  {-83,-20, 7, 4, 20, 6},\n  {84, 339, 14,5, 84, 8},\n  {-339,-84,15,5, 84, 8},\n  {340,4435,30,6, 340, 12},\n  {-4435,-340,31,6,340, 12},\n  {4436,2000000000,62,6,4436, 32},\n  {-2000000000,-4436,63,6,4436, 32}\n};\n\n// see comments in .h file\nvoid\njbig2enc_oob(struct jbig2enc_ctx *restrict ctx, int proc) {\n  u8 *const context = ctx->intctx[proc];\n\n  encode_bit(ctx, context, 1, 1);\n  encode_bit(ctx, context, 3, 0);\n  encode_bit(ctx, context, 6, 0);\n  encode_bit(ctx, context, 12, 0);\n}\n\n// see comments in .h file\nvoid\njbig2enc_int(struct jbig2enc_ctx *restrict ctx, int proc, int value) {\n  u8 *const context = ctx->intctx[proc];\n  int i;\n\n  if (value > 2000000000 || value < -2000000000) abort();\n\n  u32 prev = 1;\n\n  for (i = 0; ; ++i) {\n    if (intencrange[i].bot <= value && intencrange[i].top >= value) break;\n  }\n  if (value < 0) value = -value;\n  value -= intencrange[i].delta;\n\n  u8 data = intencrange[i].data;\n  for (int j = 0; j < intencrange[i].bits; ++j) {\n    const u8 v = data & 1;\n    encode_bit(ctx, context, prev, v);\n    data >>= 1;\n    if (prev & 0x100) {\n      // prev > 256\n      prev = (((prev << 1) | v) & 0x1ff) | 0x100;\n    } else {\n      prev = (prev << 1) | v;\n    }\n  }\n\n  // move the data in value to the top of the word\n  value <<= (32 - intencrange[i].intbits);\n  for (int j = 0; j < intencrange[i].intbits; ++j) {\n    const u8 v = (value & 0x80000000) >> 31;\n    encode_bit(ctx, context, prev, v);\n    // roll the next bit into place\n    value <<= 1;\n    if (prev & 0x100) {\n      // prev > 256\n      prev = (((prev << 1) | v) & 0x1ff) | 0x100;\n    } else {\n      prev = (prev << 1) | v;\n    }\n  }\n}\n\n// see comments in .h file\nvoid\njbig2enc_iaid(struct jbig2enc_ctx *restrict ctx, int symcodelen, int value) {\n  if (!ctx->iaidctx) {\n    // we've not yet allocated the context index buffer for this\n    ctx->iaidctx = (u8 *) malloc(1 << symcodelen);\n    memset(ctx->iaidctx, 0, 1 << symcodelen);\n  }\n  const u32 mask = (1 << (symcodelen + 1)) - 1;\n\n  value <<= (32 - symcodelen);  // roll the data to the top of the word\n  u32 prev = 1;\n  for (int i = 0; i < symcodelen; ++i) {\n    const u32 tval = prev & mask;\n    const u8 v = (value & 0x80000000) >> 31;\n    encode_bit(ctx, ctx->iaidctx, tval, v);\n    prev = (prev << 1) | v;\n    value <<= 1;\n  }\n}\n\n// This is the test input to the coder as given in the standard (H.2)\nstatic const u8 input[] = { 0, 2, 0, 0x51, 0, 0, 0, 0xc0, 0x03, 0x52, 0x87,\n  0x2a, 0xaa, 0xaa, 0xaa, 0xaa, 0x82, 0xc0, 0x20, 0, 0xfc, 0xd7, 0x9e, 0xf6,\n  0xbf, 0x7f, 0xed, 0x90, 0x4f, 0x46, 0xa3, 0xbf } ;\n\n// -----------------------------------------------------------------------------\n// This function  is used by jbig2enc_image to fetch values from the image and\n// to automatically extend the range of the image on three sides with zero's\n// -----------------------------------------------------------------------------\nstatic u8 image_get(const u8 *restrict image, int x, int y, int mx, int my) {\n  if (y < 0) return 0;\n  if (x >= mx) return 0;\n  if (y >= my) return 0;\n  return image[mx * y + x];\n}\n\n// see comments in .h file\nunsigned\njbig2enc_datasize(const struct jbig2enc_ctx *ctx) {\n  return JBIG2_OUTPUTBUFFER_SIZE * ctx->output_chunks->size() + ctx->outbuf_used;\n}\n\n// see comments in .h file\nvoid\njbig2enc_tobuffer(const struct jbig2enc_ctx *restrict ctx, u8 *restrict buffer) {\n  int j = 0;\n  for (std::vector<u8 *>::const_iterator i = ctx->output_chunks->begin();\n       i != ctx->output_chunks->end(); ++i) {\n    memcpy(&buffer[j], *i, JBIG2_OUTPUTBUFFER_SIZE);\n    j += JBIG2_OUTPUTBUFFER_SIZE;\n  }\n\n  memcpy(&buffer[j], ctx->outbuf, ctx->outbuf_used);\n}\n\n// This is the context used for the TPGD bits\n#define TPGDCTX 0x9b25\n\n// -----------------------------------------------------------------------------\n// This is designed for Leptonica's 1bpp packed format images. Each row is some\n// number of 32-bit words. Pixels are in native-byte-order in each word.\n// -----------------------------------------------------------------------------\nvoid\njbig2enc_bitimage(struct jbig2enc_ctx *restrict ctx, const u8 *restrict idata,\n                  int mx, int my, bool duplicate_line_removal) {\n  const u32 *restrict data = (u32 *) idata;\n  u8 *const context = ctx->context;\n  const unsigned words_per_row = (mx + 31) / 32;\n  const unsigned bytes_per_row = words_per_row * 4;\n\n  u8 ltp = 0, sltp = 0;\n\n  for (int y = 0; y < my; ++y) {\n    int x = 0;\n\n    // the c* values store the context bits for each row. The template is fixed\n    // as template 0 with the floating bits in the default locations.\n    u16 c1, c2, c3;\n    // the w* values contain words from each of the rows: w1 is from two rows\n    // up etc. The next bit to roll onto the context values are kept at the top\n    // of these words.\n    u32 w1, w2, w3;\n    w1 = w2 = w3 = 0;\n\n    if (y >= 2) w1 = data[(y - 2) * words_per_row];\n    if (y >= 1) {\n      w2 = data[(y - 1) * words_per_row];\n\n      if (duplicate_line_removal) {\n        // it's possible that the last row was the same as this row\n        if (memcmp(&data[y * words_per_row], &data[(y - 1) * words_per_row],\n                   bytes_per_row) == 0) {\n          sltp = ltp ^ 1;\n          ltp = 1;\n        } else {\n          sltp = ltp;\n          ltp = 0;\n        }\n      }\n    }\n    if (duplicate_line_removal) {\n      encode_bit(ctx, context, TPGDCTX, sltp);\n      if (ltp) continue;\n    }\n    w3 = data[y * words_per_row];\n\n    // the top three bits are the start of the context c1\n    c1 = w1 >> 29;\n    c2 = w2 >> 28;\n    // and we need to remove the used bits from the w* vars\n    w1 <<= 3;\n    w2 <<= 4;\n    c3 = 0;\n    for (x = 0; x < mx; ++x) {\n      const u16 tval = (c1 << 11) | (c2 << 4) | c3;\n      const u8 v = (w3 & 0x80000000) >> 31;\n\n      //fprintf(stderr, \"%d %d %d %d\\n\", x, y, tval, v);\n      encode_bit(ctx, context, tval, v);\n      c1 <<= 1;\n      c2 <<= 1;\n      c3 <<= 1;\n      c1 |= (w1 & 0x80000000) >> 31;\n      c2 |= (w2 & 0x80000000) >> 31;\n      c3 |= v;\n      const int m = x % 32;\n      if (m == 28 && y >= 2) {\n        // need to roll in another word from two lines up\n        const unsigned wordno = (x / 32) + 1;\n        if (wordno >= words_per_row) {\n          w1 = 0;\n        } else {\n          w1 = data[(y - 2) * words_per_row + wordno];\n        }\n      } else {\n        w1 <<= 1;\n      }\n\n      if (m == 27 && y >= 1) {\n        // need to roll in another word from the last line\n        const unsigned wordno = (x / 32) + 1;\n        if (wordno >= words_per_row) {\n          w2 = 0;\n        } else {\n          w2 = data[(y - 1) * words_per_row + wordno];\n        }\n      } else {\n        w2 <<= 1;\n      }\n\n      if (m == 31) {\n        // need to roll in another word from this line\n        const unsigned wordno = (x / 32) + 1;\n        if (wordno >= words_per_row) {\n          w3 = 0;\n        } else {\n          w3 = data[y * words_per_row + wordno];\n        }\n      } else {\n        w3 <<= 1;\n      }\n\n      c1 &= 31;\n      c2 &= 127;\n      c3 &= 15;\n    }\n  }\n}\n\nvoid\njbig2enc_refine(struct jbig2enc_ctx *__restrict__ ctx,\n                const uint8_t *__restrict__ itempl, int tx, int ty,\n                const uint8_t *__restrict__ itarget, int mx, int my,\n                int ox, int oy) {\n  const u32 *restrict templdata = (u32 *) itempl;\n  const u32 *restrict data = (u32 *) itarget;\n  u8 *restrict const context = ctx->context;\n\n  static int image_counter = 0;\n\n  image_counter++;\n\n#ifdef SYM_DEBUGGING\n  fprintf(stderr, \"refine:%d %d %d %d\\n\", tx, ty, mx, my);\n#endif\n\n  const unsigned templwords_per_row = (tx + 31) / 32;\n  const unsigned words_per_row = (mx + 31) / 32;\n\n  for (int y = 0; y < my; ++y) {\n    int x;\n    const int temply = y + oy;\n    // the template is fixed to the 13 pixel template with the floating bits in\n    // the default locations.\n    // we have 5 words of context. The first three are the last, current and\n    // next rows of the template. The last two are the last and current rows of\n    // the target.\n    // To form the 14 bits of content these are packed from the least\n    // significant bits rightward.\n    u16 c1, c2, c3, c4, c5;\n    // the w* values contain words from each of the corresponding rows. The\n    // next bit to be part of the context is kept at the top of these words\n    u32 w1, w2, w3, w4, w5;\n    w1 = w2 = w3 = w4 = w5 = 0;\n\n    if (temply >= 1 && (temply - 1) < ty) w1 = templdata[(temply - 1) * templwords_per_row];\n    if (temply >= 0 && temply < ty) w2 = templdata[temply * templwords_per_row];\n    if (temply >= -1 && temply + 1 < ty) w3 = templdata[(temply + 1) * templwords_per_row];\n\n    // the x offset prevents a hassel because we are dealing with bits. Thus we\n    // restrict it to being {-1, 0, 1}.\n    if (y >= 1) w4 = data[(y - 1) * words_per_row];\n    w5 = data[y * words_per_row];\n\n    const int shiftoffset = 30 + ox;\n    c1 = w1 >> shiftoffset;\n    c2 = w2 >> shiftoffset;\n    c3 = w3 >> shiftoffset;\n\n    c4 = w4 >> 30;\n    c5 = 0;\n\n    // the w* should contain the next bit to be included in the context, in the\n    // MSB position. Thus we need to roll the used bits out of the way.\n    const int bits_to_trim = 2 - ox;\n    w1 <<= bits_to_trim;\n    w2 <<= bits_to_trim;\n    w3 <<= bits_to_trim;\n\n    w4 <<= 2;\n\n    for (x = 0; x < mx; ++x) {\n      const u16 tval = (c1 << 10) | (c2 << 7) | (c3 << 4) | (c4 << 1) | c5;\n      const u8 v = w5 >> 31;\n\n#ifdef SYM_DEBUGGING\n      fprintf(stderr, \"%d %d %d %d\\n\", x, y, tval, v);\n#endif\n      encode_bit(ctx, context, tval, v);\n      c1 <<= 1;\n      c2 <<= 1;\n      c3 <<= 1;\n      c4 <<= 1;\n      c1 |= w1 >> 31;\n      c2 |= w2 >> 31;\n      c3 |= w3 >> 31;\n      c4 |= w4 >> 31;\n      c5 = v;\n\n      const int m = x % 32;\n      const unsigned wordno = (x / 32) + 1;\n      if (m == 29 + ox) {\n        // have run out of bits in the w[123] values. Need to get more.\n\n        if (wordno >= templwords_per_row) {\n          w1 = w2 = w3 = 0;\n        } else {\n          if (temply >= 1 && (temply - 1 < ty)) {\n            w1 = templdata[(temply - 1) * templwords_per_row + wordno];\n          } else {\n            w1 = 0;\n          }\n          if (temply >= 0 && temply < ty) {\n            w2 = templdata[temply * templwords_per_row + wordno];\n          } else {\n            w2 = 0;\n          }\n          if (temply >= -1 && (temply + 1) < ty) {\n            w3 = templdata[(temply + 1) * templwords_per_row + wordno];\n          } else {\n            w3 = 0;\n          }\n        }\n      } else {\n        w1 <<= 1;\n        w2 <<= 1;\n        w3 <<= 1;\n      }\n\n      if (m == 29 && y >= 1) {\n        // run out of data from w4\n        if (wordno >= words_per_row) {\n          w4 = 0;\n        } else {\n          w4 = data[(y - 1) * words_per_row + wordno];\n        }\n      } else {\n        w4 <<= 1;\n      }\n\n      if (m == 31) {\n        // run out of data from w5\n        if (wordno >= words_per_row) {\n          w5 = 0;\n        } else {\n          w5 = data[y * words_per_row + wordno];\n        }\n      } else {\n        w5 <<= 1;\n      }\n\n      c1 &= 7;\n      c2 &= 7;\n      c3 &= 7;\n      c4 &= 7;\n    }\n  }\n}\n\n// see comments in .h file\nvoid\njbig2enc_image(struct jbig2enc_ctx *restrict ctx, const u8 *restrict data,\n               int mx, int my, bool duplicate_line_removal) {\n  u8 *const context = ctx->context;\n  u8 ltp = 0;\n  u8 sltp = 0;\n  for (int y = 0; y < my; ++y) {\n    int x = 0;\n    u16 c1 = (image_get(data, x, y - 2, mx, my) << 2) |\n             (image_get(data, x + 1, y - 2, mx, my) << 1) |\n             (image_get(data, x + 2, y - 2, mx, my));\n    u16 c2 = (image_get(data, x, y - 1, mx, my) << 3) |\n             (image_get(data, x + 1, y - 1, mx, my) << 2) |\n             (image_get(data, x + 2, y - 1, mx, my) << 1) |\n             (image_get(data, x + 3, y - 1, mx, my));\n    u16 c3 = 0;\n    if (y > 0) {\n      // it's possible that the last row was the same as this row\n      if (memcmp(&data[y * mx], &data[(y - 1) * mx], mx) == 0) {\n        sltp = ltp ^ 1;\n        ltp = 1;\n      } else {\n        sltp = ltp;\n        ltp = 0;\n      }\n    }\n    if (duplicate_line_removal) {\n      encode_bit(ctx, context, TPGDCTX, sltp);\n      if (ltp) continue;\n    }\n    for (x = 0; x < mx; ++x) {\n      const u16 tval = (c1 << 11) | (c2 << 4) | c3;\n      const u8 v = image_get(data, x, y, mx, my);\n      encode_bit(ctx, context, tval, v);\n      c1 <<= 1;\n      c2 <<= 1;\n      c3 <<= 1;\n      c1 |= image_get(data, x + 3, y - 2, mx, my);\n      c2 |= image_get(data, x + 4, y - 1, mx, my);\n      c3 |= v;\n      c1 &= 31;\n      c2 &= 127;\n      c3 &= 15;\n    }\n  }\n}\n"
  },
  {
    "path": "JBig2/src/jbig2dec.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#include <string.h>\n\n#ifdef HAVE_GETOPT_H\n# include <getopt.h>\n#else\n# include \"getopt.h\"\n#endif\n\n#include \"os_types.h\"\n#include \"sha1.h\"\n\n#ifdef JBIG_EXTERNAL_MEMENTO_H\n#include JBIG_EXTERNAL_MEMENTO_H\n#else\n#include \"memento.h\"\n#endif\n\n#include \"jbig2.h\"\n#include \"jbig2_priv.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_image_rw.h\"\n\ntypedef enum {\n    usage, dump, render\n} jbig2dec_mode;\n\ntypedef enum {\n    jbig2dec_format_none,\n    jbig2dec_format_jbig2,\n    jbig2dec_format_pbm,\n#ifdef HAVE_LIBPNG\n    jbig2dec_format_png,\n#endif\n} jbig2dec_format;\n\ntypedef struct {\n    jbig2dec_mode mode;\n    int verbose, hash, embedded;\n    SHA1_CTX *hash_ctx;\n    char *output_filename;\n    jbig2dec_format output_format;\n    size_t memory_limit;\n} jbig2dec_params_t;\n\ntypedef struct {\n    int verbose;\n    char *last_message;\n    Jbig2Severity severity;\n    char *type;\n    long repeats;\n} jbig2dec_error_callback_state_t;\n\ntypedef struct {\n    Jbig2Allocator super;\n    Jbig2Ctx *ctx;\n    size_t memory_limit;\n    size_t memory_used;\n    size_t memory_peak;\n} jbig2dec_allocator_t;\n\nstatic int print_version(void);\nstatic int print_usage(void);\n\n#define ALIGNMENT 16\n#define KBYTE 1024\n#define MBYTE (1024 * KBYTE)\n\nstatic void *jbig2dec_reached_limit(jbig2dec_allocator_t *allocator, size_t oldsize, size_t size)\n{\n    size_t limit_mb = allocator->memory_limit / MBYTE;\n    size_t used_mb = allocator->memory_used / MBYTE;\n    size_t oldsize_mb = oldsize / MBYTE;\n    size_t size_mb = size / MBYTE;\n\n    if (oldsize == 0)\n        jbig2_error(allocator->ctx, JBIG2_SEVERITY_FATAL, -1, \"memory: limit reached: limit: %zu (%zu Mbyte) used: %zu (%zu Mbyte) allocation: %zu (%zu Mbyte)\",\n            allocator->memory_limit, limit_mb,\n            allocator->memory_used, used_mb,\n            size, size_mb);\n    else\n        jbig2_error(allocator->ctx, JBIG2_SEVERITY_FATAL, -1, \"memory: limit reached: limit: %zu (%zu Mbyte) used: %zu (%zu Mbyte) reallocation: %zu (%zu Mbyte) -> %zu (%zu Mbyte)\",\n            allocator->memory_limit, limit_mb,\n            allocator->memory_used, used_mb,\n            oldsize, oldsize_mb,\n            size, size_mb);\n\n    return NULL;\n}\n\nstatic void jbig2dec_peak(jbig2dec_allocator_t *allocator)\n{\n    size_t limit_mb = allocator->memory_limit / MBYTE;\n    size_t peak_mb = allocator->memory_peak / MBYTE;\n    size_t used_mb = allocator->memory_used / MBYTE;\n\n    if (allocator->ctx == NULL)\n        return;\n    if (used_mb <= peak_mb)\n        return;\n\n    allocator->memory_peak = allocator->memory_used;\n\n    jbig2_error(allocator->ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"memory: limit: %lu %sbyte used: %lu %sbyte, peak: %lu %sbyte\",\n        limit_mb > 0 ? limit_mb : allocator->memory_limit, limit_mb > 0 ? \"M\" : \"\",\n        used_mb > 0 ? used_mb : allocator->memory_used, used_mb > 0 ? \"M\" : \"\",\n        peak_mb > 0 ? peak_mb : allocator->memory_peak, peak_mb > 0 ? \"M\" : \"\");\n}\n\nstatic void *jbig2dec_alloc(Jbig2Allocator *allocator_, size_t size)\n{\n    jbig2dec_allocator_t *allocator = (jbig2dec_allocator_t *) allocator_;\n    void *ptr;\n\n    if (size == 0)\n        return NULL;\n    if (size > SIZE_MAX - ALIGNMENT)\n        return NULL;\n\n    if (size + ALIGNMENT > allocator->memory_limit - allocator->memory_used)\n        return jbig2dec_reached_limit(allocator, 0, size + ALIGNMENT);\n\n    ptr = malloc(size + ALIGNMENT);\n    if (ptr == NULL)\n        return NULL;\n    memcpy(ptr, &size, sizeof(size));\n    allocator->memory_used += size + ALIGNMENT;\n\n    jbig2dec_peak(allocator);\n\n    return (unsigned char *) ptr + ALIGNMENT;\n}\n\nstatic void jbig2dec_free(Jbig2Allocator *allocator_, void *p)\n{\n    jbig2dec_allocator_t *allocator = (jbig2dec_allocator_t *) allocator_;\n    size_t size;\n\n    if (p == NULL)\n        return;\n\n    memcpy(&size, (unsigned char *) p - ALIGNMENT, sizeof(size));\n    allocator->memory_used -= size + ALIGNMENT;\n    free((unsigned char *) p - ALIGNMENT);\n}\n\nstatic void *jbig2dec_realloc(Jbig2Allocator *allocator_, void *p, size_t size)\n{\n    jbig2dec_allocator_t *allocator = (jbig2dec_allocator_t *) allocator_;\n    unsigned char *oldp;\n    size_t oldsize;\n\n    if (p == NULL)\n        return jbig2dec_alloc(allocator_, size);\n    if (p < (void *) ALIGNMENT)\n        return NULL;\n\n    if (size == 0) {\n        jbig2dec_free(allocator_, p);\n        return NULL;\n    }\n    if (size > SIZE_MAX - ALIGNMENT)\n        return NULL;\n\n    oldp = (unsigned char *) p - ALIGNMENT;\n    memcpy(&oldsize, oldp, sizeof(oldsize));\n\n    if (size + ALIGNMENT > allocator->memory_limit - allocator->memory_used + oldsize + ALIGNMENT)\n        return jbig2dec_reached_limit(allocator, oldsize + ALIGNMENT, size + ALIGNMENT);\n\n    p = realloc(oldp, size + ALIGNMENT);\n    if (p == NULL)\n        return NULL;\n\n    allocator->memory_used -= oldsize + ALIGNMENT;\n    memcpy(p, &size, sizeof(size));\n    allocator->memory_used += size + ALIGNMENT;\n\n    jbig2dec_peak(allocator);\n\n    return (unsigned char *) p + ALIGNMENT;\n}\n\n/* page hashing functions */\nstatic void\nhash_init(jbig2dec_params_t *params)\n{\n    params->hash_ctx = (SHA1_CTX *) malloc(sizeof(SHA1_CTX));\n    if (params->hash_ctx == NULL) {\n        fprintf(stderr, \"unable to allocate hash state\\n\");\n        params->hash = 0;\n        return;\n    } else {\n        SHA1_Init(params->hash_ctx);\n    }\n}\n\nstatic void\nhash_image(jbig2dec_params_t *params, Jbig2Image *image)\n{\n    unsigned int N = image->stride * image->height;\n\n    SHA1_Update(params->hash_ctx, image->data, N);\n}\n\nstatic void\nhash_print(jbig2dec_params_t *params, FILE *out)\n{\n    unsigned char md[SHA1_DIGEST_SIZE];\n    char digest[2 * SHA1_DIGEST_SIZE + 1];\n    int i;\n\n    SHA1_Final(params->hash_ctx, md);\n    for (i = 0; i < SHA1_DIGEST_SIZE; i++) {\n        snprintf(&(digest[2 * i]), 3, \"%02x\", md[i]);\n    }\n    fprintf(out, \"%s\", digest);\n}\n\nstatic void\nhash_free(jbig2dec_params_t *params)\n{\n    free(params->hash_ctx);\n    params->hash_ctx = NULL;\n}\n\nstatic int\nset_output_format(jbig2dec_params_t *params, const char *format)\n{\n#ifdef HAVE_LIBPNG\n    /* this should really by strncasecmp()\n       TODO: we need to provide our own for portability */\n    if (!strncmp(format, \"png\", 3) || !strncmp(format, \"PNG\", 3)) {\n        params->output_format = jbig2dec_format_png;\n        return 0;\n    }\n#endif\n    /* default to pbm */\n    params->output_format = jbig2dec_format_pbm;\n\n    return 0;\n}\n\nstatic int\nparse_options(int argc, char *argv[], jbig2dec_params_t *params)\n{\n    static struct option long_options[] = {\n        {\"version\", 0, NULL, 'V'},\n        {\"help\", 0, NULL, 'h'},\n        {\"quiet\", 0, NULL, 'q'},\n        {\"verbose\", 2, NULL, 'v'},\n        {\"dump\", 0, NULL, 'd'},\n        {\"hash\", 0, NULL, 'm'},\n        {\"output\", 1, NULL, 'o'},\n        {\"format\", 1, NULL, 't'},\n        {\"embedded\", 0, NULL, 'e'},\n        {NULL, 0, NULL, 0}\n    };\n    int option_idx = 1;\n    int option;\n    int ret;\n\n    while (1) {\n        option = getopt_long(argc, argv, \"Vh?qv:do:t:eM:\", long_options, &option_idx);\n        if (option == -1)\n            break;\n\n        switch (option) {\n        case 0:                /* unknown long option */\n            if (!params->verbose)\n                fprintf(stdout, \"unrecognized option: --%s\\n\", long_options[option_idx].name);\n            break;\n        case 'q':\n            params->verbose = 0;\n            break;\n        case 'v':\n            if (optarg)\n                params->verbose = atoi(optarg);\n            else\n                params->verbose = 2;\n            break;\n        case 'h':\n        case '?':\n            params->mode = usage;\n            break;\n        case 'V':\n            /* the GNU Coding Standards suggest --version\n               should override all other options */\n            print_version();\n            exit(0);\n            break;\n        case 'd':\n            params->mode = dump;\n            break;\n        case 'm':\n            params->hash = 1;\n            break;\n        case 'o':\n            params->output_filename = strdup(optarg);\n            break;\n        case 't':\n            set_output_format(params, optarg);\n            break;\n        case 'e':\n            params->embedded = 1;\n            break;\n        case 'M':\n            ret = sscanf(optarg, \"%zu\", &params->memory_limit);\n            if (ret != 1)\n                fprintf(stderr, \"could not parse memory limit argument\\n\");\n            break;\n        default:\n            if (!params->verbose)\n                fprintf(stderr, \"unrecognized option: -%c\\n\", option);\n            break;\n        }\n    }\n    return (optind);\n}\n\nstatic int\nprint_version(void)\n{\n    fprintf(stdout, \"jbig2dec %d.%d\\n\", JBIG2_VERSION_MAJOR, JBIG2_VERSION_MINOR);\n    return 0;\n}\n\nstatic int\nprint_usage(void)\n{\n    fprintf(stderr,\n            \"Usage: jbig2dec [options] <file.jbig2>\\n\"\n            \"   or  jbig2dec [options] <global_stream> <page_stream>\\n\"\n            \"\\n\"\n            \"  When invoked with a single file, it attempts to parse it as\\n\"\n            \"  a normal jbig2 file. Invoked with two files, it treats the\\n\"\n            \"  first as the global segments, and the second as the segment\\n\"\n            \"  stream for a particular page. This is useful for examining\\n\"\n            \"  embedded streams.\\n\"\n            \"\\n\"\n            \"  available options:\\n\"\n            \"    -h --help       this usage summary\\n\"\n            \"    -q --quiet      suppress diagnostic output\\n\"\n            \"    -v --verbose    set the verbosity level\\n\"\n            \"    -d --dump       print the structure of the jbig2 file\\n\"\n            \"                    rather than explicitly decoding\\n\"\n            \"    -V --version    program name and version information\\n\"\n            \"    -m --hash       print a hash of the decoded document\\n\"\n            \"    -e --embedded   expect embedded bit stream without file header\\n\"\n            \"    -M <limit>      memory limit expressed in bytes\\n\"\n            \"    -o <file>\\n\"\n            \"    --output <file> send decoded output to <file>\\n\"\n            \"                    Defaults to the the input with a different\\n\"\n            \"                    extension. Pass '-' for stdout.\\n\"\n            \"    -t <type>\\n\"\n            \"    --format <type> force a particular output file format\\n\"\n#ifdef HAVE_LIBPNG\n            \"                    supported options are 'png' and 'pbm'\\n\"\n#else\n            \"                    the only supported option is 'pbm'\\n\"\n#endif\n            \"\\n\");\n\n    return 1;\n}\n\nstatic void\nerror_callback(void *error_callback_data, const char *message, Jbig2Severity severity, uint32_t seg_idx)\n{\n    jbig2dec_error_callback_state_t *state = (jbig2dec_error_callback_state_t *) error_callback_data;\n    char *type;\n    int ret;\n\n    switch (severity) {\n    case JBIG2_SEVERITY_DEBUG:\n        if (state->verbose < 3)\n            return;\n        type = \"DEBUG\";\n        break;\n    case JBIG2_SEVERITY_INFO:\n        if (state->verbose < 2)\n            return;\n        type = \"info\";\n        break;\n    case JBIG2_SEVERITY_WARNING:\n        if (state->verbose < 1)\n            return;\n        type = \"WARNING\";\n        break;\n    case JBIG2_SEVERITY_FATAL:\n        type = \"FATAL ERROR\";\n        break;\n    default:\n        type = \"unknown message\";\n        break;\n    }\n\n    if (state->last_message != NULL && !strcmp(message, state->last_message) && state->severity == severity && state->type == type) {\n        state->repeats++;\n        if (state->repeats % 1000000 == 0) {\n            ret = fprintf(stderr, \"jbig2dec %s last message repeated %ld times so far\\n\", state->type, state->repeats);\n            if (ret < 0)\n                goto printerror;\n        }\n    } else {\n        if (state->repeats > 1) {\n            ret = fprintf(stderr, \"jbig2dec %s last message repeated %ld times\\n\", state->type, state->repeats);\n            if (ret < 0)\n                goto printerror;\n        }\n\n        if (seg_idx == JBIG2_UNKNOWN_SEGMENT_NUMBER)\n            ret = fprintf(stderr, \"jbig2dec %s %s\\n\", type, message);\n        else\n            ret = fprintf(stderr, \"jbig2dec %s %s (segment 0x%08x)\\n\", type, message, seg_idx);\n        if (ret < 0)\n            goto printerror;\n\n        state->repeats = 0;\n        state->severity = severity;\n        state->type = type;\n        free(state->last_message);\n        state->last_message = NULL;\n\n        if (message) {\n            state->last_message = strdup(message);\n            if (state->last_message == NULL) {\n                ret = fprintf(stderr, \"jbig2dec WARNING could not duplicate message\\n\");\n                if (ret < 0)\n                    goto printerror;\n            }\n        }\n    }\n\n    return;\n\nprinterror:\n    fprintf(stderr, \"jbig2dec WARNING could not print message\\n\");\n    state->repeats = 0;\n    free(state->last_message);\n    state->last_message = NULL;\n}\n\nstatic void\nflush_errors(jbig2dec_error_callback_state_t *state)\n{\n    if (state->repeats > 1) {\n        fprintf(stderr, \"jbig2dec last message repeated %ld times\\n\", state->repeats);\n    }\n}\n\nstatic char *\nmake_output_filename(const char *input_filename, const char *extension)\n{\n    char *output_filename;\n    const char *c, *e;\n    size_t extlen, len;\n\n    if (extension == NULL) {\n        fprintf(stderr, \"no filename extension; cannot create output filename!\\n\");\n        exit(1);\n    }\n\n    if (input_filename == NULL)\n        c = \"out\";\n    else {\n        /* strip any leading path */\n        c = strrchr(input_filename, '/');       /* *nix */\n        if (c == NULL)\n            c = strrchr(input_filename, '\\\\');  /* win32/dos */\n        if (c != NULL)\n            c++;                /* skip the path separator */\n        else\n            c = input_filename; /* no leading path */\n    }\n\n    /* make sure we haven't just stripped the last character */\n    if (*c == '\\0')\n        c = \"out\";\n\n    /* strip the extension */\n    len = strlen(c);\n    e = strrchr(c, '.');\n    if (e != NULL)\n        len -= strlen(e);\n\n    extlen = strlen(extension);\n\n    /* allocate enough space for the base + ext */\n    output_filename = (char *)malloc(len + extlen + 1);\n    if (output_filename == NULL) {\n        fprintf(stderr, \"failed to allocate memory for output filename\\n\");\n        exit(1);\n    }\n\n    memcpy(output_filename, c, len);\n    memcpy(output_filename + len, extension, extlen);\n    *(output_filename + len + extlen) = '\\0';\n\n    /* return the new string */\n    return (output_filename);\n}\n\nstatic int\nwrite_page_image(jbig2dec_params_t *params, FILE *out, Jbig2Image *image)\n{\n    switch (params->output_format) {\n#ifdef HAVE_LIBPNG\n    case jbig2dec_format_png:\n        return jbig2_image_write_png(image, out);\n#endif\n    case jbig2dec_format_pbm:\n        return jbig2_image_write_pbm(image, out);\n    default:\n        fprintf(stderr, \"unsupported output format.\\n\");\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic int\nwrite_document_hash(jbig2dec_params_t *params)\n{\n    FILE *out;\n\n    if (!strncmp(params->output_filename, \"-\", 2)) {\n        out = stderr;\n    } else {\n        out = stdout;\n    }\n\n    fprintf(out, \"Hash of decoded document: \");\n    hash_print(params, out);\n    fprintf(out, \"\\n\");\n\n    return 0;\n}\n\nint\nmain(int argc, char **argv)\n{\n    jbig2dec_params_t params;\n    jbig2dec_error_callback_state_t error_callback_state;\n    jbig2dec_allocator_t allocator_;\n    jbig2dec_allocator_t *allocator = &allocator_;\n    Jbig2Ctx *ctx = NULL;\n    FILE *f = NULL, *f_page = NULL;\n    uint8_t buf[4096];\n    int filearg;\n    int result = 1;\n    int code;\n\n    /* set defaults */\n    params.mode = render;\n    params.verbose = 1;\n    params.hash = 0;\n    params.output_filename = NULL;\n    params.output_format = jbig2dec_format_none;\n    params.embedded = 0;\n    params.memory_limit = 0;\n\n    filearg = parse_options(argc, argv, &params);\n\n    error_callback_state.verbose = params.verbose;\n    error_callback_state.severity = JBIG2_SEVERITY_DEBUG;\n    error_callback_state.type = NULL;\n    error_callback_state.last_message = NULL;\n    error_callback_state.repeats = 0;\n\n    if (params.hash)\n        hash_init(&params);\n\n    switch (params.mode) {\n    case usage:\n        print_usage();\n        exit(0);\n        break;\n    case dump:\n        fprintf(stderr, \"Sorry, segment dump not yet implemented\\n\");\n        break;\n    case render:\n\n        if ((argc - filearg) == 1) {\n            /* only one argument--open as a jbig2 file */\n            char *fn = argv[filearg];\n\n            f = fopen(fn, \"rb\");\n            if (f == NULL) {\n                fprintf(stderr, \"error opening %s\\n\", fn);\n                goto cleanup;\n            }\n        } else if ((argc - filearg) == 2) {\n            /* two arguments open as separate global and page streams */\n            char *fn = argv[filearg];\n            char *fn_page = argv[filearg + 1];\n\n            f = fopen(fn, \"rb\");\n            if (f == NULL) {\n                fprintf(stderr, \"error opening %s\\n\", fn);\n                goto cleanup;\n            }\n\n            f_page = fopen(fn_page, \"rb\");\n            if (f_page == NULL) {\n                fclose(f);\n                fprintf(stderr, \"error opening %s\\n\", fn_page);\n                goto cleanup;\n            }\n        } else {\n            /* any other number of arguments */\n            result = print_usage();\n            goto cleanup;\n        }\n\n        if (params.memory_limit == 0)\n            allocator = NULL;\n        else\n        {\n            allocator->super.alloc = jbig2dec_alloc;\n            allocator->super.free = jbig2dec_free;\n            allocator->super.realloc = jbig2dec_realloc;\n            allocator->ctx = NULL;\n            allocator->memory_limit = params.memory_limit;\n            allocator->memory_used = 0;\n            allocator->memory_peak = 0;\n        }\n\n        ctx = jbig2_ctx_new((Jbig2Allocator *) allocator, (Jbig2Options)(f_page != NULL || params.embedded ? JBIG2_OPTIONS_EMBEDDED : 0), NULL, error_callback, &error_callback_state);\n        if (ctx == NULL) {\n            fclose(f);\n            if (f_page)\n                fclose(f_page);\n            goto cleanup;\n        }\n\n        if (allocator != NULL)\n            allocator->ctx = ctx;\n\n        /* pull the whole file/global stream into memory */\n        for (;;) {\n            int n_bytes = fread(buf, 1, sizeof(buf), f);\n            if (n_bytes < 0) {\n                if (f_page != NULL)\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to read jbig2 global stream\");\n                else\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to read jbig2 page stream\");\n            }\n            if (n_bytes <= 0)\n                break;\n\n            if (jbig2_data_in(ctx, buf, (size_t) n_bytes) < 0)\n            {\n                if (f_page != NULL)\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to process jbig2 global stream\");\n                else\n                    jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to process jbig2 page stream\");\n                break;\n            }\n        }\n        fclose(f);\n\n        /* if there's a local page stream read that in its entirety */\n        if (f_page != NULL) {\n            Jbig2GlobalCtx *global_ctx = jbig2_make_global_ctx(ctx);\n\n            ctx = jbig2_ctx_new((Jbig2Allocator *) allocator, JBIG2_OPTIONS_EMBEDDED, global_ctx, error_callback, &error_callback_state);\n            if (ctx != NULL) {\n                if (allocator != NULL)\n                    allocator->ctx = ctx;\n\n                for (;;) {\n                    int n_bytes = fread(buf, 1, sizeof(buf), f_page);\n                    if (n_bytes < 0)\n                        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to read jbig2 page stream\");\n                    if (n_bytes <= 0)\n                        break;\n\n                    if (jbig2_data_in(ctx, buf, (size_t) n_bytes) < 0)\n                    {\n                        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to process jbig2 page stream\");\n                        break;\n                    }\n                }\n            }\n            fclose(f_page);\n            jbig2_global_ctx_free(global_ctx);\n        }\n\n        /* retrieve and output the returned pages */\n        {\n            Jbig2Image *image;\n            FILE *out;\n\n            /* always complete a page, working around streams that lack end of\n            page segments: broken CVision streams, embedded streams or streams\n            with parse errors. */\n            code = jbig2_complete_page(ctx);\n            if (code < 0) {\n                jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"unable to complete page\");\n                goto cleanup;\n            }\n\n            if (params.output_filename == NULL) {\n                switch (params.output_format) {\n#ifdef HAVE_LIBPNG\n                case jbig2dec_format_png:\n                    params.output_filename = make_output_filename(argv[filearg], \".png\");\n                    break;\n#endif\n                case jbig2dec_format_pbm:\n                    params.output_filename = make_output_filename(argv[filearg], \".pbm\");\n                    break;\n                default:\n                    fprintf(stderr, \"unsupported output format: %d\\n\", params.output_format);\n                    goto cleanup;\n                }\n            } else {\n                int len = strlen(params.output_filename);\n\n                if ((len >= 3) && (params.output_format == jbig2dec_format_none))\n                    /* try to set the output type by the given extension */\n                    set_output_format(&params, params.output_filename + len - 3);\n            }\n\n            if (!strncmp(params.output_filename, \"-\", 2)) {\n                out = stdout;\n            } else {\n                if (params.verbose > 1)\n                    fprintf(stderr, \"saving decoded page as '%s'\\n\", params.output_filename);\n                if ((out = fopen(params.output_filename, \"wb\")) == NULL) {\n                    fprintf(stderr, \"unable to open '%s' for writing\\n\", params.output_filename);\n                    goto cleanup;\n                }\n            }\n\n            /* retrieve and write out all the completed pages */\n            while ((image = jbig2_page_out(ctx)) != NULL) {\n                write_page_image(&params, out, image);\n                if (params.hash)\n                    hash_image(&params, image);\n                jbig2_release_page(ctx, image);\n            }\n\n            if (out != stdout)\n                fclose(out);\n            if (params.hash)\n                write_document_hash(&params);\n        }\n\n    }                           /* end params.mode switch */\n\n    if (allocator != NULL && allocator->ctx != NULL) {\n        size_t limit_mb = allocator->memory_limit / MBYTE;\n        size_t peak_mb = allocator->memory_peak / MBYTE;\n        jbig2_error(allocator->ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, \"memory: limit: %lu Mbyte peak usage: %lu Mbyte\", limit_mb, peak_mb);\n    }\n\n    /* fin */\n    result = 0;\n\ncleanup:\n    flush_errors(&error_callback_state);\n    jbig2_ctx_free(ctx);\n    if (params.output_filename)\n        free(params.output_filename);\n    if (error_callback_state.last_message)\n        free(error_callback_state.last_message);\n    if (params.hash)\n        hash_free(&params);\n\n    return result;\n}\n"
  },
  {
    "path": "JBig2/src/jbig2enc.cc",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include <map>\n#include <vector>\n#include <algorithm>\n\n#include <stdio.h>\n#include <string.h>\n\n#include <allheaders.h>\n#include <pix.h>\n\n#include <math.h>\n#if defined(sun)\n#include <sys/types.h>\n#else\n#include <stdint.h>\n#endif\n\n#define u64 uint64_t\n#define u32 uint32_t\n#define u16 uint16_t\n#define u8  uint8_t\n\n#include \"jbig2arith.h\"\n#include \"jbig2sym.h\"\n#include \"jbig2structs.h\"\n#include \"jbig2segments.h\"\n\n// -----------------------------------------------------------------------------\n// Removes spots which are less than size x size pixels\n//\n// Note, this has a side-effect of removing a few pixels\n// that from components you want to keep.\n//\n// If that's a problem, you do a binary reconstruction\n// (from seedfill.c):\n// -----------------------------------------------------------------------------\nstatic PIX *\nremove_flyspecks(PIX *const source, const int size) {\n  Sel *sel_5h = selCreateBrick(1, size, 0, 2, SEL_HIT);\n  Sel *sel_5v = selCreateBrick(size, 1, 2, 0, SEL_HIT);\n\n  Pix *pixt = pixOpen(NULL, source, sel_5h);\n  Pix *pixd = pixOpen(NULL, source, sel_5v);\n  pixOr(pixd, pixd, pixt);\n  pixDestroy(&pixt);\n  selDestroy(&sel_5h);\n  selDestroy(&sel_5v);\n\n  return pixd;\n}\n\n// -----------------------------------------------------------------------------\n// Returns the number of bits needed to encode v symbols\n// -----------------------------------------------------------------------------\nstatic unsigned\nlog2up(int v) {\n  unsigned r = 0;\n  const bool is_pow_of_2 = (v & (v - 1)) == 0;\n\n  while (v >>= 1) r++;\n  if (is_pow_of_2) return r;\n\n  return r + 1;\n}\n\n// -----------------------------------------------------------------------------\n// This is the context for a multi-page JBIG2 document.\n// -----------------------------------------------------------------------------\nstruct jbig2ctx {\n  struct JbClasser *classer;  // the leptonica classifier\n  int xres, yres;  // ppi for the X and Y direction\n  bool full_headers;  // true if we are producing a full JBIG2 file\n  bool pdf_page_numbering;  // true if all text pages are page \"1\" (pdf mode)\n  int segnum;  // current segment number\n  int symtab_segment;  // the segment number of the symbol table\n  // a map from page number a list of components for that page\n  std::map<int, std::vector<int> > pagecomps;\n  // for each page, the list of symbols which are only used on that page\n  std::map<int, std::vector<unsigned> > single_use_symbols;\n  // the number of symbols in the global symbol table\n  int num_global_symbols;\n  std::vector<int> page_xres, page_yres;\n  std::vector<int> page_width, page_height;\n  // Used to store the mapping from symbol number to the index in the global\n  // symbol dictionary.\n  std::map<int, int> symmap;\n  bool refinement;\n  PIXA *avg_templates;  // grayed templates\n  int refine_level;\n  // only used when using refinement\n    // the number of the first symbol of each page\n    std::vector<int> baseindexes;\n};\n\n// see comments in .h file\nstruct jbig2ctx *\njbig2_init(float thresh, float weight, int xres, int yres, bool full_headers,\n           int refine_level) {\n  struct jbig2ctx *ctx = new jbig2ctx;\n  ctx->xres = xres;\n  ctx->yres = yres;\n  ctx->full_headers = full_headers;\n  ctx->pdf_page_numbering = !full_headers;\n  ctx->segnum = 0;\n  ctx->symtab_segment = -1;\n  ctx->refinement = refine_level >= 0;\n  ctx->refine_level = refine_level;\n  ctx->avg_templates = NULL;\n\n  ctx->classer = jbCorrelationInitWithoutComponents(JB_CONN_COMPS, 9999, 9999,\n                                                    thresh, weight);\n\n  return ctx;\n}\n\n// see comments in .h file\nvoid\njbig2_destroy(struct jbig2ctx *ctx) {\n  if (ctx->avg_templates) pixaDestroy(&ctx->avg_templates);\n  jbClasserDestroy(&ctx->classer);\n  delete ctx;\n}\n\n// see comments in .h file\nvoid\njbig2_add_page(struct jbig2ctx *ctx, struct Pix *input) {\n  PIX *bw;\n\n  if (false /*ctx->xres >= 300*/) {\n    bw = remove_flyspecks(input, (int) (0.0084*ctx->xres));\n  } else {\n    bw = pixClone(input);\n  }\n\n  if (ctx->refinement) {\n    ctx->baseindexes.push_back(ctx->classer->baseindex);\n  }\n\n  jbAddPage(ctx->classer, bw);\n  ctx->page_width.push_back(bw->w);\n  ctx->page_height.push_back(bw->h);\n  ctx->page_xres.push_back(bw->xres);\n  ctx->page_yres.push_back(bw->yres);\n\n  if (ctx->refinement) {\n    // This code is broken by (my) recent changes to Leptonica. Needs to be\n    // fixed at some point, but not too important at the moment since we don't\n    // use refinement.\n\n    /*BOXA *boxes = boxaCopy(ctx->classer->boxas, L_CLONE);\n    ctx->boxes.push_back(boxes);\n    PIXA *comps = pixaCopy(ctx->classer->pixas, L_CLONE);\n    ctx->comps.push_back(comps);*/\n  }\n\n  pixDestroy(&bw);\n}\n\n#define F(x) memcpy(ret + offset, &x, sizeof(x)) ; offset += sizeof(x)\n#define G(x, y) memcpy(ret + offset, x, y); offset += y;\n#define SEGMENT(x) x.write(ret + offset); offset += x.size();\n\n// see comments in .h file\nuint8_t *\njbig2_pages_complete(struct jbig2ctx *ctx, int *const length) {\n  /*\n     Graying support - disabled.\n     It's not very clear that graying actaully buys you much extra quality\n     above pick-the-first. Also, aligning the gray glyphs requires the\n     original source image.\n\n     Remember that you need the Init without WithoutComponents to use this */\n\n\n  /*NUMA *samples_per_composition;\n  PTA *grayed_centroids;\n  PIXA *grayed;\n\n  grayed = jbAccumulateComposites(ctx->classer->pixaa, &samples_per_composition,\n                                  &grayed_centroids);\n\n  if (!grayed || grayed->n != ctx->classer->pixaa->n) {\n    fprintf(stderr, \"Graying failed\\n\");\n    return NULL;\n  }\n\n  ctx->avg_templates = pixaCreate(0);\n  for (int i = 0; i < grayed->n; ++i) {\n    int samples;\n    numaGetIValue(samples_per_composition, i, &samples);\n    PIX *avg = pixFinalAccumulateThreshold(grayed->pix[i], 0,\n                                           (samples + 1) >> 1);\n    pixaAddPix(ctx->avg_templates, avg, L_INSERT);\n    //char b[512];\n    //sprintf(b, \"gray-%d/th.png\", i);\n    //pixWrite(b, avg, IFF_PNG);\n  }\n\n  pixaDestroy(&grayed);\n  numaDestroy(&samples_per_composition);*/\n\n  // We find the symbols which only appear on a single page and encode them in\n  // a symbol dictionary just for that page. This is because we want to keep\n  // the size of the global dictionary down as some PDF readers appear to\n  // decode it for every page (!)\n\n  // (as a short cut, we just pick the symbols which are only used once since,\n  // in testing, all the symbols which appear on only one page appear only once\n  // on that page)\n\n  const bool single_page = ctx->classer->npages == 1;\n\n  // maps symbol number to the number of times it has been used\n  // pixat->n is the number of symbols\n  // naclass->n is the number of connected components\n\n  std::vector<unsigned> symbol_used(ctx->classer->pixat->n);\n  for (int i = 0; i < ctx->classer->naclass->n; ++i) {\n    int n;\n    numaGetIValue(ctx->classer->naclass, i, &n);\n    symbol_used[n]++;\n  }\n\n  // the multiuse symbols are the ones which go into the global dictionary\n  std::vector<unsigned> multiuse_symbols;\n  for (int i = 0; i < ctx->classer->pixat->n; ++i) {\n    if (symbol_used[i] == 0) abort();\n    if (symbol_used[i] > 1 || single_page) multiuse_symbols.push_back(i);\n  }\n  ctx->num_global_symbols = multiuse_symbols.size();\n\n  // build the pagecomps map: a map from page number to the list of connected\n  // components for that page. The classer gives us an array from connected\n  // component number to page number - we just have to reverse it\n  for (int i = 0; i < ctx->classer->napage->n; ++i) {\n    int page_num;\n    numaGetIValue(ctx->classer->napage, i, &page_num);\n    ctx->pagecomps[page_num].push_back(i);\n    int symbol;\n    numaGetIValue(ctx->classer->naclass, i, &symbol);\n    if (symbol_used[symbol] == 1 && !single_page) {\n      ctx->single_use_symbols[page_num].push_back(symbol);\n    }\n  }\n\n#ifdef DUMP_SYMBOL_GRAPH\n  for (int p = 0; p < ctx->classer->npages; ++p) {\n    for (std::vector<int>::const_iterator i = ctx->pagecomps[p].begin();\n         i != ctx->pagecomps[p].end(); ++i) {\n      const int sym = (int) ctx->classer->naclass->array[*i];\n      fprintf(stderr, \"S: %d %d\\n\", p, sym);\n    }\n  }\n#endif\n\n#ifdef SYMBOL_COMPRESSION_DEBUGGING\n  std::map<int, int> usecount;\n  for (int i = 0; i < ctx->classer->naclass->n; ++i) {\n    usecount[(int)ctx->classer->naclass->array[i]]++;\n  }\n\n  for (int p = 0; p < ctx->classer->npages; ++p) {\n    const int numcomps = ctx->pagecomps[p].size();\n    int unique_in_doc = 0;\n    std::map<int, int> symcount;\n    for (std::vector<int>::const_iterator i = ctx->pagecomps[p].begin();\n         i != ctx->pagecomps[p].end(); ++i) {\n      const int sym = (int) ctx->classer->naclass->array[*i];\n      symcount[sym]++;\n      if (usecount[sym] == 1) unique_in_doc++;\n    }\n    int unique_this_page = 0;\n    for (std::map<int, int>::const_iterator i = symcount.begin();\n         i != symcount.end(); ++i) {\n      if (i->second == 1) unique_this_page++;\n    }\n\n    fprintf(stderr, \"Page %d %d/%d/%d\\n\", p, numcomps, unique_this_page, unique_in_doc);\n  }\n#endif\n\n#ifdef DUMP_ALL_SYMBOLS\n  char filenamebuf[128];\n  for (int i = 0; i < ctx->classer->pixat->n; ++i) {\n    sprintf(filenamebuf, \"sym-%d.png\", i);\n    pixWrite(filenamebuf, ctx->classer->pixat->pix[i], IFF_PNG);\n  }\n#endif\n  fprintf(stderr, \"JBIG2 compression complete. pages:%d symbols:%d log2:%d\\n\",\n          ctx->classer->npages, ctx->classer->pixat->n,\n          log2up(ctx->classer->pixat->n));\n\n  jbGetLLCorners(ctx->classer);\n\n  struct jbig2enc_ctx ectx;\n  jbig2enc_init(&ectx);\n\n  struct jbig2_file_header header;\n  if (ctx->full_headers) {\n    memset(&header, 0, sizeof(header));\n    header.n_pages = htonl(ctx->classer->npages);\n    header.organisation_type = 1;\n    memcpy(&header.id, JBIG2_FILE_MAGIC, 8);\n  }\n\n  Segment seg;\n  struct jbig2_symbol_dict symtab;\n  memset(&symtab, 0, sizeof(symtab));\n\n  jbig2enc_symboltable\n    (&ectx, ctx->avg_templates ? ctx->avg_templates : ctx->classer->pixat,\n     &multiuse_symbols, &ctx->symmap, ctx->avg_templates == NULL);\n  const int symdatasize = jbig2enc_datasize(&ectx);\n\n  symtab.a1x = 3;\n  symtab.a1y = -1;\n  symtab.a2x = -3;\n  symtab.a2y = -1;\n  symtab.a3x = 2;\n  symtab.a3y = -2;\n  symtab.a4x = -2;\n  symtab.a4y = -2;\n  symtab.exsyms = symtab.newsyms = htonl(multiuse_symbols.size());\n\n  ctx->symtab_segment = ctx->segnum;\n  seg.number = ctx->segnum;\n  ctx->segnum++;\n  seg.type = segment_symbol_table;\n  seg.len = sizeof(symtab) + symdatasize;\n  seg.page = 0;\n  seg.retain_bits = 1;\n\n  u8 *const ret = (u8 *) malloc((ctx->full_headers ? sizeof(header) : 0) +\n                                seg.size() + sizeof(symtab) + symdatasize);\n  int offset = 0;\n  if (ctx->full_headers) {\n    F(header);\n  }\n  SEGMENT(seg);\n  F(symtab);\n  jbig2enc_tobuffer(&ectx, ret + offset);\n  jbig2enc_dealloc(&ectx);\n  offset += symdatasize;\n\n  *length = offset;\n\n  return ret;\n}\n\n// see comments in .h file\nuint8_t *\njbig2_produce_page(struct jbig2ctx *ctx, int page_no,\n                   int xres, int yres, int *const length) {\n  const bool last_page = page_no == ctx->classer->npages;\n  const bool include_trailer = last_page && ctx->full_headers;\n\n  struct jbig2enc_ctx ectx;\n  jbig2enc_init(&ectx);\n\n  Segment seg, symseg;\n  Segment endseg, trailerseg;\n  struct jbig2_page_info pageinfo;\n  memset(&pageinfo, 0, sizeof(pageinfo));\n  struct jbig2_text_region textreg;\n  memset(&textreg, 0, sizeof(textreg));\n  struct jbig2_text_region_syminsts textreg_syminsts;\n  memset(&textreg_syminsts, 0, sizeof(textreg_syminsts));\n  struct jbig2_text_region_atflags textreg_atflags;\n  memset(&textreg_atflags, 0, sizeof(textreg_atflags));\n  Segment segr;\n\n  // page information segment\n  seg.number = ctx->segnum;\n  ctx->segnum++;\n  seg.type = segment_page_information;\n  seg.page = ctx->pdf_page_numbering ? 1 : 1 + page_no;\n  seg.len = sizeof(struct jbig2_page_info);\n  pageinfo.width = htonl(ctx->page_width[page_no]);\n  pageinfo.height = htonl(ctx->page_height[page_no]);\n  pageinfo.xres = htonl(xres == -1 ? ctx->page_xres[page_no] : xres );\n  pageinfo.yres = htonl(yres == -1 ? ctx->page_yres[page_no] : yres );\n  pageinfo.is_lossless = ctx->refinement;\n\n  std::map<int, int> second_symbol_map;\n  // If we have single-use symbols on this page we make a new symbol table\n  // containing just them.\n  const bool extrasymtab = ctx->single_use_symbols[page_no].size() > 0;\n  struct jbig2enc_ctx extrasymtab_ctx;\n\n  struct jbig2_symbol_dict symtab;\n  memset(&symtab, 0, sizeof(symtab));\n\n  if (extrasymtab) {\n    jbig2enc_init(&extrasymtab_ctx);\n    symseg.number = ctx->segnum++;\n    symseg.type = segment_symbol_table;\n    symseg.page = ctx->pdf_page_numbering ? 1 : 1 + page_no;\n\n    jbig2enc_symboltable\n      (&extrasymtab_ctx,\n       ctx->avg_templates ? ctx->avg_templates : ctx->classer->pixat,\n       &ctx->single_use_symbols[page_no], &second_symbol_map,\n       ctx->avg_templates == NULL);\n    symtab.a1x = 3;\n    symtab.a1y = -1;\n    symtab.a2x = -3;\n    symtab.a2y = -1;\n    symtab.a3x = 2;\n    symtab.a3y = -2;\n    symtab.a4x = -2;\n    symtab.a4y = -2;\n    symtab.exsyms = symtab.newsyms =\n      htonl(ctx->single_use_symbols[page_no].size());\n\n    symseg.len = jbig2enc_datasize(&extrasymtab_ctx) + sizeof(symtab);\n  }\n\n  const int numsyms = ctx->num_global_symbols +\n                      ctx->single_use_symbols[page_no].size();\n  //BOXA *const boxes = ctx->refinement ? ctx->boxes[page_no] : NULL;\n  int baseindex = ctx->refinement ? ctx->baseindexes[page_no] : 0;\n  jbig2enc_textregion(&ectx, ctx->symmap, second_symbol_map,\n                      ctx->pagecomps[page_no],\n                      ctx->classer->ptall,\n                      ctx->avg_templates ? ctx->avg_templates : ctx->classer->pixat,\n                      ctx->classer->naclass, 1,\n                      log2up(numsyms),\n                      //ctx->refinement ? ctx->comps[page_no] : NULL,\n                      NULL,\n                      /* boxes */ NULL, baseindex, ctx->refine_level,\n                      ctx->avg_templates == NULL);\n  const int textdatasize = jbig2enc_datasize(&ectx);\n  textreg.width = htonl(ctx->page_width[page_no]);\n  textreg.height = htonl(ctx->page_height[page_no]);\n  textreg.logsbstrips = 0;\n  textreg.sbrefine = ctx->refinement;\n  // refcorner = 0 -> bot left\n  textreg_syminsts.sbnuminstances = htonl(ctx->pagecomps[page_no].size());\n\n  textreg_atflags.a1x = -1;\n  textreg_atflags.a1y = -1;\n  textreg_atflags.a2x = -1;\n  textreg_atflags.a2y = -1;\n\n  segr.number = ctx->segnum;\n  ctx->segnum++;\n  segr.type = segment_imm_text_region;\n  segr.referred_to.push_back(ctx->symtab_segment);\n  if (extrasymtab) segr.referred_to.push_back(symseg.number);\n  if (ctx->refinement) {\n    segr.len = sizeof(textreg) + sizeof(textreg_syminsts) +\n               sizeof(textreg_atflags) + textdatasize;\n  } else {\n    segr.len = sizeof(textreg) + sizeof(textreg_syminsts) + textdatasize;\n  }\n\n  segr.retain_bits = 2;\n  segr.page = ctx->pdf_page_numbering ? 1 : 1 + page_no;\n\n  const int extrasymtab_size = extrasymtab ?\n    jbig2enc_datasize(&extrasymtab_ctx) : 0;\n\n  if (ctx->full_headers) {\n    endseg.number = ctx->segnum;\n    ctx->segnum++;\n    endseg.type = segment_end_of_page;\n    endseg.page = ctx->pdf_page_numbering ? 1 : 1 + page_no;\n  }\n\n  if (include_trailer) {\n    trailerseg.number = ctx->segnum;\n    ctx->segnum++;\n    trailerseg.type = segment_end_of_file;\n    trailerseg.page = 0;\n  }\n\n  const int totalsize = seg.size() + sizeof(pageinfo) +\n                        (extrasymtab ? (extrasymtab_size + symseg.size() +\n                                        sizeof(symtab)) : 0) +\n                        segr.size() +\n                        sizeof(textreg) + sizeof(textreg_syminsts) +\n                        (ctx->refinement ? sizeof(textreg_atflags) : 0) +\n                        textdatasize +\n                        (ctx->full_headers ? endseg.size() : 0) +\n                        (include_trailer ? trailerseg.size() : 0);\n  u8 *ret = (u8 *) malloc(totalsize);\n  int offset = 0;\n\n  SEGMENT(seg);\n  F(pageinfo);\n  if (extrasymtab) {\n    SEGMENT(symseg);\n    F(symtab);\n    jbig2enc_tobuffer(&extrasymtab_ctx, ret + offset);\n    offset += extrasymtab_size;\n  }\n  SEGMENT(segr);\n  F(textreg);\n  if (ctx->refinement) {\n    F(textreg_atflags);\n  }\n  F(textreg_syminsts);\n  jbig2enc_tobuffer(&ectx, ret + offset); offset += textdatasize;\n  if (ctx->full_headers) {\n    SEGMENT(endseg);\n  }\n  if (include_trailer) {\n    SEGMENT(trailerseg);\n  }\n\n  if (totalsize != offset) abort();\n\n  jbig2enc_dealloc(&ectx);\n  if (extrasymtab) jbig2enc_dealloc(&extrasymtab_ctx);\n\n  *length = offset;\n  return ret;\n}\n\n#undef F\n#undef G\n\n// see comments in .h file\nu8 *\njbig2_encode_generic(struct Pix *const bw, const bool full_headers, const int xres,\n                     const int yres, const bool duplicate_line_removal,\n                     int *const length) {\n  int segnum = 0;\n\n  if (!bw) return NULL;\n  pixSetPadBits(bw, 0);\n\n  struct jbig2_file_header header;\n  if (full_headers) {\n    memset(&header, 0, sizeof(header));\n    header.n_pages = htonl(1);\n    header.organisation_type = 1;\n    memcpy(&header.id, JBIG2_FILE_MAGIC, 8);\n  }\n\n  // setup compression\n  struct jbig2enc_ctx ctx;\n  jbig2enc_init(&ctx);\n\n  Segment seg, seg2, endseg;\n  jbig2_page_info pageinfo;\n  memset(&pageinfo, 0, sizeof(pageinfo));\n  jbig2_generic_region genreg;\n  memset(&genreg, 0, sizeof(genreg));\n\n  seg.number = segnum;\n  segnum++;\n  seg.type = segment_page_information;\n  seg.page = 1;\n  seg.len = sizeof(struct jbig2_page_info);\n  pageinfo.width = htonl(bw->w);\n  pageinfo.height = htonl(bw->h);\n  pageinfo.xres = htonl(xres ? xres : bw->xres);\n  pageinfo.yres = htonl(yres ? yres : bw->yres);\n  pageinfo.is_lossless = 1;\n\n#ifdef SURPRISE_MAP\n  dprintf(3, \"P5\\n%d %d 255\\n\", bw->w, bw->h);\n#endif\n\n  jbig2enc_bitimage(&ctx, (u8 *) bw->data, bw->w, bw->h, duplicate_line_removal);\n  jbig2enc_final(&ctx);\n  const int datasize = jbig2enc_datasize(&ctx);\n\n  seg2.number = segnum;\n  segnum++;\n  seg2.type = segment_imm_generic_region;\n  seg2.page = 1;\n  seg2.len = sizeof(genreg) + datasize;\n\n  endseg.number = segnum;\n  segnum++;\n  endseg.page = 1;\n\n  genreg.width = htonl(bw->w);\n  genreg.height = htonl(bw->h);\n  if (duplicate_line_removal) {\n    genreg.tpgdon = true;\n  }\n  genreg.a1x = 3;\n  genreg.a1y = -1;\n  genreg.a2x = -3;\n  genreg.a2y = -1;\n  genreg.a3x = 2;\n  genreg.a3y = -2;\n  genreg.a4x = -2;\n  genreg.a4y = -2;\n\n  const int totalsize = seg.size() + sizeof(pageinfo) + seg2.size() +\n                        sizeof(genreg) + datasize +\n                        (full_headers ? (sizeof(header) + 2*endseg.size()) : 0);\n  u8 *const ret = (u8 *) malloc(totalsize);\n  int offset = 0;\n\n#define F(x) memcpy(ret + offset, &x, sizeof(x)) ; offset += sizeof(x)\n  if (full_headers) {\n    F(header);\n  }\n  SEGMENT(seg);\n  F(pageinfo);\n  SEGMENT(seg2);\n  F(genreg);\n  jbig2enc_tobuffer(&ctx, ret + offset);\n  offset += datasize;\n\n  if (full_headers) {\n    endseg.type = segment_end_of_page;\n    SEGMENT(endseg);\n    endseg.number += 1;\n    endseg.type = segment_end_of_file;\n    SEGMENT(endseg);\n  }\n\n  if (totalsize != offset) abort();\n\n  jbig2enc_dealloc(&ctx);\n\n  *length = offset;\n\n  return ret;\n}\n\n"
  },
  {
    "path": "JBig2/src/jbig2enc.lossless.cc",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include <map>\n#include <vector>\n#include <algorithm>\n\n#include <stdio.h>\n#include <string.h>\n\n#include <pix.h>\n\n#include <math.h>\n#if defined(sun)\n#include <sys/types.h>\n#else\n#include <stdint.h>\n#endif\n\n#define u64 uint64_t\n#define u32 uint32_t\n#define u16 uint16_t\n#define u8  uint8_t\n\n#include \"jbig2arith.h\"\n#include \"jbig2structs.h\"\n#include \"jbig2segments.h\"\n\n#define SEGMENT(x) x.write(ret + offset); offset += x.size();\n\n\nstatic const uint32_t rmask32[] = {0x0,\n    0x00000001, 0x00000003, 0x00000007, 0x0000000f,\n    0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,\n    0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,\n    0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,\n    0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,\n    0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,\n    0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,\n    0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff};\n\nint32_t\npixSetPadBits(PIX     *pix,\n              int32_t  val)\n{\nint32_t    i, w, h, d, wpl, endbits, fullwords;\nuint32_t   mask;\nuint32_t  *data, *pword;\n\n\tw = pix->w;\n\th = pix->h;\n\td = 1;\n\n\tdata = pix->data;\n    wpl = (w + 31) /32;\n    endbits = 32 - ((w * d) % 32);\n    if (endbits == 32)  /* no partial word */\n        return 0;\n    fullwords = w * d / 32;\n\n    mask = rmask32[endbits];\n    if (val == 0)\n        mask = ~mask;\n\n    for (i = 0; i < h; i++) {\n        pword = data + i * wpl + fullwords;\n        if (val == 0) /* clear */\n            *pword = *pword & mask;\n        else  /* set */\n            *pword = *pword | mask;\n    }\n\n    return 0;\n}\n\n\n// see comments in .h file\nu8 *\njbig2_encode_generic(struct Pix *const bw, const bool full_headers, const int xres,\n                     const int yres, const bool duplicate_line_removal,\n                     int *const length) {\n  int segnum = 0;\n\n  if (!bw) return NULL;\n  pixSetPadBits(bw, 0);\n\n  struct jbig2_file_header header;\n  if (full_headers) {\n    memset(&header, 0, sizeof(header));\n    header.n_pages = htonl(1);\n    header.organisation_type = 1;\n    memcpy(&header.id, JBIG2_FILE_MAGIC, 8);\n  }\n\n  // setup compression\n  struct jbig2enc_ctx ctx;\n  jbig2enc_init(&ctx);\n\n  Segment seg, seg2, endseg;\n  jbig2_page_info pageinfo;\n  memset(&pageinfo, 0, sizeof(pageinfo));\n  jbig2_generic_region genreg;\n  memset(&genreg, 0, sizeof(genreg));\n\n  seg.number = segnum;\n  segnum++;\n  seg.type = segment_page_information;\n  seg.page = 1;\n  seg.len = sizeof(struct jbig2_page_info);\n  pageinfo.width = htonl(bw->w);\n  pageinfo.height = htonl(bw->h);\n  pageinfo.xres = htonl(xres ? xres : bw->xres);\n  pageinfo.yres = htonl(yres ? yres : bw->yres);\n  pageinfo.is_lossless = 1;\n\n#ifdef SURPRISE_MAP\n  dprintf(3, \"P5\\n%d %d 255\\n\", bw->w, bw->h);\n#endif\n\n  jbig2enc_bitimage(&ctx, (u8 *) bw->data, bw->w, bw->h, duplicate_line_removal);\n  jbig2enc_final(&ctx);\n  const int datasize = jbig2enc_datasize(&ctx);\n\n  seg2.number = segnum;\n  segnum++;\n  seg2.type = segment_imm_generic_region;\n  seg2.page = 1;\n  seg2.len = sizeof(genreg) + datasize;\n\n  endseg.number = segnum;\n  segnum++;\n  endseg.page = 1;\n\n  genreg.width = htonl(bw->w);\n  genreg.height = htonl(bw->h);\n  if (duplicate_line_removal) {\n    genreg.tpgdon = true;\n  }\n  genreg.a1x = 3;\n  genreg.a1y = -1;\n  genreg.a2x = -3;\n  genreg.a2y = -1;\n  genreg.a3x = 2;\n  genreg.a3y = -2;\n  genreg.a4x = -2;\n  genreg.a4y = -2;\n\n  const int totalsize = seg.size() + sizeof(pageinfo) + seg2.size() +\n                        sizeof(genreg) + datasize +\n                        (full_headers ? (sizeof(header) + 2*endseg.size()) : 0);\n  u8 *const ret = (u8 *) malloc(totalsize);\n  int offset = 0;\n\n#define F(x) memcpy(ret + offset, &x, sizeof(x)) ; offset += sizeof(x)\n  if (full_headers) {\n    F(header);\n  }\n  SEGMENT(seg);\n  F(pageinfo);\n  SEGMENT(seg2);\n  F(genreg);\n  jbig2enc_tobuffer(&ctx, ret + offset);\n  offset += datasize;\n\n  if (full_headers) {\n    endseg.type = segment_end_of_page;\n    SEGMENT(endseg);\n    endseg.number += 1;\n    endseg.type = segment_end_of_file;\n    SEGMENT(endseg);\n  }\n\n  if (totalsize != offset) abort();\n\n  jbig2enc_dealloc(&ctx);\n\n  *length = offset;\n\n  return ret;\n}\n\n// see comments in .h file\nu8 *\njbig2_encode (int width, int height, int stride, bool zeroIsWhite, uint8_t * const source, int *const length) {\n\tu8 * ret;\n\tu32 mask = zeroIsWhite ? 0x0 : 0xffffffff;\n\tu8* pl = source;\n\tu8* p;\n\tu32* pw;\n\tchar a, b;\n\tfor (int h = 0; h < height; h++) {\n\t\tp = pl;\n\t\tfor (int w = 0; w < stride; w += 4) {\n\t\t\tpw = (u32*)p;\n\t\t\t*pw = *pw ^ mask;\n\t\t\ta = *p;\n\t\t\t*p = p[3];\n\t\t\tp++;\n\t\t\tb = *p;\n\t\t\t*p = p[1];\n\t\t\tp++;\n\t\t\t*p = b;\n\t\t\tp++;\n\t\t\t*p = a;\n\t\t\tp++;\n\t\t}\n\t\tpl += stride;\n\t}\n\n\tPix * pix = (Pix*)malloc(sizeof(Pix));\n\tpix->w = width;\n\tpix->h = height;\n\tpix->data = (u32*)source;\n\tret = jbig2_encode_generic (pix, false, 0, 0, false, length);\n\tfree(pix);\n\treturn ret;\n}\n\n// see comments in .h file\nvoid jbig2_freemem (uint8_t * const memblock) {\n\tfree (memblock);\n};\n"
  },
  {
    "path": "JBig2/src/jbig2sym.cc",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n// Author: agl@imperialviolet.org (Adam Langley)\n//\n// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include <map>\n#include <algorithm>\n\n#include \"jbig2arith.h\"\n\n#ifdef _MSC_VER\n#define restrict __restrict\n#else\n#define restrict __restrict__\n#endif\n\n#include <stdio.h>\n\n#include <allheaders.h>\n#include <pix.h>\n\n#include <math.h>\n\n#define S(i) symbols->pix[i]\n\n\n// -----------------------------------------------------------------------------\n// iota isn't part of the STL standard, and it can be a pain to include even on\n// gcc based systems. Thus we define it here and save the issues\n// -----------------------------------------------------------------------------\ntemplate <class _ForwardIterator, class _Tp>\nvoid\nmyiota(_ForwardIterator __first, _ForwardIterator __last, _Tp __val) {\n  while (__first != __last) *__first++ = __val++;\n}\n\n// -----------------------------------------------------------------------------\n// Sorts a vector of indexes into the symbols PIXA by height. This is needed\n// because symbols are placed into the JBIG2 table in height order\n// -----------------------------------------------------------------------------\nclass HeightSorter {  // concept: stl/StrictWeakOrdering\n public:\n  HeightSorter(const PIXA *isymbols)\n      : symbols(isymbols) {}\n\n  bool operator() (int x, int y) {\n    return S(x)->h < S(y)->h;\n  }\n\n private:\n  const PIXA *const symbols;\n};\n\n// -----------------------------------------------------------------------------\n// Sorts a vector of indexes into the symbols PIXA by width. This is needed\n// because symbols are placed into the JBIG2 table in width order (for a given\n// height class)\n// -----------------------------------------------------------------------------\nclass WidthSorter {  // concept: stl/StrictWeakOrdering\n public:\n  WidthSorter(const PIXA *isymbols)\n      : symbols(isymbols) {}\n\n  bool operator() (int x, int y) {\n    return S(x)->w < S(y)->w;\n  }\n\n private:\n  const PIXA *const symbols;\n};\n\nstatic const int kBorderSize = 6;\n\n// see comment in .h file\nvoid\njbig2enc_symboltable(struct jbig2enc_ctx *restrict ctx,\n                     PIXA *restrict const symbols,\n                     std::vector<unsigned> *__restrict__ symbol_list,\n                     std::map<int, int> *symmap, const bool unborder_symbols) {\n  const unsigned n = symbol_list->size();\n  int number = 0;\n\n#ifdef JBIG2_DEBUGGING\n  fprintf(stderr, \"  symbols: %d\\n\", n);\n#endif\n\n  // this is a vector of indexes into symbols\n  std::vector<unsigned> syms(*symbol_list);\n  // now sort that vector by height\n  std::sort(syms.begin(), syms.end(), HeightSorter(symbols));\n\n  // this is used for each height class to sort into increasing width\n  WidthSorter sorter(symbols);\n\n  // this stores the indexes of the symbols for a given height class\n  std::vector<int> hc;\n  // this keeps the value of the height of the current class\n  unsigned hcheight = 0;\n  for (unsigned i = 0; i < n;) {\n    // height is the height of this class of symbols\n    const unsigned height = S(syms[i])->h - (unborder_symbols ? 2*kBorderSize : 0);\n#ifdef JBIG2_DEBUGGING\n    fprintf(stderr, \"height is %d\\n\", height);\n#endif\n    unsigned j;\n    hc.clear();\n    hc.push_back(syms[i]);  // this is the first member of the new class\n    // walk the vector until we find a symbol with a different height\n    for (j = i + 1; j < n; ++j) {\n      if (S(syms[j])->h - (unborder_symbols ? 2*kBorderSize : 0) != height) break;\n      hc.push_back(syms[j]);  // add each symbol of the same height to the class\n    }\n#ifdef JBIG2_DEBUGGING\n    fprintf(stderr, \"  hc (height: %d, members: %d)\\n\", height, hc.size());\n#endif\n    // all the symbols from i to j-1 are a height class\n    // now sort them into increasing width\n    sort(hc.begin(), hc.end(), sorter);\n    // encode the delta height\n    const int deltaheight = height - hcheight;\n    jbig2enc_int(ctx, JBIG2_IADH, deltaheight);\n    hcheight = height;\n    int symwidth = 0;\n    // encode each symbol\n    for (std::vector<int>::const_iterator k = hc.begin(); k != hc.end(); ++k) {\n      const int sym = *k;\n      const int thissymwidth = S(sym)->w - (unborder_symbols ? 2*kBorderSize : 0);\n      const int deltawidth = thissymwidth - symwidth;\n#ifdef JBIG2_DEBUGGING\n      fprintf(stderr, \"    h: %d\\n\", S(sym)->w);\n#endif\n      symwidth += deltawidth;\n      //fprintf(stderr, \"width is %d\\n\", S(sym)->w);\n      jbig2enc_int(ctx, JBIG2_IADW, deltawidth);\n\n      PIX *unbordered;\n      if (unborder_symbols) {\n        // the exemplars are stored with a border\n        unbordered = pixRemoveBorder(S(sym), kBorderSize);\n        // encoding the bitmap requires that the pad bits be zero\n      } else {\n        unbordered = pixClone(S(sym));\n      }\n      pixSetPadBits(unbordered, 0);\n      jbig2enc_bitimage(ctx, (uint8_t *) unbordered->data, thissymwidth, height,\n                        false);\n      // add this symbol to the map\n      (*symmap)[sym] = number++;\n      pixDestroy(&unbordered);\n    }\n    // OOB marks the end of the height class\n    //fprintf(stderr, \"OOB\\n\");\n    jbig2enc_oob(ctx, JBIG2_IADW);\n    i = j;\n  }\n\n  // now we have the list of exported symbols (which is all of them)\n  // it's run length encoded and we have a run length of 0 (for all the symbols\n  // which aren't set) followed by a run length of the number of symbols\n\n  jbig2enc_int(ctx, JBIG2_IAEX, 0);\n  jbig2enc_int(ctx, JBIG2_IAEX, n);\n\n  jbig2enc_final(ctx);\n}\n\n// sort by the bottom-left corner of the box\nclass YSorter {  // concept: stl/StrictWeakOrdering\n public:\n  YSorter(const PTA *ill)\n    : ll(ill) {}\n\n  bool operator() (int x, int y) {\n    return ll->y[x] < ll->y[y];\n  }\n\n private:\n  const PTA *const ll;\n};\n\n// sort by the bottom-left corner of the box\nclass XSorter {  // concept: stl/StrictWeakOrdering\n public:\n  XSorter(const PTA *ill)\n    : ll(ill) {}\n\n  bool operator() (int x, int y) {\n    return ll->x[x] < ll->x[y];\n  }\n\n private:\n  const PTA *const ll;\n};\n\n#if (__GNUC__ <= 2) || defined(sun)\n#define lrint(x) static_cast<int>(x)\n#endif\n\n#define BY(x) (lrint(ll->y[x]))\n\n// see comment in .h file\nvoid\njbig2enc_textregion(struct jbig2enc_ctx *restrict ctx,\n                    /*const*/ std::map<int, int> &symmap,\n                    /*const*/ std::map<int, int> &symmap2,\n                    const std::vector<int> &comps,\n                    PTA *const in_ll,\n                    PIXA *const symbols,\n                    NUMA *assignments, int stripwidth, int symbits,\n                    PIXA *const source, BOXA *boxes, int baseindex,\n                    int refine_level, bool unborder_symbols) {\n  // these are the only valid values for stripwidth\n  if (stripwidth != 1 && stripwidth != 2 && stripwidth != 4 &&\n      stripwidth != 8) {\n    abort();\n  }\n\n  PTA *ll;\n\n  // In the case of refinement, we have to put the symbols where the original\n  // boxes were. So we make up an array of lower-left (ll) points from the\n  // boxes. Otherwise we take the points from the in_ll array we were given.\n  // However, the in_ll array is absolutely indexed and the boxes array is\n  // relative to this page so watch out below.\n  if (source) {\n    ll = ptaCreate(0);\n    for (int i = 0; i < boxes->n; ++i) {\n      ptaAddPt(ll, boxes->box[i]->x,\n               boxes->box[i]->y + boxes->box[i]->h - 1);\n    }\n  } else {\n    // if we aren't doing refinement - we just put the symbols where they\n    // matched best\n    ll = in_ll;\n  }\n\n  const int n = comps.size();\n\n  // sort each box by distance from the top of the page\n  // syms (a copy of comps) is a list of indexes into symmap and ll\n  // elements which are indexes into symmap and ll are labeled I\n  // indexes into the syms array are labeled II\n  std::vector<int> syms(n);\n  if (source) {\n    // refining: fill syms with the numbers 0..n because ll is relative to this\n    // page in this case\n    myiota(syms.begin(), syms.end(), 0);\n  } else {\n    // fill syms with the component numbers from the comps array because ll is\n    // absolutly indexed in this case (absolute: over the whole multi-page\n    // document)\n    syms = comps;\n  }\n  // sort into height order\n  sort(syms.begin(), syms.end(), YSorter(ll));\n\n  XSorter sorter(ll);\n\n  int stript = 0;\n  int firsts = 0;\n  int wibble = 0;\n  // this is the initial stript value. I don't see why encoding this as zero,\n  // then encoding the first stript value as the real start is any worst than\n  // encoding this value correctly and then having a 0 value for the first\n  // deltat\n  jbig2enc_int(ctx, JBIG2_IADT, 0);\n\n  // for each symbol we group it into a strip, which is stripwidth px high\n  // for each strip we sort into left-right order\n  std::vector<int> strip; // elements of strip: I\n  for (int i = 0; i < n;) {   // i: II\n    const int height = (BY(syms[i]) / stripwidth) * stripwidth;\n    int j;\n    strip.clear();\n    strip.push_back(syms[i]);\n\n    // now walk until we hit the first symbol which isn't in this strip\n    for (j = i + 1; j < n; ++j) {  // j: II\n      if (BY(syms[j]) < height) abort();\n      if (BY(syms[j]) >= height + stripwidth) {\n        // outside strip\n        break;\n      }\n      strip.push_back(syms[j]);\n    }\n\n    // now sort the strip into left-right order\n    sort(strip.begin(), strip.end(), sorter);\n    const int deltat = height - stript;\n#ifdef SYM_DEBUGGING\n    fprintf(stderr, \"deltat is %d\\n\", deltat);\n#endif\n    jbig2enc_int(ctx, JBIG2_IADT, deltat / stripwidth);\n    stript = height;\n#ifdef SYM_DEBUGGING\n    fprintf(stderr, \"t now: %d\\n\", stript);\n#endif\n\n    bool firstsymbol = true;\n    int curs = 0;\n    // k: iterator(I)\n    for (std::vector<int>::const_iterator k = strip.begin(); k != strip.end(); ++k) {\n      const int sym = *k;  // sym: I\n      if (firstsymbol) {\n        firstsymbol = false;\n        const int deltafs = lrint(ll->x[sym]) - firsts;\n        jbig2enc_int(ctx, JBIG2_IAFS, deltafs);\n        firsts += deltafs;\n        curs = firsts;\n      } else {\n        const int deltas = lrint(ll->x[sym]) - curs;\n        jbig2enc_int(ctx, JBIG2_IADS, deltas);\n        curs += deltas;\n      }\n\n      // if stripwidth is 1, all the t values must be the same so they aren't\n      // even encoded\n      if (stripwidth > 1) {\n        const int deltat = BY(sym) - stript;\n        jbig2enc_int(ctx, JBIG2_IAIT, deltat);\n      }\n\n      // The assignments array is absolutely indexed, but in the case that we\n      // are doing refinement (source != NULL) then the symbol number is\n      // relative to this page, so we have to add the baseindex to get an\n      // absolute index.\n      const int assigned = (int)assignments->array\n        [sym + (source ? baseindex : 0)];\n\n      // the symmap maps the number of the symbol from the classifier to the\n      // order in while it was written in the symbol dict\n\n      // We have two symbol dictionaries. A global one and a per-page one.\n      int symid;\n      std::map<int, int>::const_iterator symit = symmap.find(assigned);\n      if (symit != symmap.end()) {\n        symid = symit->second;\n      } else {\n        symit = symmap2.find(assigned);\n        if (symit != symmap2.end()) {\n          symid = symit->second + symmap.size();\n        } else {\n          for (symit = symmap.begin(); symit != symmap.end(); ++symit) {\n            fprintf(stderr, \"%d \", symit->first);\n          }\n          for (symit = symmap2.begin(); symit != symmap2.end(); ++symit) {\n            fprintf(stderr, \"%d \", symit->first);\n          }\n          fprintf(stderr, \"\\n%d\\n\", assigned);\n          abort();\n        }\n      }\n#ifdef SYM_DEBUGGING\n      fprintf(stderr, \"sym: %d\\n\", symid);\n#endif\n      jbig2enc_iaid(ctx, symbits, symid);\n\n      // refinement is enabled if the original source components are given\n      if (source) {\n        // the boxes array is indexed by the number of the symbol on this page.\n        // So we subtract the number of the first symbol to get this relative\n        // number.\n        const int abssym = baseindex + sym;\n\n        PIX *symbol;\n        if (unborder_symbols) {\n          // the symbol has a 6 px border around it, which we need to remove\n          symbol = pixRemoveBorder(S(assigned), kBorderSize);\n        } else {\n          symbol = pixClone(S(assigned));\n        }\n        pixSetPadBits(symbol, 0);\n\n        const int targetw = boxes->box[sym]->w;\n        const int targeth = boxes->box[sym]->h;\n        const int targetx = boxes->box[sym]->x;\n        const int targety = boxes->box[sym]->y;\n\n        const int symboly = (int) (in_ll->y[abssym] - symbol->h) + 1;\n        const int symbolx = (int) in_ll->x[abssym];\n\n        const int deltaw = targetw - symbol->w;\n        const int deltah = targeth - symbol->h;\n        const int deltax = targetx - symbolx;\n        const int deltay = targety - symboly;\n\n        pixSetPadBits(source->pix[sym], 0);\n        // now see how well the symbol matches\n        PIX *targetcopy = pixCopy(NULL, source->pix[sym]);\n        pixRasterop(targetcopy, deltax, deltay, symbol->w, symbol->h,\n                    PIX_SRC ^ PIX_DST,\n                    symbol, 0, 0);\n        int deltacount;\n        pixCountPixels(targetcopy, &deltacount, NULL);\n#ifdef SYMBOL_COMPRESSION_DEBUGGING\n        fprintf(stderr, \"delta count: %d\\n\", deltacount);\n#endif\n        pixDestroy(&targetcopy);\n\n#ifdef SYMBOL_COMPRESSION_DEBUGGING\n          fprintf(stderr, \"refinement: dw:%d dh:%d dx:%d dy:%d w:%d h:%d\\n\",\n                  deltaw, deltah, deltax, deltay, targetw, targeth);\n          fprintf(stderr, \"  box: %d %d symbol: %d %d h:%d ll:%f %f\\n\",\n                  targetx, targety, symbolx, symboly, symbol->h,\n                  in_ll->x[abssym], in_ll->y[abssym]);\n#endif\n\n        // Note that the refinement encoding function can only cope with x\n        // offsets in [-1, 0, 1] so refinement is disabled if the offset is\n        // outside this range. This should be *very* rare.\n        if (deltacount <= refine_level || deltax < -1 || deltax > 1) {\n        //if (deltaw > 1 || deltaw < -1 || deltax || deltah || deltay) {\n          // refinement disabled.\n          jbig2enc_int(ctx, JBIG2_IARI, 0);\n          // update curs given the width of the bitmap\n          curs += (S(assigned)->w - (unborder_symbols ? 2*kBorderSize : 0)) - 1;\n        } else {\n          wibble++;\n          jbig2enc_int(ctx, JBIG2_IARI, 1);\n\n          jbig2enc_int(ctx, JBIG2_IARDW, deltaw);\n          jbig2enc_int(ctx, JBIG2_IARDH, deltah);\n          jbig2enc_int(ctx, JBIG2_IARDX, deltax - (deltaw >> 1));\n          jbig2enc_int(ctx, JBIG2_IARDY, deltay - (deltah >> 1));\n\n          jbig2enc_refine\n            (ctx, (uint8_t *) symbol->data, symbol->w, symbol->h,\n             (uint8_t *) source->pix[sym]->data, targetw, targeth,\n             deltax, -deltay);\n\n          pixDestroy(&symbol);\n          curs += targetw - 1;\n        }\n      } else {\n        // update curs given the width of the bitmap\n        curs += (S(assigned)->w - (unborder_symbols ? 2*kBorderSize : 0)) - 1;\n      }\n    }\n    // terminate the strip\n    jbig2enc_oob(ctx, JBIG2_IADS);\n    i = j;\n  }\n\n  jbig2enc_final(ctx);\n  if (ll != in_ll) ptaDestroy(&ll);\n}\n"
  },
  {
    "path": "JBig2/src/memcmp.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stddef.h>\n\n/* replacement for broken memcmp() */\n\n/*\n * compares two byte strings 'a' and 'b', both assumed to be 'len' bytes long\n * returns zero if the two strings are identical, otherwise returns -1 or 1\n * depending on the relative magnitude of the first differing elements,\n * considered as unsigned chars\n */\n\nint\nmemcmp(const void *b1, const void *b2, size_t len)\n{\n    unsigned char *a, *b;\n    size_t i;\n\n    a = (unsigned char *)b1;\n    b = (unsigned char *)b2;\n    for (i = 0; i < len; i++) {\n        if (*a != *b) {\n            /* strings differ */\n            return (*a < *b) ? -1 : 1;\n        }\n        a++;\n        b++;\n    }\n\n    /* strings match */\n    return 0;\n}\n"
  },
  {
    "path": "JBig2/src/memento.c",
    "content": "/* Copyright (C) 2009-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied, modified\n   or distributed except as expressly authorized under the terms of that\n   license. Refer to licensing information at http://www.artifex.com\n   or contact Artifex Software, Inc.,  1305 Grant Avenue - Suite 200,\n   Novato, CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/* Inspired by Fortify by Simon P Bullen. */\n\n/* Set the following if you're only looking for leaks, not memory overwrites\n * to speed the operation */\n/* #define MEMENTO_LEAKONLY */\n\n/* Set the following to keep extra details about the history of blocks */\n#define MEMENTO_DETAILS\n\n/* Don't keep blocks around if they'd mean losing more than a quarter of\n * the freelist. */\n#define MEMENTO_FREELIST_MAX_SINGLE_BLOCK (MEMENTO_FREELIST_MAX/4)\n\n#define COMPILING_MEMENTO_C\n\n/* SHUT UP, MSVC. I KNOW WHAT I AM DOING. */\n#define _CRT_SECURE_NO_WARNINGS\n\n/* We have some GS specific tweaks; more for the GS build environment than\n * anything else. */\n/* #define MEMENTO_GS_HACKS */\n\n#ifdef MEMENTO_GS_HACKS\n/* For GS we include malloc_.h. Anyone else would just include memento.h */\n#include \"malloc_.h\"\n#include \"memory_.h\"\nint atexit(void (*)(void));\n#else\n#include \"memento.h\"\n#include <stdio.h>\n#endif\n#ifndef _MSC_VER\n#include <stdint.h>\n#include <limits.h>\n#include <unistd.h>\n#endif\n\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n\n#ifdef __ANDROID__\n#define MEMENTO_ANDROID\n#include <stdio.h>\n#endif\n\n/* Hacks to portably print large sizes */\n#ifdef _MSC_VER\n#define FMTZ \"%llu\"\n#define FMTZ_CAST _int64\n#define FMTP \"0x%p\"\n#else\n#define FMTZ \"%zu\"\n#define FMTZ_CAST size_t\n#define FMTP \"%p\"\n#endif\n\n#define UB(x) ((intptr_t)((x) & 0xFF))\n#define B2I(x) (UB(x) | (UB(x)<<8) | (UB(x)<<16) | (UB(x)<<24))\n#define B2P(x) ((void *)(B2I(x) | ((B2I(x)<<16)<<16)))\n#define MEMENTO_PREFILL_UBYTE ((unsigned char)(MEMENTO_PREFILL))\n#define MEMENTO_PREFILL_USHORT (((unsigned short)MEMENTO_PREFILL_UBYTE) | (((unsigned short)MEMENTO_PREFILL_UBYTE)<<8))\n#define MEMENTO_PREFILL_UINT (((unsigned int)MEMENTO_PREFILL_USHORT) | (((unsigned int)MEMENTO_PREFILL_USHORT)<<16))\n#define MEMENTO_PREFILL_PTR (void *)(((uintptr_t)MEMENTO_PREFILL_UINT) | ((((uintptr_t)MEMENTO_PREFILL_UINT)<<16)<<16))\n#define MEMENTO_POSTFILL_UBYTE ((unsigned char)(MEMENTO_POSTFILL))\n#define MEMENTO_POSTFILL_USHORT (((unsigned short)MEMENTO_POSTFILL_UBYTE) | (((unsigned short)MEMENTO_POSTFILL_UBYTE)<<8))\n#define MEMENTO_POSTFILL_UINT (((unsigned int)MEMENTO_POSTFILL_USHORT) | (((unsigned int)MEMENTO_POSTFILL_USHORT)<<16))\n#define MEMENTO_POSTFILL_PTR (void *)(((uintptr_t)MEMENTO_POSTFILL_UINT) | ((((uintptr_t)MEMENTO_POSTFILL_UINT)<<16)<<16))\n#define MEMENTO_ALLOCFILL_UBYTE ((unsigned char)(MEMENTO_ALLOCFILL))\n#define MEMENTO_ALLOCFILL_USHORT (((unsigned short)MEMENTO_ALLOCFILL_UBYTE) | (((unsigned short)MEMENTO_ALLOCFILL_UBYTE)<<8))\n#define MEMENTO_ALLOCFILL_UINT (((unsigned int)MEMENTO_ALLOCFILL_USHORT) | (((unsigned int)MEMENTO_ALLOCFILL_USHORT)<<16))\n#define MEMENTO_ALLOCFILL_PTR (void *)(((uintptr_t)MEMENTO_ALLOCFILL_UINT) | ((((uintptr_t)MEMENTO_ALLOCFILL_UINT)<<16)<<16))\n#define MEMENTO_FREEFILL_UBYTE ((unsigned char)(MEMENTO_FREEFILL))\n#define MEMENTO_FREEFILL_USHORT (((unsigned short)MEMENTO_FREEFILL_UBYTE) | (((unsigned short)MEMENTO_FREEFILL_UBYTE)<<8))\n#define MEMENTO_FREEFILL_UINT (((unsigned int)MEMENTO_FREEFILL_USHORT) | (((unsigned int)MEMENTO_FREEFILL_USHORT)<<16))\n#define MEMENTO_FREEFILL_PTR (void *)(((uintptr_t)MEMENTO_FREEFILL_UINT) | ((((uintptr_t)MEMENTO_FREEFILL_UINT)<<16)<<16))\n\n#ifdef MEMENTO\n\n#ifndef MEMENTO_CPP_EXTRAS_ONLY\n\n#ifdef MEMENTO_ANDROID\n#include <android/log.h>\n\nstatic char log_buffer[4096];\nstatic int log_fill = 0;\n\nstatic char log_buffer2[4096];\n\nstatic int\nandroid_fprintf(FILE *file, const char *fmt, ...)\n{\n    va_list args;\n    char *p, *q;\n\n    va_start(args, fmt);\n    vsnprintf(log_buffer2, sizeof(log_buffer2)-1, fmt, args);\n    va_end(args);\n\n    /* Ensure we are always null terminated */\n    log_buffer2[sizeof(log_buffer2)-1] = 0;\n\n    p = log_buffer2;\n    q = p;\n    do\n    {\n        /* Find the end of the string, or the next \\n */\n        while (*p && *p != '\\n')\n            p++;\n\n        /* We need to output from q to p. Limit ourselves to what\n         * will fit in the existing */\n        if (p - q >= sizeof(log_buffer)-1 - log_fill)\n                p = q + sizeof(log_buffer)-1 - log_fill;\n\n        memcpy(&log_buffer[log_fill], q, p-q);\n        log_fill += p-q;\n        if (*p == '\\n')\n        {\n            log_buffer[log_fill] = 0;\n            __android_log_print(ANDROID_LOG_ERROR, \"memento\", \"%s\", log_buffer);\n            usleep(1);\n            log_fill = 0;\n            p++; /* Skip over the \\n */\n        }\n        else if (log_fill >= sizeof(log_buffer)-1)\n        {\n            log_buffer[sizeof(log_buffer2)-1] = 0;\n            __android_log_print(ANDROID_LOG_ERROR, \"memento\", \"%s\", log_buffer);\n            usleep(1);\n            log_fill = 0;\n        }\n        q = p;\n    }\n    while (*p);\n\n    return 0;\n}\n\n#define fprintf android_fprintf\n#define MEMENTO_STACKTRACE_METHOD 3\n#endif\n\n/* _WIN64 defined implies _WIN32 will be */\n#ifdef _WIN32\n#include <windows.h>\n\nstatic int\nwindows_fprintf(FILE *file, const char *fmt, ...)\n{\n    va_list args;\n    char text[4096];\n    int ret;\n\n    va_start(args, fmt);\n    ret = vfprintf(file, fmt, args);\n    va_end(args);\n\n    va_start(args, fmt);\n    vsnprintf(text, 4096, fmt, args);\n    OutputDebugStringA(text);\n    va_end(args);\n\n    return ret;\n}\n\n#define fprintf windows_fprintf\n#endif\n\n#ifndef MEMENTO_STACKTRACE_METHOD\n#ifdef __GNUC__\n#define MEMENTO_STACKTRACE_METHOD 1\n#endif\n#ifdef _WIN32\n#define MEMENTO_STACKTRACE_METHOD 2\n#endif\n#endif\n\n#if defined(__linux__)\n#define MEMENTO_HAS_FORK\n#elif defined(__APPLE__) && defined(__MACH__)\n#define MEMENTO_HAS_FORK\n#endif\n\n/* Define the underlying allocators, just in case */\nvoid *MEMENTO_UNDERLYING_MALLOC(size_t);\nvoid MEMENTO_UNDERLYING_FREE(void *);\nvoid *MEMENTO_UNDERLYING_REALLOC(void *,size_t);\nvoid *MEMENTO_UNDERLYING_CALLOC(size_t,size_t);\n\n/* And some other standard functions we use. We don't include the header\n * files, just in case they pull in unexpected others. */\nint atoi(const char *);\nchar *getenv(const char *);\n\n/* How far to search for pointers in each block when calculating nestings */\n/* mupdf needs at least 34000ish (sizeof(fz_shade))/ */\n#define MEMENTO_PTRSEARCH 65536\n\n#ifndef MEMENTO_MAXPATTERN\n#define MEMENTO_MAXPATTERN 0\n#endif\n\n#ifdef MEMENTO_GS_HACKS\n#include \"valgrind.h\"\n#else\n#ifdef HAVE_VALGRIND\n#include \"valgrind/memcheck.h\"\n#else\n#define VALGRIND_MAKE_MEM_NOACCESS(p,s)  do { } while (0==1)\n#define VALGRIND_MAKE_MEM_UNDEFINED(p,s)  do { } while (0==1)\n#define VALGRIND_MAKE_MEM_DEFINED(p,s)  do { } while (0==1)\n#endif\n#endif\n\nenum {\n    Memento_PreSize  = 16,\n    Memento_PostSize = 16\n};\n\n/* Some compile time checks */\ntypedef struct\n{\n    char MEMENTO_PRESIZE_MUST_BE_A_MULTIPLE_OF_4[Memento_PreSize & 3 ? -1 : 1];\n    char MEMENTO_POSTSIZE_MUST_BE_A_MULTIPLE_OF_4[Memento_PostSize & 3 ? -1 : 1];\n    char MEMENTO_POSTSIZE_MUST_BE_AT_LEAST_4[Memento_PostSize >= 4 ? 1 : -1];\n    char MEMENTO_PRESIZE_MUST_BE_AT_LEAST_4[Memento_PreSize >= 4 ? 1 : -1];\n} MEMENTO_SANITY_CHECK_STRUCT;\n\n#define MEMENTO_UINT32 unsigned int\n#define MEMENTO_UINT16 unsigned short\n\n#define MEMENTO_PREFILL_UINT32  ((MEMENTO_UINT32)(MEMENTO_PREFILL  | (MEMENTO_PREFILL <<8) | (MEMENTO_PREFILL <<16) |(MEMENTO_PREFILL <<24)))\n#define MEMENTO_POSTFILL_UINT16 ((MEMENTO_UINT16)(MEMENTO_POSTFILL | (MEMENTO_POSTFILL<<8)))\n#define MEMENTO_POSTFILL_UINT32 ((MEMENTO_UINT32)(MEMENTO_POSTFILL | (MEMENTO_POSTFILL<<8) | (MEMENTO_POSTFILL<<16) |(MEMENTO_POSTFILL<<24)))\n#define MEMENTO_FREEFILL_UINT16 ((MEMENTO_UINT16)(MEMENTO_FREEFILL | (MEMENTO_FREEFILL<<8)))\n#define MEMENTO_FREEFILL_UINT32 ((MEMENTO_UINT32)(MEMENTO_FREEFILL | (MEMENTO_FREEFILL<<8) | (MEMENTO_FREEFILL<<16) |(MEMENTO_FREEFILL<<24)))\n\nenum {\n    Memento_Flag_OldBlock = 1,\n    Memento_Flag_HasParent = 2,\n    Memento_Flag_BreakOnFree = 4,\n    Memento_Flag_BreakOnRealloc = 8,\n    Memento_Flag_Freed = 16,\n    Memento_Flag_KnownLeak = 32,\n    Memento_Flag_Reported = 64\n};\n\nenum {\n    Memento_EventType_malloc = 0,\n    Memento_EventType_calloc = 1,\n    Memento_EventType_realloc = 2,\n    Memento_EventType_free = 3,\n    Memento_EventType_new = 4,\n    Memento_EventType_delete = 5,\n    Memento_EventType_newArray = 6,\n    Memento_EventType_deleteArray = 7,\n    Memento_EventType_takeRef = 8,\n    Memento_EventType_dropRef = 9,\n    Memento_EventType_reference = 10\n};\n\nstatic const char *eventType[] =\n{\n    \"malloc\",\n    \"calloc\",\n    \"realloc\",\n    \"free\",\n    \"new\",\n    \"delete\",\n    \"new[]\",\n    \"delete[]\",\n    \"takeRef\",\n    \"dropRef\",\n    \"reference\"\n};\n\n/* When we list leaked blocks at the end of execution, we search for pointers\n * between blocks in order to be able to give a nice nested view.\n * Unfortunately, if you have are running your own allocator (such as\n * postscript's chunk allocator) you can often find that the header of the\n * block always contains pointers to next or previous blocks. This tends to\n * mean the nesting displayed is \"uninteresting\" at best :)\n *\n * As a hack to get around this, we have a define MEMENTO_SKIP_SEARCH that\n * indicates how many bytes to skip over at the start of the chunk.\n * This may cause us to miss true nestings, but such is life...\n */\n#ifndef MEMENTO_SEARCH_SKIP\n#ifdef MEMENTO_GS_HACKS\n#define MEMENTO_SEARCH_SKIP (2*sizeof(void *))\n#else\n#define MEMENTO_SEARCH_SKIP 0\n#endif\n#endif\n\n#define MEMENTO_CHILD_MAGIC   ((Memento_BlkHeader *)('M' | ('3' << 8) | ('m' << 16) | ('3' << 24)))\n#define MEMENTO_SIBLING_MAGIC ((Memento_BlkHeader *)('n' | ('t' << 8) | ('0' << 16) | ('!' << 24)))\n\n#ifdef MEMENTO_DETAILS\ntypedef struct Memento_BlkDetails Memento_BlkDetails;\n\nstruct Memento_BlkDetails\n{\n    Memento_BlkDetails *next;\n    char                type;\n    char                count;\n    int                 sequence;\n    void               *stack[1];\n};\n#endif /* MEMENTO_DETAILS */\n\ntypedef struct Memento_BlkHeader Memento_BlkHeader;\n\nstruct Memento_BlkHeader\n{\n    size_t               rawsize;\n    int                  sequence;\n    int                  lastCheckedOK;\n    int                  flags;\n    Memento_BlkHeader   *next;\n    Memento_BlkHeader   *prev; /* Reused as 'parent' when printing nested list */\n\n    const char          *label;\n\n    /* Entries for nesting display calculations. Set to magic\n     * values at all other time.  */\n    Memento_BlkHeader   *child;\n    Memento_BlkHeader   *sibling;\n\n#ifdef MEMENTO_DETAILS\n    Memento_BlkDetails  *details;\n    Memento_BlkDetails **details_tail;\n#endif\n\n    char                 preblk[Memento_PreSize];\n};\n\n/* In future this could (should) be a smarter data structure, like, say,\n * splay trees. For now, we use a list.\n */\ntypedef struct Memento_Blocks\n{\n    Memento_BlkHeader *head;\n    Memento_BlkHeader *tail;\n} Memento_Blocks;\n\n/* What sort of Mutex should we use? */\n#ifdef MEMENTO_LOCKLESS\ntypedef int Memento_mutex;\n\nstatic void Memento_initMutex(Memento_mutex *m)\n{\n    (void)m;\n}\n\n#define MEMENTO_DO_LOCK() do { } while (0)\n#define MEMENTO_DO_UNLOCK() do { } while (0)\n\n#else\n#if defined(_WIN32) || defined(_WIN64)\n/* Windows */\ntypedef CRITICAL_SECTION Memento_mutex;\n\nstatic void Memento_initMutex(Memento_mutex *m)\n{\n    InitializeCriticalSection(m);\n}\n\n#define MEMENTO_DO_LOCK() \\\n    EnterCriticalSection(&memento.mutex)\n#define MEMENTO_DO_UNLOCK() \\\n    LeaveCriticalSection(&memento.mutex)\n\n#else\n#include <pthread.h>\ntypedef pthread_mutex_t Memento_mutex;\n\nstatic void Memento_initMutex(Memento_mutex *m)\n{\n    pthread_mutex_init(m, NULL);\n}\n\n#define MEMENTO_DO_LOCK() \\\n    pthread_mutex_lock(&memento.mutex)\n#define MEMENTO_DO_UNLOCK() \\\n    pthread_mutex_unlock(&memento.mutex)\n\n#endif\n#endif\n\n/* And our global structure */\nstatic struct {\n    int            inited;\n    Memento_Blocks used;\n    Memento_Blocks free;\n    size_t         freeListSize;\n    int            sequence;\n    int            paranoia;\n    int            paranoidAt;\n    int            countdown;\n    int            lastChecked;\n    int            breakAt;\n    int            failAt;\n    int            failing;\n    int            nextFailAt;\n    int            squeezeAt;\n    int            squeezing;\n    int            segv;\n    int            pattern;\n    int            nextPattern;\n    int            patternBit;\n    int            leaking;\n    size_t         maxMemory;\n    size_t         alloc;\n    size_t         peakAlloc;\n    size_t         totalAlloc;\n    size_t         numMallocs;\n    size_t         numFrees;\n    size_t         numReallocs;\n    Memento_mutex  mutex;\n} memento;\n\n#define MEMENTO_EXTRASIZE (sizeof(Memento_BlkHeader) + Memento_PostSize)\n\n/* Round up size S to the next multiple of N (where N is a power of 2) */\n#define MEMENTO_ROUNDUP(S,N) ((S + N-1)&~(N-1))\n\n#define MEMBLK_SIZE(s) MEMENTO_ROUNDUP(s + MEMENTO_EXTRASIZE, MEMENTO_MAXALIGN)\n\n#define MEMBLK_FROMBLK(B)   (&((Memento_BlkHeader*)(void *)(B))[-1])\n#define MEMBLK_TOBLK(B)     ((void*)(&((Memento_BlkHeader*)(void*)(B))[1]))\n#define MEMBLK_POSTPTR(B) \\\n          (&((unsigned char *)(void *)(B))[(B)->rawsize + sizeof(Memento_BlkHeader)])\n\nenum\n{\n    SkipStackBackTraceLevels = 4\n};\n\n#if defined(MEMENTO_STACKTRACE_METHOD) && MEMENTO_STACKTRACE_METHOD == 1\nextern size_t backtrace(void **, int);\nextern void backtrace_symbols_fd(void **, size_t, int);\nextern char **backtrace_symbols(void **, size_t);\n\n#define MEMENTO_BACKTRACE_MAX 256\nstatic void (*print_stack_value)(void *address);\n\n/* Libbacktrace gubbins - relies on us having libdl to load the .so */\n#ifdef HAVE_LIBDL\n#include <dlfcn.h>\n\ntypedef void (*backtrace_error_callback) (void *data, const char *msg, int errnum);\n\ntypedef struct backtrace_state *(*backtrace_create_state_type)(\n    const char *filename, int threaded,\n    backtrace_error_callback error_callback, void *data);\n\ntypedef int (*backtrace_full_callback) (void *data, uintptr_t pc,\n                                        const char *filename, int lineno,\n                                        const char *function);\n\ntypedef int (*backtrace_pcinfo_type)(struct backtrace_state *state,\n                                     uintptr_t pc,\n                                     backtrace_full_callback callback,\n                                     backtrace_error_callback error_callback,\n                                     void *data);\n\ntypedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc,\n                                            const char *symname,\n                                            uintptr_t symval,\n                                            uintptr_t symsize);\n\ntypedef int (*backtrace_syminfo_type)(struct backtrace_state *state,\n                                      uintptr_t addr,\n                                      backtrace_syminfo_callback callback,\n                                      backtrace_error_callback error_callback,\n                                      void *data);\n\nstatic backtrace_syminfo_type backtrace_syminfo;\nstatic backtrace_create_state_type backtrace_create_state;\nstatic backtrace_pcinfo_type backtrace_pcinfo;\nstatic struct backtrace_state *my_backtrace_state;\nstatic void *libbt;\nstatic char backtrace_exe[4096];\nstatic void *current_addr;\n\nstatic void error2_cb(void *data, const char *msg, int errnum)\n{\n}\n\nstatic void syminfo_cb(void *data, uintptr_t pc, const char *symname, uintptr_t symval, uintptr_t symsize)\n{\n    if (sizeof(void *) == 4)\n        fprintf(stderr, \"    0x%08lx %s\\n\", pc, symname?symname:\"?\");\n    else\n        fprintf(stderr, \"    0x%016lx %s\\n\", pc, symname?symname:\"?\");\n}\n\nstatic void error_cb(void *data, const char *msg, int errnum)\n{\n    backtrace_syminfo(my_backtrace_state,\n                     (uintptr_t)current_addr,\n                     syminfo_cb,\n                     error2_cb,\n                     NULL);\n}\n\nstatic int full_cb(void *data, uintptr_t pc, const char *fname, int line, const char *fn)\n{\n    if (sizeof(void *) == 4)\n        fprintf(stderr, \"    0x%08lx %s(%s:%d)\\n\", pc, fn?fn:\"?\", fname?fname:\"?\", line);\n    else\n        fprintf(stderr, \"    0x%016lx %s(%s:%d)\\n\", pc, fn?fn:\"?\", fname?fname:\"?\", line);\n    return 0;\n}\n\nstatic void print_stack_libbt(void *addr)\n{\n    current_addr = addr;\n    backtrace_pcinfo(my_backtrace_state,\n                     (uintptr_t)addr,\n                     full_cb,\n                     error_cb,\n                     NULL);\n}\n\nstatic void print_stack_libbt_failed(void *addr)\n{\n    char **strings;\n#if 0\n    /* Let's use a hack from Julian Smith to call gdb to extract the information */\n    /* Disabled for now, as I can't make this work. */\n    static char command[1024];\n    int e;\n    static int gdb_invocation_failed = 0;\n\n    if (gdb_invocation_failed == 0)\n    {\n        snprintf(command, sizeof(command),\n                 //\"gdb -q --batch -p=%i -ex 'info line *%p' -ex quit 2>/dev/null\",\n                 \"gdb -q --batch -p=%i -ex 'info line *%p' -ex quit 2>/dev/null| egrep -v '(Thread debugging using)|(Using host libthread_db library)|(A debugging session is active)|(will be detached)|(Quit anyway)|(No such file or directory)|(^0x)|(^$)'\",\n                 getpid(), addr);\n    printf(\"%s\\n\", command);\n        e = system(command);\n        if (e == 0)\n            return; /* That'll do! */\n        gdb_invocation_failed = 1; /* If it's failed once, it'll probably keep failing. */\n    }\n#endif\n\n    /* We couldn't even get gdb! Make do. */\n    strings = backtrace_symbols(&addr, 1);\n\n    if (strings == NULL || strings[0] == NULL)\n    {\n        if (sizeof(void *) == 4)\n            fprintf(stderr, \"    [0x%08lx]\\n\", (uintptr_t)addr);\n        else\n            fprintf(stderr, \"    [0x%016lx]\\n\", (uintptr_t)addr);\n    }\n    else\n    {\n        fprintf(stderr, \"    %s\\n\", strings[0]);\n    }\n    (free)(strings);\n}\n\nstatic int init_libbt(void)\n{\n    static int libbt_inited = 0;\n\n    if (libbt_inited)\n        return 0;\n    libbt_inited = 1;\n\n    libbt = dlopen(\"libbacktrace.so\", RTLD_LAZY);\n    if (libbt == NULL)\n        libbt = dlopen(\"/opt/lib/libbacktrace.so\", RTLD_LAZY);\n    if (libbt == NULL)\n        libbt = dlopen(\"/lib/libbacktrace.so\", RTLD_LAZY);\n    if (libbt == NULL)\n        libbt = dlopen(\"/usr/lib/libbacktrace.so\", RTLD_LAZY);\n    if (libbt == NULL)\n        libbt = dlopen(\"/usr/local/lib/libbacktrace.so\", RTLD_LAZY);\n    if (libbt == NULL)\n        goto fail;\n\n    backtrace_create_state = dlsym(libbt, \"backtrace_create_state\");\n    backtrace_syminfo      = dlsym(libbt, \"backtrace_syminfo\");\n    backtrace_pcinfo       = dlsym(libbt, \"backtrace_pcinfo\");\n\n    if (backtrace_create_state == NULL ||\n        backtrace_syminfo == NULL ||\n        backtrace_pcinfo == NULL)\n    {\n        goto fail;\n    }\n\n    my_backtrace_state = backtrace_create_state(backtrace_exe,\n                                                1 /*BACKTRACE_SUPPORTS_THREADS*/,\n                                                error_cb,\n                                                NULL);\n    if (my_backtrace_state == NULL)\n        goto fail;\n\n    print_stack_value = print_stack_libbt;\n\n    return 1;\n\n fail:\n    fprintf(stderr,\n            \"MEMENTO: libbacktrace.so failed to load; backtraces will be sparse.\\n\"\n            \"MEMENTO: See memento.h for how to rectify this.\\n\");\n    libbt = NULL;\n    backtrace_create_state = NULL;\n    backtrace_syminfo = NULL;\n    print_stack_value = print_stack_libbt_failed;\n    return 0;\n}\n#endif\n\nstatic void print_stack_default(void *addr)\n{\n    char **strings = backtrace_symbols(&addr, 1);\n\n    if (strings == NULL || strings[0] == NULL)\n    {\n        fprintf(stderr, \"    [\"FMTP\"]\\n\", addr);\n    }\n#ifdef HAVE_LIBDL\n    else if (strchr(strings[0], ':') == NULL)\n    {\n        /* Probably a \"path [address]\" format string */\n        char *s = strchr(strings[0], ' ');\n\n        if (s != strings[0])\n        {\n            memcpy(backtrace_exe, strings[0], s - strings[0]);\n            backtrace_exe[s-strings[0]] = 0;\n            init_libbt();\n                print_stack_value(addr);\n        }\n    }\n#endif\n    else\n    {\n        fprintf(stderr, \"    %s\\n\", strings[0]);\n    }\n    free(strings);\n}\n\nstatic void Memento_initStacktracer(void)\n{\n    print_stack_value = print_stack_default;\n}\n\nstatic int Memento_getStacktrace(void **stack, int *skip)\n{\n    size_t num;\n\n    num = backtrace(&stack[0], MEMENTO_BACKTRACE_MAX);\n\n    *skip = SkipStackBackTraceLevels;\n    if (num <= SkipStackBackTraceLevels)\n        return 0;\n    return (int)(num-SkipStackBackTraceLevels);\n}\n\nstatic void Memento_showStacktrace(void **stack, int numberOfFrames)\n{\n    int i;\n\n    for (i = 0; i < numberOfFrames; i++)\n    {\n        print_stack_value(stack[i]);\n    }\n}\n#elif defined(MEMENTO_STACKTRACE_METHOD) && MEMENTO_STACKTRACE_METHOD == 2\n#include <Windows.h>\n\n/* We use DbgHelp.dll rather than DbgHelp.lib. This avoids us needing\n * extra link time complications, and enables us to fall back gracefully\n * if the DLL cannot be found.\n *\n * To achieve this we have our own potted versions of the required types\n * inline here.\n */\n#ifdef _WIN64\ntypedef DWORD64 DWORD_NATIVESIZED;\n#else\ntypedef DWORD DWORD_NATIVESIZED;\n#endif\n\n#define MEMENTO_BACKTRACE_MAX 64\n\ntypedef USHORT (__stdcall *My_CaptureStackBackTraceType)(__in ULONG, __in ULONG, __out PVOID*, __out_opt PULONG);\n\ntypedef struct MY_IMAGEHLP_LINE {\n    DWORD    SizeOfStruct;\n    PVOID    Key;\n    DWORD    LineNumber;\n    PCHAR    FileName;\n    DWORD_NATIVESIZED    Address;\n} MY_IMAGEHLP_LINE, *MY_PIMAGEHLP_LINE;\n\ntypedef BOOL (__stdcall *My_SymGetLineFromAddrType)(HANDLE hProcess, DWORD_NATIVESIZED dwAddr, PDWORD pdwDisplacement, MY_PIMAGEHLP_LINE Line);\n\ntypedef struct MY_SYMBOL_INFO {\n    ULONG       SizeOfStruct;\n    ULONG       TypeIndex;        // Type Index of symbol\n    ULONG64     Reserved[2];\n    ULONG       info;\n    ULONG       Size;\n    ULONG64     ModBase;          // Base Address of module containing this symbol\n    ULONG       Flags;\n    ULONG64     Value;            // Value of symbol, ValuePresent should be 1\n    ULONG64     Address;          // Address of symbol including base address of module\n    ULONG       Register;         // register holding value or pointer to value\n    ULONG       Scope;            // scope of the symbol\n    ULONG       Tag;              // pdb classification\n    ULONG       NameLen;          // Actual length of name\n    ULONG       MaxNameLen;\n    CHAR        Name[1];          // Name of symbol\n} MY_SYMBOL_INFO, *MY_PSYMBOL_INFO;\n\ntypedef BOOL (__stdcall *My_SymFromAddrType)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, MY_PSYMBOL_INFO Symbol);\ntypedef BOOL (__stdcall *My_SymInitializeType)(HANDLE hProcess, PSTR UserSearchPath, BOOL fInvadeProcess);\n\nstatic My_CaptureStackBackTraceType Memento_CaptureStackBackTrace;\nstatic My_SymGetLineFromAddrType Memento_SymGetLineFromAddr;\nstatic My_SymFromAddrType Memento_SymFromAddr;\nstatic My_SymInitializeType Memento_SymInitialize;\nstatic HANDLE Memento_process;\n\nstatic void Memento_initStacktracer(void)\n{\n    HMODULE mod = LoadLibrary(\"kernel32.dll\");\n\n    if (mod == NULL)\n        return;\n    Memento_CaptureStackBackTrace = (My_CaptureStackBackTraceType)(GetProcAddress(mod, \"RtlCaptureStackBackTrace\"));\n    if (Memento_CaptureStackBackTrace == NULL)\n        return;\n    mod = LoadLibrary(\"Dbghelp.dll\");\n    if (mod == NULL) {\n        Memento_CaptureStackBackTrace = NULL;\n        return;\n    }\n    Memento_SymGetLineFromAddr =\n            (My_SymGetLineFromAddrType)(GetProcAddress(mod,\n#ifdef _WIN64\n                                                       \"SymGetLineFromAddr64\"\n#else\n                                                       \"SymGetLineFromAddr\"\n#endif\n                                        ));\n    if (Memento_SymGetLineFromAddr == NULL) {\n        Memento_CaptureStackBackTrace = NULL;\n        return;\n    }\n    Memento_SymFromAddr = (My_SymFromAddrType)(GetProcAddress(mod, \"SymFromAddr\"));\n    if (Memento_SymFromAddr == NULL) {\n        Memento_CaptureStackBackTrace = NULL;\n        return;\n    }\n    Memento_SymInitialize = (My_SymInitializeType)(GetProcAddress(mod, \"SymInitialize\"));\n    if (Memento_SymInitialize == NULL) {\n        Memento_CaptureStackBackTrace = NULL;\n        return;\n    }\n    Memento_process = GetCurrentProcess();\n    Memento_SymInitialize(Memento_process, NULL, TRUE);\n}\n\nstatic int Memento_getStacktrace(void **stack, int *skip)\n{\n    if (Memento_CaptureStackBackTrace == NULL)\n        return 0;\n\n    *skip = 0;\n    /* Limit us to 63 levels due to windows bug */\n    return Memento_CaptureStackBackTrace(SkipStackBackTraceLevels, 63-SkipStackBackTraceLevels, stack, NULL);\n}\n\nstatic void Memento_showStacktrace(void **stack, int numberOfFrames)\n{\n    MY_IMAGEHLP_LINE line;\n    int i;\n    char symbol_buffer[sizeof(MY_SYMBOL_INFO) + 1024 + 1];\n    MY_SYMBOL_INFO *symbol = (MY_SYMBOL_INFO *)symbol_buffer;\n\n    symbol->MaxNameLen = 1024;\n    symbol->SizeOfStruct = sizeof(MY_SYMBOL_INFO);\n    line.SizeOfStruct = sizeof(MY_IMAGEHLP_LINE);\n    for (i = 0; i < numberOfFrames; i++)\n    {\n        DWORD64 dwDisplacement64;\n        DWORD dwDisplacement;\n        Memento_SymFromAddr(Memento_process, (DWORD64)(stack[i]), &dwDisplacement64, symbol);\n        Memento_SymGetLineFromAddr(Memento_process, (DWORD_NATIVESIZED)(stack[i]), &dwDisplacement, &line);\n        fprintf(stderr, \"    %s in %s:%d\\n\", symbol->Name, line.FileName, line.LineNumber);\n    }\n}\n#elif defined(MEMENTO_STACKTRACE_METHOD) && MEMENTO_STACKTRACE_METHOD == 3\n\n#include <unwind.h>\n#include <dlfcn.h>\n\n/* From cxxabi.h */\nextern char* __cxa_demangle(const char* mangled_name,\n                            char*       output_buffer,\n                            size_t*     length,\n                            int*        status);\n\nstatic void Memento_initStacktracer(void)\n{\n}\n\n#define MEMENTO_BACKTRACE_MAX 256\n\ntypedef struct\n{\n    int count;\n    void **addr;\n} my_unwind_details;\n\nstatic _Unwind_Reason_Code unwind_populate_callback(struct _Unwind_Context *context,\n                                                    void *arg)\n{\n    my_unwind_details *uw = (my_unwind_details *)arg;\n    int count = uw->count;\n\n    if (count >= MEMENTO_BACKTRACE_MAX)\n        return _URC_END_OF_STACK;\n\n    uw->addr[count] = (void *)_Unwind_GetIP(context);\n    uw->count++;\n\n    return _URC_NO_REASON;\n}\n\nstatic int Memento_getStacktrace(void **stack, int *skip)\n{\n    my_unwind_details uw = { 0, stack };\n\n    *skip = 0;\n\n    /* Collect the backtrace. Deliberately only unwind once,\n     * and avoid using malloc etc until this completes just\n     * in case. */\n    _Unwind_Backtrace(unwind_populate_callback, &uw);\n    if (uw.count <= SkipStackBackTraceLevels)\n        return 0;\n\n    *skip = SkipStackBackTraceLevels;\n    return uw.count-SkipStackBackTraceLevels;\n}\n\nstatic void Memento_showStacktrace(void **stack, int numberOfFrames)\n{\n    int i;\n\n    for (i = 0; i < numberOfFrames; i++)\n    {\n        Dl_info info;\n        if (dladdr(stack[i], &info))\n        {\n            int status = 0;\n            const char *sym = info.dli_sname ? info.dli_sname : \"<unknown>\";\n            char *demangled = __cxa_demangle(sym, NULL, 0, &status);\n            int offset = stack[i] - info.dli_saddr;\n            fprintf(stderr, \"    [\"FMTP\"]%s(+0x%x)\\n\", stack[i], demangled && status == 0 ? demangled : sym, offset);\n            free(demangled);\n        }\n        else\n        {\n            fprintf(stderr, \"    [\"FMTP\"]\\n\", stack[i]);\n        }\n    }\n}\n\n#else\nstatic void Memento_initStacktracer(void)\n{\n}\n\nstatic int Memento_getStacktrace(void **stack, int *skip)\n{\n    *skip = 0;\n    return 0;\n}\n\nstatic void Memento_showStacktrace(void **stack, int numberOfFrames)\n{\n}\n#endif /* MEMENTO_STACKTRACE_METHOD */\n\n#ifdef MEMENTO_DETAILS\nstatic void Memento_storeDetails(Memento_BlkHeader *head, int type)\n{\n    void *stack[MEMENTO_BACKTRACE_MAX];\n    Memento_BlkDetails *details;\n    int count;\n    int skip;\n\n    if (head == NULL)\n        return;\n\n#ifdef MEMENTO_STACKTRACE_METHOD\n    count = Memento_getStacktrace(stack, &skip);\n#else\n    skip = 0;\n    count = 0;\n#endif\n\n    details = MEMENTO_UNDERLYING_MALLOC(sizeof(*details) + (count-1) * sizeof(void *));\n    if (details == NULL)\n        return;\n\n    if (count)\n        memcpy(&details->stack, &stack[skip], count * sizeof(void *));\n\n    details->type = type;\n    details->count = count;\n    details->sequence = memento.sequence;\n    details->next = NULL;\n    VALGRIND_MAKE_MEM_DEFINED(&head->details_tail, sizeof(head->details_tail));\n    *head->details_tail = details;\n    head->details_tail = &details->next;\n    VALGRIND_MAKE_MEM_NOACCESS(&head->details_tail, sizeof(head->details_tail));\n}\n#endif\n\nvoid (Memento_bt)(void)\n{\n#ifdef MEMENTO_STACKTRACE_METHOD\n    void *stack[MEMENTO_BACKTRACE_MAX];\n    int count;\n    int skip;\n\n    count = Memento_getStacktrace(stack, &skip);\n    Memento_showStacktrace(&stack[skip-2], count-skip+2);\n#endif\n}\n\nstatic void Memento_bt_internal(int skip2)\n{\n#ifdef MEMENTO_STACKTRACE_METHOD\n    void *stack[MEMENTO_BACKTRACE_MAX];\n    int count;\n    int skip;\n\n    count = Memento_getStacktrace(stack, &skip);\n    Memento_showStacktrace(&stack[skip+skip2], count-skip-skip2);\n#endif\n}\n\nstatic int Memento_checkAllMemoryLocked(void);\n\nvoid Memento_breakpoint(void)\n{\n    /* A handy externally visible function for breakpointing */\n#if 0 /* Enable this to force automatic breakpointing */\n#ifndef NDEBUG\n#ifdef _MSC_VER\n    __asm int 3;\n#endif\n#endif\n#endif\n}\n\nstatic void Memento_init(void);\n\n#define MEMENTO_LOCK() \\\ndo { if (!memento.inited) Memento_init(); MEMENTO_DO_LOCK(); } while (0)\n\n#define MEMENTO_UNLOCK() \\\ndo { MEMENTO_DO_UNLOCK(); } while (0)\n\n/* Do this as a macro to prevent another level in the callstack,\n * which is annoying while stepping. */\n#define Memento_breakpointLocked() \\\ndo { MEMENTO_UNLOCK(); Memento_breakpoint(); MEMENTO_LOCK(); } while (0)\n\nstatic void Memento_addBlockHead(Memento_Blocks    *blks,\n                                 Memento_BlkHeader *b,\n                                 int                type)\n{\n    if (blks->tail == NULL)\n        blks->tail = b;\n    b->next    = blks->head;\n    b->prev    = NULL;\n    if (blks->head)\n    {\n        VALGRIND_MAKE_MEM_DEFINED(&blks->head->prev, sizeof(blks->head->prev));\n        blks->head->prev = b;\n        VALGRIND_MAKE_MEM_NOACCESS(&blks->head->prev, sizeof(blks->head->prev));\n    }\n    blks->head = b;\n#ifndef MEMENTO_LEAKONLY\n    memset(b->preblk, MEMENTO_PREFILL, Memento_PreSize);\n    memset(MEMBLK_POSTPTR(b), MEMENTO_POSTFILL, Memento_PostSize);\n#endif\n    VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_POSTPTR(b), Memento_PostSize);\n    if (type == 0) { /* malloc */\n        VALGRIND_MAKE_MEM_UNDEFINED(MEMBLK_TOBLK(b), b->rawsize);\n    } else if (type == 1) { /* free */\n        VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_TOBLK(b), b->rawsize);\n    }\n    VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(Memento_BlkHeader));\n}\n\nstatic void Memento_addBlockTail(Memento_Blocks    *blks,\n                                 Memento_BlkHeader *b,\n                                 int                type)\n{\n    VALGRIND_MAKE_MEM_DEFINED(&blks->tail, sizeof(Memento_BlkHeader *));\n    if (blks->head == NULL)\n        blks->head = b;\n    b->prev = blks->tail;\n    b->next = NULL;\n    if (blks->tail) {\n        VALGRIND_MAKE_MEM_DEFINED(&blks->tail->next, sizeof(blks->tail->next));\n        blks->tail->next = b;\n        VALGRIND_MAKE_MEM_NOACCESS(&blks->tail->next, sizeof(blks->tail->next));\n    }\n    blks->tail = b;\n#ifndef MEMENTO_LEAKONLY\n    memset(b->preblk, MEMENTO_PREFILL, Memento_PreSize);\n    memset(MEMBLK_POSTPTR(b), MEMENTO_POSTFILL, Memento_PostSize);\n#endif\n    VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_POSTPTR(b), Memento_PostSize);\n    if (type == 0) { /* malloc */\n        VALGRIND_MAKE_MEM_UNDEFINED(MEMBLK_TOBLK(b), b->rawsize);\n    } else if (type == 1) { /* free */\n        VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_TOBLK(b), b->rawsize);\n    }\n    VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(Memento_BlkHeader));\n    VALGRIND_MAKE_MEM_NOACCESS(&blks->tail, sizeof(Memento_BlkHeader *));\n}\n\ntypedef struct BlkCheckData {\n    int found;\n    int preCorrupt;\n    int postCorrupt;\n    int freeCorrupt;\n    size_t index;\n} BlkCheckData;\n\n#ifndef MEMENTO_LEAKONLY\nstatic int Memento_Internal_checkAllocedBlock(Memento_BlkHeader *b, void *arg)\n{\n    int             i;\n    MEMENTO_UINT32 *ip;\n    unsigned char  *p;\n    BlkCheckData   *data = (BlkCheckData *)arg;\n\n    ip = (MEMENTO_UINT32 *)(void *)(b->preblk);\n    i = Memento_PreSize>>2;\n    do {\n        if (*ip++ != MEMENTO_PREFILL_UINT32)\n            goto pre_corrupt;\n    } while (--i);\n    if (0) {\npre_corrupt:\n        data->preCorrupt = 1;\n    }\n    /* Postfill may not be aligned, so have to be slower */\n    p = MEMBLK_POSTPTR(b);\n    i = Memento_PostSize-4;\n    if ((intptr_t)p & 1)\n    {\n        if (*p++ != MEMENTO_POSTFILL)\n            goto post_corrupt;\n        i--;\n    }\n    if ((intptr_t)p & 2)\n    {\n        if (*(MEMENTO_UINT16 *)p != MEMENTO_POSTFILL_UINT16)\n            goto post_corrupt;\n        p += 2;\n        i -= 2;\n    }\n    do {\n        if (*(MEMENTO_UINT32 *)p != MEMENTO_POSTFILL_UINT32)\n            goto post_corrupt;\n        p += 4;\n        i -= 4;\n    } while (i >= 0);\n    if (i & 2)\n    {\n        if (*(MEMENTO_UINT16 *)p != MEMENTO_POSTFILL_UINT16)\n            goto post_corrupt;\n        p += 2;\n    }\n    if (i & 1)\n    {\n        if (*p != MEMENTO_POSTFILL)\n            goto post_corrupt;\n    }\n    if (0) {\npost_corrupt:\n        data->postCorrupt = 1;\n    }\n    if ((data->freeCorrupt | data->preCorrupt | data->postCorrupt) == 0) {\n        b->lastCheckedOK = memento.sequence;\n    }\n    data->found |= 1;\n    return 0;\n}\n\nstatic int Memento_Internal_checkFreedBlock(Memento_BlkHeader *b, void *arg)\n{\n    size_t         i;\n    unsigned char *p;\n    BlkCheckData  *data = (BlkCheckData *)arg;\n\n    p = MEMBLK_TOBLK(b); /* p will always be aligned */\n    i = b->rawsize;\n    /* Attempt to speed this up by checking an (aligned) int at a time */\n    if (i >= 4) {\n        i -= 4;\n        do {\n            if (*(MEMENTO_UINT32 *)p != MEMENTO_FREEFILL_UINT32)\n                goto mismatch4;\n            p += 4;\n            i -= 4;\n\t} while (i > 0);\n        i += 4;\n    }\n    if (i & 2) {\n        if (*(MEMENTO_UINT16 *)p != MEMENTO_FREEFILL_UINT16)\n            goto mismatch;\n        p += 2;\n        i -= 2;\n    }\n    if (0) {\nmismatch4:\n        i += 4;\n    }\nmismatch:\n    while (i) {\n        if (*p++ != (unsigned char)MEMENTO_FREEFILL)\n            break;\n        i--;\n    }\n    if (i) {\n        data->freeCorrupt = 1;\n        data->index       = b->rawsize-i;\n    }\n    return Memento_Internal_checkAllocedBlock(b, arg);\n}\n#endif /* MEMENTO_LEAKONLY */\n\nstatic void Memento_removeBlock(Memento_Blocks    *blks,\n                                Memento_BlkHeader *b)\n{\n    VALGRIND_MAKE_MEM_DEFINED(b, sizeof(*b));\n    if (b->next) {\n        VALGRIND_MAKE_MEM_DEFINED(&b->next->prev, sizeof(b->next->prev));\n        b->next->prev = b->prev;\n        VALGRIND_MAKE_MEM_NOACCESS(&b->next->prev, sizeof(b->next->prev));\n    }\n    if (b->prev) {\n        VALGRIND_MAKE_MEM_DEFINED(&b->prev->next, sizeof(b->prev->next));\n        b->prev->next = b->next;\n        VALGRIND_MAKE_MEM_NOACCESS(&b->prev->next, sizeof(b->prev->next));\n    }\n    if (blks->tail == b)\n        blks->tail = b->prev;\n    if (blks->head == b)\n        blks->head = b->next;\n}\n\nstatic void free_block(Memento_BlkHeader *head)\n{\n#ifdef MEMENTO_DETAILS\n    Memento_BlkDetails *details = head->details;\n\n    while (details)\n    {\n        Memento_BlkDetails *next = details->next;\n        MEMENTO_UNDERLYING_FREE(details);\n        details = next;\n    }\n#endif\n    MEMENTO_UNDERLYING_FREE(head);\n}\n\nstatic int Memento_Internal_makeSpace(size_t space)\n{\n    /* If too big, it can never go on the freelist */\n    if (space > MEMENTO_FREELIST_MAX_SINGLE_BLOCK)\n        return 0;\n    /* Pretend we added it on. */\n    memento.freeListSize += space;\n    /* Ditch blocks until it fits within our limit */\n    while (memento.freeListSize > MEMENTO_FREELIST_MAX) {\n        Memento_BlkHeader *head = memento.free.head;\n        VALGRIND_MAKE_MEM_DEFINED(head, sizeof(*head));\n        memento.free.head = head->next;\n        memento.freeListSize -= MEMBLK_SIZE(head->rawsize);\n        free_block(head);\n    }\n    /* Make sure we haven't just completely emptied the free list */\n    /* (This should never happen, but belt and braces... */\n    if (memento.free.head == NULL)\n        memento.free.tail = NULL;\n    return 1;\n}\n\nstatic int Memento_appBlocks(Memento_Blocks *blks,\n                             int             (*app)(Memento_BlkHeader *,\n                                                    void *),\n                             void           *arg)\n{\n    Memento_BlkHeader *head = blks->head;\n    Memento_BlkHeader *next;\n    int                result;\n    while (head) {\n        VALGRIND_MAKE_MEM_DEFINED(head, sizeof(Memento_BlkHeader));\n        VALGRIND_MAKE_MEM_DEFINED(MEMBLK_TOBLK(head),\n                                  head->rawsize + Memento_PostSize);\n        result = app(head, arg);\n        next = head->next;\n        VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_POSTPTR(head), Memento_PostSize);\n        VALGRIND_MAKE_MEM_NOACCESS(head, sizeof(Memento_BlkHeader));\n        if (result)\n            return result;\n        head = next;\n    }\n    return 0;\n}\n\n#ifndef MEMENTO_LEAKONLY\n/* Distrustful - check the block is a real one */\nstatic int Memento_appBlockUser(Memento_Blocks    *blks,\n                                int                (*app)(Memento_BlkHeader *,\n                                                          void *),\n                                void              *arg,\n                                Memento_BlkHeader *b)\n{\n    Memento_BlkHeader *head = blks->head;\n    Memento_BlkHeader *next;\n    int                result;\n    while (head && head != b) {\n        VALGRIND_MAKE_MEM_DEFINED(head, sizeof(Memento_BlkHeader));\n        next = head->next;\n       VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_POSTPTR(head), Memento_PostSize);\n        head = next;\n    }\n    if (head == b) {\n        VALGRIND_MAKE_MEM_DEFINED(head, sizeof(Memento_BlkHeader));\n        VALGRIND_MAKE_MEM_DEFINED(MEMBLK_TOBLK(head),\n                                  head->rawsize + Memento_PostSize);\n        result = app(head, arg);\n        VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_POSTPTR(head), Memento_PostSize);\n        VALGRIND_MAKE_MEM_NOACCESS(head, sizeof(Memento_BlkHeader));\n        return result;\n    }\n    return 0;\n}\n\nstatic int Memento_appBlock(Memento_Blocks    *blks,\n                            int                (*app)(Memento_BlkHeader *,\n                                                      void *),\n                            void              *arg,\n                            Memento_BlkHeader *b)\n{\n    int result;\n    VALGRIND_MAKE_MEM_DEFINED(b, sizeof(Memento_BlkHeader));\n    VALGRIND_MAKE_MEM_DEFINED(MEMBLK_TOBLK(b),\n                              b->rawsize + Memento_PostSize);\n    result = app(b, arg);\n    VALGRIND_MAKE_MEM_NOACCESS(MEMBLK_POSTPTR(b), Memento_PostSize);\n    VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(Memento_BlkHeader));\n    return result;\n}\n#endif /* MEMENTO_LEAKONLY */\n\nstatic int showBlock(Memento_BlkHeader *b, int space)\n{\n    int seq;\n    VALGRIND_MAKE_MEM_DEFINED(b, sizeof(Memento_BlkHeader));\n    fprintf(stderr, FMTP\":(size=\" FMTZ \",num=%d)\",\n            MEMBLK_TOBLK(b), (FMTZ_CAST)b->rawsize, b->sequence);\n    if (b->label)\n        fprintf(stderr, \"%c(%s)\", space, b->label);\n    if (b->flags & Memento_Flag_KnownLeak)\n        fprintf(stderr, \"(Known Leak)\");\n    seq = b->sequence;\n    VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(Memento_BlkHeader));\n    return seq;\n}\n\nstatic void blockDisplay(Memento_BlkHeader *b, int n)\n{\n    n++;\n    while (n > 40)\n    {\n            fprintf(stderr, \"*\");\n            n -= 40;\n    }\n    while(n > 0)\n    {\n        int i = n;\n        if (i > 32)\n            i = 32;\n        n -= i;\n        fprintf(stderr, \"%s\", &\"                                \"[32-i]);\n    }\n    showBlock(b, '\\t');\n    fprintf(stderr, \"\\n\");\n}\n\nstatic int Memento_listBlock(Memento_BlkHeader *b,\n                             void              *arg)\n{\n    size_t *counts = (size_t *)arg;\n    blockDisplay(b, 0);\n    counts[0]++;\n    VALGRIND_MAKE_MEM_DEFINED(b, sizeof(Memento_BlkHeader));\n    counts[1]+= b->rawsize;\n    VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(Memento_BlkHeader));\n    return 0;\n}\n\nstatic void doNestedDisplay(Memento_BlkHeader *b,\n                            int depth)\n{\n    /* Try and avoid recursion if we can help it */\n    do {\n        Memento_BlkHeader *c = NULL;\n        blockDisplay(b, depth);\n        VALGRIND_MAKE_MEM_DEFINED(b, sizeof(Memento_BlkHeader));\n        if (b->sibling) {\n            c = b->child;\n            b = b->sibling;\n        } else {\n            b = b->child;\n            depth++;\n        }\n        VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(Memento_BlkHeader));\n        if (c)\n            doNestedDisplay(c, depth+1);\n    } while (b);\n}\n\nstatic int ptrcmp(const void *a_, const void *b_)\n{\n    const char **a = (const char **)a_;\n    const char **b = (const char **)b_;\n    return (int)(*a-*b);\n}\n\nstatic\nint Memento_listBlocksNested(void)\n{\n    int count, i;\n    size_t size;\n    Memento_BlkHeader *b, *prev;\n    void **blocks, *minptr, *maxptr;\n    intptr_t mask;\n\n    /* Count the blocks */\n    count = 0;\n    size = 0;\n    for (b = memento.used.head; b; b = b->next) {\n        VALGRIND_MAKE_MEM_DEFINED(b, sizeof(*b));\n        size += b->rawsize;\n        count++;\n    }\n\n    /* Make our block list */\n    blocks = MEMENTO_UNDERLYING_MALLOC(sizeof(void *) * count);\n    if (blocks == NULL)\n        return 1;\n\n    /* Populate our block list */\n    b = memento.used.head;\n    minptr = maxptr = MEMBLK_TOBLK(b);\n    mask = (intptr_t)minptr;\n    for (i = 0; b; b = b->next, i++) {\n        void *p = MEMBLK_TOBLK(b);\n        mask &= (intptr_t)p;\n        if (p < minptr)\n            minptr = p;\n        if (p > maxptr)\n            maxptr = p;\n        blocks[i] = p;\n        b->flags &= ~Memento_Flag_HasParent;\n        b->child   = NULL;\n        b->sibling = NULL;\n        b->prev    = NULL; /* parent */\n    }\n    qsort(blocks, count, sizeof(void *), ptrcmp);\n\n    /* Now, calculate tree */\n    for (b = memento.used.head; b; b = b->next) {\n        char *p = MEMBLK_TOBLK(b);\n        int end = (b->rawsize < MEMENTO_PTRSEARCH ? b->rawsize : MEMENTO_PTRSEARCH);\n        for (i = MEMENTO_SEARCH_SKIP; i < end; i += sizeof(void *)) {\n            void *q = *(void **)(&p[i]);\n            void **r;\n\n            /* Do trivial checks on pointer */\n            if ((mask & (intptr_t)q) != mask || q < minptr || q > maxptr)\n                continue;\n\n            /* Search for pointer */\n            r = bsearch(&q, blocks, count, sizeof(void *), ptrcmp);\n            if (r) {\n                /* Found child */\n                Memento_BlkHeader *child = MEMBLK_FROMBLK(*r);\n                Memento_BlkHeader *parent;\n\n                /* We're assuming tree structure, not graph - ignore second\n                 * and subsequent pointers. */\n                if (child->prev != NULL) /* parent */\n                    continue;\n                if (child->flags & Memento_Flag_HasParent)\n                    continue;\n\n                /* Not interested in pointers to ourself! */\n                if (child == b)\n                        continue;\n\n                /* We're also assuming acyclicness here. If this is one of\n                 * our parents, ignore it. */\n                parent = b->prev; /* parent */\n                while (parent != NULL && parent != child)\n                    parent = parent->prev; /* parent */\n                if (parent == child)\n                    continue;\n\n                child->sibling = b->child;\n                b->child = child;\n                child->prev = b; /* parent */\n                child->flags |= Memento_Flag_HasParent;\n            }\n        }\n    }\n\n    /* Now display with nesting */\n    for (b = memento.used.head; b; b = b->next) {\n        if ((b->flags & Memento_Flag_HasParent) == 0)\n            doNestedDisplay(b, 0);\n    }\n    fprintf(stderr, \" Total number of blocks = %d\\n\", count);\n    fprintf(stderr, \" Total size of blocks = \"FMTZ\"\\n\", (FMTZ_CAST)size);\n\n    MEMENTO_UNDERLYING_FREE(blocks);\n\n    /* Now put the blocks back for valgrind, and restore the prev\n     * and magic values. */\n    prev = NULL;\n    for (b = memento.used.head; b;) {\n      Memento_BlkHeader *next = b->next;\n      b->prev = prev;\n      b->child = MEMENTO_CHILD_MAGIC;\n      b->sibling = MEMENTO_SIBLING_MAGIC;\n      prev = b;\n      VALGRIND_MAKE_MEM_NOACCESS(b, sizeof(*b));\n      b = next;\n    }\n\n    return 0;\n}\n\nvoid Memento_listBlocks(void)\n{\n    MEMENTO_LOCK();\n    fprintf(stderr, \"Allocated blocks:\\n\");\n    if (Memento_listBlocksNested())\n    {\n        size_t counts[2];\n        counts[0] = 0;\n        counts[1] = 0;\n        Memento_appBlocks(&memento.used, Memento_listBlock, &counts[0]);\n        fprintf(stderr, \" Total number of blocks = \"FMTZ\"\\n\", (FMTZ_CAST)counts[0]);\n        fprintf(stderr, \" Total size of blocks = \"FMTZ\"\\n\", (FMTZ_CAST)counts[1]);\n    }\n    MEMENTO_UNLOCK();\n}\n\nstatic int Memento_listNewBlock(Memento_BlkHeader *b,\n                                void              *arg)\n{\n    if (b->flags & Memento_Flag_OldBlock)\n        return 0;\n    b->flags |= Memento_Flag_OldBlock;\n    return Memento_listBlock(b, arg);\n}\n\nvoid Memento_listNewBlocks(void)\n{\n    size_t counts[2];\n    MEMENTO_LOCK();\n    counts[0] = 0;\n    counts[1] = 0;\n    fprintf(stderr, \"Blocks allocated and still extant since last list:\\n\");\n    Memento_appBlocks(&memento.used, Memento_listNewBlock, &counts[0]);\n    fprintf(stderr, \"  Total number of blocks = \"FMTZ\"\\n\", (FMTZ_CAST)counts[0]);\n    fprintf(stderr, \"  Total size of blocks = \"FMTZ\"\\n\", (FMTZ_CAST)counts[1]);\n    MEMENTO_UNLOCK();\n}\n\nstatic void Memento_endStats(void)\n{\n    fprintf(stderr, \"Total memory malloced = \"FMTZ\" bytes\\n\", (FMTZ_CAST)memento.totalAlloc);\n    fprintf(stderr, \"Peak memory malloced = \"FMTZ\" bytes\\n\", (FMTZ_CAST)memento.peakAlloc);\n    fprintf(stderr, FMTZ\" mallocs, \"FMTZ\" frees, \"FMTZ\" reallocs\\n\", (FMTZ_CAST)memento.numMallocs,\n            (FMTZ_CAST)memento.numFrees, (FMTZ_CAST)memento.numReallocs);\n    fprintf(stderr, \"Average allocation size \"FMTZ\" bytes\\n\", (FMTZ_CAST)\n            (memento.numMallocs != 0 ? memento.totalAlloc/memento.numMallocs: 0));\n}\n\nvoid Memento_stats(void)\n{\n    MEMENTO_LOCK();\n    fprintf(stderr, \"Current memory malloced = \"FMTZ\" bytes\\n\", (FMTZ_CAST)memento.alloc);\n    Memento_endStats();\n    MEMENTO_UNLOCK();\n}\n\n#ifdef MEMENTO_DETAILS\nstatic int showInfo(Memento_BlkHeader *b, void *arg)\n{\n    Memento_BlkDetails *details;\n\n    fprintf(stderr, FMTP\":(size=\"FMTZ\",num=%d)\",\n            MEMBLK_TOBLK(b), (FMTZ_CAST)b->rawsize, b->sequence);\n    if (b->label)\n        fprintf(stderr, \" (%s)\", b->label);\n    fprintf(stderr, \"\\nEvents:\\n\");\n\n    details = b->details;\n    while (details)\n    {\n        fprintf(stderr, \"  Event %d (%s)\\n\", details->sequence, eventType[(int)details->type]);\n        Memento_showStacktrace(details->stack, details->count);\n        details = details->next;\n    }\n    return 0;\n}\n#endif\n\nvoid Memento_listBlockInfo(void)\n{\n#ifdef MEMENTO_DETAILS\n    MEMENTO_LOCK();\n    fprintf(stderr, \"Details of allocated blocks:\\n\");\n    Memento_appBlocks(&memento.used, showInfo, NULL);\n    MEMENTO_UNLOCK();\n#endif\n}\n\nstatic int Memento_nonLeakBlocksLeaked(void)\n{\n    Memento_BlkHeader *blk = memento.used.head;\n    while (blk)\n    {\n        Memento_BlkHeader *next;\n        int leaked;\n        VALGRIND_MAKE_MEM_DEFINED(blk, sizeof(*blk));\n        leaked = ((blk->flags & Memento_Flag_KnownLeak) == 0);\n        next = blk->next;\n        VALGRIND_MAKE_MEM_DEFINED(blk, sizeof(*blk));\n        if (leaked)\n            return 1;\n        blk = next;\n    }\n    return 0;\n}\n\nvoid Memento_fin(void)\n{\n    Memento_checkAllMemory();\n    if (!memento.segv)\n    {\n        Memento_endStats();\n        if (Memento_nonLeakBlocksLeaked()) {\n            Memento_listBlocks();\n#ifdef MEMENTO_DETAILS\n            fprintf(stderr, \"\\n\");\n            Memento_listBlockInfo();\n#endif\n            Memento_breakpoint();\n        }\n    }\n    if (memento.squeezing) {\n        if (memento.pattern == 0)\n            fprintf(stderr, \"Memory squeezing @ %d complete%s\\n\", memento.squeezeAt, memento.segv ? \" (with SEGV)\" : \"\");\n        else\n            fprintf(stderr, \"Memory squeezing @ %d (%d) complete%s\\n\", memento.squeezeAt, memento.pattern, memento.segv ? \" (with SEGV)\" : \"\");\n    } else if (memento.segv) {\n        fprintf(stderr, \"Memento completed (with SEGV)\\n\");\n    }\n    if (memento.failing)\n    {\n        fprintf(stderr, \"MEMENTO_FAILAT=%d\\n\", memento.failAt);\n        fprintf(stderr, \"MEMENTO_PATTERN=%d\\n\", memento.pattern);\n    }\n    if (memento.nextFailAt != 0)\n    {\n        fprintf(stderr, \"MEMENTO_NEXTFAILAT=%d\\n\", memento.nextFailAt);\n        fprintf(stderr, \"MEMENTO_NEXTPATTERN=%d\\n\", memento.nextPattern);\n    }\n}\n\nstatic void Memento_init(void)\n{\n    char *env;\n    memset(&memento, 0, sizeof(memento));\n    memento.inited    = 1;\n    memento.used.head = NULL;\n    memento.used.tail = NULL;\n    memento.free.head = NULL;\n    memento.free.tail = NULL;\n    memento.sequence  = 0;\n    memento.countdown = 1024;\n\n    env = getenv(\"MEMENTO_FAILAT\");\n    memento.failAt = (env ? atoi(env) : 0);\n\n    env = getenv(\"MEMENTO_BREAKAT\");\n    memento.breakAt = (env ? atoi(env) : 0);\n\n    env = getenv(\"MEMENTO_PARANOIA\");\n    memento.paranoia = (env ? atoi(env) : 0);\n    if (memento.paranoia == 0)\n        memento.paranoia = -1024;\n\n    env = getenv(\"MEMENTO_PARANOIDAT\");\n    memento.paranoidAt = (env ? atoi(env) : 0);\n\n    env = getenv(\"MEMENTO_SQUEEZEAT\");\n    memento.squeezeAt = (env ? atoi(env) : 0);\n\n    env = getenv(\"MEMENTO_PATTERN\");\n    memento.pattern = (env ? atoi(env) : 0);\n\n    env = getenv(\"MEMENTO_MAXMEMORY\");\n    memento.maxMemory = (env ? atoi(env) : 0);\n\n    atexit(Memento_fin);\n\n    Memento_initMutex(&memento.mutex);\n\n    Memento_initStacktracer();\n\n    Memento_breakpoint();\n}\n\ntypedef struct findBlkData {\n    void              *addr;\n    Memento_BlkHeader *blk;\n    int                flags;\n} findBlkData;\n\nstatic int Memento_containsAddr(Memento_BlkHeader *b,\n                                void *arg)\n{\n    findBlkData *data = (findBlkData *)arg;\n    char *blkend = &((char *)MEMBLK_TOBLK(b))[b->rawsize];\n    if ((MEMBLK_TOBLK(b) <= data->addr) &&\n        ((void *)blkend > data->addr)) {\n        data->blk = b;\n        data->flags = 1;\n        return 1;\n    }\n    if (((void *)b <= data->addr) &&\n        (MEMBLK_TOBLK(b) > data->addr)) {\n        data->blk = b;\n        data->flags = 2;\n        return 1;\n    }\n    if (((void *)blkend <= data->addr) &&\n        ((void *)(blkend + Memento_PostSize) > data->addr)) {\n        data->blk = b;\n        data->flags = 3;\n        return 1;\n    }\n    return 0;\n}\n\nvoid Memento_info(void *addr)\n{\n#ifdef MEMENTO_DETAILS\n    findBlkData data;\n\n    MEMENTO_LOCK();\n    data.addr  = addr;\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.used, Memento_containsAddr, &data);\n    if (data.blk != NULL)\n        showInfo(data.blk, NULL);\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.free, Memento_containsAddr, &data);\n    if (data.blk != NULL)\n        showInfo(data.blk, NULL);\n    MEMENTO_UNLOCK();\n#else\n    printf(\"Memento not compiled with details support\\n\");\n#endif\n}\n\n#ifdef MEMENTO_HAS_FORK\n#include <unistd.h>\n#include <sys/wait.h>\n#include <time.h>\n#ifdef MEMENTO_STACKTRACE_METHOD\n#if MEMENTO_STACKTRACE_METHOD == 1\n#include <signal.h>\n#endif\n#endif\n\n/* FIXME: Find some portable way of getting this */\n/* MacOSX has 10240, Ubuntu seems to have 256 */\n#ifndef OPEN_MAX\n#define OPEN_MAX 10240\n#endif\n\n/* stashed_map[j] = i means that file descriptor i-1 was duplicated to j */\nint stashed_map[OPEN_MAX];\n\nstatic void Memento_signal(int sig)\n{\n    (void)sig;\n    fprintf(stderr, \"SEGV at:\\n\");\n    memento.segv = 1;\n    Memento_bt_internal(0);\n\n    exit(1);\n}\n\nstatic int squeeze(void)\n{\n    pid_t pid;\n    int i, status;\n\n    if (memento.patternBit < 0)\n        return 1;\n    if (memento.squeezing && memento.patternBit >= MEMENTO_MAXPATTERN)\n        return 1;\n\n    if (memento.patternBit == 0)\n        memento.squeezeAt = memento.sequence;\n\n    if (!memento.squeezing) {\n        fprintf(stderr, \"Memory squeezing @ %d\\n\", memento.squeezeAt);\n    } else\n        fprintf(stderr, \"Memory squeezing @ %d (%x,%x)\\n\", memento.squeezeAt, memento.pattern, memento.patternBit);\n\n    /* When we fork below, the child is going to snaffle all our file pointers\n     * and potentially corrupt them. Let's make copies of all of them before\n     * we fork, so we can restore them when we restart. */\n    for (i = 0; i < OPEN_MAX; i++) {\n        if (stashed_map[i] == 0) {\n            int j = dup(i);\n            stashed_map[j] = i+1;\n        }\n    }\n\n    fprintf(stderr, \"Failing at:\\n\");\n    Memento_bt_internal(2);\n    pid = fork();\n    if (pid == 0) {\n        /* Child */\n        signal(SIGSEGV, Memento_signal);\n        /* In the child, we always fail the next allocation. */\n        if (memento.patternBit == 0) {\n            memento.patternBit = 1;\n        } else\n            memento.patternBit <<= 1;\n        memento.squeezing = 1;\n        return 1;\n    }\n\n    /* In the parent if we hit another allocation, pass it (and record the\n     * fact we passed it in the pattern. */\n    memento.pattern |= memento.patternBit;\n    memento.patternBit <<= 1;\n\n    /* Wait for pid to finish, with a timeout. */\n    {\n        struct timespec tm = { 0, 10 * 1000 * 1000 }; /* 10ms = 100th sec */\n        int timeout = 30 * 1000 * 1000; /* time out in microseconds! */\n        while (waitpid(pid, &status, WNOHANG) == 0) {\n            nanosleep(&tm, NULL);\n            timeout -= (tm.tv_nsec/1000);\n            tm.tv_nsec *= 2;\n            if (tm.tv_nsec > 999999999)\n                tm.tv_nsec = 999999999;\n            if (timeout <= 0) {\n                char text[32];\n                fprintf(stderr, \"Child is taking a long time to die. Killing it.\\n\");\n                sprintf(text, \"kill %d\", pid);\n                system(text);\n                break;\n            }\n        }\n    }\n\n    if (status != 0) {\n        fprintf(stderr, \"Child status=%d\\n\", status);\n    }\n\n    /* Put the files back */\n    for (i = 0; i < OPEN_MAX; i++) {\n        if (stashed_map[i] != 0) {\n            dup2(i, stashed_map[i]-1);\n            close(i);\n            stashed_map[i] = 0;\n        }\n    }\n\n    return 0;\n}\n#else\n#include <signal.h>\n\nstatic void Memento_signal(int sig)\n{\n    (void)sig;\n    memento.segv = 1;\n    /* If we just return from this function the SEGV will be unhandled, and\n     * we'll launch into whatever JIT debugging system the OS provides. At\n     * least fprintf(stderr, something useful first. If MEMENTO_NOJIT is set, then\n     * just exit to avoid the JIT (and get the usual atexit handling). */\n    if (getenv(\"MEMENTO_NOJIT\"))\n        exit(1);\n    else\n        Memento_fin();\n}\n\nstatic int squeeze(void)\n{\n    fprintf(stderr, \"Memento memory squeezing disabled as no fork!\\n\");\n    return 0;\n}\n#endif\n\nstatic void Memento_startFailing(void)\n{\n    if (!memento.failing) {\n        fprintf(stderr, \"Starting to fail...\\n\");\n        Memento_bt();\n        fflush(stderr);\n        memento.failing = 1;\n        memento.failAt = memento.sequence;\n        memento.nextFailAt = memento.sequence+1;\n        memento.pattern = 0;\n        memento.patternBit = 0;\n        signal(SIGSEGV, Memento_signal);\n        signal(SIGABRT, Memento_signal);\n        Memento_breakpointLocked();\n    }\n}\n\nstatic int Memento_event(void)\n{\n    memento.sequence++;\n    if ((memento.sequence >= memento.paranoidAt) && (memento.paranoidAt != 0)) {\n        memento.paranoia = 1;\n        memento.countdown = 1;\n    }\n    if (--memento.countdown == 0) {\n        Memento_checkAllMemoryLocked();\n        if (memento.paranoia > 0)\n            memento.countdown = memento.paranoia;\n        else\n        {\n            memento.countdown = -memento.paranoia;\n            if (memento.paranoia > INT_MIN/2)\n                memento.paranoia *= 2;\n        }\n    }\n\n    if (memento.sequence == memento.breakAt) {\n        fprintf(stderr, \"Breaking at event %d\\n\", memento.breakAt);\n        return 1;\n    }\n    return 0;\n}\n\nint Memento_sequence(void)\n{\n    return memento.sequence;\n}\n\nint Memento_breakAt(int event)\n{\n    MEMENTO_LOCK();\n    memento.breakAt = event;\n    MEMENTO_UNLOCK();\n    return event;\n}\n\nstatic void *safe_find_block(void *ptr)\n{\n    Memento_BlkHeader *block;\n    int valid;\n\n    if (ptr == NULL)\n        return NULL;\n\n    block = MEMBLK_FROMBLK(ptr);\n    /* Sometimes wrapping allocators can mean Memento_label\n     * is called with a value within the block, rather than\n     * at the start of the block. If we detect this, find it\n     * the slow way. */\n    VALGRIND_MAKE_MEM_DEFINED(&block->child, sizeof(block->child));\n    VALGRIND_MAKE_MEM_DEFINED(&block->sibling, sizeof(block->sibling));\n    valid = (block->child == MEMENTO_CHILD_MAGIC &&\n             block->sibling == MEMENTO_SIBLING_MAGIC);\n    VALGRIND_MAKE_MEM_NOACCESS(&block->child, sizeof(block->child));\n    VALGRIND_MAKE_MEM_NOACCESS(&block->sibling, sizeof(block->sibling));\n    if (!valid)\n    {\n        findBlkData data;\n\n        data.addr  = ptr;\n        data.blk   = NULL;\n        data.flags = 0;\n        Memento_appBlocks(&memento.used, Memento_containsAddr, &data);\n        if (data.blk == NULL)\n            return NULL;\n        block = data.blk;\n    }\n    return block;\n}\n\nvoid *Memento_label(void *ptr, const char *label)\n{\n    Memento_BlkHeader *block;\n\n    if (ptr == NULL)\n        return NULL;\n    MEMENTO_LOCK();\n    block = safe_find_block(ptr);\n    if (block != NULL)\n    {\n        VALGRIND_MAKE_MEM_DEFINED(&block->label, sizeof(block->label));\n        block->label = label;\n        VALGRIND_MAKE_MEM_NOACCESS(&block->label, sizeof(block->label));\n    }\n    MEMENTO_UNLOCK();\n    return ptr;\n}\n\nvoid Memento_tick(void)\n{\n    MEMENTO_LOCK();\n    if (Memento_event()) Memento_breakpointLocked();\n    MEMENTO_UNLOCK();\n}\n\nstatic int Memento_failThisEventLocked(void)\n{\n    int failThisOne;\n\n    if (Memento_event()) Memento_breakpointLocked();\n\n    if ((memento.sequence >= memento.failAt) && (memento.failAt != 0))\n        Memento_startFailing();\n    if ((memento.sequence >= memento.squeezeAt) && (memento.squeezeAt != 0)) {\n        return squeeze();\n    }\n\n    if (!memento.failing)\n        return 0;\n    failThisOne = ((memento.patternBit & memento.pattern) == 0);\n    /* If we are failing, and we've reached the end of the pattern and we've\n     * still got bits available in the pattern word, and we haven't already\n     * set a nextPattern, then extend the pattern. */\n    if (memento.failing &&\n        ((~(memento.patternBit-1) & memento.pattern) == 0) &&\n        (memento.patternBit != 0) &&\n        memento.nextPattern == 0)\n    {\n        /* We'll fail this one, and set the 'next' one to pass it. */\n        memento.nextFailAt = memento.failAt;\n        memento.nextPattern = memento.pattern | memento.patternBit;\n    }\n    memento.patternBit = (memento.patternBit ? memento.patternBit << 1 : 1);\n\n    return failThisOne;\n}\n\nint Memento_failThisEvent(void)\n{\n    int ret;\n\n    if (!memento.inited)\n        Memento_init();\n\n    MEMENTO_LOCK();\n    ret = Memento_failThisEventLocked();\n    MEMENTO_UNLOCK();\n    return ret;\n}\n\nstatic void *do_malloc(size_t s, int eventType)\n{\n    Memento_BlkHeader *memblk;\n    size_t             smem = MEMBLK_SIZE(s);\n\n    if (Memento_failThisEventLocked())\n        return NULL;\n\n    if (s == 0)\n        return NULL;\n\n    memento.numMallocs++;\n\n    if (memento.maxMemory != 0 && memento.alloc + s > memento.maxMemory)\n        return NULL;\n\n    memblk = MEMENTO_UNDERLYING_MALLOC(smem);\n    if (memblk == NULL)\n        return NULL;\n\n    memento.alloc      += s;\n    memento.totalAlloc += s;\n    if (memento.peakAlloc < memento.alloc)\n        memento.peakAlloc = memento.alloc;\n#ifndef MEMENTO_LEAKONLY\n    memset(MEMBLK_TOBLK(memblk), MEMENTO_ALLOCFILL, s);\n#endif\n    memblk->rawsize       = s;\n    memblk->sequence      = memento.sequence;\n    memblk->lastCheckedOK = memblk->sequence;\n    memblk->flags         = 0;\n    memblk->label         = 0;\n    memblk->child         = MEMENTO_CHILD_MAGIC;\n    memblk->sibling       = MEMENTO_SIBLING_MAGIC;\n#ifdef MEMENTO_DETAILS\n    memblk->details       = NULL;\n    memblk->details_tail  = &memblk->details;\n    Memento_storeDetails(memblk, Memento_EventType_malloc);\n#endif /* MEMENTO_DETAILS */\n    Memento_addBlockHead(&memento.used, memblk, 0);\n\n    if (memento.leaking > 0)\n        memblk->flags |= Memento_Flag_KnownLeak;\n\n    return MEMBLK_TOBLK(memblk);\n}\n\nvoid *Memento_malloc(size_t s)\n{\n    void *ret;\n\n    if (!memento.inited)\n        Memento_init();\n\n    MEMENTO_LOCK();\n    ret = do_malloc(s, Memento_EventType_malloc);\n    MEMENTO_UNLOCK();\n    return ret;\n}\n\nvoid *Memento_calloc(size_t n, size_t s)\n{\n    void *block;\n\n    if (!memento.inited)\n        Memento_init();\n\n    MEMENTO_LOCK();\n    block = do_malloc(n*s, Memento_EventType_calloc);\n    if (block)\n        memset(block, 0, n*s);\n    MEMENTO_UNLOCK();\n    return block;\n}\n\nstatic void do_reference(Memento_BlkHeader *blk, int event)\n{\n#ifdef MEMENTO_DETAILS\n    Memento_storeDetails(blk, event);\n#endif /* MEMENTO_DETAILS */\n}\n\nint Memento_checkPointerOrNull(void *blk)\n{\n\tif (blk == NULL)\n\t\treturn 0;\n\tif (blk == MEMENTO_PREFILL_PTR)\n\t\tfprintf(stderr, \"Prefill value found as pointer - buffer underrun?\\n\");\n\telse if (blk == MEMENTO_POSTFILL_PTR)\n\t\tfprintf(stderr, \"Postfill value found as pointer - buffer overrun?\\n\");\n\telse if (blk == MEMENTO_ALLOCFILL_PTR)\n\t\tfprintf(stderr, \"Allocfill value found as pointer - use of uninitialised value?\\n\");\n\telse if (blk == MEMENTO_FREEFILL_PTR)\n\t\tfprintf(stderr, \"Allocfill value found as pointer - use after free?\\n\");\n\telse\n\t\treturn 0;\n#ifdef MEMENTO_DETAILS\n\tfprintf(stderr, \"Current backtrace:\\n\");\n\tMemento_bt();\n\tfprintf(stderr, \"History:\\n\");\n\tMemento_info(blk);\n#endif\n\treturn 1;\n}\n\nint Memento_checkBytePointerOrNull(void *blk)\n{\n\tunsigned char i;\n\tif (blk == NULL)\n\t\treturn 0;\n\tMemento_checkPointerOrNull(blk);\n\n\ti = *(unsigned int *)blk;\n\n\tif (i == MEMENTO_PREFILL_UBYTE)\n\t\tfprintf(stderr, \"Prefill value found - buffer underrun?\\n\");\n\telse if (i == MEMENTO_POSTFILL_UBYTE)\n\t\tfprintf(stderr, \"Postfill value found - buffer overrun?\\n\");\n\telse if (i == MEMENTO_ALLOCFILL_UBYTE)\n\t\tfprintf(stderr, \"Allocfill value found - use of uninitialised value?\\n\");\n\telse if (i == MEMENTO_FREEFILL_UBYTE)\n\t\tfprintf(stderr, \"Allocfill value found - use after free?\\n\");\n\telse\n\t\treturn 0;\n#ifdef MEMENTO_DETAILS\n\tfprintf(stderr, \"Current backtrace:\\n\");\n\tMemento_bt();\n\tfprintf(stderr, \"History:\\n\");\n\tMemento_info(blk);\n#endif\n\tMemento_breakpoint();\n\treturn 1;\n}\n\nint Memento_checkShortPointerOrNull(void *blk)\n{\n\tunsigned short i;\n\tif (blk == NULL)\n\t\treturn 0;\n\tMemento_checkPointerOrNull(blk);\n\n\ti = *(unsigned short *)blk;\n\n\tif (i == MEMENTO_PREFILL_USHORT)\n\t\tfprintf(stderr, \"Prefill value found - buffer underrun?\\n\");\n\telse if (i == MEMENTO_POSTFILL_USHORT)\n\t\tfprintf(stderr, \"Postfill value found - buffer overrun?\\n\");\n\telse if (i == MEMENTO_ALLOCFILL_USHORT)\n\t\tfprintf(stderr, \"Allocfill value found - use of uninitialised value?\\n\");\n\telse if (i == MEMENTO_FREEFILL_USHORT)\n\t\tfprintf(stderr, \"Allocfill value found - use after free?\\n\");\n\telse\n\t\treturn 0;\n#ifdef MEMENTO_DETAILS\n\tfprintf(stderr, \"Current backtrace:\\n\");\n\tMemento_bt();\n\tfprintf(stderr, \"History:\\n\");\n\tMemento_info(blk);\n#endif\n\tMemento_breakpoint();\n\treturn 1;\n}\n\nint Memento_checkIntPointerOrNull(void *blk)\n{\n\tunsigned int i;\n\tif (blk == NULL)\n\t\treturn 0;\n\tMemento_checkPointerOrNull(blk);\n\n\ti = *(unsigned int *)blk;\n\n\tif (i == MEMENTO_PREFILL_UINT)\n\t\tfprintf(stderr, \"Prefill value found - buffer underrun?\\n\");\n\telse if (i == MEMENTO_POSTFILL_UINT)\n\t\tfprintf(stderr, \"Postfill value found - buffer overrun?\\n\");\n\telse if (i == MEMENTO_ALLOCFILL_UINT)\n\t\tfprintf(stderr, \"Allocfill value found - use of uninitialised value?\\n\");\n\telse if (i == MEMENTO_FREEFILL_UINT)\n\t\tfprintf(stderr, \"Allocfill value found - use after free?\\n\");\n\telse\n\t\treturn 0;\n#ifdef MEMENTO_DETAILS\n\tfprintf(stderr, \"Current backtrace:\\n\");\n\tMemento_bt();\n\tfprintf(stderr, \"History:\\n\");\n\tMemento_info(blk);\n#endif\n\tMemento_breakpoint();\n\treturn 1;\n}\n\nstatic void *do_takeRef(void *blk)\n{\n    MEMENTO_LOCK();\n    do_reference(safe_find_block(blk), Memento_EventType_takeRef);\n    MEMENTO_UNLOCK();\n    return blk;\n}\n\nvoid *Memento_takeByteRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    (void)Memento_checkBytePointerOrNull(blk);\n\n    return do_takeRef(blk);\n}\n\nvoid *Memento_takeShortRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    (void)Memento_checkShortPointerOrNull(blk);\n\n    return do_takeRef(blk);\n}\n\nvoid *Memento_takeIntRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    (void)Memento_checkIntPointerOrNull(blk);\n\n    return do_takeRef(blk);\n}\n\nvoid *Memento_takeRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    return do_takeRef(blk);\n}\n\nstatic void *do_dropRef(void *blk)\n{\n    MEMENTO_LOCK();\n    do_reference(safe_find_block(blk), Memento_EventType_dropRef);\n    MEMENTO_UNLOCK();\n    return blk;\n}\n\nvoid *Memento_dropByteRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    Memento_checkBytePointerOrNull(blk);\n\n    return do_dropRef(blk);\n}\n\nvoid *Memento_dropShortRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    Memento_checkShortPointerOrNull(blk);\n\n    return do_dropRef(blk);\n}\n\nvoid *Memento_dropIntRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    Memento_checkIntPointerOrNull(blk);\n\n    return do_dropRef(blk);\n}\n\nvoid *Memento_dropRef(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    if (Memento_event()) Memento_breakpoint();\n\n    if (!blk)\n        return NULL;\n\n    return do_dropRef(blk);\n}\n\nvoid *Memento_adjustRef(void *blk, int adjust)\n{\n    if (Memento_event()) Memento_breakpoint();\n\n    if (blk == NULL)\n        return NULL;\n\n    while (adjust > 0)\n    {\n        do_takeRef(blk);\n        adjust--;\n    }\n    while (adjust < 0)\n    {\n        do_dropRef(blk);\n        adjust++;\n    }\n\n    return blk;\n }\n\nvoid *Memento_reference(void *blk)\n{\n    if (!blk)\n        return NULL;\n\n    if (!memento.inited)\n        Memento_init();\n\n    MEMENTO_LOCK();\n    do_reference(safe_find_block(blk), Memento_EventType_reference);\n    MEMENTO_UNLOCK();\n    return blk;\n}\n\n/* Treat blocks from the user with suspicion, and check them the slow\n * but safe way. */\nstatic int checkBlockUser(Memento_BlkHeader *memblk, const char *action)\n{\n#ifndef MEMENTO_LEAKONLY\n    BlkCheckData data;\n\n    memset(&data, 0, sizeof(data));\n    Memento_appBlockUser(&memento.used, Memento_Internal_checkAllocedBlock,\n                         &data, memblk);\n    if (!data.found) {\n        /* Failure! */\n        fprintf(stderr, \"Attempt to %s block \", action);\n        showBlock(memblk, 32);\n        fprintf(stderr, \"\\n\");\n        Memento_breakpointLocked();\n        return 1;\n    } else if (data.preCorrupt || data.postCorrupt) {\n        fprintf(stderr, \"Block \");\n        showBlock(memblk, ' ');\n        fprintf(stderr, \" found to be corrupted on %s!\\n\", action);\n        if (data.preCorrupt) {\n            fprintf(stderr, \"Preguard corrupted\\n\");\n        }\n        if (data.postCorrupt) {\n            fprintf(stderr, \"Postguard corrupted\\n\");\n        }\n        fprintf(stderr, \"Block last checked OK at allocation %d. Now %d.\\n\",\n                memblk->lastCheckedOK, memento.sequence);\n        if ((memblk->flags & Memento_Flag_Reported) == 0)\n        {\n            memblk->flags |= Memento_Flag_Reported;\n        Memento_breakpointLocked();\n        }\n        return 1;\n    }\n#endif\n    return 0;\n}\n\nstatic int checkBlock(Memento_BlkHeader *memblk, const char *action)\n{\n#ifndef MEMENTO_LEAKONLY\n    BlkCheckData data;\n#endif\n\n    if (memblk->child != MEMENTO_CHILD_MAGIC ||\n        memblk->sibling != MEMENTO_SIBLING_MAGIC)\n    {\n        /* Failure! */\n        fprintf(stderr, \"Attempt to %s invalid block \", action);\n        showBlock(memblk, 32);\n        fprintf(stderr, \"\\n\");\n        Memento_breakpointLocked();\n        return 1;\n    }\n\n#ifndef MEMENTO_LEAKONLY\n    memset(&data, 0, sizeof(data));\n    Memento_appBlock(&memento.used, Memento_Internal_checkAllocedBlock,\n                     &data, memblk);\n    if (!data.found) {\n        /* Failure! */\n        fprintf(stderr, \"Attempt to %s block \", action);\n        showBlock(memblk, 32);\n        fprintf(stderr, \"\\n\");\n        Memento_breakpointLocked();\n        return 1;\n    } else if (data.preCorrupt || data.postCorrupt) {\n        fprintf(stderr, \"Block \");\n        showBlock(memblk, ' ');\n        fprintf(stderr, \" found to be corrupted on %s!\\n\", action);\n        if (data.preCorrupt) {\n            fprintf(stderr, \"Preguard corrupted\\n\");\n        }\n        if (data.postCorrupt) {\n            fprintf(stderr, \"Postguard corrupted\\n\");\n        }\n        fprintf(stderr, \"Block last checked OK at allocation %d. Now %d.\\n\",\n                memblk->lastCheckedOK, memento.sequence);\n        if ((memblk->flags & Memento_Flag_Reported) == 0)\n        {\n            memblk->flags |= Memento_Flag_Reported;\n        Memento_breakpointLocked();\n        }\n        return 1;\n    }\n#endif\n    return 0;\n}\n\nstatic void do_free(void *blk, int eventType)\n{\n    Memento_BlkHeader *memblk;\n\n    if (Memento_event()) Memento_breakpointLocked();\n\n    if (blk == NULL)\n        return;\n\n    memblk = MEMBLK_FROMBLK(blk);\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    if (checkBlock(memblk, \"free\"))\n        return;\n\n#ifdef MEMENTO_DETAILS\n    Memento_storeDetails(memblk, Memento_EventType_free);\n#endif\n\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    if (memblk->flags & Memento_Flag_BreakOnFree)\n        Memento_breakpointLocked();\n\n    memento.alloc -= memblk->rawsize;\n    memento.numFrees++;\n\n    Memento_removeBlock(&memento.used, memblk);\n\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    if (Memento_Internal_makeSpace(MEMBLK_SIZE(memblk->rawsize))) {\n        VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n        VALGRIND_MAKE_MEM_DEFINED(MEMBLK_TOBLK(memblk),\n                                  memblk->rawsize + Memento_PostSize);\n#ifndef MEMENTO_LEAKONLY\n        memset(MEMBLK_TOBLK(memblk), MEMENTO_FREEFILL, memblk->rawsize);\n#endif\n        memblk->flags |= Memento_Flag_Freed;\n        Memento_addBlockTail(&memento.free, memblk, 1);\n    } else {\n        free_block(memblk);\n    }\n}\n\nvoid Memento_free(void *blk)\n{\n    if (!memento.inited)\n        Memento_init();\n\n    MEMENTO_LOCK();\n    do_free(blk, Memento_EventType_free);\n    MEMENTO_UNLOCK();\n}\n\nstatic void *do_realloc(void *blk, size_t newsize, int type)\n{\n    Memento_BlkHeader *memblk, *newmemblk;\n    size_t             newsizemem;\n    int                flags;\n\n    if (Memento_failThisEventLocked())\n        return NULL;\n\n    memblk     = MEMBLK_FROMBLK(blk);\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    if (checkBlock(memblk, \"realloc\"))\n        return NULL;\n\n#ifdef MEMENTO_DETAILS\n    Memento_storeDetails(memblk, type);\n#endif\n\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    if (memblk->flags & Memento_Flag_BreakOnRealloc)\n        Memento_breakpointLocked();\n\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    if (memento.maxMemory != 0 && memento.alloc - memblk->rawsize + newsize > memento.maxMemory)\n        return NULL;\n\n    newsizemem = MEMBLK_SIZE(newsize);\n    Memento_removeBlock(&memento.used, memblk);\n    VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(*memblk));\n    flags = memblk->flags;\n    newmemblk  = MEMENTO_UNDERLYING_REALLOC(memblk, newsizemem);\n    if (newmemblk == NULL)\n    {\n        Memento_addBlockHead(&memento.used, memblk, 2);\n        return NULL;\n    }\n    memento.numReallocs++;\n    memento.totalAlloc += newsize;\n    memento.alloc      -= newmemblk->rawsize;\n    memento.alloc      += newsize;\n    if (memento.peakAlloc < memento.alloc)\n        memento.peakAlloc = memento.alloc;\n    newmemblk->flags = flags;\n#ifndef MEMENTO_LEAKONLY\n    if (newmemblk->rawsize < newsize) {\n        char *newbytes = ((char *)MEMBLK_TOBLK(newmemblk))+newmemblk->rawsize;\n        VALGRIND_MAKE_MEM_DEFINED(newbytes, newsize - newmemblk->rawsize);\n        memset(newbytes, MEMENTO_ALLOCFILL, newsize - newmemblk->rawsize);\n        VALGRIND_MAKE_MEM_UNDEFINED(newbytes, newsize - newmemblk->rawsize);\n    }\n#endif\n    newmemblk->rawsize = newsize;\n#ifndef MEMENTO_LEAKONLY\n    VALGRIND_MAKE_MEM_DEFINED(newmemblk->preblk, Memento_PreSize);\n    memset(newmemblk->preblk, MEMENTO_PREFILL, Memento_PreSize);\n    VALGRIND_MAKE_MEM_UNDEFINED(newmemblk->preblk, Memento_PreSize);\n    VALGRIND_MAKE_MEM_DEFINED(MEMBLK_POSTPTR(newmemblk), Memento_PostSize);\n    memset(MEMBLK_POSTPTR(newmemblk), MEMENTO_POSTFILL, Memento_PostSize);\n    VALGRIND_MAKE_MEM_UNDEFINED(MEMBLK_POSTPTR(newmemblk), Memento_PostSize);\n#endif\n    Memento_addBlockHead(&memento.used, newmemblk, 2);\n    return MEMBLK_TOBLK(newmemblk);\n}\n\nvoid *Memento_realloc(void *blk, size_t newsize)\n{\n    void *ret;\n\n    if (!memento.inited)\n        Memento_init();\n\n    if (blk == NULL)\n    {\n        MEMENTO_LOCK();\n        ret = do_malloc(newsize, Memento_EventType_realloc);\n        MEMENTO_UNLOCK();\n        return ret;\n    }\n    if (newsize == 0) {\n        MEMENTO_LOCK();\n        do_free(blk, Memento_EventType_realloc);\n        MEMENTO_UNLOCK();\n        return NULL;\n    }\n\n    MEMENTO_LOCK();\n    ret = do_realloc(blk, newsize, Memento_EventType_realloc);\n    MEMENTO_UNLOCK();\n    return ret;\n}\n\nint Memento_checkBlock(void *blk)\n{\n    Memento_BlkHeader *memblk;\n    int ret;\n\n    if (blk == NULL)\n        return 0;\n\n    MEMENTO_LOCK();\n    memblk = MEMBLK_FROMBLK(blk);\n    ret = checkBlockUser(memblk, \"check\");\n    MEMENTO_UNLOCK();\n    return ret;\n}\n\n#ifndef MEMENTO_LEAKONLY\nstatic int Memento_Internal_checkAllAlloced(Memento_BlkHeader *memblk, void *arg)\n{\n    BlkCheckData *data = (BlkCheckData *)arg;\n\n    Memento_Internal_checkAllocedBlock(memblk, data);\n    if (data->preCorrupt || data->postCorrupt) {\n        if ((data->found & 2) == 0) {\n            fprintf(stderr, \"Allocated blocks:\\n\");\n            data->found |= 2;\n        }\n        fprintf(stderr, \"  Block \");\n        showBlock(memblk, ' ');\n        if (data->preCorrupt) {\n            fprintf(stderr, \" Preguard \");\n        }\n        if (data->postCorrupt) {\n            fprintf(stderr, \"%s Postguard \",\n                    (data->preCorrupt ? \"&\" : \"\"));\n        }\n        fprintf(stderr, \"corrupted.\\n    \"\n                \"Block last checked OK at allocation %d. Now %d.\\n\",\n                memblk->lastCheckedOK, memento.sequence);\n        data->preCorrupt  = 0;\n        data->postCorrupt = 0;\n        data->freeCorrupt = 0;\n        if ((memblk->flags & Memento_Flag_Reported) == 0)\n        {\n            memblk->flags |= Memento_Flag_Reported;\n            Memento_breakpointLocked();\n        }\n    }\n    else\n        memblk->lastCheckedOK = memento.sequence;\n    return 0;\n}\n\nstatic int Memento_Internal_checkAllFreed(Memento_BlkHeader *memblk, void *arg)\n{\n    BlkCheckData *data = (BlkCheckData *)arg;\n\n    Memento_Internal_checkFreedBlock(memblk, data);\n    if (data->preCorrupt || data->postCorrupt || data->freeCorrupt) {\n        if ((data->found & 4) == 0) {\n            fprintf(stderr, \"Freed blocks:\\n\");\n            data->found |= 4;\n        }\n        fprintf(stderr, \"  \");\n        showBlock(memblk, ' ');\n        if (data->freeCorrupt) {\n            fprintf(stderr, \" index %d (address \"FMTP\") onwards\", (int)data->index,\n                    &((char *)MEMBLK_TOBLK(memblk))[data->index]);\n            if (data->preCorrupt) {\n                fprintf(stderr, \"+ preguard\");\n            }\n            if (data->postCorrupt) {\n                fprintf(stderr, \"+ postguard\");\n            }\n        } else {\n            if (data->preCorrupt) {\n                fprintf(stderr, \" preguard\");\n            }\n            if (data->postCorrupt) {\n                fprintf(stderr, \"%s Postguard\",\n                        (data->preCorrupt ? \"+\" : \"\"));\n            }\n        }\n        VALGRIND_MAKE_MEM_DEFINED(memblk, sizeof(Memento_BlkHeader));\n        fprintf(stderr, \" corrupted.\\n\"\n                \"    Block last checked OK at allocation %d. Now %d.\\n\",\n                memblk->lastCheckedOK, memento.sequence);\n        if ((memblk->flags & Memento_Flag_Reported) == 0)\n        {\n            memblk->flags |= Memento_Flag_Reported;\n            Memento_breakpointLocked();\n        }\n        VALGRIND_MAKE_MEM_NOACCESS(memblk, sizeof(Memento_BlkHeader));\n        data->preCorrupt  = 0;\n        data->postCorrupt = 0;\n        data->freeCorrupt = 0;\n    }\n    else\n        memblk->lastCheckedOK = memento.sequence;\n    return 0;\n}\n#endif /* MEMENTO_LEAKONLY */\n\nstatic int Memento_checkAllMemoryLocked(void)\n{\n#ifndef MEMENTO_LEAKONLY\n    BlkCheckData data;\n\n    memset(&data, 0, sizeof(data));\n    Memento_appBlocks(&memento.used, Memento_Internal_checkAllAlloced, &data);\n    Memento_appBlocks(&memento.free, Memento_Internal_checkAllFreed, &data);\n    return data.found;\n#else\n    return 0;\n#endif\n}\n\nint Memento_checkAllMemory(void)\n{\n#ifndef MEMENTO_LEAKONLY\n    int ret;\n\n    MEMENTO_LOCK();\n    ret = Memento_checkAllMemoryLocked();\n    MEMENTO_UNLOCK();\n    if (ret & 6) {\n        Memento_breakpoint();\n        return 1;\n    }\n    return 0;\n#endif\n}\n\nint Memento_setParanoia(int i)\n{\n    memento.paranoia = i;\n    if (memento.paranoia > 0)\n        memento.countdown = memento.paranoia;\n    else\n        memento.countdown = -memento.paranoia;\n    return i;\n}\n\nint Memento_paranoidAt(int i)\n{\n    memento.paranoidAt = i;\n    return i;\n}\n\nint Memento_getBlockNum(void *b)\n{\n    Memento_BlkHeader *memblk;\n    if (b == NULL)\n        return 0;\n    memblk = MEMBLK_FROMBLK(b);\n    return (memblk->sequence);\n}\n\nint Memento_check(void)\n{\n    int result;\n\n    fprintf(stderr, \"Checking memory\\n\");\n    result = Memento_checkAllMemory();\n    fprintf(stderr, \"Memory checked!\\n\");\n    return result;\n}\n\nint Memento_find(void *a)\n{\n    findBlkData data;\n    int s;\n\n    MEMENTO_LOCK();\n    data.addr  = a;\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.used, Memento_containsAddr, &data);\n    if (data.blk != NULL) {\n        fprintf(stderr, \"Address \"FMTP\" is in %sallocated block \",\n                data.addr,\n                (data.flags == 1 ? \"\" : (data.flags == 2 ?\n                                         \"preguard of \" : \"postguard of \")));\n        s = showBlock(data.blk, ' ');\n        fprintf(stderr, \"\\n\");\n        MEMENTO_UNLOCK();\n        return s;\n    }\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.free, Memento_containsAddr, &data);\n    if (data.blk != NULL) {\n        fprintf(stderr, \"Address \"FMTP\" is in %sfreed block \",\n                data.addr,\n                (data.flags == 1 ? \"\" : (data.flags == 2 ?\n                                         \"preguard of \" : \"postguard of \")));\n        s = showBlock(data.blk, ' ');\n        fprintf(stderr, \"\\n\");\n        MEMENTO_UNLOCK();\n        return s;\n    }\n    MEMENTO_UNLOCK();\n    return 0;\n}\n\nvoid Memento_breakOnFree(void *a)\n{\n    findBlkData data;\n\n    MEMENTO_LOCK();\n    data.addr  = a;\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.used, Memento_containsAddr, &data);\n    if (data.blk != NULL) {\n        fprintf(stderr, \"Will stop when address \"FMTP\" (in %sallocated block \",\n                data.addr,\n                (data.flags == 1 ? \"\" : (data.flags == 2 ?\n                                         \"preguard of \" : \"postguard of \")));\n        showBlock(data.blk, ' ');\n        fprintf(stderr, \") is freed\\n\");\n        VALGRIND_MAKE_MEM_DEFINED(data.blk, sizeof(Memento_BlkHeader));\n        data.blk->flags |= Memento_Flag_BreakOnFree;\n        VALGRIND_MAKE_MEM_NOACCESS(data.blk, sizeof(Memento_BlkHeader));\n        MEMENTO_UNLOCK();\n        return;\n    }\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.free, Memento_containsAddr, &data);\n    if (data.blk != NULL) {\n        fprintf(stderr, \"Can't stop on free; address \"FMTP\" is in %sfreed block \",\n                data.addr,\n                (data.flags == 1 ? \"\" : (data.flags == 2 ?\n                                         \"preguard of \" : \"postguard of \")));\n        showBlock(data.blk, ' ');\n        fprintf(stderr, \"\\n\");\n        MEMENTO_UNLOCK();\n        return;\n    }\n    fprintf(stderr, \"Can't stop on free; address \"FMTP\" is not in a known block.\\n\", a);\n    MEMENTO_UNLOCK();\n}\n\nvoid Memento_breakOnRealloc(void *a)\n{\n    findBlkData data;\n\n    MEMENTO_LOCK();\n    data.addr  = a;\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.used, Memento_containsAddr, &data);\n    if (data.blk != NULL) {\n        fprintf(stderr, \"Will stop when address \"FMTP\" (in %sallocated block \",\n                data.addr,\n                (data.flags == 1 ? \"\" : (data.flags == 2 ?\n                                         \"preguard of \" : \"postguard of \")));\n        showBlock(data.blk, ' ');\n        fprintf(stderr, \") is freed (or realloced)\\n\");\n        VALGRIND_MAKE_MEM_DEFINED(data.blk, sizeof(Memento_BlkHeader));\n        data.blk->flags |= Memento_Flag_BreakOnFree | Memento_Flag_BreakOnRealloc;\n        VALGRIND_MAKE_MEM_NOACCESS(data.blk, sizeof(Memento_BlkHeader));\n        MEMENTO_UNLOCK();\n        return;\n    }\n    data.blk   = NULL;\n    data.flags = 0;\n    Memento_appBlocks(&memento.free, Memento_containsAddr, &data);\n    if (data.blk != NULL) {\n        fprintf(stderr, \"Can't stop on free/realloc; address \"FMTP\" is in %sfreed block \",\n                data.addr,\n                (data.flags == 1 ? \"\" : (data.flags == 2 ?\n                                         \"preguard of \" : \"postguard of \")));\n        showBlock(data.blk, ' ');\n        fprintf(stderr, \"\\n\");\n        MEMENTO_UNLOCK();\n        return;\n    }\n    fprintf(stderr, \"Can't stop on free/realloc; address \"FMTP\" is not in a known block.\\n\", a);\n    MEMENTO_UNLOCK();\n}\n\nint Memento_failAt(int i)\n{\n    memento.failAt = i;\n    if ((memento.sequence > memento.failAt) &&\n        (memento.failing != 0))\n        Memento_startFailing();\n    return i;\n}\n\nsize_t Memento_setMax(size_t max)\n{\n    memento.maxMemory = max;\n    return max;\n}\n\nvoid Memento_startLeaking(void)\n{\n    memento.leaking++;\n}\n\nvoid Memento_stopLeaking(void)\n{\n    memento.leaking--;\n}\n\nint Memento_squeezing(void)\n{\n    return memento.squeezing;\n}\n\n#endif /* MEMENTO_CPP_EXTRAS_ONLY */\n\n#ifdef __cplusplus\n/* Dumb overrides for the new and delete operators */\n\nvoid *operator new(size_t size)\n{\n    void *ret;\n\n    if (!memento.inited)\n        Memento_init();\n\n    if (size == 0)\n        size = 1;\n    MEMENTO_LOCK();\n    ret = do_malloc(size, Memento_EventType_new);\n    MEMENTO_UNLOCK();\n    return ret;\n}\n\nvoid  operator delete(void *pointer)\n{\n    if (!pointer)\n        return;\n\n    MEMENTO_LOCK();\n    do_free(pointer, Memento_EventType_delete);\n    MEMENTO_UNLOCK();\n}\n\n/* Some C++ systems (apparently) don't provide new[] or delete[]\n * operators. Provide a way to cope with this */\n#ifndef MEMENTO_CPP_NO_ARRAY_CONSTRUCTORS\nvoid *operator new[](size_t size)\n{\n    void *ret;\n    if (!memento.inited)\n        Memento_init();\n\n    if (size == 0)\n        size = 1;\n    MEMENTO_LOCK();\n    ret = do_malloc(size, Memento_EventType_newArray);\n    MEMENTO_UNLOCK();\n    return ret;\n}\n\nvoid  operator delete[](void *pointer)\n{\n    MEMENTO_LOCK();\n    do_free(pointer, Memento_EventType_deleteArray);\n    MEMENTO_UNLOCK();\n}\n#endif /* MEMENTO_CPP_NO_ARRAY_CONSTRUCTORS */\n#endif /* __cplusplus */\n\n#else\n\n/* Just in case anyone has left some debugging code in... */\nvoid (Memento_breakpoint)(void)\n{\n}\n\nint (Memento_checkBlock)(void *b)\n{\n    return 0;\n}\n\nint (Memento_checkAllMemory)(void)\n{\n    return 0;\n}\n\nint (Memento_check)(void)\n{\n    return 0;\n}\n\nint (Memento_setParanoia)(int i)\n{\n    return 0;\n}\n\nint (Memento_paranoidAt)(int i)\n{\n    return 0;\n}\n\nint (Memento_breakAt)(int i)\n{\n    return 0;\n}\n\nint  (Memento_getBlockNum)(void *i)\n{\n    return 0;\n}\n\nint (Memento_find)(void *a)\n{\n    return 0;\n}\n\nint (Memento_failAt)(int i)\n{\n    return 0;\n}\n\nvoid (Memento_breakOnFree)(void *a)\n{\n}\n\nvoid (Memento_breakOnRealloc)(void *a)\n{\n}\n\nvoid *(Memento_takeRef)(void *a)\n{\n    return a;\n}\n\nvoid *(Memento_dropRef)(void *a)\n{\n    return a;\n}\n\nvoid *(Memento_adjustRef)(void *a, int adjust)\n{\n    return a;\n}\n\nvoid *(Memento_reference)(void *a)\n{\n    return a;\n}\n\n#undef Memento_malloc\n#undef Memento_free\n#undef Memento_realloc\n#undef Memento_calloc\n\nvoid *Memento_malloc(size_t size)\n{\n    return MEMENTO_UNDERLYING_MALLOC(size);\n}\n\nvoid Memento_free(void *b)\n{\n    MEMENTO_UNDERLYING_FREE(b);\n}\n\nvoid *Memento_realloc(void *b, size_t s)\n{\n    return MEMENTO_UNDERLYING_REALLOC(b, s);\n}\n\nvoid *Memento_calloc(size_t n, size_t s)\n{\n    return MEMENTO_UNDERLYING_CALLOC(n, s);\n}\n\nvoid (Memento_listBlocks)(void)\n{\n}\n\nvoid (Memento_listNewBlocks)(void)\n{\n}\n\nsize_t (Memento_setMax)(size_t max)\n{\n    return 0;\n}\n\nvoid (Memento_stats)(void)\n{\n}\n\nvoid *(Memento_label)(void *ptr, const char *label)\n{\n    return ptr;\n}\n\nvoid (Memento_info)(void *addr)\n{\n}\n\nvoid (Memento_listBlockInfo)(void)\n{\n}\n\nvoid (Memento_startLeaking)(void)\n{\n}\n\nvoid (Memento_stopLeaking)(void)\n{\n}\n\nint (Memento_squeezing)(void)\n{\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "JBig2/src/pbm2png.c",
    "content": "/* Copyright (C) 2001-2021 Artifex Software, Inc.\n   All Rights Reserved.\n\n   This software is provided AS-IS with no warranty, either express or\n   implied.\n\n   This software is distributed under license and may not be copied,\n   modified or distributed except as expressly authorized under the terms\n   of the license contained in the file LICENSE in this distribution.\n\n   Refer to licensing information at http://www.artifex.com or contact\n   Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,\n   CA 94945, U.S.A., +1(415)492-9861, for further information.\n*/\n\n/*\n    jbig2dec\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#include \"config_types.h\"\n#elif _WIN32\n#include \"config_win32.h\"\n#endif\n#ifdef HAVE_STDINT_H\n#include <stdint.h>\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"jbig2.h\"\n#include \"jbig2_image.h\"\n#include \"jbig2_image_rw.h\"\n\nint\nmain(int argc, char *argv[])\n{\n    Jbig2Ctx *ctx;\n    Jbig2Image *image;\n    int code;\n\n    /* we need a context for the allocators */\n    ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);\n\n    if (argc != 3) {\n        fprintf(stderr, \"usage: %s <in.pbm> <out.png>\\n\\n\", argv[0]);\n        return 1;\n    }\n\n    image = jbig2_image_read_pbm_file(ctx, argv[1]);\n    if (image == NULL) {\n        fprintf(stderr, \"error reading pbm file '%s'\\n\", argv[1]);\n        return 1;\n    } else {\n        fprintf(stderr, \"converting %dx%d image to png format\\n\", image->width, image->height);\n    }\n\n    code = jbig2_image_write_png_file(image, argv[2]);\n    if (code) {\n        fprintf(stderr, \"error writing png file '%s' error %d\\n\", argv[2], code);\n    }\n\n    return (code);\n}\n"
  },
  {
    "path": "JBig2/src/sha1.c",
    "content": "/*\nSHA-1 in C\nBy Steve Reid <sreid@sea-to-sky.net>\n100% Public Domain\n\n-----------------\nModified 7/98\nBy James H. Brown <jbrown@burgoyne.com>\nStill 100% Public Domain\n\nCorrected a problem which generated improper hash values on 16 bit machines\nRoutine SHA1Update changed from\n\tvoid SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int\nlen)\nto\n\tvoid SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned\nlong len)\n\nThe 'len' parameter was declared an int which works fine on 32 bit machines.\nHowever, on 16 bit machines an int is too small for the shifts being done\nagainst\nit.  This caused the hash function to generate incorrect values if len was\ngreater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().\n\nSince the file IO in main() reads 16K at a time, any file 8K or larger would\nbe guaranteed to generate the wrong hash (e.g. Test Vector #3, a million\n\"a\"s).\n\nI also changed the declaration of variables i & j in SHA1Update to\nunsigned long from unsigned int for the same reason.\n\nThese changes should make no difference to any 32 bit implementations since\nan\nint and a long are the same size in those environments.\n\n--\nI also corrected a few compiler warnings generated by Borland C.\n1. Added #include <process.h> for exit() prototype\n2. Removed unused variable 'j' in SHA1Final\n3. Changed exit(0) to return(0) at end of main.\n\nALL changes I made can be located by searching for comments containing 'JHB'\n-----------------\nModified 8/98\nBy Steve Reid <sreid@sea-to-sky.net>\nStill 100% public domain\n\n1- Removed #include <process.h> and used return() instead of exit()\n2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall)\n3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net\n\n-----------------\nModified 4/01\nBy Saul Kravitz <Saul.Kravitz@celera.com>\nStill 100% PD\nModified to run on Compaq Alpha hardware.\n\n-----------------\nModified 07/2002\nBy Ralph Giles <giles@ghostscript.com>\nStill 100% public domain\nmodified for use with stdint types, autoconf\ncode cleanup, removed attribution comments\nswitched SHA1Final() argument order for consistency\nuse SHA1_ prefix for public api\nmove public api to sha1.h\n*/\n\n/*\nTest Vectors (from FIPS PUB 180-1)\n\"abc\"\n  A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D\n\"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\"\n  84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1\nA million repetitions of \"a\"\n  34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F\n*/\n\n/* #define SHA1HANDSOFF  */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"os_types.h\"\n#include \"sha1.h\"\n\nvoid SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]);\n\n#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))\n\n/* blk0() and blk() perform the initial expand. */\n/* I got the idea of expanding during the round function from SSLeay */\n/* FIXME: can we do this in an endian-proof way? */\n#ifdef WORDS_BIGENDIAN\n#define blk0(i) block->l[i]\n#else\n#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \\\n    |(rol(block->l[i],8)&0x00FF00FF))\n#endif\n#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \\\n    ^block->l[(i+2)&15]^block->l[i&15],1))\n\n/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */\n#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);\n#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);\n#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);\n#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);\n#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);\n\n#ifdef VERBOSE                  /* SAK */\nvoid\nSHAPrintContext(SHA1_CTX *context, char *msg)\n{\n    printf(\"%s (%d,%d) %x %x %x %x %x\\n\",\n           msg, context->count[0], context->count[1], context->state[0], context->state[1], context->state[2], context->state[3], context->state[4]);\n}\n#endif /* VERBOSE */\n\n/* Hash a single 512-bit block. This is the core of the algorithm. */\nvoid\nSHA1_Transform(uint32_t state[5], const uint8_t buffer[64])\n{\n    uint32_t a, b, c, d, e;\n    typedef union {\n        uint8_t c[64];\n        uint32_t l[16];\n    } CHAR64LONG16;\n    CHAR64LONG16 *block;\n\n#ifdef SHA1HANDSOFF\n    static uint8_t workspace[64];\n\n    block = (CHAR64LONG16 *) workspace;\n    memcpy(block, buffer, 64);\n#else\n    block = (CHAR64LONG16 *) buffer;\n#endif\n\n    /* Copy context->state[] to working vars */\n    a = state[0];\n    b = state[1];\n    c = state[2];\n    d = state[3];\n    e = state[4];\n\n    /* 4 rounds of 20 operations each. Loop unrolled. */\n    R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);\n    R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);\n    R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);\n    R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);\n    R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);\n    R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);\n    R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);\n    R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);\n    R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);\n    R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);\n    R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);\n    R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);\n    R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);\n    R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);\n    R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);\n    R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);\n    R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);\n    R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);\n    R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);\n    R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);\n\n    /* Add the working vars back into context.state[] */\n    state[0] += a;\n    state[1] += b;\n    state[2] += c;\n    state[3] += d;\n    state[4] += e;\n\n    /* Wipe variables */\n    a = b = c = d = e = 0;\n}\n\n/* SHA1Init - Initialize new context */\nvoid\nSHA1_Init(SHA1_CTX *context)\n{\n    /* SHA1 initialization constants */\n    context->state[0] = 0x67452301;\n    context->state[1] = 0xEFCDAB89;\n    context->state[2] = 0x98BADCFE;\n    context->state[3] = 0x10325476;\n    context->state[4] = 0xC3D2E1F0;\n    context->count[0] = context->count[1] = 0;\n}\n\n/* Run your data through this. */\nvoid\nSHA1_Update(SHA1_CTX *context, const uint8_t *data, const size_t len)\n{\n    size_t i, j;\n\n#ifdef VERBOSE\n    SHAPrintContext(context, \"before\");\n#endif\n\n    j = (context->count[0] >> 3) & 63;\n    if ((context->count[0] += len << 3) < (len << 3))\n        context->count[1]++;\n    context->count[1] += (len >> 29);\n    if ((j + len) > 63) {\n        memcpy(&context->buffer[j], data, (i = 64 - j));\n        SHA1_Transform(context->state, context->buffer);\n        for (; i + 63 < len; i += 64) {\n            SHA1_Transform(context->state, data + i);\n        }\n        j = 0;\n    } else\n        i = 0;\n    memcpy(&context->buffer[j], &data[i], len - i);\n\n#ifdef VERBOSE\n    SHAPrintContext(context, \"after \");\n#endif\n}\n\n/* Add padding and return the message digest. */\nvoid\nSHA1_Final(SHA1_CTX *context, uint8_t digest[SHA1_DIGEST_SIZE])\n{\n    uint32_t i;\n    uint8_t finalcount[8];\n\n    for (i = 0; i < 8; i++) {\n        finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]\n                                         >> ((3 - (i & 3)) * 8)) & 255);        /* Endian independent */\n    }\n    SHA1_Update(context, (uint8_t *) \"\\200\", 1);\n    while ((context->count[0] & 504) != 448) {\n        SHA1_Update(context, (uint8_t *) \"\\0\", 1);\n    }\n    SHA1_Update(context, finalcount, 8);        /* Should cause a SHA1_Transform() */\n    for (i = 0; i < SHA1_DIGEST_SIZE; i++) {\n        digest[i] = (uint8_t)\n                    ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);\n    }\n\n    /* Wipe variables */\n    i = 0;\n    memset(context->buffer, 0, 64);\n    memset(context->state, 0, 20);\n    memset(context->count, 0, 8);\n    memset(finalcount, 0, 8);   /* SWR */\n\n#ifdef SHA1HANDSOFF             /* make SHA1Transform overwrite its own static vars */\n    SHA1_Transform(context->state, context->buffer);\n#endif\n}\n\n/*************************************************************/\n\n#if 0\nint\nmain(int argc, char **argv)\n{\n    int i, j;\n    SHA1_CTX context;\n    unsigned char digest[SHA1_DIGEST_SIZE], buffer[16384];\n    FILE *file;\n\n    if (argc > 2) {\n        puts(\"Public domain SHA-1 implementation - by Steve Reid <sreid@sea-to-sky.net>\");\n        puts(\"Modified for 16 bit environments 7/98 - by James H. Brown <jbrown@burgoyne.com>\");        /* JHB */\n        puts(\"Produces the SHA-1 hash of a file, or stdin if no file is specified.\");\n        return (0);\n    }\n    if (argc < 2) {\n        file = stdin;\n    } else {\n        if (!(file = fopen(argv[1], \"rb\"))) {\n            fputs(\"Unable to open file.\", stderr);\n            return (-1);\n        }\n    }\n    SHA1_Init(&context);\n    while (!feof(file)) {       /* note: what if ferror(file) */\n        i = fread(buffer, 1, 16384, file);\n        SHA1_Update(&context, buffer, i);\n    }\n    SHA1_Final(&context, digest);\n    fclose(file);\n    for (i = 0; i < SHA1_DIGEST_SIZE / 4; i++) {\n        for (j = 0; j < 4; j++) {\n            printf(\"%02X\", digest[i * 4 + j]);\n        }\n        putchar(' ');\n    }\n    putchar('\\n');\n    return (0);                 /* JHB */\n}\n#endif\n\n/* self test */\n\n#ifdef TEST\n\nstatic char *test_data[] = {\n    \"abc\",\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n    \"A million repetitions of 'a'\"\n};\nstatic char *test_results[] = {\n    \"A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D\",\n    \"84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1\",\n    \"34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F\"\n};\n\nvoid\ndigest_to_hex(const uint8_t digest[SHA1_DIGEST_SIZE], char *output)\n{\n    int i, j;\n    char *c = output;\n\n    for (i = 0; i < SHA1_DIGEST_SIZE / 4; i++) {\n        for (j = 0; j < 4; j++) {\n            sprintf(c, \"%02X\", digest[i * 4 + j]);\n            c += 2;\n        }\n        sprintf(c, \" \");\n        c += 1;\n    }\n    *(c - 1) = '\\0';\n}\n\nint\nmain(int argc, char **argv)\n{\n    int k;\n    SHA1_CTX context;\n    uint8_t digest[20];\n    char output[80];\n\n    fprintf(stdout, \"verifying SHA-1 implementation... \");\n\n    for (k = 0; k < 2; k++) {\n        SHA1_Init(&context);\n        SHA1_Update(&context, (uint8_t *) test_data[k], strlen(test_data[k]));\n        SHA1_Final(&context, digest);\n        digest_to_hex(digest, output);\n\n        if (strcmp(output, test_results[k])) {\n            fprintf(stdout, \"FAIL\\n\");\n            fprintf(stderr, \"* hash of \\\"%s\\\" incorrect:\\n\", test_data[k]);\n            fprintf(stderr, \"\\t%s returned\\n\", output);\n            fprintf(stderr, \"\\t%s is correct\\n\", test_results[k]);\n            return (1);\n        }\n    }\n    /* million 'a' vector we feed separately */\n    SHA1_Init(&context);\n    for (k = 0; k < 1000000; k++)\n        SHA1_Update(&context, (uint8_t *) \"a\", 1);\n    SHA1_Final(&context, digest);\n    digest_to_hex(digest, output);\n    if (strcmp(output, test_results[2])) {\n        fprintf(stdout, \"FAIL\\n\");\n        fprintf(stderr, \"* hash of \\\"%s\\\" incorrect:\\n\", test_data[2]);\n        fprintf(stderr, \"\\t%s returned\\n\", output);\n        fprintf(stderr, \"\\t%s is correct\\n\", test_results[2]);\n        return (1);\n    }\n\n    /* success */\n    fprintf(stdout, \"ok\\n\");\n    return (0);\n}\n#endif /* TEST */\n"
  },
  {
    "path": "PDFPatcher.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 17\r\nVisualStudioVersion = 17.2.32210.308\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PDFPatcher\", \"App\\PDFPatcher.csproj\", \"{77A9FBD2-FB25-4590-864A-64A01A8724C4}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2} = {A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jbig2\", \"JBig2\\jbig2.vcxproj\", \"{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{3243E921-0EC3-44D1-96CC-C3E05BF9C89B}\"\r\n\tProjectSection(SolutionItems) = preProject\r\n\t\t.gitattributes = .gitattributes\r\n\t\t.gitignore = .gitignore\r\n\t\tREADME.md = README.md\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|Any CPU.ActiveCfg = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|Any CPU.Build.0 = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|Win32.ActiveCfg = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|Win32.Build.0 = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|x64.ActiveCfg = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Release|Any CPU.ActiveCfg = Release|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Release|Win32.ActiveCfg = Release|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Release|Win32.Build.0 = Release|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Release|x64.ActiveCfg = Release|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{77A9FBD2-FB25-4590-864A-64A01A8724C4}.Release|x86.Build.0 = Release|x86\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|Any CPU.ActiveCfg = Debug|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|Any CPU.ActiveCfg = Release|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|x64.Build.0 = Release|x64\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|x86.ActiveCfg = Release|Win32\r\n\t\t{A8C76A16-25E3-45B6-B974-4F4CB88E5AE2}.Release|x86.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {2A79F8C5-2A16-4D1C-9DCD-C6FA86808545}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "README.md",
    "content": "# PDF 补丁丁（PDFPatcher）\n\n感谢您关注 PDF 补丁丁，请在使用软件或源代码前阅读本说明和授权协议。本软件及源代码采用 AGPL＋“**良心授权**”协议——**用户每次使用本软件后如有所获益，应行一善事；如使用源代码开发了新的软件并获得收益，应将收益中不低于千分之一的金额捐赠给社会的弱势群体**。\n\n## 功能简介\n\nPDF 补丁丁是一个 PDF 处理工具。它具有以下功能：\n\n- 修改 PDF 文档：修改文档属性、页码编号、页面链接；统一页面尺寸；删除自动打开网页等动作；去除复制及打印限制；设置阅读器初始模式；清理文档隐藏垃圾数据；重新压缩黑白图片；旋转页面。\n- 贴心 PDF 书签编辑器：带有阅读界面（具有便于阅读竖排文档的从右到左阅读方式），可批量修改 PDF 书签属性（颜色、样式、目标页码、缩放比例等），书签可精确定位到页面中间；在书签中执行查找替换（支持正则表达式及 XPath 匹配、可快速选择篇、章、节书签），[自动快速生成文档书签](https://www.cnblogs.com/pdfpatcher/p/8452025.html)。\n- 制作 PDF 文件：合并已有 PDF 文件或图片，生成新的 PDF 文件；合并后的 PDF 文档带有原文档的书签，还可挂上新书签（或根据文件名生成），新书签文本和样式可自定义；合并的 PDF 文档可指定统一的页面尺寸，以便打印和阅读。\n- 拆分或合并 PDF 文件，并保留原文件的书签或挂上新的书签。\n- 高速无损导出 PDF 文档的图片。\n- 将 PDF 页面转换为图片。\n- 提取或删除 PDF 文档中指定的页面，调整 PDF 文档的页面顺序。\n- 根据 PDF 文档元数据重命名 PDF 文件名。\n- 调用微软 Office 的图像识别引擎分析 PDF 文档图片中的文字；将图片 PDF 的目录页转换为 PDF 书签。识别结果可写入 PDF 文件。\n- 替换字体：替换文档中使用的字体；嵌入字库到 PDF 文档，消除复制文本时的乱码，使之可在没有字库的设备（如 Kindle 等电子书阅读器）上阅读。\n- 分析文档结构：以树视图显示 PDF 文档结构，可编辑修改 PDF 文档节点，或将 PDF 文档导出成 XML 文件，供 PDF 爱好者分析、调试之用。\n- 永久免费，绝不过期，无广告，无弹出废话对话框，不窥探隐私。\n\n## 授权协议\n\n《PDF 补丁丁》软件（以下简称本软件）受著作权法及国际条约条款和其它知识产权法及条约的保护。\n本软件对于最终用户免费。由于本软件使用了带有 AGPL 条款的第三方开源组件，因此，本软件及其源代码的使用协议也基于 AGPL。另外还带有如下附加条件。在遵守本软件的前提条件下，你可以在遵循本协议的基础上自由的使用和传播它，你一旦安装、复制或使用本软件，则表示您已经同意本协议条款。如果你不同意本协议，请不要安装使用本软件，也不应利用其源代码。\n\n附加条件：\n每一个使用本软件的用户，如果本软件帮助了您，每使用本软件后，您应当做 1 件善事。善事无分大小，有心则行。例如：\n\n1. 如果您的父母在身边，你可以为您的父母做一顿美味的饭菜，或者为他们按摩、洗脚；如果他们身处远方，你可以向他们发起通话，问候他们的健康和生活。\n2. 在大雨滂沱的时候，如果您有雨伞，可与同路的人共享；在烈日当空的时节，如果您看到环卫工人太阳下工作，您可以为他们买一瓶水送给他们；在拥挤的公共交通工具上，或在公共场合排队等候之际，如果您有座位，可以让给老人、孕妇或提着重物的人就坐。\n3. 您可以用您擅长的技能，为身边的人排难解困；您可以将您的知识，分享给其他人，让他们有所获益；您可以向比您困难的人捐资赠物。\n4. 如果您觉得这个软件真的好用，请将它的使用方法介绍给别人，让别人也通过使用本软件而得到好处；或者将其它您觉得好用的软件介绍给别人。\n\n如果您无法做到使用本软件后做 1 件善事，请记在心中。在有机会的时候，多行善积德。本用户协议之遵循与否，全在于您的良心。是为“**良心授权**”。\n\n相关定义：\n\n1. 软件：软件是指《PDF 补丁丁》软件以及它的更新、产品手册，以及在线文档等相关载体。\n2. 限制：你可以使用本软件的源代码开发应用程序（自由、共享或商用），也可以任意方式分发数量不限的本软件的完整拷贝，但前提是：\n① 你分发软件时必须提供本软件的完整版本，未经许可不得对软件乃至它的安装程序做任何修改；\n② 你分发软件时不能更改本授权协议；\n③ 你如果在商业性宣传活动、产品中附加本软件，应当获得著作权人的书面许可；\n④ 你如果利用本软件的源代码编写了其它软件，并且产生了销售收入，应当将该软件销售收入不低于千分之一的金额捐献给社会上的弱势群体。\n3. 支持：软件会由于用户的需求而不断更新，著作权人将提供包括用户手册、电子邮件等各种相关信息支持，但软件不确保支持内容和功能不发生变更。\n4. 终止：当你不同意或者违背本协议的时候，协议将自动终止，你必须立即删除本软件产品。\n5. 版权：本软件及源代码受著作权法及国际条约条款和其它知识产权法及条约的保护。\n6. 免责：对于本软件安装、复制、使用中导致的任何损失，本软件及著作权人不负责任。\n\n## 常用的 PDF 开源组件简介\n\nPDF 文档的规范（ISO 32000-1:2008 《Document management — Portable document format — Part 1:PDF 1.7》）可从网上找到，一般来说，它是 PDF 处理程序开发者的必读文献。\n\nPDF 文档格式中涉及印刷领域的多项技术，并有其独特的文档结构，还使用了多种数据压缩算法。要从零开始编写 PDF 文档的处理程序，对于一般人而言，通常是困难而不太现实的。PDF 补丁丁使用 .NET Framework 开发，主要采用 iText 和 MuPDF 这两个开放源代码的组件库来处理 PDF 文档。\n\n前者是 .NET 组件，与 PDF 主程序具有较好的互操作性，并且在解析、生成和修改 PDF 文档，以及嵌入 TTF 字体子集这些功能上，优胜于后者。\n\n后者采用 C 语言开发并编译，与前者相比，其最大的优点是具有渲染 PDF 文档为位图的功能。MuPDF 编译出来的动态组件库可在作者另一个开放源代码库 [SharpMuPDF](https://github.com/wmjordan/SharpMuPDF) 下载。PDF 补丁丁通过 P/Invoke 技术调用该组件库的功能。\n\n除了 PDF 开源组件之外，程序还使用了其它优秀开源组件。例如 ObjectListView 这个强大的列表控件、FreeImage 来读取和解码各种类型的点阵图像文件、Cyotek 的 ImageBox 用于显示渲染好的 PDF 文档页面、TabControlExtra 用于构建选项卡式文档界面、HTMLRenderer 用于显示 HTML 网页界面等等。\n\n## 源代码的结构\n\n- App 目录：PDF 补丁丁主程序\n  - Common：一些常用的工具类\n  - Functions：用于呈现软件各类功能的窗体和控件\n  - Lib：程序使用的第三方组件\n  - Model：编辑文档时所用的高级模型（基础数据模型由 iText 和 MuPDF 的类实现）\n  - Options：程序的选项\n  - Processor：处理 PDF 文档的算法（其中 Mupdf 目录里放置了 P/Invoke 调用 MuPDF 的类）\n- doc 目录：放置程序的使用文档\n- JBig2 目录：放置 JBIG2 图像的编码和解码库代码\n\n## 运行环境\n\n- Windows 7 以上版本的操作系统。\n- .NET Framework 4.0 到 4.8 版本。\n- 使用文字识别功能需要安装 Microsoft Office 2003（或 2007）的 Document Imaging 组件（MODI）。\n- 编译程序源代码，建议使用 Visual Studio 2022 或更新版本，并安装“.NET 桌面开发”（用于编译 PDF 补丁丁源代码）和“C++ 桌面开发”（用于编译 JBIG2 编码组件）两个工作负载。可能会遇到项目“面向不再受支持的 .NET Framework”、需要“将目标更新为 .NET Framework 4.8”的问题。简单方法是将目标更新为 .NET Framework 4.8，如不更新目标，请参考[这篇文章介绍的方法](https://www.cnblogs.com/Stay627/p/15549958.html)。\n\n## 联系作者\n\n除第三方组件外，本软件的源代码完全开放：\n\n<https://github.com/wmjordan/PDFPatcher>\n\n<https://gitee.com/wmjordan/pdfpatcher>\n\n建议通过开放源代码网站通过提交 issue 的方式提交您的建议或需求。因日常工作繁忙，暂不提供加 QQ 或微信咨询的服务，敬请谅解。\n\n在邮件或消息中，请注明你的版本号，附上截图和附件，详细说明你遇到的问题。\n\n如遇到需要提供附件的情况，请把它搞小一点。一般情况下，最好不要发送超过 10M 的附件。\n\n- 对于 PDF 文件，可用“提取页面”功能提取有代表性的页面。\n- 对于图片文件，请压缩源文件，或提供有代表性的一两页图片。\n"
  },
  {
    "path": "doc/example.xml",
    "content": "<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n<PDFϢ =\"PDFPatcher\" 汾=\"0.3.1\" ʱ=\"20110217 18:03:56\">\r\n\t<λ λ=\"\" />\r\n\t<ĵǩ>\r\n\t\t<ǩ ҳ=\"1\" ı=\"\" =\"תҳ\" />\r\n\t\t<ǩ ҳ=\"2\" ı=\"ǩ1\" =\"תҳ\">\r\n\t\t\t<ǩ ҳ=\"3\" ı=\"ǩ1\" =\"תҳ\">\r\n\t\t\t\t<ǩ ҳ=\"3\" ı=\"ǩ1\" =\"תҳ\" />\r\n\t\t\t</ǩ>\r\n\t\t\t<ǩ ҳ=\"4\" ı=\"ǩ2\" =\"תҳ\" />\r\n\t\t\t<ǩ ҳ=\"5\" ı=\"ǩ3\" =\"תҳ\" />\r\n\t\t</ǩ>\r\n\t\t<ǩ ҳ=\"10\" ı=\"ǩ2\" =\"תҳ\" />\r\n\t</ĵǩ>\r\n</PDFϢ>"
  },
  {
    "path": "doc/使用手册.md",
    "content": "# 软件功能简介\n\nPDF 补丁丁是一个用于修改 PDF 文件信息的工具。它具有以下功能：\n\n-   修改文档（带\"\\*\"号部分功能需通过高级补丁修改功能实现）：\n    -   修改文档属性（如作者、主题、关键词等）。支持通过文件名重写文档属性。\n    -   书签编辑器：添加、修改或删除 PDF 书签，设置书签的文字颜色、打开或收拢状态、点击后的跳转位置及页面缩放比例等修改 PDF 书签的功能。\n    -   替换文档中使用的字体，或将字体嵌入到原本没有嵌入字体的 PDF 文档。\n    -   添加或修改页面内的链接。\\*\n    -   添加或更改 PDF 文档的逻辑页码编号。\n    -   更改阅读器的初始设置（如显示比例、界面等）。\n    -   统一页面尺寸、裁剪或扩大页面尺寸。\n    -   调整页面旋转方向。\n    -   删除文档或页面内嵌的 XML 元数据。\n    -   删除打开文档或页面时自动执行的动作。\n    -   去除 PDF 文件复制、打印限制。\n-   高级补丁修改功能（分两步进行）。\n    -   首先导出信息文件（将 PDF 文档属性、阅读器初始状态、页码设置、页面设置、书签等信息导出成可编辑的 XML 文件。\n    -   导入信息文件生成新文件：将上述信息文件和已有 PDF 文件合并，生成新的 PDF 文档，该 PDF 文档具有 XML 信息文件的设置（如页面设置、书签等）。\n-   制作 PDF 文件：通过导入一批图片或已有 PDF 文件，生成包含图片及已有 PDF 文件指定页面范围的 PDF 文件（可挂上书签）。此功能还可拆分或合并 PDF 文件，并保留原文件的书签。\n-   自动生成 PDF 书签：分析 PDF 文档的文本，自动生成书签。\n-   文字识别：调用微软 Office\n    2003 或 2007 的光学字符识别引擎，将 PDF 文档的图片转换为文字。识别结果可写入 PDF 文档。\n-   无损导出 PDF 文件的图片。\n-   提取 PDF 文件中指定的页面。\n-   根据 PDF 文档元数据重命名 PDF 文件名。\n-   分析文档结构：以树节点形式查看 PDF 文档结构，可将页面或文档内容导出成 XML 文件、二进制文件供 PDF 爱好者分析、调试之用。\n-   支持打开并修改超过 2G 字节的超大 PDF 文档。\n\n# 使用许可及授权协议\n\n《PDF 补丁丁》软件（以下简称本软件）受著作权法及国际条约条款和其它知识产权法及条约保护。\n\n本软件对于最终用户是免费的，你可以在遵循本协议的基础上自由的使用和传播它，你一旦安装、复制或使用本软件，则表示您已经同意本协议条款。\n\n如果你不同意本协议，请不要安装使用本软件。\n\n1.  软件：软件是指《PDF 补丁丁》软件以及它的更新、产品手册，以及在线文档等相关载体。\n    \n2.  你可以以任意方式分发数量不限的本软件的完整拷贝，但前提是：\n\n\t1.  你必须提供本软件的完整版本，未经许可不得对软件乃至它的安装程序做任何修改；\n\n\t2.  你不能因此而以任何方式任何理由收取费用；\n\n\t3.  你不能够在商业性宣传活动、产品中附加本软件，除非你已获得著作权人的书面许可。\n\n3.  支持：软件会由于用户的需求而不断更新，著作权人将提供包括用户手册、电子邮件等各种相关信息支持，但软件不确保支持内容和功能不发生变更。\n\n4.  终止：当你不同意或者违背本协议的时候，协议将自动终止，你必须立即删除本软件产品。\n\n5.  版权：你需要清楚你只具备软件使用权，本软件受著作权法及国际条约条款和其它知识产权法及条约的保护。\n\n6.  免责：对于本软件安装、复制、使用中导致的任何损害，本软件及著作权人不负责任。\n\n# 软件安装及使用环境\n\n## 运行环境\n\nPDF 补丁丁要求计算机上安装了微软.NET Framework 4.0 或更高版本的运行环境才能运行。\n\n## 安装及运行程序方法\n\nPDF 补丁丁是便携软件，将压缩包解压出来，运行 PDFPatcher.exe 文件即可。\n\n## 卸载方法\n\n删除 PDF 补丁丁所在的目录即可完成卸载。\n\n# 详细功能介绍\n\n## 程序界面\n\n启动程序后，将看到下图所示的程序界面。\n\n![程序主界面](media/image3.png)\n<figcaption>图表 4--1：PDF补丁丁的程序界面</figcaption>\n\n界面主要分为上下两部分：上方是菜单和工具栏区，下方是程序功能区和功能切换区。\n\n点击菜单项目或工具栏按钮，将打开相应的功能。\n\n常用的功能在工具栏中显示为图标和功能文本，不太常用的功能则显示为图标。将鼠标移到工具栏的图标上，停留几秒钟，程序将弹出该按钮对应功能的说明文本。\n\n打开了功能之后，在功能切换区将增加一个选项卡，与该功能相对应。\n\n如不需要使用该功能了，可点击选项卡上的\"X\"按钮，将选项卡和对应的功能关闭。\n\n下文逐一介绍程序各功能。\n\n## 处理文件\n\n处理 PDF 文件功能的界面如下图所示。\n\n![新的图片](media/image4.png)\n<figcaption>图表 4--2：处理PDF文件功能</figcaption>\n\n### 文件列表\n\n处于界面中央的是\"源文件及文件属性列表\"（上图③）。该列表列出需要处理的文件及其属性。按住键盘的 Shift 键或 Ctrl 键，再用鼠标点击文件列表的源文件名，可一次选中多个文件。\n\n### 添加文件\n\n使用工具栏（上图①）上的\"添加文件\"按钮可向文件列表添加需处理的文件。在\"添加文件\"按钮右方有一个小小的倒三角形按钮。点击该按钮将弹出一个菜单，列出最近处理过的 PDF 文件。点击菜单上的文件项，也可将文件添加到文件列表。\n\n此外，还可在 Windows 资源管理器（或其它程序的文件列表框）中选中一批文件，然后用鼠标将文件项目拖放到列表上。\n\n**注意**：如选中了\"添加文件前清空列表\"复选框，则在添加文件之前会清空文件列表，再添加文件项。如果需要处理的文件要分几次才能添加到文件列表，请取消该复选框的选中状态。\n\n**说明**：添加文件时，如 PDF 文件本身被加密，并要求只有输入密码后才能打开，则会弹出一个输入身份验证的对话框以供输入密码。如不能提供正确的密码，将无法处理 PDF 文档。\n\n### 调整文件的处理顺序\n\n程序处理文件列表文件的顺序是从上到下。\n\n选中文件后，用鼠标左键拖动选中的项目，可调整文件的处理顺序。\n\n使用工具栏上的排序菜单可排序文件。排序方式有两种：\"按数值和字母顺序排序\"将文件名中的数字考虑为数值。\"按字母顺序排序\"则根据文件名的字母顺序排序。\n\n例如，导入列表中有\"1.tif\"、\"2.tif\"、\"10.tif\"和\"3.tif\"等四个文件，按数字和字母顺序排序后，由于文件名中的\"10\"比\"3\"大，因此\"10.tif\"应排在\"3.tif\"后面，故排序后顺序为\"1.tif\"、\"2.tif\"、\"3.tif\"和\"10.tif\"；如按字母顺序排序，则\"10.tif\"中\"1\"出现在\"2\"和\"3\"之前，故排序后顺序为\"1.tif\"、\"10.tif\"、\"2.tif\"和\"3.tif\"。\n\n点击文件列表的表头，也可按表头项对应的数据排序。点击第一次时执行顺序排序，再点一次则执行逆序排序。\n\n### 删除文件项目\n\n选中文件列表上的项目后，点击\"×\"按钮可删除选中的项目。\n\n### 修改输出文件的属性\n\n点击文件列表中文件项目的\"标题\"、\"作者\"、\"主题\"和\"关键词\"列，列表项将进入编辑状态。编辑项目的文本，可修改输出文件的属性（原始文件的属性不会更改）。如下图所示。\n\n![新的图片](media/image5.png)\n<figcaption>图表 4--3：修改输出文件的属性</figcaption>\n\n某些 PDF 文件的文件属性没有使用正确的编码，文件属性将显示为乱码。在这种情况下，可以在文件列表中选中该 PDF 文件，然后点击工具栏上\"刷新文档属性\"按钮右边的倒三角按钮，在弹出的菜单中选择其它编码。如下图所示。\n\n![新的图片](media/image6.png)\n<figcaption>图表 4--4：使用其它编码方式解码文档属性</figcaption>\n\n常用的编码有多种，逐一尝试，可能会选择到正确的编码方式，将乱码变成可读的文本。\n\n### 切换补丁和重命名模式\n\n在工具栏下的是\"模式切换栏\"（上图②），该栏包含两个单选框，对应两种处理方式。通过切换处理方式，可完成如下任务（详见下文）：\n\n[独立补丁](#独立补丁处理模式)：修改 PDF 文档的内容（修改书签、页面链接、解除复制限制等）生成新的文件；\n\n[重命名](#pdf文档选项)：查看 PDF 文档属性并根据文档属性重命名 PDF 文件。\n\n### 输出文件、信息文件路径及执行按钮\n\n\"生成 PDF 文件\"按钮将执行模式栏选定方式对应的任务，生成新的 PDF 文件，输出到\"输出 PDF 文件\"（上图⑤）对应的文件路径。某些功能可能涉及用于修改 PDF 文档的信息文件。可在\"PDF 信息文件\"（上图④）处指定。\n\n下文将根据上述两种处理方式分别介绍其使用方法。\n\n## \"独立补丁\"处理模式\n\n处理文件功能的\"独立补丁\"模式用于修改处理列表的每个 PDF 文件。\n\n### 补丁修改文档的操作步骤\n\n独立补丁模式通常的操作步骤如下：\n\n1.  选择<q>处理 PDF 文档</q>的\"独立补丁\"处理方式。\n\n2.  使用\"添加\"按钮或拖文件方式向文件列表添加需要处理的 PDF 文件。\n\n3.  点击界面右上角的\"[配置处理文件选项](#高级补丁功能导出导入信息文件)\"连接（或选择功能目录树中的\"PDF 文档选项\"），在该界面[指定PDF文件需要更改的设置](#高级补丁功能导出导入信息文件)（如指定阅读器界面，去除复制和打印等限制，将书签状态设置为关闭，禁止书签和页面链接改变显示比例等等）。修改的设置将应用于生成的 PDF 文件。详见 4.5 节介绍。\n\n4.  关闭选项对话框，返回\"处理/制作 PDF 文件\"功能，指定输出 PDF 文件的路径（可在文本框中插入包含替代符的输出文件名，替代符的使用方式详见 4.3.2 节）。\n\n5.  点击\"生成 PDF 文件\"按钮。程序将逐一按\"PDF 文档选项\"的设置处理文件列表中的 PDF 文件，并生成对应的新 PDF 文件到输出位置。\n\n### 批量操作输出文件命名规则\n\n为了正确操作多个原始文件的批量补丁操作，有必要了解批量操作后文件输出的位置及命名规则。程序有两种命名规则：默认命名规则和替代符命名规则。\n\n#### 默认命名规则\n\n在文件列表的文件有多个的情况下，输出文件名为\"输出 PDF 文件\"指定文件名所在的目录名+原始文件名+\".pdf\"后缀。\n\n例如：设选中的原始 PDF 文件处于\"M:\\\\abc\"文件夹下，有\"f1.pdf\"和\"f2.pdf\"两个。\"输出 PDF 文件\"对应的目录为\"E:\\\\efg\"，文件名为\"xyz.pdf\"（即路径为\"E:\\\\efg\\\\xyz.pdf\"）。\n\n在批量操作中，程序将忽略输出路径的文件名部分，输出文件到\"E:\\\\efg\"目录，文件名为\"f1.pdf\"和\"f2.pdf\"。如下表及示意图所示。\n\n表格 4--1：批量操作输出文件名示例\n\n| 输入文件名      | \"输出PDF文件\"位置 | 实际输出文件名  |\n| --------------- | ----------------- | --------------- |\n| M:\\\\abc\\\\f1.pdf | E:\\\\efg\\\\xyz.pdf  | E:\\\\efg\\\\f1.pdf |\n| M:\\\\abc\\\\f2.pdf | E:\\\\efg\\\\xyz.pdf  | E:\\\\efg\\\\f2.pdf |\n\n![新的图片](media/image7.png)\n<figcaption>图表 4--5：默认命名规则输出的文件</figcaption>\n\n#### 替代符命名规则\n\n在\"输出 PDF 文件\"组合编辑框中，点击鼠标右键，将弹出一个上下文菜单。点击菜单的项目可插入替代符。在输出文件时，文件名的替代符将被替换成相应的内容。插入替代符的操作界面如下图所示。\n\n![新的图片](media/image8.png)\n<figcaption>图表 4--6：在输出路径中插入替代符</figcaption>\n\n各替代符的含义如下表所示。\n\n表格 4--2：替代符含义\n\n| 替代符名称         | 替代内容                                                                                              |\n| ------------------ | ----------------------------------------------------------------------------------------------------- |\n| `<标题>`           | 原始文档的\"标题\"属性                                                                                  |\n| `<作者>`           | 原始文档的\"作者\"属性                                                                                  |\n| `<主题>`           | 原始文档的\"主题\"属性                                                                                  |\n| `<关键字>`         | 原始文档的\"关键字\"属性                                                                                |\n| `<源目录路径>`     | 原始PDF文件路径除文件名的部分（设源文件的路径为\"M:\\\\abc\\\\efg\\\\hi.pdf\"，则替代符表示\"M:\\\\abc\\\\efg\\\\\"） |\n| `<源文件名>`       | 原始PDF文件路径文件名不含扩展名的部分（设源文件的路径为\"M:\\\\abc\\\\efg\\\\hi.pdf\"，则替代符表示\"hi\"）     |\n| `<源目录名>`       | 原始PDF文件路径的文件夹名称（设源文件的路径为\"M:\\\\abc\\\\efg\\\\hi.pdf\"，则替代符表示\"efg\"）              |\n\n提示：源文件的属性已在文件列表中列出。\n\n举例说明如下：\n\n设选中的原始 PDF 文件有\"M:\\\\abc\\\\efg\\\\f1.pdf\"和\"M:\\\\abc\\\\efg\\\\f2.pdf\"两个。\n\n其中\"f1.pdf\"文件具有以下文档属性：\"标题\"为\"示例 1\"，\"作者\"为\"W. Jordan\"，\"关键词\"为\"示例文档\"。\n\n\"f2.pdf\"文件不具有文档属性。\n\n输出路径为`<源目录路径><标题>`，`<源目录路径>`表示原始 PDF 文件除文件名以外的路径部分。\"`<标题>`\"表示文档的\"标题\"属性。\n\n由于\"f2.pdf\"文档不包含\"标题\"属性，因此，替代符替代的结果导致文件名为空。在这种场合下，程序将自动使用原路径的文件名作为输出的文件名部分。\n\n输出情况如下表所示。\n\n表格 4--3：输出路径包含替代符\"`<源目录路径><标题>`\"时的输出文件名\n\n| 输入文件名           | 文档属性            | 输出文件名              |\n|----------------------|---------------------|-------------------------|\n| M:\\\\abc\\\\efg\\\\f1.pdf | 标题=\\\"示例1\\\" <br>作者=\\\"W. Jordan\\\" <br>关键词=\\\"示例文档\\\"     | M:\\\\abc\\\\efg\\\\示例1.pdf |\n| M:\\\\abc\\\\efg\\\\f2.pdf | 无文档属性          | M:\\\\abc\\\\efg\\\\f2.pdf    |\n\n**注意**：本示例中，\"f2.pdf\"文件输出路径和原始路径相同，因此无法执行补丁。\n\n![新的图片](media/image9.png)\n<figcaption>图表 4--7：替代符命名规则输出的文件</figcaption>\n\n## 高级补丁功能（导出、导入信息文件）\n\n高级补丁功能用于将 PDF 文档的信息导出成一个可编辑的文档。该文档包含 PDF 文档属性、书签、页面链接、页面尺寸等信息，称为\"信息文件\"。\n\n补丁操作分两步进行：\n\n第一步，[导出信息文件](#导出信息文件)：将 PDF 文档中的信息导出成[可编辑修改的XML信息文件](#xml信息文件参考)。\n\n第二步，[导入信息文件](#导入信息文件)：使用文本编辑器修改上一步骤导出 XML 文件，然后在处理 PDF 文件处指定信息文件，点击\"生成 PDF 文件\"按钮，将源 PDF 文件和信息文件合并，生成一个具有修改后的设置的新 PDF 文件。\n\n### 导出信息文件\n\n操作步骤如下所示。\n\n1.  选择<q>处理 PDF 文档</q>的<q>独立补丁</q>处理方式。\n\n2.  向文件列表添加需导出信息的 PDF 文件。\n\n3.  点击<q>PDF 信息文件</q>右方的<q>浏览</q>按钮，指定保存导出信息文件的位置。\n\n4.  点击<q>导出信息文件</q>按钮，程序将会把原始 PDF 文件中的信息导出到<q>PDF 信息文件</q>对应的位置。\n\n操作步骤如下图所示：\n\n![新的图片](media/image10.png)\n<figcaption>图表 4--8：导出信息文件的过程</figcaption>\n\n### 关于\"信息文件\"\n\n信息文件有两种类型：一种是[XML格式的信息文件](#应用示例)（文件名后缀为\"xml\"），另一种是[简易文本文件](#简易书签文件参考)（文件名后缀为\"txt\"）。\n\n在导出信息文件时，信息文件的类型由文件名后缀确定。例如，信息文件名为\"文件.xml\"，则导出 XML 格式的信息文件；信息文件名为\"文件.txt\"，则导出简易文本书签文件。\n\nXML 信息文件包含的信息较全，较丰富。其可包含的信息有文档属性、阅读器设定、书签、页面链接、页面布局设置等。请参见第 6 章的介绍。\n\n文本书签文件只包含文档属性和指向页面的书签信息（详见第 7 章），信息量远少于 XML 信息文件。如将 PDF 文档的书签导出成简易文本书签文件，编辑后重新导入到文档，由于简易文本书签包含的信息量较少，可能导致原文档的书签丢失一些信息（如无法精确定位到页面的指定位置等）。因此，一般场合下不要导出简易文本书签文件。\n\n### 导入信息文件\n\n在上一个步骤导出了信息文件后，可用文本编辑器或 XML 编辑器打开，修改里面的信息。修改后，可将信息文件的内容与原始 PDF 文件合并，生成一个新的 PDF 文件。操作步骤如下所示。\n\n1.  按上一步骤的操作，指定 PDF 源文件和信息文件。\n\n2.  点击<q>输出 PDF 文件</q>右边的<q>浏览</q>按钮，指定保存补丁后 PDF 文件的位置；或者可直接在输出 PDF 文件对应的组合框中输入输出文件路径。\n\n3.  点击<q>生成 PDF 文件</q>按钮。程序将切换到输出信息界面。如导入成功，则输出的 PDF 文件将包含原始 PDF 文件的内容，以及 PDF 信息文件所附带的信息。\n\n![新的图片](media/image11.png)\n<figcaption>图表 4--9：导入信息文件的过程</figcaption>\n\n信息文件的内容不一定需要全部导入 PDF 文件，可在<q>信息文件选项</q>功能的<q>导入选项</q>处指定应导入信息文件的哪些内容。\n\n关于信息文件的详细使用方法，请参阅[应用示例](#应用示例)和[信息文件参考](#xml信息文件参考)。\n\n### 批量处理方式\n\n如选定的原始 PDF 文件有多个，则导出信息文件时将导出到<q>PDF 信息文件</q>组合框指定的目录，而信息文件名则按 PDF 文件名来命名。\n\n例如：选中的原始 PDF 文件处于\"M:\\\\abc\"文件夹下，有\"f1.pdf\"和\"f2.pdf\"两个。点击<q>PDF 信息文件</q>右边的<q>浏览</q>按钮后，指定信息文件放在\"M:\\\\efg\"目录，文件名为\"xyz.xml\"（即路径为\"M:\\\\efg\\\\xyz.xml\"）。程序在批量操作中将忽略输出路径的文件名部分，故实际输出的信息文件将放在\"M:\\\\efg\"目录，文件名为\"f1.xml\"和\"f2.xml\"。\n\n表格 4--4：批量导出信息文件的输出文件名示例\n\n| 输入文件名      | \"PDF信息文件\"位置  |实际输出信息文件名|\n| --------------- | ------------------ | ---------------- |\n| M:\\\\abc\\\\f1.pdf | M:\\\\efg\\\\xyz.xml   |M:\\\\efg\\\\f1.xml   |\n| M:\\\\abc\\\\f2.pdf | M:\\\\efg\\\\xyz.xml   |M:\\\\efg\\\\f2.xml   |\n\n![新的图片](media/image12.png)\n<figcaption>图表 4--10：批量导出书签的命名规则</figcaption>\n\n导入文件时，信息文件的命名规则同上，即程序读取<q>PDF 信息文件</q>所在目录中与 PDF 文件相同文件名的信息文件作为批量处理时的信息文件。\n\n输出文件的命名，则按 4.3.2 节所述的方式确定。\n\n### 信息文件选项\n\n信息文件选项用于指定高级补丁两个步骤中导出、导入的内容。选择程序<q>选项</q>菜单中的<q>信息文件选项</q>命令，将弹出信息文件选项对话框。\n\n#### 常规导出选项\n\n常规导出选项指定[导出信息文件](#导出信息文件)功能导出的内容。界面如下所示。\n\n![新的图片](media/image13.png)\n<figcaption>图表 4--11：信息文件选项（常规导出选项）</figcaption>\n\n各选项说明如下。\n\n1. <q>字符编码</q>：指定使用何种编码导出信息文件。系统默认编码为 GBK。某些 PDF 文件包含一些无法用 GBK 编码来表示的字符。这时可尝试选择该下拉框的<q>GB18030</q>、<q>UTF-8</q>或<q>UTF-16</q>等编码方式（使用系统默认、UTF-8 或 UTF-16 编码方式导出的信息文件可用 Windows 记事本直接打开编辑）。\n2. <q>文档属性</q>：指定是否导出 PDF 文档的标题、作者、关键字、主题等元数据信息。\n3. <q>文档书签</q>：指定是否导出 PDF 文档内的书签信息。当需要修改 PDF 书签时，可选中此选项。\n4. <q>页面内的链接</q>：指定是否导出 PDF 文档页面内的链接。对于某些 PDF 文档，点击其中某些区域可跳转到文档的其它位置，打开新的文档或打开网站等，当需要修改这些链接时可选择此选项。\n5. <q>解析书签和页面链接的命名位置</q>：PDF 文档中的<q>命名位置</q>是一个用特定名称表示的跳转目标，与书签信息是独立存储的。如发现导出的 PDF 书签或页面链接无法补丁到 PDF 文档，可尝试选中此选项，将书签和页面链接的命名位置转换为实际位置。\n6. <q>阅读器设置</q>：指定是否导出初始排版方式（如单页、单页连续、双页等）、页码样式（在 PDF 阅读器中看到的逻辑页码编号方式，如\"I\"、\"II\"、\"III\"形式的罗马数字页码，\"A\"、\"B\"、\"C\"形式的英文字母顺序页码）等设置。\n7. <q>尺寸度量单位</q>：指定使用何种单位表达 PDF 文档坐标值。程序中默认为<q>厘米</q>。\n\n提示：PDF 文档中使用的标准度量单位是<q>点</q>。如需精确导出定位信息，请选择<q>点</q>为度量单位。\n\n#### 高级导出选项\n\n高级导出选项是 PDF 补丁丁为 PDF 开发人员提供的高级功能。该功能可以 XML 表示形式导出 PDF 页面的内容、处理指令等信息，供开发参考。界面如下所示。\n\n![新的图片](media/image14.png)\n<figcaption>图表 4--12：信息文件选项（高级导出选项）</figcaption>\n\n1. <q>导出编录信息</q>：选中该复选框后，导出的信息文件将包含 PDF 编录（Catalog）字典中的内容。\n2. <q>导出页面内容</q>：选中该复选框后，导出的信息文件将包含 PDF 页面的字典、绘制指令等内容，供调试、研究文档之用。\n3. <q>页码范围</q>：指定仅导出部分页面的内容。如不指定页码范围，则导出所有页面的内容。\n4. 选中<q>导出页面字典信息</q>复选框，可导出页面的字典信息。\n5. 选中<q>导出绘制页面命令</q>复选框，可导出向页面输出文本、图片和图像等内容的指令。\n6. 选中<q>将图片导出为独立文件</q>复选框，可把图片保存为独立的文件，而不写入到 XML 信息文件。\n7. 选中<q>解码导出页面内的文本</q>复选框，可把文档页面内容流的文本解码提取出来。\n\n如仅需要分析二进制流前面若干字节的内容，可在<q>限制导出二进制流字节数</q>的数字调整框中输入数值，如\"100\"，表示仅导出二进制流前面 100 个字节的内容。\n\n**说明**：高级导出选项导出的 XML 内容仅供参考，不会在导入时写入 PDF 文档。PDF 文档中的二进制内容将使用 HexBin 编码方式编码成 XML 文档中的 CDATA 字符串。\n\n#### 导入选项\n\n导入选项用于指定高级补丁功能中导入的内容，其界面及各选项含义如下。\n\n![新的图片](media/image15.png)\n<figcaption>图表 4--13：PDF文档选项（信息文件内容）</figcaption>\n\n1. <q>文档属性信息</q>：是否使用信息文件中指定的元数据（如作者、主题、关键字等）。\n2. <q>文档书签</q>：是否使用信息文件中指定的书签。如不选中此选项，则输出文件的书签与原始 PDF 文件的相同。书签格式可参考[信息文件参考](#xml信息文件参考)中[书签](#文档书签)一节的说明。\n3. <q>页面内的链接</q>：是否导入信息文件中包含的页面链接。如选择此选项，则可用信息文件中的页面链接替换（选择<q>原页面链接</q>右方的<q>替换</q>单选框）或叠加（选择<q>保留</q>单选框）原始 PDF 文件的页面链接。\n4. <q>阅读器设置</q>：是否导入阅读器的初始状态（如是否在打开文档时显示书签、全屏显示、初始页面状态）和页码编号方式。\n5. <q>页面设置</q>：是否导入各页面的尺寸、裁剪边框、旋转角度等数据。\n\n## PDF文档选项\n\nPDF 文档选项用于指定如何修改 PDF 文档。点击工具栏上的<q>PDF 文档选项</q>项目，将打开 PDF 文档选项对话框。\n\n选项对话框以选项卡形式划分选项。界面分<q>页面尺寸</q>、<q>阅读方式</q>、<q>压缩清理</q>、<q>文档属性</q>、<q>页码标签</q>和<q>替换字体</q>等选项卡，分别介绍如下。\n\n### 页面尺寸\n\n该选项可统一 PDF 文档的尺寸，或调整页面边框的留白，其界面及各选项含义如下。\n\n**说明**：选项卡的默认状态如下图所示。如更改了界面的设置，导入信息时以界面上的设置为准；如保留默认设置，则以信息文件指定的信息为准。\n\n![新的图片](media/image16.png)\n<figcaption>图表 4--14：PDF文档选项（页面尺寸）</figcaption>\n\n1. <q>页面尺寸、宽、高</q>：在此列表可指定输出 PDF 文件的页面尺寸。更改<q>页面尺寸</q>列表的选中项目后，具体尺寸将在<q>宽</q>和<q>高</q>对应的文本框中显示。最终的页面尺寸以<q>宽</q>和<q>高</q>指定的尺寸为准。即使源 PDF 文件页面尺寸不同，输出后的页面均将统一尺寸。\n2. <q>特殊页面尺寸</q>：\n\t1. <q>等同原始内容尺寸</q>：不改变输出的 PDF 文档的页面尺寸。\n\t2. <q>固定页宽自动高度</q>：自由指定输出 PDF 文档页面宽度，将源 PDF 页面等比例缩放到指定的宽度。\n3. <q>位置</q>：指定源 PDF 页面在新尺寸页面上的对齐方式。\n4. <q>页面留白</q>：在页面四边留下的空白。选中<q>同步调整四边留白</q>选项时，更改任一个留白数值会改变其余三个的值。取消选中该选项框，可单独调整各边留白数值。数值可以为负数，用于减少页面留白。\n\n### 阅读方式\n\n阅读方式选项卡用于指定阅读器的界面设置，其界面及各选项含义如下。\n\n**说明**：选项卡的默认状态如下图所示。如更改了界面的设置，导入信息时以界面上的设置为准；如保留默认设置，则以信息文件指定的信息为准。\n\n![新的图片](media/image17.png)\n<figcaption>图表 4--15：PDF文档选项（阅读方式）</figcaption>\n\n阅读器设定：指定阅读器的初始视图、阅读方向和初始模式。下拉列表中选择<q>保持不变</q>时，以信息文件或原始 PDF 文件中指定的设定为准。\n\n在一屏显示两页竖排文本（如某些古籍）的场合下，可设置文档的阅读方向为<q>从右到左</q>，以适应竖排阅读方式。\n\n<q>书签状态</q>选项用于指定是否打开（展开）或关闭所有书签。不指定状态时，以信息文件或原始 PDF 文件中指定的状态为准。\n\n<q>书签及链接动作</q>：指定书签及页面内链接的缩放比例。有些书签或页面链接在点击后会改变阅读器当前的显示比例，选中<q>禁止书签及页面链接更改显示比例</q>复选框，可去除此类行为，使点击书签及页面链接后仍保持阅读器的显示比例。有些 PDF 文档，更改文件名后书签失效，选中<q>强制将外部 PDF 文件链接改成内部链接</q>选项，可修复此类书签。\n\n<q>阅读器操作界面设定</q>：指定在 PDF 阅读器中打开 PDF 文件时的界面。默认状态下，不强制更改 PDF 阅读器的界面设置。如需重写 PDF 文档的操作界面设定，可选中<q>指定操作界面设置</q>复选框。选中该复选框后，下面灰色被禁用的复选框将变成可操作的状态。通过设置这些复选框的选中状态，可指定打开文档后 PDF 阅读器的界面。\n\n### 压缩清理\n\n此功能用于提高 PDF 文档的压缩率，并可清理一些不需要的内容。其界面及选项内容如下。\n\n![新的图片](media/image18.png)\n<figcaption>图表 4--16：PDF文档选项（压缩清理）</figcaption>\n\n1. <q>源文档处理、源文档页面处理</q>：用于清除限制（如复制、打印等限制）、自动执行的动作、文档批注及元数据信息。\n\n   **说明**：关于扩展标记（XML）元数据属性：XML 元数据属性是一种附加在文档上的标注信息，一般不影响阅读，如无需要可将其删除。\n\n2. <q>尝试修复文档错误</q>：一般场合下没有必要选择此复选框。若打开某些 PDF 文档时出现<q>操作符无效</q>错误，可选中此复选框尝试修复文档内容。\n\n3. <q>清楚页面所有文本</q>：一般场合下不要选择此复选框。该选项将清除页面上所有的文本内容。\n\n4. <q>压缩索引表和书签</q>：选中此选项时，程序将压缩 PDF 的索引表和书签等数据，尽最大限度减少 PDF 文件占用的空间。\n\n   **注意**：低版本或不兼容的 PDF 阅读器可能无法打开压缩索引表的 PDF 文档。\n\n5. <q>优化压缩黑白图片</q>：选中此选项时，程序将尝试使用 JBIG2 算法压缩 PDF 文档内的黑白图片，以求减少图片所占用的文件空间。如果压缩后无法减少文件大小，将保持原图片不变。选择此选项不会降低图像质量，但可能会使用更多的处理时间。\n\n### 文档属性\n\n文档属性选项卡用于指定文档属性。一般场合下不需要使用此选项卡设置文档属性，在文档列表中直接输入需要设置的文档属性即可。此选项卡是用于批量设置文档属性的。其界面及各选项含义如下。\n\n**说明**：选项卡的默认状态如下图所示。如更改了界面的设置，导入信息时以界面上的设置为准；如保留默认设置，则以信息文件指定的信息为准。\n\n![新的图片](media/image19.png)\n<figcaption>图表 4--17：PDF文档选项（文档属性）</figcaption>\n\n文档信息：选中<q>使用此处设定的文档属性信息</q>复选框后，可指定文档标题、作者、主题、关键词等属性。\n\n在<q>独立补丁</q>处理模式下，可用鼠标右键点击各文档属性文本框，弹出插入`<源文件名>`和`<源目录名>`替代符的菜单命令。`<源文件名>`表示使用源 PDF 文件的文件名作为指定的文档属性，`<源目录名>`表示使用目录名称作为指定的属性。使用此功能可使用 PDF 文件名或目录名轻松修改 PDF 文件的属性。\n\n重写文档属性时，如设定的文档属性为空，则保留 PDF 文档相应的原始属性。如属性为一个或多个半角空格（` `），则删除 PDF 文档对应的原始属性。\n\n### 页码标签\n\nPDF 文档的页码标签通常在 PDF 阅读器的翻页控件上显示，表示文档中的逻辑页码。\n\n页码标签选项卡可用于指定逻辑页码标签，其界面及各选项含义如下。\n\n**说明**：选项卡的默认状态如下图所示。如更改了界面的设置，导入信息时以界面上的设置为准；如保留默认设置，则以信息文件指定的信息为准。\n\n![新的图片](media/image20.png)\n<figcaption>图表 4--18：PDF文档选项（页码标签）</figcaption>\n\n点击<q>添加</q>按钮可新增一个页码标签。如需修改页码标签，可直接点击列表框相应的页码标签项修改其内容。点击<q>删除</q>按钮可删除选中的页码标签。\n\n1. <q>文档页码</q>：表示文档中使用此页码标签的实际页码。在 PDF 阅读器界面上，从该页开始，后面的页面将使用设置的标签显示页码。\n\n2. <q>页码样式</q>：页码编号的样式。默认为数字，此外可使用罗马数字及英文字母。\n\n3. <q>前缀文本</q>：在逻辑页码标签前的文本。\n\n4. <q>起始号码</q>：逻辑页码标签开始编号的号码，一般保持为 1。\n\n现以下图为例，说明页码标签的用法。\n\n![新的图片](media/image21.png)\n<figcaption>图表 4--19：页码标签设置示例</figcaption>\n\n在上图中，第一项的文档页码为 1，页码样式为\"大写英文字母\"，前缀文本为\"封面\"，起始页码为\"1\"，则在阅读器中第 1 页的页码显示为\"封面 A\"。\n\n第二项的文档页码为 2，页码样式为\"大写罗马数字\"，前缀文本为\"目录-\"，起始页码为\"1\"，则在阅读器中从第 2 页开始，到第 8 页为止（共 7 页），页码显示为\"目录-I\"、\"目录-II\"、\"目录-III\"......\"目录-VII\"。\n\n第三项的文档页码为 9，页码样式为\"数字\"，前缀文本为空，起始页码为 1，则在阅读器中从第 9 页开始到文档最后一页，页码显示为\"1\"、\"2\"、\"3\"......\n\n### 替换字体\n\n替换字体选项卡的设置内容用于将 PDF 文档的字体更换为系统中安装的其它字体。对于某些没有嵌入字体的 PDF 文档，此功能还可实现嵌入字体的功能。其界面及各选项含义如下。\n\n![新的图片](media/image22.png)\n<figcaption>图表 4--20：PDF文档选项（替换字体）</figcaption>\n\n<q>嵌入汉字库</q>：选中此选项后，为没有嵌入字库的 PDF 文档自动嵌入如下常见字库：宋体、黑体、楷体、仿宋体、幼圆体。\n\n<q>允许替换字体</q>：选中此选项后，可替换 PDF 文档中的字体。\n\n<q>列出文档字体</q>：要替换 PDF 文档中的字体，首先需要知道文档中采用了哪些字体。点击此按钮，将出现一个对话框。如下图所示。\n\n![新的图片](media/image23.png)\n<figcaption>图表 4--21：列出文档字体</figcaption>\n\n点击<q>浏览</q>按钮，选择需列出字体的 PDF 文档，再点击<q>列出字体</q>按钮，该文档中使用到的字体将列出到对话框下方的列表。\n\n选中字体名称对应的复选框，再点击<q>添加选中项至替换列表</q>按钮，选中的字体就会被添加到 PDF 文档选项的替换字体列表。点击列表项目右方<q>替换字体</q>列，指定系统中安装的字体。\n\n执行补丁操作后，<q>原字体</q>列的字体就会被替换为<q>替换字体</q>列的字体了。\n\n## 重命名处理模式\n\n此功能用于查看 PDF 文档的属性，并可根据文档属性更改 PDF 文件名。\n\n操作方式与独立补丁处理模式类似。\n\n输出 PDF 文件用于更改 PDF 文件的命名模板。命名模板支持替换符，因此可用文档属性（如<q>标题</q>重命名 PDF 文件）。关于替换符的用法请参见[替代符命名规则](#替代符命名规则)一节的介绍。\n\n点击<q>测试</q>按钮可预览重命名结果。\n\n点击<q>生成 PDF 文件</q>按钮，将按重命名模板更改源 PDF 文件名称为模板指定的名称。如选中<q>保留原始文件</q>复选框，则保留重命名之前的 PDF 文件，否则文件会被改为新的名称。\n\n## 合并文件\n\n此功能可实现多种方式制作 PDF 文件的功能，例如制作扫描书籍的电子书、将整个目录的图片和 PDF 文件合并为一个 PDF 文件等。\n\n合并功能还可在已有的 PDF 文件中抽取指定范围的页面，导出到生成的 PDF 文件，即具有合并或拆分 PDF 文件。\n\n在界面正中有一个列表框，称为<q>文件列表</q>。在文件列表，可混合指定图片和 PDF 文件，将图片插入到 PDF 文件的页面中。\n\n双击列表中的源 PDF 文件，可以指定该文档中参与合并操作的页码范围。页码范围默认为第一页到最后一页，通过修改页码范围，可实现拆分、重排 PDF 文件页面的功能。\n\n此外，可通过修改[合并文档选项](#合并文档选项)的设置，在合并 PDF 文件时指定输出 PDF 文件的属性。\n\n本功能的界面如下图所示。\n\n![](media/image24.PNG)\n<figcaption>图表 4--22：合并文档功能</figcaption>\n\n### 操作方法\n\n使用合并文件功能生成 PDF 文档的操作步骤如下。\n\n1.  点击工具栏上的<q>合并文件</q>按钮。\n\n2.  向文件列表添加图片（JPEG、PNG、GIF、BMP 和 TIFF 文件）或源 PDF 文件。每个图片将成为 PDF 文档的一页，如有 3 个图片，则 PDF 文档有 3 页；10 个图片则文档有 10 页。如果图片文件有多帧，则每帧将作为单独的一页。\n\n3.  如需添加空白页，可点击工具栏的<q>插入空白页</q>按钮。\n\n4.  点击<q>添加文件夹</q>按钮，将弹出一个打开文件的对话框。使用该对话框定位到需要添加的文件夹，点击<q>打开</q>按钮，可以将该文件夹中所有的图片或 PDF 文件添加到列表（含子文件夹的文件）。\n\n5.  如果添加了不需要合并的文件或文件夹，可以选中该项目，然后点击工具栏上的<q>删除文件</q>按钮将该文件或文件夹从文件列表中删除。\n\n6.  如需为生成的 PDF 文件挂上书签，可点击<q>PDF 信息文件</q>右边的<q>浏览</q>按钮，指定书签文件的位置。信息文件不是必需的，可不指定。不指定书签时，程序根据文件列表中<q>书签文本</q>列为生成的 PDF 文件生成书签。\n\n7.  点击<q>输出 PDF 文件</q>右边的<q>浏览</q>按钮，指定制作 PDF 文件的保存位置。\n\n8.  点击<q>生成 PDF 文件</q>按钮。\n\n9.  程序将创建 PDF 文件，然后按文件列表的顺序逐一将图片或源 PDF 文件添加到输出 PDF 文件的页面。\n\n提示：除了使用添加文件或文件夹的按钮之外，还可以直接从资源管理器将文件拖放到文件列表。\n\n#### 排序文件\n\n选中文件项目后，用鼠标点住需要移动文件的文本区域，然后拖动鼠标，就可以移动文件。将鼠标移到其它文件项上面，释放鼠标按键，就可使选中的文件移到对应的位置。\n\n例如，在下图中选中<q>程序主界面.PNG</q>和<q>子文件夹 2</q>两个文件项后，用鼠标将其拖动到<q>文件夹 1</q>书签上。在<q>文件夹 1</q>上将显示一个蓝色的矩形。\n\n![新的图片](media/image25.png)\n<figcaption>图表 4--23：排序文件项目</figcaption>\n\n蓝色的矩形有四个区域，在不同区域释放鼠标按键有不同移动方式。以上图为例。\n\n在①区域上释放鼠标按键，选中的文件项目将移动到\"文件夹 1\"的前面。\n\n在②区域上释放鼠标按键，选中的文件项目将移动到\"文件夹 1\"的后面。\n\n在③区域上释放鼠标按键，选中的文件项目将移动到\"文件夹 1\"的所有子项的前面。\n\n在④区域上释放鼠标按键，选中的文件项目将移动到\"文件夹 1\"的所有子项的后面。\n\n移动文件项目后的效果分别如下图各标记所示（被移动的两个文件项目为选中状态）。\n\n![新的图片](media/image26.png)\n<figcaption>图表 4--24：移动文件项的效果</figcaption>\n\n**说明**：在拖动书签时，按键盘的 Esc 键可取消拖动操作。\n\n#### 设置书签文本和书签样式\n\n合并生成 PDF 文件时可指定导航书签，在阅读器中点击书签将跳转到与文件对应的页面。\n\n书签文本在合并文件列表的<q>书签文本</q>列设置。将文件添加到合并文件列表后，点击<q>书签文本</q>列的单元格。该单元格将进入编辑状态，在其中输入文本，即可为文件设置对应的书签项。\n\n在书签文本不为空的情况下，选中文件项，再点击工具栏上的<q>B</q>和<q>I</q>按钮，可分别为书签项设置粗体和斜体样式；点击工具栏上调色板按钮旁边的倒三角形小按钮，可设置书签项的文本颜色。\n\n如果书签文本内容为空，则该项目不生成书签。如果该项有子项，且子项文本不为空，则子项仍生成对应的书签。\n\n**说明**：在添加文件到合并文件列表时，程序自动根据文件名设置其对应的书签文本。此行为可在合并文件选项中调整。\n\n#### 裁剪源图片选项\n\n双击文件列表的图片文件，将弹出<q>源图片处理选项</q>对话框，如下图所示。使用该对话框可指定在导入图片制作 PDF 文件时，先裁剪图片，再导入到文档。\n\n![新的图片](media/image27.png)\n<figcaption>图表 4--25：源图片处理选项对话框</figcaption>\n\n#### 筛选源PDF文件页面选项\n\n双击文件列表的 PDF 文件，将弹出<q>源 PDF 文件选项</q>对话框，如下图所示。使用该对话框可指定仅导入源 PDF 文档的若干页面，或仅导入 PDF 文档内的图片。\n\n导入及处理源 PDF 文件图片方式栏中的控件默认状态为禁用。只有选中<q>仅导入源 PDF 文件的图片</q>复选框后才可用。导入图片选项与[提取图片](#全局选项)功能的选项类似，请参见该章节的说明。\n\n提示：页码范围支持逆序范围，如页码范围\"10-1\"，将先插入源文件的第 10 页，再插入第 9 页，以此类推，最后插入第 1 页到输出文档。\n\n![新的图片](media/image28.png)\n<figcaption>图表 4--26：源PDF文件选项对话框</figcaption>\n\n### 已知问题\n\n-   导入书签的尺寸要符合所选输出文件的尺寸，否则定位坐标可能不准确。\n\n-   源 PDF 文件的文档属性及元数据不会输出到生成的目标文件，但可通过指定信息文件的方式将其导入到输出文件，或在<q>PDF 文档选项</q>指定文档信息。\n\n## 合并文档选项\n\n合并文档选项用于指定合并功能生成的 PDF 文档的选项。点击工具栏上的<q>合并文档选项</q>项目，或点击界面上的<q>设置合并 PDF 文档选项</q>链接，将打开<q>合并文档选项</q>对话框。\n\n选项对话框以选项卡形式划分选项。界面分<q>页面布局</q>、<q>阅读方式</q>、<q>书签</q>、<q>文档杂项</q>和<q>页码标签</q>等选项卡。其中，<q>阅读方式</q>、<q>文档杂项</q>和<q>页码标签</q>的内容和功能与 PDF 文档选项基本一致，在此不在赘述。下文将介绍<q>页面布局</q>和<q>书签</q>两个选项卡。\n\n### 页面布局\n\n<q>页面布局</q>选项卡界面如下图所示，该界面类似于 PDF 文档选项的<q>页面尺寸</q>对话框，但增加了如下选项。\n\n![](media/image29.PNG)\n\n自动旋转页面适应原始内容纵横方向：选中此选项时，如图片纵横方向与页面不同，并且页面无法容纳图片时，程序将自动旋转页面以更好地适应图片。\n\n例如，点击<q>尺寸</q>下拉列表，选择页面尺寸为 16 开页面（宽 184 毫米、高 260 毫米），是宽度小于高度的纵向页面。这时输入的源页面尺寸为 1024 像素宽、768 像素高，该图片为宽度大于高度的横向页面。如不选中本选项，则横向的图片直接放到纵向的页面上，会留下很多空白（下图左）\n\n选中本选项后，程序将自动把页面布局设为横向，适应源图片的方向，再将源图片的内容放到新页面上（下图右）。\n\n![shot](media/image30.jpeg)\n\n1. <q>缩放原始内容适应页面</q>：指定是否调整源图片尺寸以适合页面尺寸。选中<q>无损缩小</q>复选框，当页面小于原始内容尺寸时，将原始内容缩小到适合页面。选中<q>无损放大</q>复选框，则当原始内容小于页面尺寸时，将其放大到适合页面。\n\n\t**提示**：调整缩放比例不会降低图片的质量（该操作仅用 PDF 内置缩放命令使图片呈现不同的尺寸）。\n\n2. <q>源 PDF 页面调整</q>：指定是否改变源 PDF 文件的页面放大比例，使之适合输出文档页面的尺寸。默认选中<q>调整为页面尺寸</q>，程序保持文档原内容不动，但更改页面尺寸，使之与页面设置的尺寸保持一致。这样可以扩大页面空白面积以便添加批注，或隐藏页面上不必要的空白方便阅读。如选中<q>缩放内容适应页面</q>，从源 PDF 文件导入的页面将拉伸到适合输出文档页面的尺寸。\n\n3. <q>黑白图片设为透明</q>：对于只有黑白两色的图片，将其设置为透明（在 PDF 阅读器中将不可选中并复制该图片）。\n\n4. <q>优化压缩黑白图片</q>：使用压缩率较高的 JBIG2 算法压缩黑白图片。\n\n### 书签\n\n书签选项卡包含控制 PDF 文件生成书签的选项，其界面如下。\n\n![](media/image31.PNG)\n<figcaption>图表 4--27：PDF文档选项（书签）</figcaption>\n\n添加项目时根据文件名自动生成书签文本：选中此项时，为每个源文件（图片或源 PDF 文件）对应的页面添加一个书签项，书签项的文本为源文件名（删除扩展名部分）。\n\n忽略文件名的前导数字：在选中<q>添加项目时根据文件名自动生成书签文本</q>复选框时，此选项有效。选中此项时，书签项的文本为源文件名删除前面的数字后的部分。如删除数字后文件名为空，则不为该页添加书签。例如，用于生成 PDF 的文件列表有 4 个图像文件，其文件名分别为：\"0001 封面.jpg\"、\"0002 目录.tif\"、\"0003.tif\"和\"0004 第一章.tif\"，则生成的书签有三项，名称为\"封面\"（跳转到第 1 页）、\"目录\"（跳转到第 2 页）和\"第一章\"（跳转到第 4 页）。\n\n子文件夹排在文件前面：选中此选项时，在添加文件夹到文件列表时，文件夹包含的子文件将排在文件前面。不选中此选项时，按照文件的字母顺序排序文件。\n\n文件名分别按数值和文本排序：选中此选项时，在添加文件夹到文件列表时，文件夹包含的文件将分别按数值和文本排序，例如以下序列是按数值和文本排序 1.pdf、2.pdf 和 10.pdf（排序时将\"10\"视为数值，排在\"2\"后面），而 1.pdf、10.pdf 和 2.pdf 是按文本排序（排序时将\"10\"视为文本，排在\"2\"前面）。\n\n**说明**：更改上述各选项后，文件列表的书签文本不会刷新。如需刷新书签文本，可在文件列表删掉原来添加的文件，重新再向列表添加文件时，将按新的设置生成书签文本。\n\n保留源 PDF 文件的书签：将源 PDF 文件的书签复制到合并后输出的文档。如源 PDF 文件的页面不在输出文档，则点击书签将不执行任何动作。\n\n删除连接到无效页面的书签：在选中<q>保留源 PDF 文件的书签</q>复选框时此选项有效。选中此选项后，如源 PDF 文件的页面不在输出文档，则删除指向该页面的书签（如书签包含子书签，则子书签也将被删除）。例如源 PDF 文件有 100 页，仅将其中 1～50 页导入生成新的 PDF 文件，则源文件中指向原文档第 51～100 页的书签项将被删除。\n\n## 自动生成书签\n\n此功能可用于自动生成 PDF 文档的书签。其原理是：PDF 文档的文本有一定的格式规律，因此可按照页面文本、尺寸、所用字体等规则，筛选出符合规则的文字（往往是大字标题），从而利用这些文本生成 PDF 书签。本功能的界面如下图所示。\n\n![新的图片](media/image32.png)\n<figcaption>图表 4--28：自动生成书签功能</figcaption>\n\n**说明**：此功能是通过分析 PDF 文档内文本内容的字体尺寸，从而为 PDF 文档自动创建书签的，并不是执行光学字符识别（OCR）将图片识别为文本。\n\n### 操作步骤\n\n使用此功能生成文本 PDF 的书签文件，操作步骤如下。\n\n1.  选择<q>识别标题为书签</q>功能。\n\n2.  点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，指定需要识别标题为书签的 PDF 文件。\n\n3.  点击<q>PDF 信息文件</q>右边的<q>浏览</q>按钮，指定保存识别后生成书签的信息文件。\n\n4.  如有需要，可调整选项（特别是<q>识别页码范围</q>）。\n\n5.  点击<q>导出信息文件</q>按钮。程序将分析识别原始 PDF 文件中指定页码范围页面内的文本，抽取尺寸大于<q>标题文本尺寸</q>微调框数值的文本，将其组织成书签，并保存为 XML 信息文件。在程序的处理过程中，日志窗口会输出识别为标题的文本、级别，及其所在页码。\n\n6.  观察日志窗口的输出内容，可知输出书签的概貌。通常第一次分析得到的书签不太理想，可返回调整筛选选项，如调整标题文本尺寸以包含字体更小（或更大）的标题文本、指定过滤文本筛选不需要的文本、在高级筛选处理选项中添加筛选器剔除特定的字体等。\n\n\t**提示**：可用文本编辑器打开此功能输出的信息文件，里面列出了标题文本的尺寸。此外，可在<q>高级筛选处理</q>选项中，点击<q>从信息文件添加</q>按钮。点击该按钮后，程序弹出一个对话框。用该对话框可从输出信息文件添加标题文本筛选器。\n\n7.  重复步骤 5 和 6，直到获得比较满意的书签嵌套效果。\n\n8.  完成后，转到<q>处理、生成 PDF 文档</q>功能的<q>独立补丁</q>处理模式，使用前述生成的信息文件补丁 PDF 文件，查看输出文件的书签效果。如效果不理想，可手工修改 XML 信息文件并重新补丁。\n\n提示：详细的应用示例可参考本手册第 5.10 节。\n\n### 标题识别选项\n\n在本功能的选项卡中可指定分析过程的筛选参数。\n\n1. <q>识别页码范围</q>：指定需要分析文本的页码。\n\n2. <q>标题文本尺寸</q>：指定只有尺寸大于此数值的文本才可能被抽取为书签。\n\n3. <q>定位位置向上偏移若干倍行距</q>：当文本被抽取为书签项目后，点击书签项目将跳转到对应的文本，但会向上偏移一些位置，使定位后的文本不会贴到阅读器窗口顶端。\n\n4. <q>自动组织标题层次</q>：选中此选项时，程序根据文本的尺寸级别生成多级书签。\n\n5. <q>合并连续出现的标题</q>：如果两行文本都符合构成标题的条件，就将其视为一个标题（适应一个标题分两行显示的场合）。\n\n6. <q>合并同一行内不同尺寸的标题</q>：当标题文本字体尺寸不一，可选中此选项，使尺寸不一的文本合并为一个标题。\n\n7. <q>合并不同字体的标题</q>：当标题文本字体样式不一，可选中此选项，令使用不同字体的文本合并为一个标题。\n\n8. <q>忽略重叠的文本</q>：某些 PDF 制作程序会在同一个位置略错开一点的位置多次输出相同的文本，从而制作出仿粗体或阴影的效果，这样将导致出现重复文本。选中此选项，可让程序检测该技术手段，忽略在同一个位置重复出现的文本。\n\n9. <q>文字排版方向</q>：程序一般可自动检测文本的排版方向，但由于算法智能有限，可能推断错误，可使用此选项可人工指定文字的排版方向，提高程序组织文本布局的准确度。\n\n10. <q>合并连续标题不大于若干倍行距</q>：在选中<q>合并连续出现的标题</q>后，小于此指定行距的标题将被合并为一个标题。\n\n11. <q>若干层标题定位到页首</q>：默认情况下，点击识别后生成的书签将定位到书签所在的位置。选中此选项，则点击指定层数内的书签将定位到页面顶部，而不是书签所在的位置。\n\n12. <q>为首页生成书签</q>：选中此选项后，将生成一个书签项指向文档第一页，该书签项的文本为 PDF 文件名，此外，无论是否有文本满足标题的条件，不再为首页生成书签。不选中该选项，则按照普通的规则处理。\n\n### 文本过滤选项\n\n文本过滤选项指定用于过滤文本的列表（每行一个）。匹配指定模式的文本将被忽略。界面如下。\n\n![新的图片](media/image33.png)\n<figcaption>图表 4--29：自动生成书签功能的文本过滤选项</figcaption>\n\n<q>忽略只有一个字符的标题</q>：有些 PDF 文档有首字下沉的大字，可用此选项将其忽略。避免下沉字被认作标题（选中此选项时，不要选择<q>合并同一行内不同尺寸的标题</q>选项，否则下沉字会和普通文本合并到一起）。\n\n<q>忽略只有数字的标题</q>：此选项通常可用于忽略页码数字。\n\n在<q>忽略内容</q>列填入需要忽略的标题文本。当 PDF 文本匹配忽略内容时，程序就不会将其当成书签标题。\n\n选中<q>区分大小写</q>列的复选框，则匹配忽略内容时区分英文大小写。\n\n选中<q>匹配全标题</q>列的复选框，则只有整行 PDF 文本和忽略内容长度一致时才会忽略该行文本。\n\n选中<q>正则表达式</q>列的复选框，则忽略内容为正则表达式。\n\n如果需要删除已输入的忽略内容模式，可点击<q>删除</q>列下对应的按钮或点击<q>清空列表</q>按钮。\n\n### 高级筛选处理选项\n\n高级筛选处理选项可指定在特定的条件下忽略文本或更改匹配文本的标题级别。界面如下。\n\n![新的图片](media/image34.png)\n<figcaption>图表 4--30：自动生成书签功能的高级筛选处理选项</figcaption>\n\n在上述界面可添加用于筛选标题文本的筛选条件。已添加的筛选条件在列表中列出，每行是一组筛选条件和匹配该条件后调整级别的值。如果某段文本符合特定组别的筛选条件，则执行调整级别动作。调整级别时，如筛选条件对应<q>相对调整</q>列的复选框被选中，则匹配筛选条件的文本级别将增加或降低<q>调整级别</q>列指定的数值，否则文本的级别将更改为<q>调整级别</q>列指定的数值。\n\n提示：调整级别为 0，且<q>相对调整</q>复选框未选中时，表示将过滤匹配条件匹配的文本。\n\n如果调整后的数值小于<q>标题识别</q>选项中指定的<q>标题文本尺寸</q>参数，则该段文本就会被忽略，不会输出到生成的书签。如数值大于标题文本尺寸选项的值，则原来被该选项忽略的文本也可输出到生成的书签。\n\n工具栏上有 5 个按钮：<q>添加</q>按钮用于手工添加筛选器，一般不使用该按钮，而是使用<q>从信息文件添加</q>按钮，从第一趟处理生成的信息文件中添加筛选器。<q>删除</q>按钮可删除列表内选中的筛选器。<q>复制</q>和<q>粘贴</q>按钮可用于复制和粘贴筛选器。\n\n关于高级筛选处理选项的使用方法，请参阅[应用示例](#应用示例)一章的相关介绍。\n\n### 其它选项\n\n选中<q>完成识别后统计用于标题的字体</q>复选框，则识别后将在日志窗口列出用于标题的字体。\n\n如选中<q>列出被忽略的字体</q>复选框，则在统计信息中还包含已被筛选条件忽略掉的字体名称。\n\n如选中<q>导出文本位置信息</q>复选框，则导出的信息文件中还将包含文本在页面内的位置信息。\n\n## 编辑书签文件\n\n此功能可编辑[简易文本书签文件](#简易书签文件参考)、[XML信息文件](#xml信息文件参考)或直接提取 PDF 文档书签，并保存为信息文件或向已有 PDF 文档添加书签。本功能的界面如下图所示。\n\n![书签编辑器](media/image35.png)\n<figcaption>图表 4--31：PDF书签编辑器界面</figcaption>\n\n界面上方是两排按钮，中间是以树型形式显示的书签列表。将鼠标移到工具栏的按钮上，停留片刻，将弹出提示信息，说明该按钮的用途，并显示键盘操作快捷键。第一排按钮按从左到右的顺序说明如下：\n\n1. <q>打开</q>按钮打开需要编辑书签的信息文件或 PDF 文件。点击该按钮旁边的小三角形，将弹出一个菜单，上面列出了最近处理过的信息文件或 PDF 文件。点击菜单项，将打开对应文件的书签。\n\n2. <q>撤销</q>按钮用于撤销前一步修改操作，恢复书签到修改前的状态。点击<q>撤销</q>按钮旁边的小三角形，将弹出一个菜单，点击菜单的项目可一次撤销多步操作。\n\n3. <q>复制</q>按钮用于复制选中的书签。\n\n4. <q>粘贴</q>按钮用于将之前复制的书签粘贴到指定位置。\n\n5. <q>删除</q>按钮删除选中的书签。如果书签包含子书签，则子书签也会被删除。\n\n6. <q>插入书签</q>按钮插入一个新的书签项到当前书签后面。\n\n7. <q>缩进书签</q>按钮将选中的书签设置为上一个同级文档的子书签。\n\n8. <q>粗体</q>、<q>斜体</q>按钮分别切换书签文本的粗体和斜体样式。\n\n9. <q>颜色</q>按钮设置书签文本的颜色。点击其旁边的小三角形，将弹出一个取色框，可在上面选择预定义的颜色，或使用调色板选择所需颜色。\n\n10. 点击<q>选择或标记书签</q>按钮将弹出一个菜单，菜单包含如下命令：\n\n11. <q>全部选中</q>：选中所有显示可见的书签。\n\n12. <q>全部不选</q>：取消所有书签的选中状态。\n\n13. <q>反转选择状态</q>：选中没有选择的书签，取消已选择书签的选中状态。\n\n14. <q>标记书签</q>：将选定的书签标记为指定颜色，以便后续处理；或取消选中书签的标记状态。\n\n15. <q>选择已标记书签</q>：选中使用<q>标记书签</q>功能标记的书签。\n\n16. <q>全部折叠</q>：隐藏所有书签的子书签。\n\n17. <q>折叠子书签</q>：隐藏当前选中书签的子书签。\n\n18. <q>全部展开</q>：展开所有书签的子书签，使所有书签全部显示出来。\n\n19. 点击<q>搜索或替换书签文本</q>按钮将弹出一个对话框，可使用该对话框搜索或批量替换选中书签的文本。\n\n20. 点击<q>修改</q>菜单按钮将弹出一个菜单，上面列出多个常用的修改书签命令，点击命令将修改选中的书签。所有修改命令列出如下。\n\n21. <q>设置目标显示方式</q>：设定点击书签后跳转到目标位置的显示方式。\n\n22. <q>设置书签默认打开状态</q>：设置书签在阅读器中是否默认打开。此命令仅可用于包含子书签的书签。\n\n23. <q>清除书签目标定位偏移</q>：清除横坐标偏移将禁止点击书签后更改阅读器的横向偏移位置；清除纵坐标偏移将使点击书签后跳转到该页面的顶端。\n\n24. <q>更改目标页码</q>：修改点击书签后的目标页面页码。\n\n25. <q>更改书签文本大小写</q>：设置书签文本的英文大小写形式。\n\n26. <q>更改目标页面坐标</q>：更改点击书签后的目标页面坐标，可以设置绝对值或偏移修改值。\n\n27. <q>合并书签</q>：将选中的书签合并为一个书签，保留最上方一个书签的属性，所有选中书签文本串联起来作为该书签的文本。\n\n28. 强制设置为文件内链接：某些书签点击后将打开外部文件，用此命令强制将链接行为转换为转到当前 PDF 文件内的页面。某些 PDF 文档改名后书签失效，原因也是由于其书签使用外部文件方式指向页面，在没有改名前，<q>外部文件</q>的文件名和 PDF 文件名刚好一致；当 PDF 文档改名后，书签指向的<q>外部文件</q>就无效了，因此就无法打开指定页面了。使用此功能可修复这些失效的书签。\n\n29. 点击<q>保存</q>按钮将修改后的书签保存为信息文件。\n\n30. 点击<q>补丁</q>按钮将弹出一个对话框，在该对话框可直接用修改后的书签和原 PDF 文档组合成新的 PDF 文档。\n\n选中<q>修改操作包含未选中的内部书签</q>复选框，则修改操作将影响选中书签的子书签。详见[编辑修改子书签](#编辑修改子书签)一节的讲解。\n\n### 操作步骤概述\n\n书签编辑器的操作方法简述如下：\n\n选择<q>编辑书签文件</q>功能。\n\n点击<q>打开</q>按钮，指定需要编辑的书签文件或 PDF 文件。\n\n加载文件后，书签将出现在树形列表中，使用工具栏的按钮或菜单可修改书签。\n\n点击<q>保存</q>按钮可将书签保存为信息文件。（保存为信息文件后，可用高级补丁功能的<q>导入信息文件</q>功能或合并处理模式等将书签补丁到新文档；如不需保存信息文件，可跳过此步骤）\n\n点击<q>补丁</q>按钮，程序将弹出一个对话框供选择输出 PDF 文件的位置。\\\n![新的图片](media/image36.png)\n\n选择目标 PDF 文件后，点击<q>确认</q>按钮，程序将复制原始 PDF 文件，生成带有书签的目标 PDF 文件。\n\n提示：按住 Ctrl 键点击<q>保存</q>按钮可换名保存。打开的文档为 PDF 文件时，总是执行换名保存。\n\n### 基本编辑功能\n\n打开书签后，可使用编辑器界面修改书签的样式及属性。基本编辑操作分述如下。\n\n#### 选择书签\n\n使用鼠标点击书签项，项目颜色变成反白，表示书签被选中。\n\n编辑器的命令通常只作用于被选中的书签。要使编辑命令作用于内部书签，可选中<q>修改操作包含未选中的内部书签</q>复选框。\n\n如需要同时选中多个书签，可按住键盘的 Shift 键或 Ctrl 键，再用鼠标点击需要选择的书签（按住 Shift 键点击，选择一定范围内的所有书签；按住 Ctrl 键点击，逐个选择鼠标点击过的书签；当书签被选中时，按住 Ctrl 键再点击该书签将取消其选中状态）。\n\n按键盘的 Ctrl+A 组合键，可选中所有显示的书签。\n\n**注意**：按 Ctrl+A 组合键不会选中未被展开的子书签。\n\n#### 在编辑器中展开或收拢书签\n\n当打开书签文件时，书签默认处于折叠状态。例如加载某文档的书签后，书签编辑器如下图所示。从图中可看到，顶层书签有三个，点击书签的动作是转到 PDF 文档由<q>页码</q>栏列出的页面。\n\n![新的图片](media/image37.png)\n<figcaption>图表 4--32：加载某PDF书签后的编辑器界面</figcaption>\n\n文本为\"书签 1\"的书签项左方有一个加号，表示该书签包含子书签。点击该加号，收拢在书签内的子书签就会显示出来，然后加号会变成减号。如下图所示。从图中可见，\"子书签 1\"还包含子书签，而\"子书签 2\"和\"子书签 3\"则不包含子书签。\n\n![新的图片](media/image38.png)\n<figcaption>图表 4--33：展开书签以显示其子书签</figcaption>\n\n点击书签文本左方的减号，其子书签又会收拢回去，恢复展开前的状态。\n\n#### 移动或复制书签\n\n选中书签后，用鼠标点住需要移动书签的文本区域，然后拖动鼠标，就可以移动书签。将鼠标移到其它书签上面，释放鼠标按键，就可使选中的书签移到放开鼠标的位置。\n\n例如，在下图中选中\"孙书签 1\"和\"子书签 2\"两个书签后，用鼠标将其拖动到\"子书签 1\"书签上。在\"子书签 1\"上将显示一个蓝色的矩形。\n\n![新的图片](media/image39.png)\n<figcaption>图表 4--34：移动或复制书签</figcaption>\n\n蓝色的矩形有四个区域，在不同区域放开鼠标有不同移动方式。以上图为例。\n\n在①区域上放开鼠标，选中的书签将移动到\"书签 1\"的前面。\n\n在②区域上放开鼠标，选中的书签将移动到\"书签 1\"的后面。\n\n在③区域上放开鼠标，选中的书签将移动到\"书签 1\"的所有子书签的前面。\n\n在④区域上放开鼠标，选中的书签将移动到\"书签 1\"的所有子书签的后面。\n\n移动书签后的效果分别如下图各标记所示（被移动的两个书签已用颜色标记）。\n\n![新的图片](media/image40.png)\n<figcaption>图表 4--35：移动书签的效果</figcaption>\n\n**说明**：在拖动书签时，按键盘的 Esc 键可取消拖动操作。\n\n在拖动书签放开鼠标时，按住键盘的 Ctrl 键可复制书签，即原选中书签将在原处保留，在新位置中创建选中书签的副本。按住键盘的 Ctrl 键和 Shift 键放开鼠标，复制的书签将包含选中书签的子书签。\n\n#### 修改书签文本\n\n方法一：选中需要修改的书签，然后用鼠标再点击该书签项（或按键盘的 F2 键），书签文本将进入编辑状态。完成编辑后，按回车键（或用鼠标点击其它书签项目）确认修改。如要取消编辑操作，可按键盘的 Esc 键退出编辑。\n\n方法二：点击书签对应<q>动作</q>列的文本，将弹出一个属性框。在该属性框中修改<q>书签文本</q>文本框的文本，然后点击<q>确定</q>按钮关闭对话框。详见[修改书签属性](#修改书签属性)]小节。\n\n#### 修改书签属性<a name=\"修改书签属性\"></a>\n\n点击书签项对应<q>动作</q>列的蓝色文本，将弹出一个属性框。如下图所示。\n\n![新的图片](media/image41.png)\n<figcaption>图表 4--36：链接动作编辑器</figcaption>\n\n在该属性框中：\n\n修改<q>名称</q>文本框对应的文本可修改书签的文本。\n\n在<q>类型</q>下拉框中可选择点击书签后执行的动作。\n\n在<q>目标</q>分组框中可指定书签的目标位置（一般选择<q>转到指定位置</q>单选框）。横坐标为<q>默认</q>时，点击书签后保持横坐标偏移位置不变。纵坐标选择<q>默认</q>时，点击书签后默认转到页面顶部。如横坐标或纵坐标值为 0，则点击书签后保持阅读器原来的坐标偏移值不变。\n\n点击<q>确定</q>按钮关闭对话框，确定修改。\n\n点击<q>取消</q>按钮，则取消修改书签属性的操作。\n\n#### 设置书签样式\n\n书签的样式有粗体、斜体两种，还可以设置书签文本的颜色。在工具栏均有对应的按钮。\n\n提示：在设置书签文本颜色时，如选择白色，则还原书签文本为默认颜色。\n\n#### 设置书签的默认打开状态\n\n书签默认的打开状态可通过修改<q>打开</q>列的复选框选中状态而设置。该复选框选中打钩时，书签在阅读器中默认打开（显示其子书签），不选中打开复选框时，书签在阅读器中默认折叠（子书签不可见）。\n\n使用<q>修改</q>菜单的<q>设置书签默认打开状态</q>命令可修改多个书签的默认打开状态。\n\n#### 插入书签\n\n点击<q>插入书签</q>按钮，或按键盘的 Insert 键，可插入一个新的书签项。\n\n提示：用按住 Ctrl 键拖放书签的方法，也可以复制创建新的书签。\n\n#### 删除书签\n\n选中书签后，点击<q>删除</q>按钮，或按键盘上的 Delete 键，可删除选中的书签。\n\n删除书签时，如书签包含子书签，则子书签也会被删除。要避免删除子书签，请在删除前将子书签移出，再删除书签。\n\n#### 编辑修改子书签\n\n在一般场合下，修改书签操作不会影响其子书签或子书签包含的书签。按 Ctrl+A 组合键全选书签时也不会选中未展开的子书签。\n\n如需修改子书签，一种方法是将书签展开，使子书签显示出来，然后再选中子书签进行修改。如下图同时选中\"书签 1\"和\"子书签 2\"两书签准备修改。\n\n![新的图片](media/image42.png)\n<figcaption>图表 4--37：选择被展开的子书签以备编辑</figcaption>\n\n另一种方法是选中\"修改功能作用于未选中的内部书签\"复选框。选中该复选框后，不论书签是否展开，编辑器的命令将既修改选中书签，又修改其包含的内部书签。如下图所示。\n\n![修改子书签](media/image43.png)\n<figcaption>图表 4--38：选中<q>修改操作包含未选中的内部书签</q>执行修改</figcaption>\n\n**注意**：按住 Shift 键再点击书签编辑器的命令，编辑命令会作用于书签的内部书签，相当于临时选择了<q>修改功能作用于未选中的内部书签</q>复选框。\n\n#### 缩进书签层次\n\n点击工具栏的<q>→</q>按钮，或按键盘的 Tab 键，可将选中书签向内缩进一层。\n\n除此之外，还可使用鼠标拖放的方式改变书签位置（见前文\"[移动或复制书签](#移动或复制书签)\"小节）。\n\n#### 更改书签目标页码\n\n点击书签列表<q>页码</q>列，可修改书签的目标页码。\n\n如需一次修改多个书签的目标页码，可使用<q>修改</q>菜单下<q>更改目标页码</q>的指令，或按小键盘上的加号键或减号键，增减选定书签的页码。\n\n此外，点击<q>动作</q>列的链接，在弹出的对话框中也可更改书签的目标页码。\n\n### \"修改\"菜单功能\n\n<q>修改</q>菜单包含了大量为编辑 PDF 书签而设的功能。在使用这些功能时，请留意<q>修改功能作用于未选中的内部书签</q>复选框是否选中。没有选中该复选框时，修改功能仅作用于选中的书签；选中该复选框时，修改功能还作用于选中书签的下级书签。此菜单若干功能在前文已有讲述，下文将介绍前文未讲述的命令。\n\n#### 更改书签的显示方式\n\n某些书签点击后会更改阅读器的显示比例。一般来说，这种行为并不是读者所需要的。如需去除书签对显示比例的影响，可使用<q>更改书签的显示方式</q>命令，将显示比例设置为<q>保持不变</q>。\n\n使用此菜单命令，也可指定点击书签后缩放到指定的比例，如<q>适合页面</q>、<q>适合页宽</q>等。\n\n如果只需要更改某一个书签的显示方式，也可点击书签列表<q>动作</q>列的链接，在弹出的对话框中选择所需的缩放比例。\n\n#### 清除坐标定位偏移\n\n某些书签点击后会使阅读器视图偏移一定的方向，可使用此功能清除其影响。\n\n#### 更改目标页面坐标\n\n此功能可更改点击书签后转到目标页面后的定位坐标。命令界面如下所示。\n\n![新的图片](media/image44.png)\n<figcaption>图表 4--39：<q>输入坐标调整值</q>对话框</figcaption>\n\n对大部分书签而言，只需编辑方位为<q>上</q>的坐标。<q>相对调整</q>是在原坐标基础上增加坐标调整量（调整量为负数则表示减少原坐标）。<q>绝对调整</q>是将坐标调整量设为坐标值。\n\n如只需调整单一书签的坐标，可点击书签列表<q>动作</q>列的链接，在弹出的对话框中编辑书签目标坐标值。\n\n#### 合并书签\n\n此功能是将多个同级书签合并为一个书签。合并后书签的文本为原选定书签文本的串联。\n\n如果被合并书签包含子书签，则所有子书签将变为合并后书签的子书签。\n\n### 搜索及替换书签文本\n\n书签编辑器的另一大特色是可以批量搜索并替换书签文本。点击<q>搜索及替换书签文本</q>按钮，将弹出如下图所示的对话框，使用该对话框可完成搜索替换书签文本任务。\n\n![新的图片](media/image45.png)\n<figcaption>图表 4--40：<q>搜索及替换书签文本</q>对话框</figcaption>\n\n在<q>搜索文本</q>框中，可输入需要搜索的文本。点击右侧的三角按钮，可选择之前用来搜索的文本。\n\n默认搜索不区分英文大小写，如需区分，可选择<q>区分大小写</q>复选框。\n\n默认搜索是模糊搜索，即只要书签文本有部分匹配搜索文本，就算是匹配。选择<q>匹配整个书签的文本</q>复选框后，只有书签文本完全匹配搜索文本时，才算是匹配。\n\n搜索模式有三种。\n\n第一种是<q>普通</q>模式，用来检索书签文本是否包含搜索文本。\n\n第二种是<q>正则表达式</q>模式，搜索文本被视为一个正则表达式，当书签文本符合该表达式时，就算是匹配。\n\n第三种是<q>XPath</q>模式。在该模式下，书签编辑器的书签被视为一个 XML 文档，每个书签是一个<q>书签</q>元素，书签的属性（如目标页码、动作等）则被视为 XML<q>书签</q>元素的属性。搜索文本被视为一个 XML 路径表达式，当书签元素匹配该表达式时，视为匹配。书签 XML 文档的结构可参考信息文件的[文档书签](#文档书签)一节。\n\n在<q>替换文本</q>框中输入替换匹配搜索内容的文本。如果使用正则表达式搜索模式，并在搜索表达式中指定了分组匹配，在替换文本中可用`$1`、`$2`等方式替代匹配分组。\n\n#### 正则表达式搜索示例\n\n下面以数则示例说明正则表达式搜索的用途。设书签编辑器已加载的书签如下图所示。\n\n![新的图片](media/image46.png)\n<figcaption>图表 4--41：示例书签</figcaption>\n\n表格 4--5：正则表达式搜索示例\n\n| 要匹配的书签                       | 表达式                |搜索结果                          |说明                                                                                                                  |\n|----------------------------------- |--------------------- -|-------------------------------- -|----------------------------------------------------------------------------------------------------------------------|\n| 包含任意字符                       | .\\*                   |所有书签                          |\".\"表示任意字符；\"\\*\"表示前面的模式出现 0 或任意次，\".\\*\"表示任意字符出现 0 或任意次                                      |\n| 以\"书签\"开头                       | \\^书签                |书签 1、书签 2、书签 10、书签 11      |\"\\^\"表示文本的开头                                                                                                    |\n| 以\"书签 1\"结尾                      | 书签 1\\$               |书签 1、子书签 1、孙书签 1、书签 11   |\"\\$\"表示文本的结尾                                                                                                    |\n| 包含\"子书签\"或\"孙书签\"             | \\[子孙\\]书签          |子书签 1、子书签 2、子书签 3、书签 2  |\"\\[\\]\"里面表示范围匹配，只要被匹配文本的字符符合范围里的任一个字符就是匹配了，该表达式相当于匹配\"子书签\"或\"孙书签\"文本|\n|                                    | 子书签\\|孙书签        |                                  |\"\\|\"表示\"逻辑或\"的关系，此表达式的含义即\"子书签\"或\"孙书签\"                                                            |\n| 书签文本完全匹配\"书签 1\"或\"子书签 1\" | \\^子?书签 1\\$          |书签 1、子书签 1                    |\"?\"表示前面的内容不出现或出现 1 次                                                                                      |\n|                                    | \\^(书签 1\\|子书签 1)\\$  |                                  |\"()\"表示里面的内容为一组                                                                                              |\n| \"书签\"后跟一个非 1 的数字            | 书签\\[2-90\\]          |子书签 2、子书签 3、书签 2           |\"\\[\\]\"里面表示范围匹配，\"2-9\"表示匹配 2 到 9 的字符，后面的\"0\"匹配字符\"0\"，在这个集合中不包含 1，所以就匹配了非 1 的数字     |\n| \"书签\"后跟一个非 1 的字符            | 书签\\[\\^1\\]           |结果同上                          |\"\\[\\^\\]\"表示筛选范围匹配，被匹配文本不能是方括号里面的任一个字符，\"\\[\\^1\\]\"表示不能是 1 的任意字符（可能是汉字或标点等）|\n| 包含两个数字                       | \\[0-9\\]{2}            |书签 10、书签 11                    |\"{2}\"表示匹配前面的模式两次，\"\\[0-9\\]{2}\"即匹配 2 位数字                                                                |\n| \"书签\"后跟若干个数字               | \\^书签\\[0-9\\]+        |书签 1、书签 2、书签 10、书签 11      |\"+\"表示匹配前面的模式至少一次，\"\\[0-9\\]+\"表示匹配至少 1 个数字，又如\".+\"表示匹配至少 1 个任意的字符                       |\n|                                    | \\^书签\\[0-9\\]{1,}     |                                  |\"{1,}\"表示匹配前面的模式至少 1 次，相当于\"+\"号，又如\"{2,}\"表示最少匹配前面的模式两次，而\"{2,3}\"表示匹配 2 或 3 次           |\n\n如搜索表达式使用了圆括号`()`分组，替换时可使用`$1`、`$2`等替代符替代分组的内容。\n\n例如，需要将\"子书签 1\"、\"子书签 2\"的形式转换为\"1)子书签\"、\"2)子书签\"的形式（将数字提到前面），可使用搜索表达式\"子书签(\\[0-9\\]+)\"定位书签，并用括号分组\"(\\[0-9\\]+)\"捕获数字，然后用\"\\$1)子书签\"作为替换文本，其中\"\\$1\"表示替代搜索表达式中括号内匹配的数字。\n\n再如，将\"子书签 1\"、\"孙书签 1\"、\"子书签 2\"等的数字和文本互换位置，变成\"1 子书签\"、\"1 孙书签\"、\"2 子书签\"等形式，可使用搜索表达式\"(\\[子孙\\]书签)(\\[0-9\\]+)\"，使用两对括号分组，第一组匹配\"子书签\"或\"孙书签\"，第二组匹配后面的数字，然后用\"\\$2\\$1\"作为替换文本执行替换即可。\n\n更多关于正则表达式的内容，请参阅有关教程和资料。\n\n#### XML路径（XPath）搜索示例\n\nXPath 搜索的原理是将书签信息文件看作一个 XML 文档，然后在其上面执行 XML 路径匹配。符合 XML 路径表达式的书签将被选中。使用 XML 路径搜索可完成普通搜索无法完成的搜索任务。\n\n每个书签在 XML 文档中以`书签`元素表示，书签的属性（如页码、动作等）以 XML 属性表示，子书签被视为上级书签的子元素。\n\n以上节插图所示的书签为例，举 XML 路径匹配数例如下表所示。\n\n| 要匹配的书签                        | 表达式                                    | 搜索结果                       | 说明                                                                                                                                                                                               |\n| ----------------------------------- | ----------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 文本为\"书签1\"                       | \\@文本=\\'书签1\\'                          | 书签1                          | \"\\@文本\"表示书签的文本，需要匹配的文本字符串以英文单引号\"\\'\"或双引号\"\\\"\"括起；等号表示比较两边的值是否相等                                                                                         |\n| 目标页码范围为5到10                 | \\@页码 \\>= 5 and \\@页码 \\<= 10            | 子书签3、书签2                 | \"\\@页码\"表示书签的目标页码，\"and\"表示\"逻辑与\"关系；\"\\>=\"表示大于或等于关系，而\"\\<=\"表示小于或等于关系                                                                                              |\n| 样式为粗体                          | \\@样式=\\'粗体\\'                           | 没有匹配的书签                 | \"\\@样式\"表示书签的粗体或斜体样式；本示例中没有样式为粗体的书签                                                                                                                                     |\n| 有子书签的书签                      | 书签                                      | 书签1、子书签1                 | \"书签\"表示检查是否有名为\"书签\"的子书签                                                                                                                                                             |\n| 子书签内还有子书签的书签            | 书签/书签                                 | 书签1                          | 第一个\"书签\"匹配有子书签的书签，\"/\"表示向内一层，第二个\"书签\"表示匹配上述已匹配书签内还有子书签的书签                                                                                              |\n| 和上层书签指向相同页码的书签        | ../\\@页码 = \\@页码                        | 孙书签1                        | \"../\"表示上层书签，\"../\\@页码\"则表示获取上层书签的\"页码\"属性，第二个\"\\@页码\"是当前书签页码；当上层书签的页码与当前书签页码相等时，等式成立（\"孙书签1\"的页码和其上层书签\"子书签1\"指向的页码均为3）  |\n| 有文本以\"孙书签\"开头的子书签的书签  | 书签\\[starts-with (\\@文本, \\'孙书签\\')\\]  | 子书签1                        | 首先\"书签\"筛选了拥有子书签的书签，然后\"\\[\\]\"表示其中的内容为这些子书签的判定条件，若条件成立，视为匹配；\"starts-with\"是函数，当第一个参数以第二个参数开始时，视为判定成立                          |\n| 文本包含\"子书签\"                    | contains(\\@文本, \\'子书签\\')              | 子书签1、子书签2、子书签3      | \"contains\"函数表示检查第一个文本参数是否包含第二个文本参数的内容                                                                                                                                   |\n| 同级内的第一个书签                  | position() = 1                            | 封面、子书签1、孙书签1         | \"position\"函数返回当前书签的位置；只计算位置时，可用简化表达式\"1\"                                                                                                                                  |\n|                                     | 1                                         |                                |                                                                                                                                                                                                    |\n| 同级内的最后一个书签                | last()                                    | 孙书签1、子书签3、书签2        | \"last\"函数返回最后一个同级书签的位置，当书签是最后一个书签时，其位置等于该函数返回的值（本表达式相当于\"position()=last()\"）                                                                        |\n| 位置不是同级书签内最后一个的书签    | following-sibling::书签                   | 封面、书签1、子书签1、子书签2  | \"following-sibling::书签\"表示同级下一个书签；每层内最后一个书签是没有下一个同级书签的，因此本要求相当于匹配有下一个同级的书签                                                                      |\n| 有3个子书签的书签                   | count(书签)=3                             | 书签1                          | \"count\"函数返回匹配其括号中表达式的节点个数                                                                                                                                                        |\n\n更多关于 XML 路径的内容，请参阅有关教程与资料。\n\n## 识别图像文本\n\n识别图像文本功能可将 PDF 文档内图片的文字识别出来，变成可编辑的文本文件，在编辑文件后，可将该文本写入 PDF 文档成为透明的文本层，使 PDF 文档的图像文本可被检索工具索引。\n\n**注意**：本功能要求机器上安装微软 Office 2003 或 Office 2007 的 Document Imaging 组件及对应的语言识别模块。\n\n本功能的界面如下图所示。\n\n![新的图片](media/image47.png)\n<figcaption>图表 4--42：识别图像文本功能</figcaption>\n\n### 识别图像文本操作步骤\n\n1.  选择<q>识别图像文本</q>功能。\n\n2.  点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，指定需要识别图片文字的 PDF 文件路径。\n\n3.  如需将识别结果保存为文本文件，则点击<q>识别结果文件</q>右边的<q>浏览</q>按钮，指定保存文本文件的位置。如在识别过程不指定此文件路径，程序将把识别结果输出到日志窗口。\n\n4.  在<q>识别页码范围</q>文本框中输入需识别图像文本的页码，如不输入，则识别所有页面的图片。\n\n5.  点击<q>识别图像文本</q>按钮，开始识别。\n\n**说明**：如识别结果文件的后缀为\".xml\"，则输出的信息文件将包含所识别文本在页面中的坐标信息。\n\n### 写入识别结果操作步骤\n\n1.  选择<q>识别图像文本</q>功能。\n\n2.  点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，指定生成识别结果文件的 PDF 文件路径。\n\n3.  点击<q>识别结果文件</q>右边的<q>浏览</q>按钮，指定识别后保存的 XML 结果文件路径。\n\n4.  点击<q>输出 PDF 文件</q>右边的<q>浏览</q>按钮，指定写入识别结果后生成的 PDF 文件路径。\n\n5.  点击<q>写入识别结果</q>按钮，开始识别。\n\n### 识别选项\n\n如原文档图片中的文字是统一排版方向（即全是横排或全是竖排），建议在<q>文字排版方向</q>下拉框中选择对应的排版方式。\n\n在<q>文字识别语言</q>下拉框中可选择识别语言，默认的是简体中文，此外可选繁体中文或英文。\n\n**说明**：识别图像文本功能是通过调用微软 Office Document\nImaging 组件的识别引擎来识别文本的。因此，必须先安装对应的语言识别组件。如果只安装了简体中文识别引擎，显然是无法正确识别繁体中文的。\n\n<q>旋转校正</q>和<q>拉伸校正</q>复选框可让识别引擎尝试识别图像中文本的旋转方向和倾斜角度，以提高识别效果。为提高识别速度，默认不选择此二选项。\n\n选中<q>检测页面方向</q>复选框，可让程序自动识别页面是横向还是纵向。\n\n选中<q>纠正倾斜页面</q>复选框，可让程序自动纠正倾斜的页面，提高识别正确率。\n\n**说明**：选中上述两个选项均需要执行更多的运算，如识别结果较理想，无需选择上述两选项，以便提高识别速度。\n\n选择<q>保存原始的识别结果</q>复选框时，原样保存微软 Office 识别组件输出的识别结果。在需要将识别结果写入 PDF 文档时，建议选中该选项。不选中该复选框时，程序尝试将同一行的文本组合在一起，以便提取识别文本内容。\n\n### 识别目录页为简易书签文件\n\n识别图像文本的一个功能是将扫描 PDF 文档目录页识别成简易书签文件，用于快速制作 PDF 书签。\n\n微软 Office 的识别引擎在识别目录页时效果不太好，识别引擎通常会将目录中的点号（即连续出现的省略号\"......\"）误识别为一系列的句号或数字\"0\"等字符。建议选中\"识别目录页的点（......）分隔符\"复选框，这样程序会尝试纠正识别引擎的错误结果。\n\n此外，建议选中<q>压缩连续出现的空格</q>复选框，必要时可再选中<q>删除汉字间的空格</q>复选框，并取消<q>识别分栏排版</q>复选框（当文字排版方向为<q>自动检测</q>时，无法切换此复选框的选择状态，需手工指定排版方向才能切换此复选框）。\n\n识别之后输出的文本文件可直接用[书签编辑器](#编辑书签文件)打开。\n\n使用书签编辑器的<q>更改目标页码</q>功能可修复目录页码与实际页码的对应关系。\n\n## 提取图片\n\n提取图片功能可将 PDF 文档的图片无损导出为图片文件。\n\n本功能的界面如下图所示。\n\n![新的图片](media/image48.png)\n<figcaption>图表 4--43：提取图片功能</figcaption>\n\n### 操作步骤\n\n1.  选择<q>提取图片</q>功能。\n\n2.  点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，指定需要提取图片的 PDF 文件。\n\n3.  点击<q>输出位置</q>右方的<q>浏览</q>按钮，将弹出一个目录浏览框。利用该对话框选择一个目录，导出的图片将存放到该目录。\n\n4.  点击<q>提取图片</q>按钮。\n\n5.  程序界面转到<q>输出信息</q>界面。程序将打开 PDF 文件，并将文件中的图片导出到之前指定的目录。在导出过程中，可随时点击输出信息界面中的<q>返回</q>按钮终止导出过程。\n\n### 提取选项\n\n1. <q>页码范围</q>：指定导出特定范围页码的图片。如不指定<q>页码范围</q>，则导出 PDF 文件中可以找到的所有图片。\n\n2. <q>尝试合并相同页面的图片</q>：尝试将同一页内具有相同水平坐标、相同宽度和相同格式的图片合并为一副图片。提供这个功能的原因是有些 PDF 制作工具会将一副图片分割成多片，逐片写入 PDF 文件。这样，提取出来的图片将是零散的。使用此功能会将这些零散的图片重新整合为一个图片。\n\n3. <q>JPEG 图片无损合并为 PNG 图片</q>：选择<q>尝试合并相同页面的图片</q>时，如合并前的图片为 JPEG 图片，则将这批图片无损合并为 PNG 图片。\n\n4. <q>垂直翻转图片</q>：将导出的图片垂直翻转。有些 PDF 制作工具将图片垂直翻转后写入 PDF 文件。这样，提取出来的图片将上下颠倒。使用此功能可将上下颠倒的图片还原回来。\n\n\t**注意**：如果图片采用 JPEG 等有损格式压缩，垂直翻转图片可能导致提取图片的质量下降。\n\n5. <q>反转黑白图片的颜色</q>：将只有两种颜色的图片反转颜色。有些 PDF 制作工具会将图片黑白颠倒，然后在 PDF 的渲染指令中使用设定绘图颜色的方式将颜色在渲染时颠倒过来。这样会导致提取出来的图片黑色和白色相反。使用此功能可将相反的颜色还原回来。\n\n6. <q>忽略指定宽度或高度的图片</q>：某些 PDF 文件包含一些很小的图片。如不需要导出这些图片，可使用此选项将其忽略。\n\n7. <q>导出批注内的图片</q>：选中此选项后，导出批注内的图片。不选中此选项时仅导出 PDF 正文的图片。\n\n### 文件命名规则\n\n提取出来的图片文件名默认为页数编号的四位数文件名称（掩码为\"0000\"），如\"0001.jpg\"、\"0002.tif\"、\"0010.tif\"等。文件名的扩展名部分则根据 PDF 文档中图片采用的压缩方法自动生成。例如：图片是 JPEG 算法压缩的，扩展名为\"jpg\"；黑白两色的（使用 CCITTFax 或 JBIG2 算法压缩），扩展名为\"tif\"；彩色或灰度的（使用 Deflate 等算法压缩），扩展名为\"png\"。\n\n提取图片文件扩展名前面的部分可以通过更改<q>文件名掩码</q>修改。\n\n如不需用 0 填充位数，可输入掩码\"0\"或不输入掩码，程序将输出图片文件名如\"1.jpg\"、\"2.tif\"、\"10.tif\"等。\n\n如果在掩码中填入汉字，则输出文件名包含汉字名称。如掩码\"文档 000\"将生成\"文档 001.jpg\"、\"文档 002.tif\"等图片文件。\n\n如果文件名不变的部分包含\"0\"，可用半角引号\"\\\"\"将不变的部分括起来。如掩码\"\\\"Windows 2008 参考大全\\\"0\"，将生成\"Windows 2008 参考大全 1.jpg\"、\"Windows 2008 参考大全 2.png\"等图片。\n\n更改文件掩码时，\"示例\"标签将演示第 1、2、3、11、12、13 和 100 页的图片文件命名情况。\n\n## 提取页面\n\n提取页面内容功能可以将 PDF 文档指定范围的若干页面导出成一个单独的 PDF 文件。\n\n本功能的界面如下图所示。\n\n![新的图片](media/image49.png)\n<figcaption>图表 4--44：提取页面功能</figcaption>\n\n提取页面的操作方法如下所示：\n\n1.  选择<q>提取页面</q>功能。\n\n2.  点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，指定需要提取页面的 PDF 文件。\n\n3.  点击<q>输出位置</q>右方的<q>浏览</q>按钮，将弹出一个保存文件浏览框。利用该对话框指定提取页面后制作 PDF 文件的保存位置。\n\n4.  如仅需导出特定范围页码内的内容，可在<q>页码范围</q>右边的文本框中填入页码范围。如不指定页码范围，则导出 PDF 文件的所有页面。\n\n5.  如有某些页码不需提取，也可在<q>排除页码范围</q>文本框中填入需剔除的页码范围。\n\n6.  点击<q>提取页面</q>按钮。\n\n7.  程序界面转到<q>输出信息</q>界面。程序将打开原始 PDF 文件，并将指定范围内的页面导出为一个新的 PDF 文件。在导出过程中，可随时点击输出信息界面中的<q>返回</q>按钮终止导出过程。\n\n提示：页码范围支持逆序范围，如页码范围\"10-1\"，将先插入源文件的第 10 页，再插入第 9 页，以此类推，最后插入第 1 页到输出文档。除使用本功能导出 PDF 文件的指定页面，还可以使用\"[制作PDF文件](#全局选项)\"功能，从已有 PDF 文件导出页面生成新 PDF 文件。\n\n## 文档结构探查器\n\n文档结构探查器为 PDF 开发人员、爱好者等提供了一个查看、修改 PDF 文档内部结构的工具。\n\n本功能的界面如下图所示。\n\n![新的图片](media/image50.png)\n<figcaption>图表 4--45：文档结构探查器界面</figcaption>\n\n操作方法：\n\n1.  选择<q>文档结构探查器</q>功能。\n\n2.  点击<q>打开</q>按钮，打开感兴趣的 PDF 文档。\n\n\t**提示**：可以从\"我的电脑\"或资源管理器将 PDF 文档拖到功能界面以打开该文档。\n\n3.  稍等片刻，待程序打开文档后，程序以树型列表展示 PDF 文档内部层次结构。\n\n4.  列表第一列是节点的名称。某些节点（如字典、数组类型节点）包含内部节点，则该节点图标左方具有一个加号。点击加号可展开节点，查看内部节点的内容。某些指向字典或数组的引用节点，其图标左方也有加号。点击该加号可展开查看引用节点指向目标的内容。\n\n5.  文档的根节点是文档编录（Trailer）节点。\n\n6.  为方便使用，程序将文档的各个页面转换成单独的页面节点，独立显示在 Pages 节点下（该节点为虚拟节点，实际上是根据文档内部的页面树字典生成的）。\n\n7.  列表第二列是节点的值，用鼠标点击对应的单元格，可修改其内容。\n\n8.  列表下方是备注窗口，讲解所选节点的含义及其取值范围。程序内置数十个常见 PDF 节点的信息，可供 PDF 爱好者参考。\n\n9.  点击<q>删除</q>按钮可删除选中的节点。有些节点在文档中是必须存在的，不能删除。选择该节点时，<q>删除</q>按钮将被禁用（显示成灰色按钮）。删除字典或数组节点时，字典或数组的内容节点也将被删除。删除引用节点时，仅删除该节点，不会删除该节点指向的目标节点。\n\n10. 选中文档的数据流节点，按<q>导出</q>按钮，可将内容节点导出成二进制文件或文本文件供外部程序分析。\n\n11. 选中文档内的图像数据流，按<q>查看</q>按钮，将弹出一个窗口显示数据流的图片。\n\n12. 选中文档内的文本数据流，按<q>查看</q>按钮，在备注窗口可查看文本流的内容。\n\n13. 在修改文档后，如需保存修改后的文档，可点击<q>保存</q>按钮。\n\n警告：在使用文档结构探查器前，应准备一定的 PDF 知识。如果此工具使用不当，并将修改后的文档覆盖原始 PDF 文件，将可能导致丢失数据，造成无可挽回的损失。\n\n## 全局选项\n\n此选项指定程序各功能通用的工作方式。\n\n![新的图片](media/image51.png)\n<figcaption>图表 4--46：程序的全局工作选项</figcaption>\n\n访问 PDF 文档：指定程序读取 PDF 的策略。选中<q>优化处理效率</q>，则程序尽量将整个 PDF 文件加载到内存，方便提高处理效率。选中<q>减少占用内存</q>，则程序仅加载 PDF 的索引表，尽量减少使用内存的数量。如 PDF 文档较大，可使用此选项以免程序因加载文档而耗尽内存。\n\n读取文档所用的编码：有些 PDF 文档采用了不规范的编码，导致无法正常阅读，导出的信息文件也为乱码。可使用此选项强制指定读取编码形式，尝试以不同的编码形式导出信息。详细使用方法请参见[修复文字为乱码的书签](#用独立补丁功能修改多个pdf文件的书签打开状态)。\n\n## 输出信息\n\n界面的<q>日志内容</q>文本框输出程序工作过程的信息和遇到的错误。程序开始执行任务后将转到此界面。\n\n![新的图片](media/image52.png)\n<figcaption>图表 4--47：输出信息界面</figcaption>\n\n在程序工作过程中，点击<q>返回</q>按钮将弹出一个确认对话框，在对话框中点击<q>是</q>按钮将终止程序的工作。\n\n在程序完成工作后，点击<q>返回</q>按钮将返回到之前的功能界面。\n\n点击日志窗口带下划线的文件名或目录名可打开对应的文件或目录。\n\n# 应用示例\n\n为更好的讲解 PDF 补丁丁的使用方法，这里设立了几个情景示例，读者可举一反三，将程序用得更好。\n\n## 取消书签及页面链接的显示比例\n\n任务：有些 PDF 文档的书签或页面链接点击后会改变阅读器的显示比例，例如读者本来使用 135%的显示比例，点击书签后，显示比例变成了适合页面，字体变得很小。这为读者阅读造成了不便。使用 PDF 补丁丁可轻易地保持阅读器显示比例，不让其自由改变而影响阅读。\n\n操作步骤如下：\n\n1.  选择<q>PDF 文档选项</q>功能。\n\n2.  点击<q>阅读方式</q>选项卡，选中<q>禁止书签及页面链接更改显示比例</q>复选框。\n\n3.  选择<q>处理、制作 PDF 文档</q>功能的<q>独立补丁</q>模式。\n\n4.  向文件列表添加需要修改的 PDF 文档。\n\n5.  指定输出 PDF 文件的路径。\n\n6.  点击<q>生成 PDF 文件</q>按钮。在生成的新文件中，点击书签和页面链接都不会更改阅读器的显示比例了。\n\n处理过程的示意图如下所示。\n\n![新的图片](media/image53.png)\n<figcaption>图表 5--1：补丁步骤1～2：选择补丁选项</figcaption>\n\n![新的图片](media/image54.png)\n<figcaption>图表 5--2：补丁步骤3～6：选择文件执行补丁</figcaption>\n\n## 关闭默认展开状态的书签\n\n任务：有些 PDF 文档具有书签，方便阅读。但书签数量和层数都很多，而且全部处于默认展开的状态，要翻动滚动条才能找到需要的项目。将书签默认状态改为关闭，在阅读时再手动打开，通常比默认打开所有书签要方便。使用 PDF 补丁丁可批量改变文档书签的打开状态。\n\n### 用独立补丁功能修改多个PDF文件的书签打开状态\n\n使用独立补丁功能修改书签打开状态的操作步骤如下：\n\n1.  选择<q>PDF 文档选项</q>功能。\n\n2.  点击<q>阅读方式</q>选项卡，找到<q>书签状态</q>下拉框，选择<q>全部关闭</q>。\n\n3.  选择<q>处理、制作 PDF 文档</q>功能的<q>独立补丁</q>模式。\n\n4.  向文件列表添加需要修改的 PDF 文档。\n\n5.  指定输出 PDF 文件的路径。\n\n6.  点击<q>生成 PDF 文件</q>按钮。在生成的新文件中，书签都是关闭状态了。\n\n### 用书签编辑器修改单个PDF文件的书签打开状态\n\n使用书签编辑器修改 PDF 文档书签打开状态的操作步骤如下：\n\n1.  选择<q>编辑书签</q>功能。\n\n2.  点击<q>打开</q>按钮，打开需要修改的 PDF 文件。\n\n3.  批量选中需要修改打开状态的书签，然后选择<q>修改</q>菜单下<q>设置书签默认打开状态</q>子菜单相应命令。\n\n4.  点击<q>补丁</q>按钮，保存修改后的 PDF 文件。\n\n提示：如选中的书签内还有子书签，请选中<q>修改操作包含未选中的内部书签</q>复选框，以将修改命令应用到内层书签。\n\n与<q>独立补丁</q>功能相比，此方法可按需令某些书签默认打开，但显然无法批量处理 PDF 文件。\n\n## 统一页面的尺寸\n\n任务：某 PDF 文件页面尺寸参差，希望能统一其页面尺寸方便阅读。使用 PDF 补丁丁的操作步骤如下。\n\n1.  选择<q>PDF 文档选项</q>功能。\n\n2.  在<q>页面布局</q>选项卡，默认状态下，尺寸下拉框为<q>等同原始内容尺寸</q>，可将其改为其它已定义好的尺寸，如<q>A4</q>、<q>16 开</q>等，或选择<q>自定义</q>，然后在<q>宽</q>、<q>高</q>处输入适当的数值。\n\n3.  选择<q>源 PDF 页面调整</q>组内的<q>缩放内容适应页面</q>单选框。\n\n4.  返回<q>处理、制作 PDF 文档</q>功能，选择<q>独立补丁</q>模式。\n\n5.  添加需要统一页面尺寸的文件并指定输出 PDF 文件。\n\n6.  点击<q>输出 PDF 文件</q>按钮。\n\n操作过程所选择的选项如下图所示。\n\n![新的图片](media/image55.png)\n<figcaption>图表 5--3：补丁步骤2～3：为PDF文档选择统一尺寸</figcaption>\n\n提示：PDF 文档第一页的尺寸在文件列表上已列出。\n\n## 调整竖排文档的双页阅读顺序\n\n任务：现在流行宽屏显示器，有些较大的宽屏显示器可一次显示两页文档。切换到双页视图将可减少翻页次数，便于阅读。但双页显示的默认阅读方向是<q>从左到右</q>，对于竖排文档而言，则不便阅读：首先要从页面中间开始，读到页面左下角，再跳到页面右上角读下一页。如下图左所示。\n\n如可改变阅读方向，改为<q>从右到左</q>，则阅读竖排文档将更为方便：从页面右上角开始阅读，到左下角读完两页，视线不需拐弯。如下图右所示。\n\n![1](media/image56.png)　　　![2](media/image57.png)\n\n操作步骤如下：\n\n1.  选择<q>PDF 文档选项</q>功能。\n\n2.  点击<q>阅读方式</q>选项卡。\n\n3.  在<q>阅读方向</q>下拉框中选择<q>从右到左</q>。\n\n4.  返回<q>处理、制作 PDF 文档</q>功能，选择<q>独立补丁</q>模式。\n\n5.  添加需要删除动作的 PDF 文件。\n\n6.  指定输出 PDF 文件的路径。\n\n7.  点击<q>生成 PDF 文件</q>按钮。用 PDF 阅读器打开生成的新 PDF 文件，切换到双页视图后，会发现阅读顺序已改为从右到左了。\n\n## 禁止打开文档时自行设定\"适合页面\"显示的行为\n\n任务：某些 PDF 文档在打开时自动将阅读器的显示比例设置为<q>适合页面</q>，导致显示字体过小，每次阅读时均需人工调节显示比例，颇为不便。用 PDF 补丁丁可以禁止文档的这种行为。\n\n操作步骤如下：\n\n1.  选择<q>PDF 文档选项</q>功能。\n\n2.  点击<q>文档杂项</q>选项卡。\n\n3.  选中<q>删除打开文档时自动执行动作</q>复选框。\n\n![新的图片](media/image58.png)\n<figcaption>图表 5--4：选择<q>禁止打开文档时自动执行动作</q>选项</figcaption>\n\n4.  返回<q>处理、制作 PDF 文档</q>功能，选择<q>独立补丁</q>模式。\n\n5.  添加需要删除动作的 PDF 文件。\n\n6.  指定输出 PDF 文件的路径。\n\n7.  点击<q>生成 PDF 文件</q>按钮，程序将读取原始 PDF 文件，删除文档的自动执行动作，并输出为新的 PDF 文件。\n\n## 清除打开页面时弹出的网页\n\n任务：某 PDF 文件在阅读到某一页时，自动打开浏览器访问特定的网站。这是由于该 PDF 文件在页面中执行了打开网页的动作。使用 PDF 补丁丁可以删除这些动作。\n\n操作步骤如下：\n\n1.  选择<q>PDF 文档选项</q>功能。\n\n2.  点击<q>文档杂项</q>选项卡。\n\n3.  选中<q>删除页面上自动执行动作</q>复选框。\n\n4.  如在打开文档时也有网页弹出，可选中<q>删除打开文档时自动执行动作</q>复选框。\n\n5.  返回<q>处理、制作 PDF 文档</q>功能，选择<q>独立补丁</q>模式。\n\n6.  添加需要删除动作的 PDF 文件。\n\n7.  指定输出 PDF 文件的路径。\n\n8.  点击<q>生成 PDF 文件</q>按钮，程序将读取原始 PDF 文件，删除页面中的自动执行动作，并输出为新的 PDF 文件。\n\n## 导出文本形式的书签\n\n任务：将 PDF 文件的书签导出成文本形式的目录。\n\n操作步骤如下：\n\n1.  选择<q>处理/制作 PDF 文件</q>功能。\n\n2.  选择<q>独立补丁</q>模式。\n\n3.  在文件列表中添加需要导出目录的 PDF 文件。\n\n4.  在<q>PDF 信息文件</q>处，指定一个后缀为\"txt\"的文本文件作为输出信息文件。\n\n5.  点击<q>导出信息文件</q>按钮。导出的信息文件即为一个文本文件。\n\n操作步骤如下图所示。\n\n![新的图片](media/image59.png)\n<figcaption>图表 5--5：导出文本书签信息文件</figcaption>\n\n## 使用书签编辑器修复书签\n\n某些 PDF 文档在制作时由于工具的限制，书签不符合 PDF 规范，在新版本的 PDF 阅读器中无法正常使用，通常的问题有：书签文本乱码、PDF 文件改名后书签失效、书签指向的目标页码范围不正确。\n\n使用 PDF 补丁丁的书签编辑器可以轻松修复此类 PDF 书签问题。\n\n### 修复书签文本乱码\n\n任务：某 PDF 文档的书签为乱码，无法阅读，如下图所示。\n\n![新的图片](media/image60.png)\n<figcaption>图表 5--6：乱码书签</figcaption>\n\n使用书签编辑器加载该文档，发现书签文本也为乱码。如下图所示。\n\n![新的图片](media/image61.png)\n<figcaption>图表 5--7：在书签编辑器中显示的乱码书签</figcaption>\n\n使用程序全局选项中的<q>读取编码</q>，可强制指定读取信息所用编码，然后重新打开书签。\n\n操作步骤如下。\n\n点击<q>全局选项</q>，转到程序的全局设置。\n\n选择<q>读取编码选项</q>的选项卡。在<q>书签文本编码</q>中选择\"UTF-16 Big Endian\"。如下图所示。\n![新的图片](media/image62.png)\n\n返回书签编辑器，点击工具栏的<q>打开</q>按钮，重新加载有问题的 PDF 文档。这时可以看到，书签文本已经正常（如果不能正常显示，返回步骤 2 选择其它编码，再重复此步骤），如下图所示。\\\n![新的图片](media/image63.png)\n\n### 修复PDF文件改名后失效的书签\n\n上述 PDF 文档的书签貌似已经修复，但还有问题。一旦更改了 PDF 文件名，打开文档点击书签就会出现<q>无法打开文档 j24.pdf</q>之类的错误，如下图所示。只有将 PDF 文件名改回\"j24.pdf\"，书签才能正常工作。\n\n出现这种问题的原因是：PDF 文档书签使用了指定文件名的外部链接，而不是文档内部链接。\n\n![新的图片](media/image64.png)\n\n为解决上述问题，书签编辑器提供<q>强制将外部链接改为内部链接</q>的功能。操作步骤如下：\n\n用书签编辑器打开书签（结果见上节图所示）。在编辑器中可看到，书签动作是<q>打开外部 PDF 文档</q>。展开书签，发现所有书签项的动作均为打开外部 PDF 文档。随便点击编辑器<q>书签动作</q>列上任何一个<q>打开外部 PDF 文档</q>链接，在弹出的对话框中可以发现，书签动作指向了一个名为\"j24.pdf\"的文档。如下图所示。\\\n![新的图片](media/image65.png)\n\n这就是 PDF 文件改名之后链接失效的原因。只有当文件名为\"j24.pdf\"时，点击链接才能跳转到其指定的页面，否则由于不存在\"j24.pdf\"文件，PDF 阅读器就会报告找不到文件的错误。\n\n点击<q>取消</q>按钮关闭上述对话框，返回书签编辑器。\n\n由于所有书签均存在同样的问题，可以用修改菜单的命令，一并修复。按 Ctrl+A（或用鼠标选择）选中所有书签，选择<q>修改操作包含未选中的内部书签</q>复选框，使后续操作作用于隐藏在书签内部的子书签。\n\n点击<q>修改</q>按钮，在弹出的菜单中选择\"强制设置为文件内链接\"命令。\n\n完成后，从编辑器中可以看到，书签动作已经变为\"转到页面\"。如下图所示。\n![新的图片](media/image66.png)\n\n### 修改链接的目标页码\n\n使用高级补丁功能将书签补丁回 PDF 文档后可以发现，书签指向的目标页面往前偏离了一页。本来应该指向第 2 页的，却跳转到第 1 页；应指向第 16 页的，却跳到第 15 页。使用书签编辑器可将所有页面的目标页码统一往后加一页。操作办法如下：\n\n用书签编辑器打开书签（结果见上节图所示）。从书签编辑器中可以看到，第一个有效页面\"马克思恩格斯全集（39）上\"的页码指向了 0。\n\n选中<q>修改操作包含未选中的内部书签</q>复选框，使后续修改操作作用于隐藏在书签内部的子书签。\n\n选中所有书签项。\n\n点击<q>修改</q>按钮，在弹出的菜单中选择<q>增加页码</q>命令。\n\n完成后，从编辑器中可以看到，页码均已增加了 1。如下图所示。\\\n![新的图片](media/image67.png)\n\n另外，前面三个书签项没有必要保留，可用鼠标选中，然后点击工具栏的<q>删除</q>按钮将其删除。\n\n### 将修改结果补丁回PDF文档\n\n经过上面几步操作，书签已被成功修复了。最后一步是组合书签和原 PDF 文档，生成修复后的新文档。操作步骤如下：\n\n点击编辑器的<q>保存</q>按钮，将书签保存为\".xml\"后缀的信息文件。（如不需保存信息文件，可跳过此步骤）\n\n点击<q>补丁</q>按钮，将弹出一个对话框。该对话框列出了原始 PDF 文件和输出 PDF 文件。在<q>输出 PDF 文件</q>处指定补丁输出文件的位置。\n\n点击<q>确定</q>按钮，稍等片刻，刚才的修改成果就保存到生成的新 PDF 文件中去了。\n\n## 添加简易书签\n\n### 例一：使用Excel制作简易书签\n\n手头上有一本没有任何书签的影印版《黄帝内经》。从网上我们可以很轻易地找到这本书的目录文本。将其复制下来，稍作处理，成为类似如下形式的一行一行文本：\n\n```\n上古天真论第一\n四气调神大论第二\n生气通天论第三\n金匮真言论第四\n......\n```\n\n再将这些文字复制到 Excel 工作表中，上面的文字成为 A 列（第 1 列）。\n\n上述目录没有页码，因此，要加上页码，才能让书签跳转到指定页面。影印版的 PDF 通常都附有原书目录。用\nPDF\n阅读器打开该文件，转到目录页，然后对着将页码输入到 Excel 的 B 列（第 2 列）。\n\n输入完之后，由于目录页中的页码和 PDF 文件中的真实页码有一定的差距。在这个影印版的 PDF 文件中，第一章出现在文件的第 14 页。因此，在 Excel 表的第 1 行前面插入一行，输入\"\\#首页页码=14\"，表示下面的页码中第一页对应于 PDF 文件的第\n14 页。Excel 表看起来是如下的样子：\n\n![67609\\_090429232530](media/image68.png)\n<figcaption>图表 5--8：使用Excel制作简易书签（第1行的`#版本`指令可忽略不写）</figcaption>\n\n完成了书签的输入工作后，用 Excel 将其保存为\"书签.txt\"文本文件（不能保存为 XLS 文件）。\n\n打开 PDF 补丁丁。选择<q>处理、制作 PDF 文档</q>功能的<q>独立补丁</q>模式。向文件列表添加《黄帝内经》的 PDF 文件。在<q>PDF 信息文件</q>处选择刚才保存的文本文件。在<q>输出 PDF 文件</q>处选择导入书签文件后所得的新 PDF 文件。\n\n**提示**：操作前要关闭 Excel 程序，否则程序无法读取信息文件。\n\n点击<q>生成 PDF 文件</q>按钮，程序将把简易书签和原始文件合并，生成一个新的 PDF 文件。\n\n**说明**：除了使用<q>独立补丁</q>功能，也可以使用书签编辑器打开简易书签文件并执行补丁。\n\n耐心等待程序处理完成。最后，我们就得到了一个具有书签的 PDF 文件。如下图所示。\n\n![67609\\_090429233022](media/image69.png)\n<figcaption>图表 5--9：导入了简易书签的PDF文件</figcaption>\n\n### 例二：制作多级目录的简易书签\n\n上一示例讲解了制作简易书签的一般步骤，本节介绍制作较复杂一点的多级书签。\n\n首先，输入需要制作的简易书签文本。本示例部分目录如下所示：\n\n```\n第一章 中国气功概况 1\n一、 气功发展简史 1\n二、 什么是\"气功\" 3\n三、 练功的目的 5\n四、 气功有什么效果 7\n五、 气功功法分类及特点 9\n养生气功 11\n诊断气功 19\n......\n```\n\n这个目录其实分三层，第一层是章，第二层是节，最后一层是小节。\n\n将上面的文本复制到一个文本编辑器（如 AkelPad、PSPad、EditPlus 等）的编辑区中。选中上面\"一、气功发展史\"到\"诊断气功\"这几行，按一下键盘上的\"Tab\"键。这样，这几行前面就多了一个制表符，看起来就是缩了进去一层的样子。然后，在选中下面\"养生气功\"到\"诊断气功\"两行，再按一下\"Tab\"键，这两行又往内缩进了一层。成为如下形式：\n\n```\n第一章 中国气功概况 1\n    一、 气功发展简史 1\n    二、 什么是\"气功\" 3\n    三、 练功的目的 5\n    四、 气功有什么效果 7\n    五、 气功功法分类及特点 9\n        养生气功 11\n        诊断气功 19\n        ......\n```\n\n用类似的方式处理后面几章的目录。\n\n打开 PDF 文件，看看第一章对应的实际页码是第几页（本示例为第 7 页）。因此，我们在书签文件中第一行前面插入一行，添加`#首页页码=7`指令，成为如下形式：\n\n```\n#首页页码=7\n第一章 中国气功概况 1\n一、 气功发展简史 1\n......\n```\n\n`#首页页码=7`指令表示下面的页码第 1 页对应 PDF 文档中的第 7 页。\n\n这本书前面还是有一个目录的。我们可以在书签文件中再加点东西，在书签中包含目录。在书签文件第一行前插入内容，成为如下形式：\n\n```\n目录 1\n#首页页码=7\n第一章 中国气功概况 1\n一、 气功发展简史 1\n......\n```\n\n虽然\"目录\"和\"第一章\"的页码都是 1，但\"目录\"对应 PDF 文件的第 1 页，而由于第二行\"\\#首页页码\"指定了页码的关系，\"第一章\"实际对应第 7 页。\n\n完成后将书签文件保存为文本文件。然后用 PDF 补丁丁将其导入到原始 PDF 文档，即可生成带书签的 PDF 文件。如下图所示。\n\n![67609\\_090430143020](media/image70.png)\n<figcaption>图表 5--10：带有多层目录的PDF书签</figcaption>\n\n### 例三：使用字符识别功能生成简易书签\n\n为扫描 PDF 文档制作简易书签的又一种办法是使用字符识别功能识别目录页，用目录页的文本生成书签。基本操作步骤如下。\n\n1.  在 PDF 阅读器中打开并观察文档，确定扫描 PDF 文档的目录页范围。\n\n2.  转到<q>识别图像文本</q>功能，指定需识别的 PDF 文件，并选择适当的处理选项（建议选中<q>识别目录页的点分隔符</q>、<q>压缩连续出现的空格</q>两选项；为提高识别效果，可人工指定<q>文字排版方向</q>选项为横向或纵向；如扫描页面倾斜，可选中<q>旋转校正</q>和<q>拉伸校正</q>两选项）。\n\n3.  在<q>识别页码范围</q>文本框中输入目录页的页码范围。\n\n4.  指定识别文本后输出的文本文件，点击<q>识别图像文本</q>按钮，尝试识别目录页。\n\n5.  编辑输出的文本文件，修正错误识别的字符。\n\n6.  用书签编辑器打开该文本文件，制作成书签文件或直接补丁到 PDF 文档。\n\n## 自动生成导航书签\n\n自动生成导航书签是一个颇具实用价值的功能。该功能可为 PDF 文档自动生成书签，免却手工输入书签的不便。基本操作步骤有如下几步。\n\n1.  观察文档，人工分析文档标题特征。\n\n2.  尝试生成书签。\n\n3.  调整标题识别选项以及增加筛选条件。\n\n4.  在输出的日志窗口或书签编辑器查看输出的书签，如不满意，重复 2、3 两步。\n\n5.  使用书签编辑器编辑、优化书签。\n\n6.  生成 PDF 文件。\n\n**说明**：自动生成 PDF 书签功能只能为文本 PDF 文档生成书签，无法处理扫描图片的 PDF 文档。\n\n本参考手册 PDF 电子版的书签就是用自动生成书签功能生成的。本节将以本手册为例，讲述自动生成书签的详细操作步骤。\n\n### 观察文档\n\n自动生成书签的第一步是观察 PDF 文档，了解其排版特征。观察需要作为书签的文本具有何种特征。以本文档为例，文档标题有如下特征：①每个标题都使用较大尺寸的粗宋体或黑体，②字体尺寸随标题级别而渐次变小。③每个标题都是独占一行的。如下图所示：\n\n![新的图片](media/image71.png)\n<figcaption>图表 5--11：本参考手册的标题样式</figcaption>\n\n### 尝试生成书签\n\n由于 PDF 书籍的页数往往较多，处理一次需要一定的时间，首先使用程序的默认设置，尝试为某几个比较有代表性的页面------具有需要生成为书签的标题的页面，生成书签。观察这几页的标题是否能完全生成书签，并且没有引入正文的其它文本。\n\n本示例中以默认配置尝试为使用文档第 2～20 页生成书签。选项配置如下图所示：\n\n![新的图片](media/image72.png)\n<figcaption>图表 5--12：使用默认配置为示例文档2～20页生成书签</figcaption>\n\n点击<q>导出信息文件</q>按钮，程序将生成书签，并将文本显示到日志窗口，如下图所示。\n\n![新的图片](media/image73.png)\n<figcaption>图表 5--13：日志文件输出的书签文本内容</figcaption>\n\n### 观察输出结果并调整标题识别选项\n\n观察日志窗口输出的内容可以发现，按照默认的标题尺寸，只能输出到标题 2，标题 3 和标题 4 的文本并没有包含到输出的书签中。\n\n为将标题 3 和标题 4 的文本也输出为书签，可尝试调整标题识别选项，将<q>标题文本尺寸</q>参数从默认的 13 调整为较小的 12，然后再点击<q>导出信息文件</q>按钮。如下图所示。\n\n![新的图片](media/image74.png)\n<figcaption>图表 5--14：调整标题文本尺寸参数以输出更低级别的标题</figcaption>\n\n输出结果如下图所示。\n\n![新的图片](media/image75.png)\n<figcaption>图表 5--15：调整标题文本尺寸后输出的书签文本内容</figcaption>\n\n观察上面输出的文本可知，标题 3 和标题 4 的内容已被输出到书签。\n\n但是，标题 3 和标题 4 由于其字体尺寸相同，因此输出到书签后级别相同（见上图中\"4.3.2\"、\"4.3.2.1\"两个标题），没有体现出标题之间的层次关系。\n\n为使输出的书签体现出标题 3 和标题 4 的层次关系，可以在<q>高级筛选处理</q>选项中添加调整项，调整标题 3 的级别使其级别大于标题 4。操作办法如下：\n\n选择<q>高级筛选处理</q>选项卡。\n\n由于之前已生成了信息文件，因此，可点击<q>从信息文件添加</q>按钮。\n\n点击按钮后将弹出一个对话框，该对话框列出了文档标题所使用的字体及其尺寸，以及文档中首次使用此尺寸字体的文本内容。如下图所示：\n\n![新的图片](media/image76.png)\n<figcaption>图表 5--16：添加字体筛选条件</figcaption>\n\nPDF 文档中一般使用英文的字体名称，在对话框中找到第一个标题 3（示例中为\"4.2.1 文件列表\"）对应的字体，由于该标题混合使用了两种字体，因此有两个地方都出现了该标题文本，并且尺寸均为 12.00，第一个是\"SimSun\"，有经验的读者可知其对应的字体是\"宋体\"，即标题 3 文本中数字编号（\"4.2.1\"）所用的字体；下面一个\"FZLanTingHei-DB-GBK\"，就是标题 3 的中文字体（\"文件列表\"）所用的字体。用鼠标右键点击该字体名称，然后在弹出的上下文菜单中选择\"筛选名称为'FZLanTingHei-DB-GBK'的字体\"菜单项。\n\n点击上述命令后，在<q>筛选条件</q>列表中将可见已添加了一个项目。\n\n点击<q>确定</q>按钮关闭该对话框。\n\n返回到<q>高级筛选处理</q>选项界面时，可见已添加了一个新的筛选条件。选中该筛选条件，在<q>调整级别</q>列中输入\"0.01\"，并选中<q>相对调整</q>列对应的复选框（这两个选项的含义是将符合筛选条件的文本的级别增加 0.01；如不选中<q>选对调整</q>复选框，则表示将匹配文本的级别降低到 0.01）。如下图所示。\n\n![新的图片](media/image77.png)\n<figcaption>图表 5--17：增大筛选条件匹配的标题级别</figcaption>\n\n从前面的分析可知，标题 3 和标题 4 的级别相同，现在标题 3 的级别增加了 0.01，则标题 3 将比标题 4 有较高的级别，在导出的书签中将把标题 4 包含在内。点击<q>导出信息文件</q>按钮，重新执行生成书签的操作。\n\n观察输出，可见标题 3 已经包含了标题 4。输出结果基本令人满意。\n\n返回自动生成书签的界面，修改页码范围，使之包含所有需要处理的页面。再执行导出信息文件操作，生成整个文档的书签。\n\n### 使用书签编辑器修改输出的书签\n\n生成信息文件后，可使用书签编辑器修改其中的文本，使书签更美观。具体过程在此从略，可参见前文内容。修改好书签后，可使用书签编辑器的补丁功能生成具有书签的新 PDF 文档。\n\n## 批量删除文档首页及末页\n\n任务：某网友得到一批 PDF 文件，每个文件的第一页和最后一页都是广告，想批量将其删除。使用 PDF 补丁丁的操作步骤如下。\n\n1.  选择<q>提取页面</q>功能。\n\n2.  将原 PDF 文件放在同一个目录（设该目录为\"E:\\\\原始文件\"），点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，转到上述目录选择该批文件。\n\n3.  在<q>输出 PDF 文件</q>右方的组合编辑框中，指定输出位置，如\"E:\\\\输出文件\\\\abc.pdf\"。程序将把原始文件复制到\"E:\\\\输出文件\"目录（不用理会输出文件名\"abc.pdf\"，程序自动将原始文件名替换为输出目录的文件名）。\n\n4.  在<q>页码范围</q>文本框中不要输入任何内容，程序默认处理所有页面。在<q>排除页码范围</q>文本框中输入\"1;-1\"，表示排除第 1 页和倒数第 1 页（负数表示从末尾起算的页码）。\n\n5.  点击<q>提取页面</q>按钮即可。\n\n## 批量倒排逆页序文档\n\n任务：某网友下载了一批 PDF 文件。每个文档里的页面均为倒排。原书首页在 PDF 文件成了最后一页，书末页却在最前面。如果使用 PDF 编辑器逐个文档手工调整页数，将耗费大量时间。该网友尝试用 PDF 打印机的<q>逆序打印</q>功能重排页面，但逆序打印会降低文档质量，耗时更甚。\n\n使用 PDF 补丁丁可以轻松批量调整页码顺序，操作步骤及屏幕截图如下。\n\n1.  选择<q>提取页面</q>功能。\n\n2.  点击<q>原始 PDF 文件</q>右边的<q>浏览</q>按钮，在弹出的打开文件对话框中，选择需要重排页面顺序的 PDF 文档（可多选）。\n\n3.  在输出 PDF 文件处，输入输出路径（本示例中为<q>M:\\\\</q>），然后用鼠标右键点击该文本框，在弹出的上下文菜单中选择`<源文件名>`，插入源文件名替代符，表示按原始 PDF 文件的文件名输出到输出目录。\n\n4.  在<q>页码范围</q>文本框中填入倒序的页码范围：\"-1-1\"（不带引号）。前一个\"-1\"表示文档最后一页，中间的\"-\"号表示页码范围，最后的\"1\"表示第一页。\"-1-1\"即文档的最后一页到第一页（如果需要从文档倒数第二页开始提取页面，则输入\"-2-1\"）。\n\n5.  点击<q>提取页面</q>按钮，即可将颠倒页码的原始 PDF 文件回复原状，保存到输出路径。\n\n![新的图片](media/image78.png)\n<figcaption>图表 5--18：重排逆序页面</figcaption>\n\n## 插图、合并文档并保留原文档书签\n\n任务：将\"小说（一）.pdf\"和\"小说（二）.pdf\"合并为一个 PDF 文件，并且在合并后的 PDF 文件第 1 页前面插入\"封面.jpg\"图片文件。\"小说（一）\"和\"小说（二）\"这两个 PDF 文件本身有便于阅读的书签，希望合并后的 PDF 文档也带有原来的书签，以便阅读。\n\n使用 PDF 补丁丁可以完成上述插入图片、合并 PDF 文档的任务。操作步骤如下。\n\n### 添加文件\n\n选择<q>处理、制作 PDF 文档</q>功能的<q>合并文件</q>模式。\n\n点击<q>添加文件</q>按钮，从弹出的打开文件对话框中定位到\"封面.jpg\"、\"小说（一）.pdf\"和\"小说（二）.pdf\"文件所在的目录，选择这三个文件，点击<q>确定</q>按钮，将文件添加到文件列表。如果文件不在同一个目录，可重复此步骤多次，直至需要处理的文件都添加到文件列表位置。\n\n提示：可以从\"我的电脑\"或\"资源管理器\"将需处理文件直接拖放到文件列表。\n\n### 调整文件顺序\n\n在列表顶部的文件将首先插入到输出 PDF 文件，如先后顺序不对，可使用程序界面上的<q>↑</q>和<q>↓</q>按钮调整文件项目的顺序。\n\n完成上述调整操作后，文件列表从上往下依次为：\"封面.jpg\"、\"小说（上）.pdf\"和\"小说（下）.pdf\"。\"封面\"将成为输出文件的第 1 页；\"小说（上）\"的页数有 2 页，处于输出文件的第 2、3 页；\"小说（下）\"则处于输出文件的第 4、5 页。\n\n### 设定页面布局\n\n由于上述图片和 PDF 文档的尺寸不一致。为美观起见，可以调整图片的页面尺寸，使图片所在页面的尺寸和两个 PDF 文件的页面尺寸一致。\n\n选择<q>PDF 文档选项</q>功能。在<q>页面尺寸</q>下拉列表中找到<q>A4（21 厘米\\*29.7 厘米）</q>，选中该项。这时界面右方的<q>宽</q>、<q>高</q>数值调整框将自动改为相应的数值。\n\n提示：如所需页面尺寸在列表框中找不到，可自行在<q>宽</q>、<q>高</q>调整框中输入。\n\n### 保留源文件的书签\n\n在本示例中，源 PDF 文件本身带有书签。在完成合并操作后，程序可以将源 PDF 文件的书签也带到新的文件中。\n\n在<q>PDF 文件选项</q>的[书签设置选项卡](#页码标签)中选择<q>信息文件无书签时自动生成书签</q>单选框，以及<q>保留源 PDF 文件的书签</q>复选框，再生成文件。\n\n### 生成文件\n\n完成页面布局的调整操作后，返回<q>处理 PDF 文档</q>功能。\n\n点击<q>输出 PDF 文件</q>右方的<q>浏览</q>按钮，指定输出 PDF 文件的位置。\n\n点击<q>生成 PDF 文件</q>按钮。程序将把上述三个文件合并成一个 PDF 文件。\n\n本示例生成的文件在 Adobe\nReader 的显示效果如下图所示（为方便展示，手动将文档的显示方式改成<q>双页连续</q>）。\n\n![新的图片](media/image79.png)\n\n## 插页合并文档\n\n任务：某网友用扫描仪扫描了一批双面打印的文件，得到两个 PDF 文件。一个包含纸面正面（单数页面）的内容，另一个包含纸面反面（双数页面）的内容，现在希望将两个 PDF 文件按实际正反面合并成一个 PDF 文件。\n\n使用 PDF 补丁丁实现上述任务有两种方法。第一种方法是提取图片再生成文件；第二种方法是合并两个 PDF 文件为一个，然后重排页序。现分别介绍如下。\n\n### 提取图片再生成文件\n\n由于扫描生成的 PDF 文件是全图片的 PDF 文件，因此可以将两个 PDF 文件的图片全部提取出来，按文件名排序，然后重新生成一个新的 PDF 文件。操作步骤如下。\n\n1.  选择<q>提取图片</q>功能。\n\n2.  选择第一个 PDF 文件并指定输出目录，如\"C:\\\\Documents\\\\图片\"。\n\n3.  在指定文件掩码为\"0000A\"，使输出的文件形式为四位数字后面加一个\"A\"字，如\"0001A.tif\"、\"0002A.tif\"等等。\n\n4.  点击<q>提取图片</q>按钮，将图片导出到输出目录。\n\n5.  再选择第二个 PDF 文件，不要改变上面指定的输出目录，但更改文件掩码为\"0000B\"，使输出文件名成为\"0001B.tif\"、\"0002B.tif\"的形式。这样，两个 PDF 文件输出的图片将存放在同一个目录下，而图片文件名根据页数编号和后面的\"A\"、\"B\"后缀，就可以自然排好序了。\n\n6.  选择<q>处理 PDF 文档</q>功能的<q>合并文件</q>模式。\n\n7.  将上述步骤生成的图片文件全部添加到文件列表。\n\n8.  用排序功能排序文件列表中的图片文件，使顺序成为\"0001A.tif\"、\"0001B.tif\"、\"0002A.tif\"、\"0002B.tif\"等等。\n\n9.  为生成的 PDF 文件指定文件名。\n\n10. 点击<q>生成 PDF 文件</q>按钮，程序将按文件列表的顺序将图片合成为一个 PDF 文件。\n\n### 合并文档后再排序\n\n另一种方法是将两个 PDF 文件合并成一个 PDF 文件，然后用导出页面功能重排页面顺序。操作步骤如下。\n\n1.  选择<q>处理 PDF 文档</q>功能的<q>合并文件</q>模式。\n\n2.  将第一个 PDF 文件和第二个 PDF 文件拖放到文件列表，按先后顺序排序。\n\n3.  指定输出文件位置。\n\n4.  然后点击<q>生成 PDF 文件</q>按钮，生成文件。\n\n5.  选择<q>提取页面</q>功能。\n\n6.  在<q>原始 PDF 文件</q>处指定刚才生成的文件。\n\n7.  指定输出位置。\n\n8.  这里假定两原始文件页数相等，都是 100，则合并后的 PDF 文件有 200 页。重排页面后，页面顺序应该是 1、101、2、102、3、103......99、199、100、200。因此，应在<q>页码范围</q>处指定如下顺序：\"1;101;2;102;3;103（中间的项目在此省略）;99;199;100;200\"。\n\n9.  点击<q>提取页面</q>按钮，程序就会自动重排合并后的那个 PDF 文档的页面，生成一个新的文档。\n\n提示：生成上述页码顺序的方法很简单，用电子表格程序（如 Excel、WPS 表格等）自动填充的方式做两行数，第 1 行是 1 到 100；第二行是 101 到 200。两行的数字各隔开一格交错排列，然后在第三行用公式将两行数加起来（如下图所示），就得到一个交错的数列。将该行内容复制出来，就是上述页码顺序了（从电子表格程序拷贝的第三行文本中有制表符，不用管，程序会自动忽略）。\n\n![新的图片](media/image80.png)\n\n### 两种方法的对比\n\n第一种方法简易快捷，但只适合完全为图片的 PDF 文件。\n\n第二种方法保真度相对较高，适合包含文字和图片的 PDF 文件，但操作步骤较复杂一点。\n\n**说明**：在上述第二种方法，实际上用<q>合并文件</q>模式也可以重排页码。先将两个文件合并生成一个新文件。将文件列表清空，将上述新文件添加到文件列表，双击文件列表的项目，在属性对话框中的<q>页码顺序</q>文本框中输入上述形式的页码顺序，再生成一个新文件亦可。\n\n# XML信息文件参考\n\nPDF 补丁丁使用的信息文件可从[导出文档信息](#导出信息文件)功能导出。信息文件是 XML 文件，可使用 XML 编辑器或文本编辑器打开编辑。\n\n## 信息文件根元素\n\n信息文件的根元素是<q>PDF 信息</q>。\n\n### 属性\n\n文件根元素可包含如下属性：\n\n<q>程序名称</q>属性（固定）：取固定值<q>PDFPatcher</q>。\n\n<q>程序版本</q>属性（必须）：表示该文档可被 PDF 补丁丁正常打开处理的最低版本。\n\n<q>导出时间</q>属性（可选）：导出文档的日期及时间。\n\n<q>PDF 文件位置</q>属性（可选）：用于导出信息文档的原始 PDF 文件路径。书签编辑器使用此属性打开书签对应的 PDF 文档。\n\n<q>页数</q>属性（可选）：PDF 文档的页数。\n\n### 子元素\n\n根元素可包含如下各子元素。各子元素均是可选的。\n\n<q>[度量单位](#度量单位)</q>元素：表示文档尺寸的度量单位。\n\n<q>[文档信息](#文档元数据文档信息元素)</q>元素：包含文档的元数据信息。\n\n<q>[阅读器设定](#阅读器初始设定阅读器设定元素)</q>元素：表示阅读器的初始设定。\n\n<q>[页码样式](#页码编号样式页码样式元素)</q>元素：包含文档逻辑页码的编号方式。\n\n<q>[文档书签](#文档书签)</q>元素：包含文档的导航书签。\n\n<q>[页面链接](#_Toc260694714)</q>元素：包含文档页面内的跳转链接。\n\n<q>[命名位置](#命名位置)</q>元素：包含文档内命名的跳转目标位置。\n\n<q>[页面设置](#页面设置)</q>元素：包含页面尺寸及旋转角度等设置。\n\n各元素的内容由下文详细叙述。\n\n## 度量单位\n\n信息文件中页面、位置尺寸的度量单位在<q>度量单位</q>元素中表示。\n\n度量单位包含<q>单位</q>属性，其取值可为<q>厘米</q>、<q>毫米</q>、<q>英寸</q>和<q>点</q>。如不出现<q>度量单位</q>元素或<q>单位</q>属性，则单位为<q>点</q>。1 英寸（约等于 2.54 厘米）等于 72 点。\n\n<q>点</q>是 PDF 文件内部使用的度量单位。\n\n## 文档元数据（\"文档信息\"元素）\n\n文档的元数据信息在根元素下以<q>文档信息</q>元素表示。\n\n### 属性\n\n各属性均为可选。如信息文件不指定属性，则保留原始 PDF 文件的对应数据。\n\n<q>PDF 版本</q>属性：PDF 版本号，如 1.4、1.5、1.6 等。\n\n<q>标题</q>属性：PDF 文档的标题。\n\n<q>作者</q>属性\n\n<q>主题</q>属性\n\n<q>关键字</q>属性\n\n<q>创建程序</q>属性：表示用于创建 PDF 文档的程序。\n\n<q>处理程序</q>属性：表示最后一次处理 PDF 文档的程序。\n\n<q>创建日期</q>属性：表示 PDF 文档的创建日期和时间。\n\n<q>最近修改日期</q>属性：表示最近修改 PDF 文档的日期和时间。\n\n导入信息文件时，标题、作者、主题和关键字可导入到文档。\n\n### 示例\n\n```xml\n<文档信息\n\t创建程序=\"WPS Office 个人版\"\n\t关键字=\"PDF, PDFPatcher, 使用手册\"\n\t作者=\"WMJ\"\n\t标题=\"PDF补丁丁使用手册\"\n\t主题=\"PDF补丁丁\"\n\t创建日期=\"2010年04月28日 16:47:50\"\n\t处理程序=\"PDFlib 7.0.3 (C++/Win32)\" />\n```\n\n## 阅读器初始设定（\"阅读器设定\"元素）\n\n阅读器的初始设定在根元素下以<q>阅读器设定</q>元素表示，用于指定阅读器在打开文档时的界面布局。\n\n### 属性\n\n各属性均为可选，并非所有 PDF 阅读器都支持这些属性。如信息文件不指定属性，则保留原始 PDF 文件的对应数据。\n\n<q>页面布局</q>属性：显示页面时的初始布局，有效取值可为：<q>保持不变</q>、<q>单页连续</q>、<q>单页</q>、<q>双页连续</q>、<q>双页</q>、<q>双页连续首页独置</q>或<q>双页首页独置</q>六者之一。其中，<q>连续</q>的布局允许阅读器跨页显示文档，双页布局时，首页（封面）可以独置成单独的一页。\n\n<q>初始模式</q>属性：显示打开文档时显示的导航栏（如页面缩略图、文档书签等），有效取值为<q>不显示边栏</q>、<q>显示文档书签</q>、<q>显示页面缩略图</q>、<q>全屏显示</q>、<q>显示可选内容组</q>或<q>显示附件栏</q>六者之一。比较常用的取值是<q>显示文档书签</q>或<q>全屏显示</q>。\n\n<q>隐藏工具栏</q>属性：表示是否隐藏阅读器界面的工具栏，有效值为<q>是</q>或<q>否</q>（并非所有 PDF 阅读器都支持此属性）。\n\n<q>隐藏菜单</q>属性：表示是否隐藏阅读器界面的菜单栏，有效值为<q>是</q>或<q>否</q>（并非所有 PDF 阅读器都支持此属性）。\n\n<q>只显示文档内容</q>属性：表示是否隐藏用户界面的其它内容，有效值为<q>是</q>或<q>否</q>（并非所有 PDF 阅读器都支持此属性）。\n\n<q>窗口适合文档首页</q>属性：表示是否调整阅读器的窗口使之适合文档的第一页内容，有效值为<q>是</q>或<q>否</q>（并非所有 PDF 阅读器都支持此属性）。\n\n<q>窗口居中</q>属性：有效值为<q>是</q>或<q>否</q>（并非所有 PDF 阅读器都支持此属性）。\n\n<q>显示文档标题</q>属性：表示是否在阅读器的窗口标题栏显示文档的标题，有效值为<q>是</q>或<q>否</q>（并非所有 PDF 阅读器都支持此属性）。\n\n<q>阅读方向</q>属性（仅在页面布局为双页时有效）：表示双页布局下相邻两页的显示方式，有效取值为<q>从左到右</q>或<q>从右到左</q>。如文档为传统竖向排版布局，可选择<q>从右到左</q>。\n\n### 示例\n\n例一：在打开阅读器显示文档时，显示文档书签。\n\n```xml\n<阅读器设定 初始模式=\"显示文档书签\" />\n```\n\n例二：使用从右到左的方式阅读文本，初始的页面布局是双页对开显示，连续滚动，其中文档第一页单独放置。\n\n```xml\n<阅读器设定\n\t初始模式=\"显示文档书签\"\n\t阅读方向=\"从右到左\"\n\t页面布局=\"双页连续首页独置\" />\n```\n\n## 页码编号样式（\"页码样式\"元素）\n\nPDF 文档的逻辑页码设置在根元素下以<q>页码样式</q>元素表示。该元素无属性。\n\n### \"样式\"子元素\n\n<q>页码样式</q>元素包含一系列的<q>样式</q>元素，指定从特定页码开始的逻辑页码编号样式。\n\n每个样式表示一种页码编号规则，从文档对应<q>实际页码</q>的页面开始，到下一个<q>样式</q>指定的<q>实际页码</q>对应的页码结束。\n\n<q>样式</q>元素可包含如下属性。\n\n<q>实际页码</q>属性（数值型，必须）：一个绝对页码编号，有效取值应为 1 到 PDF 文档页数之间的数值，表示从该页开始使用此<q>样式</q>元素指定的页码样式。\n\n<q>起始页码</q>属性（数值型，可选）：表示从<q>实际页码</q>开始使用的页码样式的起始编号，有效取值应为 1 到 PDF 文档结束页数之间的数值。默认从 1 开始。\n\n<q>页码前缀</q>属性（可选）：在页码编号前的一段文本，如页码样式为<q>数字</q>，而<q>页码前缀</q>为\"P-\"，则在阅读器上看到的逻辑页码是\"P-1\"、\"P-2\"等等。默认无前缀。\n\n<q>样式</q>属性（可选）：指定用于页码编号的数字样式，有效取值可为<q>数字</q>、<q>小写罗马数字</q>、<q>大写罗马数字</q>、<q>小写英文字母</q>或<q>大写英文字母</q>五者之一。默认为阿拉伯数字。\n\n### 示例\n\n以下示例演示具有多种页码样式的文档。\n\n第 1～4 页的页码编号样式是大写的罗马数字（I、II、III、IV）。\n\n第 5～25 页的页码编号样式是以 P 为开头的数字（P1、P2......P21）。\n\n第 26、27 页的页码是大写英文字母（A、B）。\n\n第 28～21 页的页码是小写英文字母（a、b、c、d）。\n\n第 32 页到文档结尾的页码是阿拉伯数字（1、2、3......）。\n\n```xml\n<页码样式>\n\t<样式 实际页码=\"1\" 样式=\"大写罗马数字\" />\n\t<样式 实际页码=\"5\" 页码前缀=\"P\" 样式=\"数字\" />\n\t<样式 实际页码=\"26\" 样式=\"大写英文字母\" />\n\t<样式 实际页码=\"28\" 样式=\"小写英文字母\" />\n\t<样式 实际页码=\"32\" 样式=\"数字\" />\n</页码样式>\n```\n\n## 文档书签\n\n文档书签是 PDF 阅读器中的交互元素，点击文档书签后可跳转到文档的指定位置，打开一个外部 PDF 文档或执行外部的可执行文件。\n\nPDF 文档书签在根元素下以<q>文档书签</q>元素表示。\n\n### \"书签\"子元素\n\n书签子元素表示阅读器中的一个书签。\n\n1. `书签`元素可包含如下属性。\n\n2. `文本`属性（必须）：表示书签的文本。\n\n3. `默认打开`属性（可选）：表示是否默认打开书签。可选取值为`是`和`否`。默认值为`是`，表示书签默认处于打开状态。\n\n4. `样式`属性（可选）：表示书签文本的外观，可选的样式有`粗体`、`斜体`和`粗斜体`三种。\n\n5. `颜色属性组（可选）`：表示书签文本的颜色。有`红`、`绿`和`蓝`3 个值的属性组，表示 RGB 的三个分量，取值为 0～1 之间的小数，则以 1 为满值。因此，`红=\"1\" 绿=\"1\" 蓝=\"1\"`这个三个属性结合的属性组表示白色。除使用数值颜色外，也可使用.NET 框架命名的颜色，以`颜色`属性表示，如`颜色=\"Red\"`表示红色、`颜色=\"Blue\"`表示蓝色，`颜色=\"DarkGreen\"`表示深绿色。此外，还可使用 Web 的`#RRGGBB`十六进制表示方式，如白色可表示为`颜色=\"#FFFFFF\"`、红色为`颜色=\"#FF0000\"`等。\n\n6. `动作`属性（可选）：表示点击书签后执行的动作。可选的动作有`转到页面`（跳转到当前 PDF 文档的指定位置）、`打开外部PDF文档`（打开外部 PDF 文档，并跳转到指定页面）、`打开网址`和`启动程序`四种。默认的动作是`转到页面`。如书签没有`动作`和`页码`属性，则点击书签不执行任何动作。\n\n7. `页码`属性（正整数）：表示点击书签后跳转到的页面。在`动作`属性为`转到页面`或`打开外部PDF文档`时有效。\n\n8. `首页页码`（可选）：表示页码偏移值。例如`首页页码`为 5，页码为 3，则实际跳转到第 5＋3－1＝7 页。\n\n9. `显示方式`属性（可选）：表示跳转到指定页面后的显示方式。在`动作`属性为`转到页面`时有效。显示方式有如下几种：`坐标缩放`（转到指定页面的坐标，并缩放到指定比例）、`适合页面`、`适合窗口`、`适合窗口宽度`、`适合窗口高度`、`适合页宽`、`适合页高`和`适合区域`（缩放到指定矩形区域的尺寸）。\n\n10. `命名位置`属性（可选）：表示跳转到指定名称的位置。`命名位置`由信息文件的`[命名位置](#命名位置)`元素指定。\n\n11. `PDF名称`属性（可选）：表示跳转到 PDF 文档名称表示的位置。\n\n坐标属性组（可选，数值）有`上`、`左`、`下`、`右`和`比例`5 个属性，与`显示方式`属性结合使用。如下表所示。\n\n| 属性     | 解释                                                                                                                  |\n|------------- |-----------------------------------------------------------------------------------------------------------------------|\n| 显示方式     | 坐标                                                                                                                  |\n| 坐标缩放     | 由3个数值属性构成，`左`属性指定是横坐标的偏移值，`上`属性是纵坐标的偏移值，`比例`属性指定缩放比例（可选，1表示100%）。|\n| 适合页面     | 不应有任何坐标。                                                                                                      |\n| 适合窗口     | 不应有任何坐标。                                                                                                      |\n| 适合窗口宽度 | 包含`上`属性，表示跳转后的纵坐标。                                                                                    |\n| 适合窗口高度 | 包含`左`属性，表示跳转后的横坐标。                                                                                    |\n| 适合页宽     | 包含`上`属性，表示跳转后的纵坐标。                                                                                    |\n| 适合页高     | 包含`左`属性，表示跳转后的横坐标。                                                                                    |\n| 适合区域     | 包含`上`、`左`、`下`、`右`4个数值，表示跳转后缩放到的矩形区域。                                                       |\n\n**说明**：坐标以页面左下角（0,0）为最小值。坐标值的单位视乎文档的\"[度量单位](#度量单位)\"元素而定，如不存在该元素，则度量单位为`点`。当数值为 0 或`null`时，表示保持跳转前的偏移值或缩放比例不变。\n\n`命名位置`、`PDF名称`和坐标属性是互斥的，只能指定其中一个。\n\n`外部文件`属性：表示打开一个外部文件。在`动作`属性为`打开外部PDF文档`或`启动程序`时有效。\n\n`URI`属性：表示打开的网址。在`动作`属性为`打开网址`时有效。\n\n`新窗口`属性：表示是否在新窗口打开文档。在`动作`属性为`打开外部PDF文档`时有效。\n\n`书签`元素可包含下级的`书签`元素，表示书签之间的嵌套关系。\n\n### 示例\n\n以下示例表示 PDF 文档中只有一个书签。\n\n该书签的文本是`ABCDEF`，显示成粗体。点击之后，跳转到第 1 页。由于度量单位为厘米，则点击后，页面坐标的横坐标为 0，即保持当前阅读器水平位置不变，纵坐标为 29.7，即跳转到第 1 页纵坐标为 29.7 厘米处，缩放比为 0，表示不改变阅读器当前的显示缩放比例。\n\n```xml\n<度量单位 单位=\"厘米\" />\n<文档书签>\n\t<书签 文本=\"ABCDEF\" 样式=\"粗体\" 页码=\"1\" 显示方式=\"坐标缩放\" 左=\"0\" 上=\"29.7\" 比例=\"0\" 动作=\"转到页面\" />\n</文档书签>\n```\n\n提示：建议将缩放比例改为 0，避免点击书签时更改阅读器的显示缩放状态，以便阅读。此外，可在[导入信息文件](#导入信息文件)时通过[指定\"取消链接目标的缩放比例\"选项](#高级补丁功能导出导入信息文件)来强制将缩放比例置 0。\n\n以下示例表示\"ABC\"书签包含\"XYZ\"书签，但不包含\"DEF\"书签。\n\n\"ABC\"书签的颜色为蓝色，默认关闭。由于该书签没有\"动作\"和\"页码\"属性，因此，在阅读器中点击该书签将不会执行任何动作。\n\n\"XYZ\"书签的动作为\"转到页面\"，点击该书签后，阅读器的显示比例将改成\"适合宽度\"，并且跳转到第 5 页，纵坐标离页面底端 5.24 厘米的位置。\n\n\"DEF\"是一个空书签，点击后不执行任何动作。\n\n```xml\n<度量单位 单位=\"厘米\" />\n<文档书签>\n<书签 文本=\"ABC\" 颜色=\"Blue\" 默认打开=\"否\">\n\t\t<书签 文本=\"XYZ\" 页码=\"5\" 显示方式=\"适合宽度\" 上=\"5.24\" 动作=\"转到页面\" />\n</书签>\n<书签 文本=\"DEF\"/>\n</文档书签>\n```\n\n**注意**：\"ABC\"书签最后一个属性后面是\"\\>\"，表示书签包含子书签，而\"XYZ\"书签最后一个属性后面是\"/\\>\"，表示不包含子书签。\"XYZ\"书签后的\"\\</书签\\>\"与\"ABC\"书签对应，表示\"ABC\"书签的范围到此为止，\"DEF\"书签不嵌套在\"ABC\"书签之内。\n\n提示：在[导入信息文件](#导入信息文件)前，可通过在 PDF 文档选项的\"[阅读方式设置](#页面尺寸)\"选项卡指定\"书签状态\"为\"全部关闭\"，强制让所有书签处于默认关闭状态。\n\n## 页面链接\n\n表示 PDF 文档页面内的链接。在根元素下以\"页面链接\"元素表示。\n\n`页面链接`元素下每个`链接`元素表示一个页面链接。链接元素可包含如下属性。\n\n`页码`属性（必需，正整数）：表示链接所在的页码。\n\n坐标属性组（必需）：有`左`、`下`、`上`和`右`4 个属性，表示链接所在的矩形区域。\n\n`边框`属性（可选）：包含三个数值组合而成的边框属性值。\n\n`点击效果`属性：表示点击链接后的效果。\n\n`文本`属性：表示链接的文本说明。\n\n颜色属性组：表示链接标记的颜色，以`红`、`绿`和`蓝`三个属性组合的三原色分量组合。\n\n`页面链接`元素可包含如下子元素：\n\n边框样式：表示边框的样式，可包含`样式`属性。\n\n以动作命名的元素（如`转到页面`、`打开网址`等），参见`书签`元素的`动作`属性。元素可包含对应动作的属性。\n\n## 命名位置\n\n表示 PDF 文档中具有特定名称的位置。\n\n## 页面设置\n\n页面的尺寸、显示区域和旋转角度可使用`页面设置`元素表示。\n\n### \"页面\"子元素\n\n`页面`子元素表示页面的设置，包含如下属性。\n\n1. `页码范围`属性（必须）：表示此页面设置对应的绝对页码范围。\n2. `页码筛选`属性（可选）：用于筛选页码范围，取值可为`单数页`（页码范围内的所有单数页面）或`双数页`（页码范围内的所有双数页面）。\n3. `页面边框`属性（必须）：表示页面边框的坐标位置。边框包含由两对坐标值构成的矩形区域。前面一对是页面左下角的坐标（0,0），后面一对是页面右上角的坐标。坐标的度量单位由文档的\"[度量单位](#度量单位)\"元素决定。\n4. `截取边框`属性（必须）：表示页面边框中那些内容可显示出来。截取边框的坐标不能落在页面边框所定义的矩形之外。\n5. `裁剪边框`属性（可选，见\"[PDF页面的边界](#pdf页面的边界)\"一节的示意图）\n6. `出血边框`属性（可选）\n7. `内容边框`属性（可选）\n8. `旋转角度`属性（可选）：表示页面旋转方向，必须为 0、90、180 或 270 度。默认为 0 度。\n\n### PDF页面的边界\n\nPDF 页面主要由`页面边框`给定的矩形范围指定。除截取边框外的其它的边框与页面边框的关系如下图所示。\n\n![shot](media/image81.png)\n<figcaption>图表 6--1：PDF边框示意图</figcaption>\n\n由于`截取边框`与除页面边框外的其它边框没有特定关系（截取边框必须落在页面边框内），因此在图中没有画出。\n\n一般场合下，只需要定义页面边框和截取边框。\n\n### 示例\n\n以下示例表示从 1 到 517 页的页面尺寸是 21 厘米宽，29.7 厘米高。\n\n```xml\n<度量单位 单位=\"厘米\" />\n<页面设置>\n\t<页面 页码范围=\"1-517\" \n        页面边框=\"0 0 21 29.7\"\n        截取边框=\"0 0 21 29.7\" />\n</页面设置>\n```\n\n配合使用截取边框和页面边框可以裁剪页面。以下示例表示第 1 到 517 页的双数页面，裁剪其左边 1 厘米的内容，实际页面宽度应该是 21－1＝20 厘米。\n\n```xml\n<度量单位 单位=\"厘米\" />\n<页面设置>\n\t<页面 页码范围=\"1-517\" 页码筛选=\"双数页\"\n        页面边框=\"0 0 21 29.7\"\n        截取边框=\"1 0 21 29.7\" />\n</页面设置>\n```\n\n通过更改页面边框可以为原来没有多少空白的 PDF 页面留出额外的空白。例如下面的示例在页面下方留出了 3 厘米的额外空白。\n\n```xml\n<度量单位 单位=\"厘米\" />\n<页面设置>\n\t<页面 页码范围=\"1-517\" \n        页面边框=\"0 -3 21 29.7\"\n        截取边框=\"0 -3 21 29.7\" />\n</页面设置>\n```\n\n对不同的页面可以指定不同的尺寸。如下面的示例分别定义第 1 页，以及 2 到 517 页间单数和双数页面的不同尺寸。\n\n```xml\n<度量单位 单位=\"厘米\" />\n<页面设置>\n\t<页面 页码范围=\"1\" 旋转角度=\"90\"\n        页面边框=\"0 0 29.7 21\"\n        截取边框=\"0 0 29.7 21\" />\n\t<页面 页码范围=\"2-517\" 页码筛选=\"双数页\"\n        页面边框=\"0 0 21 29.7\"\n        截取边框=\"1 0 22 29.7\" />\n\t<页面 页码范围=\"2-517\" 页码筛选=\"单数页\"\n        页面边框=\"0 0 21 29.7\"\n        截取边框=\"0 0 21 29.7\" />\n</页面设置>\n```\n\n# 简易书签文件参考\n\n简易书签文件主要用于快速制作 PDF 书签。简易书签文件的功能有限，如需要更强的功能，可使用[转换书签文件](#_导入信息生成文件_)功能将其转换为 XML 信息文件。简易书签文件的格式介绍如下。\n\n**注意**：如果将 PDF 文档原有的书签导出成简易文本书签文件，编辑后重新导入到文档，由于简易文本书签包含的信息量较少，可能导致原文档的书签丢失一些信息（如无法精确定位到页面的指定位置、指定书签文本为粗体等）。因此，一般场合下不要导出简易文本书签文件。\n\n## 文件结构\n\n简易书签文件包含文件头和书签两部分。\n\n## 文件头\n\n文件头包含版本、标题、主题、关键字、作者等信息。\n\n`#版本`表示书签文件的版本号，必须出现在第一行。版本编号应与 PDF 补丁丁的版本相符。不使用这一行也可以，但在导入时会提示版本不符。高版本的程序一般兼容低版本的书签文件。\n\n`#标题`、`#主题`、`#关键字`和`#作者`分别表示 PDF 文档属性的标题。\n\n以下代码指定书签文件版本为 0.2.6 和相应元数据信息。\n\n```\n#版本=0.2.6\n#标题=PDF补丁丁使用手册\n#主题=PDF补丁丁\n#关键字=PDF, PDFPatcher, 使用手册\n#作者=WMJ\n```\n\n## 书签内容\n\n除了这一行之外，其他的就是书签内容了。每行正文表示一个书签。书签由如下四部分组成：\n\n缩进标记（默认为制表符）。\n\n书签文本。\n\n文本和页码之间的分隔符。\n\n页码。\n\n### 缩进标记\n\n当一个书签具有比前面一个书签多一个缩进标记时，表示这个书签是前面书签的子级书签。第一个书签的文本前必须没有任何缩进标记。\n\n默认的缩进标记是制表符。\n\n### 书签文本\n\n缩进标记字符串仅在起始位置有效，在书签文本中出现的缩进标记字符将被当成是书签文本。\n\n### 分隔符\n\n文本和页码之间的分隔符可以是一个以上的以下字符：制表符、半角或全角空格、点号`.`、省略号`...`、减号`-`、下划线`_`。\n\n### 页码\n\n以阿拉伯数字编号的页码。页码后面除了可以有多余的空白之外，不能有任何其它内容。\n\n页码数字可以为半角数字，也可以为全角数字，但不能为中文或罗马数字。\n\n如果页码部分为空，则表示一个不跳转到文档任何位置的书签。\n\n### 示例\n\n例如，以下内容定义了六个书签。\n\n```\n顶级书签........... 1\n\t次级书签 ______ 2\n\t\t三级书签    3\n另一个顶级书签\n\t次级书签2 ----- 7\n\t次级书签3  ……   56\n```\n\n请留意书签前使用制表符缩进所表示的嵌套关系：顶级书签包含次级书签，次级书签包含三级书签。\n\n各书签的分隔符不同（任何一种均正确），页码分别是 1、2、3、7、56。第 4 个书签（另一个顶级书签）没有页码，在阅读器中点击该书签将不执行任何操作。\n\n## 书签指令\n\n### 首页页码（指定页码基准值）\n\n很多场合下，我们看到的正文页码都不是在 PDF\n文档中的第一页开始的。往往是前面若干页为前言、目录等，很多页之后才是正文。而我们在输入简易书签文本时，通常是对着目录页输入的（如上面的多级书签所示），因此，简易书签文本中的页码在输入时是目录页上的页码，而不是\nPDF 文档中的页码。\n\n在书签内容中，可以使用`#首页页码`指令指定下面出现的书签，对应首页页码的实际页码。\n\n例如，以下内容定义的`正文`对应的页码为 1、`第一章`对应的页码为 2，但由于前面出现了`#首页页码=39`指令，因此`正文`实际上对应 PDF 文档中第 39 页，`第一章`对应第 40 页。\n\n```\n#首页页码=39\n正文 1\n\t第一章 2\n\t\t第一节 3\n\t第二章 14\n```\n\n一个简易书签文件可以具有多个`#首页页码`指令，每个指令仅影响后面出现的书签页码与实际页码的对应关系，不影响前面的书签页码。\n\n例如，以下示例出现了多个`#首页页码`指令。\n\n```\n#首页页码=1\n封面 1\n#首页页码=3\nXX 序言 1\n自序 5\n#首页页码=11\n目录 1\n#首页页码=39\n正文 1\n\t第一章 2\n\t\t第一节 3\n\t第二章 14\n```\n\n\n\n### 缩进标记（自定义书签嵌套标记）\n\n程序默认使用制表符作为缩进标记，这在使用支持 Tab 键缩进内容的编辑器（如 AkelPad、EditPlus、PSPad 等）中很方便。但在某些场合下使用制表符不太方便（例如在\nExcel\n中输入书签文件，不好输入制表符）。可以使用`#缩进标记`指令指定缩进标记，缩进标记为等号后的内容。\n\n以下示例使用`。`作为缩进标记。\n\n```\n#首页页码=39\n#缩进标记=。\n正文 1\n。第一章 2\n。。第一节 3\n。第二章 14\n```\n\n可以使用超过一个字符作为缩进标记。\n\n以下示例使用了`、、、`作为缩进标记。\n\n```\n#首页页码=39\n#缩进标记=、、、\n正文 1\n、、、第一章 2\n、、、、、、第一节 3\n、、、第二章 14\n```\n\n与`#首页页码`指令类似，`#缩进标记`可以在简易书签文件中出现多次，也只对出现在其后面的书签文本有效。\n\n### 打开书签（指定默认打开状态）\n\n程序默认将书签设置为关闭状态。如需默认设置打开书签显示其子书签，可使用`#打开书签`指令。\n\n以下示例指定`正文`书签为打开状态，而后续各书签为关闭状态。\n\n```\n#打开书签=是\n正文 1\n#打开书签=否\n\t第一章 2\n\t\t第一节 3\n\t第二章 14\n```\n\n# 技术支持及联系方式\n\n## 常见问题\n\n### 文件列表自动清空，无法添加更多的文件\n\n问：每次我添加文件到文件列表，它就自己清空了之前的文件，导致无法一次补丁多个文件。有办法解决吗？\n\n答：不要选中界面上的<q>添加文件前清空列表</q>复选框，就可以向文件列表添加多个文件。\n\n### 无损提取图片功能的原理\n\n问：PDF 补丁丁提取图片是使用虚拟设备打印成图片吗？\n\n答：PDF 补丁丁是通过解析 PDF 文件里面的数据，将数据无损还原为图片文件。\n\nPDF 文件里的图片通常有几种编码方式：无压缩、Deflate、JPEG、JPEG2000、FAX 和 JBIG2。无压缩的图片和 Deflate 编码的可以保存成 PNG，JPEG 和 JPEG2000 一般直接将流保存出来就是图片文件了，FAX 编码的可以还原为 TIFF 文件，JBIG2 编码的将转换为 TIFF 文件。由于图片数据是从 PDF 文件抽取出来，解码后立即以直接保存或无损压缩的方式保存为图片文件的，所以不会存在二次压缩等降低图片质量的问题。\n\n## 已知问题\n\n如阁下在使用过程中遇到以下问题，请勿来函。\n\n1. 无法导出、导入包含多重动作或多媒体动作的 PDF 书签或页面链接。\n2. 无法打开使用 Adobe Acrobat X 加密的 PDF 文档。\n\n## 联系方式\n\n如在使用过程中发现任何问题，请到 [Github 代码仓库](https://github.com/wmjordan/PDFPatcher/issues) 上提交 Issue。在提交的问题中，请提供如下信息：\n\n1. PDF 补丁丁的版本。\n\n2. 操作系统版本及修订版本号。\n\n3. 重现问题的条件及操作步骤。\n\n请尽量详细描述导致出现问题的 PDF 文件。如果可能，可使用导出页面功能导出文档中有代表性的若干页面，将其作为附件随邮件发送。\n\n<link rel=\"stylesheet\" href=\"style.css\">\n"
  },
  {
    "path": "授权协议.txt",
    "content": "﻿《PDF 补丁丁（PDFPatcher）》软件最终用户授权协议\r\n\r\n--------------------------------------------------------------------------------\r\n\r\n《PDF 补丁丁》软件（以下简称本软件）受著作权法及国际条约条款和其它知识产权法及条约的保护。\r\n本软件对于最终用户免费，但带有附加条件。在遵守本软件的前提条件下，你可以在遵循本协议的基础上自由的使用和传播它，你一旦安装、复制或使用本软件，则表示您已经同意本协议条款。如果你不同意本协议，请不要安装使用本软件，也不应利用其源代码。\r\n\r\n附加条件：\r\n每一个使用本软件的用户，如果本软件帮助了您，您每使用本软件后必须做 1 件善事。善事无分大小，有心则行。例如：\r\n1. 如果您的父母在身边，你可以为您的父母做一顿美味的饭菜，或者为他们按摩、洗脚；如果他们身处远方，你可以向他们发起通话，问候他们的健康和生活。\r\n2. 在大雨滂沱的时候，如果您有雨伞，可与同路的人共享；在烈日当空的时节，如果您看到环卫工人太阳下工作，您可以为他们买一瓶水送给他们；在拥挤的公共交通工具上，或在公共场合排队等候之际，如果您有座位，可以让给老人、孕妇或提着重物的人就坐。\r\n3. 您可以用您擅长的技能，为身边的人排难解困；您可以将您的知识，分享给其他人，让他们有所获益；您可以向比您困难的人捐资赠物。\r\n4. 如果您觉得这个软件真的好用，请将它的使用方法介绍给别人，让别人也通过使用本软件而得到好处；或者将其它您觉得好用的软件介绍给别人。\r\n\r\n如果您无法做到使用本软件后做 1 件善事，请记在心中。在有机会的时候，多行善积德。本用户协议之遵循与否，全在于您的良心。是为“良心授权”。\r\n\r\n相关定义：\r\n\r\n1. 软件：软件是指《PDF 补丁丁》软件以及它的更新、产品手册，以及在线文档等相关载体。\r\n2. 限制：你可以使用本软件的源代码开发应用程序（自由、共享或商用），也可以任意方式分发数量不限的本软件的完整拷贝，但前提是：\r\n\t① 你分发软件时必须提供本软件的完整版本，未经许可不得对软件乃至它的安装程序做任何修改；\r\n\t② 你分发软件时不能更改本授权协议；\r\n\t③ 你如果在商业性宣传活动、产品中附加本软件，应当获得著作权人的书面许可；\r\n\t④ 你如果利用本软件的代码编写了其它软件，并且产生了销售收入，应当将该软件销售收入不低于千分之一的金额捐献给社会上的弱势群体。\r\n3. 支持：软件会由于用户的需求而不断更新，著作权人将提供包括用户手册、电子邮件等各种相关信息支持，但软件不确保支持内容和功能不发生变更。\r\n4. 终止：当你不同意或者违背本协议的时候，协议将自动终止，你必须立即删除本软件产品。\r\n5. 版权：本软件及源代码受著作权法及国际条约条款和其它知识产权法及条约的保护。\r\n6. 免责：对于本软件安装、复制、使用中导致的任何损害，本软件及著作权人不负责任。\r\n"
  },
  {
    "path": "更新历史.txt",
    "content": "﻿1.1.0.4620 2025年2月1日\r\n新增功能：\r\n\t可以按首页统一文档页面尺寸。\r\n\t书签编辑器增加将下一个跳转目标的位置赋予上一个空跳转目标的书签功能。\r\n修改功能：\r\n\t新的 MuPDF 库。\r\n\t通过首页的打开 PDF 文档连接可打开书签文件。\r\n\t当右键点击书签编辑器的书签行时，整行均响应鼠标点击。\r\n\t书签编辑器突出显示当前阅读器中的对应书签。\r\n\t文档探查器兼容显示使用页面资源而非独立资源的表单。\r\n\t保存编辑器的书签文件时，如默认编码无法保存，则自动改用 UTF-8 编码。\r\n修复问题：\r\n\t使用探查器分析内容流遇到异常内容将导致程序崩溃。\r\n\t文档探查器显示的字符串值与文档内容流中的不一致。\r\n\t提取图片过程中可能会出现堆栈溢出错误。\r\n\t无法提取某些图片。\r\n\t打开未嵌入字体的文档可能会崩溃。\r\n\t某些情况下没有正确设置输出图像的分辨率。\r\n\t注册表字体信息键值为空导致程序崩溃。\r\n\t无法在 Windows 10 上将程序添加到PDF文档的打开方式菜单。\r\n\t相对路径合并错误。\r\n\t在“关于程序”页面无法打开文档。\r\n\t自动生成书签功能可能生成空白的书签。\r\n\t自动生成书签列表框导入之前保存的条件后，插入新书签将清空规则列表。\r\n\t列出系统安装字体时，对于异常的字体不要抛出异常。\r\n\t处理共用 Root 和 Info 的文档后，导致文档损坏。\r\n\r\n1.0.4.4512 2024年9月30日\r\n新增功能：\r\n\t允许替换批注或表单中的字体。\r\n\t编辑器的阅读器增加移动书签栏光标的快捷键（Shift＋光标键）。\r\n\t结构探查器为批注和表单的内容流显示命令节点。\r\n修改功能：\r\n\t书签编辑器完成页码编辑操作后，不再激活下一个书签的页码编辑框。\r\n\t优化书签编辑器的显示。\r\n\t增加文档结构探查器关于批注样式的信息项。\r\n\t将全屏显示命令移到主菜单，并赋予快捷键F11，F12键切换书签栏的显示状态。\r\n\t优化阅读器从右到左阅读时的翻页行为。\r\n\t在编辑器点击保存按钮弹出对话框的确定按钮后，不再询问覆盖文档。\r\n\t替换字体时保留原字体的宽度设置。\r\n\t文档结构探查器支持选择和修改更多类型的节点。\r\n修复问题：\r\n\t拖放功能标签可能导致程序崩溃。\r\n\t导出图片可能黑白反转。\r\n\t文档命名树有错误导致文档无法打开。\r\n\t将图片转换成黑白的有损压缩选项可能导致图像全黑。\r\n\r\n1.0.3.4411 2024年8月31日\r\n新增功能：\r\n\t增加将书签跳转位置设置为阅读器当前位置的快捷方式。\r\n\t书签编辑器增加选中子书签命令。\r\n\t阅读器中按住 Ctrl 滚动鼠标滚轮可调整缩放比例。\r\n\t移除 AES-256 加密。\r\n\t删除文档附件。\r\n\t尝试将图片转换成黑白的有损压缩选项。\r\n\t增加书签编辑器子菜单的快捷按键。\r\n\t当书签编辑器存在未保存更改时，关闭文档前给出提示。\r\n修改功能：\r\n\t增加书签编辑器的增减页码范围。\r\n\t修改书签编辑器选中项的样式。\r\n\t书签编辑器完成一个书签的页码编辑操作后，自动激活下一个书签的页码编辑框。\r\n\t向创建或补丁的文档写入PDF补丁丁标识。\r\n修复问题：\r\n\t书签编辑器中，设置书签跳转位置命令对于非跳转书签无效。\r\n\t补丁文档后，文档属性对话框内容为空。\r\n\t表单中的黑白图片无法被压缩优化。\r\n\tMuPDF 组件异常会导致程序闪退。\r\n\t页面存在左下非0截取框时，部分功能的坐标判断错误。\r\n\t替换字体功能在替换竖排文本后位置，文字发生位移，且竖排标点符号变成横排符号。\r\n\r\n1.0.2.4311 2024年6月13日\r\n新增功能：\r\n\t仅提取页面可见图片的选项。\r\n\t书签编辑器增加阅读器翻页和插入书签的快捷键。\r\n\t合并文件时自动向单页数 PDF 文件附加一空白页的选项。\r\n\t新的应用程序图标！感谢 github 上的 MY1L 网友。\r\n修改功能：\r\n\t恢复了在各功能输入文件框中自动填入文件名的行为。\r\n\t导出信息文件时，为字体文件取更具体的名称。\r\n\t提取图片功能默认删除重复图片和隐藏图片。\r\n\t在读取命名目标出错时，不抛出异常。\r\n\t合并图片选中将黑白图片设为透明时，仅作用于双色图片。\r\n\t点击编辑器“在此插入书签”命令后，键盘焦点处于书签文本框之内。\r\n\t尽量使用相对路径保存信息文件中的PDF文档位置。\r\n\t将保存选项融入保存 PDF 文件对话框，并优化该对话框的行为。\r\n\t记住阅读器的缩放比例和翻页方向。\r\n\t优化插入书签对话框的行为和布局。\r\n\t增加插入书签的方式。\r\n\t增加书签编辑器子菜单的快捷按键。\r\n\t增加展开和折叠选中书签的功能。\r\n修复问题：\r\n\t书签跳转目标错误导致无法打开文档。\r\n\t混合合并图片和页面时，页面方向与尺寸错误。\r\n\t无法移除某些签名保护。\r\n\t文本异常导致程序崩溃。\r\n\t合并图片时无法正常读取某些 JPEG 图片中的 EXIF 数据。\r\n\t点击工具栏打开新功能时，在输入文件框中未自动填入文件名。\r\n\t某些场合输出文件被错误放置到程序目录。\r\n\t补丁文件的创建时间被覆写为当前时间。\r\n\t嵌入字体时报错。\r\n\t页面边框具有偏移值时编辑器渲染图片、文本边框和书签定位位置错误。\r\n\t编辑器菜单选中状态不反映实际操作方式。\r\n\t合并提取图片可能会导致颜色错乱。\r\n\t拖放的书签可能会消失。\r\n\r\n1.0.0.4200 2021年12月23日~2023年8月30日\r\n新增功能：\r\n\t第一个开放源代码版本。\r\n\t修改了授权协议。\r\n\t合并图片功能使用 JPEG 图片 EXIF 旋转角度。\r\n\t替换字体功能增加简单修改文本简繁体、全角半角转换的功能（用于处理一些旧的 PDF 文档）。\r\n\t增加了合并文件功能的合并冗余数据选项（之前版本中，该选项的行为是默认行为，可能导致无法合并源文档的某些数据）。\r\n\t合并文件功能支持在添加文件后再排序文件列表。\r\n\t合并文件功能增加输出目标文件由多少个文件共多少页合并而成。\r\n\t增加在使用过程中不再提示打开文档权限的操作办法。\r\n\t编辑器允许保存和读取“自动生成书签”功能中的筛选条件，增加书签文本筛选条件。\r\n\t编辑器的自动生成书签功能允许保留之前的书签。\r\n\t拆分文档功能增加压缩选项。\r\n\t记住窗口的位置。\r\n\t合并文件功能增加添加文件夹时不导入子文件夹的选项。\r\n\t增加将 PDF 文件转换为图片 PDF 文档的选项。\r\n\t允许提取灰度图像掩膜。\r\n\t增加合并图片时覆盖原图片分辨率的选项。\r\n\t在补丁文件和重命名文件目标文件名增加“页数”文件信息替代占位符。\r\n修改功能：\r\n\t更新了 JBIG2 解码组件和 MuPDF 组件。\r\n\t优化了 PDF 补丁丁的主程序代码。\r\n\t不再支持 Windows XP、2003。\r\n\t取消了对 XML 程序配置文件的支持（好几年前的版本已经转用 JSON 配置文件了）。\r\n\t需要使用 .NET Framework 4.0 运行时（Windows 8 以上版本自带）。\r\n\t删除了界面上的捐赠二维码。\r\n\t优化高分辨屏幕下的界面显示。\r\n\t从命令行打开文件时，如程序已在运行，则用该程序打开文档，并激活主窗体（按住 Ctrl 键可强制打开新程序窗口）。\r\n\t优化了部分界面显示。\r\n\t使用相对路径读写合并文件功能的文件列表。\r\n\t调整识别文本功能默认的识别结果格式，在识别结果文件不是 XML 时给出提示。\r\n\t提高导出图片功能对轻微格式错误的图片的兼容性。\r\n\t提高文档结构探查器和文档处理器的容错能力。\r\n\t合并文档使用上一页的尺寸作为空白页尺寸。\r\n\t合并文档对话框在添加项后将焦点移动到文本列表框。\r\n\t将编辑器的修改文档选项菜单项移到阅读器工具栏。\r\n\t优化书签编辑器编辑多行书签的体验。\r\n\t导出信息文件时支持导出文件流。\r\n\t调整修改文档选项中替换字体选项的操作方式。\r\n\t导出图片功能支持合成图片和掩膜成为新的透明图像。\r\n修复问题：\r\n\t书签编辑器页码、书签级别等数值或文本编辑框太窄。\r\n\t合并文件功能在添加的目录存在无访问权限文件或子目录时导致程序崩溃。\r\n\tPDF编辑器有时无法用鼠标拖动文档。\r\n\t导出信息文件的输出文件命名不正确。\r\n\tPDF编辑器无法打开带密码的文档。\r\n\t导入多页TIF图片时所有页面全为第一页。\r\n\t合并文件功能没有正常处理带调色板的图片。\r\n\t打开破损PDF文档时会崩溃。\r\n\t导入带控制字符的书签文件时会出错。\r\n\t检查更新窗口在某些场合下会导致程序崩溃。\r\n\t媒体框为负数时，PDF编辑器无法处理文本。\r\n\t无法导出某些用 Deflate 压缩算法编码的图片。\r\n\t拖放多个文档到程序窗口时，无法正常打开所有文档。\r\n\t修改文档旋转页面时没有考虑原始页面的旋转角度。\r\n\t合并部分无损压缩的 TIFF 图像到 PDF 文件时会选择有损 JPEG 格式。\r\n\t替换字体功能不支持加载仅为当前用户安装的字体。\r\n\t文件尺寸的数值错误。\r\n\t导出带输出文本指令的信息文件存在内存漏洞。\r\n\t提取页面功能在某些场合下会生成错误的文件。\r\n\t字母形式的页码标签少了一位数值。\r\n\t合并文件在读写文件列表时可能导致程序崩溃。\r\n\t尝试复制识别失败页面文本时会导致程序崩溃。\r\n\t生成书签功能“添加字体筛选条件”对话框在信息文件没有包含字体信息时会导致程序崩溃。\r\n\t当主程序界面窗口显示不完整时切换功能页面时界面会冻结。\r\n\t编辑器不支持空白页码标签。\r\n\t在某些情况下会重复提取图片。\r\n\t无法提取表单中的图片。\r\n\t添加不存在的文件到重命名文件列表会导致程序崩溃。\r\n\t合并文件功能自动旋转页面适应源图像尺寸选项无效。\r\n\t点击生成书签功能“忽略文本”表头会导致程序崩溃。\r\n\t提取页面功能保留书签的功能在勾选清理文档选项后会失效。\r\n\t无法提取 JPEG 2000 格式图片。\r\n\r\n0.6.2.0 2021年11月9日\r\n新增功能：\r\n\t支持通过命令行或拖放文件到主窗体的方式打开 PDF 文档。\r\n\t增加删除页面开头或结尾若干条输出指令的功能，可用于去除一些干扰阅读的内容。\r\n\t自动生成书签功能是否合并相邻标题的功能。\r\n\t嵌入替换字体功能增加删除文本尾随空白的选项，可用于升级一些旧的 PDF 文档。\r\n\t导出图片功能增加避免导出相同图片的功能。\r\n\t导出图片功能增加使用替代符命名输出文件的功能。\r\n\t修改文档增加可按页面比例调整页面留白的功能。\r\n\t文档编辑器增加是否显示文档批注的功能。\r\n\t书签编辑器在编辑书签文本的同时将定位到书签对应的文档位置。\r\n\t增加了插入书签时强制调用文本识别引擎识别文本的功能。\r\n\t拆分文档功能增加第 1 个文件名也添加编号的功能。\r\n\t兼容电子发票使用的未嵌入字体。\r\n修复错误：\r\n\t在某些情况下调整页面尺寸后页面内容错位。\r\n\t文档编辑器修改书签颜色后无法正常保存到 PDF 文档。\r\n\t自动生成书签功能在页面有偏移值时生成错误跳转坐标。\r\n\t导出图片功能修复某些情况下导出图片全黑。\r\n\t修复上一个版本无法正常显示未嵌入字库的老 PDF 文档。\r\n\t当输出目录为程序所在分区的根目录时，输出目录会变成程序所在目录。\r\n\t无法处理命名连接缩放比例。\r\n\t导出图片功能无法导出嵌套表单内图片。\r\n\t提取页面拆分文档按页拆分时会缺少最后一页。\r\n\t合并文件功能无法导入某些 TIFF 图片。\r\n\t文档编辑器、转换页面为图片功能无法正常显示某些 PDF 文档。\r\n\t修复不能导入 JPEG 2000 图片。\r\n\r\n0.6.1.3498 2018年5月6日\r\n新增功能：\r\n\t编辑器增加自动生成书签命令，可快速匹配文本 PDF 的样式生成书签。\r\n\t鼠标双击标签关闭对应的功能标签页。\r\n\t自动检查程序更新（此功能不上传用户的任何信息，可在“帮助”－“检查新版本”调整检查间隔或禁用）。\r\n\t增加统一页面尺寸为最宽页、最窄页、最大页和最小页功能。\r\n修改功能：\r\n\t更新了 PDF 渲染引擎。\r\n\t提取图片遇到图片加载错误时，不中断导出过程，继续执行。\r\n\t提取图片在无法完美无损旋转 JPEG 图片时，将图片转存为 PNG 图片。\r\n修复错误：\r\n\t在提取图片或分析文档时的内存漏洞。\r\n\t提取图片时，如一页内有多张图片，忽略图片后输出文件编号不正确。\r\n\t合并文件在某些场合下无法正常排序文件名。\r\n\t提取图片时没有正确使用调色板颜色。\r\n\t提取图片时在某些场合下会颠倒图像。\r\n\t编辑器在某些场合下无法删除书签属性。\r\n\t提取导入信息文件功能的一些小问题。\r\n\tCropBox 与 MediaBox 不一致时书签编辑器坐标定位错误。\r\n\t提取图片功能保存图片的旋转方向错误。\r\n\t导出图片数据功能在 InlineImage 数据为 NUL 时出错。\r\n\r\n0.5.0.2990 2017年4月13日\r\n新增功能：\r\n\t简化操作界面，突出 PDF 编辑器功能。\r\n\t可以同时打开多个 PDF 编辑器编辑文档。\r\n\t可将常用的工具放到自定义工具栏。\r\n\tPDF 编辑器增加右键菜单（识别文本插入书签，复制选中内容等功能）。\r\n\t增加对日文韩文等多种识别语言引擎的支持。\r\n\t识别结束后，列出识别过程出错的页码。\r\n\t转换图片功能支持指定输出图片的分辨率，支持输出黑白双色 TIFF 图片。\r\n\t清理不存在源文件。\r\n\t合并文件可统一原页面旋转方向。\r\n\t合并文件功能可保存、加载文件列表。\r\n\t合并文件功能可复制、粘贴书签文本项。\r\n\t书签编辑器按章节编号快速选择标题。\r\n\t替换字库功能增加替换字符功能。\r\n\t清除 PDF 表单功能。\r\n\t清除页面链接批注功能。\r\n修改功能：\r\n\t修改了程序的兼容性设置，使之可在 Windows 8 以上的机器上直接运行。\r\n\t在编辑器界面点击书签可跳转到精确的页面位置。\r\n\t优化了书签编辑器的编辑体验。\r\n\t替换字库功能使用替换后的字符宽度。\r\n\t配置文件格式。\r\n\t可保存书签编辑器的颜色标记到书签文件并重新加载。\r\n\t在用鼠标左键点击书签编辑器的书签文本后才跳转到对应的页面，按住 Ctrl 键点击可避免跳转。\r\n修复错误：\r\n\t书签编辑器没有将操作应用到深层子书签。\r\n\t书签编辑器点击右键菜单项目后不隐藏上下文菜单。\r\n\t添加项目到最近使用的文件列表后导致程序崩溃。\r\n\t统一页面尺寸功能未能正确处理页面旋转角度。\r\n\t无法调用英文文本识别引擎。\r\n\t识别文本功能如取消覆盖现存文件导致程序崩溃。\r\n\t替换字体功能在某些场合下会丢失文本。\r\n\t导出图片和提取图片功能没有保存文件掩码。\r\n\t导入信息文件功能在某些情况下写入错误的目标位置坐标。\r\n\t书签编辑器在移动书签后可能错误显示书签。\r\n\t导出单色图片时出现“外部组件”错误。\r\n\t程序界面在高分辨率显示器上字体模糊。\r\n\t导出图片或提取图片时在文件路径存在空白时出现 GDI+ 错误。\r\n\t在高分辨率显示器上控件位置错位。\r\n\t无法正常导出某些单色图片。\r\n\t在文档编辑器页码框中按下键盘 Delete 键会删除书签。\r\n\t导出 CMYK 色域图片时颜色错乱。\r\n\t合并文档“等同原始内容尺寸”没有用原始图片分辨率参与计算。\r\n\t合并文档文件夹跳转页码为 0。\r\n\t加强了对文档 Pages 节点错误的容忍度。\r\n\tPDF 编辑器在 XYZ 坐标过大时跳转位置不正确。\r\n\t合并文档功能在文件夹路径包含“.”且按数值和文本分别排序时无法正常排序。\r\n\t导出书签功能无法正常输出命名位置。\r\n\t合并文件夹时，文件夹对应书签指向的页面不是该文件夹内文档的第 1 页。\r\n修复测试版错误：\r\n\t上几个测试版合并文档功能书签嵌套关系不正确。\r\n\t在文档编辑器中点击书签后跳转位置不正确。\r\n\r\n0.4.3.1582 2014年10月15日\r\n新增功能：\r\n\tPDF 渲染引擎。\r\n\t新的选项卡与工具栏界面。\r\n\t独立的、加强的合并文档功能，可生成分层书签、支持指定书签文本样式，支持直接添加文件夹，合并其中所有图片及 PDF 文档。\r\n\t合并文档功能可以按文件夹合并，生成单独的 PDF 文件。\r\n\t嵌入汉字字库（支持宋体、仿宋、楷体和黑体）。\r\n\t替换文档字库功能。\r\n\t书签编辑器的浏览界面。\r\n\t书签编辑器新增升级书签、导入书签、保存简易书签功能。\r\n\t导入简易书签文件时，自动检测文件编码（支持编码方式为：系统默认编码、UTF-8、UTF-16、BIG5）。\r\n\t自动生成书签功能支持按文本位置筛选文本。\r\n\t导出图片功能可以导出掩模图像。\r\n\t文档结构探查器支持导出 ToUnicode 映射表数据。\r\n\t清除页面文本。\r\n\t清除页面缩略图。\r\n\t可以在补丁功能界面直接输入文档元数据属性。\r\n\t补丁界面支持以指定编码刷新文档元数据属性。\r\n\t补丁功能和合并文档功能支持修改 PDF 文档页面留白。\r\n\t补丁功能支持修改页面旋转方向。\r\n\t补丁功能支持重写文档的 XML 元数据属性。\r\n\t启动后迅速显示启动界面。\r\n\t在桌面创建程序快捷方式。\r\n\t检测程序更新版本。\r\n\t提取页面增加拆分文档功能，页码范围分号（“;”或“；”）表示分拆成多个文件，另支持按首层书签拆分、指定页码数量拆分。\r\n修改功能：\r\n\t分离了补丁、合并、重命名文档、导出信息文件功能。\r\n\t补丁功能支持覆盖原始文件。\r\n\t加快了合并 PDF 文档界面显示图片文件信息的速度。\r\n\t更改书签编辑器合并书签功能，在合并以英文字符开始的书签文本时，在文本之间添加空格。\r\n\t文档结构探查器中使用弹出窗口显示文本流的数据。\r\n\t更新了 PDF 组件库。\r\n\t更新了 JBIG2 解码库。\r\n\t增强了 PDF 读取器的容错性。\r\n\t在覆盖文件对话框中按住 Shift 键可重复对话框应答，避免重复弹出覆盖文件的提示。\r\n修复错误：\r\n\t导出图片功能没有考虑页面旋转角度。\r\n\t导出图片功能无法合并小于 256 色图片。\r\n\t书签编辑器在某些场合下无法更改页码。\r\n\t文件路径包含特殊控制字符时无法导出书签。\r\n\t页面内容包含内嵌图像时，导出 XML 文件的结构有误。\r\n\t在页面包含内嵌图像时，重构页面指令选项会破坏文档。\r\n\t自动生成书签时禁用合并不同字体选项可能无效。\r\n\t自动生成书签复制文本内容筛选器。\r\n\t识别图像文本时出错。\r\n\t无法正确导出 CMYK 色域图片。\r\n\t合并图片时不能正确指定页码标签。\r\n\t重构某页面的指令时，导致另一个页面丢失指令。\r\n\t在某些场合下无法删除页面批注。\r\n\t导出黑白图片反色。\r\n\t合并 PDF 文档功能无法正确导入某些页面链接批注。\r\n\t合并 PDF 文档功能在合并相同文档时重复写入相同对象。\r\n\t导出图片功能合并同页图片时可能错误更改图片颜色。\r\n\t书签编辑器将上一个文档的书签混入当前文档。\r\n\r\n0.3.3.100 2012年3月13日\r\n新增功能：\r\n\tPDF 文件结构探查器。\r\n\t将光学字符识别的结果写入 PDF 文档。\r\n\t使用 JBIG2 压缩算法优化 PDF 黑白图片的压缩效果。\r\n\t导出图片功能支持合并 JPEG 图片。\r\n\t导出图片功能支持导出批注内的图片。\r\n\t页码范围支持负数页码（从末尾起算的页码）。\r\n\t导出、导入书签功能支持导出 Javascript 脚本。\r\n\t支持写入及读取超过 2G 的 PDF 文件。\r\n修改功能：\r\n\t自动生成书签功能提取字体时忽略字体子集名称。\r\n\t书签编辑器可以拖放文件打开 PDF 文档。\r\n\t增强自动判断文本编码的兼容性。\r\n\t导出图片时考虑图片位置，按照横排文本的阅读习惯，先导出上方的图片再导出下方的图片。\r\n修复错误：\r\n\t浮点数误差导致自动生成书签层次错误。\r\n\t导出图片时遇到页面内嵌图像会出错。\r\n\t导出图片时无法未能识别 LZWDecode 图片。\r\n\t导出黑白图片时在某些场合下无法正确反转颜色。\r\n\t书签编辑器在某些场合下无法更改页码。\r\n\t书签编辑器在展开或收拢节点时会抖动。\r\n\t强制转换页面连接为内部连接后目标页码少一页。\r\n\t无法禁用压缩文档索引表。\r\n\t进度条数值错误造成程序异常。\r\n\t在书签存在错误时无法提取页面。\r\n\t页面旋转角度不为 0 时，导入书签自动设置纵方向偏移不正确。\r\n\t修改页面尺寸拉伸原始页面时无法按指定位置对齐页面边沿。\r\n\t跳转目标为空时无法导出书签。\r\n\t页面旋转角度不为 0 时，拉伸 PDF 页面方向不正确。\r\n\t导出信息文件缺少缩放比例。\r\n\r\n0.3.2.41 2011年7月5日\r\n新增功能：\r\n\t使用光学字符识别图片文字。\r\n\t导出图片功能支持自动选择导出目录。\r\n\t支持 AES-256 加密。\r\n\t自动生成书签功能增加按页码、字体名称、字体尺寸、文本内容筛选标题的条件。\r\n\t自动生成书签功能增加是否合并标题、是否忽略重叠文本的选项。\r\n\t导出或导入应用程序配置。\r\n\t重置应用程序设置。\r\n\t书签编辑器增加复制、粘贴、转换全角半角、转换简繁汉字文本的功能。\r\n\t书签编辑器增加缩进功能的快捷键及补丁功能，优化编辑过程。\r\n\t重写了提取页面功能，可保留原文档更多内容，并支持排除页码范围。\r\n\t合并文件功能支持添加 JPEG2000 图片。\r\n修改功能：\r\n\t去除对 PDFLibNet 的依赖关系。\r\n\t书签编辑器的合并书签功能支持包含子书签的书签。\r\n\t可以向书签编辑器拖放文件。\r\n\t向处理功能的文件列表拖放添加图片文件时，自动切换为合并模式。\r\n\t重写提取页面功能。\r\n\t默认导出信息文件目录为源文件目录。\r\n\t自动为输出文件添加扩展名。\r\n修复错误：\r\n\t禁用自动生成书签功能“合并相邻标题”选项后还是会合并标题。\r\n\t某种场合下自动生成书签功能无法识别移位空格。\r\n\t图片字典缺少字节位信息时无法导出图片。\r\n\t书签编辑器没有书签时无法插入新书签。\r\n\t书签编辑器中用鼠标点击文本标签的右侧无法进入编辑状态。\r\n\t源文档不包含书签时无法编辑书签。\r\n\t目标路径为相对路径时出错。\r\n\t处理 PDF 功能中无法在浏览信息文件对话框中输入文件名。\r\n\t无法中断多个输入文件的批处理操作。\r\n\t提取页面时保留书签时，保留的书签可能指向错误页面。\r\n\t无法导出简易文本书签。\r\n\t无法导出表单内图片。\r\n\t书签编辑器在撤销步数太多时出错。\r\n\r\n0.3.1.24 2011年3月18日\r\n新增功能：\r\n\t支持修改PDF书签样式，具有各种贴心处理功能，并能执行批量搜索替换的书签编辑器。\r\n\t识别标题为书签功能添加是否导出文本位置信息的调试选项。\r\n\t强制将外部链接改为文件内部链接。\r\n\t简易补丁增加打开首层书签设置。\r\n\t合并文件（制作图像 PDF）功能增加是否将黑白图片设为透明的选项。\r\n\t可选设定输出 PDF 文件的压缩率。\r\n\t导出图片功能可自动检测垂直翻转的图片。\r\n\t支持导出 JBIG2 压缩的图片。\r\n修改功能：\r\n\t转换简易书签为信息文件的功能被书签编辑器所取代。\r\n\t自动识别标签功能优化文字排版的后处理过程。\r\n\t增强了导出书签功能的容错性。\r\n\t优化识别字体缺少 ToUnicode 信息的书签文本。\r\n\t略为加快了导出图片的速度。\r\n修复错误：\r\n\t合并模式合并后可能使书签指向错误页码。\r\n\t自动生成书签时遇到无法导出字符、导出字体名称错误。\r\n\t自动生成书签功能导出错误字符。\r\n\t补丁功能导入外部页面链接错误。\r\n\t无法导出某些书签页码。\r\n\t自动生成书签功能无法读取有内嵌图片的页面。\r\n\t在某些场合下无法正常写入书签信息。\r\n\t旋转页面无法自动生成书签。\r\n\t文本字体信息错误导致无法正常导出图片。\r\n\r\n0.3.0.8 2011年1月17日\r\n新增功能：\r\n\t增加自动提取文本 PDF 的标题文字生成书签文件的功能。\r\n\t无损缩放页面内容（缩放页面内容后，同步缩放书签及页面坐标）。\r\n\t解析并导出页面的内容流指令。\r\n\t重复打开相同的加密 PDF 文档时不再询问密码。\r\n\t压缩 PDF 索引表，轻微减少文件大小。\r\n\t自动保存应用程序设置。\r\n修改功能：\r\n\t将补丁、制作 PDF 文档、重命名文件、查看 PDF 文档属性等功能合为一个界面。\r\n\t采用新的信息文件格式。不再支持 iTextSharp 的简易书签。拆分书签、页面链接的目标坐标为单独的属性值以便修改。\r\n\t重写书签的导出及导入代码。\r\n\tXML 信息文件的书签默认状态为关闭。\r\n修复错误：\r\n\t某些场合下无法合并 PDF 文档。\r\n\t无法保留原 PDF 页面链接。\r\n\t书签文本中包含控制字时无法导出。\r\n已知问题：\r\n\t合并模式下的页面链接在拉伸页面后定位错位。\r\n\r\n0.2.9.1 2010年11月10日\r\n修改功能：\r\n\t批量导出信息文件时，指定文本文件后缀“.txt”将导出简易书签文件。\r\n\t简易补丁的文档属性可混合指定替代符和普通文本。\r\n\r\n0.2.9.0 2010年10月29日\r\n新增功能：\r\n\t导出信息文件、导入信息文件、简易补丁、提取内容、提取图片等功能支持批量操作（浏览原始 PDF 文件时可一次选中多个文件）。\r\n\t部分功能输出的 PDF 文件支持以原始文件名及文档属性命名（在输出文件名中使用“<标题>”、“<主题>”、“<作者>”或“<关键字>”等替代符）。\r\n\t增加根据 PDF 文档属性重命名 PDF 文件的功能。\r\n\t补丁功能导入文档属性支持“<源文件名>”和“<源目录名>”文件名替代符（可使用 PDF 文件名重写 PDF 文档的标题属性）。\r\n\t可以在日志界面打开程序输出的文件或目录。\r\n\t支持导出 4 级灰度的图片。\r\n\t提取页面功能支持保留原文档的元数据和书签。\r\n\t查看文档属性。\r\n修改功能：\r\n\t导出页面内容时可选择是否提取页面的文本内容。\r\n\tPDF 文件的读取编码选项改为全局选项。\r\n\t补丁功能导入文档属性时，若属性为空，则保留原始 PDF 文档的属性；若属性仅由空白字符构成，则删除原始 PDF 文档中的属性。\r\n修复错误：\r\n\t简易补丁功能指定文档属性后，输出文档属性只有一个字符。\r\n\t简易补丁功能指定了部分文档属性，未使用编码设置读取其余未指定值属性。\r\n\t简易补丁功能错误改变连接定位。\r\n\t补丁过程丢失某些页面链接样式。\r\n\t页码范围超过实际页面时抛出错误。\r\n\t导出的简易书签文件没有使用编码设置读取文档属性。\r\n\t导出图片功能在某些场合下错误删除已导出图片文件。\r\n\t无法提取 PDF 文档最后一页内容和图片。\r\n\r\n0.2.8.3 2010年10月13日\r\n新增功能：\r\n\t简易补丁及生成 PDF 文件功能支持指定阅读器设置。\r\n\t增加去除文档及页面自动动作的功能。\r\n\t增加去除页面元数据的功能。\r\n\t更新 PDF 组件库为 iTextSharp 5.0.4。\r\n\t无信息文件的简易补丁也支持读取编码选项。\r\n\t增加指定加载 PDF 文档方式的选项（效率优先或内存优先）。\r\n\t增加 PDF 文档信息、书签文本的读取编码选项（用于尝试导出一些编码错误的 PDF 文档信息）。\r\n修复错误：\r\n\t简易补丁功能会丢失书签。\r\n\t启动工作进程后进度条为空时按“返回”按钮会跳回功能界面。\r\n\t导出图片时无法保存文件。\r\n\t启动工作进程后进度条为空时按“返回”按钮会跳回功能界面。\r\n\r\n0.2.8 2010年10月4日\r\n新增功能：\r\n\t无信息文件的简易补丁操作。\r\n\t大幅增强生成文件功能：\r\n\t\t可选自动生成文档书签。\r\n\t\t可选保留源 PDF 文件的书签及页面链接。\r\n\t\t可选关闭书签。\r\n\t\t可选指定文档阅读器设置及元数据属性。\r\n\t\t支持抽取源 PDF 文件的图像，并仅导入抽取的图像。\r\n\t\t支持源图像裁边导入。\r\n\t\t支持裁剪或扩展源 PDF 文件尺寸至页面尺寸。\r\n\t\t可选取消书签链接的缩放比例。\r\n\t导出图片可按尺寸筛选。\r\n\t简易书签文件支持导入页码标签。\r\n\t支持导出 CMYK 色域的图片（保存为 CMYK TIFF）。\r\n\t导出页面内容到信息文件时自动提取文本内容。\r\n修改功能：\r\n\t优化被多次引用的图片的导出方式。\r\n\t合并图片后自动按顺序重命名文件。\r\n\t导出简易书签文件功能支持导出没有页码的书签项。\r\n\t导出详细文档内容时可导出文档目录的内容。\r\n修复错误：\r\n\t导出页面内容或生成文件时，输出文件异常变大。\r\n\t从图片生成 PDF 文件时不恰当旋转页面方向。\r\n\t无法正常编辑文件及目录名称。\r\n\t源文件图片调色板不正常导致无法正常导出图片。\r\n\t合并索引色图片后色彩错乱。\r\n\t导出简易书签文件无法导出某些书签项目。\r\n\t无法修改页面尺寸。\r\n\r\n0.2.7 2010年5月27日\r\n新增功能：\r\n\t撰写了使用文档。\r\n\t合并导出信息和导入信息的功能为一个界面。\r\n\t提供导出图片的文件掩码预览。\r\n\t增加垂直翻转导出图片的选项。\r\n\t增加反转黑白图片颜色的选项。\r\n\t增加导出图片后尝试自动合并相同宽度、相同格式图片的功能。\r\n\t导出功能支持导出简易文本书签文件。\r\n\t简易书签文件支持指定文档元数据信息。\r\n\t记录最近使用的文件名。\r\n修改功能：\r\n\t制作了新的 16*16 程序图标。\r\n修复错误：\r\n\t无法终止导出图片过程。\r\n\r\n0.2.6 2010年5月13日\r\n新增功能：\r\n\t增强导入图片功能，改为“生成文件”。\r\n\t\t生成文件功能支持将现有 PDF 文件和图片合成到一个指定页面尺寸的 PDF 文件。\r\n\t\t可用此功能拆分、合并 PDF 文件并更改文档的页面尺寸。\r\n\t改善导入 TIFF 图片的支持。\r\n\t为生成 PDF 文件功能添加更多选项。\r\n\t导出图片时支持使用文件掩码。\r\n\t导出信息文件时可指定长度单位为厘米、毫米、英寸或点（72 点等于 1 英寸或 2.54 厘米）。\r\n修改功能：\r\n\t在导出页面时删除页面链接批注。\r\n\t导出页面和导出图片分离成两个独立的界面。\r\n\t默认导出信息文件的单位从点改成厘米。\r\n修复错误：\r\n\t改善并修复导出 TIFF 图片。\r\n\r\n0.2.5 2010年5月2日\r\n新增功能：\r\n\t导入一批图片生成 PDF 文件（可同时加挂书签、元数据及页码设置），可在生成选项指定 PDF 页面的尺寸。\r\n\t单独导出图片功能（不导出信息文件）。\r\n\t使用后台进程执行任务，程序工作时不再停止响应。\r\n\t增加工作日志信息和进度条。\r\n\t支持导出 PDF 文件中的 JPXDecode（JPEG2000）图片。\r\n修改功能：\r\n\t修改程序布局。\r\n\t加快了打开 PDF 文件的速度。\r\n\t简化导出页面内容信息文件的格式，修正了导出文本流的错误。\r\n\t重构了内部代码。\r\n修复错误：\r\n\t改善并修复导出图片。\r\n\r\n0.2.4 2009年10月9日\r\n新增功能：\r\n\t导入简易书签文件时，可使用“打开书签”指令，指示是否打开书签。此指令影响后续的所有书签。\r\n\t在打开需要打开权限的 PDF 文件时提示输入密码。\r\n\t导入书签文件时可强制指定书签为打开或关闭状态，可强制取消书签链接目标的缩放比例。\r\n\t导入信息文件时，可强制指定初始页面视图。\r\n修改功能：\r\n\t导入简易书签文件时，书签的开闭状态默认改为关闭。\r\n\t导入信息文件的链接坐标允许使用负数。\r\n\r\n0.2.3 2009年9月2日\r\n修改功能：\r\n\t简易书签指令中的“#”号可用全角“＃”号代替，“=”号可用冒号或全角等号代替。\r\n\t信息文件中的“书签”元素可忽略“动作”属性。默认取值为“转到页面”。\r\n修复错误：\r\n\t无法导出某些 PDF 文件图片。\r\n\r\n0.2.2 2009年5月17日\r\n新增功能：\r\n\t导入或导出页面的边框和旋转角度设置。\r\n\t简易文本书签文件支持全角数字页码或无页码书签（无页码书签将被视为不转到新页面的书签）。\r\n\t支持导出 PDF 文件中的 FlateDecode（PNG，色域为：DeviceRGB、DeviceGray、Indexed DeviceRGB）、CCITTFaxDecode（TIFF）、DCTDecode（JPEG）图片。\r\n\t导入书签后，如原 PDF 文档没有指定初始模式，则自动将其指定为显示文档书签。\r\n\t提供解析命名位置的功能，便于完整导出书签和页面链接目标位置。\r\n修改功能：\r\n\t使用“浏览”按钮指定输入文件后，清除导出文件名称避免不慎覆盖上次导出的文件。\r\n\t导入的简易书签点击后跳转到所在页面的顶端。\r\n\t如信息文件中具有命名位置，则导入与原 PDF 文件已有的同名位置，原 PDF 文件不具有的命名位置则不会导入。\r\n修复错误：\r\n\t无法导入没有书签的信息文件。\r\n\t在 PDF 文件指定初始页面布局时，无法导出阅读器的初始设置。\r\n\r\n0.2.1 2009年5月3日\r\n新增功能：\r\n\t导入简易文本书签文件。\r\n\t在信息文件或简易书签文件中可以指定首页页码。\r\n\t提取 PDF 文件中指定页码的页面。\r\n\t导入文档的属性信息（标题、主题、作者、关键字）。\r\n\t允许选择导入信息文件部分内容。\r\n修改功能：\r\n\t可以导出指定页面的 PDF 内容为 XML 信息文件（在“高级导出选项”中设置）。\r\n\t将导入信息文件和导出信息文件分成两个界面，避免初次接触此工具的用户混淆。\r\n\t美化界面。\r\n删除功能：\r\n\t导出批注信息（用导出页面内容代替）。\r\n修复错误：\r\n\t无法导出包含特殊字符（统一码代码为 0x00～0x1F）的 PDF 文件。\r\n\t在导出某些具有无效页面链接的 PDF 文件时报错。\r\n\t无法导出阅读器的初始设置。\r\n\t没有导入信息文件中的命名位置。\r\n\r\n0.2 更名为 PDF 补丁丁\r\n\r\n新增功能：\r\n\t导入导出文档页面中的链接。\r\n\t在信息文件中指定阅读器的默认设置（如默认双页对开、从右到左的阅读顺序）。\r\n\t在信息文件中指定文档逻辑页码，方便根据目录直接跳转到指定页面。\r\n\t现在从PDF文档中导出的XML信息文件采用中文标签，更容易阅读和修改（旧书签文件还可以使用）。\r\n\t可以设置导出哪些信息。\r\n\t指定XML信息文件采用的编码。\r\n\t可以导出文档的所有批注信息（供研究PDF文档批注之用）。\r\n修复错误：\r\n\t“Title”元素内使用“File”属性链接外部文件，文件名中的中文字符会丢失。\r\n\t导出时丢失部分书签的目标（缺少“Page”属性）。\r\n\r\n0.1 PDF 书签导入导出工具\r\n"
  }
]